Plugin Directory

Changeset 3406541


Ignore:
Timestamp:
12/01/2025 08:03:10 AM (4 months ago)
Author:
alekv
Message:

releasing version 1.52.0

Location:
woocommerce-google-adwords-conversion-tracking-tag
Files:
29 added
44 deleted
16 edited

Legend:

Unmodified
Added
Removed
  • woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/admin/class-admin.php

    r3390923 r3406541  
    146146     */
    147147    public static function fs_after_purchase_js( $js_function ) {
    148         return "function (response) => {\n\n\t\tlet product_name = 'Pixel Manager for WooCommerce';\n\n\t\tlet trial_conversion_percentage = 0.52;\n\n\t\tlet is_trial = (null != response.purchase.trial_ends),\n\t\t\tis_subscription = (null != response.purchase.initial_amount),\n\t\t\tpre_total = Number(is_subscription ? response.purchase.initial_amount : response.purchase.gross).toFixed(2),\n\t\t\ttrial_total = is_trial ? (pre_total * trial_conversion_percentage).toFixed(2) : pre_total,\n\t\t\ttotal = is_trial ? trial_total : pre_total,\n\t\t\tcurrency = response.purchase.currency.toUpperCase(),\n\t\t\ttransaction_id = response.purchase.id.toString(),\n\t\t\tstore_name = window.location.hostname;\n\n\t\twindow.dataLayer = window.dataLayer || [];\n\n\t\tdataLayer.push({\n\t\t\tevent: 'purchase',\n\t\t\ttransaction_id: transaction_id,\n\t\t\ttransaction_value: total,\n\t\t\ttransaction_currency: currency,\n\t\t\ttransaction_coupon: response.purchase.coupon_id,\n\t\t\ttransaction_affiliation: store_name,\n\t\t\titems: [\n\t\t\t\t{\n\t\t\t\t\titem_name: product_name,\n\t\t\t\t\titem_id: response.purchase.plan_id.toString(),\n\t\t\t\t\titem_category: 'Plugin',\n\t\t\t\t\tprice: response.purchase.initial_amount.toString(),\n\t\t\t\t\tquantity: 1,\n\t\t\t\t\tcurrency: currency,\n\t\t\t\t\taffiliation: store_name,\n\t\t\t\t},\n\t\t\t],\n\t\t\tfreemius_data: response,\n\t\t});\n\n\t\t(function (w, d, s, l, i) {\n\t\t\tw[l] = w[l] || []; w[l].push({\n\t\t\t\t'gtm.start':\n\t\t\t\t\tnew Date().getTime(), event: 'gtm.js'\n\t\t\t}); var f = d.getElementsByTagName(s)[0],\n\t\t\t\tj = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : ''; j.async = true; j.src =\n\t\t\t\t\t'https://www.googletagmanager.com/gtm.js?id=' + i + dl; f.parentNode.insertBefore(j, f);\n\t\t})(window, document, 'script', 'dataLayer', 'GTM-NZ8WQ6QS');\n\t}";
     148        return "function (response) => {\n\n\t\tlet product_name = 'Pixel Manager for WooCommerce';\n\n\t\tlet trial_conversion_percentage = 0.52;\n\n\t\tlet is_trial = (null != response.purchase.trial_ends),\n\t\t\tis_subscription = (null != response.purchase.initial_amount),\n\t\t\tpre_total = Number(is_subscription ? response.purchase.initial_amount : response.purchase.gross).toFixed(2),\n\t\t\ttrial_total = is_trial ? (pre_total * trial_conversion_percentage).toFixed(2) : pre_total,\n\t\t\ttotal = is_trial ? trial_total : pre_total,\n\t\t\tcurrency = response.purchase.currency.toUpperCase(),\n\t\t\ttransaction_id = response.purchase.id.toString(),\n\t\t\tstore_name = window.location.hostname;\n\n\t\twindow.dataLayer = window.dataLayer || [];\n\n\t\tdataLayer.push({\n\t\t\tevent: 'purchase',\n\t\t\ttransaction_id: transaction_id,\n\t\t\ttransaction_value: total,\n\t\t\ttransaction_currency: currency,\n\t\t\ttransaction_coupon: response.purchase.coupon_id,\n\t\t\ttransaction_affiliation: store_name,\n\t\t\tuser: response.user,\n\t\t\titems: [\n\t\t\t\t{\n\t\t\t\t\titem_name: product_name,\n\t\t\t\t\titem_id: response.purchase.plan_id.toString(),\n\t\t\t\t\titem_category: 'Plugin',\n\t\t\t\t\tprice: response.purchase.initial_amount.toString(),\n\t\t\t\t\tquantity: 1,\n\t\t\t\t\tcurrency: currency,\n\t\t\t\t\taffiliation: store_name,\n\t\t\t\t},\n\t\t\t],\n\t\t\tfreemius_data: response,\n\t\t});\n\n\t\t(function (w, d, s, l, i) {\n\t\t\tw[l] = w[l] || []; w[l].push({\n\t\t\t\t'gtm.start':\n\t\t\t\t\tnew Date().getTime(), event: 'gtm.js'\n\t\t\t}); var f = d.getElementsByTagName(s)[0],\n\t\t\t\tj = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : ''; j.async = true; j.src =\n\t\t\t\t\t'https://www.googletagmanager.com/gtm.js?id=' + i + dl; f.parentNode.insertBefore(j, f);\n\t\t})(window, document, 'script', 'dataLayer', 'GTM-NZ8WQ6QS');\n\t}";
    149149    }
    150150
     
    935935            $section_ids['settings_name']
    936936        );
    937         // add field for the Facebook CAPI user transparency process anonymous hits
    938         add_settings_field(
    939             'wpm_setting_facebook_capi_user_transparency_process_anonymous_hits',
    940             esc_html__( 'Meta (Facebook) CAPI: process anonymous hits', 'woocommerce-google-adwords-conversion-tracking-tag' ),
    941             [__CLASS__, 'setting_facebook_capi_user_transparency_process_anonymous_hits'],
    942             'wpm_plugin_options_page',
    943             $section_ids['settings_name']
    944         );
    945937        // add field for the Facebook CAPI user transparency send additional client identifiers
    946938        add_settings_field(
     
    970962        add_settings_field(
    971963            'pmw_setting_pinterest_ad_account_id',
    972             esc_html__( 'Pinterest Ad Account ID', 'woocommerce-google-adwords-conversion-tracking-tag' ) . self::html_beta(),
     964            esc_html__( 'Pinterest Ad Account ID', 'woocommerce-google-adwords-conversion-tracking-tag' ),
    973965            [__CLASS__, 'setting_html_pinterest_ad_account_id'],
    974966            'wpm_plugin_options_page',
     
    978970        add_settings_field(
    979971            'pmw_setting_pinterest_apic_token',
    980             esc_html__( 'Pinterest Events API: token', 'woocommerce-google-adwords-conversion-tracking-tag' ) . self::html_beta(),
     972            esc_html__( 'Pinterest Events API: token', 'woocommerce-google-adwords-conversion-tracking-tag' ),
    981973            [__CLASS__, 'setting_html_pinterest_apic_token'],
    982             'wpm_plugin_options_page',
    983             $section_ids['settings_name']
    984         );
    985         // add field for the Pinterest APIC user transparency process anonymous hits
    986         add_settings_field(
    987             'pmw_setting_pinterest_apic_user_transparency_process_anonymous_hits',
    988             esc_html__( 'Pinterest Events API: process anonymous hits', 'woocommerce-google-adwords-conversion-tracking-tag' ) . self::html_beta(),
    989             [__CLASS__, 'setting_pinterest_apic_process_anonymous_hits'],
    990974            'wpm_plugin_options_page',
    991975            $section_ids['settings_name']
     
    1002986        add_settings_field(
    1003987            'pmw_setting_pinterest_user_transparency_advanced_matching',
    1004             esc_html__( 'Pinterest: Advanced Matching', 'woocommerce-google-adwords-conversion-tracking-tag' ) . self::html_beta(),
     988            esc_html__( 'Pinterest: Advanced Matching', 'woocommerce-google-adwords-conversion-tracking-tag' ),
    1005989            [__CLASS__, 'setting_pinterest_advanced_matching'],
    1006990            'wpm_plugin_options_page',
     
    10181002        add_settings_field(
    10191003            'plugin_snapchat_capi_token',
    1020             esc_html__( 'Snapchat CAPI Token', 'woocommerce-google-adwords-conversion-tracking-tag' ) . self::html_beta(),
     1004            esc_html__( 'Snapchat CAPI Token', 'woocommerce-google-adwords-conversion-tracking-tag' ),
    10211005            [__CLASS__, 'option_html_snapchat_capi_token'],
    10221006            'wpm_plugin_options_page',
     
    10391023        ];
    10401024        self::add_subsection_div( $section_ids, $sub_section_ids );
     1025        // Add the field for the Reddit CAPI token
     1026        add_settings_field(
     1027            'pmw_setting_reddit_capi_token',
     1028            esc_html__( 'Reddit Conversions API: token', 'woocommerce-google-adwords-conversion-tracking-tag' ),
     1029            [__CLASS__, 'option_html_reddit_capi_token'],
     1030            'wpm_plugin_options_page',
     1031            $section_ids['settings_name']
     1032        );
     1033        // Add the field for the Reddit CAPI test event code
     1034        add_settings_field(
     1035            'pmw_setting_reddit_capi_test_event_code',
     1036            esc_html__( 'Reddit Conversions API: test event code', 'woocommerce-google-adwords-conversion-tracking-tag' ),
     1037            [__CLASS__, 'option_html_reddit_capi_test_event_code'],
     1038            'wpm_plugin_options_page',
     1039            $section_ids['settings_name']
     1040        );
    10411041        // Add the field for the Reddit advanced matching
    10421042        add_settings_field(
     
    10681068            esc_html__( 'TikTok EAPI: test event code', 'woocommerce-google-adwords-conversion-tracking-tag' ),
    10691069            [__CLASS__, 'setting_html_tiktok_eapi_test_event_code'],
    1070             'wpm_plugin_options_page',
    1071             $section_ids['settings_name']
    1072         );
    1073         // add field for the TikTok EAPI user transparency process anonymous hits
    1074         add_settings_field(
    1075             'pmw_setting_tiktok_eapi_user_transparency_process_anonymous_hits',
    1076             esc_html__( 'TikTok Events API: process anonymous hits', 'woocommerce-google-adwords-conversion-tracking-tag' ),
    1077             [__CLASS__, 'setting_tiktok_eapi_process_anonymous_hits'],
    10781070            'wpm_plugin_options_page',
    10791071            $section_ids['settings_name']
     
    11801172        add_settings_field(
    11811173            'pmw_setting_twitter_add_to_cart',
    1182             esc_html__( 'Add To Cart Event ID', 'woocommerce-google-adwords-conversion-tracking-tag' ) . self::html_beta(),
     1174            esc_html__( 'Add To Cart Event ID', 'woocommerce-google-adwords-conversion-tracking-tag' ),
    11831175            [__CLASS__, 'setting_twitter_add_to_cart'],
    11841176            'wpm_plugin_options_page',
     
    11881180        add_settings_field(
    11891181            'pmw_setting_twitter_add_to_wishlist',
    1190             esc_html__( 'Add To Wishlist Event ID', 'woocommerce-google-adwords-conversion-tracking-tag' ) . self::html_beta(),
     1182            esc_html__( 'Add To Wishlist Event ID', 'woocommerce-google-adwords-conversion-tracking-tag' ),
    11911183            [__CLASS__, 'setting_twitter_add_to_wishlist'],
    11921184            'wpm_plugin_options_page',
     
    11961188        add_settings_field(
    11971189            'pmw_setting_twitter_view_content',
    1198             esc_html__( 'Content View Event ID', 'woocommerce-google-adwords-conversion-tracking-tag' ) . self::html_beta(),
     1190            esc_html__( 'Content View Event ID', 'woocommerce-google-adwords-conversion-tracking-tag' ),
    11991191            [__CLASS__, 'setting_twitter_view_content'],
    12001192            'wpm_plugin_options_page',
     
    12041196        add_settings_field(
    12051197            'pmw_setting_twitter_search',
    1206             esc_html__( 'Search Event ID', 'woocommerce-google-adwords-conversion-tracking-tag' ) . self::html_beta(),
     1198            esc_html__( 'Search Event ID', 'woocommerce-google-adwords-conversion-tracking-tag' ),
    12071199            [__CLASS__, 'setting_twitter_search'],
    12081200            'wpm_plugin_options_page',
     
    12121204        add_settings_field(
    12131205            'pmw_setting_twitter_initiate_checkout',
    1214             esc_html__( 'Checkout Initiated Event ID', 'woocommerce-google-adwords-conversion-tracking-tag' ) . self::html_beta(),
     1206            esc_html__( 'Checkout Initiated Event ID', 'woocommerce-google-adwords-conversion-tracking-tag' ),
    12151207            [__CLASS__, 'setting_twitter_initiate_checkout'],
    12161208            'wpm_plugin_options_page',
     
    12201212        add_settings_field(
    12211213            'pmw_setting_twitter_add_payment_info',
    1222             esc_html__( 'Add Payment Info Event ID', 'woocommerce-google-adwords-conversion-tracking-tag' ) . self::html_beta(),
     1214            esc_html__( 'Add Payment Info Event ID', 'woocommerce-google-adwords-conversion-tracking-tag' ),
    12231215            [__CLASS__, 'setting_twitter_add_payment_info'],
    12241216            'wpm_plugin_options_page',
     
    12281220        add_settings_field(
    12291221            'pmw_setting_twitter_purchase',
    1230             esc_html__( 'Purchase Event ID', 'woocommerce-google-adwords-conversion-tracking-tag' ) . self::html_beta(),
     1222            esc_html__( 'Purchase Event ID', 'woocommerce-google-adwords-conversion-tracking-tag' ),
    12311223            [__CLASS__, 'setting_twitter_purchase'],
    12321224            'wpm_plugin_options_page',
     
    36553647    }
    36563648
     3649    public static function option_html_reddit_capi_token() {
     3650        ?>
     3651        <textarea class="pmw mono"
     3652                  id="plugin_reddit_capi_token"
     3653                  name="wgact_plugin_options[pixels][reddit][capi][token]"
     3654                  cols="60"
     3655                  rows="6"
     3656                  onfocus="this.select();"
     3657            <?php
     3658        echo esc_html( self::disable_if_demo() );
     3659        ?>><?php
     3660        echo esc_html( Options::get_reddit_capi_token() );
     3661        ?></textarea>
     3662        <?php
     3663        self::display_status_icon( Options::get_reddit_capi_token(), Options::is_reddit_active() );
     3664        ?>
     3665        <?php
     3666        self::get_documentation_html_by_key( 'reddit_capi_token' );
     3667        ?>
     3668        <?php
     3669        self::html_pro_feature();
     3670        ?>
     3671        <?php
     3672        if ( !Options::is_reddit_active() ) {
     3673            ?>
     3674            <p>
     3675                <span class="dashicons dashicons-info"></span>
     3676                <?php
     3677            esc_html_e( 'You need to activate the Reddit pixel', 'woocommerce-google-adwords-conversion-tracking-tag' );
     3678            ?>
     3679            </p>
     3680        <?php
     3681        }
     3682        ?>
     3683        <?php
     3684    }
     3685
     3686    public static function option_html_reddit_capi_test_event_code() {
     3687        ?>
     3688        <input class="pmw mono"
     3689               type="text"
     3690               id="plugin_reddit_capi_test_event_code"
     3691               name="wgact_plugin_options[pixels][reddit][capi][test_event_code]"
     3692               value="<?php
     3693        echo esc_html( Options::get_reddit_capi_test_event_code() );
     3694        ?>"
     3695            <?php
     3696        echo esc_html( self::disable_if_demo() );
     3697        ?>
     3698        />
     3699        <?php
     3700        self::display_status_icon( Options::get_reddit_capi_test_event_code(), Options::is_reddit_active() );
     3701        ?>
     3702        <?php
     3703        self::get_documentation_html_by_key( 'reddit_capi_test_event_code' );
     3704        ?>
     3705        <?php
     3706        self::html_pro_feature();
     3707        ?>
     3708        <?php
     3709        if ( !Options::is_reddit_active() ) {
     3710            ?>
     3711            <p>
     3712                <span class="dashicons dashicons-info"></span>
     3713                <?php
     3714            esc_html_e( 'You need to activate the Reddit pixel', 'woocommerce-google-adwords-conversion-tracking-tag' );
     3715            ?>
     3716            </p>
     3717        <?php
     3718        }
     3719        ?>
     3720        <?php
     3721    }
     3722
    36573723    public static function html_marketing_value_logic() {
    36583724        ?>
     
    45924658    }
    45934659
    4594     public static function setting_facebook_capi_user_transparency_process_anonymous_hits() {
    4595         // adding the hidden input is a hack to make WordPress save the option with the value zero,
    4596         // instead of not saving it and remove that array key entirely
    4597         // https://stackoverflow.com/a/1992745/4688612
    4598         ?>
    4599         <label>
    4600             <input type="hidden" value="0"
    4601                    name="wgact_plugin_options[facebook][capi][user_transparency][process_anonymous_hits]">
    4602             <input type="checkbox"
    4603                    id="wpm_setting_facebook_capi_user_transparency_process_anonymous_hits"
    4604                    name="wgact_plugin_options[facebook][capi][user_transparency][process_anonymous_hits]"
    4605                    value="1"
    4606                 <?php
    4607         checked( Options::is_facebook_capi_user_transparency_process_anonymous_hits_active() );
    4608         ?>
    4609                 <?php
    4610         echo esc_html( self::disable_if_demo() );
    4611         ?>
    4612             />
    4613             <?php
    4614         esc_html_e( 'Send CAPI hits for anonymous visitors who likely have blocked the Meta (Facebook) pixel.', 'woocommerce-google-adwords-conversion-tracking-tag' );
    4615         ?>
    4616         </label>
    4617         <?php
    4618         self::display_status_icon( Options::is_facebook_capi_user_transparency_process_anonymous_hits_active(), Options::is_facebook_active(), true );
    4619         self::get_documentation_html_by_key( 'facebook_capi_user_transparency_process_anonymous_hits' );
    4620         self::html_pro_feature();
    4621         if ( Options::is_facebook_capi_user_transparency_process_anonymous_hits_active() && !Options::is_facebook_active() ) {
    4622             echo '<p></p><span class="dashicons dashicons-info"></span>';
    4623             esc_html_e( 'You need to activate the Meta (Facebook) pixel', 'woocommerce-google-adwords-conversion-tracking-tag' );
    4624             echo '</p><br>';
    4625         }
    4626     }
    4627 
    46284660    public static function setting_facebook_advanced_matching() {
    46294661        // adding the hidden input is a hack to make WordPress save the option with the value zero,
     
    47424774    }
    47434775
    4744     public static function setting_pinterest_apic_process_anonymous_hits() {
    4745         // adding the hidden input is a hack to make WordPress save the option with the value zero,
    4746         // instead of not saving it and remove that array key entirely
    4747         // https://stackoverflow.com/a/1992745/4688612
    4748         ?>
    4749         <label>
    4750             <input type="hidden" value="0" name="wgact_plugin_options[pinterest][apic][process_anonymous_hits]">
    4751             <input type="checkbox"
    4752                    id="pmw_setting_pinterest_apic_user_transparency_process_anonymous_hits"
    4753                    name="wgact_plugin_options[pinterest][apic][process_anonymous_hits]"
    4754                    value="1"
    4755                 <?php
    4756         checked( Options::is_pinterest_apic_process_anonymous_hits_active() );
    4757         ?>
    4758                 <?php
    4759         echo esc_html( self::disable_if_demo() );
    4760         ?>
    4761             />
    4762             <?php
    4763         esc_html_e( 'Send Events API hits for anonymous visitors who likely have blocked the Pinterest pixel.', 'woocommerce-google-adwords-conversion-tracking-tag' );
    4764         ?>
    4765         </label>
    4766         <?php
    4767         self::display_status_icon( Options::is_pinterest_apic_process_anonymous_hits_active(), Options::is_pinterest_active() && Options::get_pinterest_apic_token(), true );
    4768         self::get_documentation_html_by_key( 'pinterest_apic_process_anonymous_hits' );
    4769         self::html_pro_feature();
    4770         if ( Options::is_pinterest_apic_process_anonymous_hits_active() && !Options::is_pinterest_active() ) {
    4771             echo '<p></p><span class="dashicons dashicons-info"></span>';
    4772             esc_html_e( 'You need to activate the Pinterest pixel', 'woocommerce-google-adwords-conversion-tracking-tag' );
    4773             echo '</p><br>';
    4774         }
    4775     }
    4776 
    47774776    public static function setting_pinterest_advanced_matching() {
    47784777        // adding the hidden input is a hack to make WordPress save the option with the value zero,
     
    48824881        </div>
    48834882        <?php
    4884     }
    4885 
    4886     public static function setting_tiktok_eapi_process_anonymous_hits() {
    4887         // adding the hidden input is a hack to make WordPress save the option with the value zero,
    4888         // instead of not saving it and remove that array key entirely
    4889         // https://stackoverflow.com/a/1992745/4688612
    4890         ?>
    4891         <label>
    4892             <input type="hidden" value="0" name="wgact_plugin_options[tiktok][eapi][process_anonymous_hits]">
    4893             <input type="checkbox"
    4894                    id="pmw_setting_tiktok_eapi_process_anonymous_hits"
    4895                    name="wgact_plugin_options[tiktok][eapi][process_anonymous_hits]"
    4896                    value="1"
    4897                 <?php
    4898         checked( Options::is_tiktok_eapi_process_anonymous_hits_active() );
    4899         ?>
    4900                 <?php
    4901         echo esc_html( self::disable_if_demo() );
    4902         ?>
    4903             />
    4904             <?php
    4905         esc_html_e( 'Send Events API hits for anonymous visitors who likely have blocked the TikTok pixel.', 'woocommerce-google-adwords-conversion-tracking-tag' );
    4906         ?>
    4907         </label>
    4908         <?php
    4909         self::display_status_icon( Options::is_tiktok_eapi_process_anonymous_hits_active(), Options::is_tiktok_active() && Options::get_tiktok_eapi_token(), true );
    4910         self::get_documentation_html_by_key( 'tiktok_eapi_process_anonymous_hits' );
    4911         self::html_pro_feature();
    4912         if ( Options::is_tiktok_eapi_process_anonymous_hits_active() && !Options::is_tiktok_active() ) {
    4913             echo '<p></p><span class="dashicons dashicons-info"></span>';
    4914             esc_html_e( 'You need to activate the TikTok pixel', 'woocommerce-google-adwords-conversion-tracking-tag' );
    4915             echo '</p><br>';
    4916         }
    49174883    }
    49184884
  • woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/admin/class-documentation.php

    r3402314 r3406541  
    119119                'wcm'     => '/document/pixel-manager-pro-for-woocommerce/pmw-plugin-configuration/tiktok/#access-token',
    120120            ],
    121             'tiktok_eapi_process_anonymous_hits'                     => [
    122                 'default' => '/docs/wpm/plugin-configuration/tiktok#process-anonymous-hits',
    123                 'wcm'     => '/document/pixel-manager-pro-for-woocommerce/pmw-plugin-configuration/tiktok/#process-anonymous-hits',
    124             ],
    125121            'vwo_account_id'                                         => [
    126122                'default' => '/docs/wpm/plugin-configuration/vwo',
     
    171167                'wcm'     => '/document/pixel-manager-pro-for-woocommerce/pmw-plugin-configuration/facebook/#section-4',
    172168            ],
    173             'facebook_capi_user_transparency_process_anonymous_hits' => [
    174                 'default' => '/docs/wpm/plugin-configuration/meta#user-transparency-settings',
    175                 'wcm'     => '/document/pixel-manager-pro-for-woocommerce/pmw-plugin-configuration/facebook/#section-5',
    176             ],
    177169            'facebook_advanced_matching'                             => [
    178170                'default' => '/docs/wpm/plugin-configuration/meta#meta-facebook-advanced-matching',
     
    314306                'default' => '/docs/wpm/plugin-configuration/pinterest#api-for-conversions-token',
    315307                'wcm'     => '/document/pixel-manager-pro-for-woocommerce/pmw-plugin-configuration/pinterest/#section-6',
    316             ],
    317             'pinterest_apic_process_anonymous_hits'                  => [
    318                 'default' => '/docs/wpm/plugin-configuration/pinterest#process-anonymous-hits',
    319                 'wcm'     => '/document/pixel-manager-pro-for-woocommerce/pmw-plugin-configuration/pinterest/#section-8',
    320308            ],
    321309            'pinterest_enhanced_match'                               => [
  • woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/admin/class-validations.php

    r3308972 r3406541  
    204204        }
    205205
     206        // validate ['google']['ads']['phone_conversion_number']
     207        if (isset($input['google']['ads']['phone_conversion_number'])) {
     208
     209            // Trim space, newlines and quotes
     210            $input['google']['ads']['phone_conversion_number'] = Helpers::trim_string($input['google']['ads']['phone_conversion_number']);
     211
     212            if (!self::is_phone_number($input['google']['ads']['phone_conversion_number'])) {
     213                $input['google']['ads']['phone_conversion_number']
     214                    = Options::get_google_ads_phone_conversion_number()
     215                    ? Options::get_google_ads_phone_conversion_number()
     216                    : '';
     217                add_settings_error('wgact_plugin_options', 'invalid-phone-conversion-number', esc_html__('You have entered an invalid phone number for Google Ads phone conversion tracking.', 'woocommerce-google-adwords-conversion-tracking-tag'));
     218            }
     219        }
     220
    206221        // validate ['google]['tag_gateway']['measurement_path']
    207222        if (isset($input['google']['tag_gateway']['measurement_path'])) {
     
    344359        }
    345360
    346         // Validate LinkedIn conversion IDs add_to_cart
     361        // Validate LinkedIn conversion IDs
    347362        $input = self::validate_linkedin_conversion_id($input, 'add_to_cart');
    348363        $input = self::validate_linkedin_conversion_id($input, 'start_checkout');
    349364        $input = self::validate_linkedin_conversion_id($input, 'purchase');
     365        $input = self::validate_linkedin_conversion_id($input, 'search');
     366        $input = self::validate_linkedin_conversion_id($input, 'view_content');
     367        $input = self::validate_linkedin_conversion_id($input, 'add_to_list');
    350368
    351369        // validate Outbrain advertiser ID
     
    409427        }
    410428
    411         // Validate Twitter event add_to_cart
     429        // Validate Twitter event IDs
    412430        $input = self::validate_twitter_event($input, 'add_to_cart');
    413431        $input = self::validate_twitter_event($input, 'add_to_wishlist');
     
    415433        $input = self::validate_twitter_event($input, 'search');
    416434        $input = self::validate_twitter_event($input, 'initiate_checkout');
    417 //      $input = self::validate_twitter_event($input, 'add_payment_info);
     435        $input = self::validate_twitter_event($input, 'add_payment_info');
    418436        $input = self::validate_twitter_event($input, 'purchase');
    419437
     
    550568                    : '';
    551569                add_settings_error('wgact_plugin_options', 'invalid-reddit-advertiser-id', esc_html__('You have entered an invalid Reddit pixel ID.', 'woocommerce-google-adwords-conversion-tracking-tag'));
     570            }
     571        }
     572
     573        // Validate Reddit CAPI token
     574        if (isset($input['pixels']['reddit']['capi']['token'])) {
     575
     576            // Trim space, newlines and quotes
     577            $input['pixels']['reddit']['capi']['token'] = Helpers::trim_string($input['pixels']['reddit']['capi']['token']);
     578
     579            if (!self::is_reddit_capi_token($input['pixels']['reddit']['capi']['token'])) {
     580                $input['pixels']['reddit']['capi']['token']
     581                    = Options::get_reddit_capi_token()
     582                    ? Options::get_reddit_capi_token()
     583                    : '';
     584                add_settings_error('wgact_plugin_options', 'invalid-reddit-capi-token', esc_html__('You have entered an invalid Reddit CAPI token.', 'woocommerce-google-adwords-conversion-tracking-tag'));
     585            }
     586        }
     587
     588        // Validate Reddit CAPI test event code
     589        if (isset($input['pixels']['reddit']['capi']['test_event_code'])) {
     590
     591            // Trim space, newlines and quotes
     592            $input['pixels']['reddit']['capi']['test_event_code'] = Helpers::trim_string($input['pixels']['reddit']['capi']['test_event_code']);
     593
     594            if (!self::is_reddit_capi_test_event_code($input['pixels']['reddit']['capi']['test_event_code'])) {
     595                $input['pixels']['reddit']['capi']['test_event_code']
     596                    = Options::get_reddit_capi_test_event_code()
     597                    ? Options::get_reddit_capi_test_event_code()
     598                    : '';
     599                add_settings_error('wgact_plugin_options', 'invalid-reddit-capi-test-event-code', esc_html__('You have entered an invalid Reddit CAPI test event code.', 'woocommerce-google-adwords-conversion-tracking-tag'));
    552600            }
    553601        }
     
    945993    }
    946994
     995    public static function is_reddit_capi_token( $string ) {
     996
     997        // Reddit CAPI token is a JWT token with three Base64URL-encoded parts separated by dots
     998        $re = '/^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/m';
     999
     1000        return self::validate_with_regex($re, $string);
     1001    }
     1002
     1003    public static function is_reddit_capi_test_event_code( $string ) {
     1004
     1005        // Reddit test event code format: t2_ followed by alphanumeric characters
     1006        $re = '/^t2_[a-z0-9]{4,12}$/m';
     1007
     1008        return self::validate_with_regex($re, $string);
     1009    }
     1010
    9471011    public static function is_vwo_account_id( $string ) {
    9481012
     
    10191083
    10201084        $re = '/^\d{6,12}$/m';
     1085
     1086        return self::validate_with_regex($re, $string);
     1087    }
     1088
     1089    public static function is_phone_number( $string ) {
     1090
     1091        // Accepts various phone number formats:
     1092        // +1-555-555-5555, +1 555 555 5555, +1.555.555.5555, +15555555555
     1093        // (555) 555-5555, 555-555-5555, 555.555.5555, 5555555555
     1094        // International formats with country codes
     1095        $re = '/^[\+]?[\d\s\-\.\(\)]{7,20}$/m';
    10211096
    10221097        return self::validate_with_regex($re, $string);
  • woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/class-database.php

    r3308972 r3406541  
    55
    66// TODO Move Facebook Advanced Matching down to to ['facebook']['advanced_matching']
    7 // TODO Move Facebook Send Anonymous Hits down one level to ['facebook']['capi']['process_anonymous_hits']
    87
    98// TODO Strategy for saving backup versions:
  • woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/class-options.php

    r3313714 r3406541  
    104104                    'test_event_code'   => '',
    105105                    'user_transparency' => [
    106                         'process_anonymous_hits'             => false,
    107106                        'send_additional_client_identifiers' => false,
    108107                    ],
     
    164163                'advanced_matching' => false,
    165164                'apic'              => [
    166                     'token'                  => '',
    167                     'process_anonymous_hits' => false,
     165                    'token' => '',
    168166                ],
    169167            ],
     
    179177                'advanced_matching' => false,
    180178                'eapi'              => [
    181                     'token'                  => '',
    182                     'test_event_code'        => '',
    183                     'process_anonymous_hits' => false,
     179                    'token'           => '',
     180                    'test_event_code' => '',
    184181                ],
    185182            ],
     
    224221                    'advertiser_id'     => '',
    225222                    'advanced_matching' => false,
     223                    'capi'              => [
     224                        'token'           => '',
     225                        'test_event_code' => '',
     226                    ],
    226227                ],
    227228                'taboola'    => [
     
    383384    }
    384385
    385     public static function is_facebook_capi_user_transparency_process_anonymous_hits_active() {
    386         return (bool) self::get_options_obj()->facebook->capi->user_transparency->process_anonymous_hits;
    387     }
    388 
    389386    public static function is_facebook_capi_advanced_matching_enabled() {
    390387        return (bool) self::get_options_obj()->facebook->capi->user_transparency->send_additional_client_identifiers;
     
    433430    public static function is_tiktok_advanced_matching_enabled() {
    434431        return (bool) self::get_options_obj()->tiktok->advanced_matching;
    435     }
    436 
    437     public static function is_tiktok_eapi_process_anonymous_hits_active() {
    438         return (bool) self::get_options_obj()->tiktok->eapi->process_anonymous_hits;
    439432    }
    440433
     
    526519    public static function is_pinterest_advanced_matching_active() {
    527520        return (bool) self::get_options_obj()->pinterest->advanced_matching;
    528     }
    529 
    530     public static function is_pinterest_apic_process_anonymous_hits_active() {
    531         return (bool) self::get_options_obj()->pinterest->apic->process_anonymous_hits;
    532521    }
    533522
     
    757746    public static function is_reddit_advanced_matching_enabled() {
    758747        return (bool) self::get_options_obj()->pixels->reddit->advanced_matching;
     748    }
     749
     750    public static function get_reddit_capi_token() {
     751        return self::get_options_obj()->pixels->reddit->capi->token;
     752    }
     753
     754    public static function get_reddit_capi_test_event_code() {
     755        return self::get_options_obj()->pixels->reddit->capi->test_event_code;
     756    }
     757
     758    public static function is_reddit_capi_active() {
     759        return self::is_reddit_active() && (bool) self::get_reddit_capi_token();
     760    }
     761
     762    public static function is_reddit_capi_test_event_code_set() {
     763        return (bool) self::get_reddit_capi_test_event_code();
    759764    }
    760765
     
    947952    }
    948953
     954    /**
     955     * Check if any statistics pixels are active
     956     *
     957     * Uses the Pixel_Registry to automatically detect all active statistics pixels.
     958     * No manual updates needed when adding new statistics pixels - just ensure they
     959     * implement Pixel_Descriptor with get_category() returning 'statistics'.
     960     *
     961     * @return bool True if at least one statistics pixel is active
     962     * @since 1.52.0 Refactored to use pixel registry for automatic detection
     963     */
    949964    public static function is_at_least_one_statistics_pixel_active() {
    950         return self::is_ga4_enabled()
    951             || self::is_hotjar_enabled()
    952             || self::is_vwo_active();
    953     }
    954 
     965        return \SweetCode\Pixel_Manager\Pixels\Pixel_Registry::has_active_statistics_pixels();
     966    }
     967
     968    /**
     969     * Check if any marketing pixels are active
     970     *
     971     * Uses the Pixel_Registry to automatically detect all active marketing pixels.
     972     * No manual updates needed when adding new marketing pixels - just ensure they
     973     * implement Pixel_Descriptor with get_category() returning 'marketing'.
     974     *
     975     * @return bool True if at least one marketing pixel is active
     976     * @since 1.52.0 Refactored to use pixel registry for automatic detection
     977     */
    955978    public static function is_at_least_one_marketing_pixel_active() {
    956         return self::is_adroll_active()
    957             || self::is_bing_active()
    958             || self::is_facebook_active()
    959             || self::is_google_ads_active()
    960             || self::is_linkedin_active()
    961             || self::is_outbrain_active()
    962             || self::is_pinterest_active()
    963             || self::is_reddit_active()
    964             || self::is_snapchat_active()
    965             || self::is_taboola_active()
    966             || self::is_tiktok_active()
    967             || self::is_twitter_active();
    968     }
    969 
     979        return \SweetCode\Pixel_Manager\Pixels\Pixel_Registry::has_active_marketing_pixels();
     980    }
     981
     982    /**
     983     * Check if any server-to-server (S2S) integrations are enabled
     984     *
     985     * This method uses the Pixel_Registry to automatically detect all available S2S integrations.
     986     *
     987     * When adding a new S2S pixel:
     988     * 1. Create the adapter class extending Abstract_Pixel_Adapter (e.g., MyPixel_Adapter)
     989     * 2. Implement is_available() to check if your pixel is configured
     990     * 3. Add `new MyPixel_Adapter();` at the bottom of your adapter file (auto-registers)
     991     * 4. Load the adapter class in Pixel_Manager::__construct() with class_exists()
     992     *
     993     * That's it! The registry will automatically detect it - no updates needed here.
     994     *
     995     * @return bool True if at least one S2S integration is active
     996     * @since 1.52.0 Refactored to use adapter registry for automatic detection
     997     */
    970998    public static function server_2_server_enabled() {
    971         return
    972             self::is_facebook_capi_active()
    973             || self::is_tiktok_eapi_active()
    974             || self::is_pinterest_apic_active()
    975             || self::is_snapchat_capi_active();
     999        // Use the pixel registry for dynamic detection (backward compatible via class_alias)
     1000        if ( class_exists( '\SweetCode\Pixel_Manager\Pixels\Pixel_Registry' ) ) {
     1001            return \SweetCode\Pixel_Manager\Pixels\Pixel_Registry::has_available_adapters();
     1002        }
     1003       
     1004        // Fallback for edge cases where registry isn't loaded (shouldn't happen in normal flow)
     1005        return false;
    9761006    }
    9771007
     
    9961026        if (self::is_snapchat_active()) {
    9971027            $pixels[] = 'snapchat';
     1028        }
     1029
     1030        if (self::is_reddit_active()) {
     1031            $pixels[] = 'reddit';
    9981032        }
    9991033
  • woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/class-server-event-processor.php

    r3402314 r3406541  
    33namespace SweetCode\Pixel_Manager;
    44
    5 use SweetCode\Pixel_Manager\Pixels\Pixel_Adapter_Registry;
     5use SweetCode\Pixel_Manager\Pixels\Core\Pixel_Adapter_Registry;
    66
    77defined('ABSPATH') || exit; // Exit if accessed directly
  • woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/class-shop.php

    r3313714 r3406541  
    1717    private static $transient_identifiers;
    1818
     19    /**
     20     * Determine if the user should be tracked.
     21     *
     22     * This function implements role-based tracking restrictions to prevent certain user types
     23     * (e.g., administrators, shop managers) from being tracked by analytics pixels. This helps
     24     * maintain data accuracy by filtering out internal traffic and test orders.
     25     *
     26     * Logic flow:
     27     * 1. Anonymous visitors (user_id = 0) are always tracked
     28     * 2. If a user_id is provided, retrieve that specific user object
     29     * 3. If no user_id is provided but the user is logged in, retrieve the current user
     30     * 4. Check if any of the user's roles match the roles configured to be excluded from tracking
     31     *    in the plugin settings (shop->disable_tracking_for option)
     32     * 5. Return false if the user has a restricted role, true otherwise
     33     *
     34     * @param int|null $user_id The user ID to check. If null, the current user will be used.
     35     *                          If 0, the user is considered anonymous.
     36     * @return bool True if the user should be tracked, false otherwise.
     37     */
    1938    public static function track_user( $user_id = null ) {
    2039        $user = null;
  • woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/pixels/class-pixel-manager.php

    r3403843 r3406541  
    77use SweetCode\Pixel_Manager\Admin\Validations;
    88use SweetCode\Pixel_Manager\Data\GA4_Data_API;
     9use SweetCode\Pixel_Manager\Pixels\ABTasty\AB_Tasty;
     10use SweetCode\Pixel_Manager\Pixels\Core\Pixel_Registry;
    911use SweetCode\Pixel_Manager\Pixels\Facebook\Facebook_CAPI;
    10 use SweetCode\Pixel_Manager\Pixels\Facebook\Facebook_Adapter;
    1112use SweetCode\Pixel_Manager\Pixels\Google\Google_MP_GA4;
    1213use SweetCode\Pixel_Manager\Pixels\Google\Google_Helpers;
     14use SweetCode\Pixel_Manager\Pixels\Optimizely\Optimizely;
    1315use SweetCode\Pixel_Manager\Pixels\TikTok\TikTok_EAPI;
    14 use SweetCode\Pixel_Manager\Pixels\TikTok\TikTok_Adapter;
    1516use SweetCode\Pixel_Manager\Pixels\Pinterest\Pinterest_APIC;
    16 use SweetCode\Pixel_Manager\Pixels\Pinterest\Pinterest_Adapter;
    1717use SweetCode\Pixel_Manager\Pixels\Snapchat\Snapchat_CAPI;
    18 use SweetCode\Pixel_Manager\Pixels\Snapchat\Snapchat_Adapter;
     18use SweetCode\Pixel_Manager\Pixels\Reddit\Reddit_CAPI;
     19use SweetCode\Pixel_Manager\Pixels\VWO\VWO;
    1920use SweetCode\Pixel_Manager\Geolocation;
    2021use SweetCode\Pixel_Manager\Helpers;
     
    8990            }
    9091        } );
     92        /**
     93         * Initialize all pixels
     94         */
     95        /**
     96         * Load pixel descriptor infrastructure
     97         *
     98         * This enables the unified pixel registry system that supports both
     99         * server-side adapters and browser-side descriptors.
     100         */
     101        require_once __DIR__ . '/core/interface-pixel-descriptor.php';
     102        require_once __DIR__ . '/core/abstract-pixel-descriptor.php';
     103        require_once __DIR__ . '/core/class-pixel-registry.php';
     104        /**
     105         * Load all pixel descriptors
     106         *
     107         * Each descriptor auto-registers with the Pixel_Registry on instantiation.
     108         * The autoloader handles file loading - we just trigger it via class_exists().
     109         *
     110         * When adding a new pixel descriptor, add its class name to the array below.
     111         */
     112        $descriptors = [
     113            // Google pixels
     114            'SweetCode\\Pixel_Manager\\Pixels\\Descriptors\\Google\\Google_Ads_Descriptor',
     115            'SweetCode\\Pixel_Manager\\Pixels\\Descriptors\\Google\\GA4_Descriptor',
     116            // Marketing pixels
     117            'SweetCode\\Pixel_Manager\\Pixels\\Descriptors\\Bing_Descriptor',
     118            'SweetCode\\Pixel_Manager\\Pixels\\Descriptors\\Twitter_Descriptor',
     119            'SweetCode\\Pixel_Manager\\Pixels\\Descriptors\\LinkedIn_Descriptor',
     120            'SweetCode\\Pixel_Manager\\Pixels\\Descriptors\\AdRoll_Descriptor',
     121            'SweetCode\\Pixel_Manager\\Pixels\\Descriptors\\Outbrain_Descriptor',
     122            'SweetCode\\Pixel_Manager\\Pixels\\Descriptors\\Taboola_Descriptor',
     123            // Statistics pixels
     124            'SweetCode\\Pixel_Manager\\Pixels\\Descriptors\\Hotjar_Descriptor',
     125            // Optimization pixels
     126            'SweetCode\\Pixel_Manager\\Pixels\\Descriptors\\VWO_Descriptor',
     127            'SweetCode\\Pixel_Manager\\Pixels\\Descriptors\\Optimizely_Descriptor',
     128            'SweetCode\\Pixel_Manager\\Pixels\\Descriptors\\AB_Tasty_Descriptor',
     129        ];
     130        foreach ( $descriptors as $descriptor_class ) {
     131            class_exists( $descriptor_class );
     132        }
     133        /**
     134         * Allow third-party plugins to register custom pixel descriptors
     135         */
     136        Pixel_Registry::init_third_party_pixels();
    91137        add_action( 'wp_head', function () {
    92138            $this->inject_pmw_closing();
     
    372418        if ( get_transient( 'pmw_products_for_datalayer_' . $data['page_id'] ) ) {
    373419            $products_in_transient = get_transient( 'pmw_products_for_datalayer_' . $data['page_id'] );
     420            // Filter out products that no longer exist or are not published
     421            $products_in_transient = array_filter( $products_in_transient, function ( $product_data ) {
     422                // Skip if no product ID
     423                if ( !isset( $product_data['id'] ) ) {
     424                    return false;
     425                }
     426                $product = wc_get_product( $product_data['id'] );
     427                // Remove if product doesn't exist or is not published
     428                if ( Product::is_not_wc_product( $product ) || 'publish' !== $product->get_status() ) {
     429                    return false;
     430                }
     431                return true;
     432            } );
    374433            // Merge the associative arrays with nested arrays $products and $products_in_transient preserving the keys
    375434            $products = array_replace_recursive( $products, $products_in_transient );
  • woocommerce-google-adwords-conversion-tracking-tag/trunk/js/public/free/wpm-public.p1.min.js

    r3403843 r3406541  
    1 /*! Copyright 2025 SweetCode. All rights reserved. */(()=>{var e,t,r,a,o={179:(e,t,r)=>{"use strict";r.r(t),r.d(t,{getLocationByTimeZone:()=>a});const a=()=>{const e=Intl.DateTimeFormat().resolvedOptions().timeZone;if(""===e||!e)return null;let t={countryCode:{"Africa/Abidjan":["CI","BF","GH","GM","GN","ML","MR","SH","SL","SN","TG"],"Africa/Accra":["GH"],"Africa/Addis_Ababa":["ET"],"Africa/Algiers":["DZ"],"Africa/Asmara":["ER"],"Africa/Asmera":["ER"],"Africa/Bamako":["ML"],"Africa/Bangui":["CF"],"Africa/Banjul":["GM"],"Africa/Bissau":["GW"],"Africa/Blantyre":["MW"],"Africa/Brazzaville":["CG"],"Africa/Bujumbura":["BI"],"Africa/Cairo":["EG"],"Africa/Casablanca":["MA"],"Africa/Ceuta":["ES"],"Africa/Conakry":["GN"],"Africa/Dakar":["SN"],"Africa/Dar_es_Salaam":["TZ"],"Africa/Djibouti":["DJ"],"Africa/Douala":["CM"],"Africa/El_Aaiun":["EH"],"Africa/Freetown":["SL"],"Africa/Gaborone":["BW"],"Africa/Harare":["ZW"],"Africa/Johannesburg":["ZA","LS","SZ"],"Africa/Juba":["SS"],"Africa/Kampala":["UG"],"Africa/Khartoum":["SD"],"Africa/Kigali":["RW"],"Africa/Kinshasa":["CD"],"Africa/Lagos":["NG","AO","BJ","CD","CF","CG","CM","GA","GQ","NE"],"Africa/Libreville":["GA"],"Africa/Lome":["TG"],"Africa/Luanda":["AO"],"Africa/Lubumbashi":["CD"],"Africa/Lusaka":["ZM"],"Africa/Malabo":["GQ"],"Africa/Maputo":["MZ","BI","BW","CD","MW","RW","ZM","ZW"],"Africa/Maseru":["LS"],"Africa/Mbabane":["SZ"],"Africa/Mogadishu":["SO"],"Africa/Monrovia":["LR"],"Africa/Nairobi":["KE","DJ","ER","ET","KM","MG","SO","TZ","UG","YT"],"Africa/Ndjamena":["TD"],"Africa/Niamey":["NE"],"Africa/Nouakchott":["MR"],"Africa/Ouagadougou":["BF"],"Africa/Porto-Novo":["BJ"],"Africa/Sao_Tome":["ST"],"Africa/Timbuktu":["ML"],"Africa/Tripoli":["LY"],"Africa/Tunis":["TN"],"Africa/Windhoek":["NA"],"America/Adak":["US"],"America/Anchorage":["US"],"America/Anguilla":["AI"],"America/Antigua":["AG"],"America/Araguaina":["BR"],"America/Argentina/Buenos_Aires":["AR"],"America/Argentina/Catamarca":["AR"],"America/Argentina/Cordoba":["AR"],"America/Argentina/Jujuy":["AR"],"America/Argentina/La_Rioja":["AR"],"America/Argentina/Mendoza":["AR"],"America/Argentina/Rio_Gallegos":["AR"],"America/Argentina/Salta":["AR"],"America/Argentina/San_Juan":["AR"],"America/Argentina/San_Luis":["AR"],"America/Argentina/Tucuman":["AR"],"America/Argentina/Ushuaia":["AR"],"America/Aruba":["AW"],"America/Asuncion":["PY"],"America/Atikokan":["CA"],"America/Bahia":["BR"],"America/Bahia_Banderas":["MX"],"America/Barbados":["BB"],"America/Belem":["BR"],"America/Belize":["BZ"],"America/Blanc-Sablon":["CA"],"America/Boa_Vista":["BR"],"America/Bogota":["CO"],"America/Boise":["US"],"America/Cambridge_Bay":["CA"],"America/Campo_Grande":["BR"],"America/Cancun":["MX"],"America/Caracas":["VE"],"America/Cayenne":["GF"],"America/Cayman":["KY"],"America/Chicago":["US"],"America/Chihuahua":["MX"],"America/Coral_Harbour":["CA"],"America/Costa_Rica":["CR"],"America/Creston":["CA"],"America/Cuiaba":["BR"],"America/Curacao":["CW"],"America/Danmarkshavn":["GL"],"America/Dawson":["CA"],"America/Dawson_Creek":["CA"],"America/Denver":["US"],"America/Detroit":["US"],"America/Dominica":["DM"],"America/Edmonton":["CA"],"America/Eirunepe":["BR"],"America/El_Salvador":["SV"],"America/Fort_Nelson":["CA"],"America/Fortaleza":["BR"],"America/Glace_Bay":["CA"],"America/Goose_Bay":["CA"],"America/Grand_Turk":["TC"],"America/Grenada":["GD"],"America/Guadeloupe":["GP"],"America/Guatemala":["GT"],"America/Guayaquil":["EC"],"America/Guyana":["GY"],"America/Halifax":["CA"],"America/Havana":["CU"],"America/Hermosillo":["MX"],"America/Indiana/Indianapolis":["US"],"America/Indiana/Knox":["US"],"America/Indiana/Marengo":["US"],"America/Indiana/Petersburg":["US"],"America/Indiana/Tell_City":["US"],"America/Indiana/Vevay":["US"],"America/Indiana/Vincennes":["US"],"America/Indiana/Winamac":["US"],"America/Inuvik":["CA"],"America/Iqaluit":["CA"],"America/Jamaica":["JM"],"America/Juneau":["US"],"America/Kentucky/Louisville":["US"],"America/Kentucky/Monticello":["US"],"America/Kralendijk":["BQ"],"America/La_Paz":["BO"],"America/Lima":["PE"],"America/Los_Angeles":["US"],"America/Lower_Princes":["SX"],"America/Maceio":["BR"],"America/Managua":["NI"],"America/Manaus":["BR"],"America/Marigot":["MF"],"America/Martinique":["MQ"],"America/Matamoros":["MX"],"America/Mazatlan":["MX"],"America/Menominee":["US"],"America/Merida":["MX"],"America/Metlakatla":["US"],"America/Mexico_City":["MX"],"America/Miquelon":["PM"],"America/Moncton":["CA"],"America/Monterrey":["MX"],"America/Montevideo":["UY"],"America/Montreal":["CA"],"America/Montserrat":["MS"],"America/Nassau":["BS"],"America/New_York":["US"],"America/Nipigon":["CA"],"America/Nome":["US"],"America/Noronha":["BR"],"America/North_Dakota/Beulah":["US"],"America/North_Dakota/Center":["US"],"America/North_Dakota/New_Salem":["US"],"America/Nuuk":["GL"],"America/Ojinaga":["MX"],"America/Panama":["PA","CA","KY"],"America/Pangnirtung":["CA"],"America/Paramaribo":["SR"],"America/Phoenix":["US","CA"],"America/Port-au-Prince":["HT"],"America/Port_of_Spain":["TT"],"America/Porto_Velho":["BR"],"America/Puerto_Rico":["PR","AG","CA","AI","AW","BL","BQ","CW","DM","GD","GP","KN","LC","MF","MS","SX","TT","VC","VG","VI"],"America/Punta_Arenas":["CL"],"America/Rainy_River":["CA"],"America/Rankin_Inlet":["CA"],"America/Recife":["BR"],"America/Regina":["CA"],"America/Resolute":["CA"],"America/Rio_Branco":["BR"],"America/Santarem":["BR"],"America/Santiago":["CL"],"America/Santo_Domingo":["DO"],"America/Sao_Paulo":["BR"],"America/Scoresbysund":["GL"],"America/Sitka":["US"],"America/St_Barthelemy":["BL"],"America/St_Johns":["CA"],"America/St_Kitts":["KN"],"America/St_Lucia":["LC"],"America/St_Thomas":["VI"],"America/St_Vincent":["VC"],"America/Swift_Current":["CA"],"America/Tegucigalpa":["HN"],"America/Thule":["GL"],"America/Thunder_Bay":["CA"],"America/Tijuana":["MX"],"America/Toronto":["CA","BS"],"America/Tortola":["VG"],"America/Vancouver":["CA"],"America/Virgin":["VI"],"America/Whitehorse":["CA"],"America/Winnipeg":["CA"],"America/Yakutat":["US"],"America/Yellowknife":["CA"],"Antarctica/Casey":["AQ"],"Antarctica/Davis":["AQ"],"Antarctica/DumontDUrville":["AQ"],"Antarctica/Macquarie":["AU"],"Antarctica/Mawson":["AQ"],"Antarctica/McMurdo":["AQ"],"Antarctica/Palmer":["AQ"],"Antarctica/Rothera":["AQ"],"Antarctica/South_Pole":["AQ"],"Antarctica/Syowa":["AQ"],"Antarctica/Troll":["AQ"],"Antarctica/Vostok":["AQ"],"Arctic/Longyearbyen":["SJ"],"Asia/Aden":["YE"],"Asia/Almaty":["KZ"],"Asia/Amman":["JO"],"Asia/Anadyr":["RU"],"Asia/Aqtau":["KZ"],"Asia/Aqtobe":["KZ"],"Asia/Ashgabat":["TM"],"Asia/Atyrau":["KZ"],"Asia/Baghdad":["IQ"],"Asia/Bahrain":["BH"],"Asia/Baku":["AZ"],"Asia/Bangkok":["TH","KH","LA","VN"],"Asia/Barnaul":["RU"],"Asia/Beirut":["LB"],"Asia/Bishkek":["KG"],"Asia/Brunei":["BN"],"Asia/Chita":["RU"],"Asia/Choibalsan":["MN"],"Asia/Colombo":["LK"],"Asia/Damascus":["SY"],"Asia/Dhaka":["BD"],"Asia/Dili":["TL"],"Asia/Dubai":["AE","OM"],"Asia/Dushanbe":["TJ"],"Asia/Famagusta":["CY"],"Asia/Gaza":["PS"],"Asia/Hebron":["PS"],"Asia/Ho_Chi_Minh":["VN"],"Asia/Hong_Kong":["HK"],"Asia/Hovd":["MN"],"Asia/Irkutsk":["RU"],"Asia/Jakarta":["ID"],"Asia/Jayapura":["ID"],"Asia/Jerusalem":["IL"],"Asia/Kabul":["AF"],"Asia/Kamchatka":["RU"],"Asia/Karachi":["PK"],"Asia/Kathmandu":["NP"],"Asia/Khandyga":["RU"],"Asia/Kolkata":["IN"],"Asia/Krasnoyarsk":["RU"],"Asia/Kuala_Lumpur":["MY"],"Asia/Kuching":["MY"],"Asia/Kuwait":["KW"],"Asia/Macau":["MO"],"Asia/Magadan":["RU"],"Asia/Makassar":["ID"],"Asia/Manila":["PH"],"Asia/Muscat":["OM"],"Asia/Nicosia":["CY"],"Asia/Novokuznetsk":["RU"],"Asia/Novosibirsk":["RU"],"Asia/Omsk":["RU"],"Asia/Oral":["KZ"],"Asia/Phnom_Penh":["KH"],"Asia/Pontianak":["ID"],"Asia/Pyongyang":["KP"],"Asia/Qatar":["QA","BH"],"Asia/Qostanay":["KZ"],"Asia/Qyzylorda":["KZ"],"Asia/Riyadh":["SA","AQ","KW","YE"],"Asia/Sakhalin":["RU"],"Asia/Samarkand":["UZ"],"Asia/Seoul":["KR"],"Asia/Shanghai":["CN"],"Asia/Singapore":["SG","MY"],"Asia/Srednekolymsk":["RU"],"Asia/Taipei":["TW"],"Asia/Tashkent":["UZ"],"Asia/Tbilisi":["GE"],"Asia/Tehran":["IR"],"Asia/Thimphu":["BT"],"Asia/Tokyo":["JP"],"Asia/Tomsk":["RU"],"Asia/Ulaanbaatar":["MN"],"Asia/Urumqi":["CN"],"Asia/Ust-Nera":["RU"],"Asia/Vientiane":["LA"],"Asia/Vladivostok":["RU"],"Asia/Yakutsk":["RU"],"Asia/Yangon":["MM"],"Asia/Yekaterinburg":["RU"],"Asia/Yerevan":["AM"],"Atlantic/Azores":["PT"],"Atlantic/Bermuda":["BM"],"Atlantic/Canary":["ES"],"Atlantic/Cape_Verde":["CV"],"Atlantic/Faroe":["FO"],"Atlantic/Jan_Mayen":["SJ"],"Atlantic/Madeira":["PT"],"Atlantic/Reykjavik":["IS"],"Atlantic/South_Georgia":["GS"],"Atlantic/St_Helena":["SH"],"Atlantic/Stanley":["FK"],"Australia/Adelaide":["AU"],"Australia/Brisbane":["AU"],"Australia/Broken_Hill":["AU"],"Australia/Darwin":["AU"],"Australia/Eucla":["AU"],"Australia/Hobart":["AU"],"Australia/Lindeman":["AU"],"Australia/Lord_Howe":["AU"],"Australia/Melbourne":["AU"],"Australia/Perth":["AU"],"Australia/Sydney":["AU"],"Canada/Eastern":["CA"],"Europe/Amsterdam":["NL"],"Europe/Andorra":["AD"],"Europe/Astrakhan":["RU"],"Europe/Athens":["GR"],"Europe/Belfast":["GB"],"Europe/Belgrade":["RS","BA","HR","ME","MK","SI"],"Europe/Berlin":["DE"],"Europe/Bratislava":["SK"],"Europe/Brussels":["BE"],"Europe/Bucharest":["RO"],"Europe/Budapest":["HU"],"Europe/Busingen":["DE"],"Europe/Chisinau":["MD"],"Europe/Copenhagen":["DK"],"Europe/Dublin":["IE"],"Europe/Gibraltar":["GI"],"Europe/Guernsey":["GG"],"Europe/Helsinki":["FI","AX"],"Europe/Isle_of_Man":["IM"],"Europe/Istanbul":["TR"],"Europe/Jersey":["JE"],"Europe/Kaliningrad":["RU"],"Europe/Kiev":["UA"],"Europe/Kirov":["RU"],"Europe/Lisbon":["PT"],"Europe/Ljubljana":["SI"],"Europe/London":["GB","GG","IM","JE"],"Europe/Luxembourg":["LU"],"Europe/Madrid":["ES"],"Europe/Malta":["MT"],"Europe/Mariehamn":["AX"],"Europe/Minsk":["BY"],"Europe/Monaco":["MC"],"Europe/Moscow":["RU"],"Europe/Oslo":["NO","SJ","BV"],"Europe/Paris":["FR"],"Europe/Podgorica":["ME"],"Europe/Prague":["CZ","SK"],"Europe/Riga":["LV"],"Europe/Rome":["IT","SM","VA"],"Europe/Samara":["RU"],"Europe/San_Marino":["SM"],"Europe/Sarajevo":["BA"],"Europe/Saratov":["RU"],"Europe/Simferopol":["RU","UA"],"Europe/Skopje":["MK"],"Europe/Sofia":["BG"],"Europe/Stockholm":["SE"],"Europe/Tallinn":["EE"],"Europe/Tirane":["AL"],"Europe/Ulyanovsk":["RU"],"Europe/Uzhgorod":["UA"],"Europe/Vaduz":["LI"],"Europe/Vatican":["VA"],"Europe/Vienna":["AT"],"Europe/Vilnius":["LT"],"Europe/Volgograd":["RU"],"Europe/Warsaw":["PL"],"Europe/Zagreb":["HR"],"Europe/Zaporozhye":["UA"],"Europe/Zurich":["CH","DE","LI"],GB:["GB"],"GB-Eire":["GB"],"Indian/Antananarivo":["MG"],"Indian/Chagos":["IO"],"Indian/Christmas":["CX"],"Indian/Cocos":["CC"],"Indian/Comoro":["KM"],"Indian/Kerguelen":["TF","HM"],"Indian/Mahe":["SC"],"Indian/Maldives":["MV"],"Indian/Mauritius":["MU"],"Indian/Mayotte":["YT"],"Indian/Reunion":["RE","TF"],NZ:["NZ"],"Pacific/Apia":["WS"],"Pacific/Auckland":["NZ","AQ"],"Pacific/Bougainville":["PG"],"Pacific/Chatham":["NZ"],"Pacific/Chuuk":["FM"],"Pacific/Easter":["CL"],"Pacific/Efate":["VU"],"Pacific/Fakaofo":["TK"],"Pacific/Fiji":["FJ"],"Pacific/Funafuti":["TV"],"Pacific/Galapagos":["EC"],"Pacific/Gambier":["PF"],"Pacific/Guadalcanal":["SB"],"Pacific/Guam":["GU","MP"],"Pacific/Honolulu":["US","UM"],"Pacific/Johnston":["UM"],"Pacific/Kanton":["KI"],"Pacific/Kiritimati":["KI"],"Pacific/Kosrae":["FM"],"Pacific/Kwajalein":["MH"],"Pacific/Majuro":["MH"],"Pacific/Marquesas":["PF"],"Pacific/Midway":["UM"],"Pacific/Nauru":["NR"],"Pacific/Niue":["NU"],"Pacific/Norfolk":["NF"],"Pacific/Noumea":["NC"],"Pacific/Pago_Pago":["AS","UM"],"Pacific/Palau":["PW"],"Pacific/Pitcairn":["PN"],"Pacific/Pohnpei":["FM"],"Pacific/Port_Moresby":["PG","AQ"],"Pacific/Rarotonga":["CK"],"Pacific/Saipan":["MP"],"Pacific/Samoa":["WS"],"Pacific/Tahiti":["PF"],"Pacific/Tarawa":["KI"],"Pacific/Tongatapu":["TO"],"Pacific/Wake":["UM"],"Pacific/Wallis":["WF"],Singapore:["SG"],"US/Arizona":["US"],"US/Hawaii":["US"],"US/Samoa":["WS"]}[e][0].toUpperCase()};return"America/Los_Angeles"===e&&(t.regionCode="US-CA"),"Europe/Zurich"===e&&(t.regionCode="CH-ZH"),t}},181:(e,t,r)=>{"use strict";r.r(t),r.d(t,{error:()=>o,log:()=>a});const a=(e,...t)=>{i()&&("object"==typeof e?console.log("Pixel Manager: ",e,...t):t.length?console.log("Pixel Manager: "+e,...t):console.log("Pixel Manager: "+e))},o=(e,...t)=>{"object"==typeof e?console.error("Pixel Manager: ",e,...t):t.length?console.error("Pixel Manager: "+e,...t):console.error("Pixel Manager: "+e)},i=()=>!n()&&(!!s()||(!!c()||!!wpmDataLayer?.general?.logger?.is_active)),n=()=>(wpm.urlHasParameter("pmwloggeroff")&&wpm.storeData("loggerEnabled",!1),wpm.urlHasParameter("pmwloggeroff")),s=()=>wpm.retrieveData("loggerEnabled"),c=()=>(wpm.urlHasParameter("pmwloggeron")&&wpm.storeData("loggerEnabled",!0),wpm.urlHasParameter("pmwloggeron"))},189:(e,t,r)=>{r(783),window.wpm.loadConsentModule=async()=>{const e=await r.e(625).then(r.bind(r,153));window.wpm.consent=e;const t=await r.e(968).then(r.bind(r,857));return window.pmw=window.pmw||{},window.pmw.consent=window.pmw.consent||{},window.pmw.consent.api=t,e},window.pmw=window.pmw||{console:r(181)},r(616)},196:()=>{const e=e=>e=(e=e.replace(/<[^>]*>?/gm,"").replace(/\n/gm,"").replace(/\t/gm,"")).trim();jQuery("form.woocommerce-checkout").on("change","#shipping_method",r=>{r.target?.value&&r.target?.id&&t({slug:r.target.value,text:e(jQuery("label[for='"+r.target.id+"']").text())})}),jQuery(()=>{if(jQuery("#shipping_method").length){let r=jQuery("#shipping_method").find(":checked");if(r.length){if(!r.val())return;if(!r.attr("id"))return;t({slug:r.val(),text:e(jQuery("label[for='"+r.attr("id")+"']").text())})}}});const t=e=>{jQuery(document).trigger("pmw:add-shipping-info",{shippingTier:e})};let r=!1;jQuery("form.woocommerce-checkout").on("change",'input[name="payment_method"]',t=>{t.target.value&&t.target.id&&(a({slug:t.target.value,text:e(jQuery("label[for='"+t.target.id+"']").text())}),r=!0)}),jQuery(()=>{if(r)return;let t=jQuery('input[name="payment_method"]:checked');if(t.length){if(!t.val())return;if(!t.attr("id"))return;a({slug:t.val(),text:e(jQuery("label[for='"+t.attr("id")+"']").text())})}});const a=e=>{jQuery(document).trigger("pmw:add-payment-info",{paymentType:e})};jQuery(document).on("click",".remove_from_cart_button, .remove",e=>{try{let t=new URL(jQuery(e.currentTarget).attr("href")),r=wpm.getProductIdByCartItemKeyUrl(t);wpm.removeProductFromCart(r)}catch(e){console.error(e)}});const o=wpm.prepareSelectors([".checkout-button",".cart-checkout-button",".button.checkout",".xoo-wsc-ft-btn-checkout",".elementor-button--checkout",".xt_woofc-checkout",".fkcart-checkout--text"],"beginCheckout");jQuery(document).on("click init_checkout",o,()=>{jQuery(document).trigger("pmw:begin-checkout")}),jQuery(document).on("updated_cart_totals",()=>{jQuery(document).trigger("pmw:view-cart")}),jQuery(document).on("wpmLoad",e=>{jQuery(document).on("payment_method_selected",()=>{!1===wpm.paymentMethodSelected&&wpm.fireCheckoutProgress(3),wpm.fireCheckoutOption(3,jQuery("input[name='payment_method']:checked").val()),wpm.paymentMethodSelected=!0})}),jQuery(document).on("wpmLoad",()=>{try{wpm.initCart()}catch(e){console.error(e)}}),jQuery(document).on("wpmLoad",()=>{wpmDataLayer.products=wpmDataLayer.products||{};let e=wpm.getAddToCartLinkProductIds();wpm.getProductsFromBackend(e)}),jQuery(document).on("wpmLoad",()=>{if(!document.referrer)return;if(wpm.retrieveData("referrer"))return;let e=new URL(document.referrer).hostname;e!==window.location.host&&wpm.storeData("referrer",e)}),jQuery(document).on("wpmLoad",()=>{let e=wpm.getUrlParameter("gclid");e&&wpm.storeData("gclid",e);let t=wpm.getUrlParameter("wbraid");t&&wpm.storeData("wbraid",t);let r=wpm.getUrlParameter("gbraid");r&&wpm.storeData("gbraid",r);let a=wpm.getUrlParameter("fbclid");a&&(a="fb.1."+Math.floor(Date.now()/1e3)+"."+a,wpm.storeData("fbclid",a));let o=wpm.getUrlParameter("ttclid");o&&wpm.storeData("ttclid",o);let i=wpm.getUrlParameter("ScCid");i&&wpm.storeData("scid",i);let n=wpm.getUrlParameter("epik");n&&wpm.storeData("epik",n)}),jQuery(document).on("wpmLoad",()=>{try{if("undefined"!=typeof wpmDataLayer&&!wpmDataLayer?.pmw_loaded){if(jQuery(document).trigger("pmw:load-always"),wpmDataLayer?.shop)if("product"===wpmDataLayer.shop.page_type&&"variable"!==wpmDataLayer.shop.product_type&&wpm.getMainProductIdFromProductPage()){let e=wpm.getProductDataForViewItemEvent(wpm.getMainProductIdFromProductPage());jQuery(document).trigger("pmw:view-item",e)}else"product_category"===wpmDataLayer.shop.page_type?jQuery(document).trigger("pmw:view-category"):"search"===wpmDataLayer.shop.page_type?jQuery(document).trigger("pmw:search"):"cart"===wpmDataLayer.shop.page_type?jQuery(document).trigger("pmw:view-cart"):"order_received_page"===wpmDataLayer.shop.page_type?wpmDataLayer?.order&&!wpm.isOrderIdStored(wpmDataLayer.order.id)&&(jQuery(document).trigger("pmw:purchase"),wpm.writeOrderIdToStorage(wpmDataLayer.order.id,wpmDataLayer.order.key),"function"==typeof wpm.acrRemoveCookie&&wpm.acrRemoveCookie()):jQuery(document).trigger("pmw:everywhere-else");else jQuery(document).trigger("pmw:everywhere-else");wpmDataLayer?.user?.id&&!wpm.hasLoginEventFired()&&(jQuery(document).trigger("pmw:login"),wpm.setLoginEventFired()),wpmDataLayer.pmw_loaded=!0}}catch(e){console.error(e)}}),wpmDataLayer?.general?.lazy_load_pmw&&wpm.registerShowVariationEventListener(),jQuery(document).on("wpmLoad",()=>{if(wpmDataLayer?.general?.lazy_load_pmw)try{const e=jQuery(".variations_form");if(!e.length)return;const t={};if(!e.find("select").toArray().every(e=>{const r=jQuery(e).val();return!!r&&(t[jQuery(e).attr("name")]=r,!0)}))return;const r=e.data("product_variations");if(!r)return;const a=r.find(e=>Object.entries(t).every(([t,r])=>e.attributes[t]===r));a&&wpm.triggerViewItemEventPrep(a.variation_id)}catch(e){pmw.console.error(e)}}),jQuery(document).on("wpmLoad",async()=>{!1===wpm.retrieveData("restEndpointAvailable")&&pmw.console.error("REST endpoint is not available. Using admin-ajax.php instead.")}),jQuery(document).on("pmw:page-view",e=>{pmw.console.log("pmw:page-view event fired",{event:e});let t={event:"page_view",pixels:{}};wpmDataLayer?.pixels?.facebook?.loaded&&(t.pixels.facebook={event_name:"PageView",event_id:wpm.getFbRandomEventId(),user_data:wpm.getFbUserData(),event_source_url:window.location.href},wpm.retrieveData("referrer")&&(t.pixels.facebook.referrer_url=wpm.makeFullUrl(wpm.retrieveData("referrer")))),wpmDataLayer?.pixels?.snapchat?.loaded&&(t.pixels.snapchat=wpm.getSnapchatS2SBaseData(),t.pixels.snapchat.event_name="PAGE_VIEW"),jQuery(document).trigger("pmw:s2s:page-view",t),wpmDataLayer?.general?.server_2_server?.pageview_event_s2s?.is_active&&wpm.sendEventPayloadToServer(t)}),jQuery(document).on("pmw:add-to-cart",async(e,t)=>{pmw.console.log("pmw:add-to-cart event fired",{event:e,product:t}),await wpm.processEvent("add_to_cart",{product:t})}),jQuery(document).on("pmw:remove-from-cart",async(e,t)=>{pmw.console.log("pmw:remove-from-cart event fired",{event:e,product:t}),await wpm.processEvent("remove_from_cart",{product:t})}),jQuery(document).on("pmw:select-item",async(e,t)=>{pmw.console.log("pmw:select-item event fired",{event:e,product:t}),await wpm.processEvent("select_item",{product:t})}),jQuery(document).on("pmw:begin-checkout",e=>{pmw.console.log("pmw:begin-checkout event fired",{event:e}),wpm.processEvent("begin_checkout",{})}),jQuery(document).on("pmw:add-payment-info",e=>{pmw.console.log("pmw:add-payment-info event fired",{event:e}),wpm.processEvent("add_payment_info",{})}),jQuery(document).on("pmw:add-to-wishlist",(e,t)=>{pmw.console.log("pmw:add-to-wishlist event fired",{event:e,product:t});let r={event:"add_to_wishlist",product:t,pixels:{}};wpmDataLayer?.pixels?.facebook?.loaded&&(r.pixels.facebook={event_name:"AddToWishlist",event_id:wpm.getFbRandomEventId(),user_data:wpm.getFbUserData(),event_source_url:window.location.href,custom_data:wpm.fbGetProductDataForCapiEvent(t)},wpm.retrieveData("referrer")&&(r.pixels.facebook.referrer_url=wpm.makeFullUrl(wpm.retrieveData("referrer")))),wpmDataLayer?.pixels?.tiktok?.loaded&&(r.pixels.tiktok={event:"AddToWishlist",event_id:wpm.getRandomEventId(),user:wpm.tiktokGetEventUserData(),page:wpm.tiktokGetEventPageData(),properties:{value:t.price*t.quantity,currency:t.currency,content_type:"product",contents:[{content_id:wpm.getProductIdForSpecificPixel(t,"tiktok"),content_name:t.name,quantity:t.quantity,price:t.price}]}}),wpmDataLayer?.pixels?.snapchat?.loaded&&(r.pixels.snapchat=wpm.getSnapchatS2SBaseData(),r.pixels.snapchat.event_name="ADD_TO_WISHLIST",r.pixels.snapchat.custom_data=wpm.getSnapchatCustomDataForProduct(t)),jQuery(document).trigger("pmw:s2s:add-to-wishlist",r),wpm.sendEventPayloadToServer(r)}),jQuery(document).on("pmw:view-item",(e,t=null)=>{pmw.console.log("pmw:view-item event fired",{event:e,product:t}),wpm.processEvent("view_item",{product:t})}),jQuery(document).on("pmw:view-category",(e,t=null)=>{pmw.console.log("pmw:view-category event fired",{event:e,product:t});let r={event:"view_category",pixels:{}};wpmDataLayer?.pixels?.pinterest?.loaded&&(r.pixels.pinterest=wpm.getPinterestS2SBaseData(),r.pixels.pinterest.event_name="viewcategory"),jQuery(document).trigger("pmw:s2s:view-category",r),wpm.sendEventPayloadToServer(r)}),jQuery(document).on("pmw:search",e=>{pmw.console.log("pmw:search event fired",{event:e}),wpm.processEvent("search",{})}),jQuery(document).on("pmw:place-order",e=>{pmw.console.log("pmw:place-order event fired",{event:e});let t={event:"place_order",pixels:{}};wpmDataLayer?.pixels?.tiktok?.loaded&&(t.pixels.tiktok={event:"PlaceAnOrder",event_id:wpm.getRandomEventId(),user:wpm.tiktokGetEventUserData(),page:wpm.tiktokGetEventPageData(),properties:wpm.tiktokGetPropertiesFromCart()}),jQuery(document).trigger("pmw:s2s:place-order",t),wpm.sendEventPayloadToServer(t)}),jQuery(document).on("pmw:purchase",async e=>{pmw.console.log("pmw:purchase event fired",{event:e}),await wpm.processEvent("purchase",{order:wpmDataLayer.order})}),jQuery(document).on("pmw:login",()=>{pmw.console.log("pmw:login event fired");let e={event:"login",pixels:{}};wpmDataLayer?.pixels?.snapchat?.loaded&&(e.pixels.snapchat=wpm.getSnapchatS2SBaseData(),e.pixels.snapchat.event_name="LOGIN"),jQuery(document).trigger("pmw:s2s:login",e),wpm.sendEventPayloadToServer(e)}),jQuery(document).on("pmw:ready",async()=>{wpm.isWooCommerceActive()&&(wpm.startIntersectionObserverToWatch(),wpm.startProductsMutationObserverToWatch())}),jQuery(document).on("pmw:load-pixels",()=>{wpm.waitForPixelsAndTriggerPageView()})},256:()=>{!function(e){e.pixelRegistry={getActivePixels(){const t=[];if(!e.pixelCapabilities)return t;for(const[r,a]of Object.entries(e.pixelCapabilities))if("function"==typeof a.isActive)try{a.isActive()&&t.push(r)}catch(e){pmw.console.error(`Error checking if ${r} is active:`,e)}return t},getActiveBrowserOnlyPixels(){const t=[],r=this.getActivePixels();for(const a of r)!0!==e.pixelCapabilities?.[a]?.supportsS2S&&t.push(a);return t},getActiveS2SPixels(){const t=[],r=this.getActivePixels();for(const a of r)!0===e.pixelCapabilities?.[a]?.supportsS2S&&t.push(a);return t},getAdapter:t=>e.adapters&&e.adapters[t]||null}}(window.wpm=window.wpm||{},jQuery)},263:(e,t,r)=>{!function(e){e.jQueryExists=async()=>new Promise(e=>{!function t(){if("undefined"!=typeof jQuery)return e();setTimeout(t,100)}()}),e.waitForLibrary=(e,t=5e3,r=100)=>{const a=Date.now();for(;void 0===window[e]&&!(Date.now()-a>t);)setTimeout(()=>{},r)},e.wpmDataLayerFullyLoaded=async()=>{let e=new Promise(e=>{!function t(){if("undefined"!=typeof wpmDataLayer&&void 0!==wpmDataLayer.version)return e();setTimeout(t,100)}()}),t=setTimeout(()=>{console.error("Pixel Manager error: The wpmDataLayer is not defined. Please make sure that the wpmDataLayer script snippet is inserted and not modified by any third-party plugin, such as a consent management platform or a JavaScript optimizer.")},6e3);return e.then(()=>{clearTimeout(t)}),e},e.wpHooksExists=async()=>new Promise(e=>{!function t(){if("undefined"!=typeof wp&&void 0!==wp.hooks)return e();setTimeout(t,50)}()}),e.loadWcHooksFunctions=async()=>{await e.wpHooksExists(),await r.e(194).then(r.t.bind(r,489,23))}}(window.wpm=window.wpm||{},jQuery)},510:()=>{!function(e){window.pmw=window.pmw||{},pmw.hooks={filters:{},addFilter:function(e,t,r,a=10){e&&"string"==typeof e?t&&"string"==typeof t?"function"==typeof r?(this.filters[e]||(this.filters[e]=[]),this.filters[e].push({namespace:t,callback:r,priority:a}),this.filters[e].sort((e,t)=>e.priority-t.priority),pmw.console.log(`Filter added: ${e} (${t}) with priority ${a}`)):pmw.console.error("Invalid callback provided to addFilter"):pmw.console.error("Invalid namespace provided to addFilter"):pmw.console.error("Invalid hook name provided to addFilter")},applyFilters:function(e,t,...r){if(!this.filters[e]||0===this.filters[e].length)return t;let a=t;for(const t of this.filters[e])try{const o=t.callback(a,...r);undefined!==o?a=o:pmw.console.warn(`Filter ${t.namespace} on ${e} returned undefined, keeping previous value`)}catch(r){pmw.console.error(`Filter error in ${t.namespace} on ${e}:`,r)}return a},removeFilter:function(e,t){if(!this.filters[e])return;const r=this.filters[e].length;this.filters[e]=this.filters[e].filter(e=>e.namespace!==t),this.filters[e].length<r&&pmw.console.log(`Filter removed: ${e} (${t})`)},removeAllFilters:function(e){this.filters[e]&&(delete this.filters[e],pmw.console.log(`All filters removed for: ${e}`))},hasFilter:function(e,t=null){return!(!this.filters[e]||0===this.filters[e].length)&&(!t||this.filters[e].some(e=>e.namespace===t))},getFilters:function(e){return this.filters[e]||[]}},e.hooks=pmw.hooks}(window.wpm=window.wpm||{},jQuery)},547:()=>{!function(e){e.getLibraryVersion=()=>"1.51.1",e.checkLibraryVersion=()=>{e.getLibraryVersion()!==wpmDataLayer?.version?.number&&console.error(`Pixel Manager: The library version ${e.getLibraryVersion()} and wpmDataLayer.version.number ${wpmDataLayer.version.number} do not match. Delete the server-side cache and try again.`)}}(window.wpm=window.wpm||{},jQuery)},616:(e,t,r)=>{!function(e,t,a){const{isRange:o,isIP:i,isV4:n,isV6:s,version:c}=r(723),p={cloudflare:{any:"https://www.cloudflare.com/cdn-cgi/trace"},icanhazip:{4:"https://ipv4.icanhazip.com",6:"https://ipv6.icanhazip.com",any:"https://icanhazip.com"},ipinfo:{any:"https://ipinfo.io/ip"},myexternalip:{any:"https://myexternalip.com/raw"},ipify:{4:"https://api4.ipify.org",6:"https://api6.ipify.org",any:"https://api64.ipify.org"}};e.getGeoInfo={cloudflare:async()=>{const e=await fetch("https://www.cloudflare.com/cdn-cgi/trace");if(!e.ok)throw new Error(`The response from Cloudflare was not OK. Status: ${e.status}`);let t=await e.text();if(!t)throw new Error("No data was returned from Cloudflare");if(t=t.trim().split("\n").reduce((e,t)=>(e[(t=t.split("="))[0]]=t[1],e),{}),!t.ip||!t.loc)throw new Error("The JSON data is missing the ip or loc key from Cloudflare");if(u(t.loc))throw new Error("We have to validate the region, and this service is not returning the region.");return{ip:t.ip,countryCode:t.loc,service:"cloudflare"}},geojs:async()=>{const e=await fetch("https://get.geojs.io/v1/ip/geo.json");if(!e.ok)throw new Error(`The response from geojs was not OK. Status: ${e.status}`);let t=await e.json();if(!t)throw new Error("No JSON data was returned from geojs");if(!t.ip||!t.country_code||!t.region)throw new Error("The JSON data is missing the ip, country_code, or region key from geojs");return{ip:t.ip,countryCode:t.country_code,region:t.region,service:"geojs"}},ipinfo:async()=>{const e=await fetch("https://ipinfo.io/json");if(!e.ok)throw new Error(`The response from ipinfo was not OK from ipinfo. Status: ${e.status}`);let t=await e.json();if(!t)throw new Error("No JSON data was returned from ipinfo");if(!t.ip||!t.country||!t.region)throw new Error("The JSON data is missing the ip, country, or region key from ipinfo");return{ip:t.ip,countryCode:t.country,region:t.region,service:"ipinfo"}},ipapi:async()=>{const e=await fetch("https://ipapi.co/json");if(!e.ok)throw new Error(`The response from ipapi was not OK. Status: ${e.status}`);let t=await e.json();if(!t)throw new Error("No JSON data was returned from ipapi");if(!t.ip||!t.country||!t.region)throw new Error("The JSON data is missing the ip, country, or region key from ipapi");return{ip:t.ip,countryCode:t.country,region:t.region,service:"ipapi"}}};const u=e=>{if("US "!==e)return!1;return["US-CA","US-VA"].some(e=>wpmDataLayer?.general?.consent_management.restricted_regions.includes(e))};e.isVisitorAllowed=async()=>{if(null!==e.retrieveData("visitorAllowed")&&e.retrieveData("visitorAllowed")!==a)return!!JSON.parse(e.retrieveData("visitorAllowed"));if(d())return e.storeData("visitorAllowed",!1),!1;if(Array.isArray(wpmDataLayer?.general?.server_2_server?.ip_exclude_list)&&wpmDataLayer.general.server_2_server.ip_exclude_list.length>0){const t=await e.getIp();if(w(t))return e.storeData("visitorAllowed",!1),!1}return e.storeData("visitorAllowed",!0),!0},e.getIp=async(t="any",r=3)=>{const o=["any","4","6"];if(!o.includes(t))return console.error("The version argument must be one of the following: "+o.join(", ")),null;if("any"===t&&e.retrieveData("ip"))return e.retrieveData("ip");const i=e.retrieveData(`ipv${t}`);if(i!==a)return i;pmw.console.log("Testing the IP address of the browser because one ore more server-to-server APIs are enabled and require the browser IP. It may trigger connection request errors in the console while testing the IP address. This is normal and expected behavior.");try{const a=await e.getIpFromAnyService(t,r);return"any"===t&&e.storeData("ip",a),(4===c(a)||"4"===t&&null===a)&&e.storeData("ipv4",a),(6===c(a)||"6"===t&&null===a)&&e.storeData("ipv6",a),a}catch(e){return null}},e.getBrowserGeoFromExternalService=async()=>{const t=performance.now();let r=[];Object.keys(e.getGeoInfo).forEach(t=>{r.push(e.getGeoInfo[t]())});try{const e=await Promise.any(r);return e.countryCode=e.countryCode.toUpperCase(),e.region&&"California"===e.region&&(e.regionCode="US-CA"),e.region&&"Virginia"===e.region&&(e.regionCode="US-VA"),pmw.console.log("Retrieved the browser geo info from an external service: ",e," which took ",(performance.now()-t).toFixed(2)+" ms"),e}catch(e){return pmw.console.error("error: ",e),null}};e.getBrowserGeo=async()=>{let t={};if(e.retrieveData("geoCountryCode")&&(t.countryCode=e.retrieveData("geoCountryCode")),e.retrieveData("geoRegionCode")&&(t.regionCode=e.retrieveData("geoRegionCode")),e.retrieveData("geoRegion")&&(t.region=e.retrieveData("geoRegion")),t.countryCode)return pmw.console.log("Retrieved the browser geo location from the cache: ",t),t;let a=await e.getBrowserGeoFromExternalService();if(!a){const e=(()=>{const e=r(179).getLocationByTimeZone();return e.countryCode?e:null})();a={},e&&pmw.console.log("Retrieved the browser geo location from the timezone: ",e),e.countryCode&&(a.countryCode=e.countryCode),e.regionCode&&(a.regionCode=e.regionCode)}return a?.ip&&e.storeData("ip",a.ip),a?.countryCode&&e.storeData("geoCountryCode",a.countryCode),a?.regionCode&&e.storeData("geoRegionCode",a.regionCode),a?.region&&e.storeData("geoRegion",a.region),a?.countryCode?a:null},e.getIpFromAnyService=async(t="any",r=3)=>{const a=performance.now(),o=Object.keys(p).filter(e=>p[e][t]).slice(0,r).reduce((e,t)=>(e[t]=p[t],e),{});let i=[];if(Object.keys(o).forEach(r=>{o[r][t]&&i.push(e.getIpFromService(r,t))}),!(i.length>0))return pmw.console.log("No promises to resolve"),null;try{const e=await Promise.any(i),t=(performance.now()-a).toFixed(2);return pmw.console.log(`Retrieved the IP address ${e.ip} from ${e.service} which took ${t} ms`),e.ip}catch(e){return pmw.console.log(`Could not retrieve an IP with version ${t} from any of the services.`),null}},e.getIpFromService=async(e,t="any")=>{try{let r={ip:null,service:e,ipVersion:t};if(!p[e][t])return Promise.reject(new Error(`The IP version ${t} is not available for the service ${e}`));pmw.console.log(`Fetching IP from ${e} using IP version ${t}`);const a=await fetch(p[e][t]);if(!a.ok)return Promise.reject(new Error(`The response from ${e} was not OK. Status: ${a.status}`));let o=await a.text();return"cloudflare"===e?(o=o.trim().split("\n").reduce((e,t)=>(e[(t=t.split("="))[0]]=t[1],e),{}),r.ip=o.ip):r.ip=o.trim(),i(r.ip)?r:Promise.reject(new Error(`The returned value from ${e} is not an IP address`))}catch(e){return Promise.reject(e)}};e.isVisitorNotAllowed=async()=>!1===await e.isVisitorAllowed();const d=()=>{const e=navigator.userAgent||"";if(!e)return!0;const t=l();for(const r of t)if(e.toLowerCase().includes(r.toLowerCase()))return!0;return!1},l=()=>{let e=[];Array.isArray(wpmDataLayer?.general?.server_2_server?.user_agent_exclude_patterns)&&(e=wpmDataLayer.general.server_2_server.user_agent_exclude_patterns);return["Googlebot","Google-InspectionTool","Google-Extended","Storebot-Google","bingbot","BingPreview","msnbot","Slurp","DuckDuckBot","Baiduspider","YandexBot","Sogou","facebookexternalhit","FacebookBot","LinkedInBot","Twitterbot","PinterestBot","TikTokBot","SnapchatAds","DiscordBot","InstagramBot","WhatsApp","AhrefsBot","SemrushBot","MJ12bot","DotBot","rogerbot","UptimeRobot","Pingdom","StatusCake","GTmetrix","ClaudeBot","GPTBot","ChatGPT","anthropic-ai","CCBot","PerplexityBot","crawler","spider","scraper","bot/","/bot","bot-"].concat(e)},m=e=>e.includes("/"),w=e=>{const t=wpmDataLayer?.general?.server_2_server?.ip_exclude_list||[];for(const r of t)if(m(r)){if(isInSubnet.isInSubnet(e,r))return!0}else if(e===r)return!0;return!1}}(window.wpm=window.wpm||{},jQuery)},722:()=>{const e=wpm.prepareSelectors([".add_to_cart_button:not(.product_type_variable)",".ajax_add_to_cart",".single_add_to_cart_button"],"addToCart");jQuery(e).on("click adding_to_cart",(e,t)=>{try{let t=e?.target?.dataset?.quantity?e.target.dataset.quantity:null,r=e?.target?.dataset?.product_id?e.target.dataset.product_id:e?.target?.value?e.target.value:null;if("product"===wpmDataLayer.shop.page_type){if(void 0!==jQuery(e.currentTarget).attr("href")&&jQuery(e.currentTarget).attr("href").includes("add-to-cart"))return r||(r=jQuery(e.currentTarget).data("product_id")),void wpm.addProductToCart(r,1);if("simple"===wpmDataLayer.shop.product_type)return null===t&&(t=Number(jQuery(".input-text.qty").val())?Number(jQuery(".input-text.qty").val()):1),r||(r=jQuery(e.currentTarget).val()),r||(r=jQuery(".product").attr("id").replace("product-","")),void wpm.addProductToCart(r,t);if(["variable","variable-subscription"].indexOf(wpmDataLayer.shop.product_type)>=0)return null===t&&(t=Number(jQuery(".input-text.qty").val())?Number(jQuery(".input-text.qty").val()):1),r||(r=jQuery("[name='variation_id']").val()),void wpm.addProductToCart(r,t);if("grouped"===wpmDataLayer.shop.product_type)return void jQuery(".woocommerce-grouped-product-list-item").each((e,a)=>{t=Number(jQuery(a).find(".input-text.qty").val())?Number(jQuery(a).find(".input-text.qty").val()):1;let o=jQuery(a).attr("class");r=wpm.getPostIdFromString(o),wpm.addProductToCart(r,t)});if("bundle"===wpmDataLayer.shop.product_type)return null===t&&(t=Number(jQuery(".input-text.qty").val())?Number(jQuery(".input-text.qty").val()):1),r||(r=jQuery("input[name=add-to-cart]").val()),void wpm.addProductToCart(r,t);null===t&&(t=Number(jQuery(".input-text.qty").val())?Number(jQuery(".input-text.qty").val()):1),wpm.addProductToCart(r,t)}else null===t&&(t=1),r||(r=jQuery(e.currentTarget).data("product_id")?jQuery(e.currentTarget).data("product_id"):null),r||(r=jQuery(e.currentTarget).val()?jQuery(e.currentTarget).val():null),r&&t&&wpm.addProductToCart(r,t)}catch(e){console.error(e)}}),jQuery("a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)").one("click",e=>{try{if(jQuery(e.target).closest("a").attr("href")){let t=new URL(jQuery(e.currentTarget).attr("href"),window.location.origin);if(t.searchParams.has("add-to-cart")){let e=t.searchParams.get("add-to-cart"),r=t.searchParams.has("quantity")?parseInt(t.searchParams.get("quantity"),10):1;wpm.addProductToCart(e,r)}}}catch(e){console.error(e)}}),jQuery(".woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product").on("click",e=>{try{let t=jQuery(e.currentTarget).nextAll(".wpmProductId:first").data("id");if(t){if(t=wpm.getIdBasedOndVariationsOutputSetting(t),!t)throw Error("Wasn't able to retrieve a productId");if(wpmDataLayer.products&&wpmDataLayer.products[t]){let e=wpm.getProductDetailsFormattedForEvent(t);jQuery(document).trigger("pmw:select-item",e)}}}catch(e){console.error(e)}}),jQuery("#billing_email").on("input",e=>{wpm.isEmail(jQuery(e.currentTarget).val())&&(wpm.fireCheckoutProgress(2),wpm.emailSelected=!0)}),jQuery("form.checkout").on("checkout_place_order_success",()=>{!1===wpm.emailSelected&&wpm.fireCheckoutProgress(2),!1===wpm.paymentMethodSelected&&(wpm.fireCheckoutProgress(3),wpm.fireCheckoutOption(3,jQuery("input[name='payment_method']:checked").val())),wpm.fireCheckoutProgress(4),jQuery(document).trigger("pmw:place-order",{})}),jQuery(document).on("click","[name='update_cart']",()=>{try{jQuery(".cart_item").each((e,t)=>{const r=wpm.getProductIdByCartItemElement(t);if(!r)return void console.error("Pixel Manager: Wasn't able to retrieve a productId");const a=wpm.getProductQuantityByCartItemElement(t);a?0===a?wpm.removeProductFromCart(r):a<wpmDataLayer.cart[r].quantity?wpm.removeProductFromCart(r,wpmDataLayer.cart[r].quantity-a):a>wpmDataLayer.cart[r].quantity&&wpm.addProductToCart(r,a-wpmDataLayer.cart[r].quantity):console.error("Pixel Manager: Wasn't able to retrieve a quantity")})}catch(e){console.error(e),wpm.getCartItemsFromBackend()}}),jQuery(".add_to_wishlist,.wl-add-to").on("click",e=>{try{let t;if(jQuery(e.currentTarget).data("productid")?t=jQuery(e.currentTarget).data("productid"):jQuery(e.currentTarget).data("product-id")&&(t=jQuery(e.currentTarget).data("product-id")),!t)throw Error("Wasn't able to retrieve a productId");let r=wpm.getProductDetailsFormattedForEvent(t);jQuery(document).trigger("pmw:add-to-wishlist",r)}catch(e){console.error(e)}}),wpmDataLayer?.general?.lazy_load_pmw||wpm.registerShowVariationEventListener()},723:(e,t,r)=>{"use strict";r.r(t),r.d(t,{displayIP:()=>w,inRange:()=>l,isIP:()=>s,isRange:()=>d,isV4:()=>p,isV6:()=>u,searchIP:()=>m,storeIP:()=>m,version:()=>c});var a="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==r.g?r.g:"undefined"!=typeof self?self:{};function o(e,t){return e(t={exports:{}},t.exports),t.exports}var i=o(function(e){(function(){var t,r,a,o,i,n,s,c;r={},null!==e&&e.exports?e.exports=r:this.ipaddr=r,s=function(e,t,r,a){var o,i;if(e.length!==t.length)throw new Error("ipaddr: cannot match CIDR for objects with different lengths");for(o=0;a>0;){if((i=r-a)<0&&(i=0),e[o]>>i!==t[o]>>i)return!1;a-=r,o+=1}return!0},r.subnetMatch=function(e,t,r){var a,o,i,n,s;for(i in null==r&&(r="unicast"),t)for(!(n=t[i])[0]||n[0]instanceof Array||(n=[n]),a=0,o=n.length;a<o;a++)if(s=n[a],e.kind()===s[0].kind()&&e.match.apply(e,s))return i;return r},r.IPv4=function(){function e(e){var t,r,a;if(4!==e.length)throw new Error("ipaddr: ipv4 octet count should be 4");for(t=0,r=e.length;t<r;t++)if(!(0<=(a=e[t])&&a<=255))throw new Error("ipaddr: ipv4 octet should fit in 8 bits");this.octets=e}return e.prototype.kind=function(){return"ipv4"},e.prototype.toString=function(){return this.octets.join(".")},e.prototype.toNormalizedString=function(){return this.toString()},e.prototype.toByteArray=function(){return this.octets.slice(0)},e.prototype.match=function(e,t){var r;if(void 0===t&&(e=(r=e)[0],t=r[1]),"ipv4"!==e.kind())throw new Error("ipaddr: cannot match ipv4 address with non-ipv4 one");return s(this.octets,e.octets,8,t)},e.prototype.SpecialRanges={unspecified:[[new e([0,0,0,0]),8]],broadcast:[[new e([255,255,255,255]),32]],multicast:[[new e([224,0,0,0]),4]],linkLocal:[[new e([169,254,0,0]),16]],loopback:[[new e([127,0,0,0]),8]],carrierGradeNat:[[new e([100,64,0,0]),10]],private:[[new e([10,0,0,0]),8],[new e([172,16,0,0]),12],[new e([192,168,0,0]),16]],reserved:[[new e([192,0,0,0]),24],[new e([192,0,2,0]),24],[new e([192,88,99,0]),24],[new e([198,51,100,0]),24],[new e([203,0,113,0]),24],[new e([240,0,0,0]),4]]},e.prototype.range=function(){return r.subnetMatch(this,this.SpecialRanges)},e.prototype.toIPv4MappedAddress=function(){return r.IPv6.parse("::ffff:"+this.toString())},e.prototype.prefixLengthFromSubnetMask=function(){var e,t,r,a,o,i,n;for(n={0:8,128:7,192:6,224:5,240:4,248:3,252:2,254:1,255:0},e=0,o=!1,t=r=3;r>=0;t=r+=-1){if(!((a=this.octets[t])in n))return null;if(i=n[a],o&&0!==i)return null;8!==i&&(o=!0),e+=i}return 32-e},e}(),a="(0?\\d+|0x[a-f0-9]+)",o={fourOctet:new RegExp("^"+a+"\\."+a+"\\."+a+"\\."+a+"$","i"),longValue:new RegExp("^"+a+"$","i")},r.IPv4.parser=function(e){var t,r,a,i,n;if(r=function(e){return"0"===e[0]&&"x"!==e[1]?parseInt(e,8):parseInt(e)},t=e.match(o.fourOctet))return function(){var e,o,i,n;for(n=[],e=0,o=(i=t.slice(1,6)).length;e<o;e++)a=i[e],n.push(r(a));return n}();if(t=e.match(o.longValue)){if((n=r(t[1]))>4294967295||n<0)throw new Error("ipaddr: address outside defined range");return function(){var e,t;for(t=[],i=e=0;e<=24;i=e+=8)t.push(n>>i&255);return t}().reverse()}return null},r.IPv6=function(){function e(e,t){var r,a,o,i,n,s;if(16===e.length)for(this.parts=[],r=a=0;a<=14;r=a+=2)this.parts.push(e[r]<<8|e[r+1]);else{if(8!==e.length)throw new Error("ipaddr: ipv6 part count should be 8 or 16");this.parts=e}for(o=0,i=(s=this.parts).length;o<i;o++)if(!(0<=(n=s[o])&&n<=65535))throw new Error("ipaddr: ipv6 part should fit in 16 bits");t&&(this.zoneId=t)}return e.prototype.kind=function(){return"ipv6"},e.prototype.toString=function(){return this.toNormalizedString().replace(/((^|:)(0(:|$))+)/,"::")},e.prototype.toRFC5952String=function(){var e,t,r,a,o;for(a=/((^|:)(0(:|$)){2,})/g,o=this.toNormalizedString(),e=0,t=-1;r=a.exec(o);)r[0].length>t&&(e=r.index,t=r[0].length);return t<0?o:o.substring(0,e)+"::"+o.substring(e+t)},e.prototype.toByteArray=function(){var e,t,r,a,o;for(e=[],t=0,r=(o=this.parts).length;t<r;t++)a=o[t],e.push(a>>8),e.push(255&a);return e},e.prototype.toNormalizedString=function(){var e,t,r;return e=function(){var e,r,a,o;for(o=[],e=0,r=(a=this.parts).length;e<r;e++)t=a[e],o.push(t.toString(16));return o}.call(this).join(":"),r="",this.zoneId&&(r="%"+this.zoneId),e+r},e.prototype.toFixedLengthString=function(){var e,t,r;return e=function(){var e,r,a,o;for(o=[],e=0,r=(a=this.parts).length;e<r;e++)t=a[e],o.push(t.toString(16).padStart(4,"0"));return o}.call(this).join(":"),r="",this.zoneId&&(r="%"+this.zoneId),e+r},e.prototype.match=function(e,t){var r;if(void 0===t&&(e=(r=e)[0],t=r[1]),"ipv6"!==e.kind())throw new Error("ipaddr: cannot match ipv6 address with non-ipv6 one");return s(this.parts,e.parts,16,t)},e.prototype.SpecialRanges={unspecified:[new e([0,0,0,0,0,0,0,0]),128],linkLocal:[new e([65152,0,0,0,0,0,0,0]),10],multicast:[new e([65280,0,0,0,0,0,0,0]),8],loopback:[new e([0,0,0,0,0,0,0,1]),128],uniqueLocal:[new e([64512,0,0,0,0,0,0,0]),7],ipv4Mapped:[new e([0,0,0,0,0,65535,0,0]),96],rfc6145:[new e([0,0,0,0,65535,0,0,0]),96],rfc6052:[new e([100,65435,0,0,0,0,0,0]),96],"6to4":[new e([8194,0,0,0,0,0,0,0]),16],teredo:[new e([8193,0,0,0,0,0,0,0]),32],reserved:[[new e([8193,3512,0,0,0,0,0,0]),32]]},e.prototype.range=function(){return r.subnetMatch(this,this.SpecialRanges)},e.prototype.isIPv4MappedAddress=function(){return"ipv4Mapped"===this.range()},e.prototype.toIPv4Address=function(){var e,t,a;if(!this.isIPv4MappedAddress())throw new Error("ipaddr: trying to convert a generic ipv6 address to ipv4");return e=(a=this.parts.slice(-2))[0],t=a[1],new r.IPv4([e>>8,255&e,t>>8,255&t])},e.prototype.prefixLengthFromSubnetMask=function(){var e,t,r,a,o,i,n;for(n={0:16,32768:15,49152:14,57344:13,61440:12,63488:11,64512:10,65024:9,65280:8,65408:7,65472:6,65504:5,65520:4,65528:3,65532:2,65534:1,65535:0},e=0,o=!1,t=r=7;r>=0;t=r+=-1){if(!((a=this.parts[t])in n))return null;if(i=n[a],o&&0!==i)return null;16!==i&&(o=!0),e+=i}return 128-e},e}(),i="(?:[0-9a-f]+::?)+",c="%[0-9a-z]{1,}",n={zoneIndex:new RegExp(c,"i"),native:new RegExp("^(::)?("+i+")?([0-9a-f]+)?(::)?("+c+")?$","i"),transitional:new RegExp("^((?:"+i+")|(?:::)(?:"+i+")?)"+a+"\\."+a+"\\."+a+"\\."+a+"("+c+")?$","i")},t=function(e,t){var r,a,o,i,s,c;if(e.indexOf("::")!==e.lastIndexOf("::"))return null;for((c=(e.match(n.zoneIndex)||[])[0])&&(c=c.substring(1),e=e.replace(/%.+$/,"")),r=0,a=-1;(a=e.indexOf(":",a+1))>=0;)r++;if("::"===e.substr(0,2)&&r--,"::"===e.substr(-2,2)&&r--,r>t)return null;for(s=t-r,i=":";s--;)i+="0:";return":"===(e=e.replace("::",i))[0]&&(e=e.slice(1)),":"===e[e.length-1]&&(e=e.slice(0,-1)),{parts:t=function(){var t,r,a,i;for(i=[],t=0,r=(a=e.split(":")).length;t<r;t++)o=a[t],i.push(parseInt(o,16));return i}(),zoneId:c}},r.IPv6.parser=function(e){var r,a,o,i,s,c,p;if(n.native.test(e))return t(e,8);if((i=e.match(n.transitional))&&(p=i[6]||"",(r=t(i[1].slice(0,-1)+p,6)).parts)){for(a=0,o=(c=[parseInt(i[2]),parseInt(i[3]),parseInt(i[4]),parseInt(i[5])]).length;a<o;a++)if(!(0<=(s=c[a])&&s<=255))return null;return r.parts.push(c[0]<<8|c[1]),r.parts.push(c[2]<<8|c[3]),{parts:r.parts,zoneId:r.zoneId}}return null},r.IPv4.isIPv4=r.IPv6.isIPv6=function(e){return null!==this.parser(e)},r.IPv4.isValid=function(e){try{return new this(this.parser(e)),!0}catch(e){return!1}},r.IPv4.isValidFourPartDecimal=function(e){return!(!r.IPv4.isValid(e)||!e.match(/^(0|[1-9]\d*)(\.(0|[1-9]\d*)){3}$/))},r.IPv6.isValid=function(e){var t;if("string"==typeof e&&-1===e.indexOf(":"))return!1;try{return new this((t=this.parser(e)).parts,t.zoneId),!0}catch(e){return!1}},r.IPv4.parse=function(e){var t;if(null===(t=this.parser(e)))throw new Error("ipaddr: string is not formatted like ip address");return new this(t)},r.IPv6.parse=function(e){var t;if(null===(t=this.parser(e)).parts)throw new Error("ipaddr: string is not formatted like ip address");return new this(t.parts,t.zoneId)},r.IPv4.parseCIDR=function(e){var t,r,a;if((r=e.match(/^(.+)\/(\d+)$/))&&(t=parseInt(r[2]))>=0&&t<=32)return a=[this.parse(r[1]),t],Object.defineProperty(a,"toString",{value:function(){return this.join("/")}}),a;throw new Error("ipaddr: string is not formatted like an IPv4 CIDR range")},r.IPv4.subnetMaskFromPrefixLength=function(e){var t,r,a;if((e=parseInt(e))<0||e>32)throw new Error("ipaddr: invalid IPv4 prefix length");for(a=[0,0,0,0],r=0,t=Math.floor(e/8);r<t;)a[r]=255,r++;return t<4&&(a[t]=Math.pow(2,e%8)-1<<8-e%8),new this(a)},r.IPv4.broadcastAddressFromCIDR=function(e){var t,r,a,o,i;try{for(a=(t=this.parseCIDR(e))[0].toByteArray(),i=this.subnetMaskFromPrefixLength(t[1]).toByteArray(),o=[],r=0;r<4;)o.push(parseInt(a[r],10)|255^parseInt(i[r],10)),r++;return new this(o)}catch(e){throw new Error("ipaddr: the address does not have IPv4 CIDR format")}},r.IPv4.networkAddressFromCIDR=function(e){var t,r,a,o,i;try{for(a=(t=this.parseCIDR(e))[0].toByteArray(),i=this.subnetMaskFromPrefixLength(t[1]).toByteArray(),o=[],r=0;r<4;)o.push(parseInt(a[r],10)&parseInt(i[r],10)),r++;return new this(o)}catch(e){throw new Error("ipaddr: the address does not have IPv4 CIDR format")}},r.IPv6.parseCIDR=function(e){var t,r,a;if((r=e.match(/^(.+)\/(\d+)$/))&&(t=parseInt(r[2]))>=0&&t<=128)return a=[this.parse(r[1]),t],Object.defineProperty(a,"toString",{value:function(){return this.join("/")}}),a;throw new Error("ipaddr: string is not formatted like an IPv6 CIDR range")},r.isValid=function(e){return r.IPv6.isValid(e)||r.IPv4.isValid(e)},r.parse=function(e){if(r.IPv6.isValid(e))return r.IPv6.parse(e);if(r.IPv4.isValid(e))return r.IPv4.parse(e);throw new Error("ipaddr: the address has neither IPv6 nor IPv4 format")},r.parseCIDR=function(e){try{return r.IPv6.parseCIDR(e)}catch(t){try{return r.IPv4.parseCIDR(e)}catch(e){throw new Error("ipaddr: the address has neither IPv6 nor IPv4 CIDR format")}}},r.fromByteArray=function(e){var t;if(4===(t=e.length))return new r.IPv4(e);if(16===t)return new r.IPv6(e);throw new Error("ipaddr: the binary input is neither an IPv6 nor IPv4 address")},r.process=function(e){var t;return"ipv6"===(t=this.parse(e)).kind()&&t.isIPv4MappedAddress()?t.toIPv4Address():t}}).call(a)}),n=o(function(e,t){const r=function(e){if(!o(e))throw new Error("Invalid address: "+e);const t=(e=e.toLowerCase()).split(/\:\:/g);if(t.length>2)throw new Error("Invalid address: "+e);let r=[];if(1==t.length){if(r=e.split(/\:/g),8!==r.length)throw new Error("Invalid address: "+e)}else if(2==t.length){const e=t[0],a=t[1],o=e.split(/\:/g),i=a.split(/\:/g);for(let e in o)r[e]=o[e];for(let e=i.length;e>0;--e)r[7-(i.length-e)]=i[e-1]}for(let e=0;e<8;++e)void 0===r[e]&&(r[e]="0000"),r[e]=i(r[e],"0",4);return r.join(":")},a=function(e){if(!o(e))throw new Error("Invalid address: "+e);const t=(e=(e=(e=(e=(e=(e=r(e)).replace(/0000/g,"g")).replace(/\:000/g,":")).replace(/\:00/g,":")).replace(/\:0/g,":")).replace(/g/g,"0")).split(/\:/g);let a=!1,i=-1,n=0,s=-1,c=0;for(let e=0;e<8;++e){const r=t[e];let o="0"===r;o&&!a&&(s=e),!o&&a&&(c=e-s),c>1&&c>n&&(i=s,n=c),a="0"===r}return a&&(c=8-s),c>1&&c>n&&(i=s,n=c),i>=0&&n>1&&t.splice(i,n,"g"),e=(e=(e=(e=(e=t.join(":")).replace(/\:g\:/g,"::")).replace(/\:g/g,"::")).replace(/g\:/g,"::")).replace(/g/g,"::")},o=function(e){return/^[a-f0-9\\:]+$/gi.test(e)},i=function(e,t,r){const a=t.repeat(r);return e.length<a.length&&(e=a.substring(0,a.length-e.length)+e),e},n=function(e){return parseInt(e,16).toString(2)},s=function(e){return parseInt(e,2).toString(16)},c=function(e){const t=r(e).split(":");let a="";for(const e of t)a+=i(n(e),"0",16);return a},p=function(e){const t=[];for(let r=0;r<8;++r){const a=e.substr(16*r,16),o=i(s(a),"0",4);t.push(o)}return t.join(":")},u=function(e,t,r,n,s){if(!o(e))throw new Error("Invalid address: "+e);if(n*=1,r=(r*=1)||128,(t*=1)<1||r<1||t>128||r>128||t>r)throw new Error("Invalid masks.");const u=[],d=c(e).substr(0,t),l="0".repeat(128-r),m=Math.pow(2,r-t);for(let e=0;e<m&&!(n&&e>=n);++e){const o=i(e.toString(2),"0",r-t),n=p(d+o+l);s?u.push(a(n)):u.push(n)}return u},d=function(e,t,r,i){if(!o(e))throw new Error("Invalid address: "+e);if(r=(r*=1)||128,(t*=1)<1||r<1||t>128||r>128||t>r)throw new Error("Invalid masks.");const n=c(e).substr(0,t),s="0".repeat(128-r),u=n+"0".repeat(r-t)+s,d=n+"1".repeat(r-t)+s;return i?{start:a(p(u)),end:a(p(d)),size:Math.pow(2,r-t)}:{start:p(u),end:p(d),size:Math.pow(2,r-t)}},l=function(e,t,r,i,n){if(!o(e))throw new Error("Invalid address: "+e);if(r=(r*=1)||128,i=(i*=1)||1,(t*=1)<1||r<1||t>128||r>128||t>r)throw new Error("Invalid masks.");const s=[],u=c(e).substr(0,t),d="0".repeat(128-r),l=Math.pow(2,r-t);for(let e=0;e<l&&e<i;++e){let e="";for(let a=0;a<r-t;++a)e+=Math.floor(2*Math.random());const o=p(u+e+d);n?s.push(a(o)):s.push(o)}return s},m=function(e,t){if(!o(e))throw new Error("Invalid address: "+e);if((t*=1)<1||t>128||Math.floor(t/4)!=t/4)throw new Error("Invalid masks.");return r(e).replace(/:/g,"").split("").reverse().slice(0,(128-t)/4).join(".")};t.normalize=r,t.abbreviate=a,t.divideSubnet=u,t.range=d,t.randomSubnet=l,t.ptr=m});n.normalize,n.abbreviate,n.divideSubnet,n.range,n.randomSubnet,n.ptr;function s(e){return i.isValid(e)}function c(e){try{var t=i.parse(e).kind();return"ipv4"===t?4:"ipv6"===t?6:0}catch(e){return 0}}function p(e){return 4===c(e)}function u(e){return 6===c(e)}function d(e){try{i.parseCIDR(e);return!0}catch(e){return!1}}function l(e,t){if("string"!=typeof t){if(t&&"object"==typeof t){for(var r in t)if(!0===l(e,t[r]))return!0;return!1}return!1}if(-1===t.indexOf("/"))return e=u(e)?n.normalize(e):e,s(t=u(t)?n.normalize(t):t)&&e===t;try{var a=t.split("/"),o=i.parse(e),c=i.parse(a[0]);return o.match(c,a[1])}catch(e){return!1}}function m(e){try{var t=i.parse(e),r=t.kind();return"ipv4"===r?e:"ipv6"===r?t.isIPv4MappedAddress()?t.toIPv4Address().toString():n.abbreviate(e):null}catch(e){return null}}function w(e){try{var t=i.parse(e),r=t.kind();return"ipv4"===r?e:"ipv6"===r?t.isIPv4MappedAddress()?t.toIPv4Address().toString():n.normalize(e):""}catch(e){return""}}},783:()=>{!function(e){const t="restEndpointAvailable",r="pmw/v1/test/",a=0,o=10;e.emailSelected=!1,e.paymentMethodSelected=!1,e.isBelowRestErrorThreshold=()=>e.retrieveData(a)<=o,e.isRestEndpointAvailable=async()=>e.retrieveData(t)?e.retrieveData(t):await e.testEndpoint(),e.testEndpoint=async(a=e.root+r,o=t)=>{try{const t=await fetch(a,{method:"POST",mode:"cors",cache:"no-cache",keepalive:!0,redirect:"error"});if(!t.ok)return e.storeData(o,!1),pmw.console.error("Error testing the endpoint. Status: "+t.status+" | response: ",t),!1;const r=await t.json();return r.success?(e.storeData(o,!0),!0):(e.storeData(o,!1),pmw.console.error("Error testing the endpoint. Response JSON: "+JSON.stringify(r)),!1)}catch(t){return e.storeData(o,!1),pmw.console.error("Error testing the endpoint. Error: "+t),!1}},e.isWpmRestEndpointAvailable=(r=t)=>!!e.retrieveData(r),e.writeOrderIdToStorage=(t,r,a="thankyou_page")=>{let o=e.retrieveData("orderIds",!0)||[];o.push(t),e.storeData("orderIds",o,!0),"function"==typeof e.storeOrderIdOnServer&&e.storeOrderIdOnServer({orderId:t,orderKey:r,source:a})},e.isOrderIdStored=t=>{if(!wpmDataLayer.shop.order_duplication_prevention)return pmw.console.log("order duplication prevention is off"),!1;return(e.retrieveData("orderIds",!0)||[]).includes(t)},e.isEmail=e=>new RegExp('^(([^<>()\\[\\]\\\\.,;:\\s@"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@"]+)*)|(".+"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$').test(e),e.removeProductFromCart=async(t,r=null)=>{try{if(!t)throw Error("Wasn't able to retrieve a productId");if(!(t=e.getIdBasedOndVariationsOutputSetting(t)))throw Error("Wasn't able to retrieve a productId");let a;a=null==r?wpmDataLayer.cart[t].quantity:r,wpmDataLayer.cart[t]||await e.getProductsFromBackend([t]);let o=e.getProductDetailsFormattedForEvent(t,a);jQuery(document).trigger("pmw:remove-from-cart",o),null==r||wpmDataLayer.cart[t].quantity===r?delete wpmDataLayer.cart[t]:wpmDataLayer.cart[t].quantity=wpmDataLayer.cart[t].quantity-a,e.storeCartData(wpmDataLayer.cart)}catch(e){pmw.console.error("error: ",e)}},e.getIdBasedOndVariationsOutputSetting=e=>{try{return wpmDataLayer?.shop?.variations_output?e:wpmDataLayer.products[e].is_variation?wpmDataLayer.products[e].parent_id:e}catch(e){console.error(e)}},e.prepareSelectors=(e,t)=>(wpmDataLayer?.shop?.selectors?.[t]&&(e=e.concat(wpmDataLayer.shop.selectors[t]),(e=[...new Set(e)]).indexOf("document")>=0&&e.splice(e.indexOf("document"),1),e.indexOf("body")>=0&&(e=["body"])),e.join(", ")),e.addProductToCart=async(t,r)=>{r=Number(r);try{if(!t)throw Error("Wasn't able to retrieve a productId");if(!(t=e.getIdBasedOndVariationsOutputSetting(t)))throw Error("Wasn't able to retrieve a productId");wpmDataLayer?.products[t]||await e.getProductsFromBackend([t]);let a=e.getProductDetailsFormattedForEvent(t,r);jQuery(document).trigger("pmw:add-to-cart",a),wpmDataLayer?.cart[t]?wpmDataLayer.cart[t].quantity=wpmDataLayer.cart[t].quantity+r:("cart"in wpmDataLayer||(wpmDataLayer.cart={}),wpmDataLayer.cart[t]=e.getProductDetailsFormattedForEvent(t,r)),e.storeCartData(wpmDataLayer.cart)}catch(t){console.error(t),e.getCartItemsFromBackend()}},e.initCart=()=>{e.doesWooCommerceCartExist()||0===Object.keys(e.retrieveCartData()).length?e.retrieveCartData()?e.saveCartObjectToDataLayer(e.retrieveCartData()):(e.storeCartData({}),e.getCartItemsFromBackend()):e.storeCartData({})},e.getCartItemsFromBackend=()=>{try{fetch(e.ajax_url,{method:"POST",cache:"no-cache",body:new URLSearchParams({action:"pmw_get_cart_items"}),keepalive:!0,redirect:"error"}).then(e=>{if(e.ok)return e.json();throw Error("Error getting cart items from backend")}).then(t=>{if(!t.success)throw Error("Error getting cart items from backend");t.data.cart||(t.data.cart={}),e.saveCartObjectToDataLayer(t.data.cart),e.storeCartData(t.data.cart)})}catch(e){console.error(e)}},e.getProductsFromBackend=async t=>{if(wpmDataLayer?.products&&(t=t.filter(e=>!(e in wpmDataLayer.products))),t&&0!==t.length&&wpmDataLayer.general.page_id&&Array.isArray(t)&&0!==t.length){try{let r={action:"pmw_get_product_ids",page_id:wpmDataLayer.general.page_id,page_type:wpmDataLayer.shop.page_type,product_ids:t};const a=await e.isRestEndpointAvailable(),o=a?e.root+"pmw/v1/products/":e.ajax_url,i={method:"POST",cache:"no-cache",body:a?JSON.stringify(r):new URLSearchParams(r)};a&&(i.headers={"Content-Type":"application/json"});let n=await fetch(o,i);if(!n.ok)throw new Error("Error getting products from backend. Status: "+n.status+" Status text: "+n.statusText);let s=await n.json();if(!s.success)throw new Error("Error getting products from backend: "+s.data);wpmDataLayer.products=Object.assign({},wpmDataLayer.products,s.data)}catch(e){console.error(e)}return!0}},e.saveCartObjectToDataLayer=e=>{wpmDataLayer.cart=e,wpmDataLayer.products=Object.assign({},wpmDataLayer.products,e)},e.triggerViewItemEventPrep=async t=>{wpmDataLayer?.products[t]||await e.getProductsFromBackend([t]),wpmDataLayer?.products[t]?e.triggerViewItemEvent(t):(e.triggerViewItemEventNoProduct(),pmw.console.log(`Product with ID ${t} not found in the data layer and couldn't be retrieved from the backend. Triggering view-item event without product data.`))},e.triggerViewItemEvent=t=>{let r=e.getProductDetailsFormattedForEvent(t);r&&jQuery(document).trigger("pmw:view-item",r)},e.triggerViewItemEventNoProduct=()=>{jQuery(document).trigger("pmw:view-item")},e.fireCheckoutOption=(e,t=null,r=null)=>{let a={step:e,checkout_option:t,value:r};jQuery(document).trigger("pmw:checkout-option",a)},e.fireCheckoutProgress=e=>{let t={step:e};jQuery(document).trigger("pmw:checkout-progress",t)},e.getPostIdFromString=e=>{try{return e.match(/(post-)(\d+)/)[2]}catch(e){console.error(e)}},e.triggerViewItemList=t=>{if(!t)throw Error("Wasn't able to retrieve a productId");if(!(t=e.getIdBasedOndVariationsOutputSetting(t)))throw Error("Wasn't able to retrieve a productId");jQuery(document).trigger("pmw:view-item-list",e.getProductDataForViewItemEvent(t))},e.getProductDataForViewItemEvent=t=>{if(!t)throw Error("Wasn't able to retrieve a productId");try{if(wpmDataLayer.products[t])return e.getProductDetailsFormattedForEvent(t)}catch(e){console.error(e)}},e.getMainProductIdFromProductPage=()=>{try{return["simple","variable","grouped","composite","bundle"].indexOf(wpmDataLayer.shop.product_type)>=0&&jQuery(".wpmProductId:first").data("id")}catch(e){console.error(e)}},e.viewItemListTriggerTestMode=e=>{jQuery(e).css({position:"relative"}),jQuery(e).append('<div id="viewItemListTriggerOverlay"></div>'),jQuery(e).find("#viewItemListTriggerOverlay").css({"z-index":"10",display:"block",position:"absolute",height:"100%",top:"0",left:"0",right:"0",opacity:wpmDataLayer.shop.view_item_list_trigger.opacity,"background-color":wpmDataLayer.shop.view_item_list_trigger.background_color})},e.getSearchTermFromUrl=()=>{try{return new URLSearchParams(window.location.search).get("s")}catch(e){console.error(e)}};let i,n={};e.observerCallback=(t,r)=>{t.forEach(t=>{try{let a,o=jQuery(t.target).data("ioid");if(a=jQuery(t.target).next(".wpmProductId").length?jQuery(t.target).next(".wpmProductId").data("id"):jQuery(t.target).find(".wpmProductId").data("id"),!a)throw Error("wpmProductId element not found");t.isIntersecting?n[o]=setTimeout(()=>{e.triggerViewItemList(a),wpmDataLayer.shop.view_item_list_trigger.test_mode&&e.viewItemListTriggerTestMode(t.target),!1===wpmDataLayer.shop.view_item_list_trigger.repeat&&r.unobserve(t.target)},wpmDataLayer.shop.view_item_list_trigger.timeout):(clearTimeout(n[o]),wpmDataLayer.shop.view_item_list_trigger.test_mode&&jQuery(t.target).find("#viewItemListTriggerOverlay").remove())}catch(e){console.error(e)}})};let s=0;let c={nested:[],flat:[]};const p=e=>["product","type-product","product-item-inner",...c.nested].some(t=>jQuery(e).closest("."+t).length),u=e=>["wc-block-grid__product","product","product-small","woocommerce-LoopProduct-link",...c.flat].some(t=>jQuery(e).prev().hasClass(t)),d=()=>(c=(()=>{let e={nested:[],flat:[]};try{const t=(e,t)=>jQuery(e).parents().length===jQuery(t).parents().length,r=(e,t)=>jQuery(e).parent().is(jQuery(t).parent())?{node:jQuery(e).parent(),type:"flat"}:{node:jQuery(e).parents().has(jQuery(t).parents()).first(),type:"nested"},a=e=>jQuery(e).find(".wpmProductId").length,o=(e,t)=>e.filter(e=>t.includes(e))[0]||null,i=document.querySelectorAll(".wpmProductId");if(1===i.length)return e;for(let n=0;n<i.length-1;n++){if(!t(i[n],i[n+1])){n++;continue}let s=r(i[n],i[n+1]);if("nested"===s.type){let t=s.node.children().first().attr("class"),r=t?t.split(" "):[],a=s.node.children().first().next().attr("class");const i=o(r,a?a.split(" "):[]);e.nested.push(i)}else if("flat"===s.type){if(!s.node.children().first().attr("class"))continue;let t=s.node.children().first().attr("class").split(" ")[0];e.flat.push(t)}n=n+a(s.node)-1}return e.nested=[...new Set(e.nested)],e.flat=[...new Set(e.flat)],e}catch(t){return console.error(t),e}})(),jQuery(".wpmProductId").map(function(e,t){return p(t)?jQuery(t).parent():u(t)?jQuery(this).prev():jQuery(t).closest(".product").length?jQuery(t).closest(".product"):void 0}));e.startIntersectionObserverToWatch=()=>{try{e.urlHasParameter("vildemomode")&&(wpmDataLayer.shop.view_item_list_trigger.test_mode=!0),i=new IntersectionObserver(e.observerCallback,{root:null,threshold:wpmDataLayer.shop.view_item_list_trigger.threshold}),d().each((e,t)=>{jQuery(t[0]).data("ioid",s++),i.observe(t[0])})}catch(e){console.error(e)}},e.startProductsMutationObserverToWatch=()=>{try{let e=jQuery(".wpmProductId:eq(0)").parents().has(jQuery(".wpmProductId:eq(1)").parents()).first();e.length&&l.observe(e[0],{attributes:!0,childList:!0,characterData:!0})}catch(e){console.error(e)}};const l=new MutationObserver(e=>{e.forEach(e=>{let t=e.addedNodes;if(null!==t){jQuery(t).each((e,t)=>{(p(t)||u(t))&&m(t)&&(jQuery(t).data("ioid",s++),i.observe(t))})}})});let m=e=>!(!jQuery(e).find(".wpmProductId").length&&!jQuery(e).siblings(".wpmProductId").length);e.setCookie=(e,t="",r=null)=>{if(r){let a=new Date;a.setTime(a.getTime()+24*r*60*60*1e3);let o="expires="+a.toUTCString();document.cookie=e+"="+t+";"+o+";path=/"}else document.cookie=e+"="+t+";path=/"},e.getCookie=e=>{let t=e+"=",r=decodeURIComponent(document.cookie).split(";");for(let e=0;e<r.length;e++){let a=r[e];for(;" "==a.charAt(0);)a=a.substring(1);if(0==a.indexOf(t))return a.substring(t.length,a.length)}return""},e.getCookieThatContainsRegex=e=>{let t=document.cookie.split(";");for(let r=0;r<t.length;r++){let a=t[r].trim();if(e.test(a))return a}return!1},e.deleteCookie=t=>{e.setCookie(t,"",-1)},e.storeData=(t,r,a=!1,o=!1)=>{const i=o?t:"";let n=a?e.getPersistentData:e.getSessionData,s=a?e.setPersistentData:e.setSessionData,c=n(i);o?c=r:c[t]=r,s(c,i)},e.retrieveData=(t,r=!1,a=!1)=>{const o=a?t:"";let i=r?e.getPersistentData(o):e.getSessionData(o);return a?i:i[t]},e.deleteDataKey=(t,r=!1,a=!1)=>{const o=a?t:"";let i=r?e.getPersistentData:e.getSessionData,n=r?e.setPersistentData:e.setSessionData,s=i(o);if(a)try{r&&window.localStorage&&window.localStorage.removeItem(e.getPersistentDataKey(o)),!r&&window.sessionStorage&&window.sessionStorage.removeItem(e.getSessionDataKey(o))}catch(e){console.error(e)}else delete s[t],n(s,o)},e.storeCartData=t=>{e.storeData("cart",t,!1,!0)},e.retrieveCartData=()=>e.retrieveData("cart",!1,!0),e.getSessionDataKey=(e="")=>{const t="_pmw_session_data";return e?t+"_"+e:t},e.getPersistentDataKey=e=>{const t="_pmw_persistent_data";return e?t+"_"+e:t},e.getSessionData=(t="")=>{if(window.sessionStorage){let r=window.sessionStorage.getItem(e.getSessionDataKey(t));return null!==r?JSON.parse(r):{}}{let r=e.getCookie(e.getSessionDataKey(t));return""!==r?JSON.parse(r):{}}},e.setSessionData=(t,r="")=>{window.sessionStorage?window.sessionStorage.setItem(e.getSessionDataKey(r),JSON.stringify(t)):e.setCookie(e.getSessionDataKey(r),JSON.stringify(t))},e.getPersistentData=t=>{if(window.localStorage){let r=window.localStorage.getItem(e.getPersistentDataKey(t));return null!==r?JSON.parse(r):{}}{let r=e.getCookie(e.getPersistentDataKey(t));return""!==r?JSON.parse(r):{}}},e.setPersistentData=(t,r="")=>{window.localStorage?window.localStorage.setItem(e.getPersistentDataKey(r),JSON.stringify(t)):e.setCookie(e.getPersistentDataKey(r),JSON.stringify(t),400)},e.storeOrderIdOnServer=async t=>{try{let r;await e.isRestEndpointAvailable()?r=await fetch(e.root+"pmw/v1/pixels-fired/",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({order_id:t.orderId,order_key:t.orderKey,source:t.source}),keepalive:!0,cache:"no-cache",redirect:"error"}):(pmw.console.log("REST API not available, falling back to AJAX"),r=await fetch(e.ajax_url,{method:"POST",body:new URLSearchParams({action:"pmw_purchase_pixels_fired",order_id:t.orderId,order_key:t.orderKey,source:t.source}),keepalive:!0,redirect:"error"}));const a=await r.json();a.success?pmw.console.log("",a.data):pmw.console.error("",a.data)}catch(e){console.error(e)}},e.getProductIdByCartItemElement=t=>{const r=jQuery(t).find(".product-remove").find("a").attr("href");if(r)return e.getProductIdByCartItemKeyUrl(new URL(r));const a=jQuery(t).find("[data-product_id]").first().attr("data-product_id");return a||null},e.getProductQuantityByCartItemElement=e=>jQuery(e).find(".qty").val()||null,e.getProductIdByCartItemKeyUrl=e=>{let t,r=new URLSearchParams(e.search).get("remove_item");return t=0===wpmDataLayer.cart_item_keys[r].variation_id?wpmDataLayer.cart_item_keys[r].product_id:wpmDataLayer.cart_item_keys[r].variation_id,t},e.getAddToCartLinkProductIds=()=>jQuery("a").map(function(){let e=jQuery(this).attr("href");if(e&&e.includes("?add-to-cart=")){let t=e.match(/(add-to-cart=)(\d+)/);if(t)return t[2]}}).get(),e.getProductDetailsFormattedForEvent=(e,t=1)=>{if(!wpmDataLayer.products[e])return null;let r={id:e.toString(),dyn_r_ids:wpmDataLayer.products[e].dyn_r_ids,name:wpmDataLayer.products[e].name,list_name:wpmDataLayer.shop.list_name,brand:wpmDataLayer.products[e].brand,category:wpmDataLayer.products[e].category,variant:wpmDataLayer.products[e].variant,list_position:wpmDataLayer.products[e].position,quantity:t,price:wpmDataLayer.products[e].price,currency:wpmDataLayer.shop.currency,is_variable:wpmDataLayer.products[e].is_variable,is_variation:wpmDataLayer.products[e].is_variation,parent_id:wpmDataLayer.products[e].parent_id};return r.is_variation&&(r.parent_id_dyn_r_ids=wpmDataLayer.products[e].parent_id_dyn_r_ids),r},e.getClidFromBrowser=(t="gclid")=>{let r;if(r={gclid:"_gcl_aw",dclid:"_gcl_dc"},e.getCookie(r[t])){return e.getCookie(r[t]).match(/(GCL.[\d]*.)(.*)/)[2]}return""},e.getUserAgent=()=>navigator.userAgent,e.getViewPort=()=>({width:Math.max(document.documentElement.clientWidth||0,window.innerWidth||0),height:Math.max(document.documentElement.clientHeight||0,window.innerHeight||0)}),e.consoleLogVersion=()=>{console.log(wpmDataLayer.version)},e.loadScriptAndCacheIt=(e,t)=>{let r={dataType:"script",cache:!0,url:e};return new Promise((a,o)=>{jQuery.ajax(r).done(()=>{pmw.console.log("Successfully loaded primary script: "+e),a()}).fail(()=>{if(t){pmw.console.log("Loading fallback script: "+t);let e={dataType:"script",cache:!0,url:t};jQuery.ajax(e).done(()=>{pmw.console.log("Successfully loaded fallback script: "+t),a()}).fail(()=>o(new Error("Both primary and fallback scripts failed to load.")))}else o(new Error("Primary script failed to load, and no fallback URL provided."))})})},e.getOrderItemPrice=e=>(e.total+e.total_tax)/e.quantity,e.hasLoginEventFired=()=>{let t=e.getSessionData();return t?.loginEventFired},e.setLoginEventFired=()=>{let t=e.getSessionData();t.loginEventFired=!0,e.setSessionData(t)},e.pageLoaded=async()=>new Promise(e=>{!function t(){if("complete"===document.readyState)return e();setTimeout(t,50)}()}),e.pageReady=()=>new Promise(e=>{!function t(){if("interactive"===document.readyState||"complete"===document.readyState)return e();setTimeout(t,50)}()}),e.isMiniCartActive=()=>(window.sessionStorage&&Object.keys(window.sessionStorage).forEach(e=>{if(e.includes("wc_fragments"))return!0}),!1),e.doesWooCommerceCartExist=()=>document.cookie.includes("woocommerce_items_in_cart"),e.urlHasParameter=e=>new URLSearchParams(window.location.search).has(e),e.getUrlParameter=e=>new URLSearchParams(window.location.search).get(e),e.hashAsync=(e,t)=>crypto.subtle.digest(e,new TextEncoder("utf-8").encode(t)).then(e=>Array.prototype.map.call(new Uint8Array(e),e=>("00"+e.toString(16)).slice(-2)).join("")),e.getCartValue=()=>{let e=0;if(wpmDataLayer?.cart)for(const t in wpmDataLayer.cart){let r=wpmDataLayer.cart[t];e+=r.quantity*r.price}return e},e.doesUrlContainPatterns=e=>{for(const t of e)if(new RegExp(t).test(window.location.href))return!0;return!1},e.excludeDomainFromTracking=()=>{let e=["appspot.com","translate.google.com"];return wpmDataLayer?.general?.exclude_domains&&(e=[...e,...wpmDataLayer.general.exclude_domains]),!!e.some(e=>window.location.href.includes(e))&&(console.debug("Pixel Manager: Aborted due to excluded domain"),!0)},e.getRandomEventId=(e=16)=>{let t="";for(;t.length<e;)t+=(Math.random()+1).toString(36).substring(2);return t.substring(0,e)},e.pmwConsoleMessage=()=>{let e="Pixel Manager for WooCommerce: ";e+=wpmDataLayer.version.pro?"pro":"free",e+=" | distro: "+wpmDataLayer.version.distro,"fms"===wpmDataLayer.version.distro&&wpmDataLayer.version.pro&&(e+=" | active license: "+(wpmDataLayer.version.eligible_for_updates?"yes":"no")),e+=" | version: "+wpmDataLayer.version.number,!0===wpmDataLayer.version.show?console.log(e):pmw.console.log(e)},e.canLoadPremiumFeatures=()=>"fms"===wpmDataLayer.version.distro&&wpmDataLayer.version.pro&&wpmDataLayer.version.eligible_for_updates||"wcm"===wpmDataLayer.version.distro;let w=!1;e.triggerPmwDomReadyEvent=()=>{w||("complete"!==document.readyState?(jQuery(()=>{g()}),document.addEventListener("DOMContentLoaded",()=>{g()},!0)):g())};const g=()=>{w||(document.dispatchEvent(new Event("pmw:dom:ready")),w=!0)};e.getEmailFromTarget=t=>{if(t.href){let r=t.href.replace("mailto:","");if(r.indexOf("?")>-1&&(r=r.split("?")[0]),r=r.replace(/\s/g,""),r&&e.isEmail(r))return r}return""},e.sendEventPayloadToServer=t=>{"function"==typeof e.sendEventPayloadToServerPremium&&e.sendEventPayloadToServerPremium(t)},e.waitForPixelsAndTriggerPageView=async()=>new Promise(e=>{if(!wpmDataLayer?.pixels)return pmw.console.error("wpmDataLayer or wpmDataLayer.pixels is not defined, triggering page view event immediately."),document.dispatchEvent(new Event("pmw:page-view")),void e();let t=wpmDataLayer?.general?.server_2_server?.pageview_event_s2s?.pixels||[];if(t=t.filter(e=>wpmDataLayer.pixels[e]),0===t.length)return pmw.console.log("No specific pixels to wait for, triggering page view event."),document.dispatchEvent(new Event("pmw:page-view")),void e();const r=()=>{t.every(e=>!wpmDataLayer.pixels[e]||wpmDataLayer.pixels[e].loaded)?(document.dispatchEvent(new Event("pmw:page-view")),e()):setTimeout(r,100)};r()}),e.isWooCommerceActive=()=>!!wpmDataLayer.shop,e.getProductIdForSpecificPixel=(e,t)=>String(e.dyn_r_ids[wpmDataLayer.pixels[t].dynamic_remarketing.id_type]),e.isInWooCommerceSesssion=()=>{if(wpmDataLayer?.shop?.session_active)return!0;let t=new RegExp("woocommerce_cart_hash");return!!e.getCookieThatContainsRegex(t)},e.isNotInWooCommerceSesssion=()=>!e.isInWooCommerceSesssion(),e.makeFullUrl=e=>(e=e.trim(),/^(http:\/\/|https:\/\/)/.test(e)?e:"https://"+(e=e.replace(/^\/+/,""))),e.registerShowVariationEventListener=()=>{let t=null;jQuery(".single_variation_wrap").on("show_variation",(r,a)=>{try{let r=e.getIdBasedOndVariationsOutputSetting(a.variation_id);if(!r)throw Error("Wasn't able to retrieve a productId");t!==a.variation_id&&(e.triggerViewItemEventPrep(r),t=a.variation_id)}catch(e){console.error(e)}})},e.initializeCommandQueue=()=>{const e=window._pmwq=window._pmwq||[];e.forEach(function(e){if("function"==typeof e)try{e()}catch(e){pmw.console.error("Error executing queued command:",e)}}),e.push=function(e){if("function"==typeof e)try{e()}catch(e){pmw.console.error("Error executing command from queue:",e)}}}}(window.wpm=window.wpm||{},jQuery)},975:()=>{!function(e){e.getEventContext=function(){return{timestamp:Math.floor(Date.now()/1e3),url:window.location.href,referrer:e.retrieveData("referrer")?e.makeFullUrl(e.retrieveData("referrer")):document.referrer,user_agent:navigator.userAgent,page_type:wpmDataLayer?.shop?.page_type,user_id:wpmDataLayer?.user?.id?.raw||null}},e.processEvent=async function(t,r){pmw.console.log(`Processing event: ${t}`,r);try{let a={event:t,event_data:r,pixels:{},context:e.getEventContext()};a=pmw.hooks.applyFilters("pmw_event_payload_pre",a,t);const o=e.pixelRegistry.getActivePixels();for(const r of o){const o=e.pixelRegistry.getAdapter(r);if(o&&"function"==typeof o.adapt)try{let e=o.adapt(a.event_data,t,a.context);if(!e)continue;e=pmw.hooks.applyFilters(`pmw_pixel_data_${r}`,e,t,a.event_data,a.context),a.pixels[r]=e}catch(e){pmw.console.error(`Error adapting data for ${r}:`,e)}else pmw.console.log(`No adapter found for pixel: ${r}`)}return a=pmw.hooks.applyFilters(`pmw_event_payload_${t}`,a,a.event_data),a=pmw.hooks.applyFilters("pmw_event_payload_post",a,t),await e.dispatchToPixels(a),a}catch(e){throw pmw.console.error(`Error processing event ${t}:`,e),e}},e.dispatchToPixels=async function(t){const r=t.event;if(e.dispatchToBrowserPixels(t),e.dispatchToS2SPixels(t),"purchase"!==r){if(wpmDataLayer?.general?.server_2_server?.active){const a=e.extractS2SData(t);Object.keys(a).length>0&&(pmw.console.log(`Sending S2S data for ${r}:`,a),await e.sendEventPayloadToServer(a))}}else pmw.console.log("Purchase event - skipping browser-to-server transmission (handled server-side only)")},e.dispatchToBrowserPixels=function(t){const r=e.pixelRegistry.getActiveBrowserOnlyPixels();if(0===r.length)return;pmw.console.log(`Dispatching to browser-only pixels for ${t.event}:`,r);const a=t.event.replace(/_/g,"-");jQuery(document).trigger(`pmw:browser:${a}`,t)},e.dispatchToS2SPixels=function(t){const r=e.pixelRegistry.getActiveS2SPixels();if(0===r.length)return;pmw.console.log(`Dispatching to S2S-capable pixels for ${t.event}:`,r);const a=t.event.replace(/_/g,"-");jQuery(document).trigger(`pmw:s2s:${a}`,t)},e.extractS2SData=function(t){const r={event:t.event},a=e.pixelRegistry.getActiveS2SPixels();for(const e of a)t.pixels[e]&&(r[e]=t.pixels[e]);return t.event_data?.product&&(r.product=t.event_data.product),r},e.adapters||(e.adapters={}),e.registerAdapter=function(t,r,a={}){r&&"function"==typeof r.adapt?(e.adapters[t]=r,e.pixelCapabilities||(e.pixelCapabilities={}),e.pixelCapabilities[t]={supportsS2S:a.supportsS2S||!1,supportsEventDeduplication:a.supportsEventDeduplication||!1,isActive:a.isActive||null}):pmw.console.error(`Invalid adapter for ${t}: must have an adapt() method`)}}(window.wpm=window.wpm||{},jQuery)}},i={};function n(e){var t=i[e];if(void 0!==t)return t.exports;var r=i[e]={exports:{}};return o[e](r,r.exports,n),r.exports}n.m=o,t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,n.t=function(r,a){if(1&a&&(r=this(r)),8&a)return r;if("object"==typeof r&&r){if(4&a&&r.__esModule)return r;if(16&a&&"function"==typeof r.then)return r}var o=Object.create(null);n.r(o);var i={};e=e||[null,t({}),t([]),t(t)];for(var s=2&a&&r;("object"==typeof s||"function"==typeof s)&&!~e.indexOf(s);s=t(s))Object.getOwnPropertyNames(s).forEach(e=>i[e]=()=>r[e]);return i.default=()=>r,n.d(o,i),o},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.f={},n.e=e=>Promise.all(Object.keys(n.f).reduce((t,r)=>(n.f[r](e,t),t),[])),n.u=e=>({194:"wc-hooks",264:"deprecated-functions",526:"pixel-facebook",625:"consent-management",671:"pixel-google",818:"pixel-hotjar",968:"consent-api",972:"doofinder-listener"}[e]+"."+{194:"748deb38",264:"9b411c79",526:"0ae541d1",625:"414e6bb6",671:"62e8b182",818:"05256bbc",968:"12d29397",972:"8afb6ac4"}[e]+".chunk.min.js"),n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r={},a="Pixel Manager for WooCommerce:",n.l=(e,t,o,i)=>{if(r[e])r[e].push(t);else{var s,c;if(void 0!==o)for(var p=document.getElementsByTagName("script"),u=0;u<p.length;u++){var d=p[u];if(d.getAttribute("src")==e||d.getAttribute("data-webpack")==a+o){s=d;break}}s||(c=!0,(s=document.createElement("script")).charset="utf-8",n.nc&&s.setAttribute("nonce",n.nc),s.setAttribute("data-webpack",a+o),s.src=e),r[e]=[t];var l=(t,a)=>{s.onerror=s.onload=null,clearTimeout(m);var o=r[e];if(delete r[e],s.parentNode&&s.parentNode.removeChild(s),o&&o.forEach(e=>e(a)),t)return t(a)},m=setTimeout(l.bind(null,void 0,{type:"timeout",target:s}),12e4);s.onerror=l.bind(null,s.onerror),s.onload=l.bind(null,s.onload),c&&document.head.appendChild(s)}},n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;n.g.importScripts&&(e=n.g.location+"");var t=n.g.document;if(!e&&t&&(t.currentScript&&"SCRIPT"===t.currentScript.tagName.toUpperCase()&&(e=t.currentScript.src),!e)){var r=t.getElementsByTagName("script");if(r.length)for(var a=r.length-1;a>-1&&(!e||!/^http(s?):/.test(e));)e=r[a--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/^blob:/,"").replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),n.p=e})(),(()=>{var e={792:0};n.f.j=(t,r)=>{var a=n.o(e,t)?e[t]:void 0;if(0!==a)if(a)r.push(a[2]);else{var o=new Promise((r,o)=>a=e[t]=[r,o]);r.push(a[2]=o);var i=n.p+n.u(t),s=new Error;n.l(i,r=>{if(n.o(e,t)&&(0!==(a=e[t])&&(e[t]=void 0),a)){var o=r&&("load"===r.type?"missing":r.type),i=r&&r.target&&r.target.src;s.message="Loading chunk "+t+" failed.\n("+o+": "+i+")",s.name="ChunkLoadError",s.type=o,s.request=i,a[1](s)}},"chunk-"+t,t)}};var t=(t,r)=>{var a,o,[i,s,c]=r,p=0;if(i.some(t=>0!==e[t])){for(a in s)n.o(s,a)&&(n.m[a]=s[a]);if(c)c(n)}for(t&&t(r);p<i.length;p++)o=i[p],n.o(e,o)&&e[o]&&e[o][0](),e[o]=0},r=self.webpackChunkPixel_Manager_for_WooCommerce=self.webpackChunkPixel_Manager_for_WooCommerce||[];r.forEach(t.bind(null,0)),r.push=t.bind(null,r.push.bind(r))})();(async()=>{if(n(263),n(547),await wpm.jQueryExists(),await wpm.wpmDataLayerFullyLoaded(),wpmDataLayer?.general?.chunk_base_path&&(n.p=wpmDataLayer.general.chunk_base_path),n(189),n(510),n(256),n(975),wpm.initializeCommandQueue(),wpm.pmwConsoleMessage(),await wpm.loadConsentModule(),await wpm.consent.load(),jQuery(()=>{n(722)}),n(196),n.e(972).then(n.t.bind(n,282,23)),wpm.loadWcHooksFunctions(),wpm.excludeDomainFromTracking())return;const e=[];wpmDataLayer?.pixels?.google&&e.push(n.e(671).then(n.t.bind(n,62,23))),wpmDataLayer?.pixels?.facebook&&e.push(n.e(526).then(n.t.bind(n,767,23))),wpmDataLayer?.pixels?.hotjar&&e.push(n.e(818).then(n.t.bind(n,155,23))),await Promise.all(e);const{loadDeprecatedFunctions:t}=await n.e(264).then(n.bind(n,549));t(),document.dispatchEvent(new Event("pmw:load-pixels")),document.dispatchEvent(new Event("wpmLoad")),await wpm.pageLoaded(),document.dispatchEvent(new Event("pmw:ready")),wpm.triggerPmwDomReadyEvent(),wpm.checkLibraryVersion()})()})();
     1/*! Copyright 2025 SweetCode. All rights reserved. */(()=>{var e,t,r,a,o={179:(e,t,r)=>{"use strict";r.r(t),r.d(t,{getLocationByTimeZone:()=>a});const a=()=>{const e=Intl.DateTimeFormat().resolvedOptions().timeZone;if(""===e||!e)return null;let t={countryCode:{"Africa/Abidjan":["CI","BF","GH","GM","GN","ML","MR","SH","SL","SN","TG"],"Africa/Accra":["GH"],"Africa/Addis_Ababa":["ET"],"Africa/Algiers":["DZ"],"Africa/Asmara":["ER"],"Africa/Asmera":["ER"],"Africa/Bamako":["ML"],"Africa/Bangui":["CF"],"Africa/Banjul":["GM"],"Africa/Bissau":["GW"],"Africa/Blantyre":["MW"],"Africa/Brazzaville":["CG"],"Africa/Bujumbura":["BI"],"Africa/Cairo":["EG"],"Africa/Casablanca":["MA"],"Africa/Ceuta":["ES"],"Africa/Conakry":["GN"],"Africa/Dakar":["SN"],"Africa/Dar_es_Salaam":["TZ"],"Africa/Djibouti":["DJ"],"Africa/Douala":["CM"],"Africa/El_Aaiun":["EH"],"Africa/Freetown":["SL"],"Africa/Gaborone":["BW"],"Africa/Harare":["ZW"],"Africa/Johannesburg":["ZA","LS","SZ"],"Africa/Juba":["SS"],"Africa/Kampala":["UG"],"Africa/Khartoum":["SD"],"Africa/Kigali":["RW"],"Africa/Kinshasa":["CD"],"Africa/Lagos":["NG","AO","BJ","CD","CF","CG","CM","GA","GQ","NE"],"Africa/Libreville":["GA"],"Africa/Lome":["TG"],"Africa/Luanda":["AO"],"Africa/Lubumbashi":["CD"],"Africa/Lusaka":["ZM"],"Africa/Malabo":["GQ"],"Africa/Maputo":["MZ","BI","BW","CD","MW","RW","ZM","ZW"],"Africa/Maseru":["LS"],"Africa/Mbabane":["SZ"],"Africa/Mogadishu":["SO"],"Africa/Monrovia":["LR"],"Africa/Nairobi":["KE","DJ","ER","ET","KM","MG","SO","TZ","UG","YT"],"Africa/Ndjamena":["TD"],"Africa/Niamey":["NE"],"Africa/Nouakchott":["MR"],"Africa/Ouagadougou":["BF"],"Africa/Porto-Novo":["BJ"],"Africa/Sao_Tome":["ST"],"Africa/Timbuktu":["ML"],"Africa/Tripoli":["LY"],"Africa/Tunis":["TN"],"Africa/Windhoek":["NA"],"America/Adak":["US"],"America/Anchorage":["US"],"America/Anguilla":["AI"],"America/Antigua":["AG"],"America/Araguaina":["BR"],"America/Argentina/Buenos_Aires":["AR"],"America/Argentina/Catamarca":["AR"],"America/Argentina/Cordoba":["AR"],"America/Argentina/Jujuy":["AR"],"America/Argentina/La_Rioja":["AR"],"America/Argentina/Mendoza":["AR"],"America/Argentina/Rio_Gallegos":["AR"],"America/Argentina/Salta":["AR"],"America/Argentina/San_Juan":["AR"],"America/Argentina/San_Luis":["AR"],"America/Argentina/Tucuman":["AR"],"America/Argentina/Ushuaia":["AR"],"America/Aruba":["AW"],"America/Asuncion":["PY"],"America/Atikokan":["CA"],"America/Bahia":["BR"],"America/Bahia_Banderas":["MX"],"America/Barbados":["BB"],"America/Belem":["BR"],"America/Belize":["BZ"],"America/Blanc-Sablon":["CA"],"America/Boa_Vista":["BR"],"America/Bogota":["CO"],"America/Boise":["US"],"America/Cambridge_Bay":["CA"],"America/Campo_Grande":["BR"],"America/Cancun":["MX"],"America/Caracas":["VE"],"America/Cayenne":["GF"],"America/Cayman":["KY"],"America/Chicago":["US"],"America/Chihuahua":["MX"],"America/Coral_Harbour":["CA"],"America/Costa_Rica":["CR"],"America/Creston":["CA"],"America/Cuiaba":["BR"],"America/Curacao":["CW"],"America/Danmarkshavn":["GL"],"America/Dawson":["CA"],"America/Dawson_Creek":["CA"],"America/Denver":["US"],"America/Detroit":["US"],"America/Dominica":["DM"],"America/Edmonton":["CA"],"America/Eirunepe":["BR"],"America/El_Salvador":["SV"],"America/Fort_Nelson":["CA"],"America/Fortaleza":["BR"],"America/Glace_Bay":["CA"],"America/Goose_Bay":["CA"],"America/Grand_Turk":["TC"],"America/Grenada":["GD"],"America/Guadeloupe":["GP"],"America/Guatemala":["GT"],"America/Guayaquil":["EC"],"America/Guyana":["GY"],"America/Halifax":["CA"],"America/Havana":["CU"],"America/Hermosillo":["MX"],"America/Indiana/Indianapolis":["US"],"America/Indiana/Knox":["US"],"America/Indiana/Marengo":["US"],"America/Indiana/Petersburg":["US"],"America/Indiana/Tell_City":["US"],"America/Indiana/Vevay":["US"],"America/Indiana/Vincennes":["US"],"America/Indiana/Winamac":["US"],"America/Inuvik":["CA"],"America/Iqaluit":["CA"],"America/Jamaica":["JM"],"America/Juneau":["US"],"America/Kentucky/Louisville":["US"],"America/Kentucky/Monticello":["US"],"America/Kralendijk":["BQ"],"America/La_Paz":["BO"],"America/Lima":["PE"],"America/Los_Angeles":["US"],"America/Lower_Princes":["SX"],"America/Maceio":["BR"],"America/Managua":["NI"],"America/Manaus":["BR"],"America/Marigot":["MF"],"America/Martinique":["MQ"],"America/Matamoros":["MX"],"America/Mazatlan":["MX"],"America/Menominee":["US"],"America/Merida":["MX"],"America/Metlakatla":["US"],"America/Mexico_City":["MX"],"America/Miquelon":["PM"],"America/Moncton":["CA"],"America/Monterrey":["MX"],"America/Montevideo":["UY"],"America/Montreal":["CA"],"America/Montserrat":["MS"],"America/Nassau":["BS"],"America/New_York":["US"],"America/Nipigon":["CA"],"America/Nome":["US"],"America/Noronha":["BR"],"America/North_Dakota/Beulah":["US"],"America/North_Dakota/Center":["US"],"America/North_Dakota/New_Salem":["US"],"America/Nuuk":["GL"],"America/Ojinaga":["MX"],"America/Panama":["PA","CA","KY"],"America/Pangnirtung":["CA"],"America/Paramaribo":["SR"],"America/Phoenix":["US","CA"],"America/Port-au-Prince":["HT"],"America/Port_of_Spain":["TT"],"America/Porto_Velho":["BR"],"America/Puerto_Rico":["PR","AG","CA","AI","AW","BL","BQ","CW","DM","GD","GP","KN","LC","MF","MS","SX","TT","VC","VG","VI"],"America/Punta_Arenas":["CL"],"America/Rainy_River":["CA"],"America/Rankin_Inlet":["CA"],"America/Recife":["BR"],"America/Regina":["CA"],"America/Resolute":["CA"],"America/Rio_Branco":["BR"],"America/Santarem":["BR"],"America/Santiago":["CL"],"America/Santo_Domingo":["DO"],"America/Sao_Paulo":["BR"],"America/Scoresbysund":["GL"],"America/Sitka":["US"],"America/St_Barthelemy":["BL"],"America/St_Johns":["CA"],"America/St_Kitts":["KN"],"America/St_Lucia":["LC"],"America/St_Thomas":["VI"],"America/St_Vincent":["VC"],"America/Swift_Current":["CA"],"America/Tegucigalpa":["HN"],"America/Thule":["GL"],"America/Thunder_Bay":["CA"],"America/Tijuana":["MX"],"America/Toronto":["CA","BS"],"America/Tortola":["VG"],"America/Vancouver":["CA"],"America/Virgin":["VI"],"America/Whitehorse":["CA"],"America/Winnipeg":["CA"],"America/Yakutat":["US"],"America/Yellowknife":["CA"],"Antarctica/Casey":["AQ"],"Antarctica/Davis":["AQ"],"Antarctica/DumontDUrville":["AQ"],"Antarctica/Macquarie":["AU"],"Antarctica/Mawson":["AQ"],"Antarctica/McMurdo":["AQ"],"Antarctica/Palmer":["AQ"],"Antarctica/Rothera":["AQ"],"Antarctica/South_Pole":["AQ"],"Antarctica/Syowa":["AQ"],"Antarctica/Troll":["AQ"],"Antarctica/Vostok":["AQ"],"Arctic/Longyearbyen":["SJ"],"Asia/Aden":["YE"],"Asia/Almaty":["KZ"],"Asia/Amman":["JO"],"Asia/Anadyr":["RU"],"Asia/Aqtau":["KZ"],"Asia/Aqtobe":["KZ"],"Asia/Ashgabat":["TM"],"Asia/Atyrau":["KZ"],"Asia/Baghdad":["IQ"],"Asia/Bahrain":["BH"],"Asia/Baku":["AZ"],"Asia/Bangkok":["TH","KH","LA","VN"],"Asia/Barnaul":["RU"],"Asia/Beirut":["LB"],"Asia/Bishkek":["KG"],"Asia/Brunei":["BN"],"Asia/Chita":["RU"],"Asia/Choibalsan":["MN"],"Asia/Colombo":["LK"],"Asia/Damascus":["SY"],"Asia/Dhaka":["BD"],"Asia/Dili":["TL"],"Asia/Dubai":["AE","OM"],"Asia/Dushanbe":["TJ"],"Asia/Famagusta":["CY"],"Asia/Gaza":["PS"],"Asia/Hebron":["PS"],"Asia/Ho_Chi_Minh":["VN"],"Asia/Hong_Kong":["HK"],"Asia/Hovd":["MN"],"Asia/Irkutsk":["RU"],"Asia/Jakarta":["ID"],"Asia/Jayapura":["ID"],"Asia/Jerusalem":["IL"],"Asia/Kabul":["AF"],"Asia/Kamchatka":["RU"],"Asia/Karachi":["PK"],"Asia/Kathmandu":["NP"],"Asia/Khandyga":["RU"],"Asia/Kolkata":["IN"],"Asia/Krasnoyarsk":["RU"],"Asia/Kuala_Lumpur":["MY"],"Asia/Kuching":["MY"],"Asia/Kuwait":["KW"],"Asia/Macau":["MO"],"Asia/Magadan":["RU"],"Asia/Makassar":["ID"],"Asia/Manila":["PH"],"Asia/Muscat":["OM"],"Asia/Nicosia":["CY"],"Asia/Novokuznetsk":["RU"],"Asia/Novosibirsk":["RU"],"Asia/Omsk":["RU"],"Asia/Oral":["KZ"],"Asia/Phnom_Penh":["KH"],"Asia/Pontianak":["ID"],"Asia/Pyongyang":["KP"],"Asia/Qatar":["QA","BH"],"Asia/Qostanay":["KZ"],"Asia/Qyzylorda":["KZ"],"Asia/Riyadh":["SA","AQ","KW","YE"],"Asia/Sakhalin":["RU"],"Asia/Samarkand":["UZ"],"Asia/Seoul":["KR"],"Asia/Shanghai":["CN"],"Asia/Singapore":["SG","MY"],"Asia/Srednekolymsk":["RU"],"Asia/Taipei":["TW"],"Asia/Tashkent":["UZ"],"Asia/Tbilisi":["GE"],"Asia/Tehran":["IR"],"Asia/Thimphu":["BT"],"Asia/Tokyo":["JP"],"Asia/Tomsk":["RU"],"Asia/Ulaanbaatar":["MN"],"Asia/Urumqi":["CN"],"Asia/Ust-Nera":["RU"],"Asia/Vientiane":["LA"],"Asia/Vladivostok":["RU"],"Asia/Yakutsk":["RU"],"Asia/Yangon":["MM"],"Asia/Yekaterinburg":["RU"],"Asia/Yerevan":["AM"],"Atlantic/Azores":["PT"],"Atlantic/Bermuda":["BM"],"Atlantic/Canary":["ES"],"Atlantic/Cape_Verde":["CV"],"Atlantic/Faroe":["FO"],"Atlantic/Jan_Mayen":["SJ"],"Atlantic/Madeira":["PT"],"Atlantic/Reykjavik":["IS"],"Atlantic/South_Georgia":["GS"],"Atlantic/St_Helena":["SH"],"Atlantic/Stanley":["FK"],"Australia/Adelaide":["AU"],"Australia/Brisbane":["AU"],"Australia/Broken_Hill":["AU"],"Australia/Darwin":["AU"],"Australia/Eucla":["AU"],"Australia/Hobart":["AU"],"Australia/Lindeman":["AU"],"Australia/Lord_Howe":["AU"],"Australia/Melbourne":["AU"],"Australia/Perth":["AU"],"Australia/Sydney":["AU"],"Canada/Eastern":["CA"],"Europe/Amsterdam":["NL"],"Europe/Andorra":["AD"],"Europe/Astrakhan":["RU"],"Europe/Athens":["GR"],"Europe/Belfast":["GB"],"Europe/Belgrade":["RS","BA","HR","ME","MK","SI"],"Europe/Berlin":["DE"],"Europe/Bratislava":["SK"],"Europe/Brussels":["BE"],"Europe/Bucharest":["RO"],"Europe/Budapest":["HU"],"Europe/Busingen":["DE"],"Europe/Chisinau":["MD"],"Europe/Copenhagen":["DK"],"Europe/Dublin":["IE"],"Europe/Gibraltar":["GI"],"Europe/Guernsey":["GG"],"Europe/Helsinki":["FI","AX"],"Europe/Isle_of_Man":["IM"],"Europe/Istanbul":["TR"],"Europe/Jersey":["JE"],"Europe/Kaliningrad":["RU"],"Europe/Kiev":["UA"],"Europe/Kirov":["RU"],"Europe/Lisbon":["PT"],"Europe/Ljubljana":["SI"],"Europe/London":["GB","GG","IM","JE"],"Europe/Luxembourg":["LU"],"Europe/Madrid":["ES"],"Europe/Malta":["MT"],"Europe/Mariehamn":["AX"],"Europe/Minsk":["BY"],"Europe/Monaco":["MC"],"Europe/Moscow":["RU"],"Europe/Oslo":["NO","SJ","BV"],"Europe/Paris":["FR"],"Europe/Podgorica":["ME"],"Europe/Prague":["CZ","SK"],"Europe/Riga":["LV"],"Europe/Rome":["IT","SM","VA"],"Europe/Samara":["RU"],"Europe/San_Marino":["SM"],"Europe/Sarajevo":["BA"],"Europe/Saratov":["RU"],"Europe/Simferopol":["RU","UA"],"Europe/Skopje":["MK"],"Europe/Sofia":["BG"],"Europe/Stockholm":["SE"],"Europe/Tallinn":["EE"],"Europe/Tirane":["AL"],"Europe/Ulyanovsk":["RU"],"Europe/Uzhgorod":["UA"],"Europe/Vaduz":["LI"],"Europe/Vatican":["VA"],"Europe/Vienna":["AT"],"Europe/Vilnius":["LT"],"Europe/Volgograd":["RU"],"Europe/Warsaw":["PL"],"Europe/Zagreb":["HR"],"Europe/Zaporozhye":["UA"],"Europe/Zurich":["CH","DE","LI"],GB:["GB"],"GB-Eire":["GB"],"Indian/Antananarivo":["MG"],"Indian/Chagos":["IO"],"Indian/Christmas":["CX"],"Indian/Cocos":["CC"],"Indian/Comoro":["KM"],"Indian/Kerguelen":["TF","HM"],"Indian/Mahe":["SC"],"Indian/Maldives":["MV"],"Indian/Mauritius":["MU"],"Indian/Mayotte":["YT"],"Indian/Reunion":["RE","TF"],NZ:["NZ"],"Pacific/Apia":["WS"],"Pacific/Auckland":["NZ","AQ"],"Pacific/Bougainville":["PG"],"Pacific/Chatham":["NZ"],"Pacific/Chuuk":["FM"],"Pacific/Easter":["CL"],"Pacific/Efate":["VU"],"Pacific/Fakaofo":["TK"],"Pacific/Fiji":["FJ"],"Pacific/Funafuti":["TV"],"Pacific/Galapagos":["EC"],"Pacific/Gambier":["PF"],"Pacific/Guadalcanal":["SB"],"Pacific/Guam":["GU","MP"],"Pacific/Honolulu":["US","UM"],"Pacific/Johnston":["UM"],"Pacific/Kanton":["KI"],"Pacific/Kiritimati":["KI"],"Pacific/Kosrae":["FM"],"Pacific/Kwajalein":["MH"],"Pacific/Majuro":["MH"],"Pacific/Marquesas":["PF"],"Pacific/Midway":["UM"],"Pacific/Nauru":["NR"],"Pacific/Niue":["NU"],"Pacific/Norfolk":["NF"],"Pacific/Noumea":["NC"],"Pacific/Pago_Pago":["AS","UM"],"Pacific/Palau":["PW"],"Pacific/Pitcairn":["PN"],"Pacific/Pohnpei":["FM"],"Pacific/Port_Moresby":["PG","AQ"],"Pacific/Rarotonga":["CK"],"Pacific/Saipan":["MP"],"Pacific/Samoa":["WS"],"Pacific/Tahiti":["PF"],"Pacific/Tarawa":["KI"],"Pacific/Tongatapu":["TO"],"Pacific/Wake":["UM"],"Pacific/Wallis":["WF"],Singapore:["SG"],"US/Arizona":["US"],"US/Hawaii":["US"],"US/Samoa":["WS"]}[e][0].toUpperCase()};return"America/Los_Angeles"===e&&(t.regionCode="US-CA"),"Europe/Zurich"===e&&(t.regionCode="CH-ZH"),t}},181:(e,t,r)=>{"use strict";r.r(t),r.d(t,{error:()=>o,log:()=>a});const a=(e,...t)=>{i()&&("object"==typeof e?console.log("Pixel Manager: ",e,...t):t.length?console.log("Pixel Manager: "+e,...t):console.log("Pixel Manager: "+e))},o=(e,...t)=>{"object"==typeof e?console.error("Pixel Manager: ",e,...t):t.length?console.error("Pixel Manager: "+e,...t):console.error("Pixel Manager: "+e)},i=()=>!n()&&(!!s()||(!!c()||!!wpmDataLayer?.general?.logger?.is_active)),n=()=>(wpm.urlHasParameter("pmwloggeroff")&&wpm.storeData("loggerEnabled",!1),wpm.urlHasParameter("pmwloggeroff")),s=()=>wpm.retrieveData("loggerEnabled"),c=()=>(wpm.urlHasParameter("pmwloggeron")&&wpm.storeData("loggerEnabled",!0),wpm.urlHasParameter("pmwloggeron"))},189:(e,t,r)=>{r(783),window.wpm.loadConsentModule=async()=>{const e=await r.e(625).then(r.bind(r,153));window.wpm.consent=e;const t=await r.e(968).then(r.bind(r,857));return window.pmw=window.pmw||{},window.pmw.consent=window.pmw.consent||{},window.pmw.consent.api=t,e},window.pmw=window.pmw||{console:r(181)},r(616)},196:()=>{const e=e=>e=(e=e.replace(/<[^>]*>?/gm,"").replace(/\n/gm,"").replace(/\t/gm,"")).trim();jQuery("form.woocommerce-checkout").on("change","#shipping_method",r=>{r.target?.value&&r.target?.id&&t({slug:r.target.value,text:e(jQuery("label[for='"+r.target.id+"']").text())})}),jQuery(()=>{if(jQuery("#shipping_method").length){let r=jQuery("#shipping_method").find(":checked");if(r.length){if(!r.val())return;if(!r.attr("id"))return;t({slug:r.val(),text:e(jQuery("label[for='"+r.attr("id")+"']").text())})}}});const t=e=>{jQuery(document).trigger("pmw:add-shipping-info",{shippingTier:e})};let r=!1;jQuery("form.woocommerce-checkout").on("change",'input[name="payment_method"]',t=>{t.target.value&&t.target.id&&(a({slug:t.target.value,text:e(jQuery("label[for='"+t.target.id+"']").text())}),r=!0)}),jQuery(()=>{if(r)return;let t=jQuery('input[name="payment_method"]:checked');if(t.length){if(!t.val())return;if(!t.attr("id"))return;a({slug:t.val(),text:e(jQuery("label[for='"+t.attr("id")+"']").text())})}});const a=e=>{jQuery(document).trigger("pmw:add-payment-info",{paymentType:e})};jQuery(document).on("click",".remove_from_cart_button, .remove",e=>{try{let t=new URL(jQuery(e.currentTarget).attr("href")),r=wpm.getProductIdByCartItemKeyUrl(t);wpm.removeProductFromCart(r)}catch(e){console.error(e)}});const o=wpm.prepareSelectors([".checkout-button",".cart-checkout-button",".button.checkout",".xoo-wsc-ft-btn-checkout",".elementor-button--checkout",".xt_woofc-checkout",".fkcart-checkout--text"],"beginCheckout");jQuery(document).on("click init_checkout",o,()=>{jQuery(document).trigger("pmw:begin-checkout")}),jQuery(document).on("updated_cart_totals",()=>{jQuery(document).trigger("pmw:view-cart")}),jQuery(document).on("wpmLoad",e=>{jQuery(document).on("payment_method_selected",()=>{!1===wpm.paymentMethodSelected&&wpm.fireCheckoutProgress(3),wpm.fireCheckoutOption(3,jQuery("input[name='payment_method']:checked").val()),wpm.paymentMethodSelected=!0})}),jQuery(document).on("wpmLoad",()=>{try{wpm.initCart()}catch(e){console.error(e)}}),jQuery(document).on("wpmLoad",()=>{wpmDataLayer.products=wpmDataLayer.products||{};let e=wpm.getAddToCartLinkProductIds();wpm.getProductsFromBackend(e)}),jQuery(document).on("wpmLoad",()=>{if(!document.referrer)return;if(wpm.retrieveData("referrer"))return;let e=new URL(document.referrer).hostname;e!==window.location.host&&wpm.storeData("referrer",e)}),jQuery(document).on("wpmLoad",()=>{let e=wpm.getUrlParameter("gclid");e&&wpm.storeData("gclid",e);let t=wpm.getUrlParameter("wbraid");t&&wpm.storeData("wbraid",t);let r=wpm.getUrlParameter("gbraid");r&&wpm.storeData("gbraid",r);let a=wpm.getUrlParameter("fbclid");a&&(a="fb.1."+Math.floor(Date.now()/1e3)+"."+a,wpm.storeData("fbclid",a));let o=wpm.getUrlParameter("ttclid");o&&wpm.storeData("ttclid",o);let i=wpm.getUrlParameter("ScCid");i&&wpm.storeData("scid",i);let n=wpm.getUrlParameter("epik");n&&wpm.storeData("epik",n)}),jQuery(document).on("wpmLoad",()=>{try{if("undefined"!=typeof wpmDataLayer&&!wpmDataLayer?.pmw_loaded){if(jQuery(document).trigger("pmw:load-always"),wpmDataLayer?.shop)if("product"===wpmDataLayer.shop.page_type&&"variable"!==wpmDataLayer.shop.product_type&&wpm.getMainProductIdFromProductPage()){let e=wpm.getProductDataForViewItemEvent(wpm.getMainProductIdFromProductPage());jQuery(document).trigger("pmw:view-item",e)}else"product_category"===wpmDataLayer.shop.page_type?jQuery(document).trigger("pmw:view-category"):"search"===wpmDataLayer.shop.page_type?jQuery(document).trigger("pmw:search"):"cart"===wpmDataLayer.shop.page_type?jQuery(document).trigger("pmw:view-cart"):"order_received_page"===wpmDataLayer.shop.page_type?wpmDataLayer?.order&&!wpm.isOrderIdStored(wpmDataLayer.order.id)&&(jQuery(document).trigger("pmw:purchase"),wpm.writeOrderIdToStorage(wpmDataLayer.order.id,wpmDataLayer.order.key),"function"==typeof wpm.acrRemoveCookie&&wpm.acrRemoveCookie()):jQuery(document).trigger("pmw:everywhere-else");else jQuery(document).trigger("pmw:everywhere-else");wpmDataLayer?.user?.id&&!wpm.hasLoginEventFired()&&(jQuery(document).trigger("pmw:login"),wpm.setLoginEventFired()),wpmDataLayer.pmw_loaded=!0}}catch(e){console.error(e)}}),wpmDataLayer?.general?.lazy_load_pmw&&wpm.registerShowVariationEventListener(),jQuery(document).on("wpmLoad",()=>{if(wpmDataLayer?.general?.lazy_load_pmw)try{const e=jQuery(".variations_form");if(!e.length)return;const t={};if(!e.find("select").toArray().every(e=>{const r=jQuery(e).val();return!!r&&(t[jQuery(e).attr("name")]=r,!0)}))return;const r=e.data("product_variations");if(!r)return;const a=r.find(e=>Object.entries(t).every(([t,r])=>e.attributes[t]===r));a&&wpm.triggerViewItemEventPrep(a.variation_id)}catch(e){pmw.console.error(e)}}),jQuery(document).on("wpmLoad",async()=>{!1===wpm.retrieveData("restEndpointAvailable")&&pmw.console.error("REST endpoint is not available. Using admin-ajax.php instead.")}),jQuery(document).on("pmw:page-view",e=>{pmw.console.log("pmw:page-view event fired",{event:e});let t={event:"page_view",pixels:{}};if(wpmDataLayer?.pixels?.facebook?.loaded&&(t.pixels.facebook={event_name:"PageView",event_id:wpm.getFbRandomEventId(),user_data:wpm.getFbUserData(),event_source_url:window.location.href},wpm.retrieveData("referrer")&&(t.pixels.facebook.referrer_url=wpm.makeFullUrl(wpm.retrieveData("referrer")))),wpmDataLayer?.pixels?.reddit?.loaded){const e=wpm.getRedditS2SBaseData();t.pixels.reddit={...e,event_id:wpm.getRandomEventId(),event_type:{tracking_type:"PageVisit"},event_metadata:{conversion_id:wpm.getRandomEventId()}}}if(wpmDataLayer?.pixels?.snapchat?.loaded&&(t.pixels.snapchat=wpm.getSnapchatS2SBaseData(),t.pixels.snapchat.event_name="PAGE_VIEW"),jQuery(document).trigger("pmw:s2s:page-view",t),wpmDataLayer?.general?.server_2_server?.pageview_event_s2s?.is_active){const e=wpm.extractS2SData(t);Object.keys(e).length>1&&wpm.sendEventPayloadToServer(e)}}),jQuery(document).on("pmw:add-to-cart",async(e,t)=>{pmw.console.log("pmw:add-to-cart event fired",{event:e,product:t}),await wpm.processEvent("add_to_cart",{product:t})}),jQuery(document).on("pmw:remove-from-cart",async(e,t)=>{pmw.console.log("pmw:remove-from-cart event fired",{event:e,product:t}),await wpm.processEvent("remove_from_cart",{product:t})}),jQuery(document).on("pmw:select-item",async(e,t)=>{pmw.console.log("pmw:select-item event fired",{event:e,product:t}),await wpm.processEvent("select_item",{product:t})}),jQuery(document).on("pmw:begin-checkout",e=>{pmw.console.log("pmw:begin-checkout event fired",{event:e}),wpm.processEvent("begin_checkout",{})}),jQuery(document).on("pmw:add-payment-info",e=>{pmw.console.log("pmw:add-payment-info event fired",{event:e}),wpm.processEvent("add_payment_info",{})}),jQuery(document).on("pmw:add-to-wishlist",(e,t)=>{pmw.console.log("pmw:add-to-wishlist event fired",{event:e,product:t});let r={event:"add_to_wishlist",product:t,pixels:{}};wpmDataLayer?.pixels?.facebook?.loaded&&(r.pixels.facebook={event_name:"AddToWishlist",event_id:wpm.getFbRandomEventId(),user_data:wpm.getFbUserData(),event_source_url:window.location.href,custom_data:wpm.fbGetProductDataForCapiEvent(t)},wpm.retrieveData("referrer")&&(r.pixels.facebook.referrer_url=wpm.makeFullUrl(wpm.retrieveData("referrer")))),wpmDataLayer?.pixels?.tiktok?.loaded&&(r.pixels.tiktok={event:"AddToWishlist",event_id:wpm.getRandomEventId(),user:wpm.tiktokGetEventUserData(),page:wpm.tiktokGetEventPageData(),properties:{value:t.price*t.quantity,currency:t.currency,content_type:"product",contents:[{content_id:wpm.getProductIdForSpecificPixel(t,"tiktok"),content_name:t.name,quantity:t.quantity,price:t.price}]}}),wpmDataLayer?.pixels?.snapchat?.loaded&&(r.pixels.snapchat=wpm.getSnapchatS2SBaseData(),r.pixels.snapchat.event_name="ADD_TO_WISHLIST",r.pixels.snapchat.custom_data=wpm.getSnapchatCustomDataForProduct(t)),jQuery(document).trigger("pmw:s2s:add-to-wishlist",r),wpm.sendEventPayloadToServer(r)}),jQuery(document).on("pmw:view-item",(e,t=null)=>{pmw.console.log("pmw:view-item event fired",{event:e,product:t}),wpm.processEvent("view_item",{product:t})}),jQuery(document).on("pmw:view-category",(e,t=null)=>{pmw.console.log("pmw:view-category event fired",{event:e,product:t});let r={event:"view_category",pixels:{}};wpmDataLayer?.pixels?.pinterest?.loaded&&(r.pixels.pinterest=wpm.getPinterestS2SBaseData(),r.pixels.pinterest.event_name="viewcategory"),jQuery(document).trigger("pmw:s2s:view-category",r),wpm.sendEventPayloadToServer(r)}),jQuery(document).on("pmw:search",e=>{pmw.console.log("pmw:search event fired",{event:e}),wpm.processEvent("search",{})}),jQuery(document).on("pmw:place-order",e=>{pmw.console.log("pmw:place-order event fired",{event:e});let t={event:"place_order",pixels:{}};wpmDataLayer?.pixels?.tiktok?.loaded&&(t.pixels.tiktok={event:"PlaceAnOrder",event_id:wpm.getRandomEventId(),user:wpm.tiktokGetEventUserData(),page:wpm.tiktokGetEventPageData(),properties:wpm.tiktokGetPropertiesFromCart()}),jQuery(document).trigger("pmw:s2s:place-order",t),wpm.sendEventPayloadToServer(t)}),jQuery(document).on("pmw:purchase",async e=>{pmw.console.log("pmw:purchase event fired",{event:e}),await wpm.processEvent("purchase",{order:wpmDataLayer.order})}),jQuery(document).on("pmw:login",()=>{pmw.console.log("pmw:login event fired");let e={event:"login",pixels:{}};wpmDataLayer?.pixels?.snapchat?.loaded&&(e.pixels.snapchat=wpm.getSnapchatS2SBaseData(),e.pixels.snapchat.event_name="LOGIN"),jQuery(document).trigger("pmw:s2s:login",e),wpm.sendEventPayloadToServer(e)}),jQuery(document).on("pmw:ready",async()=>{wpm.isWooCommerceActive()&&(wpm.startIntersectionObserverToWatch(),wpm.startProductsMutationObserverToWatch())}),jQuery(document).on("pmw:load-pixels",()=>{wpm.waitForPixelsAndTriggerPageView()})},256:()=>{!function(e){e.pixelRegistry={getActivePixels(){const t=[];if(!e.pixelCapabilities)return t;for(const[r,a]of Object.entries(e.pixelCapabilities))if("function"==typeof a.isActive)try{a.isActive()&&t.push(r)}catch(e){pmw.console.error(`Error checking if ${r} is active:`,e)}return t},getActiveBrowserOnlyPixels(){const t=[],r=this.getActivePixels();for(const a of r)!0!==e.pixelCapabilities?.[a]?.supportsS2S&&t.push(a);return t},getActiveS2SPixels(){const t=[],r=this.getActivePixels();for(const a of r)!0===e.pixelCapabilities?.[a]?.supportsS2S&&t.push(a);return t},getAdapter:t=>e.adapters&&e.adapters[t]||null}}(window.wpm=window.wpm||{},jQuery)},263:(e,t,r)=>{!function(e){e.jQueryExists=async()=>new Promise(e=>{!function t(){if("undefined"!=typeof jQuery)return e();setTimeout(t,100)}()}),e.waitForLibrary=(e,t=5e3,r=100)=>{const a=Date.now();for(;void 0===window[e]&&!(Date.now()-a>t);)setTimeout(()=>{},r)},e.wpmDataLayerFullyLoaded=async()=>{let e=new Promise(e=>{!function t(){if("undefined"!=typeof wpmDataLayer&&void 0!==wpmDataLayer.version)return e();setTimeout(t,100)}()}),t=setTimeout(()=>{console.error("Pixel Manager error: The wpmDataLayer is not defined. Please make sure that the wpmDataLayer script snippet is inserted and not modified by any third-party plugin, such as a consent management platform or a JavaScript optimizer.")},6e3);return e.then(()=>{clearTimeout(t)}),e},e.wpHooksExists=async()=>new Promise(e=>{!function t(){if("undefined"!=typeof wp&&void 0!==wp.hooks)return e();setTimeout(t,50)}()}),e.loadWcHooksFunctions=async()=>{await e.wpHooksExists(),await r.e(194).then(r.t.bind(r,489,23))}}(window.wpm=window.wpm||{},jQuery)},510:()=>{!function(e){window.pmw=window.pmw||{},pmw.hooks={filters:{},addFilter:function(e,t,r,a=10){e&&"string"==typeof e?t&&"string"==typeof t?"function"==typeof r?(this.filters[e]||(this.filters[e]=[]),this.filters[e].push({namespace:t,callback:r,priority:a}),this.filters[e].sort((e,t)=>e.priority-t.priority),pmw.console.log(`Filter added: ${e} (${t}) with priority ${a}`)):pmw.console.error("Invalid callback provided to addFilter"):pmw.console.error("Invalid namespace provided to addFilter"):pmw.console.error("Invalid hook name provided to addFilter")},applyFilters:function(e,t,...r){if(!this.filters[e]||0===this.filters[e].length)return t;let a=t;for(const t of this.filters[e])try{const o=t.callback(a,...r);undefined!==o?a=o:pmw.console.warn(`Filter ${t.namespace} on ${e} returned undefined, keeping previous value`)}catch(r){pmw.console.error(`Filter error in ${t.namespace} on ${e}:`,r)}return a},removeFilter:function(e,t){if(!this.filters[e])return;const r=this.filters[e].length;this.filters[e]=this.filters[e].filter(e=>e.namespace!==t),this.filters[e].length<r&&pmw.console.log(`Filter removed: ${e} (${t})`)},removeAllFilters:function(e){this.filters[e]&&(delete this.filters[e],pmw.console.log(`All filters removed for: ${e}`))},hasFilter:function(e,t=null){return!(!this.filters[e]||0===this.filters[e].length)&&(!t||this.filters[e].some(e=>e.namespace===t))},getFilters:function(e){return this.filters[e]||[]}},e.hooks=pmw.hooks}(window.wpm=window.wpm||{},jQuery)},547:()=>{!function(e){e.getLibraryVersion=()=>"1.52.0",e.checkLibraryVersion=()=>{e.getLibraryVersion()!==wpmDataLayer?.version?.number&&console.error(`Pixel Manager: The library version ${e.getLibraryVersion()} and wpmDataLayer.version.number ${wpmDataLayer.version.number} do not match. Delete the server-side cache and try again.`)}}(window.wpm=window.wpm||{},jQuery)},616:(e,t,r)=>{!function(e,t,a){const{isRange:o,isIP:i,isV4:n,isV6:s,version:c}=r(723),p={cloudflare:{any:"https://www.cloudflare.com/cdn-cgi/trace"},icanhazip:{4:"https://ipv4.icanhazip.com",6:"https://ipv6.icanhazip.com",any:"https://icanhazip.com"},ipinfo:{any:"https://ipinfo.io/ip"},myexternalip:{any:"https://myexternalip.com/raw"},ipify:{4:"https://api4.ipify.org",6:"https://api6.ipify.org",any:"https://api64.ipify.org"}};e.getGeoInfo={cloudflare:async()=>{const e=await fetch("https://www.cloudflare.com/cdn-cgi/trace");if(!e.ok)throw new Error(`The response from Cloudflare was not OK. Status: ${e.status}`);let t=await e.text();if(!t)throw new Error("No data was returned from Cloudflare");if(t=t.trim().split("\n").reduce((e,t)=>(e[(t=t.split("="))[0]]=t[1],e),{}),!t.ip||!t.loc)throw new Error("The JSON data is missing the ip or loc key from Cloudflare");if(d(t.loc))throw new Error("We have to validate the region, and this service is not returning the region.");return{ip:t.ip,countryCode:t.loc,service:"cloudflare"}},geojs:async()=>{const e=await fetch("https://get.geojs.io/v1/ip/geo.json");if(!e.ok)throw new Error(`The response from geojs was not OK. Status: ${e.status}`);let t=await e.json();if(!t)throw new Error("No JSON data was returned from geojs");if(!t.ip||!t.country_code||!t.region)throw new Error("The JSON data is missing the ip, country_code, or region key from geojs");return{ip:t.ip,countryCode:t.country_code,region:t.region,service:"geojs"}},ipinfo:async()=>{const e=await fetch("https://ipinfo.io/json");if(!e.ok)throw new Error(`The response from ipinfo was not OK from ipinfo. Status: ${e.status}`);let t=await e.json();if(!t)throw new Error("No JSON data was returned from ipinfo");if(!t.ip||!t.country||!t.region)throw new Error("The JSON data is missing the ip, country, or region key from ipinfo");return{ip:t.ip,countryCode:t.country,region:t.region,service:"ipinfo"}},ipapi:async()=>{const e=await fetch("https://ipapi.co/json");if(!e.ok)throw new Error(`The response from ipapi was not OK. Status: ${e.status}`);let t=await e.json();if(!t)throw new Error("No JSON data was returned from ipapi");if(!t.ip||!t.country||!t.region)throw new Error("The JSON data is missing the ip, country, or region key from ipapi");return{ip:t.ip,countryCode:t.country,region:t.region,service:"ipapi"}}};const d=e=>{if("US "!==e)return!1;return["US-CA","US-VA"].some(e=>wpmDataLayer?.general?.consent_management.restricted_regions.includes(e))};e.isVisitorAllowed=async()=>{if(null!==e.retrieveData("visitorAllowed")&&e.retrieveData("visitorAllowed")!==a)return!!JSON.parse(e.retrieveData("visitorAllowed"));if(u())return e.storeData("visitorAllowed",!1),!1;if(Array.isArray(wpmDataLayer?.general?.server_2_server?.ip_exclude_list)&&wpmDataLayer.general.server_2_server.ip_exclude_list.length>0){const t=await e.getIp();if(w(t))return e.storeData("visitorAllowed",!1),!1}return e.storeData("visitorAllowed",!0),!0},e.getIp=async(t="any",r=3)=>{const o=["any","4","6"];if(!o.includes(t))return console.error("The version argument must be one of the following: "+o.join(", ")),null;if("any"===t&&e.retrieveData("ip"))return e.retrieveData("ip");const i=e.retrieveData(`ipv${t}`);if(i!==a)return i;pmw.console.log("Testing the IP address of the browser because one ore more server-to-server APIs are enabled and require the browser IP. It may trigger connection request errors in the console while testing the IP address. This is normal and expected behavior.");try{const a=await e.getIpFromAnyService(t,r);return"any"===t&&e.storeData("ip",a),(4===c(a)||"4"===t&&null===a)&&e.storeData("ipv4",a),(6===c(a)||"6"===t&&null===a)&&e.storeData("ipv6",a),a}catch(e){return null}},e.getBrowserGeoFromExternalService=async()=>{const t=performance.now();let r=[];Object.keys(e.getGeoInfo).forEach(t=>{r.push(e.getGeoInfo[t]())});try{const e=await Promise.any(r);return e.countryCode=e.countryCode.toUpperCase(),e.region&&"California"===e.region&&(e.regionCode="US-CA"),e.region&&"Virginia"===e.region&&(e.regionCode="US-VA"),pmw.console.log("Retrieved the browser geo info from an external service: ",e," which took ",(performance.now()-t).toFixed(2)+" ms"),e}catch(e){return pmw.console.error("error: ",e),null}};e.getBrowserGeo=async()=>{let t={};if(e.retrieveData("geoCountryCode")&&(t.countryCode=e.retrieveData("geoCountryCode")),e.retrieveData("geoRegionCode")&&(t.regionCode=e.retrieveData("geoRegionCode")),e.retrieveData("geoRegion")&&(t.region=e.retrieveData("geoRegion")),t.countryCode)return pmw.console.log("Retrieved the browser geo location from the cache: ",t),t;let a=await e.getBrowserGeoFromExternalService();if(!a){const e=(()=>{const e=r(179).getLocationByTimeZone();return e.countryCode?e:null})();a={},e&&pmw.console.log("Retrieved the browser geo location from the timezone: ",e),e.countryCode&&(a.countryCode=e.countryCode),e.regionCode&&(a.regionCode=e.regionCode)}return a?.ip&&e.storeData("ip",a.ip),a?.countryCode&&e.storeData("geoCountryCode",a.countryCode),a?.regionCode&&e.storeData("geoRegionCode",a.regionCode),a?.region&&e.storeData("geoRegion",a.region),a?.countryCode?a:null},e.getIpFromAnyService=async(t="any",r=3)=>{const a=performance.now(),o=Object.keys(p).filter(e=>p[e][t]).slice(0,r).reduce((e,t)=>(e[t]=p[t],e),{});let i=[];if(Object.keys(o).forEach(r=>{o[r][t]&&i.push(e.getIpFromService(r,t))}),!(i.length>0))return pmw.console.log("No promises to resolve"),null;try{const e=await Promise.any(i),t=(performance.now()-a).toFixed(2);return pmw.console.log(`Retrieved the IP address ${e.ip} from ${e.service} which took ${t} ms`),e.ip}catch(e){return pmw.console.log(`Could not retrieve an IP with version ${t} from any of the services.`),null}},e.getIpFromService=async(e,t="any")=>{try{let r={ip:null,service:e,ipVersion:t};if(!p[e][t])return Promise.reject(new Error(`The IP version ${t} is not available for the service ${e}`));pmw.console.log(`Fetching IP from ${e} using IP version ${t}`);const a=await fetch(p[e][t]);if(!a.ok)return Promise.reject(new Error(`The response from ${e} was not OK. Status: ${a.status}`));let o=await a.text();return"cloudflare"===e?(o=o.trim().split("\n").reduce((e,t)=>(e[(t=t.split("="))[0]]=t[1],e),{}),r.ip=o.ip):r.ip=o.trim(),i(r.ip)?r:Promise.reject(new Error(`The returned value from ${e} is not an IP address`))}catch(e){return Promise.reject(e)}};e.isVisitorNotAllowed=async()=>!1===await e.isVisitorAllowed();const u=()=>{const e=navigator.userAgent||"";if(!e)return!0;const t=l();for(const r of t)if(e.toLowerCase().includes(r.toLowerCase()))return!0;return!1},l=()=>{let e=[];Array.isArray(wpmDataLayer?.general?.server_2_server?.user_agent_exclude_patterns)&&(e=wpmDataLayer.general.server_2_server.user_agent_exclude_patterns);return["Googlebot","Google-InspectionTool","Google-Extended","Storebot-Google","bingbot","BingPreview","msnbot","Slurp","DuckDuckBot","Baiduspider","YandexBot","Sogou","facebookexternalhit","FacebookBot","LinkedInBot","Twitterbot","PinterestBot","TikTokBot","SnapchatAds","DiscordBot","InstagramBot","WhatsApp","AhrefsBot","SemrushBot","MJ12bot","DotBot","rogerbot","UptimeRobot","Pingdom","StatusCake","GTmetrix","ClaudeBot","GPTBot","ChatGPT","anthropic-ai","CCBot","PerplexityBot","crawler","spider","scraper","bot/","/bot","bot-"].concat(e)},m=e=>e.includes("/"),w=e=>{const t=wpmDataLayer?.general?.server_2_server?.ip_exclude_list||[];for(const r of t)if(m(r)){if(isInSubnet.isInSubnet(e,r))return!0}else if(e===r)return!0;return!1}}(window.wpm=window.wpm||{},jQuery)},722:()=>{const e=wpm.prepareSelectors([".add_to_cart_button:not(.product_type_variable)",".ajax_add_to_cart",".single_add_to_cart_button"],"addToCart");jQuery(e).on("click adding_to_cart",(e,t)=>{try{let t=e?.target?.dataset?.quantity?e.target.dataset.quantity:null,r=e?.target?.dataset?.product_id?e.target.dataset.product_id:e?.target?.value?e.target.value:null;if("product"===wpmDataLayer.shop.page_type){if(void 0!==jQuery(e.currentTarget).attr("href")&&jQuery(e.currentTarget).attr("href").includes("add-to-cart"))return r||(r=jQuery(e.currentTarget).data("product_id")),void wpm.addProductToCart(r,1);if("simple"===wpmDataLayer.shop.product_type)return null===t&&(t=Number(jQuery(".input-text.qty").val())?Number(jQuery(".input-text.qty").val()):1),r||(r=jQuery(e.currentTarget).val()),r||(r=jQuery(".product").attr("id").replace("product-","")),void wpm.addProductToCart(r,t);if(["variable","variable-subscription"].indexOf(wpmDataLayer.shop.product_type)>=0)return null===t&&(t=Number(jQuery(".input-text.qty").val())?Number(jQuery(".input-text.qty").val()):1),r||(r=jQuery("[name='variation_id']").val()),void wpm.addProductToCart(r,t);if("grouped"===wpmDataLayer.shop.product_type)return void jQuery(".woocommerce-grouped-product-list-item").each((e,a)=>{t=Number(jQuery(a).find(".input-text.qty").val())?Number(jQuery(a).find(".input-text.qty").val()):1;let o=jQuery(a).attr("class");r=wpm.getPostIdFromString(o),wpm.addProductToCart(r,t)});if("bundle"===wpmDataLayer.shop.product_type)return null===t&&(t=Number(jQuery(".input-text.qty").val())?Number(jQuery(".input-text.qty").val()):1),r||(r=jQuery("input[name=add-to-cart]").val()),void wpm.addProductToCart(r,t);null===t&&(t=Number(jQuery(".input-text.qty").val())?Number(jQuery(".input-text.qty").val()):1),wpm.addProductToCart(r,t)}else null===t&&(t=1),r||(r=jQuery(e.currentTarget).data("product_id")?jQuery(e.currentTarget).data("product_id"):null),r||(r=jQuery(e.currentTarget).val()?jQuery(e.currentTarget).val():null),r&&t&&wpm.addProductToCart(r,t)}catch(e){console.error(e)}}),jQuery("a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)").one("click",e=>{try{if(jQuery(e.target).closest("a").attr("href")){let t=new URL(jQuery(e.currentTarget).attr("href"),window.location.origin);if(t.searchParams.has("add-to-cart")){let e=t.searchParams.get("add-to-cart"),r=t.searchParams.has("quantity")?parseInt(t.searchParams.get("quantity"),10):1;wpm.addProductToCart(e,r)}}}catch(e){console.error(e)}}),jQuery(".woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product").on("click",e=>{try{let t=jQuery(e.currentTarget).nextAll(".wpmProductId:first").data("id");if(t){if(t=wpm.getIdBasedOndVariationsOutputSetting(t),!t)throw Error("Wasn't able to retrieve a productId");if(wpmDataLayer.products&&wpmDataLayer.products[t]){let e=wpm.getProductDetailsFormattedForEvent(t);jQuery(document).trigger("pmw:select-item",e)}}}catch(e){console.error(e)}}),jQuery("#billing_email").on("input",e=>{wpm.isEmail(jQuery(e.currentTarget).val())&&(wpm.fireCheckoutProgress(2),wpm.emailSelected=!0)}),jQuery("form.checkout").on("checkout_place_order_success",()=>{!1===wpm.emailSelected&&wpm.fireCheckoutProgress(2),!1===wpm.paymentMethodSelected&&(wpm.fireCheckoutProgress(3),wpm.fireCheckoutOption(3,jQuery("input[name='payment_method']:checked").val())),wpm.fireCheckoutProgress(4),jQuery(document).trigger("pmw:place-order",{})}),jQuery(document).on("click","[name='update_cart']",()=>{try{jQuery(".cart_item").each((e,t)=>{const r=wpm.getProductIdByCartItemElement(t);if(!r)return void console.error("Pixel Manager: Wasn't able to retrieve a productId");const a=wpm.getProductQuantityByCartItemElement(t);a?0===a?wpm.removeProductFromCart(r):a<wpmDataLayer.cart[r].quantity?wpm.removeProductFromCart(r,wpmDataLayer.cart[r].quantity-a):a>wpmDataLayer.cart[r].quantity&&wpm.addProductToCart(r,a-wpmDataLayer.cart[r].quantity):console.error("Pixel Manager: Wasn't able to retrieve a quantity")})}catch(e){console.error(e),wpm.getCartItemsFromBackend()}}),jQuery(".add_to_wishlist,.wl-add-to").on("click",e=>{try{let t;if(jQuery(e.currentTarget).data("productid")?t=jQuery(e.currentTarget).data("productid"):jQuery(e.currentTarget).data("product-id")&&(t=jQuery(e.currentTarget).data("product-id")),!t)throw Error("Wasn't able to retrieve a productId");let r=wpm.getProductDetailsFormattedForEvent(t);jQuery(document).trigger("pmw:add-to-wishlist",r)}catch(e){console.error(e)}}),wpmDataLayer?.general?.lazy_load_pmw||wpm.registerShowVariationEventListener()},723:(e,t,r)=>{"use strict";r.r(t),r.d(t,{displayIP:()=>w,inRange:()=>l,isIP:()=>s,isRange:()=>u,isV4:()=>p,isV6:()=>d,searchIP:()=>m,storeIP:()=>m,version:()=>c});var a="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==r.g?r.g:"undefined"!=typeof self?self:{};function o(e,t){return e(t={exports:{}},t.exports),t.exports}var i=o(function(e){(function(){var t,r,a,o,i,n,s,c;r={},null!==e&&e.exports?e.exports=r:this.ipaddr=r,s=function(e,t,r,a){var o,i;if(e.length!==t.length)throw new Error("ipaddr: cannot match CIDR for objects with different lengths");for(o=0;a>0;){if((i=r-a)<0&&(i=0),e[o]>>i!==t[o]>>i)return!1;a-=r,o+=1}return!0},r.subnetMatch=function(e,t,r){var a,o,i,n,s;for(i in null==r&&(r="unicast"),t)for(!(n=t[i])[0]||n[0]instanceof Array||(n=[n]),a=0,o=n.length;a<o;a++)if(s=n[a],e.kind()===s[0].kind()&&e.match.apply(e,s))return i;return r},r.IPv4=function(){function e(e){var t,r,a;if(4!==e.length)throw new Error("ipaddr: ipv4 octet count should be 4");for(t=0,r=e.length;t<r;t++)if(!(0<=(a=e[t])&&a<=255))throw new Error("ipaddr: ipv4 octet should fit in 8 bits");this.octets=e}return e.prototype.kind=function(){return"ipv4"},e.prototype.toString=function(){return this.octets.join(".")},e.prototype.toNormalizedString=function(){return this.toString()},e.prototype.toByteArray=function(){return this.octets.slice(0)},e.prototype.match=function(e,t){var r;if(void 0===t&&(e=(r=e)[0],t=r[1]),"ipv4"!==e.kind())throw new Error("ipaddr: cannot match ipv4 address with non-ipv4 one");return s(this.octets,e.octets,8,t)},e.prototype.SpecialRanges={unspecified:[[new e([0,0,0,0]),8]],broadcast:[[new e([255,255,255,255]),32]],multicast:[[new e([224,0,0,0]),4]],linkLocal:[[new e([169,254,0,0]),16]],loopback:[[new e([127,0,0,0]),8]],carrierGradeNat:[[new e([100,64,0,0]),10]],private:[[new e([10,0,0,0]),8],[new e([172,16,0,0]),12],[new e([192,168,0,0]),16]],reserved:[[new e([192,0,0,0]),24],[new e([192,0,2,0]),24],[new e([192,88,99,0]),24],[new e([198,51,100,0]),24],[new e([203,0,113,0]),24],[new e([240,0,0,0]),4]]},e.prototype.range=function(){return r.subnetMatch(this,this.SpecialRanges)},e.prototype.toIPv4MappedAddress=function(){return r.IPv6.parse("::ffff:"+this.toString())},e.prototype.prefixLengthFromSubnetMask=function(){var e,t,r,a,o,i,n;for(n={0:8,128:7,192:6,224:5,240:4,248:3,252:2,254:1,255:0},e=0,o=!1,t=r=3;r>=0;t=r+=-1){if(!((a=this.octets[t])in n))return null;if(i=n[a],o&&0!==i)return null;8!==i&&(o=!0),e+=i}return 32-e},e}(),a="(0?\\d+|0x[a-f0-9]+)",o={fourOctet:new RegExp("^"+a+"\\."+a+"\\."+a+"\\."+a+"$","i"),longValue:new RegExp("^"+a+"$","i")},r.IPv4.parser=function(e){var t,r,a,i,n;if(r=function(e){return"0"===e[0]&&"x"!==e[1]?parseInt(e,8):parseInt(e)},t=e.match(o.fourOctet))return function(){var e,o,i,n;for(n=[],e=0,o=(i=t.slice(1,6)).length;e<o;e++)a=i[e],n.push(r(a));return n}();if(t=e.match(o.longValue)){if((n=r(t[1]))>4294967295||n<0)throw new Error("ipaddr: address outside defined range");return function(){var e,t;for(t=[],i=e=0;e<=24;i=e+=8)t.push(n>>i&255);return t}().reverse()}return null},r.IPv6=function(){function e(e,t){var r,a,o,i,n,s;if(16===e.length)for(this.parts=[],r=a=0;a<=14;r=a+=2)this.parts.push(e[r]<<8|e[r+1]);else{if(8!==e.length)throw new Error("ipaddr: ipv6 part count should be 8 or 16");this.parts=e}for(o=0,i=(s=this.parts).length;o<i;o++)if(!(0<=(n=s[o])&&n<=65535))throw new Error("ipaddr: ipv6 part should fit in 16 bits");t&&(this.zoneId=t)}return e.prototype.kind=function(){return"ipv6"},e.prototype.toString=function(){return this.toNormalizedString().replace(/((^|:)(0(:|$))+)/,"::")},e.prototype.toRFC5952String=function(){var e,t,r,a,o;for(a=/((^|:)(0(:|$)){2,})/g,o=this.toNormalizedString(),e=0,t=-1;r=a.exec(o);)r[0].length>t&&(e=r.index,t=r[0].length);return t<0?o:o.substring(0,e)+"::"+o.substring(e+t)},e.prototype.toByteArray=function(){var e,t,r,a,o;for(e=[],t=0,r=(o=this.parts).length;t<r;t++)a=o[t],e.push(a>>8),e.push(255&a);return e},e.prototype.toNormalizedString=function(){var e,t,r;return e=function(){var e,r,a,o;for(o=[],e=0,r=(a=this.parts).length;e<r;e++)t=a[e],o.push(t.toString(16));return o}.call(this).join(":"),r="",this.zoneId&&(r="%"+this.zoneId),e+r},e.prototype.toFixedLengthString=function(){var e,t,r;return e=function(){var e,r,a,o;for(o=[],e=0,r=(a=this.parts).length;e<r;e++)t=a[e],o.push(t.toString(16).padStart(4,"0"));return o}.call(this).join(":"),r="",this.zoneId&&(r="%"+this.zoneId),e+r},e.prototype.match=function(e,t){var r;if(void 0===t&&(e=(r=e)[0],t=r[1]),"ipv6"!==e.kind())throw new Error("ipaddr: cannot match ipv6 address with non-ipv6 one");return s(this.parts,e.parts,16,t)},e.prototype.SpecialRanges={unspecified:[new e([0,0,0,0,0,0,0,0]),128],linkLocal:[new e([65152,0,0,0,0,0,0,0]),10],multicast:[new e([65280,0,0,0,0,0,0,0]),8],loopback:[new e([0,0,0,0,0,0,0,1]),128],uniqueLocal:[new e([64512,0,0,0,0,0,0,0]),7],ipv4Mapped:[new e([0,0,0,0,0,65535,0,0]),96],rfc6145:[new e([0,0,0,0,65535,0,0,0]),96],rfc6052:[new e([100,65435,0,0,0,0,0,0]),96],"6to4":[new e([8194,0,0,0,0,0,0,0]),16],teredo:[new e([8193,0,0,0,0,0,0,0]),32],reserved:[[new e([8193,3512,0,0,0,0,0,0]),32]]},e.prototype.range=function(){return r.subnetMatch(this,this.SpecialRanges)},e.prototype.isIPv4MappedAddress=function(){return"ipv4Mapped"===this.range()},e.prototype.toIPv4Address=function(){var e,t,a;if(!this.isIPv4MappedAddress())throw new Error("ipaddr: trying to convert a generic ipv6 address to ipv4");return e=(a=this.parts.slice(-2))[0],t=a[1],new r.IPv4([e>>8,255&e,t>>8,255&t])},e.prototype.prefixLengthFromSubnetMask=function(){var e,t,r,a,o,i,n;for(n={0:16,32768:15,49152:14,57344:13,61440:12,63488:11,64512:10,65024:9,65280:8,65408:7,65472:6,65504:5,65520:4,65528:3,65532:2,65534:1,65535:0},e=0,o=!1,t=r=7;r>=0;t=r+=-1){if(!((a=this.parts[t])in n))return null;if(i=n[a],o&&0!==i)return null;16!==i&&(o=!0),e+=i}return 128-e},e}(),i="(?:[0-9a-f]+::?)+",c="%[0-9a-z]{1,}",n={zoneIndex:new RegExp(c,"i"),native:new RegExp("^(::)?("+i+")?([0-9a-f]+)?(::)?("+c+")?$","i"),transitional:new RegExp("^((?:"+i+")|(?:::)(?:"+i+")?)"+a+"\\."+a+"\\."+a+"\\."+a+"("+c+")?$","i")},t=function(e,t){var r,a,o,i,s,c;if(e.indexOf("::")!==e.lastIndexOf("::"))return null;for((c=(e.match(n.zoneIndex)||[])[0])&&(c=c.substring(1),e=e.replace(/%.+$/,"")),r=0,a=-1;(a=e.indexOf(":",a+1))>=0;)r++;if("::"===e.substr(0,2)&&r--,"::"===e.substr(-2,2)&&r--,r>t)return null;for(s=t-r,i=":";s--;)i+="0:";return":"===(e=e.replace("::",i))[0]&&(e=e.slice(1)),":"===e[e.length-1]&&(e=e.slice(0,-1)),{parts:t=function(){var t,r,a,i;for(i=[],t=0,r=(a=e.split(":")).length;t<r;t++)o=a[t],i.push(parseInt(o,16));return i}(),zoneId:c}},r.IPv6.parser=function(e){var r,a,o,i,s,c,p;if(n.native.test(e))return t(e,8);if((i=e.match(n.transitional))&&(p=i[6]||"",(r=t(i[1].slice(0,-1)+p,6)).parts)){for(a=0,o=(c=[parseInt(i[2]),parseInt(i[3]),parseInt(i[4]),parseInt(i[5])]).length;a<o;a++)if(!(0<=(s=c[a])&&s<=255))return null;return r.parts.push(c[0]<<8|c[1]),r.parts.push(c[2]<<8|c[3]),{parts:r.parts,zoneId:r.zoneId}}return null},r.IPv4.isIPv4=r.IPv6.isIPv6=function(e){return null!==this.parser(e)},r.IPv4.isValid=function(e){try{return new this(this.parser(e)),!0}catch(e){return!1}},r.IPv4.isValidFourPartDecimal=function(e){return!(!r.IPv4.isValid(e)||!e.match(/^(0|[1-9]\d*)(\.(0|[1-9]\d*)){3}$/))},r.IPv6.isValid=function(e){var t;if("string"==typeof e&&-1===e.indexOf(":"))return!1;try{return new this((t=this.parser(e)).parts,t.zoneId),!0}catch(e){return!1}},r.IPv4.parse=function(e){var t;if(null===(t=this.parser(e)))throw new Error("ipaddr: string is not formatted like ip address");return new this(t)},r.IPv6.parse=function(e){var t;if(null===(t=this.parser(e)).parts)throw new Error("ipaddr: string is not formatted like ip address");return new this(t.parts,t.zoneId)},r.IPv4.parseCIDR=function(e){var t,r,a;if((r=e.match(/^(.+)\/(\d+)$/))&&(t=parseInt(r[2]))>=0&&t<=32)return a=[this.parse(r[1]),t],Object.defineProperty(a,"toString",{value:function(){return this.join("/")}}),a;throw new Error("ipaddr: string is not formatted like an IPv4 CIDR range")},r.IPv4.subnetMaskFromPrefixLength=function(e){var t,r,a;if((e=parseInt(e))<0||e>32)throw new Error("ipaddr: invalid IPv4 prefix length");for(a=[0,0,0,0],r=0,t=Math.floor(e/8);r<t;)a[r]=255,r++;return t<4&&(a[t]=Math.pow(2,e%8)-1<<8-e%8),new this(a)},r.IPv4.broadcastAddressFromCIDR=function(e){var t,r,a,o,i;try{for(a=(t=this.parseCIDR(e))[0].toByteArray(),i=this.subnetMaskFromPrefixLength(t[1]).toByteArray(),o=[],r=0;r<4;)o.push(parseInt(a[r],10)|255^parseInt(i[r],10)),r++;return new this(o)}catch(e){throw new Error("ipaddr: the address does not have IPv4 CIDR format")}},r.IPv4.networkAddressFromCIDR=function(e){var t,r,a,o,i;try{for(a=(t=this.parseCIDR(e))[0].toByteArray(),i=this.subnetMaskFromPrefixLength(t[1]).toByteArray(),o=[],r=0;r<4;)o.push(parseInt(a[r],10)&parseInt(i[r],10)),r++;return new this(o)}catch(e){throw new Error("ipaddr: the address does not have IPv4 CIDR format")}},r.IPv6.parseCIDR=function(e){var t,r,a;if((r=e.match(/^(.+)\/(\d+)$/))&&(t=parseInt(r[2]))>=0&&t<=128)return a=[this.parse(r[1]),t],Object.defineProperty(a,"toString",{value:function(){return this.join("/")}}),a;throw new Error("ipaddr: string is not formatted like an IPv6 CIDR range")},r.isValid=function(e){return r.IPv6.isValid(e)||r.IPv4.isValid(e)},r.parse=function(e){if(r.IPv6.isValid(e))return r.IPv6.parse(e);if(r.IPv4.isValid(e))return r.IPv4.parse(e);throw new Error("ipaddr: the address has neither IPv6 nor IPv4 format")},r.parseCIDR=function(e){try{return r.IPv6.parseCIDR(e)}catch(t){try{return r.IPv4.parseCIDR(e)}catch(e){throw new Error("ipaddr: the address has neither IPv6 nor IPv4 CIDR format")}}},r.fromByteArray=function(e){var t;if(4===(t=e.length))return new r.IPv4(e);if(16===t)return new r.IPv6(e);throw new Error("ipaddr: the binary input is neither an IPv6 nor IPv4 address")},r.process=function(e){var t;return"ipv6"===(t=this.parse(e)).kind()&&t.isIPv4MappedAddress()?t.toIPv4Address():t}}).call(a)}),n=o(function(e,t){const r=function(e){if(!o(e))throw new Error("Invalid address: "+e);const t=(e=e.toLowerCase()).split(/\:\:/g);if(t.length>2)throw new Error("Invalid address: "+e);let r=[];if(1==t.length){if(r=e.split(/\:/g),8!==r.length)throw new Error("Invalid address: "+e)}else if(2==t.length){const e=t[0],a=t[1],o=e.split(/\:/g),i=a.split(/\:/g);for(let e in o)r[e]=o[e];for(let e=i.length;e>0;--e)r[7-(i.length-e)]=i[e-1]}for(let e=0;e<8;++e)void 0===r[e]&&(r[e]="0000"),r[e]=i(r[e],"0",4);return r.join(":")},a=function(e){if(!o(e))throw new Error("Invalid address: "+e);const t=(e=(e=(e=(e=(e=(e=r(e)).replace(/0000/g,"g")).replace(/\:000/g,":")).replace(/\:00/g,":")).replace(/\:0/g,":")).replace(/g/g,"0")).split(/\:/g);let a=!1,i=-1,n=0,s=-1,c=0;for(let e=0;e<8;++e){const r=t[e];let o="0"===r;o&&!a&&(s=e),!o&&a&&(c=e-s),c>1&&c>n&&(i=s,n=c),a="0"===r}return a&&(c=8-s),c>1&&c>n&&(i=s,n=c),i>=0&&n>1&&t.splice(i,n,"g"),e=(e=(e=(e=(e=t.join(":")).replace(/\:g\:/g,"::")).replace(/\:g/g,"::")).replace(/g\:/g,"::")).replace(/g/g,"::")},o=function(e){return/^[a-f0-9\\:]+$/gi.test(e)},i=function(e,t,r){const a=t.repeat(r);return e.length<a.length&&(e=a.substring(0,a.length-e.length)+e),e},n=function(e){return parseInt(e,16).toString(2)},s=function(e){return parseInt(e,2).toString(16)},c=function(e){const t=r(e).split(":");let a="";for(const e of t)a+=i(n(e),"0",16);return a},p=function(e){const t=[];for(let r=0;r<8;++r){const a=e.substr(16*r,16),o=i(s(a),"0",4);t.push(o)}return t.join(":")},d=function(e,t,r,n,s){if(!o(e))throw new Error("Invalid address: "+e);if(n*=1,r=(r*=1)||128,(t*=1)<1||r<1||t>128||r>128||t>r)throw new Error("Invalid masks.");const d=[],u=c(e).substr(0,t),l="0".repeat(128-r),m=Math.pow(2,r-t);for(let e=0;e<m&&!(n&&e>=n);++e){const o=i(e.toString(2),"0",r-t),n=p(u+o+l);s?d.push(a(n)):d.push(n)}return d},u=function(e,t,r,i){if(!o(e))throw new Error("Invalid address: "+e);if(r=(r*=1)||128,(t*=1)<1||r<1||t>128||r>128||t>r)throw new Error("Invalid masks.");const n=c(e).substr(0,t),s="0".repeat(128-r),d=n+"0".repeat(r-t)+s,u=n+"1".repeat(r-t)+s;return i?{start:a(p(d)),end:a(p(u)),size:Math.pow(2,r-t)}:{start:p(d),end:p(u),size:Math.pow(2,r-t)}},l=function(e,t,r,i,n){if(!o(e))throw new Error("Invalid address: "+e);if(r=(r*=1)||128,i=(i*=1)||1,(t*=1)<1||r<1||t>128||r>128||t>r)throw new Error("Invalid masks.");const s=[],d=c(e).substr(0,t),u="0".repeat(128-r),l=Math.pow(2,r-t);for(let e=0;e<l&&e<i;++e){let e="";for(let a=0;a<r-t;++a)e+=Math.floor(2*Math.random());const o=p(d+e+u);n?s.push(a(o)):s.push(o)}return s},m=function(e,t){if(!o(e))throw new Error("Invalid address: "+e);if((t*=1)<1||t>128||Math.floor(t/4)!=t/4)throw new Error("Invalid masks.");return r(e).replace(/:/g,"").split("").reverse().slice(0,(128-t)/4).join(".")};t.normalize=r,t.abbreviate=a,t.divideSubnet=d,t.range=u,t.randomSubnet=l,t.ptr=m});n.normalize,n.abbreviate,n.divideSubnet,n.range,n.randomSubnet,n.ptr;function s(e){return i.isValid(e)}function c(e){try{var t=i.parse(e).kind();return"ipv4"===t?4:"ipv6"===t?6:0}catch(e){return 0}}function p(e){return 4===c(e)}function d(e){return 6===c(e)}function u(e){try{i.parseCIDR(e);return!0}catch(e){return!1}}function l(e,t){if("string"!=typeof t){if(t&&"object"==typeof t){for(var r in t)if(!0===l(e,t[r]))return!0;return!1}return!1}if(-1===t.indexOf("/"))return e=d(e)?n.normalize(e):e,s(t=d(t)?n.normalize(t):t)&&e===t;try{var a=t.split("/"),o=i.parse(e),c=i.parse(a[0]);return o.match(c,a[1])}catch(e){return!1}}function m(e){try{var t=i.parse(e),r=t.kind();return"ipv4"===r?e:"ipv6"===r?t.isIPv4MappedAddress()?t.toIPv4Address().toString():n.abbreviate(e):null}catch(e){return null}}function w(e){try{var t=i.parse(e),r=t.kind();return"ipv4"===r?e:"ipv6"===r?t.isIPv4MappedAddress()?t.toIPv4Address().toString():n.normalize(e):""}catch(e){return""}}},783:()=>{!function(e){const t="restEndpointAvailable",r="pmw/v1/test/",a=0,o=10;e.emailSelected=!1,e.paymentMethodSelected=!1,e.isBelowRestErrorThreshold=()=>e.retrieveData(a)<=o,e.isRestEndpointAvailable=async()=>e.retrieveData(t)?e.retrieveData(t):await e.testEndpoint(),e.testEndpoint=async(a=e.root+r,o=t)=>{try{const t=await fetch(a,{method:"POST",mode:"cors",cache:"no-cache",keepalive:!0,redirect:"error"});if(!t.ok)return e.storeData(o,!1),pmw.console.error("Error testing the endpoint. Status: "+t.status+" | response: ",t),!1;const r=await t.json();return r.success?(e.storeData(o,!0),!0):(e.storeData(o,!1),pmw.console.error("Error testing the endpoint. Response JSON: "+JSON.stringify(r)),!1)}catch(t){return e.storeData(o,!1),pmw.console.error("Error testing the endpoint. Error: "+t),!1}},e.isWpmRestEndpointAvailable=(r=t)=>!!e.retrieveData(r),e.writeOrderIdToStorage=(t,r,a="thankyou_page")=>{let o=e.retrieveData("orderIds",!0)||[];o.push(t),e.storeData("orderIds",o,!0),"function"==typeof e.storeOrderIdOnServer&&e.storeOrderIdOnServer({orderId:t,orderKey:r,source:a})},e.isOrderIdStored=t=>{if(!wpmDataLayer.shop.order_duplication_prevention)return pmw.console.log("order duplication prevention is off"),!1;return(e.retrieveData("orderIds",!0)||[]).includes(t)},e.isEmail=e=>new RegExp('^(([^<>()\\[\\]\\\\.,;:\\s@"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@"]+)*)|(".+"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$').test(e),e.removeProductFromCart=async(t,r=null)=>{try{if(!t)throw Error("Wasn't able to retrieve a productId");if(!(t=e.getIdBasedOndVariationsOutputSetting(t)))throw Error("Wasn't able to retrieve a productId");let a;a=null==r?wpmDataLayer.cart[t].quantity:r,wpmDataLayer.cart[t]||await e.getProductsFromBackend([t]);let o=e.getProductDetailsFormattedForEvent(t,a);jQuery(document).trigger("pmw:remove-from-cart",o),null==r||wpmDataLayer.cart[t].quantity===r?delete wpmDataLayer.cart[t]:wpmDataLayer.cart[t].quantity=wpmDataLayer.cart[t].quantity-a,e.storeCartData(wpmDataLayer.cart)}catch(e){pmw.console.error("error: ",e)}},e.getIdBasedOndVariationsOutputSetting=e=>{try{return wpmDataLayer?.shop?.variations_output?e:wpmDataLayer.products[e].is_variation?wpmDataLayer.products[e].parent_id:e}catch(e){console.error(e)}},e.prepareSelectors=(e,t)=>(wpmDataLayer?.shop?.selectors?.[t]&&(e=e.concat(wpmDataLayer.shop.selectors[t]),(e=[...new Set(e)]).indexOf("document")>=0&&e.splice(e.indexOf("document"),1),e.indexOf("body")>=0&&(e=["body"])),e.join(", ")),e.addProductToCart=async(t,r)=>{r=Number(r);try{if(!t)throw Error("Wasn't able to retrieve a productId");if(!(t=e.getIdBasedOndVariationsOutputSetting(t)))throw Error("Wasn't able to retrieve a productId");wpmDataLayer?.products[t]||await e.getProductsFromBackend([t]);let a=e.getProductDetailsFormattedForEvent(t,r);jQuery(document).trigger("pmw:add-to-cart",a),wpmDataLayer?.cart[t]?wpmDataLayer.cart[t].quantity=wpmDataLayer.cart[t].quantity+r:("cart"in wpmDataLayer||(wpmDataLayer.cart={}),wpmDataLayer.cart[t]=e.getProductDetailsFormattedForEvent(t,r)),e.storeCartData(wpmDataLayer.cart)}catch(t){console.error(t),e.getCartItemsFromBackend()}},e.initCart=()=>{e.doesWooCommerceCartExist()||0===Object.keys(e.retrieveCartData()).length?e.retrieveCartData()?e.saveCartObjectToDataLayer(e.retrieveCartData()):(e.storeCartData({}),e.getCartItemsFromBackend()):e.storeCartData({})},e.getCartItemsFromBackend=()=>{try{fetch(e.ajax_url,{method:"POST",cache:"no-cache",body:new URLSearchParams({action:"pmw_get_cart_items"}),keepalive:!0,redirect:"error"}).then(e=>{if(e.ok)return e.json();throw Error("Error getting cart items from backend")}).then(t=>{if(!t.success)throw Error("Error getting cart items from backend");t.data.cart||(t.data.cart={}),e.saveCartObjectToDataLayer(t.data.cart),e.storeCartData(t.data.cart)})}catch(e){console.error(e)}},e.getProductsFromBackend=async t=>{if(wpmDataLayer?.products&&(t=t.filter(e=>!(e in wpmDataLayer.products))),t&&0!==t.length&&wpmDataLayer.general.page_id&&Array.isArray(t)&&0!==t.length){try{let r={action:"pmw_get_product_ids",page_id:wpmDataLayer.general.page_id,page_type:wpmDataLayer.shop.page_type,product_ids:t};const a=await e.isRestEndpointAvailable(),o=a?e.root+"pmw/v1/products/":e.ajax_url,i={method:"POST",cache:"no-cache",body:a?JSON.stringify(r):new URLSearchParams(r)};a&&(i.headers={"Content-Type":"application/json"});let n=await fetch(o,i);if(!n.ok)throw new Error("Error getting products from backend. Status: "+n.status+" Status text: "+n.statusText);let s=await n.json();if(!s.success)throw new Error("Error getting products from backend: "+s.data);wpmDataLayer.products=Object.assign({},wpmDataLayer.products,s.data)}catch(e){console.error(e)}return!0}},e.saveCartObjectToDataLayer=e=>{wpmDataLayer.cart=e,wpmDataLayer.products=Object.assign({},wpmDataLayer.products,e)},e.triggerViewItemEventPrep=async t=>{wpmDataLayer?.products[t]||await e.getProductsFromBackend([t]),wpmDataLayer?.products[t]?e.triggerViewItemEvent(t):(e.triggerViewItemEventNoProduct(),pmw.console.log(`Product with ID ${t} not found in the data layer and couldn't be retrieved from the backend. Triggering view-item event without product data.`))},e.triggerViewItemEvent=t=>{let r=e.getProductDetailsFormattedForEvent(t);r&&jQuery(document).trigger("pmw:view-item",r)},e.triggerViewItemEventNoProduct=()=>{jQuery(document).trigger("pmw:view-item")},e.fireCheckoutOption=(e,t=null,r=null)=>{let a={step:e,checkout_option:t,value:r};jQuery(document).trigger("pmw:checkout-option",a)},e.fireCheckoutProgress=e=>{let t={step:e};jQuery(document).trigger("pmw:checkout-progress",t)},e.getPostIdFromString=e=>{try{return e.match(/(post-)(\d+)/)[2]}catch(e){console.error(e)}},e.triggerViewItemList=t=>{if(!t)throw Error("Wasn't able to retrieve a productId");if(!(t=e.getIdBasedOndVariationsOutputSetting(t)))throw Error("Wasn't able to retrieve a productId");jQuery(document).trigger("pmw:view-item-list",e.getProductDataForViewItemEvent(t))},e.getProductDataForViewItemEvent=t=>{if(!t)throw Error("Wasn't able to retrieve a productId");try{if(wpmDataLayer.products[t])return e.getProductDetailsFormattedForEvent(t)}catch(e){console.error(e)}},e.getMainProductIdFromProductPage=()=>{try{return["simple","variable","grouped","composite","bundle"].indexOf(wpmDataLayer.shop.product_type)>=0&&jQuery(".wpmProductId:first").data("id")}catch(e){console.error(e)}},e.viewItemListTriggerTestMode=e=>{jQuery(e).css({position:"relative"}),jQuery(e).append('<div id="viewItemListTriggerOverlay"></div>'),jQuery(e).find("#viewItemListTriggerOverlay").css({"z-index":"10",display:"block",position:"absolute",height:"100%",top:"0",left:"0",right:"0",opacity:wpmDataLayer.shop.view_item_list_trigger.opacity,"background-color":wpmDataLayer.shop.view_item_list_trigger.background_color})},e.getSearchTermFromUrl=()=>{try{return new URLSearchParams(window.location.search).get("s")}catch(e){console.error(e)}};let i,n={};e.observerCallback=(t,r)=>{t.forEach(t=>{try{let a,o=jQuery(t.target).data("ioid");if(a=jQuery(t.target).next(".wpmProductId").length?jQuery(t.target).next(".wpmProductId").data("id"):jQuery(t.target).find(".wpmProductId").data("id"),!a)throw Error("wpmProductId element not found");t.isIntersecting?n[o]=setTimeout(()=>{e.triggerViewItemList(a),wpmDataLayer.shop.view_item_list_trigger.test_mode&&e.viewItemListTriggerTestMode(t.target),!1===wpmDataLayer.shop.view_item_list_trigger.repeat&&r.unobserve(t.target)},wpmDataLayer.shop.view_item_list_trigger.timeout):(clearTimeout(n[o]),wpmDataLayer.shop.view_item_list_trigger.test_mode&&jQuery(t.target).find("#viewItemListTriggerOverlay").remove())}catch(e){console.error(e)}})};let s=0;let c={nested:[],flat:[]};const p=e=>["product","type-product","product-item-inner",...c.nested].some(t=>jQuery(e).closest("."+t).length),d=e=>["wc-block-grid__product","product","product-small","woocommerce-LoopProduct-link",...c.flat].some(t=>jQuery(e).prev().hasClass(t)),u=()=>(c=(()=>{let e={nested:[],flat:[]};try{const t=(e,t)=>jQuery(e).parents().length===jQuery(t).parents().length,r=(e,t)=>jQuery(e).parent().is(jQuery(t).parent())?{node:jQuery(e).parent(),type:"flat"}:{node:jQuery(e).parents().has(jQuery(t).parents()).first(),type:"nested"},a=e=>jQuery(e).find(".wpmProductId").length,o=(e,t)=>e.filter(e=>t.includes(e))[0]||null,i=document.querySelectorAll(".wpmProductId");if(1===i.length)return e;for(let n=0;n<i.length-1;n++){if(!t(i[n],i[n+1])){n++;continue}let s=r(i[n],i[n+1]);if("nested"===s.type){let t=s.node.children().first().attr("class"),r=t?t.split(" "):[],a=s.node.children().first().next().attr("class");const i=o(r,a?a.split(" "):[]);e.nested.push(i)}else if("flat"===s.type){if(!s.node.children().first().attr("class"))continue;let t=s.node.children().first().attr("class").split(" ")[0];e.flat.push(t)}n=n+a(s.node)-1}return e.nested=[...new Set(e.nested)],e.flat=[...new Set(e.flat)],e}catch(t){return console.error(t),e}})(),jQuery(".wpmProductId").map(function(e,t){return p(t)?jQuery(t).parent():d(t)?jQuery(this).prev():jQuery(t).closest(".product").length?jQuery(t).closest(".product"):void 0}));e.startIntersectionObserverToWatch=()=>{try{e.urlHasParameter("vildemomode")&&(wpmDataLayer.shop.view_item_list_trigger.test_mode=!0),i=new IntersectionObserver(e.observerCallback,{root:null,threshold:wpmDataLayer.shop.view_item_list_trigger.threshold}),u().each((e,t)=>{jQuery(t[0]).data("ioid",s++),i.observe(t[0])})}catch(e){console.error(e)}},e.startProductsMutationObserverToWatch=()=>{try{let e=jQuery(".wpmProductId:eq(0)").parents().has(jQuery(".wpmProductId:eq(1)").parents()).first();e.length&&l.observe(e[0],{attributes:!0,childList:!0,characterData:!0})}catch(e){console.error(e)}};const l=new MutationObserver(e=>{e.forEach(e=>{let t=e.addedNodes;if(null!==t){jQuery(t).each((e,t)=>{(p(t)||d(t))&&m(t)&&(jQuery(t).data("ioid",s++),i.observe(t))})}})});let m=e=>!(!jQuery(e).find(".wpmProductId").length&&!jQuery(e).siblings(".wpmProductId").length);e.setCookie=(e,t="",r=null)=>{if(r){let a=new Date;a.setTime(a.getTime()+24*r*60*60*1e3);let o="expires="+a.toUTCString();document.cookie=e+"="+t+";"+o+";path=/"}else document.cookie=e+"="+t+";path=/"},e.getCookie=e=>{let t=e+"=",r=decodeURIComponent(document.cookie).split(";");for(let e=0;e<r.length;e++){let a=r[e];for(;" "==a.charAt(0);)a=a.substring(1);if(0==a.indexOf(t))return a.substring(t.length,a.length)}return""},e.getCookieThatContainsRegex=e=>{let t=document.cookie.split(";");for(let r=0;r<t.length;r++){let a=t[r].trim();if(e.test(a))return a}return!1},e.deleteCookie=t=>{e.setCookie(t,"",-1)},e.storeData=(t,r,a=!1,o=!1)=>{const i=o?t:"";let n=a?e.getPersistentData:e.getSessionData,s=a?e.setPersistentData:e.setSessionData,c=n(i);o?c=r:c[t]=r,s(c,i)},e.retrieveData=(t,r=!1,a=!1)=>{const o=a?t:"";let i=r?e.getPersistentData(o):e.getSessionData(o);return a?i:i[t]},e.deleteDataKey=(t,r=!1,a=!1)=>{const o=a?t:"";let i=r?e.getPersistentData:e.getSessionData,n=r?e.setPersistentData:e.setSessionData,s=i(o);if(a)try{r&&window.localStorage&&window.localStorage.removeItem(e.getPersistentDataKey(o)),!r&&window.sessionStorage&&window.sessionStorage.removeItem(e.getSessionDataKey(o))}catch(e){console.error(e)}else delete s[t],n(s,o)},e.storeCartData=t=>{e.storeData("cart",t,!1,!0)},e.retrieveCartData=()=>e.retrieveData("cart",!1,!0),e.getSessionDataKey=(e="")=>{const t="_pmw_session_data";return e?t+"_"+e:t},e.getPersistentDataKey=e=>{const t="_pmw_persistent_data";return e?t+"_"+e:t},e.getSessionData=(t="")=>{if(window.sessionStorage){let r=window.sessionStorage.getItem(e.getSessionDataKey(t));return null!==r?JSON.parse(r):{}}{let r=e.getCookie(e.getSessionDataKey(t));return""!==r?JSON.parse(r):{}}},e.setSessionData=(t,r="")=>{window.sessionStorage?window.sessionStorage.setItem(e.getSessionDataKey(r),JSON.stringify(t)):e.setCookie(e.getSessionDataKey(r),JSON.stringify(t))},e.getPersistentData=t=>{if(window.localStorage){let r=window.localStorage.getItem(e.getPersistentDataKey(t));return null!==r?JSON.parse(r):{}}{let r=e.getCookie(e.getPersistentDataKey(t));return""!==r?JSON.parse(r):{}}},e.setPersistentData=(t,r="")=>{window.localStorage?window.localStorage.setItem(e.getPersistentDataKey(r),JSON.stringify(t)):e.setCookie(e.getPersistentDataKey(r),JSON.stringify(t),400)},e.storeOrderIdOnServer=async t=>{try{let r;await e.isRestEndpointAvailable()?r=await fetch(e.root+"pmw/v1/pixels-fired/",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({order_id:t.orderId,order_key:t.orderKey,source:t.source}),keepalive:!0,cache:"no-cache",redirect:"error"}):(pmw.console.log("REST API not available, falling back to AJAX"),r=await fetch(e.ajax_url,{method:"POST",body:new URLSearchParams({action:"pmw_purchase_pixels_fired",order_id:t.orderId,order_key:t.orderKey,source:t.source}),keepalive:!0,redirect:"error"}));const a=await r.json();a.success?pmw.console.log("",a.data):pmw.console.error("",a.data)}catch(e){console.error(e)}},e.getProductIdByCartItemElement=t=>{const r=jQuery(t).find(".product-remove").find("a").attr("href");if(r)return e.getProductIdByCartItemKeyUrl(new URL(r));const a=jQuery(t).find("[data-product_id]").first().attr("data-product_id");return a||null},e.getProductQuantityByCartItemElement=e=>jQuery(e).find(".qty").val()||null,e.getProductIdByCartItemKeyUrl=e=>{let t,r=new URLSearchParams(e.search).get("remove_item");return t=0===wpmDataLayer.cart_item_keys[r].variation_id?wpmDataLayer.cart_item_keys[r].product_id:wpmDataLayer.cart_item_keys[r].variation_id,t},e.getAddToCartLinkProductIds=()=>jQuery("a").map(function(){let e=jQuery(this).attr("href");if(e&&e.includes("?add-to-cart=")){let t=e.match(/(add-to-cart=)(\d+)/);if(t)return t[2]}}).get(),e.getProductDetailsFormattedForEvent=(e,t=1)=>{if(!wpmDataLayer.products[e])return null;let r={id:e.toString(),dyn_r_ids:wpmDataLayer.products[e].dyn_r_ids,name:wpmDataLayer.products[e].name,list_name:wpmDataLayer.shop.list_name,brand:wpmDataLayer.products[e].brand,category:wpmDataLayer.products[e].category,variant:wpmDataLayer.products[e].variant,list_position:wpmDataLayer.products[e].position,quantity:t,price:wpmDataLayer.products[e].price,currency:wpmDataLayer.shop.currency,is_variable:wpmDataLayer.products[e].is_variable,is_variation:wpmDataLayer.products[e].is_variation,parent_id:wpmDataLayer.products[e].parent_id};return r.is_variation&&(r.parent_id_dyn_r_ids=wpmDataLayer.products[e].parent_id_dyn_r_ids),r},e.getClidFromBrowser=(t="gclid")=>{let r;if(r={gclid:"_gcl_aw",dclid:"_gcl_dc"},e.getCookie(r[t])){return e.getCookie(r[t]).match(/(GCL.[\d]*.)(.*)/)[2]}return""},e.getUserAgent=()=>navigator.userAgent,e.getViewPort=()=>({width:Math.max(document.documentElement.clientWidth||0,window.innerWidth||0),height:Math.max(document.documentElement.clientHeight||0,window.innerHeight||0)}),e.consoleLogVersion=()=>{console.log(wpmDataLayer.version)},e.loadScriptAndCacheIt=(e,t)=>{let r={dataType:"script",cache:!0,url:e};return new Promise((a,o)=>{jQuery.ajax(r).done(()=>{pmw.console.log("Successfully loaded primary script: "+e),a()}).fail(()=>{if(t){pmw.console.log("Loading fallback script: "+t);let e={dataType:"script",cache:!0,url:t};jQuery.ajax(e).done(()=>{pmw.console.log("Successfully loaded fallback script: "+t),a()}).fail(()=>o(new Error("Both primary and fallback scripts failed to load.")))}else o(new Error("Primary script failed to load, and no fallback URL provided."))})})},e.getOrderItemPrice=e=>(e.total+e.total_tax)/e.quantity,e.hasLoginEventFired=()=>{let t=e.getSessionData();return t?.loginEventFired},e.setLoginEventFired=()=>{let t=e.getSessionData();t.loginEventFired=!0,e.setSessionData(t)},e.pageLoaded=async()=>new Promise(e=>{!function t(){if("complete"===document.readyState)return e();setTimeout(t,50)}()}),e.pageReady=()=>new Promise(e=>{!function t(){if("interactive"===document.readyState||"complete"===document.readyState)return e();setTimeout(t,50)}()}),e.isMiniCartActive=()=>(window.sessionStorage&&Object.keys(window.sessionStorage).forEach(e=>{if(e.includes("wc_fragments"))return!0}),!1),e.doesWooCommerceCartExist=()=>document.cookie.includes("woocommerce_items_in_cart"),e.urlHasParameter=e=>new URLSearchParams(window.location.search).has(e),e.getUrlParameter=e=>new URLSearchParams(window.location.search).get(e),e.hashAsync=(e,t)=>crypto.subtle.digest(e,new TextEncoder("utf-8").encode(t)).then(e=>Array.prototype.map.call(new Uint8Array(e),e=>("00"+e.toString(16)).slice(-2)).join("")),e.getCartValue=()=>{let e=0;if(wpmDataLayer?.cart)for(const t in wpmDataLayer.cart){let r=wpmDataLayer.cart[t];e+=r.quantity*r.price}return e},e.doesUrlContainPatterns=e=>{for(const t of e)if(new RegExp(t).test(window.location.href))return!0;return!1},e.excludeDomainFromTracking=()=>{let e=["appspot.com","translate.google.com"];return wpmDataLayer?.general?.exclude_domains&&(e=[...e,...wpmDataLayer.general.exclude_domains]),!!e.some(e=>window.location.href.includes(e))&&(console.debug("Pixel Manager: Aborted due to excluded domain"),!0)},e.getRandomEventId=(e=16)=>{let t="";for(;t.length<e;)t+=(Math.random()+1).toString(36).substring(2);return t.substring(0,e)},e.pmwConsoleMessage=()=>{let e="Pixel Manager for WooCommerce: ";e+=wpmDataLayer.version.pro?"pro":"free",e+=" | distro: "+wpmDataLayer.version.distro,"fms"===wpmDataLayer.version.distro&&wpmDataLayer.version.pro&&(e+=" | active license: "+(wpmDataLayer.version.eligible_for_updates?"yes":"no")),e+=" | version: "+wpmDataLayer.version.number,!0===wpmDataLayer.version.show?console.log(e):pmw.console.log(e)},e.canLoadPremiumFeatures=()=>"fms"===wpmDataLayer.version.distro&&wpmDataLayer.version.pro&&wpmDataLayer.version.eligible_for_updates||"wcm"===wpmDataLayer.version.distro;let w=!1;e.triggerPmwDomReadyEvent=()=>{w||("complete"!==document.readyState?(jQuery(()=>{g()}),document.addEventListener("DOMContentLoaded",()=>{g()},!0)):g())};const g=()=>{w||(document.dispatchEvent(new Event("pmw:dom:ready")),w=!0)};e.getEmailFromTarget=t=>{if(t.href){let r=t.href.replace("mailto:","");if(r.indexOf("?")>-1&&(r=r.split("?")[0]),r=r.replace(/\s/g,""),r&&e.isEmail(r))return r}return""},e.sendEventPayloadToServer=t=>{"function"==typeof e.sendEventPayloadToServerPremium&&e.sendEventPayloadToServerPremium(t)},e.waitForPixelsAndTriggerPageView=async()=>new Promise(e=>{if(!wpmDataLayer?.pixels)return pmw.console.error("wpmDataLayer or wpmDataLayer.pixels is not defined, triggering page view event immediately."),document.dispatchEvent(new Event("pmw:page-view")),void e();let t=wpmDataLayer?.general?.server_2_server?.pageview_event_s2s?.pixels||[];if(t=t.filter(e=>wpmDataLayer.pixels[e]),0===t.length)return pmw.console.log("No specific pixels to wait for, triggering page view event."),document.dispatchEvent(new Event("pmw:page-view")),void e();const r=()=>{t.every(e=>!wpmDataLayer.pixels[e]||wpmDataLayer.pixels[e].loaded)?(document.dispatchEvent(new Event("pmw:page-view")),e()):setTimeout(r,100)};r()}),e.isWooCommerceActive=()=>!!wpmDataLayer.shop,e.getProductIdForSpecificPixel=(e,t)=>String(e.dyn_r_ids[wpmDataLayer.pixels[t].dynamic_remarketing.id_type]),e.isInWooCommerceSesssion=()=>{if(wpmDataLayer?.shop?.session_active)return!0;let t=new RegExp("woocommerce_cart_hash");return!!e.getCookieThatContainsRegex(t)},e.isNotInWooCommerceSesssion=()=>!e.isInWooCommerceSesssion(),e.makeFullUrl=e=>(e=e.trim(),/^(http:\/\/|https:\/\/)/.test(e)?e:"https://"+(e=e.replace(/^\/+/,""))),e.registerShowVariationEventListener=()=>{let t=null;jQuery(".single_variation_wrap").on("show_variation",(r,a)=>{try{let r=e.getIdBasedOndVariationsOutputSetting(a.variation_id);if(!r)throw Error("Wasn't able to retrieve a productId");t!==a.variation_id&&(e.triggerViewItemEventPrep(r),t=a.variation_id)}catch(e){console.error(e)}})},e.initializeCommandQueue=()=>{const e=window._pmwq=window._pmwq||[];e.forEach(function(e){if("function"==typeof e)try{e()}catch(e){pmw.console.error("Error executing queued command:",e)}}),e.push=function(e){if("function"==typeof e)try{e()}catch(e){pmw.console.error("Error executing command from queue:",e)}}}}(window.wpm=window.wpm||{},jQuery)},975:()=>{!function(e){e.getEventContext=function(){return{timestamp:Math.floor(Date.now()/1e3),url:window.location.href,referrer:e.retrieveData("referrer")?e.makeFullUrl(e.retrieveData("referrer")):document.referrer,user_agent:navigator.userAgent,page_type:wpmDataLayer?.shop?.page_type,user_id:wpmDataLayer?.user?.id?.raw||null}},e.processEvent=async function(t,r){pmw.console.log(`Processing event: ${t}`,r);try{let a={event:t,event_data:r,pixels:{},context:e.getEventContext()};a=pmw.hooks.applyFilters("pmw_event_payload_pre",a,t);const o=e.pixelRegistry.getActivePixels();for(const r of o){const o=e.pixelRegistry.getAdapter(r);if(o&&"function"==typeof o.adapt)try{let e=o.adapt(a.event_data,t,a.context);if(!e)continue;e=pmw.hooks.applyFilters(`pmw_pixel_data_${r}`,e,t,a.event_data,a.context),a.pixels[r]=e}catch(e){pmw.console.error(`Error adapting data for ${r}:`,e)}else pmw.console.log(`No adapter found for pixel: ${r}`)}return a=pmw.hooks.applyFilters(`pmw_event_payload_${t}`,a,a.event_data),a=pmw.hooks.applyFilters("pmw_event_payload_post",a,t),await e.dispatchToPixels(a),a}catch(e){throw pmw.console.error(`Error processing event ${t}:`,e),e}},e.dispatchToPixels=async function(t){const r=t.event;if(e.dispatchToBrowserPixels(t),e.dispatchToS2SPixels(t),"purchase"!==r){if(wpmDataLayer?.general?.server_2_server?.active){const a=e.extractS2SData(t);if(Object.keys(a).length>0){const t=e.pixelRegistry.getActiveS2SPixels();pmw.console.log(`S2S enabled pixels for ${r}:`,t),await e.sendEventPayloadToServer(a)}}}else pmw.console.log("Purchase event - skipping browser-to-server transmission (handled server-side only)")},e.dispatchToBrowserPixels=function(t){const r=e.pixelRegistry.getActiveBrowserOnlyPixels();if(0===r.length)return;pmw.console.log(`Dispatching to browser-only pixels for ${t.event}:`,r);const a=t.event.replace(/_/g,"-");jQuery(document).trigger(`pmw:browser:${a}`,t)},e.dispatchToS2SPixels=function(t){if(0===e.pixelRegistry.getActiveS2SPixels().length)return;const r=t.event.replace(/_/g,"-");jQuery(document).trigger(`pmw:s2s:${r}`,t)},e.extractS2SData=function(t){const r={event:t.event},a=e.pixelRegistry.getActiveS2SPixels();for(const e of a)t.pixels[e]&&(r[e]=t.pixels[e]);return t.event_data?.product&&(r.product=t.event_data.product),r},e.adapters||(e.adapters={}),e.registerAdapter=function(t,r,a={}){r&&"function"==typeof r.adapt?(e.adapters[t]=r,e.pixelCapabilities||(e.pixelCapabilities={}),e.pixelCapabilities[t]={supportsS2S:a.supportsS2S||!1,supportsEventDeduplication:a.supportsEventDeduplication||!1,isActive:a.isActive||null}):pmw.console.error(`Invalid adapter for ${t}: must have an adapt() method`)}}(window.wpm=window.wpm||{},jQuery)}},i={};function n(e){var t=i[e];if(void 0!==t)return t.exports;var r=i[e]={exports:{}};return o[e](r,r.exports,n),r.exports}n.m=o,t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,n.t=function(r,a){if(1&a&&(r=this(r)),8&a)return r;if("object"==typeof r&&r){if(4&a&&r.__esModule)return r;if(16&a&&"function"==typeof r.then)return r}var o=Object.create(null);n.r(o);var i={};e=e||[null,t({}),t([]),t(t)];for(var s=2&a&&r;("object"==typeof s||"function"==typeof s)&&!~e.indexOf(s);s=t(s))Object.getOwnPropertyNames(s).forEach(e=>i[e]=()=>r[e]);return i.default=()=>r,n.d(o,i),o},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.f={},n.e=e=>Promise.all(Object.keys(n.f).reduce((t,r)=>(n.f[r](e,t),t),[])),n.u=e=>({194:"wc-hooks",264:"deprecated-functions",526:"pixel-facebook",625:"consent-management",671:"pixel-google",818:"pixel-hotjar",968:"consent-api",972:"doofinder-listener"}[e]+"."+{194:"748deb38",264:"9b411c79",526:"0ae541d1",625:"414e6bb6",671:"91d8c5a4",818:"05256bbc",968:"12d29397",972:"8afb6ac4"}[e]+".chunk.min.js"),n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r={},a="Pixel Manager for WooCommerce:",n.l=(e,t,o,i)=>{if(r[e])r[e].push(t);else{var s,c;if(void 0!==o)for(var p=document.getElementsByTagName("script"),d=0;d<p.length;d++){var u=p[d];if(u.getAttribute("src")==e||u.getAttribute("data-webpack")==a+o){s=u;break}}s||(c=!0,(s=document.createElement("script")).charset="utf-8",n.nc&&s.setAttribute("nonce",n.nc),s.setAttribute("data-webpack",a+o),s.src=e),r[e]=[t];var l=(t,a)=>{s.onerror=s.onload=null,clearTimeout(m);var o=r[e];if(delete r[e],s.parentNode&&s.parentNode.removeChild(s),o&&o.forEach(e=>e(a)),t)return t(a)},m=setTimeout(l.bind(null,void 0,{type:"timeout",target:s}),12e4);s.onerror=l.bind(null,s.onerror),s.onload=l.bind(null,s.onload),c&&document.head.appendChild(s)}},n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;n.g.importScripts&&(e=n.g.location+"");var t=n.g.document;if(!e&&t&&(t.currentScript&&"SCRIPT"===t.currentScript.tagName.toUpperCase()&&(e=t.currentScript.src),!e)){var r=t.getElementsByTagName("script");if(r.length)for(var a=r.length-1;a>-1&&(!e||!/^http(s?):/.test(e));)e=r[a--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/^blob:/,"").replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),n.p=e})(),(()=>{var e={792:0};n.f.j=(t,r)=>{var a=n.o(e,t)?e[t]:void 0;if(0!==a)if(a)r.push(a[2]);else{var o=new Promise((r,o)=>a=e[t]=[r,o]);r.push(a[2]=o);var i=n.p+n.u(t),s=new Error;n.l(i,r=>{if(n.o(e,t)&&(0!==(a=e[t])&&(e[t]=void 0),a)){var o=r&&("load"===r.type?"missing":r.type),i=r&&r.target&&r.target.src;s.message="Loading chunk "+t+" failed.\n("+o+": "+i+")",s.name="ChunkLoadError",s.type=o,s.request=i,a[1](s)}},"chunk-"+t,t)}};var t=(t,r)=>{var a,o,[i,s,c]=r,p=0;if(i.some(t=>0!==e[t])){for(a in s)n.o(s,a)&&(n.m[a]=s[a]);if(c)c(n)}for(t&&t(r);p<i.length;p++)o=i[p],n.o(e,o)&&e[o]&&e[o][0](),e[o]=0},r=self.webpackChunkPixel_Manager_for_WooCommerce=self.webpackChunkPixel_Manager_for_WooCommerce||[];r.forEach(t.bind(null,0)),r.push=t.bind(null,r.push.bind(r))})();(async()=>{if(n(263),n(547),await wpm.jQueryExists(),await wpm.wpmDataLayerFullyLoaded(),wpmDataLayer?.general?.chunk_base_path&&(n.p=wpmDataLayer.general.chunk_base_path),n(189),n(510),n(256),n(975),wpm.initializeCommandQueue(),wpm.pmwConsoleMessage(),await wpm.loadConsentModule(),await wpm.consent.load(),jQuery(()=>{n(722)}),n(196),n.e(972).then(n.t.bind(n,282,23)),wpm.loadWcHooksFunctions(),wpm.excludeDomainFromTracking())return;const e=[];wpmDataLayer?.pixels?.google&&e.push(n.e(671).then(n.t.bind(n,62,23))),wpmDataLayer?.pixels?.facebook&&e.push(n.e(526).then(n.t.bind(n,767,23))),wpmDataLayer?.pixels?.hotjar&&e.push(n.e(818).then(n.t.bind(n,155,23))),await Promise.all(e);const{loadDeprecatedFunctions:t}=await n.e(264).then(n.bind(n,549));t(),document.dispatchEvent(new Event("pmw:load-pixels")),document.dispatchEvent(new Event("wpmLoad")),await wpm.pageLoaded(),document.dispatchEvent(new Event("pmw:ready")),wpm.triggerPmwDomReadyEvent(),wpm.checkLibraryVersion()})()})();
    22//# sourceMappingURL=wpm-public.p1.min.js.map
  • woocommerce-google-adwords-conversion-tracking-tag/trunk/js/public/free/wpm-public.p1.min.js.map

    r3403843 r3406541  
    1 {"version":3,"file":"wpm-public.p1.min.js","mappings":"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","sources":["webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/create fake namespace object","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/load script","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/wpm/geo/geo.mjs","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/wpm/console.mjs","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/wpm/functions_loader.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/wpm/event_listeners.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/wpm/pixel-registry.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/wpm/functions_main.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/wpm/hooks.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/version.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/wpm/ip_services.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/wpm/event_listeners_on_ready.js","webpack://Pixel-Manager-for-WooCommerce/../node_modules/ipaddr.js/lib/ipaddr.js","webpack://Pixel-Manager-for-WooCommerce/../node_modules/ip6/ip6.js","webpack://Pixel-Manager-for-WooCommerce/../src/range-check.ts","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/wpm/functions.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/wpm/event-processor.js","webpack://Pixel-Manager-for-WooCommerce/webpack/bootstrap","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/define property getters","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/ensure chunk","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/get javascript chunk filename","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/global","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/hasOwnProperty shorthand","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/make namespace object","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/publicPath","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/jsonp chunk loading","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/main.js"],"sourcesContent":["var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; (typeof current == 'object' || typeof current == 'function') && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"Pixel Manager for WooCommerce:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// https://stackoverflow.com/a/70870895/4688612\nexport const getLocationByTimeZone = () => {\n\n\tconst timezones = {\n\t\t\"Africa/Abidjan\"                : [\"CI\", \"BF\", \"GH\", \"GM\", \"GN\", \"ML\", \"MR\", \"SH\", \"SL\", \"SN\", \"TG\"],\n\t\t\"Africa/Accra\"                  : [\"GH\"],\n\t\t\"Africa/Addis_Ababa\"            : [\"ET\"],\n\t\t\"Africa/Algiers\"                : [\"DZ\"],\n\t\t\"Africa/Asmara\"                 : [\"ER\"],\n\t\t\"Africa/Asmera\"                 : [\"ER\"],\n\t\t\"Africa/Bamako\"                 : [\"ML\"],\n\t\t\"Africa/Bangui\"                 : [\"CF\"],\n\t\t\"Africa/Banjul\"                 : [\"GM\"],\n\t\t\"Africa/Bissau\"                 : [\"GW\"],\n\t\t\"Africa/Blantyre\"               : [\"MW\"],\n\t\t\"Africa/Brazzaville\"            : [\"CG\"],\n\t\t\"Africa/Bujumbura\"              : [\"BI\"],\n\t\t\"Africa/Cairo\"                  : [\"EG\"],\n\t\t\"Africa/Casablanca\"             : [\"MA\"],\n\t\t\"Africa/Ceuta\"                  : [\"ES\"],\n\t\t\"Africa/Conakry\"                : [\"GN\"],\n\t\t\"Africa/Dakar\"                  : [\"SN\"],\n\t\t\"Africa/Dar_es_Salaam\"          : [\"TZ\"],\n\t\t\"Africa/Djibouti\"               : [\"DJ\"],\n\t\t\"Africa/Douala\"                 : [\"CM\"],\n\t\t\"Africa/El_Aaiun\"               : [\"EH\"],\n\t\t\"Africa/Freetown\"               : [\"SL\"],\n\t\t\"Africa/Gaborone\"               : [\"BW\"],\n\t\t\"Africa/Harare\"                 : [\"ZW\"],\n\t\t\"Africa/Johannesburg\"           : [\"ZA\", \"LS\", \"SZ\"],\n\t\t\"Africa/Juba\"                   : [\"SS\"],\n\t\t\"Africa/Kampala\"                : [\"UG\"],\n\t\t\"Africa/Khartoum\"               : [\"SD\"],\n\t\t\"Africa/Kigali\"                 : [\"RW\"],\n\t\t\"Africa/Kinshasa\"               : [\"CD\"],\n\t\t\"Africa/Lagos\"                  : [\"NG\", \"AO\", \"BJ\", \"CD\", \"CF\", \"CG\", \"CM\", \"GA\", \"GQ\", \"NE\"],\n\t\t\"Africa/Libreville\"             : [\"GA\"],\n\t\t\"Africa/Lome\"                   : [\"TG\"],\n\t\t\"Africa/Luanda\"                 : [\"AO\"],\n\t\t\"Africa/Lubumbashi\"             : [\"CD\"],\n\t\t\"Africa/Lusaka\"                 : [\"ZM\"],\n\t\t\"Africa/Malabo\"                 : [\"GQ\"],\n\t\t\"Africa/Maputo\"                 : [\"MZ\", \"BI\", \"BW\", \"CD\", \"MW\", \"RW\", \"ZM\", \"ZW\"],\n\t\t\"Africa/Maseru\"                 : [\"LS\"],\n\t\t\"Africa/Mbabane\"                : [\"SZ\"],\n\t\t\"Africa/Mogadishu\"              : [\"SO\"],\n\t\t\"Africa/Monrovia\"               : [\"LR\"],\n\t\t\"Africa/Nairobi\"                : [\"KE\", \"DJ\", \"ER\", \"ET\", \"KM\", \"MG\", \"SO\", \"TZ\", \"UG\", \"YT\"],\n\t\t\"Africa/Ndjamena\"               : [\"TD\"],\n\t\t\"Africa/Niamey\"                 : [\"NE\"],\n\t\t\"Africa/Nouakchott\"             : [\"MR\"],\n\t\t\"Africa/Ouagadougou\"            : [\"BF\"],\n\t\t\"Africa/Porto-Novo\"             : [\"BJ\"],\n\t\t\"Africa/Sao_Tome\"               : [\"ST\"],\n\t\t\"Africa/Timbuktu\"               : [\"ML\"],\n\t\t\"Africa/Tripoli\"                : [\"LY\"],\n\t\t\"Africa/Tunis\"                  : [\"TN\"],\n\t\t\"Africa/Windhoek\"               : [\"NA\"],\n\t\t\"America/Adak\"                  : [\"US\"],\n\t\t\"America/Anchorage\"             : [\"US\"],\n\t\t\"America/Anguilla\"              : [\"AI\"],\n\t\t\"America/Antigua\"               : [\"AG\"],\n\t\t\"America/Araguaina\"             : [\"BR\"],\n\t\t\"America/Argentina/Buenos_Aires\": [\"AR\"],\n\t\t\"America/Argentina/Catamarca\"   : [\"AR\"],\n\t\t\"America/Argentina/Cordoba\"     : [\"AR\"],\n\t\t\"America/Argentina/Jujuy\"       : [\"AR\"],\n\t\t\"America/Argentina/La_Rioja\"    : [\"AR\"],\n\t\t\"America/Argentina/Mendoza\"     : [\"AR\"],\n\t\t\"America/Argentina/Rio_Gallegos\": [\"AR\"],\n\t\t\"America/Argentina/Salta\"       : [\"AR\"],\n\t\t\"America/Argentina/San_Juan\"    : [\"AR\"],\n\t\t\"America/Argentina/San_Luis\"    : [\"AR\"],\n\t\t\"America/Argentina/Tucuman\"     : [\"AR\"],\n\t\t\"America/Argentina/Ushuaia\"     : [\"AR\"],\n\t\t\"America/Aruba\"                 : [\"AW\"],\n\t\t\"America/Asuncion\"              : [\"PY\"],\n\t\t\"America/Atikokan\"              : [\"CA\"],\n\t\t\"America/Bahia\"                 : [\"BR\"],\n\t\t\"America/Bahia_Banderas\"        : [\"MX\"],\n\t\t\"America/Barbados\"              : [\"BB\"],\n\t\t\"America/Belem\"                 : [\"BR\"],\n\t\t\"America/Belize\"                : [\"BZ\"],\n\t\t\"America/Blanc-Sablon\"          : [\"CA\"],\n\t\t\"America/Boa_Vista\"             : [\"BR\"],\n\t\t\"America/Bogota\"                : [\"CO\"],\n\t\t\"America/Boise\"                 : [\"US\"],\n\t\t\"America/Cambridge_Bay\"         : [\"CA\"],\n\t\t\"America/Campo_Grande\"          : [\"BR\"],\n\t\t\"America/Cancun\"                : [\"MX\"],\n\t\t\"America/Caracas\"               : [\"VE\"],\n\t\t\"America/Cayenne\"               : [\"GF\"],\n\t\t\"America/Cayman\"                : [\"KY\"],\n\t\t\"America/Chicago\"               : [\"US\"],\n\t\t\"America/Chihuahua\"             : [\"MX\"],\n\t\t\"America/Coral_Harbour\"         : [\"CA\"],\n\t\t\"America/Costa_Rica\"            : [\"CR\"],\n\t\t\"America/Creston\"               : [\"CA\"],\n\t\t\"America/Cuiaba\"                : [\"BR\"],\n\t\t\"America/Curacao\"               : [\"CW\"],\n\t\t\"America/Danmarkshavn\"          : [\"GL\"],\n\t\t\"America/Dawson\"                : [\"CA\"],\n\t\t\"America/Dawson_Creek\"          : [\"CA\"],\n\t\t\"America/Denver\"                : [\"US\"],\n\t\t\"America/Detroit\"               : [\"US\"],\n\t\t\"America/Dominica\"              : [\"DM\"],\n\t\t\"America/Edmonton\"              : [\"CA\"],\n\t\t\"America/Eirunepe\"              : [\"BR\"],\n\t\t\"America/El_Salvador\"           : [\"SV\"],\n\t\t\"America/Fort_Nelson\"           : [\"CA\"],\n\t\t\"America/Fortaleza\"             : [\"BR\"],\n\t\t\"America/Glace_Bay\"             : [\"CA\"],\n\t\t\"America/Goose_Bay\"             : [\"CA\"],\n\t\t\"America/Grand_Turk\"            : [\"TC\"],\n\t\t\"America/Grenada\"               : [\"GD\"],\n\t\t\"America/Guadeloupe\"            : [\"GP\"],\n\t\t\"America/Guatemala\"             : [\"GT\"],\n\t\t\"America/Guayaquil\"             : [\"EC\"],\n\t\t\"America/Guyana\"                : [\"GY\"],\n\t\t\"America/Halifax\"               : [\"CA\"],\n\t\t\"America/Havana\"                : [\"CU\"],\n\t\t\"America/Hermosillo\"            : [\"MX\"],\n\t\t\"America/Indiana/Indianapolis\"  : [\"US\"],\n\t\t\"America/Indiana/Knox\"          : [\"US\"],\n\t\t\"America/Indiana/Marengo\"       : [\"US\"],\n\t\t\"America/Indiana/Petersburg\"    : [\"US\"],\n\t\t\"America/Indiana/Tell_City\"     : [\"US\"],\n\t\t\"America/Indiana/Vevay\"         : [\"US\"],\n\t\t\"America/Indiana/Vincennes\"     : [\"US\"],\n\t\t\"America/Indiana/Winamac\"       : [\"US\"],\n\t\t\"America/Inuvik\"                : [\"CA\"],\n\t\t\"America/Iqaluit\"               : [\"CA\"],\n\t\t\"America/Jamaica\"               : [\"JM\"],\n\t\t\"America/Juneau\"                : [\"US\"],\n\t\t\"America/Kentucky/Louisville\"   : [\"US\"],\n\t\t\"America/Kentucky/Monticello\"   : [\"US\"],\n\t\t\"America/Kralendijk\"            : [\"BQ\"],\n\t\t\"America/La_Paz\"                : [\"BO\"],\n\t\t\"America/Lima\"                  : [\"PE\"],\n\t\t\"America/Los_Angeles\"           : [\"US\"],\n\t\t\"America/Lower_Princes\"         : [\"SX\"],\n\t\t\"America/Maceio\"                : [\"BR\"],\n\t\t\"America/Managua\"               : [\"NI\"],\n\t\t\"America/Manaus\"                : [\"BR\"],\n\t\t\"America/Marigot\"               : [\"MF\"],\n\t\t\"America/Martinique\"            : [\"MQ\"],\n\t\t\"America/Matamoros\"             : [\"MX\"],\n\t\t\"America/Mazatlan\"              : [\"MX\"],\n\t\t\"America/Menominee\"             : [\"US\"],\n\t\t\"America/Merida\"                : [\"MX\"],\n\t\t\"America/Metlakatla\"            : [\"US\"],\n\t\t\"America/Mexico_City\"           : [\"MX\"],\n\t\t\"America/Miquelon\"              : [\"PM\"],\n\t\t\"America/Moncton\"               : [\"CA\"],\n\t\t\"America/Monterrey\"             : [\"MX\"],\n\t\t\"America/Montevideo\"            : [\"UY\"],\n\t\t\"America/Montreal\"              : [\"CA\"],\n\t\t\"America/Montserrat\"            : [\"MS\"],\n\t\t\"America/Nassau\"                : [\"BS\"],\n\t\t\"America/New_York\"              : [\"US\"],\n\t\t\"America/Nipigon\"               : [\"CA\"],\n\t\t\"America/Nome\"                  : [\"US\"],\n\t\t\"America/Noronha\"               : [\"BR\"],\n\t\t\"America/North_Dakota/Beulah\"   : [\"US\"],\n\t\t\"America/North_Dakota/Center\"   : [\"US\"],\n\t\t\"America/North_Dakota/New_Salem\": [\"US\"],\n\t\t\"America/Nuuk\"                  : [\"GL\"],\n\t\t\"America/Ojinaga\"               : [\"MX\"],\n\t\t\"America/Panama\"                : [\"PA\", \"CA\", \"KY\"],\n\t\t\"America/Pangnirtung\"           : [\"CA\"],\n\t\t\"America/Paramaribo\"            : [\"SR\"],\n\t\t\"America/Phoenix\"               : [\"US\", \"CA\"],\n\t\t\"America/Port-au-Prince\"        : [\"HT\"],\n\t\t\"America/Port_of_Spain\"         : [\"TT\"],\n\t\t\"America/Porto_Velho\"           : [\"BR\"],\n\t\t\"America/Puerto_Rico\"           : [\"PR\", \"AG\", \"CA\", \"AI\", \"AW\", \"BL\", \"BQ\", \"CW\", \"DM\", \"GD\", \"GP\", \"KN\", \"LC\", \"MF\", \"MS\", \"SX\", \"TT\", \"VC\", \"VG\", \"VI\"],\n\t\t\"America/Punta_Arenas\"          : [\"CL\"],\n\t\t\"America/Rainy_River\"           : [\"CA\"],\n\t\t\"America/Rankin_Inlet\"          : [\"CA\"],\n\t\t\"America/Recife\"                : [\"BR\"],\n\t\t\"America/Regina\"                : [\"CA\"],\n\t\t\"America/Resolute\"              : [\"CA\"],\n\t\t\"America/Rio_Branco\"            : [\"BR\"],\n\t\t\"America/Santarem\"              : [\"BR\"],\n\t\t\"America/Santiago\"              : [\"CL\"],\n\t\t\"America/Santo_Domingo\"         : [\"DO\"],\n\t\t\"America/Sao_Paulo\"             : [\"BR\"],\n\t\t\"America/Scoresbysund\"          : [\"GL\"],\n\t\t\"America/Sitka\"                 : [\"US\"],\n\t\t\"America/St_Barthelemy\"         : [\"BL\"],\n\t\t\"America/St_Johns\"              : [\"CA\"],\n\t\t\"America/St_Kitts\"              : [\"KN\"],\n\t\t\"America/St_Lucia\"              : [\"LC\"],\n\t\t\"America/St_Thomas\"             : [\"VI\"],\n\t\t\"America/St_Vincent\"            : [\"VC\"],\n\t\t\"America/Swift_Current\"         : [\"CA\"],\n\t\t\"America/Tegucigalpa\"           : [\"HN\"],\n\t\t\"America/Thule\"                 : [\"GL\"],\n\t\t\"America/Thunder_Bay\"           : [\"CA\"],\n\t\t\"America/Tijuana\"               : [\"MX\"],\n\t\t\"America/Toronto\"               : [\"CA\", \"BS\"],\n\t\t\"America/Tortola\"               : [\"VG\"],\n\t\t\"America/Vancouver\"             : [\"CA\"],\n\t\t\"America/Virgin\"                : [\"VI\"],\n\t\t\"America/Whitehorse\"            : [\"CA\"],\n\t\t\"America/Winnipeg\"              : [\"CA\"],\n\t\t\"America/Yakutat\"               : [\"US\"],\n\t\t\"America/Yellowknife\"           : [\"CA\"],\n\t\t\"Antarctica/Casey\"              : [\"AQ\"],\n\t\t\"Antarctica/Davis\"              : [\"AQ\"],\n\t\t\"Antarctica/DumontDUrville\"     : [\"AQ\"],\n\t\t\"Antarctica/Macquarie\"          : [\"AU\"],\n\t\t\"Antarctica/Mawson\"             : [\"AQ\"],\n\t\t\"Antarctica/McMurdo\"            : [\"AQ\"],\n\t\t\"Antarctica/Palmer\"             : [\"AQ\"],\n\t\t\"Antarctica/Rothera\"            : [\"AQ\"],\n\t\t\"Antarctica/South_Pole\"         : [\"AQ\"],\n\t\t\"Antarctica/Syowa\"              : [\"AQ\"],\n\t\t\"Antarctica/Troll\"              : [\"AQ\"],\n\t\t\"Antarctica/Vostok\"             : [\"AQ\"],\n\t\t\"Arctic/Longyearbyen\"           : [\"SJ\"],\n\t\t\"Asia/Aden\"                     : [\"YE\"],\n\t\t\"Asia/Almaty\"                   : [\"KZ\"],\n\t\t\"Asia/Amman\"                    : [\"JO\"],\n\t\t\"Asia/Anadyr\"                   : [\"RU\"],\n\t\t\"Asia/Aqtau\"                    : [\"KZ\"],\n\t\t\"Asia/Aqtobe\"                   : [\"KZ\"],\n\t\t\"Asia/Ashgabat\"                 : [\"TM\"],\n\t\t\"Asia/Atyrau\"                   : [\"KZ\"],\n\t\t\"Asia/Baghdad\"                  : [\"IQ\"],\n\t\t\"Asia/Bahrain\"                  : [\"BH\"],\n\t\t\"Asia/Baku\"                     : [\"AZ\"],\n\t\t\"Asia/Bangkok\"                  : [\"TH\", \"KH\", \"LA\", \"VN\"],\n\t\t\"Asia/Barnaul\"                  : [\"RU\"],\n\t\t\"Asia/Beirut\"                   : [\"LB\"],\n\t\t\"Asia/Bishkek\"                  : [\"KG\"],\n\t\t\"Asia/Brunei\"                   : [\"BN\"],\n\t\t\"Asia/Chita\"                    : [\"RU\"],\n\t\t\"Asia/Choibalsan\"               : [\"MN\"],\n\t\t\"Asia/Colombo\"                  : [\"LK\"],\n\t\t\"Asia/Damascus\"                 : [\"SY\"],\n\t\t\"Asia/Dhaka\"                    : [\"BD\"],\n\t\t\"Asia/Dili\"                     : [\"TL\"],\n\t\t\"Asia/Dubai\"                    : [\"AE\", \"OM\"],\n\t\t\"Asia/Dushanbe\"                 : [\"TJ\"],\n\t\t\"Asia/Famagusta\"                : [\"CY\"],\n\t\t\"Asia/Gaza\"                     : [\"PS\"],\n\t\t\"Asia/Hebron\"                   : [\"PS\"],\n\t\t\"Asia/Ho_Chi_Minh\"              : [\"VN\"],\n\t\t\"Asia/Hong_Kong\"                : [\"HK\"],\n\t\t\"Asia/Hovd\"                     : [\"MN\"],\n\t\t\"Asia/Irkutsk\"                  : [\"RU\"],\n\t\t\"Asia/Jakarta\"                  : [\"ID\"],\n\t\t\"Asia/Jayapura\"                 : [\"ID\"],\n\t\t\"Asia/Jerusalem\"                : [\"IL\"],\n\t\t\"Asia/Kabul\"                    : [\"AF\"],\n\t\t\"Asia/Kamchatka\"                : [\"RU\"],\n\t\t\"Asia/Karachi\"                  : [\"PK\"],\n\t\t\"Asia/Kathmandu\"                : [\"NP\"],\n\t\t\"Asia/Khandyga\"                 : [\"RU\"],\n\t\t\"Asia/Kolkata\"                  : [\"IN\"],\n\t\t\"Asia/Krasnoyarsk\"              : [\"RU\"],\n\t\t\"Asia/Kuala_Lumpur\"             : [\"MY\"],\n\t\t\"Asia/Kuching\"                  : [\"MY\"],\n\t\t\"Asia/Kuwait\"                   : [\"KW\"],\n\t\t\"Asia/Macau\"                    : [\"MO\"],\n\t\t\"Asia/Magadan\"                  : [\"RU\"],\n\t\t\"Asia/Makassar\"                 : [\"ID\"],\n\t\t\"Asia/Manila\"                   : [\"PH\"],\n\t\t\"Asia/Muscat\"                   : [\"OM\"],\n\t\t\"Asia/Nicosia\"                  : [\"CY\"],\n\t\t\"Asia/Novokuznetsk\"             : [\"RU\"],\n\t\t\"Asia/Novosibirsk\"              : [\"RU\"],\n\t\t\"Asia/Omsk\"                     : [\"RU\"],\n\t\t\"Asia/Oral\"                     : [\"KZ\"],\n\t\t\"Asia/Phnom_Penh\"               : [\"KH\"],\n\t\t\"Asia/Pontianak\"                : [\"ID\"],\n\t\t\"Asia/Pyongyang\"                : [\"KP\"],\n\t\t\"Asia/Qatar\"                    : [\"QA\", \"BH\"],\n\t\t\"Asia/Qostanay\"                 : [\"KZ\"],\n\t\t\"Asia/Qyzylorda\"                : [\"KZ\"],\n\t\t\"Asia/Riyadh\"                   : [\"SA\", \"AQ\", \"KW\", \"YE\"],\n\t\t\"Asia/Sakhalin\"                 : [\"RU\"],\n\t\t\"Asia/Samarkand\"                : [\"UZ\"],\n\t\t\"Asia/Seoul\"                    : [\"KR\"],\n\t\t\"Asia/Shanghai\"                 : [\"CN\"],\n\t\t\"Asia/Singapore\"                : [\"SG\", \"MY\"],\n\t\t\"Asia/Srednekolymsk\"            : [\"RU\"],\n\t\t\"Asia/Taipei\"                   : [\"TW\"],\n\t\t\"Asia/Tashkent\"                 : [\"UZ\"],\n\t\t\"Asia/Tbilisi\"                  : [\"GE\"],\n\t\t\"Asia/Tehran\"                   : [\"IR\"],\n\t\t\"Asia/Thimphu\"                  : [\"BT\"],\n\t\t\"Asia/Tokyo\"                    : [\"JP\"],\n\t\t\"Asia/Tomsk\"                    : [\"RU\"],\n\t\t\"Asia/Ulaanbaatar\"              : [\"MN\"],\n\t\t\"Asia/Urumqi\"                   : [\"CN\"],\n\t\t\"Asia/Ust-Nera\"                 : [\"RU\"],\n\t\t\"Asia/Vientiane\"                : [\"LA\"],\n\t\t\"Asia/Vladivostok\"              : [\"RU\"],\n\t\t\"Asia/Yakutsk\"                  : [\"RU\"],\n\t\t\"Asia/Yangon\"                   : [\"MM\"],\n\t\t\"Asia/Yekaterinburg\"            : [\"RU\"],\n\t\t\"Asia/Yerevan\"                  : [\"AM\"],\n\t\t\"Atlantic/Azores\"               : [\"PT\"],\n\t\t\"Atlantic/Bermuda\"              : [\"BM\"],\n\t\t\"Atlantic/Canary\"               : [\"ES\"],\n\t\t\"Atlantic/Cape_Verde\"           : [\"CV\"],\n\t\t\"Atlantic/Faroe\"                : [\"FO\"],\n\t\t\"Atlantic/Jan_Mayen\"            : [\"SJ\"],\n\t\t\"Atlantic/Madeira\"              : [\"PT\"],\n\t\t\"Atlantic/Reykjavik\"            : [\"IS\"],\n\t\t\"Atlantic/South_Georgia\"        : [\"GS\"],\n\t\t\"Atlantic/St_Helena\"            : [\"SH\"],\n\t\t\"Atlantic/Stanley\"              : [\"FK\"],\n\t\t\"Australia/Adelaide\"            : [\"AU\"],\n\t\t\"Australia/Brisbane\"            : [\"AU\"],\n\t\t\"Australia/Broken_Hill\"         : [\"AU\"],\n\t\t\"Australia/Darwin\"              : [\"AU\"],\n\t\t\"Australia/Eucla\"               : [\"AU\"],\n\t\t\"Australia/Hobart\"              : [\"AU\"],\n\t\t\"Australia/Lindeman\"            : [\"AU\"],\n\t\t\"Australia/Lord_Howe\"           : [\"AU\"],\n\t\t\"Australia/Melbourne\"           : [\"AU\"],\n\t\t\"Australia/Perth\"               : [\"AU\"],\n\t\t\"Australia/Sydney\"              : [\"AU\"],\n\t\t\"Canada/Eastern\"                : [\"CA\"],\n\t\t\"Europe/Amsterdam\"              : [\"NL\"],\n\t\t\"Europe/Andorra\"                : [\"AD\"],\n\t\t\"Europe/Astrakhan\"              : [\"RU\"],\n\t\t\"Europe/Athens\"                 : [\"GR\"],\n\t\t\"Europe/Belfast\"                : [\"GB\"],\n\t\t\"Europe/Belgrade\"               : [\"RS\", \"BA\", \"HR\", \"ME\", \"MK\", \"SI\"],\n\t\t\"Europe/Berlin\"                 : [\"DE\"],\n\t\t\"Europe/Bratislava\"             : [\"SK\"],\n\t\t\"Europe/Brussels\"               : [\"BE\"],\n\t\t\"Europe/Bucharest\"              : [\"RO\"],\n\t\t\"Europe/Budapest\"               : [\"HU\"],\n\t\t\"Europe/Busingen\"               : [\"DE\"],\n\t\t\"Europe/Chisinau\"               : [\"MD\"],\n\t\t\"Europe/Copenhagen\"             : [\"DK\"],\n\t\t\"Europe/Dublin\"                 : [\"IE\"],\n\t\t\"Europe/Gibraltar\"              : [\"GI\"],\n\t\t\"Europe/Guernsey\"               : [\"GG\"],\n\t\t\"Europe/Helsinki\"               : [\"FI\", \"AX\"],\n\t\t\"Europe/Isle_of_Man\"            : [\"IM\"],\n\t\t\"Europe/Istanbul\"               : [\"TR\"],\n\t\t\"Europe/Jersey\"                 : [\"JE\"],\n\t\t\"Europe/Kaliningrad\"            : [\"RU\"],\n\t\t\"Europe/Kiev\"                   : [\"UA\"],\n\t\t\"Europe/Kirov\"                  : [\"RU\"],\n\t\t\"Europe/Lisbon\"                 : [\"PT\"],\n\t\t\"Europe/Ljubljana\"              : [\"SI\"],\n\t\t\"Europe/London\"                 : [\"GB\", \"GG\", \"IM\", \"JE\"],\n\t\t\"Europe/Luxembourg\"             : [\"LU\"],\n\t\t\"Europe/Madrid\"                 : [\"ES\"],\n\t\t\"Europe/Malta\"                  : [\"MT\"],\n\t\t\"Europe/Mariehamn\"              : [\"AX\"],\n\t\t\"Europe/Minsk\"                  : [\"BY\"],\n\t\t\"Europe/Monaco\"                 : [\"MC\"],\n\t\t\"Europe/Moscow\"                 : [\"RU\"],\n\t\t\"Europe/Oslo\"                   : [\"NO\", \"SJ\", \"BV\"],\n\t\t\"Europe/Paris\"                  : [\"FR\"],\n\t\t\"Europe/Podgorica\"              : [\"ME\"],\n\t\t\"Europe/Prague\"                 : [\"CZ\", \"SK\"],\n\t\t\"Europe/Riga\"                   : [\"LV\"],\n\t\t\"Europe/Rome\"                   : [\"IT\", \"SM\", \"VA\"],\n\t\t\"Europe/Samara\"                 : [\"RU\"],\n\t\t\"Europe/San_Marino\"             : [\"SM\"],\n\t\t\"Europe/Sarajevo\"               : [\"BA\"],\n\t\t\"Europe/Saratov\"                : [\"RU\"],\n\t\t\"Europe/Simferopol\"             : [\"RU\", \"UA\"],\n\t\t\"Europe/Skopje\"                 : [\"MK\"],\n\t\t\"Europe/Sofia\"                  : [\"BG\"],\n\t\t\"Europe/Stockholm\"              : [\"SE\"],\n\t\t\"Europe/Tallinn\"                : [\"EE\"],\n\t\t\"Europe/Tirane\"                 : [\"AL\"],\n\t\t\"Europe/Ulyanovsk\"              : [\"RU\"],\n\t\t\"Europe/Uzhgorod\"               : [\"UA\"],\n\t\t\"Europe/Vaduz\"                  : [\"LI\"],\n\t\t\"Europe/Vatican\"                : [\"VA\"],\n\t\t\"Europe/Vienna\"                 : [\"AT\"],\n\t\t\"Europe/Vilnius\"                : [\"LT\"],\n\t\t\"Europe/Volgograd\"              : [\"RU\"],\n\t\t\"Europe/Warsaw\"                 : [\"PL\"],\n\t\t\"Europe/Zagreb\"                 : [\"HR\"],\n\t\t\"Europe/Zaporozhye\"             : [\"UA\"],\n\t\t\"Europe/Zurich\"                 : [\"CH\", \"DE\", \"LI\"],\n\t\t\"GB\"                            : [\"GB\"],\n\t\t\"GB-Eire\"                       : [\"GB\"],\n\t\t\"Indian/Antananarivo\"           : [\"MG\"],\n\t\t\"Indian/Chagos\"                 : [\"IO\"],\n\t\t\"Indian/Christmas\"              : [\"CX\"],\n\t\t\"Indian/Cocos\"                  : [\"CC\"],\n\t\t\"Indian/Comoro\"                 : [\"KM\"],\n\t\t\"Indian/Kerguelen\"              : [\"TF\", \"HM\"],\n\t\t\"Indian/Mahe\"                   : [\"SC\"],\n\t\t\"Indian/Maldives\"               : [\"MV\"],\n\t\t\"Indian/Mauritius\"              : [\"MU\"],\n\t\t\"Indian/Mayotte\"                : [\"YT\"],\n\t\t\"Indian/Reunion\"                : [\"RE\", \"TF\"],\n\t\t\"NZ\"                            : [\"NZ\"],\n\t\t\"Pacific/Apia\"                  : [\"WS\"],\n\t\t\"Pacific/Auckland\"              : [\"NZ\", \"AQ\"],\n\t\t\"Pacific/Bougainville\"          : [\"PG\"],\n\t\t\"Pacific/Chatham\"               : [\"NZ\"],\n\t\t\"Pacific/Chuuk\"                 : [\"FM\"],\n\t\t\"Pacific/Easter\"                : [\"CL\"],\n\t\t\"Pacific/Efate\"                 : [\"VU\"],\n\t\t\"Pacific/Fakaofo\"               : [\"TK\"],\n\t\t\"Pacific/Fiji\"                  : [\"FJ\"],\n\t\t\"Pacific/Funafuti\"              : [\"TV\"],\n\t\t\"Pacific/Galapagos\"             : [\"EC\"],\n\t\t\"Pacific/Gambier\"               : [\"PF\"],\n\t\t\"Pacific/Guadalcanal\"           : [\"SB\"],\n\t\t\"Pacific/Guam\"                  : [\"GU\", \"MP\"],\n\t\t\"Pacific/Honolulu\"              : [\"US\", \"UM\"],\n\t\t\"Pacific/Johnston\"              : [\"UM\"],\n\t\t\"Pacific/Kanton\"                : [\"KI\"],\n\t\t\"Pacific/Kiritimati\"            : [\"KI\"],\n\t\t\"Pacific/Kosrae\"                : [\"FM\"],\n\t\t\"Pacific/Kwajalein\"             : [\"MH\"],\n\t\t\"Pacific/Majuro\"                : [\"MH\"],\n\t\t\"Pacific/Marquesas\"             : [\"PF\"],\n\t\t\"Pacific/Midway\"                : [\"UM\"],\n\t\t\"Pacific/Nauru\"                 : [\"NR\"],\n\t\t\"Pacific/Niue\"                  : [\"NU\"],\n\t\t\"Pacific/Norfolk\"               : [\"NF\"],\n\t\t\"Pacific/Noumea\"                : [\"NC\"],\n\t\t\"Pacific/Pago_Pago\"             : [\"AS\", \"UM\"],\n\t\t\"Pacific/Palau\"                 : [\"PW\"],\n\t\t\"Pacific/Pitcairn\"              : [\"PN\"],\n\t\t\"Pacific/Pohnpei\"               : [\"FM\"],\n\t\t\"Pacific/Port_Moresby\"          : [\"PG\", \"AQ\"],\n\t\t\"Pacific/Rarotonga\"             : [\"CK\"],\n\t\t\"Pacific/Saipan\"                : [\"MP\"],\n\t\t\"Pacific/Samoa\"                 : [\"WS\"],\n\t\t\"Pacific/Tahiti\"                : [\"PF\"],\n\t\t\"Pacific/Tarawa\"                : [\"KI\"],\n\t\t\"Pacific/Tongatapu\"             : [\"TO\"],\n\t\t\"Pacific/Wake\"                  : [\"UM\"],\n\t\t\"Pacific/Wallis\"                : [\"WF\"],\n\t\t\"Singapore\"                     : [\"SG\"],\n\t\t\"US/Arizona\"                    : [\"US\"],\n\t\t\"US/Hawaii\"                     : [\"US\"],\n\t\t\"US/Samoa\"                      : [\"WS\"],\n\t}\n\n\tconst timezone = Intl.DateTimeFormat().resolvedOptions().timeZone\n\n\tif (timezone === \"\" || !timezone) {\n\t\treturn null\n\t}\n\n\tlet geoLocation = {\n\t\tcountryCode: timezones[timezone][0].toUpperCase(),\n\t}\n\n\t// if the timezone is equals \"America/Los_Angeles\" then add the regionCode \"US-CA\"\n\tif (timezone === \"America/Los_Angeles\") {\n\t\tgeoLocation.regionCode = \"US-CA\"\n\t}\n\n\tif (timezone === \"Europe/Zurich\") {\n\t\tgeoLocation.regionCode = \"CH-ZH\"\n\t}\n\n\treturn geoLocation\n}\n\n\n\n\n","/**\n * Logs a message to the console if the logger is enabled.\n *\n * @module console\n * @param message\n * @param objects\n * @public\n * @returns {void}\n */\nexport const log = (message, ...objects) => {\n\n\tif (!isLoggerEnabled()) return\n\n\tif (typeof message === \"object\") {\n\t\tconsole.log(\"Pixel Manager: \", message, ...objects)\n\t} else if (objects.length) {\n\t\tconsole.log(\"Pixel Manager: \" + message, ...objects)\n\t} else {\n\t\tconsole.log(\"Pixel Manager: \" + message)\n\t}\n}\n\n/**\n * Logs an error message to the console.\n *\n * @module console\n * @param message\n * @param objects\n * @public\n * @returns {void}\n */\nexport const error = (message, ...objects) => {\n\n\t// if (!isLoggerEnabled()) return\n\n\t// if message is an object, log the keys\n\tif (typeof message === \"object\") {\n\t\tconsole.error(\"Pixel Manager: \", message, ...objects)\n\t} else if (objects.length) {\n\t\tconsole.error(\"Pixel Manager: \" + message, ...objects)\n\t} else {\n\t\tconsole.error(\"Pixel Manager: \" + message)\n\t}\n}\n\n/**\n * Checks if the logger is enabled.\n *\n * @return {boolean}\n */\nconst isLoggerEnabled = () => {\n\n\tif (urlLoggerOff()) return false\n\n\tif (sessionLoggerEnabled()) return true\n\n\tif (urlLoggerOn()) return true\n\n\treturn !!wpmDataLayer?.general?.logger?.is_active\n}\n\n/**\n * Turn off the logger if the URL parameter is set.\n *\n * @return {boolean}\n */\nconst urlLoggerOff = () => {\n\n\tif (wpm.urlHasParameter(\"pmwloggeroff\")) {\n\t\twpm.storeData(\"loggerEnabled\", false)\n\t}\n\n\treturn wpm.urlHasParameter(\"pmwloggeroff\")\n}\n\n/**\n * Check if the logger is enabled for the session.\n *\n * @return {boolean}\n */\nconst sessionLoggerEnabled = () => {\n\treturn wpm.retrieveData(\"loggerEnabled\")\n}\n\n/**\n * Turn on the logger if the URL parameter is set.\n *\n * @return {boolean}\n */\nconst urlLoggerOn = () => {\n\n\tif (wpm.urlHasParameter(\"pmwloggeron\")) {\n\t\twpm.storeData(\"loggerEnabled\", true)\n\t}\n\n\treturn wpm.urlHasParameter(\"pmwloggeron\")\n}\n","/**\n * Load all PMW functions\n *\n * Ignore event listeners. They need to be loaded after\n * we made sure that jQuery has been loaded.\n */\n\nrequire(\"./functions\")\n\n/**\n * Load consent management module as a chunk\n * @returns {Promise<void>}\n */\nwindow.wpm.loadConsentModule = async () => {\n\tconst consentModule = await import(/* webpackChunkName: \"consent-management\" */ \"./consent/consent.mjs\")\n\twindow.wpm.consent = consentModule\n\t\n\tconst apiModule = await import(/* webpackChunkName: \"consent-api\" */ \"./consent/api.mjs\")\n\twindow.pmw = window.pmw || {}\n\twindow.pmw.consent = window.pmw.consent || {}\n\twindow.pmw.consent.api = apiModule\n\t\n\treturn consentModule\n}\n\nwindow.pmw = window.pmw || {\n\tconsole: require(\"./console.mjs\"),\n}\n\nrequire(\"./ip_services\")\n\n// #if process.env.TIER === 'premium'\n// if (wpm.canLoadPremiumFeatures()) {\n// \trequire(\"./functions_premium\")\n// }\n// #endif\n","// a function that removes all \\n and \\t and html tags from a string\nconst removeHtmlTagsAndWhitespace = string => {\n\n\tstring = string.replace(/<[^>]*>?/gm, \"\").replace(/\\n/gm, \"\").replace(/\\t/gm, \"\");\n\tstring = string.trim();\n\n\treturn string;\n};\n\n/**\n * add_shipping_info event\n */\n\n// trigger when #shipping_method is changed\njQuery(\"form.woocommerce-checkout\").on(\"change\", \"#shipping_method\", (event) => {\n\n\tif (!event.target?.value) return;\n\tif (!event.target?.id) return;\n\n\ttriggerAddShippingInfoEvent({\n\t\tslug: event.target.value,\n\t\ttext: removeHtmlTagsAndWhitespace(jQuery(\"label[for='\" + event.target.id + \"']\").text()),\n\t});\n});\n\n// trigger when a shipping method is already selected on page load\njQuery(() => {\n\tif (jQuery(\"#shipping_method\").length) {\n\n\t\t// get the checked shipping method from #shipping_method\n\t\tlet checkedShippingMethod = jQuery(\"#shipping_method\").find(\":checked\");\n\n\t\t// if there is a checked shipping method\n\t\tif (checkedShippingMethod.length) {\n\n\t\t\tif (!checkedShippingMethod.val()) return;\n\t\t\tif (!checkedShippingMethod.attr(\"id\")) return;\n\n\t\t\ttriggerAddShippingInfoEvent({\n\t\t\t\tslug: checkedShippingMethod.val(),\n\t\t\t\ttext: removeHtmlTagsAndWhitespace(jQuery(\"label[for='\" + checkedShippingMethod.attr(\"id\") + \"']\").text()),\n\t\t\t});\n\t\t}\n\t}\n});\n\n// trigger when a shipping method is selected on page load\nconst triggerAddShippingInfoEvent = shippingTier => {\n\tjQuery(document).trigger(\"pmw:add-shipping-info\", {shippingTier});\n};\n\n/**\n * add_payment_info event\n */\n\n\t  // flag to prevent double logging of payment method change on pageload\nlet paymentMethodChangeLogged = false;\n\n// trigger when a payment method is selected\njQuery(\"form.woocommerce-checkout\").on(\"change\", \"input[name=\\\"payment_method\\\"]\", event => {\n\n\tif (!event.target.value) return;\n\tif (!event.target.id) return;\n\n\ttriggerAddPaymentInfoEvent({\n\t\tslug: event.target.value,\n\t\ttext: removeHtmlTagsAndWhitespace(jQuery(\"label[for='\" + event.target.id + \"']\").text()),\n\t});\n\n\tpaymentMethodChangeLogged = true;\n});\n\n// trigger when a payment method is already selected on page load\njQuery(() => {\n\n\t// prevent double logging of payment method change on pageload\n\tif (paymentMethodChangeLogged) return;\n\n\tlet checkedPaymentMethod = jQuery(\"input[name=\\\"payment_method\\\"]:checked\");\n\n\tif (checkedPaymentMethod.length) {\n\n\t\tif (!checkedPaymentMethod.val()) return;\n\t\tif (!checkedPaymentMethod.attr(\"id\")) return;\n\n\t\ttriggerAddPaymentInfoEvent({\n\t\t\tslug: checkedPaymentMethod.val(),\n\t\t\ttext: removeHtmlTagsAndWhitespace(jQuery(\"label[for='\" + checkedPaymentMethod.attr(\"id\") + \"']\").text()),\n\t\t});\n\t}\n});\n\n// trigger when a payment method is selected on page load\nconst triggerAddPaymentInfoEvent = paymentType => {\n\tjQuery(document).trigger(\"pmw:add-payment-info\", {paymentType});\n};\n\n/**\n * remove_from_cart event\n *\n * Cannot be attached directly because the mini cart doesn't necessarily contain the remove button on page load.\n */\njQuery(document).on(\"click\", \".remove_from_cart_button, .remove\", (event) => {\n\n\t// console.log(\"remove_from_cart event\" + new Date().getTime())\n\n\ttry {\n\n\t\tlet url       = new URL(jQuery(event.currentTarget).attr(\"href\"));\n\t\tlet productId = wpm.getProductIdByCartItemKeyUrl(url);\n\n\t\twpm.removeProductFromCart(productId);\n\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n\n/**\n * begin_checkout event\n *\n * Cannot be attached directly because the mini cart doesn't necessarily contain the remove button on page load.\n */\nlet checkoutButtonClasses = [\n\t// \".checkout\", // this is too generic. It triggers on the checkout page on some themes fore each interaction with the checkout form.\n\t\".checkout-button\",\n\t\".cart-checkout-button\",\n\t\".button.checkout\",\n\t\".xoo-wsc-ft-btn-checkout\", // https://xootix.com/side-cart-for-woocommerce/\n\t\".elementor-button--checkout\",\n\t\".xt_woofc-checkout\", // https://wordpress.org/plugins/woo-floating-cart-lite/\n\t\".fkcart-checkout--text\", // https://funnelkit.com/\n];\n\nconst checkoutButtonSelectors = wpm.prepareSelectors(checkoutButtonClasses, \"beginCheckout\");\n\n// https://wordpress.stackexchange.com/a/352171/68337\njQuery(document).on(\"click init_checkout\", checkoutButtonSelectors, () => {\n\tjQuery(document).trigger(\"pmw:begin-checkout\");\n});\n\njQuery(document).on(\"updated_cart_totals\", () => {\n\tjQuery(document).trigger(\"pmw:view-cart\");\n});\n\n/**\n * Set up PWM events\n */\n\n// track checkout option event: purchase click\n// https://wordpress.stackexchange.com/a/352171/68337\njQuery(document).on(\"wpmLoad\", (event) => {\n\tjQuery(document).on(\"payment_method_selected\", () => {\n\n\t\tif (false === wpm.paymentMethodSelected) {\n\t\t\twpm.fireCheckoutProgress(3);\n\t\t}\n\n\t\twpm.fireCheckoutOption(3, jQuery(\"input[name='payment_method']:checked\").val());\n\t\twpm.paymentMethodSelected = true;\n\t});\n});\n\n// populate the wpmDataLayer with the cart items\njQuery(document).on(\"wpmLoad\", () => {\n\n\ttry {\n\t\twpm.initCart();\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n// get all add-to-cart= products from backend\njQuery(document).on(\"wpmLoad\", () => {\n\n\twpmDataLayer.products = wpmDataLayer.products || {};\n\n\t// scan page for add-to-cart= links\n\tlet productIds = wpm.getAddToCartLinkProductIds();\n\n\twpm.getProductsFromBackend(productIds);\n});\n\n/**\n * Save the referrer into a cookie\n *\n * @returns {void}\n */\njQuery(document).on(\"wpmLoad\", () => {\n\n\t// If there is no referrer, then return\n\tif (!document.referrer) {\n\t\treturn;\n\t}\n\n\t// If the referrer is already stored, then return\n\tif (wpm.retrieveData(\"referrer\")) {\n\t\treturn;\n\t}\n\n\tlet referrerUrl      = new URL(document.referrer);\n\tlet referrerHostname = referrerUrl.hostname;\n\n\tif (referrerHostname !== window.location.host) {\n\t\twpm.storeData(\"referrer\", referrerHostname);\n\t}\n});\n\n/**\n * Collect parameters from the URL\n * and save them to the PMW session storage.\n * Parameters:\n * - gclid\n * - wbraid\n * - gbraid\n * - fbclid\n * - ttclid\n * - ScCid\n * - epik\n *\n * @returns {void}\n * */\njQuery(document).on(\"wpmLoad\", () => {\n\n\tlet gclid = wpm.getUrlParameter(\"gclid\");\n\tif (gclid) wpm.storeData(\"gclid\", gclid);\n\n\tlet wbraid = wpm.getUrlParameter(\"wbraid\");\n\tif (wbraid) wpm.storeData(\"wbraid\", wbraid);\n\n\tlet gbraid = wpm.getUrlParameter(\"gbraid\");\n\tif (gbraid) wpm.storeData(\"gbraid\", gbraid);\n\n\t// https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/fbp-and-fbc\n\tlet fbclid = wpm.getUrlParameter(\"fbclid\");\n\tif (fbclid) {\n\t\tfbclid = \"fb.1.\" + Math.floor(Date.now() / 1000) + \".\" + fbclid;\n\t\twpm.storeData(\"fbclid\", fbclid);\n\t}\n\n\tlet ttclid = wpm.getUrlParameter(\"ttclid\");\n\tif (ttclid) wpm.storeData(\"ttclid\", ttclid);\n\n\tlet scid = wpm.getUrlParameter(\"ScCid\");\n\tif (scid) wpm.storeData(\"scid\", scid);\n\n\tlet epik = wpm.getUrlParameter(\"epik\");\n\tif (epik) wpm.storeData(\"epik\", epik);\n});\n\n/**\n * Create our own load event in order to better handle script flow execution when JS \"optimizers\" shuffle the code.\n */\njQuery(document).on(\"wpmLoad\", () => {\n\t// document.addEventListener(\"wpmLoad\", function () {\n\ttry {\n\t\tif (typeof wpmDataLayer != \"undefined\" && !wpmDataLayer?.pmw_loaded) {\n\n\t\t\tjQuery(document).trigger(\"pmw:load-always\");\n\n\t\t\tif (wpmDataLayer?.shop) {\n\t\t\t\tif (\n\t\t\t\t\t\"product\" === wpmDataLayer.shop.page_type &&\n\t\t\t\t\t\"variable\" !== wpmDataLayer.shop.product_type &&\n\t\t\t\t\twpm.getMainProductIdFromProductPage()\n\t\t\t\t) {\n\t\t\t\t\tlet product = wpm.getProductDataForViewItemEvent(wpm.getMainProductIdFromProductPage());\n\t\t\t\tjQuery(document).trigger(\"pmw:view-item\", product);\n\t\t\t} else if (\"product_category\" === wpmDataLayer.shop.page_type) {\n\t\t\t\tjQuery(document).trigger(\"pmw:view-category\");\n\t\t\t} else if (\"search\" === wpmDataLayer.shop.page_type) {\n\t\t\t\tjQuery(document).trigger(\"pmw:search\");\n\t\t\t} else if (\"cart\" === wpmDataLayer.shop.page_type) {\n\t\t\t\tjQuery(document).trigger(\"pmw:view-cart\");\n\t\t\t} else if (\"order_received_page\" === wpmDataLayer.shop.page_type) {\n\t\t\t\tif (wpmDataLayer?.order && !wpm.isOrderIdStored(wpmDataLayer.order.id)) {\n\t\t\t\t\tjQuery(document).trigger(\"pmw:purchase\");\n\t\t\t\t\twpm.writeOrderIdToStorage(wpmDataLayer.order.id, wpmDataLayer.order.key);\n\t\t\t\t\tif (typeof wpm.acrRemoveCookie === \"function\") wpm.acrRemoveCookie();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tjQuery(document).trigger(\"pmw:everywhere-else\");\n\t\t\t}\n\t\t} else {\n\t\t\tjQuery(document).trigger(\"pmw:everywhere-else\");\n\t\t}\t\t\tif (wpmDataLayer?.user?.id && !wpm.hasLoginEventFired()) {\n\t\t\t\tjQuery(document).trigger(\"pmw:login\");\n\t\t\t\twpm.setLoginEventFired();\n\t\t\t}\n\n\t\t\twpmDataLayer.pmw_loaded = true;\n\t\t}\n\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n/**\n * Register the show_variation event listener\n * in case lazy loading is enabled\n * because we have to register it immediately\n * and not after the onready event.\n */\nif (wpmDataLayer?.general?.lazy_load_pmw) {\n\twpm.registerShowVariationEventListener();\n}\n\n/**\n * In case lazy loading is enabled\n * we need to trigger the view-item event on\n * preselected variations.\n *\n * Check if a variation is selected on a variable product page\n * and trigger the view-item event if a variation is selected\n *\n * Fallback for the jQuery(\".single_variation_wrap\").on(\"show_variation\", (event, variation) => {}) event listener\n * in case lazy loading is enabled and the event listener is not triggered.\n */\njQuery(document).on(\"wpmLoad\", () => {\n\tif (!wpmDataLayer?.general?.lazy_load_pmw) return;\n\n\ttry {\n\t\tconst $variationForm = jQuery(\".variations_form\");\n\t\tif (!$variationForm.length) return;\n\n\t\tconst selectedValues = {};\n\t\tconst allSelected    = $variationForm.find(\"select\").toArray().every(select => {\n\t\t\tconst value = jQuery(select).val();\n\t\t\tif (value) {\n\t\t\t\tselectedValues[jQuery(select).attr(\"name\")] = value;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\n\t\tif (!allSelected) return;\n\n\t\tconst productVariations = $variationForm.data(\"product_variations\");\n\t\tif (!productVariations) return;\n\n\t\tconst matchingVariation = productVariations.find(variation =>\n\t\t\tObject.entries(selectedValues).every(([key, value]) =>\n\t\t\t\tvariation.attributes[key] === value,\n\t\t\t),\n\t\t);\n\n\t\tif (matchingVariation) {\n\t\t\twpm.triggerViewItemEventPrep(matchingVariation.variation_id);\n\t\t}\n\t} catch (e) {\n\t\tpmw.console.error(e);\n\t}\n});\n\n// Check if the REST endpoint is available and log an error if it is not\njQuery(document).on(\"wpmLoad\", async () => {\n\tif (wpm.retrieveData(\"restEndpointAvailable\") === false) pmw.console.error(\"REST endpoint is not available. Using admin-ajax.php instead.\");\n});\n\n/**\n * All s2s events\n */\n\n/**\n * PageView event\n */\njQuery(document).on(\"pmw:page-view\", (event) => {\n\n\tpmw.console.log(\"pmw:page-view event fired\", {event});\n\n\t/**\n\t * Prepare the payload\n\t */\n\n\tlet payload = {\n\t\tevent: \"page_view\",\n\t\tpixels: {}\n\t};\n\n\t// Facebook\n\t// If Facebook pixel is loaded, add Facebook server to server event data to the payload\n\tif (wpmDataLayer?.pixels?.facebook?.loaded) {\n\t\tpayload.pixels.facebook = {\n\t\t\tevent_name      : \"PageView\",\n\t\t\tevent_id        : wpm.getFbRandomEventId(),\n\t\t\tuser_data       : wpm.getFbUserData(),\n\t\t\tevent_source_url: window.location.href,\n\t\t};\n\n\t\tif (wpm.retrieveData(\"referrer\")) {\n\t\t\tpayload.pixels.facebook.referrer_url = wpm.makeFullUrl(wpm.retrieveData(\"referrer\"));\n\t\t}\n\t}\n\n\t// Pinterest\n\t// https://developers.pinterest.com/docs/conversions/best/\n\t// https://developers.pinterest.com/docs/api/v5/#operation/events/create\n\t// https://developers.pinterest.com/docs/conversions/event/\n\t// if (wpmDataLayer?.pixels?.pinterest?.loaded) {\n\t//\n\t// \tpayload.pixels.pinterest = wpm.getPinterestS2SBaseData();\n\t//\n\t// \tpayload.pixels.pinterest.event_name  = \"addtocart\";\n\t// \tpayload.pixels.pinterest.custom_data = wpm.pinterestGetProductDataForCapiEvent(product);\n\t// }\n\n\t// TikTok\n\t// https://ads.tiktok.com/gateway/docs/index?identify_key=c0138ffadd90a955c1f0670a56fe348d1d40680b3c89461e09f78ed26785164b&language=ENGLISH&doc_id=1739585702922241#item-link-Adding%20parameters%20to%20event%20code\n\t// if (wpmDataLayer?.pixels?.tiktok?.loaded) {\n\t// \tpayload.pixels.tiktok = {\n\t// \t\tevent     : \"AddToCart\",\n\t// \t\tevent_id  : wpm.getRandomEventId(),\n\t// \t\tuser      : wpm.tiktokGetEventUserData(),\n\t// \t\tpage      : wpm.tiktokGetEventPageData(),\n\t// \t\tproperties: {\n\t// \t\t\tvalue       : product.price * product.quantity,\n\t// \t\t\tcurrency    : product.currency,\n\t// \t\t\tcontent_type: \"product\",\n\t// \t\t\tcontents    : [{\n\t// \t\t\t\tcontent_id  : wpm.getProductIdForSpecificPixel(product, \"tiktok\"),\n\t// \t\t\t\tcontent_name: product.name,\n\t// \t\t\t\tquantity    : product.quantity,\n\t// \t\t\t\tprice       : product.price,\n\t// \t\t\t}],\n\t// \t\t},\n\t// \t};\n\t// }\n\n\t// Snapchat\n\t// https://docs.snap.com/api/marketing-api/Conversions-API/Parameters\n\t// https://businesshelp.snapchat.com/s/article/pixel-direct-implementation\n\tif (wpmDataLayer?.pixels?.snapchat?.loaded) {\n\t\tpayload.pixels.snapchat             = wpm.getSnapchatS2SBaseData();\n\t\tpayload.pixels.snapchat.event_name  = \"PAGE_VIEW\";\n\t}\n\n\t/**\n\t * Process the client-to-server event\n\t */\n\n\tjQuery(document).trigger(\"pmw:s2s:page-view\", payload);\n\n\t/**\n\t * Process the server-to-server event\n\t */\n\n\tif (wpmDataLayer?.general?.server_2_server?.pageview_event_s2s?.is_active) {\n\t\twpm.sendEventPayloadToServer(payload);\n\t}\n});\n\n/**\n * Add to cart event\n * \n * Uses the new unified event processing system with filters\n */\njQuery(document).on(\"pmw:add-to-cart\", async (event, product) => {\n\n\tpmw.console.log(\"pmw:add-to-cart event fired\", {event, product});\n\n\t// Use the new unified event processor\n\tawait wpm.processEvent('add_to_cart', {\n\t\tproduct: product\n\t});\n});\n\n/**\n * Remove from cart event\n * Uses the new unified event processing system with filters\n */\njQuery(document).on(\"pmw:remove-from-cart\", async (event, product) => {\n\n\tpmw.console.log(\"pmw:remove-from-cart event fired\", {event, product});\n\n\t// Use the new unified event processor\n\tawait wpm.processEvent('remove_from_cart', {\n\t\tproduct: product\n\t});\n});\n\n/**\n * Select item event\n * Uses the new unified event processing system with filters\n */\njQuery(document).on(\"pmw:select-item\", async (event, product) => {\n\n\tpmw.console.log(\"pmw:select-item event fired\", {event, product});\n\n\t// Use the new unified event processor\n\tawait wpm.processEvent('select_item', {\n\t\tproduct: product\n\t});\n});\n\n/**\n * Begin checkout event\n */\njQuery(document).on(\"pmw:begin-checkout\", (event) => {\n\n\tpmw.console.log(\"pmw:begin-checkout event fired\", {event});\n\n\t/**\n\t * Process the event through the unified event processor\n\t */\n\twpm.processEvent(\"begin_checkout\", {});\n});\n\n/**\n * Add Payment Info\n */\njQuery(document).on(\"pmw:add-payment-info\", (event) => {\n\n\tpmw.console.log(\"pmw:add-payment-info event fired\", {event});\n\n\t/**\n\t * Process the event through the unified event processor\n\t */\n\twpm.processEvent(\"add_payment_info\", {});\n});\n\n/**\n * Add to wishlist event\n */\njQuery(document).on(\"pmw:add-to-wishlist\", (event, product) => {\n\n\tpmw.console.log(\"pmw:add-to-wishlist event fired\", {event, product});\n\n\t/**\n\t * Prepare the payload\n\t */\n\n\tlet payload = {\n\t\tevent  : \"add_to_wishlist\",\n\t\tproduct: product,\n\t\tpixels: {}\n\t};\n\n\t// Facebook\n\tif (wpmDataLayer?.pixels?.facebook?.loaded) {\n\t\tpayload.pixels.facebook = {\n\t\t\tevent_name      : \"AddToWishlist\",\n\t\t\tevent_id        : wpm.getFbRandomEventId(),\n\t\t\tuser_data       : wpm.getFbUserData(),\n\t\t\tevent_source_url: window.location.href,\n\t\t\tcustom_data     : wpm.fbGetProductDataForCapiEvent(product),\n\t\t};\n\n\t\tif (wpm.retrieveData(\"referrer\")) {\n\t\t\tpayload.pixels.facebook.referrer_url = wpm.makeFullUrl(wpm.retrieveData(\"referrer\"));\n\t\t}\n\t}\n\n\t// TikTok\n\tif (wpmDataLayer?.pixels?.tiktok?.loaded) {\n\t\tpayload.pixels.tiktok = {\n\t\t\tevent     : \"AddToWishlist\",\n\t\t\tevent_id  : wpm.getRandomEventId(),\n\t\t\tuser      : wpm.tiktokGetEventUserData(),\n\t\t\tpage      : wpm.tiktokGetEventPageData(),\n\t\t\tproperties: {\n\t\t\t\tvalue       : product.price * product.quantity,\n\t\t\t\tcurrency    : product.currency,\n\t\t\t\tcontent_type: \"product\",\n\t\t\t\tcontents    : [{\n\t\t\t\t\tcontent_id  : wpm.getProductIdForSpecificPixel(product, \"tiktok\"),\n\t\t\t\t\tcontent_name: product.name,\n\t\t\t\t\tquantity    : product.quantity,\n\t\t\t\t\tprice       : product.price,\n\t\t\t\t}],\n\t\t\t},\n\t\t};\n\t}\n\n\t// Snapchat\n\t// https://docs.snap.com/api/marketing-api/Conversions-API/Parameters\n\t// https://businesshelp.snapchat.com/s/article/pixel-direct-implementation\n\tif (wpmDataLayer?.pixels?.snapchat?.loaded) {\n\t\tpayload.pixels.snapchat             = wpm.getSnapchatS2SBaseData();\n\t\tpayload.pixels.snapchat.event_name  = \"ADD_TO_WISHLIST\";\n\t\tpayload.pixels.snapchat.custom_data = wpm.getSnapchatCustomDataForProduct(product);\n\t}\n\n\t/**\n\t * Process the client-to-server event\n\t */\n\n\tjQuery(document).trigger(\"pmw:s2s:add-to-wishlist\", payload);\n\n\t/**\n\t * Process the server-to-server event\n\t */\n\n\twpm.sendEventPayloadToServer(payload);\n});\n\n/**\n * View Item event\n */\njQuery(document).on(\"pmw:view-item\", (event, product = null) => {\n\n\tpmw.console.log(\"pmw:view-item event fired\", {event, product});\n\n\t/**\n\t * Process the event through the unified event processor\n\t */\n\twpm.processEvent(\"view_item\", {\n\t\tproduct: product,\n\t});\n});\n\n/**\n * View category event\n */\njQuery(document).on(\"pmw:view-category\", (event, product = null) => {\n\n\tpmw.console.log(\"pmw:view-category event fired\", {event, product});\n\n\t/**\n\t * Prepare the payload\n\t */\n\n\tlet payload = {\n\t\tevent: \"view_category\",\n\t\tpixels: {}\n\t};\n\n\t// Pinterest\n\t// https://developers.pinterest.com/docs/conversions/best/\n\t// https://developers.pinterest.com/docs/api/v5/#operation/events/create\n\t// https://developers.pinterest.com/docs/conversions/event/\n\tif (wpmDataLayer?.pixels?.pinterest?.loaded) {\n\n\t\tpayload.pixels.pinterest = wpm.getPinterestS2SBaseData();\n\n\t\tpayload.pixels.pinterest.event_name = \"viewcategory\";\n\t}\n\n\t/**\n\t * Process the client-to-server event\n\t */\n\n\tjQuery(document).trigger(\"pmw:s2s:view-category\", payload);\n\n\t/**\n\t * Process the server-to-server event\n\t */\n\n\twpm.sendEventPayloadToServer(payload);\n});\n\n/**\n * Search event\n */\njQuery(document).on(\"pmw:search\", (event) => {\n\n\tpmw.console.log(\"pmw:search event fired\", {event});\n\n\t/**\n\t * Process the event through the unified event processor\n\t */\n\twpm.processEvent(\"search\", {});\n});\n\n/**\n * Place order event\n */\njQuery(document).on(\"pmw:place-order\", (event) => {\n\n\tpmw.console.log(\"pmw:place-order event fired\", {event});\n\n\t/**\n\t * Prepare the payload\n\t */\n\n\tlet payload = {\n\t\tevent: \"place_order\",\n\t\tpixels: {}\n\t};\n\n\t// TikTok\n\tif (wpmDataLayer?.pixels?.tiktok?.loaded) {\n\t\tpayload.pixels.tiktok = {\n\t\t\tevent     : \"PlaceAnOrder\",\n\t\t\tevent_id  : wpm.getRandomEventId(),\n\t\t\tuser      : wpm.tiktokGetEventUserData(),\n\t\t\tpage      : wpm.tiktokGetEventPageData(),\n\t\t\tproperties: wpm.tiktokGetPropertiesFromCart(),\n\t\t};\n\t}\n\n\t/**\n\t * Process the client-to-server event\n\t */\n\n\tjQuery(document).trigger(\"pmw:s2s:place-order\", payload);\n\n\t/**\n\t * Process the server-to-server event\n\t */\n\n\twpm.sendEventPayloadToServer(payload);\n});\n\n/**\n * Purchase event\n */\njQuery(document).on(\"pmw:purchase\", async (event) => {\n\n\tpmw.console.log(\"pmw:purchase event fired\", {event});\n\t\n\t// Use the unified event processor\n\tawait wpm.processEvent('purchase', {\n\t\torder: wpmDataLayer.order\n\t});\n});\n\n/**\n * Login event\n */\njQuery(document).on(\"pmw:login\", () => {\n\n\tpmw.console.log(\"pmw:login event fired\");\n\n\t/**\n\t * Prepare the payload\n\t */\n\n\tlet payload = {\n\t\tevent: \"login\",\n\t\tpixels: {}\n\t};\n\n\t// Snapchat\n\t// https://docs.snap.com/api/marketing-api/Conversions-API/Parameters\n\t// https://businesshelp.snapchat.com/s/article/pixel-direct-implementation\n\tif (wpmDataLayer?.pixels?.snapchat?.loaded) {\n\t\tpayload.pixels.snapchat            = wpm.getSnapchatS2SBaseData();\n\t\tpayload.pixels.snapchat.event_name = \"LOGIN\";\n\t}\n\n\t/**\n\t * Process the client-to-server event\n\t */\n\n\tjQuery(document).trigger(\"pmw:s2s:login\", payload);\n\n\t/**\n\t * Process the server-to-server event\n\t */\n\n\twpm.sendEventPayloadToServer(payload);\n});\n\n/**\n * Run WooCommerce specific functions\n */\njQuery(document).on(\"pmw:ready\", async () => {\n\n\t// Only run if WooCommerce is active\n\tif (!wpm.isWooCommerceActive()) {\n\t\treturn;\n\t}\n\n\t/**\n\t * Run as soon as wpm namespace is loaded\n\t */\n\n\t// Watch for products visible in viewport\n\twpm.startIntersectionObserverToWatch();\n\n\t// Watch for lazy loaded products\n\twpm.startProductsMutationObserverToWatch();\n});\n\njQuery(document).on(\"pmw:load-pixels\", () => {\n\twpm.waitForPixelsAndTriggerPageView();\n});\n","/**\n * Pixel Registry\n * \n * Central registry for managing pixel configurations and adapters.\n * Provides methods to query which pixels are active and retrieve their adapters.\n * \n * @since 1.51.0\n */\n\n(function (wpm, $, undefined) {\n\n\t/**\n\t * Pixel Registry namespace\n\t */\n\twpm.pixelRegistry = {\n\t\t\n\t\t/**\n\t\t * Get all active pixels (both browser-only and S2S-capable)\n\t\t * \n\t\t * Queries each registered adapter's isActive function to determine\n\t\t * if the pixel should be loaded based on wpmDataLayer configuration.\n\t\t * \n\t\t * @returns {string[]} Array of active pixel names\n\t\t */\n\t\tgetActivePixels() {\n\t\t\tconst activePixels = [];\n\t\t\t\n\t\t\tif (!wpm.pixelCapabilities) {\n\t\t\t\treturn activePixels;\n\t\t\t}\n\t\t\t\n\t\t\t// Check each registered pixel's isActive function\n\t\t\tfor (const [pixelName, capabilities] of Object.entries(wpm.pixelCapabilities)) {\n\t\t\t\tif (typeof capabilities.isActive === 'function') {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (capabilities.isActive()) {\n\t\t\t\t\t\t\tactivePixels.push(pixelName);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tpmw.console.error(`Error checking if ${pixelName} is active:`, e);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn activePixels;\n\t\t},\n\t\t\n\t\t/**\n\t\t * Get browser-only pixels (pixels that don't support S2S)\n\t\t * \n\t\t * @returns {string[]} Array of browser-only pixel names\n\t\t */\n\t\tgetActiveBrowserOnlyPixels() {\n\t\t\tconst browserPixels = [];\n\t\t\tconst activePixels = this.getActivePixels();\n\t\t\t\n\t\t\tfor (const pixelName of activePixels) {\n\t\t\t\t// If pixel doesn't support S2S, it's browser-only\n\t\t\t\tif (wpm.pixelCapabilities?.[pixelName]?.supportsS2S !== true) {\n\t\t\t\t\tbrowserPixels.push(pixelName);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn browserPixels;\n\t\t},\n\t\t\n\t\t/**\n\t\t * Get S2S-capable pixels\n\t\t * \n\t\t * Returns pixels that declared supportsS2S capability when registering.\n\t\t * These pixels ALWAYS receive the pmw:s2s:* events to fire their browser pixels (fbq, ttq, etc.),\n\t\t * regardless of whether S2S is actually enabled. They handle their own S2S logic internally.\n\t\t * \n\t\t * @returns {string[]} Array of S2S pixel names\n\t\t */\n\t\tgetActiveS2SPixels() {\n\t\t\tconst s2sPixels = [];\n\t\t\tconst activePixels = this.getActivePixels();\n\t\t\t\n\t\t\t// Check each active pixel's capabilities\n\t\t\tfor (const pixelName of activePixels) {\n\t\t\t\t// Check if this pixel declared supportsS2S capability when registering\n\t\t\t\tif (wpm.pixelCapabilities?.[pixelName]?.supportsS2S === true) {\n\t\t\t\t\ts2sPixels.push(pixelName);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn s2sPixels;\n\t\t},\n\t\t\n\t\t/**\n\t\t * Get adapter for a specific pixel\n\t\t * \n\t\t * @param {string} pixelName - The pixel name (e.g., 'facebook', 'google_ads')\n\t\t * @returns {object|null} The adapter object or null if not found\n\t\t */\n\t\tgetAdapter(pixelName) {\n\t\t\tif (!wpm.adapters) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\t\n\t\t\treturn wpm.adapters[pixelName] || null;\n\t\t}\n\t};\n\n}(window.wpm = window.wpm || {}, jQuery));\n","(function (wpm, $, undefined) {\n\n\twpm.jQueryExists = async () => new Promise(resolve => {\n\n\t\t(function waitForjQuery() {\n\t\t\tif (typeof jQuery !== \"undefined\") return resolve()\n\t\t\tsetTimeout(waitForjQuery, 100)\n\t\t})()\n\t})\n\n\twpm.waitForLibrary = (library, timeout = 5000, interval = 100) => {\n\n\t\tconst startTime = Date.now()\n\t\twhile (typeof window[library] === \"undefined\") {\n\t\t\t// Check if timeout in milliseconds has passed\n\t\t\tif (Date.now() - startTime > timeout) {\n\t\t\t\tbreak // Maximum wait time reached, exit the loop\n\t\t\t}\n\t\t\t// Wait for the interval in milliseconds before checking again\n\t\t\tsetTimeout(() => {\n\t\t\t}, interval)\n\t\t}\n\t}\n\n\twpm.wpmDataLayerFullyLoaded = async () => {\n\n\t\t// Promise that checks if the nested object wpmDataLayer.version is defined.\n\t\t// If so, resolve.\n\t\t// We must check for the nested object wpmDataLayer.version,\n\t\t// because the wpmDataLayer object can be defined early by adding products to the data layer through\n\t\t// template inline scripts. So we need to wait until the wpmDataLayer configuration objects\n\t\t// are defined.\n\t\tlet checkVar = new Promise((resolve) => {\n\t\t\t(function waitForVar() {\n\t\t\t\tif (\n\t\t\t\t\ttypeof wpmDataLayer !== \"undefined\"\n\t\t\t\t\t&& typeof wpmDataLayer.version !== \"undefined\"\n\t\t\t\t) {\n\t\t\t\t\treturn resolve()\n\t\t\t\t}\n\t\t\t\tsetTimeout(waitForVar, 100)\n\t\t\t})()\n\t\t})\n\n\t\t// Set a timeout to log a message after 6 seconds\n\t\tlet logTimeoutId = setTimeout(() => {\n\t\t\tconsole.error(\"Pixel Manager error: The wpmDataLayer is not defined. Please make sure that the wpmDataLayer script snippet is inserted and not modified by any third-party plugin, such as a consent management platform or a JavaScript optimizer.\")\n\n\t\t}, 6000)\n\n\t\tcheckVar.then(() => {\n\t\t\tclearTimeout(logTimeoutId)\n\t\t})\n\n\t\treturn checkVar\n\t}\n\n\twpm.wpHooksExists = async () => new Promise(resolve => {\n\t\t(function waitForVar() {\n\n\t\t\t// Resolve if wp.hooks is defined\n\t\t\tif (typeof wp !== \"undefined\" && typeof wp.hooks !== \"undefined\") return resolve()\n\t\t\tsetTimeout(waitForVar, 50)\n\t\t})()\n\t})\n\n\t/**\n\t * Load all WooCommerce hooks functions\n\t *\n\t * Includes safeguard in case the user changed the default load order for wp-hooks, or removed it completely.\n\t *\n\t * @returns {Promise<void>}\n\t */\n\twpm.loadWcHooksFunctions = async () => {\n\t\t// Load all WooCommerce Blocks hooks\n\t\tawait wpm.wpHooksExists()\n\t\tawait import(/* webpackChunkName: \"wc-hooks\" */ \"./wc_hooks\")\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery))\n","/**\n * WordPress-style hooks system for Pixel Manager\n *\n * Provides a filter API that allows developers to modify event data\n * at various points in the event processing pipeline.\n *\n * @since 1.51.0\n */\n\n(function (wpm, $, undefined) {\n\n\t// Initialize pmw namespace if it doesn't exist\n\twindow.pmw = window.pmw || {};\n\n\t/**\n\t * Hook system for filtering event data\n\t */\n\tpmw.hooks = {\n\t\tfilters: {},\n\n\t\t/**\n\t\t * Add a filter callback\n\t\t *\n\t\t * @param {string} hookName - The filter hook name (e.g., 'pmw_event_payload')\n\t\t * @param {string} namespace - Unique identifier for your filter (e.g., 'my-plugin')\n\t\t * @param {function} callback - The filter function that modifies the value\n\t\t * @param {number} priority - Execution order, lower numbers run first (default: 10)\n\t\t *\n\t\t * @example\n\t\t * pmw.hooks.addFilter('pmw_pixel_data_facebook', 'my-plugin', (data) => {\n\t\t *   data.custom_param = 'my_value';\n\t\t *   return data;\n\t\t * }, 10);\n\t\t */\n\t\taddFilter: function (hookName, namespace, callback, priority = 10) {\n\t\t\tif (!hookName || typeof hookName !== \"string\") {\n\t\t\t\tpmw.console.error(\"Invalid hook name provided to addFilter\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!namespace || typeof namespace !== \"string\") {\n\t\t\t\tpmw.console.error(\"Invalid namespace provided to addFilter\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (typeof callback !== \"function\") {\n\t\t\t\tpmw.console.error(\"Invalid callback provided to addFilter\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!this.filters[hookName]) {\n\t\t\t\tthis.filters[hookName] = [];\n\t\t\t}\n\n\t\t\tthis.filters[hookName].push({\n\t\t\t\tnamespace: namespace,\n\t\t\t\tcallback : callback,\n\t\t\t\tpriority : priority,\n\t\t\t});\n\n\t\t\t// Sort by priority (ascending order)\n\t\t\tthis.filters[hookName].sort((a, b) => a.priority - b.priority);\n\n\t\t\tpmw.console.log(`Filter added: ${hookName} (${namespace}) with priority ${priority}`);\n\t\t},\n\n\t\t/**\n\t\t * Apply all registered filters to a value\n\t\t *\n\t\t * @param {string} hookName - The filter hook name\n\t\t * @param {*} value - The value to filter\n\t\t * @param {...*} args - Additional arguments passed to filter callbacks\n\t\t * @returns {*} The filtered value\n\t\t *\n\t\t * @example\n\t\t * let payload = pmw.hooks.applyFilters('pmw_event_payload_pre', payload, eventName);\n\t\t */\n\t\tapplyFilters: function (hookName, value, ...args) {\n\t\t\tif (!this.filters[hookName] || this.filters[hookName].length === 0) {\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t\tlet filteredValue = value;\n\n\t\t\tfor (const filter of this.filters[hookName]) {\n\t\t\t\ttry {\n\t\t\t\t\tconst result = filter.callback(filteredValue, ...args);\n\n\t\t\t\t\t// Ensure callback returns a value\n\t\t\t\t\tif (result !== undefined) {\n\t\t\t\t\t\tfilteredValue = result;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpmw.console.warn(`Filter ${filter.namespace} on ${hookName} returned undefined, keeping previous value`);\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\tpmw.console.error(`Filter error in ${filter.namespace} on ${hookName}:`, e);\n\t\t\t\t\t// Continue with the previous value if this filter fails\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn filteredValue;\n\t\t},\n\n\t\t/**\n\t\t * Remove a specific filter\n\t\t *\n\t\t * @param {string} hookName - The filter hook name\n\t\t * @param {string} namespace - The namespace of the filter to remove\n\t\t *\n\t\t * @example\n\t\t * pmw.hooks.removeFilter('pmw_pixel_data_facebook', 'my-plugin');\n\t\t */\n\t\tremoveFilter: function (hookName, namespace) {\n\t\t\tif (!this.filters[hookName]) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst initialLength    = this.filters[hookName].length;\n\t\t\tthis.filters[hookName] = this.filters[hookName].filter(f => f.namespace !== namespace);\n\n\t\t\tif (this.filters[hookName].length < initialLength) {\n\t\t\t\tpmw.console.log(`Filter removed: ${hookName} (${namespace})`);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Remove all filters for a specific hook\n\t\t *\n\t\t * @param {string} hookName - The filter hook name\n\t\t */\n\t\tremoveAllFilters: function (hookName) {\n\t\t\tif (this.filters[hookName]) {\n\t\t\t\tdelete this.filters[hookName];\n\t\t\t\tpmw.console.log(`All filters removed for: ${hookName}`);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Check if a specific hook has any filters\n\t\t *\n\t\t * @param {string} hookName - The filter hook name\n\t\t * @param {string} namespace - Optional: check for a specific namespace\n\t\t * @returns {boolean}\n\t\t */\n\t\thasFilter: function (hookName, namespace = null) {\n\t\t\tif (!this.filters[hookName] || this.filters[hookName].length === 0) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (namespace) {\n\t\t\t\treturn this.filters[hookName].some(f => f.namespace === namespace);\n\t\t\t}\n\n\t\t\treturn true;\n\t\t},\n\n\t\t/**\n\t\t * Get all registered filters for a hook\n\t\t *\n\t\t * @param {string} hookName - The filter hook name\n\t\t * @returns {Array} Array of filter objects\n\t\t */\n\t\tgetFilters: function (hookName) {\n\t\t\treturn this.filters[hookName] || [];\n\t\t},\n\t};\n\n\t// Backward compatibility: create wpm.hooks as an alias to pmw.hooks\n\twpm.hooks = pmw.hooks;\n\n}(window.wpm = window.wpm || {}, jQuery));\n","(function (wpm, $, undefined) {\n\n\tconst PMW_LIBRARY_VERSION = \"1.51.1\"\n\n\twpm.getLibraryVersion = () => {\n\t\treturn PMW_LIBRARY_VERSION\n\t}\n\n\twpm.checkLibraryVersion = () => {\n\n\t\tif (wpm.getLibraryVersion() !== wpmDataLayer?.version?.number) {\n\t\t\tconsole.error(`Pixel Manager: The library version ${wpm.getLibraryVersion()} and wpmDataLayer.version.number ${wpmDataLayer.version.number} do not match. Delete the server-side cache and try again.`)\n\t\t}\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery))\n\n","/**\n * IP functions\n */\n\n(function (wpm, $, undefined) {\n\n\tconst {isRange, isIP, isV4, isV6, version: getIpVersion} = require(\"range_check\")\n\n\tconst ipServices = {\n\t\t\"cloudflare\": {\n\t\t\t\"any\": \"https://www.cloudflare.com/cdn-cgi/trace\",\n\t\t},\n\t\t// icanhazip seems to regularly be added to malware databases, despite being a legitimate service run by Cloudflare\n\t\t// https://blog.apnic.net/2021/06/17/how-a-small-free-ip-tool-survived/\n\t\t// https://major.io/p/a-new-future-for-icanhazip/\n\t\t// https://major.io/p/extra-icanhaz-services-going-offline/\n\t\t\"icanhazip\"   : {\n\t\t\t\"4\"  : \"https://ipv4.icanhazip.com\",\n\t\t\t\"6\"  : \"https://ipv6.icanhazip.com\",\n\t\t\t\"any\": \"https://icanhazip.com\",\n\t\t},\n\t\t\"ipinfo\"      : {\n\t\t\t\"any\": \"https://ipinfo.io/ip\",\n\t\t},\n\t\t\"myexternalip\": {\n\t\t\t\"any\": \"https://myexternalip.com/raw\",\n\t\t\t// \"6\": \"https://api-ipv6.myexternalip.com/raw\", // This can return an IPv4 address, so we can't use it\n\t\t},\n\t\t\"ipify\"       : {\n\t\t\t\"4\"  : \"https://api4.ipify.org\",\n\t\t\t\"6\"  : \"https://api6.ipify.org\",\n\t\t\t\"any\": \"https://api64.ipify.org\", // If IPv6 is available, AND the client is configured to prefer IPv6, this will return an IPv6 address\n\t\t},\n\t\t// Can't use amazon because its CORS policy blocks requests from the browser\n\t\t// \"amazon\"    : {\n\t\t// \t\"any\": \"https://checkip.amazonaws.com/\",\n\t\t// },\n\t\t// Can't use ip.sb because its CORS policy blocks requests from the browser\n\t\t// \"ip.sb\"     : {\n\t\t// \t\"any\": \"https://api.ip.sb/ip\",\n\t\t// },\n\t\t// Can't use seeip because its CORS policy blocks requests from the browser\n\t\t// \"seeip\"       : {\n\t\t// \t\"any\": \"https://api.seeip.org\",\n\t\t// \t\"4\": \"https://ipv4.seeip.org\",\n\t\t// \t\"6\": \"https://ipv6.seeip.org\",\n\t\t// },\n\t}\n\n\twpm.getGeoInfo = {\n\n\t\tcloudflare: async () => {\n\n\t\t\tconst response = await fetch(\"https://www.cloudflare.com/cdn-cgi/trace\")\n\n\t\t\tif (!response.ok) throw new Error(`The response from Cloudflare was not OK. Status: ${response.status}`)\n\n\t\t\tlet data = await response.text()\n\n\t\t\tif (!data) throw new Error(\"No data was returned from Cloudflare\")\n\n\t\t\t// Convert key-value pairs to JSON\n\t\t\t// https://stackoverflow.com/a/39284735/452587\n\t\t\tdata = data\n\t\t\t\t.trim()\n\t\t\t\t.split(\"\\n\")\n\t\t\t\t.reduce((obj, pair) => {\n\t\t\t\t\tpair = pair.split(\"=\")\n\t\t\t\t\treturn obj[pair[0]] = pair[1], obj\n\t\t\t\t}, {})\n\n\t\t\tif (!data.ip || !data.loc) throw new Error(\"The JSON data is missing the ip or loc key from Cloudflare\")\n\n\t\t\t/**\n\t\t\t * Cloudflare doesn't return the region.\n\t\t\t * If the website manager has set a region such as California in the restricted_regions array,\n\t\t\t * we have to validate the region. This is not possible with the data from Cloudflare.\n\t\t\t * So we have to abort the process and give the other services a chance to return the region.\n\t\t\t */\n\t\t\tif (processRegion(data.loc)) throw new Error(\"We have to validate the region, and this service is not returning the region.\")\n\n\t\t\treturn {\n\t\t\t\tip         : data.ip,\n\t\t\t\tcountryCode: data.loc,\n\t\t\t\tservice    : \"cloudflare\",\n\t\t\t}\n\t\t},\n\n\t\tgeojs: async () => {\n\n\t\t\tconst response = await fetch(\"https://get.geojs.io/v1/ip/geo.json\")\n\n\t\t\tif (!response.ok) throw new Error(`The response from geojs was not OK. Status: ${response.status}`)\n\n\t\t\tlet data = await response.json()\n\n\t\t\tif (!data) throw new Error(\"No JSON data was returned from geojs\")\n\t\t\tif (!data.ip || !data.country_code || !data.region) throw new Error(\"The JSON data is missing the ip, country_code, or region key from geojs\")\n\n\t\t\treturn {\n\t\t\t\tip         : data.ip,\n\t\t\t\tcountryCode: data.country_code,\n\t\t\t\tregion     : data.region,\n\t\t\t\tservice    : \"geojs\",\n\t\t\t}\n\t\t},\n\n\t\tipinfo: async () => {\n\n\t\t\tconst response = await fetch(\"https://ipinfo.io/json\")\n\n\t\t\tif (!response.ok) throw new Error(`The response from ipinfo was not OK from ipinfo. Status: ${response.status}`)\n\n\t\t\tlet data = await response.json()\n\n\t\t\tif (!data) throw new Error(\"No JSON data was returned from ipinfo\")\n\t\t\tif (!data.ip || !data.country || !data.region) throw new Error(\"The JSON data is missing the ip, country, or region key from ipinfo\")\n\n\t\t\treturn {\n\t\t\t\tip         : data.ip,\n\t\t\t\tcountryCode: data.country,\n\t\t\t\tregion     : data.region,\n\t\t\t\tservice    : \"ipinfo\",\n\t\t\t}\n\t\t},\n\n\t\tipapi: async () => {\n\n\t\t\tconst response = await fetch(\"https://ipapi.co/json\")\n\n\t\t\tif (!response.ok) throw new Error(`The response from ipapi was not OK. Status: ${response.status}`)\n\n\t\t\tlet data = await response.json()\n\n\t\t\tif (!data) throw new Error(\"No JSON data was returned from ipapi\")\n\t\t\tif (!data.ip || !data.country || !data.region) throw new Error(\"The JSON data is missing the ip, country, or region key from ipapi\")\n\n\t\t\treturn {\n\t\t\t\tip         : data.ip,\n\t\t\t\tcountryCode: data.country,\n\t\t\t\tregion     : data.region,\n\t\t\t\tservice    : \"ipapi\",\n\t\t\t}\n\t\t},\n\t}\n\n\t/**\n\t * /**\n\t * Cloudflare doesn't return the region.\n\t * If the website manager has set a region such as California in the restricted_regions array,\n\t * we have to validate the region. This is not possible with the data from Cloudflare.\n\t * So we have to abort the process and give the other services a chance to return the region.\n\t *\n\t * If the country code is US,\n\t * and the restricted_regions array contains \"US-CA\" or \"US-VA\",\n\t * we must process the region.\n\t *\n\t * @param countryCode\n\t * @returns {boolean}\n\t */\n\tconst processRegion = (countryCode) => {\n\n\t\tif (countryCode !== \"US \") return false\n\n\t\tconst regionsToCheck = [\"US-CA\", \"US-VA\"]\n\n\t\treturn regionsToCheck.some(region =>\n\t\t\twpmDataLayer?.general?.consent_management.restricted_regions.includes(region),\n\t\t)\n\t}\n\n\t/**\n\t * Check if the visitor is allowed to trigger server-to-server events\n\t * This checks both bot user-agent patterns and custom IP exclusion list\n\t *\n\t * @returns {Promise<boolean>} True if the visitor is allowed\n\t */\n\twpm.isVisitorAllowed = async () => {\n\n\t\t// Check the cache if visitor is allowed\n\t\tif (wpm.retrieveData(\"visitorAllowed\") !== null && wpm.retrieveData(\"visitorAllowed\") !== undefined) {\n\t\t\treturn !!JSON.parse(wpm.retrieveData(\"visitorAllowed\"))\n\t\t}\n\n\t\t// Check if user agent is a bot\n\t\tif (isBotUserAgent()) {\n\t\t\twpm.storeData(\"visitorAllowed\", false)\n\t\t\treturn false\n\t\t}\n\n\t\t// Check if IP is on the exclusion list (if custom exclusions are defined)\n\t\tif (Array.isArray(wpmDataLayer?.general?.server_2_server?.ip_exclude_list) \n\t\t\t&& wpmDataLayer.general.server_2_server.ip_exclude_list.length > 0) {\n\t\t\t\n\t\t\tconst ip = await wpm.getIp()\n\t\t\t\n\t\t\tif (isOnIpExclusionList(ip)) {\n\t\t\t\twpm.storeData(\"visitorAllowed\", false)\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\n\t\t// If not a bot and not on IP exclusion list, visitor is allowed\n\t\twpm.storeData(\"visitorAllowed\", true)\n\t\treturn true\n\t}\n\n\twpm.getIp = async (ipVersion = \"any\", maxServicesToCheck = 3) => {\n\n\t\tconst validVersions = [\"any\", \"4\", \"6\"]\n\n\t\t// return null if the version is not valid and console log an error\n\t\tif (!validVersions.includes(ipVersion)) {\n\t\t\tconsole.error(\"The version argument must be one of the following: \" + validVersions.join(\", \"))\n\t\t\treturn null\n\t\t}\n\n\t\tif (ipVersion === \"any\" && wpm.retrieveData(\"ip\")) {\n\t\t\treturn wpm.retrieveData(\"ip\")\n\t\t}\n\n\t\t// Get the ipv data from the cache\n\t\tconst ipv = wpm.retrieveData(`ipv${ipVersion}`)\n\n\t\t// Return it if it is not undefined\n\t\t// The value can be an IP\n\t\t// or null if we ran the test but no IP could be retrieved\n\t\t// It is undefined if the ipVersion was not tested yet\n\t\tif (ipv !== undefined) return ipv\n\n\t\tpmw.console.log(\"Testing the IP address of the browser because one ore more server-to-server APIs are enabled and require the browser IP. It may trigger connection request errors in the console while testing the IP address. This is normal and expected behavior.\")\n\n\t\ttry {// Check the cache if the IP is already stored\n\n\t\t\tconst ip = await wpm.getIpFromAnyService(ipVersion, maxServicesToCheck)\n\n\t\t\t// if (!isIP(ip)) throw new Error(\"The returned value is not an IP address\")\n\n\t\t\t// Store the IP in the cache\n\t\t\tif (ipVersion === \"any\") {\n\t\t\t\twpm.storeData(\"ip\", ip)\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tgetIpVersion(ip) === 4\n\t\t\t\t|| (ipVersion === \"4\" && ip === null)\n\t\t\t) {\n\t\t\t\twpm.storeData(\"ipv4\", ip)\n\t\t\t}\n\n\t\t\tif (getIpVersion(ip) === 6\n\t\t\t\t|| (ipVersion === \"6\" && ip === null)\n\t\t\t) {\n\t\t\t\twpm.storeData(\"ipv6\", ip)\n\t\t\t}\n\n\t\t\treturn ip\n\t\t} catch (error) {\n\t\t\t// console.error(error)\n\t\t\treturn null\n\t\t}\n\t}\n\n\twpm.getBrowserGeoFromExternalService = async () => {\n\n\t\tconst startTime = performance.now()\n\n\t\tlet promises = []\n\n\t\tObject.keys(wpm.getGeoInfo).forEach(service => {\n\t\t\tpromises.push(wpm.getGeoInfo[service]())\n\t\t})\n\n\t\ttry {\n\t\t\tconst data = await Promise.any(promises)\n\n\t\t\tdata.countryCode = data.countryCode.toUpperCase()\n\n\t\t\tif (data.region && data.region === \"California\") {\n\t\t\t\tdata.regionCode = \"US-CA\"\n\t\t\t}\n\n\t\t\tif (data.region && data.region === \"Virginia\") {\n\t\t\t\tdata.regionCode = \"US-VA\"\n\t\t\t}\n\n\t\t\tpmw.console.log(\n\t\t\t\t\"Retrieved the browser geo info from an external service: \",\n\t\t\t\tdata,\n\t\t\t\t\" which took \",\n\t\t\t\t(performance.now() - startTime).toFixed(2) + \" ms\",\n\t\t\t)\n\n\t\t\t// wpm.storeData(\"countryCode\", data.countryCode)\n\t\t\t// wpm.storeData(\"ip\", data.ip)\n\t\t\treturn data\n\t\t} catch (error) {\n\t\t\tpmw.console.error(\"error: \", error)\n\t\t\treturn null\n\t\t}\n\t}\n\n\tconst getBrowserLocationByTimeZone = () => {\n\n\t\tconst geo         = require(\"./geo/geo.mjs\")\n\t\tconst geoLocation = geo.getLocationByTimeZone()\n\n\t\tif (geoLocation.countryCode) {\n\t\t\treturn geoLocation\n\t\t}\n\n\t\treturn null\n\t}\n\n\twpm.getBrowserGeo = async () => {\n\n\t\tlet geoFromStorage = {}\n\n\t\tif (wpm.retrieveData(\"geoCountryCode\")) geoFromStorage.countryCode = wpm.retrieveData(\"geoCountryCode\")\n\t\tif (wpm.retrieveData(\"geoRegionCode\")) geoFromStorage.regionCode = wpm.retrieveData(\"geoRegionCode\")\n\t\tif (wpm.retrieveData(\"geoRegion\")) geoFromStorage.region = wpm.retrieveData(\"geoRegion\")\n\n\t\tif (geoFromStorage.countryCode) {\n\t\t\tpmw.console.log(\"Retrieved the browser geo location from the cache: \", geoFromStorage)\n\t\t\treturn geoFromStorage\n\t\t}\n\n\t\tlet geoInfo = await wpm.getBrowserGeoFromExternalService()\n\n\t\t// If the external services fail, try to use the timezone fallback to get the country\n\t\tif (!geoInfo) {\n\n\t\t\tconst gepLocationByTimeZone = getBrowserLocationByTimeZone()\n\n\t\t\tgeoInfo = {}\n\n\t\t\tif (gepLocationByTimeZone) pmw.console.log(\"Retrieved the browser geo location from the timezone: \", gepLocationByTimeZone)\n\t\t\tif (gepLocationByTimeZone.countryCode) geoInfo.countryCode = gepLocationByTimeZone.countryCode\n\t\t\tif (gepLocationByTimeZone.regionCode) geoInfo.regionCode = gepLocationByTimeZone.regionCode\n\t\t}\n\n\t\tif (geoInfo?.ip) wpm.storeData(\"ip\", geoInfo.ip)\n\t\tif (geoInfo?.countryCode) wpm.storeData(\"geoCountryCode\", geoInfo.countryCode)\n\t\tif (geoInfo?.regionCode) wpm.storeData(\"geoRegionCode\", geoInfo.regionCode)\n\t\tif (geoInfo?.region) wpm.storeData(\"geoRegion\", geoInfo.region)\n\n\t\tif (geoInfo?.countryCode) {\n\t\t\treturn geoInfo\n\t\t}\n\n\t\treturn null\n\t}\n\n\t/**\n\t * Get the IP from the visitor using different services.\n\t * Return the first valid IP address that can be retrieved the fastest.\n\t *\n\t * @returns {Promise<IP>}\n\t */\n\twpm.getIpFromAnyService = async (ipVersion = \"any\", maxServicesToCheck = 3) => {\n\n\t\t// start tracking time\n\t\tconst startTime = performance.now()\n\n\t\t// take the ipServices object and filter it to only contain objects with an ipVersion key that matches the ipVersion argument\n\t\t// keep the original order of the ipServices object\n\t\t// also keep only the first maxServicesToCheck objects\n\n\t\tconst ipServicesFiltered = Object.keys(ipServices)\n\t\t\t.filter(service => ipServices[service][ipVersion])\n\t\t\t.slice(0, maxServicesToCheck)\n\t\t\t.reduce((obj, key) => {\n\t\t\t\t\tobj[key] = ipServices[key]\n\t\t\t\t\treturn obj\n\t\t\t\t}\n\t\t\t\t, {})\n\n\t\tlet promises = []\n\n\t\tObject.keys(ipServicesFiltered).forEach(service => {\n\t\t\t// only push if the ipVersion is available for the service\n\t\t\tif (ipServicesFiltered[service][ipVersion]) {\n\t\t\t\t// console.log(`pushing ${service} to promises array with ipVersion ${ipVersion}`)\n\t\t\t\tpromises.push(wpm.getIpFromService(service, ipVersion))\n\t\t\t}\n\t\t})\n\n\t\t// If the promises array is not empty, return the first promise that resolves the fastest\n\t\t// Ignore the promises that reject\n\t\tif (promises.length > 0) {\n\n\t\t\ttry {\n\t\t\t\tconst data = await Promise.any(promises)\n\t\t\t\t// console.log(`The Pixel Manager retrieved the IP address ${data.ip} from ${data.service} using IP version ${data.ipVersion}`)\n\n\t\t\t\t// stop tracking time\n\t\t\t\tconst endTime   = performance.now()\n\t\t\t\tconst timeTaken = (endTime - startTime).toFixed(2)\n\n\t\t\t\tpmw.console.log(`Retrieved the IP address ${data.ip} from ${data.service} which took ${timeTaken} ms`)\n\t\t\t\treturn data.ip\n\t\t\t} catch (error) {\n\t\t\t\t// console.error(error)\n\t\t\t\tpmw.console.log(`Could not retrieve an IP with version ${ipVersion} from any of the services.`)\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t} else {\n\t\t\tpmw.console.log(\"No promises to resolve\")\n\t\t\treturn null\n\t\t}\n\t}\n\n\t/**\n\t * Fetches the IP address from a specified service.\n\t *\n\t * @async\n\t * @param {string} service - The name of the service to fetch the IP from.\n\t * @param {string} [ipVersion=\"any\"] - The version of the IP (e.g., \"any\" for global).\n\t * @returns {Promise<Object>} A promise that resolves to an object containing the IP address, service name, and IP version.\n\t * @throws {Error} Will reject the promise with an error if the IP version is not available for the service, the response from the service is not OK, the returned value from the service is not an IP address, or any other error occurs.\n\t */\n\twpm.getIpFromService = async (service, ipVersion = \"any\") => {\n\t\ttry {\n\n\t\t\tlet data = {\n\t\t\t\tip       : null,\n\t\t\t\tservice  : service,\n\t\t\t\tipVersion: ipVersion,\n\t\t\t}\n\n\t\t\t// Return reject if the ipVersion is not available for the service\n\t\t\tif (!ipServices[service][ipVersion]) return Promise.reject(new Error(`The IP version ${ipVersion} is not available for the service ${service}`))\n\n\t\t\tpmw.console.log(`Fetching IP from ${service} using IP version ${ipVersion}`)\n\n\t\t\tconst response = await fetch(ipServices[service][ipVersion])\n\n\t\t\tif (!response.ok) {\n\t\t\t\treturn Promise.reject(new Error(`The response from ${service} was not OK. Status: ${response.status}`))\n\t\t\t}\n\n\t\t\tlet serviceResponseData = await response.text()\n\n\t\t\tif (service === \"cloudflare\") {\n\t\t\t\t// Convert key-value pairs to JSON\n\t\t\t\tserviceResponseData = serviceResponseData\n\t\t\t\t\t.trim()\n\t\t\t\t\t.split(\"\\n\")\n\t\t\t\t\t.reduce((obj, pair) => {\n\t\t\t\t\t\tpair = pair.split(\"=\")\n\t\t\t\t\t\treturn (obj[pair[0]] = pair[1]), obj\n\t\t\t\t\t}, {})\n\n\t\t\t\tdata.ip = serviceResponseData.ip\n\t\t\t} else {\n\t\t\t\tdata.ip = serviceResponseData.trim()\n\t\t\t}\n\n\t\t\tif (!isIP(data.ip)) {\n\t\t\t\treturn Promise.reject(new Error(`The returned value from ${service} is not an IP address`))\n\t\t\t}\n\n\t\t\treturn data\n\t\t} catch (error) {\n\t\t\treturn Promise.reject(error)\n\t\t}\n\t}\n\n\t/**\n\t * Cloudflare\n\t *\n\t * Response time: approx. 70ms\n\t * IPv: Returns IPv4 or IPv6 depending on the client\n\t * Dual stack: Doesn't offer dual stack detection\n\t *\n\t * @returns {Promise<*>}\n\t */\n\tconst getIpFromCloudflare = async () => {\n\n\t\tconst response = await fetch(\"https://www.cloudflare.com/cdn-cgi/trace\")\n\t\tlet data       = await response.text()\n\n\t\t// Convert key-value pairs to JSON\n\t\t// https://stackoverflow.com/a/39284735/452587\n\t\tdata = data\n\t\t\t.trim()\n\t\t\t.split(\"\\n\")\n\t\t\t.reduce((obj, pair) => {\n\t\t\t\tpair = pair.split(\"=\")\n\t\t\t\treturn obj[pair[0]] = pair[1], obj\n\t\t\t}, {})\n\n\t\t// return the data.ip not a promise\n\t\treturn data.ip\n\t}\n\n\t/**\n\t * Check if the visitor is NOT allowed to trigger server-to-server events\n\t * This checks both bot user-agent patterns and custom IP exclusion list\n\t *\n\t * @returns {Promise<boolean>} True if the visitor should be blocked\n\t */\n\twpm.isVisitorNotAllowed = async () => {\n\t\treturn await wpm.isVisitorAllowed() === false\n\t}\n\n\t/**\n\t * Check if the current user agent matches known bot patterns\n\t *\n\t * @returns {boolean} True if the user agent is a bot\n\t */\n\tconst isBotUserAgent = () => {\n\t\tconst userAgent = navigator.userAgent || ''\n\t\t\n\t\t// If no user agent, assume it might be a bot\n\t\tif (!userAgent) {\n\t\t\treturn true\n\t\t}\n\n\t\tconst botPatterns = getBotPatterns()\n\n\t\t// Check if user agent matches any bot pattern (case-insensitive)\n\t\tfor (const pattern of botPatterns) {\n\t\t\tif (userAgent.toLowerCase().includes(pattern.toLowerCase())) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\n\t\treturn false\n\t}\n\n\t/**\n\t * Get list of known bot user-agent patterns\n\t *\n\t * @returns {string[]} Array of bot patterns\n\t */\n\tconst getBotPatterns = () => {\n\t\t// Get custom patterns from wpmDataLayer if available\n\t\tlet customPatterns = []\n\t\tif (Array.isArray(wpmDataLayer?.general?.server_2_server?.user_agent_exclude_patterns)) {\n\t\t\tcustomPatterns = wpmDataLayer.general.server_2_server.user_agent_exclude_patterns\n\t\t}\n\n\t\t// Default bot patterns - focusing on legitimate crawlers that identify themselves\n\t\tconst defaultPatterns = [\n\t\t\t// Search engine crawlers\n\t\t\t'Googlebot',\n\t\t\t'Google-InspectionTool',\n\t\t\t'Google-Extended',\n\t\t\t'Storebot-Google',\n\t\t\t'bingbot',\n\t\t\t'BingPreview',\n\t\t\t'msnbot',\n\t\t\t'Slurp',\n\t\t\t'DuckDuckBot',\n\t\t\t'Baiduspider',\n\t\t\t'YandexBot',\n\t\t\t'Sogou',\n\t\t\t\n\t\t\t// Social media crawlers\n\t\t\t'facebookexternalhit',\n\t\t\t'FacebookBot',\n\t\t\t'LinkedInBot',\n\t\t\t'Twitterbot',\n\t\t\t'PinterestBot',\n\t\t\t'TikTokBot',\n\t\t\t'SnapchatAds',\n\t\t\t'DiscordBot',\n\t\t\t'InstagramBot',\n\t\t\t'WhatsApp',\n\t\t\t\n\t\t\t// SEO & Analytics\n\t\t\t'AhrefsBot',\n\t\t\t'SemrushBot',\n\t\t\t'MJ12bot',\n\t\t\t'DotBot',\n\t\t\t'rogerbot',\n\t\t\t\n\t\t\t// Monitoring services\n\t\t\t'UptimeRobot',\n\t\t\t'Pingdom',\n\t\t\t'StatusCake',\n\t\t\t'GTmetrix',\n\t\t\t\n\t\t\t// AI & Research\n\t\t\t'ClaudeBot',\n\t\t\t'GPTBot',\n\t\t\t'ChatGPT',\n\t\t\t'anthropic-ai',\n\t\t\t'CCBot',\n\t\t\t'PerplexityBot',\n\t\t\t\n\t\t\t// Generic patterns\n\t\t\t'crawler',\n\t\t\t'spider',\n\t\t\t'scraper',\n\t\t\t'bot/',\n\t\t\t'/bot',\n\t\t\t'bot-',\n\t\t]\n\n\t\treturn defaultPatterns.concat(customPatterns)\n\t}\n\n\t/**\n\t * Check if an IP address is in CIDR notation\n\t *\n\t * @param {string} ipName - The IP or CIDR notation to check\n\t * @returns {boolean} True if the string contains CIDR notation\n\t */\n\tconst isCidr = (ipName) => {\n\t\treturn ipName.includes('/')\n\t}\n\n\t/**\n\t * Check if an IP address is on the custom exclusion list\n\t *\n\t * @param {string} ip - The IP address to check\n\t * @returns {boolean} True if the IP is on the exclusion list\n\t */\n\tconst isOnIpExclusionList = (ip) => {\n\t\tconst ipExcludeList = wpmDataLayer?.general?.server_2_server?.ip_exclude_list || []\n\n\t\tfor (const ipName of ipExcludeList) {\n\t\t\tif (isCidr(ipName)) {\n\t\t\t\t// Check CIDR range\n\t\t\t\tif (isInSubnet.isInSubnet(ip, ipName)) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t} else if (ip === ipName) {\n\t\t\t\t// Exact IP match\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\n\t\treturn false\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery))\n","/**\n * Register event listeners\n */\n\n\n/**\n * add_to_cart event\n *\n * WC is inconsistent with events that emit add-to-cart events.\n * adding_to_cart and added_to_are legacy events. Also, they only work\n * on Ajax buttons on shop pages.\n *\n * Never add document or body selectors.\n * The document selector doesn't work.\n * The body selector will cause the events to fire twice and other erratic behavior if used along with other selectors.\n */\nconst addToCartSelectorsArray = [\n\t// \"document\",\n\t// \"body\",\n\t\".add_to_cart_button:not(.product_type_variable)\",\n\t\".ajax_add_to_cart\",\n\t\".single_add_to_cart_button\",\n];\n\nconst addToCartSelectors = wpm.prepareSelectors(addToCartSelectorsArray, \"addToCart\");\n\njQuery(addToCartSelectors).on(\"click adding_to_cart\", (event, data) => {\n\n\t// console.log(\"add_to_cart event fired at: \" + new Date().getTime())\n\t// console.log('add to cart data', data)\n\t// console.log('add to cart event', event)\n\t// console.log('add to cart jQuery(event.target.dataset)', jQuery(event.target.dataset))\n\t// console.log(\"add to cart event.target.dataset\", event.target.dataset)\n\t// console.log(\"add to cart event.target.dataset.quantity\", event.target.dataset.quantity)\n\t// console.log(\"add to cart event.target.dataset.product_id\", event.target.dataset.product_id)\n\n\ttry {\n\n\t\t// console.log(\"add_to_cart event detected\")\n\n\t\tlet quantity  = event?.target?.dataset?.quantity ? event.target.dataset.quantity : null;\n\t\tlet productId = event?.target?.dataset?.product_id ? event.target.dataset.product_id : event?.target?.value ? event.target.value : null;\n\n\t\t// let quantity  = event.target.dataset.quantity ? event.target.dataset.quantity : 1\n\t\t// let productId = event.target.dataset.product_id ? event.target.dataset.product_id : null\n\n\t\t// Only process on product pages\n\t\tif (wpmDataLayer.shop.page_type === \"product\") {\n\n\t\t\t// First process related and upsell products\n\t\t\tif (\n\t\t\t\ttypeof jQuery(event.currentTarget).attr(\"href\") !== \"undefined\"\n\t\t\t\t&& jQuery(event.currentTarget).attr(\"href\").includes(\"add-to-cart\")\n\t\t\t) {\n\n\t\t\t\tif (!productId) {\n\t\t\t\t\tproductId = jQuery(event.currentTarget).data(\"product_id\");\n\t\t\t\t}\n\n\t\t\t\twpm.addProductToCart(productId, 1);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If is simple product\n\t\t\tif (wpmDataLayer.shop.product_type === \"simple\") {\n\n\t\t\t\tif (quantity === null) {\n\t\t\t\t\tquantity = Number(jQuery(\".input-text.qty\").val()) ? Number(jQuery(\".input-text.qty\").val()) : 1;\n\t\t\t\t}\n\n\t\t\t\tif (!productId) {\n\t\t\t\t\tproductId = jQuery(event.currentTarget).val();\n\t\t\t\t}\n\n\t\t\t\t// Fallback if the body selector is used\n\t\t\t\tif (!productId) {\n\t\t\t\t\t// get the product ID from the element that has the class .product\n\t\t\t\t\t// that element will also have an ID that start with product- and ends with the product ID\n\t\t\t\t\t// example: product-123\n\t\t\t\t\t// save the product ID in the variable productId\n\t\t\t\t\tproductId = jQuery(\".product\").attr(\"id\").replace(\"product-\", \"\");\n\t\t\t\t}\n\n\t\t\t\twpm.addProductToCart(productId, quantity);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If is variable product or variable-subscription\n\t\t\tif ([\"variable\", \"variable-subscription\"].indexOf(wpmDataLayer.shop.product_type) >= 0) {\n\n\t\t\t\tif (quantity === null) {\n\t\t\t\t\tquantity = Number(jQuery(\".input-text.qty\").val()) ? Number(jQuery(\".input-text.qty\").val()) : 1;\n\t\t\t\t}\n\n\t\t\t\tif (!productId) {\n\t\t\t\t\tproductId = jQuery(\"[name='variation_id']\").val();\n\t\t\t\t}\n\n\t\t\t\twpm.addProductToCart(productId, quantity);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If is grouped product\n\t\t\tif (wpmDataLayer.shop.product_type === \"grouped\") {\n\n\t\t\t\tjQuery(\".woocommerce-grouped-product-list-item\").each((index, element) => {\n\n\t\t\t\t\t// Can't rely on  event.target.dataset as it always is sent with the parent product ID and the quantity 1\n\n\t\t\t\t\tquantity = Number(jQuery(element).find(\".input-text.qty\").val()) ? Number(jQuery(element).find(\".input-text.qty\").val()) : 1;\n\n\t\t\t\t\tlet classes = jQuery(element).attr(\"class\");\n\t\t\t\t\tproductId   = wpm.getPostIdFromString(classes);\n\n\t\t\t\t\twpm.addProductToCart(productId, quantity);\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If is bundle product\n\t\t\tif (wpmDataLayer.shop.product_type === \"bundle\") {\n\n\t\t\t\tif (quantity === null) {\n\t\t\t\t\tquantity = Number(jQuery(\".input-text.qty\").val()) ? Number(jQuery(\".input-text.qty\").val()) : 1;\n\t\t\t\t}\n\n\t\t\t\tif (!productId) {\n\t\t\t\t\tproductId = jQuery(\"input[name=add-to-cart]\").val();\n\t\t\t\t}\n\n\t\t\t\twpm.addProductToCart(productId, quantity);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// everything else\n\t\t\tif (quantity === null) {\n\t\t\t\tquantity = Number(jQuery(\".input-text.qty\").val()) ? Number(jQuery(\".input-text.qty\").val()) : 1;\n\t\t\t}\n\n\t\t\twpm.addProductToCart(productId, quantity);\n\n\t\t} else {\n\n\t\t\tif (quantity === null) {\n\t\t\t\tquantity = 1;\n\t\t\t}\n\n\t\t\tif (!productId) {\n\t\t\t\t// console.log(\"add to cart event.currentTarget\", event.currentTarget)\n\t\t\t\tproductId = jQuery(event.currentTarget).data(\"product_id\") ? jQuery(event.currentTarget).data(\"product_id\") : null;\n\t\t\t}\n\n\t\t\t// Another fallback to retrieve the product ID in case the ID is saved in the value attribute\n\t\t\tif (!productId) {\n\t\t\t\tproductId = jQuery(event.currentTarget).val() ? jQuery(event.currentTarget).val() : null;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tproductId\n\t\t\t\t&& quantity\n\t\t\t) {\n\t\t\t\twpm.addProductToCart(productId, quantity);\n\t\t\t}\n\t\t}\n\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n\n/**\n * If someone clicks anywhere on a custom /?add-to-cart=123 link\n * trigger the add to cart event\n */\n\n// jQuery(document).one(\"click\", \"a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)\", (event) => {\njQuery(\"a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)\").one(\"click\", (event) => {\n\n\ttry {\n\t\tif (jQuery(event.target).closest(\"a\").attr(\"href\")) {\n\n\t\t\tlet url = new URL(jQuery(event.currentTarget).attr(\"href\"), window.location.origin);\n\n\t\t\tif (url.searchParams.has(\"add-to-cart\")) {\n\n\t\t\t\tlet productId = url.searchParams.get(\"add-to-cart\");\n\t\t\t\tlet quantity  = url.searchParams.has(\"quantity\") ? parseInt(url.searchParams.get(\"quantity\"), 10) : 1;\n\t\t\t\twpm.addProductToCart(productId, quantity);\n\t\t\t}\n\t\t}\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n// select item event\n// jQuery(document).on(\"click\", \".woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product\", (event) => {\njQuery(\".woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product\").on(\"click\", (event) => {\n\n\ttry {\n\n\t\t/**\n\t\t * On some pages the event fires multiple times, and on product pages\n\t\t * even on page load. Using e.stopPropagation helps to prevent this,\n\t\t * but I don't know why. We don't even have to use this, since only a real\n\t\t * product click yields a valid productId. So we filter the invalid click\n\t\t * events out later down in the code. I'll keep it that way because this is\n\t\t * the most compatible way across shops.\n\t\t *\n\t\t * e.stopPropagation();\n\t\t * */\n\n\t\tlet productId = jQuery(event.currentTarget).nextAll(\".wpmProductId:first\").data(\"id\");\n\n\t\t/**\n\t\t * On product pages, for some reason, the click event is triggered on the main product on page load.\n\t\t * In that case no ID is found. But we can discard it, since we only want to trigger the event on\n\t\t * related products, which are found below.\n\t\t */\n\n\t\tif (productId) {\n\n\t\t\tproductId = wpm.getIdBasedOndVariationsOutputSetting(productId);\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\t\tif (wpmDataLayer.products && wpmDataLayer.products[productId]) {\n\n\t\t\t\tlet product = wpm.getProductDetailsFormattedForEvent(productId);\n\n\t\t\t\tjQuery(document).trigger(\"pmw:select-item\", product);\n\t\t\t}\n\t\t}\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n\n// checkout_progress event\n// track checkout option event: entered valid billing email\n// jQuery(document).on(\"input\", \"#billing_email\", (event) => {\njQuery(\"#billing_email\").on(\"input\", (event) => {\n\n\tif (wpm.isEmail(jQuery(event.currentTarget).val())) {\n\t\t// wpm.fireCheckoutOption(2);\n\t\twpm.fireCheckoutProgress(2);\n\t\twpm.emailSelected = true;\n\t}\n});\n\n\n/**\n * Place order button\n *\n * Track checkout option event: purchase click\n * https://stackoverflow.com/a/34112407/4688612\n * jQuery(document).one(\"click\", \"#place_order\", () => {\n *\n * Has to be hooked after document ready !\n */\njQuery(\"form.checkout\").on(\"checkout_place_order_success\", () => {\n\n\t// console log current time\n\t// console.log(\"checkout_place_order_success event fired at: \" + new Date().getTime())\n\n\tif (false === wpm.emailSelected) {\n\t\twpm.fireCheckoutProgress(2);\n\t}\n\n\tif (false === wpm.paymentMethodSelected) {\n\t\twpm.fireCheckoutProgress(3);\n\t\twpm.fireCheckoutOption(3, jQuery(\"input[name='payment_method']:checked\").val());\n\t}\n\n\twpm.fireCheckoutProgress(4);\n\n\tjQuery(document).trigger(\"pmw:place-order\", {});\n});\n\n/**\n * Update cart event\n *\n * Has to be hooked after document ready !\n */\njQuery(document).on(\"click\", \"[name='update_cart']\", () => {\n\n\ttry {\n\t\tjQuery(\".cart_item\").each((index, element) => {\n\n\t\t\tconst productId = wpm.getProductIdByCartItemElement(element);\n\n\t\t\tif (!productId) {\n\t\t\t\tconsole.error(\"Pixel Manager: Wasn't able to retrieve a productId\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst quantity = wpm.getProductQuantityByCartItemElement(element);\n\n\t\t\tif (!quantity) {\n\t\t\t\tconsole.error(\"Pixel Manager: Wasn't able to retrieve a quantity\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// console.log(\"productId\", productId)\n\t\t\t// console.log(\"quantity\", quantity)\n\n\t\t\tif (quantity === 0) {\n\t\t\t\twpm.removeProductFromCart(productId);\n\t\t\t} else if (quantity < wpmDataLayer.cart[productId].quantity) {\n\t\t\t\twpm.removeProductFromCart(productId, wpmDataLayer.cart[productId].quantity - quantity);\n\t\t\t} else if (quantity > wpmDataLayer.cart[productId].quantity) {\n\t\t\t\twpm.addProductToCart(productId, quantity - wpmDataLayer.cart[productId].quantity);\n\t\t\t}\n\t\t});\n\t} catch (e) {\n\t\tconsole.error(e);\n\t\twpm.getCartItemsFromBackend();\n\t}\n});\n\n// Supports the following plugins:\n// WooCommerce Wishlist: https://woo.com/products/woocommerce-wishlists/\n// YITH WooCommerce Wishlist: https://wordpress.org/plugins/yith-woocommerce-wishlist/\n// add_to_wishlist\njQuery(\".add_to_wishlist,.wl-add-to\").on(\"click\", event => {\n\n\ttry {\n\n\t\tlet productId;\n\n\t\tif (jQuery(event.currentTarget).data(\"productid\")) { // for the WooCommerce wishlist plugin\n\n\t\t\tproductId = jQuery(event.currentTarget).data(\"productid\");\n\t\t} else if (jQuery(event.currentTarget).data(\"product-id\")) {  // for the YITH wishlist plugin\n\n\t\t\tproductId = jQuery(event.currentTarget).data(\"product-id\");\n\t\t}\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\tlet product = wpm.getProductDetailsFormattedForEvent(productId);\n\n\n\t\tjQuery(document).trigger(\"pmw:add-to-wishlist\", product);\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n\n/**\n * Called when the user selects all the required dropdowns / attributes\n *\n * Replaced by code in the event_listeners.js file in case of lazy loading\n *\n * Has to be hooked after document ready !\n *\n * https://stackoverflow.com/a/27849208/4688612\n * https://stackoverflow.com/a/65065335/4688612\n *\n */\n\nif (!wpmDataLayer?.general?.lazy_load_pmw) {\n\twpm.registerShowVariationEventListener();\n}\n\n\n/**\n * Called on variable products when no selection has been done yet\n * or when the visitor deselects his choice.\n *\n * Has to be hooked after document ready !\n */\n\n// jQuery(function () {\n//\n// \tjQuery(\".single_variation_wrap\").on(\"hide_variation\", function () {\n//\n// \t\ttry {\n// \t\t\tlet classes   = jQuery(\"body\").attr(\"class\")\n// \t\t\tlet productId = classes.match(/(postid-)(\\d+)/)[2]\n//\n// \t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n//\n// \t\t\t/**\n// \t\t\t * If we have a variable product with no preset,\n// \t\t\t * and variations output is enabled,\n// \t\t\t * then we send a viewItem event with the first\n// \t\t\t * variation we find for the parent.\n// \t\t\t * If variations output is disabled,\n// \t\t\t * we just send the parent ID.\n// \t\t\t *\n// \t\t\t * And if Facebook microdata is active, use the\n// \t\t\t * microdata product ID.\n// \t\t\t */\n//\n// \t\t\tif (\n// \t\t\t\t\"variable\" === wpmDataLayer.shop.product_type &&\n// \t\t\t\twpmDataLayer?.shop?.variations_output\n// \t\t\t) {\n// \t\t\t\tfor (const [key, product] of Object.entries(wpmDataLayer.products)) {\n// \t\t\t\t\tif (\"parent_id\" in product) {\n//\n// \t\t\t\t\t\tproductId = product.id\n// \t\t\t\t\t\tbreak\n// \t\t\t\t\t}\n// \t\t\t\t}\n//\n// \t\t\t\tif (wpmDataLayer?.pixels?.facebook?.microdata_product_id) {\n// \t\t\t\t\tproductId = wpmDataLayer.pixels.facebook.microdata_product_id\n// \t\t\t\t}\n// \t\t\t}\n//\n// \t\t\t// console.log(\"hmm\")\n// \t\t\twpm.triggerViewItemEventPrep(productId)\n//\n// \t\t} catch (e) {\n// \t\t\tconsole.error(e)\n// \t\t}\n// \t})\n// })\n\n// jQuery(function () {\n//\n// \tjQuery(\".single_variation_wrap\").on(\"hide_variation\", function () {\n// \t\tjQuery(document).trigger(\"pmw:view-item\")\n// \t})\n// })\n","(function() {\n  var expandIPv6, ipaddr, ipv4Part, ipv4Regexes, ipv6Part, ipv6Regexes, matchCIDR, root, zoneIndex;\n\n  ipaddr = {};\n\n  root = this;\n\n  if ((typeof module !== \"undefined\" && module !== null) && module.exports) {\n    module.exports = ipaddr;\n  } else {\n    root['ipaddr'] = ipaddr;\n  }\n\n  matchCIDR = function(first, second, partSize, cidrBits) {\n    var part, shift;\n    if (first.length !== second.length) {\n      throw new Error(\"ipaddr: cannot match CIDR for objects with different lengths\");\n    }\n    part = 0;\n    while (cidrBits > 0) {\n      shift = partSize - cidrBits;\n      if (shift < 0) {\n        shift = 0;\n      }\n      if (first[part] >> shift !== second[part] >> shift) {\n        return false;\n      }\n      cidrBits -= partSize;\n      part += 1;\n    }\n    return true;\n  };\n\n  ipaddr.subnetMatch = function(address, rangeList, defaultName) {\n    var k, len, rangeName, rangeSubnets, subnet;\n    if (defaultName == null) {\n      defaultName = 'unicast';\n    }\n    for (rangeName in rangeList) {\n      rangeSubnets = rangeList[rangeName];\n      if (rangeSubnets[0] && !(rangeSubnets[0] instanceof Array)) {\n        rangeSubnets = [rangeSubnets];\n      }\n      for (k = 0, len = rangeSubnets.length; k < len; k++) {\n        subnet = rangeSubnets[k];\n        if (address.kind() === subnet[0].kind()) {\n          if (address.match.apply(address, subnet)) {\n            return rangeName;\n          }\n        }\n      }\n    }\n    return defaultName;\n  };\n\n  ipaddr.IPv4 = (function() {\n    function IPv4(octets) {\n      var k, len, octet;\n      if (octets.length !== 4) {\n        throw new Error(\"ipaddr: ipv4 octet count should be 4\");\n      }\n      for (k = 0, len = octets.length; k < len; k++) {\n        octet = octets[k];\n        if (!((0 <= octet && octet <= 255))) {\n          throw new Error(\"ipaddr: ipv4 octet should fit in 8 bits\");\n        }\n      }\n      this.octets = octets;\n    }\n\n    IPv4.prototype.kind = function() {\n      return 'ipv4';\n    };\n\n    IPv4.prototype.toString = function() {\n      return this.octets.join(\".\");\n    };\n\n    IPv4.prototype.toNormalizedString = function() {\n      return this.toString();\n    };\n\n    IPv4.prototype.toByteArray = function() {\n      return this.octets.slice(0);\n    };\n\n    IPv4.prototype.match = function(other, cidrRange) {\n      var ref;\n      if (cidrRange === void 0) {\n        ref = other, other = ref[0], cidrRange = ref[1];\n      }\n      if (other.kind() !== 'ipv4') {\n        throw new Error(\"ipaddr: cannot match ipv4 address with non-ipv4 one\");\n      }\n      return matchCIDR(this.octets, other.octets, 8, cidrRange);\n    };\n\n    IPv4.prototype.SpecialRanges = {\n      unspecified: [[new IPv4([0, 0, 0, 0]), 8]],\n      broadcast: [[new IPv4([255, 255, 255, 255]), 32]],\n      multicast: [[new IPv4([224, 0, 0, 0]), 4]],\n      linkLocal: [[new IPv4([169, 254, 0, 0]), 16]],\n      loopback: [[new IPv4([127, 0, 0, 0]), 8]],\n      carrierGradeNat: [[new IPv4([100, 64, 0, 0]), 10]],\n      \"private\": [[new IPv4([10, 0, 0, 0]), 8], [new IPv4([172, 16, 0, 0]), 12], [new IPv4([192, 168, 0, 0]), 16]],\n      reserved: [[new IPv4([192, 0, 0, 0]), 24], [new IPv4([192, 0, 2, 0]), 24], [new IPv4([192, 88, 99, 0]), 24], [new IPv4([198, 51, 100, 0]), 24], [new IPv4([203, 0, 113, 0]), 24], [new IPv4([240, 0, 0, 0]), 4]]\n    };\n\n    IPv4.prototype.range = function() {\n      return ipaddr.subnetMatch(this, this.SpecialRanges);\n    };\n\n    IPv4.prototype.toIPv4MappedAddress = function() {\n      return ipaddr.IPv6.parse(\"::ffff:\" + (this.toString()));\n    };\n\n    IPv4.prototype.prefixLengthFromSubnetMask = function() {\n      var cidr, i, k, octet, stop, zeros, zerotable;\n      zerotable = {\n        0: 8,\n        128: 7,\n        192: 6,\n        224: 5,\n        240: 4,\n        248: 3,\n        252: 2,\n        254: 1,\n        255: 0\n      };\n      cidr = 0;\n      stop = false;\n      for (i = k = 3; k >= 0; i = k += -1) {\n        octet = this.octets[i];\n        if (octet in zerotable) {\n          zeros = zerotable[octet];\n          if (stop && zeros !== 0) {\n            return null;\n          }\n          if (zeros !== 8) {\n            stop = true;\n          }\n          cidr += zeros;\n        } else {\n          return null;\n        }\n      }\n      return 32 - cidr;\n    };\n\n    return IPv4;\n\n  })();\n\n  ipv4Part = \"(0?\\\\d+|0x[a-f0-9]+)\";\n\n  ipv4Regexes = {\n    fourOctet: new RegExp(\"^\" + ipv4Part + \"\\\\.\" + ipv4Part + \"\\\\.\" + ipv4Part + \"\\\\.\" + ipv4Part + \"$\", 'i'),\n    longValue: new RegExp(\"^\" + ipv4Part + \"$\", 'i')\n  };\n\n  ipaddr.IPv4.parser = function(string) {\n    var match, parseIntAuto, part, shift, value;\n    parseIntAuto = function(string) {\n      if (string[0] === \"0\" && string[1] !== \"x\") {\n        return parseInt(string, 8);\n      } else {\n        return parseInt(string);\n      }\n    };\n    if (match = string.match(ipv4Regexes.fourOctet)) {\n      return (function() {\n        var k, len, ref, results;\n        ref = match.slice(1, 6);\n        results = [];\n        for (k = 0, len = ref.length; k < len; k++) {\n          part = ref[k];\n          results.push(parseIntAuto(part));\n        }\n        return results;\n      })();\n    } else if (match = string.match(ipv4Regexes.longValue)) {\n      value = parseIntAuto(match[1]);\n      if (value > 0xffffffff || value < 0) {\n        throw new Error(\"ipaddr: address outside defined range\");\n      }\n      return ((function() {\n        var k, results;\n        results = [];\n        for (shift = k = 0; k <= 24; shift = k += 8) {\n          results.push((value >> shift) & 0xff);\n        }\n        return results;\n      })()).reverse();\n    } else {\n      return null;\n    }\n  };\n\n  ipaddr.IPv6 = (function() {\n    function IPv6(parts, zoneId) {\n      var i, k, l, len, part, ref;\n      if (parts.length === 16) {\n        this.parts = [];\n        for (i = k = 0; k <= 14; i = k += 2) {\n          this.parts.push((parts[i] << 8) | parts[i + 1]);\n        }\n      } else if (parts.length === 8) {\n        this.parts = parts;\n      } else {\n        throw new Error(\"ipaddr: ipv6 part count should be 8 or 16\");\n      }\n      ref = this.parts;\n      for (l = 0, len = ref.length; l < len; l++) {\n        part = ref[l];\n        if (!((0 <= part && part <= 0xffff))) {\n          throw new Error(\"ipaddr: ipv6 part should fit in 16 bits\");\n        }\n      }\n      if (zoneId) {\n        this.zoneId = zoneId;\n      }\n    }\n\n    IPv6.prototype.kind = function() {\n      return 'ipv6';\n    };\n\n    IPv6.prototype.toString = function() {\n      return this.toNormalizedString().replace(/((^|:)(0(:|$))+)/, '::');\n    };\n\n    IPv6.prototype.toRFC5952String = function() {\n      var bestMatchIndex, bestMatchLength, match, regex, string;\n      regex = /((^|:)(0(:|$)){2,})/g;\n      string = this.toNormalizedString();\n      bestMatchIndex = 0;\n      bestMatchLength = -1;\n      while ((match = regex.exec(string))) {\n        if (match[0].length > bestMatchLength) {\n          bestMatchIndex = match.index;\n          bestMatchLength = match[0].length;\n        }\n      }\n      if (bestMatchLength < 0) {\n        return string;\n      }\n      return string.substring(0, bestMatchIndex) + '::' + string.substring(bestMatchIndex + bestMatchLength);\n    };\n\n    IPv6.prototype.toByteArray = function() {\n      var bytes, k, len, part, ref;\n      bytes = [];\n      ref = this.parts;\n      for (k = 0, len = ref.length; k < len; k++) {\n        part = ref[k];\n        bytes.push(part >> 8);\n        bytes.push(part & 0xff);\n      }\n      return bytes;\n    };\n\n    IPv6.prototype.toNormalizedString = function() {\n      var addr, part, suffix;\n      addr = ((function() {\n        var k, len, ref, results;\n        ref = this.parts;\n        results = [];\n        for (k = 0, len = ref.length; k < len; k++) {\n          part = ref[k];\n          results.push(part.toString(16));\n        }\n        return results;\n      }).call(this)).join(\":\");\n      suffix = '';\n      if (this.zoneId) {\n        suffix = '%' + this.zoneId;\n      }\n      return addr + suffix;\n    };\n\n    IPv6.prototype.toFixedLengthString = function() {\n      var addr, part, suffix;\n      addr = ((function() {\n        var k, len, ref, results;\n        ref = this.parts;\n        results = [];\n        for (k = 0, len = ref.length; k < len; k++) {\n          part = ref[k];\n          results.push(part.toString(16).padStart(4, '0'));\n        }\n        return results;\n      }).call(this)).join(\":\");\n      suffix = '';\n      if (this.zoneId) {\n        suffix = '%' + this.zoneId;\n      }\n      return addr + suffix;\n    };\n\n    IPv6.prototype.match = function(other, cidrRange) {\n      var ref;\n      if (cidrRange === void 0) {\n        ref = other, other = ref[0], cidrRange = ref[1];\n      }\n      if (other.kind() !== 'ipv6') {\n        throw new Error(\"ipaddr: cannot match ipv6 address with non-ipv6 one\");\n      }\n      return matchCIDR(this.parts, other.parts, 16, cidrRange);\n    };\n\n    IPv6.prototype.SpecialRanges = {\n      unspecified: [new IPv6([0, 0, 0, 0, 0, 0, 0, 0]), 128],\n      linkLocal: [new IPv6([0xfe80, 0, 0, 0, 0, 0, 0, 0]), 10],\n      multicast: [new IPv6([0xff00, 0, 0, 0, 0, 0, 0, 0]), 8],\n      loopback: [new IPv6([0, 0, 0, 0, 0, 0, 0, 1]), 128],\n      uniqueLocal: [new IPv6([0xfc00, 0, 0, 0, 0, 0, 0, 0]), 7],\n      ipv4Mapped: [new IPv6([0, 0, 0, 0, 0, 0xffff, 0, 0]), 96],\n      rfc6145: [new IPv6([0, 0, 0, 0, 0xffff, 0, 0, 0]), 96],\n      rfc6052: [new IPv6([0x64, 0xff9b, 0, 0, 0, 0, 0, 0]), 96],\n      '6to4': [new IPv6([0x2002, 0, 0, 0, 0, 0, 0, 0]), 16],\n      teredo: [new IPv6([0x2001, 0, 0, 0, 0, 0, 0, 0]), 32],\n      reserved: [[new IPv6([0x2001, 0xdb8, 0, 0, 0, 0, 0, 0]), 32]]\n    };\n\n    IPv6.prototype.range = function() {\n      return ipaddr.subnetMatch(this, this.SpecialRanges);\n    };\n\n    IPv6.prototype.isIPv4MappedAddress = function() {\n      return this.range() === 'ipv4Mapped';\n    };\n\n    IPv6.prototype.toIPv4Address = function() {\n      var high, low, ref;\n      if (!this.isIPv4MappedAddress()) {\n        throw new Error(\"ipaddr: trying to convert a generic ipv6 address to ipv4\");\n      }\n      ref = this.parts.slice(-2), high = ref[0], low = ref[1];\n      return new ipaddr.IPv4([high >> 8, high & 0xff, low >> 8, low & 0xff]);\n    };\n\n    IPv6.prototype.prefixLengthFromSubnetMask = function() {\n      var cidr, i, k, part, stop, zeros, zerotable;\n      zerotable = {\n        0: 16,\n        32768: 15,\n        49152: 14,\n        57344: 13,\n        61440: 12,\n        63488: 11,\n        64512: 10,\n        65024: 9,\n        65280: 8,\n        65408: 7,\n        65472: 6,\n        65504: 5,\n        65520: 4,\n        65528: 3,\n        65532: 2,\n        65534: 1,\n        65535: 0\n      };\n      cidr = 0;\n      stop = false;\n      for (i = k = 7; k >= 0; i = k += -1) {\n        part = this.parts[i];\n        if (part in zerotable) {\n          zeros = zerotable[part];\n          if (stop && zeros !== 0) {\n            return null;\n          }\n          if (zeros !== 16) {\n            stop = true;\n          }\n          cidr += zeros;\n        } else {\n          return null;\n        }\n      }\n      return 128 - cidr;\n    };\n\n    return IPv6;\n\n  })();\n\n  ipv6Part = \"(?:[0-9a-f]+::?)+\";\n\n  zoneIndex = \"%[0-9a-z]{1,}\";\n\n  ipv6Regexes = {\n    zoneIndex: new RegExp(zoneIndex, 'i'),\n    \"native\": new RegExp(\"^(::)?(\" + ipv6Part + \")?([0-9a-f]+)?(::)?(\" + zoneIndex + \")?$\", 'i'),\n    transitional: new RegExp((\"^((?:\" + ipv6Part + \")|(?:::)(?:\" + ipv6Part + \")?)\") + (ipv4Part + \"\\\\.\" + ipv4Part + \"\\\\.\" + ipv4Part + \"\\\\.\" + ipv4Part) + (\"(\" + zoneIndex + \")?$\"), 'i')\n  };\n\n  expandIPv6 = function(string, parts) {\n    var colonCount, lastColon, part, replacement, replacementCount, zoneId;\n    if (string.indexOf('::') !== string.lastIndexOf('::')) {\n      return null;\n    }\n    zoneId = (string.match(ipv6Regexes['zoneIndex']) || [])[0];\n    if (zoneId) {\n      zoneId = zoneId.substring(1);\n      string = string.replace(/%.+$/, '');\n    }\n    colonCount = 0;\n    lastColon = -1;\n    while ((lastColon = string.indexOf(':', lastColon + 1)) >= 0) {\n      colonCount++;\n    }\n    if (string.substr(0, 2) === '::') {\n      colonCount--;\n    }\n    if (string.substr(-2, 2) === '::') {\n      colonCount--;\n    }\n    if (colonCount > parts) {\n      return null;\n    }\n    replacementCount = parts - colonCount;\n    replacement = ':';\n    while (replacementCount--) {\n      replacement += '0:';\n    }\n    string = string.replace('::', replacement);\n    if (string[0] === ':') {\n      string = string.slice(1);\n    }\n    if (string[string.length - 1] === ':') {\n      string = string.slice(0, -1);\n    }\n    parts = (function() {\n      var k, len, ref, results;\n      ref = string.split(\":\");\n      results = [];\n      for (k = 0, len = ref.length; k < len; k++) {\n        part = ref[k];\n        results.push(parseInt(part, 16));\n      }\n      return results;\n    })();\n    return {\n      parts: parts,\n      zoneId: zoneId\n    };\n  };\n\n  ipaddr.IPv6.parser = function(string) {\n    var addr, k, len, match, octet, octets, zoneId;\n    if (ipv6Regexes['native'].test(string)) {\n      return expandIPv6(string, 8);\n    } else if (match = string.match(ipv6Regexes['transitional'])) {\n      zoneId = match[6] || '';\n      addr = expandIPv6(match[1].slice(0, -1) + zoneId, 6);\n      if (addr.parts) {\n        octets = [parseInt(match[2]), parseInt(match[3]), parseInt(match[4]), parseInt(match[5])];\n        for (k = 0, len = octets.length; k < len; k++) {\n          octet = octets[k];\n          if (!((0 <= octet && octet <= 255))) {\n            return null;\n          }\n        }\n        addr.parts.push(octets[0] << 8 | octets[1]);\n        addr.parts.push(octets[2] << 8 | octets[3]);\n        return {\n          parts: addr.parts,\n          zoneId: addr.zoneId\n        };\n      }\n    }\n    return null;\n  };\n\n  ipaddr.IPv4.isIPv4 = ipaddr.IPv6.isIPv6 = function(string) {\n    return this.parser(string) !== null;\n  };\n\n  ipaddr.IPv4.isValid = function(string) {\n    var e;\n    try {\n      new this(this.parser(string));\n      return true;\n    } catch (error1) {\n      e = error1;\n      return false;\n    }\n  };\n\n  ipaddr.IPv4.isValidFourPartDecimal = function(string) {\n    if (ipaddr.IPv4.isValid(string) && string.match(/^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){3}$/)) {\n      return true;\n    } else {\n      return false;\n    }\n  };\n\n  ipaddr.IPv6.isValid = function(string) {\n    var addr, e;\n    if (typeof string === \"string\" && string.indexOf(\":\") === -1) {\n      return false;\n    }\n    try {\n      addr = this.parser(string);\n      new this(addr.parts, addr.zoneId);\n      return true;\n    } catch (error1) {\n      e = error1;\n      return false;\n    }\n  };\n\n  ipaddr.IPv4.parse = function(string) {\n    var parts;\n    parts = this.parser(string);\n    if (parts === null) {\n      throw new Error(\"ipaddr: string is not formatted like ip address\");\n    }\n    return new this(parts);\n  };\n\n  ipaddr.IPv6.parse = function(string) {\n    var addr;\n    addr = this.parser(string);\n    if (addr.parts === null) {\n      throw new Error(\"ipaddr: string is not formatted like ip address\");\n    }\n    return new this(addr.parts, addr.zoneId);\n  };\n\n  ipaddr.IPv4.parseCIDR = function(string) {\n    var maskLength, match, parsed;\n    if (match = string.match(/^(.+)\\/(\\d+)$/)) {\n      maskLength = parseInt(match[2]);\n      if (maskLength >= 0 && maskLength <= 32) {\n        parsed = [this.parse(match[1]), maskLength];\n        Object.defineProperty(parsed, 'toString', {\n          value: function() {\n            return this.join('/');\n          }\n        });\n        return parsed;\n      }\n    }\n    throw new Error(\"ipaddr: string is not formatted like an IPv4 CIDR range\");\n  };\n\n  ipaddr.IPv4.subnetMaskFromPrefixLength = function(prefix) {\n    var filledOctetCount, j, octets;\n    prefix = parseInt(prefix);\n    if (prefix < 0 || prefix > 32) {\n      throw new Error('ipaddr: invalid IPv4 prefix length');\n    }\n    octets = [0, 0, 0, 0];\n    j = 0;\n    filledOctetCount = Math.floor(prefix / 8);\n    while (j < filledOctetCount) {\n      octets[j] = 255;\n      j++;\n    }\n    if (filledOctetCount < 4) {\n      octets[filledOctetCount] = Math.pow(2, prefix % 8) - 1 << 8 - (prefix % 8);\n    }\n    return new this(octets);\n  };\n\n  ipaddr.IPv4.broadcastAddressFromCIDR = function(string) {\n    var cidr, error, i, ipInterfaceOctets, octets, subnetMaskOctets;\n    try {\n      cidr = this.parseCIDR(string);\n      ipInterfaceOctets = cidr[0].toByteArray();\n      subnetMaskOctets = this.subnetMaskFromPrefixLength(cidr[1]).toByteArray();\n      octets = [];\n      i = 0;\n      while (i < 4) {\n        octets.push(parseInt(ipInterfaceOctets[i], 10) | parseInt(subnetMaskOctets[i], 10) ^ 255);\n        i++;\n      }\n      return new this(octets);\n    } catch (error1) {\n      error = error1;\n      throw new Error('ipaddr: the address does not have IPv4 CIDR format');\n    }\n  };\n\n  ipaddr.IPv4.networkAddressFromCIDR = function(string) {\n    var cidr, error, i, ipInterfaceOctets, octets, subnetMaskOctets;\n    try {\n      cidr = this.parseCIDR(string);\n      ipInterfaceOctets = cidr[0].toByteArray();\n      subnetMaskOctets = this.subnetMaskFromPrefixLength(cidr[1]).toByteArray();\n      octets = [];\n      i = 0;\n      while (i < 4) {\n        octets.push(parseInt(ipInterfaceOctets[i], 10) & parseInt(subnetMaskOctets[i], 10));\n        i++;\n      }\n      return new this(octets);\n    } catch (error1) {\n      error = error1;\n      throw new Error('ipaddr: the address does not have IPv4 CIDR format');\n    }\n  };\n\n  ipaddr.IPv6.parseCIDR = function(string) {\n    var maskLength, match, parsed;\n    if (match = string.match(/^(.+)\\/(\\d+)$/)) {\n      maskLength = parseInt(match[2]);\n      if (maskLength >= 0 && maskLength <= 128) {\n        parsed = [this.parse(match[1]), maskLength];\n        Object.defineProperty(parsed, 'toString', {\n          value: function() {\n            return this.join('/');\n          }\n        });\n        return parsed;\n      }\n    }\n    throw new Error(\"ipaddr: string is not formatted like an IPv6 CIDR range\");\n  };\n\n  ipaddr.isValid = function(string) {\n    return ipaddr.IPv6.isValid(string) || ipaddr.IPv4.isValid(string);\n  };\n\n  ipaddr.parse = function(string) {\n    if (ipaddr.IPv6.isValid(string)) {\n      return ipaddr.IPv6.parse(string);\n    } else if (ipaddr.IPv4.isValid(string)) {\n      return ipaddr.IPv4.parse(string);\n    } else {\n      throw new Error(\"ipaddr: the address has neither IPv6 nor IPv4 format\");\n    }\n  };\n\n  ipaddr.parseCIDR = function(string) {\n    var e;\n    try {\n      return ipaddr.IPv6.parseCIDR(string);\n    } catch (error1) {\n      e = error1;\n      try {\n        return ipaddr.IPv4.parseCIDR(string);\n      } catch (error1) {\n        e = error1;\n        throw new Error(\"ipaddr: the address has neither IPv6 nor IPv4 CIDR format\");\n      }\n    }\n  };\n\n  ipaddr.fromByteArray = function(bytes) {\n    var length;\n    length = bytes.length;\n    if (length === 4) {\n      return new ipaddr.IPv4(bytes);\n    } else if (length === 16) {\n      return new ipaddr.IPv6(bytes);\n    } else {\n      throw new Error(\"ipaddr: the binary input is neither an IPv6 nor IPv4 address\");\n    }\n  };\n\n  ipaddr.process = function(string) {\n    var addr;\n    addr = this.parse(string);\n    if (addr.kind() === 'ipv6' && addr.isIPv4MappedAddress()) {\n      return addr.toIPv4Address();\n    } else {\n      return addr;\n    }\n  };\n\n}).call(this);\n","/**\n * Created by elgs on 3/5/16.\n */\nconst normalize = function (a) {\n   if (!_validate(a)) {\n      throw new Error('Invalid address: ' + a);\n   }\n   a = a.toLowerCase()\n\n   const nh = a.split(/\\:\\:/g);\n   if (nh.length > 2) {\n      throw new Error('Invalid address: ' + a);\n   }\n\n   let sections = [];\n   if (nh.length == 1) {\n      // full mode\n      sections = a.split(/\\:/g);\n      if (sections.length !== 8) {\n         throw new Error('Invalid address: ' + a);\n      }\n   } else if (nh.length == 2) {\n      // compact mode\n      const n = nh[0];\n      const h = nh[1];\n      const ns = n.split(/\\:/g);\n      const hs = h.split(/\\:/g);\n      for (let i in ns) {\n         sections[i] = ns[i];\n      }\n      for (let i = hs.length; i > 0; --i) {\n         sections[7 - (hs.length - i)] = hs[i - 1];\n      }\n   }\n   for (let i = 0; i < 8; ++i) {\n      if (sections[i] === undefined) {\n         sections[i] = '0000';\n      }\n      sections[i] = _leftPad(sections[i], '0', 4);\n   }\n   return sections.join(':');\n};\n\nconst abbreviate = function (a) {\n   if (!_validate(a)) {\n      throw new Error('Invalid address: ' + a);\n   }\n   a = normalize(a);\n   a = a.replace(/0000/g, 'g');\n   a = a.replace(/\\:000/g, ':');\n   a = a.replace(/\\:00/g, ':');\n   a = a.replace(/\\:0/g, ':');\n   a = a.replace(/g/g, '0');\n   const sections = a.split(/\\:/g);\n   let zPreviousFlag = false;\n   let zeroStartIndex = -1;\n   let zeroLength = 0;\n   let zStartIndex = -1;\n   let zLength = 0;\n   for (let i = 0; i < 8; ++i) {\n      const section = sections[i];\n      let zFlag = (section === '0');\n      if (zFlag && !zPreviousFlag) {\n         zStartIndex = i;\n      }\n      if (!zFlag && zPreviousFlag) {\n         zLength = i - zStartIndex;\n      }\n      if (zLength > 1 && zLength > zeroLength) {\n         zeroStartIndex = zStartIndex;\n         zeroLength = zLength;\n      }\n      zPreviousFlag = (section === '0');\n   }\n   if (zPreviousFlag) {\n      zLength = 8 - zStartIndex;\n   }\n   if (zLength > 1 && zLength > zeroLength) {\n      zeroStartIndex = zStartIndex;\n      zeroLength = zLength;\n   }\n   //console.log(zeroStartIndex, zeroLength);\n   //console.log(sections);\n   if (zeroStartIndex >= 0 && zeroLength > 1) {\n      sections.splice(zeroStartIndex, zeroLength, 'g');\n   }\n   //console.log(sections);\n   a = sections.join(':');\n   //console.log(a);\n   a = a.replace(/\\:g\\:/g, '::');\n   a = a.replace(/\\:g/g, '::');\n   a = a.replace(/g\\:/g, '::');\n   a = a.replace(/g/g, '::');\n   //console.log(a);\n   return a;\n};\n\n// Basic validation\nconst _validate = function (a) {\n   return /^[a-f0-9\\\\:]+$/ig.test(a);\n};\n\nconst _leftPad = function (d, p, n) {\n   const padding = p.repeat(n);\n   if (d.length < padding.length) {\n      d = padding.substring(0, padding.length - d.length) + d;\n   }\n   return d;\n};\n\nconst _hex2bin = function (hex) {\n   return parseInt(hex, 16).toString(2)\n};\nconst _bin2hex = function (bin) {\n   return parseInt(bin, 2).toString(16)\n};\n\nconst _addr2bin = function (addr) {\n   const nAddr = normalize(addr);\n   const sections = nAddr.split(\":\");\n   let binAddr = '';\n   for (const section of sections) {\n      binAddr += _leftPad(_hex2bin(section), '0', 16);\n   }\n   return binAddr;\n};\n\nconst _bin2addr = function (bin) {\n   const addr = [];\n   for (let i = 0; i < 8; ++i) {\n      const binPart = bin.substr(i * 16, 16);\n      const hexSection = _leftPad(_bin2hex(binPart), '0', 4);\n      addr.push(hexSection);\n   }\n   return addr.join(':');\n};\n\nconst divideSubnet = function (addr, mask0, mask1, limit, abbr) {\n   if (!_validate(addr)) {\n      throw new Error('Invalid address: ' + addr);\n   }\n   mask0 *= 1;\n   mask1 *= 1;\n   limit *= 1;\n   mask1 = mask1 || 128;\n   if (mask0 < 1 || mask1 < 1 || mask0 > 128 || mask1 > 128 || mask0 > mask1) {\n      throw new Error('Invalid masks.');\n   }\n   const ret = [];\n   const binAddr = _addr2bin(addr);\n   const binNetPart = binAddr.substr(0, mask0);\n   const binHostPart = '0'.repeat(128 - mask1);\n   const numSubnets = Math.pow(2, mask1 - mask0);\n   for (let i = 0; i < numSubnets; ++i) {\n      if (!!limit && i >= limit) {\n         break;\n      }\n      const binSubnet = _leftPad(i.toString(2), '0', mask1 - mask0);\n      const binSubAddr = binNetPart + binSubnet + binHostPart;\n      const hexAddr = _bin2addr(binSubAddr);\n      if (!!abbr) {\n         ret.push(abbreviate(hexAddr));\n      } else {\n         ret.push(hexAddr);\n      }\n\n   }\n   // console.log(numSubnets);\n   // console.log(binNetPart, binSubnetPart, binHostPart);\n   // console.log(binNetPart.length, binSubnetPart.length, binHostPart.length);\n   // console.log(ret.length);\n   return ret;\n};\n\nconst range = function (addr, mask0, mask1, abbr) {\n   if (!_validate(addr)) {\n      throw new Error('Invalid address: ' + addr);\n   }\n   mask0 *= 1;\n   mask1 *= 1;\n   mask1 = mask1 || 128;\n   if (mask0 < 1 || mask1 < 1 || mask0 > 128 || mask1 > 128 || mask0 > mask1) {\n      throw new Error('Invalid masks.');\n   }\n   const binAddr = _addr2bin(addr);\n   const binNetPart = binAddr.substr(0, mask0);\n   const binHostPart = '0'.repeat(128 - mask1);\n   const binStartAddr = binNetPart + '0'.repeat(mask1 - mask0) + binHostPart;\n   const binEndAddr = binNetPart + '1'.repeat(mask1 - mask0) + binHostPart;\n   if (!!abbr) {\n      return {\n         start: abbreviate(_bin2addr(binStartAddr)),\n         end: abbreviate(_bin2addr(binEndAddr)),\n         size: Math.pow(2, mask1 - mask0)\n      };\n   } else {\n      return {\n         start: _bin2addr(binStartAddr),\n         end: _bin2addr(binEndAddr),\n         size: Math.pow(2, mask1 - mask0)\n      };\n   }\n};\n\nconst randomSubnet = function (addr, mask0, mask1, limit, abbr) {\n   if (!_validate(addr)) {\n      throw new Error('Invalid address: ' + addr);\n   }\n   mask0 *= 1;\n   mask1 *= 1;\n   limit *= 1;\n   mask1 = mask1 || 128;\n   limit = limit || 1;\n   if (mask0 < 1 || mask1 < 1 || mask0 > 128 || mask1 > 128 || mask0 > mask1) {\n      throw new Error('Invalid masks.');\n   }\n   const ret = [];\n   const binAddr = _addr2bin(addr);\n   const binNetPart = binAddr.substr(0, mask0);\n   const binHostPart = '0'.repeat(128 - mask1);\n   const numSubnets = Math.pow(2, mask1 - mask0);\n   for (let i = 0; i < numSubnets && i < limit; ++i) {\n      // generate an binary string with length of mask1 - mask0\n      let binSubnet = '';\n      for (let j = 0; j < mask1 - mask0; ++j) {\n         binSubnet += Math.floor(Math.random() * 2);\n      }\n      const binSubAddr = binNetPart + binSubnet + binHostPart;\n      const hexAddr = _bin2addr(binSubAddr);\n      if (!!abbr) {\n         ret.push(abbreviate(hexAddr));\n      } else {\n         ret.push(hexAddr);\n      }\n   }\n   // console.log(numSubnets);\n   // console.log(binNetPart, binSubnetPart, binHostPart);\n   // console.log(binNetPart.length, binSubnetPart.length, binHostPart.length);\n   // console.log(ret.length);\n   return ret;\n};\n\nconst ptr = function (addr, mask) {\n   if (!_validate(addr)) {\n      throw new Error('Invalid address: ' + addr);\n   }\n   mask *= 1;\n   if (mask < 1 || mask > 128 || Math.floor(mask / 4) != mask / 4) {\n      throw new Error('Invalid masks.');\n   }\n   const fullAddr = normalize(addr);\n   const reverse = fullAddr.replace(/:/g, '').split('').reverse();\n   return reverse.slice(0, (128 - mask) / 4).join('.');\n};\n\nif (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {\n   exports.normalize = normalize;\n   exports.abbreviate = abbreviate;\n   exports.divideSubnet = divideSubnet;\n   exports.range = range;\n   exports.randomSubnet = randomSubnet;\n   exports.ptr = ptr;\n} else {\n   window.normalize = normalize;\n   window.abbreviate = abbreviate;\n   window.divideSubnet = divideSubnet;\n   window.range = range;\n   window.randomSubnet = randomSubnet;\n   window.ptr = ptr;\n}\n","import ipaddr from 'ipaddr.js';\n// @ts-ignore: Can't find a @types/ip6 package\nimport ip6 from 'ip6';\n\nexport function isIP(addr: string) {\n  return ipaddr.isValid(addr);\n}\n\nexport function version(addr: string): number {\n  try {\n    const parse_addr = ipaddr.parse(addr);\n    const kind = parse_addr.kind();\n\n    if (kind === 'ipv4') {\n      return 4; //IPv4\n    } else if (kind === 'ipv6') {\n      return 6; //IPv6\n    } else {\n      /* istanbul ignore next */\n      return 0; //not 4 or 6\n    }\n  } catch (err) {\n    return 0; //not 4 or 6\n  }\n}\n\nexport function isV4(addr: string) {\n  return version(addr) === 4;\n}\n\nexport function isV6(addr: string) {\n  return version(addr) === 6;\n}\n\nexport function isRange(range: string) {\n  try {\n    const cidr = ipaddr.parseCIDR(range);\n    return true;\n  } catch (err) {\n    return false;\n  }\n}\n\nexport function inRange(addr: string, range: string | string[]) {\n  if (typeof range === 'string') {\n    if (range.indexOf('/') !== -1) {\n      try {\n        const range_data = range.split('/');\n\n        const parse_addr = ipaddr.parse(addr);\n        const parse_range = ipaddr.parse(range_data[0]);\n\n        //@ts-ignore:  It works.\n        return parse_addr.match(parse_range, range_data[1]);\n      } catch (err) {\n        return false;\n      }\n    } else {\n      addr = isV6(addr) ? ip6.normalize(addr) : addr; //v6 normalize addr\n      range = isV6(range) ? ip6.normalize(range) : range; //v6 normalize range\n\n      return isIP(range as string) && addr === range;\n    }\n  } else if (range && typeof range === 'object') {\n    //list\n    for (const check_range in range) {\n      if (inRange(addr, range[check_range]) === true) {\n        return true;\n      }\n    }\n    return false;\n  } else {\n    return false;\n  }\n}\n\nexport function storeIP(addr: string) {\n  try {\n    var parse_addr = ipaddr.parse(addr);\n    var kind = parse_addr.kind();\n\n    if (kind === 'ipv4') {\n      //is a plain v4 address\n      return addr;\n    } else if (kind === 'ipv6') {\n      //@ts-ignore:  it exists!\n      if (parse_addr.isIPv4MappedAddress()) {\n        //convert v4 mapped to v6 addresses to a v4 in it's original format\n        //@ts-ignore:  it exists!\n        return parse_addr.toIPv4Address().toString();\n      } //is a v6, abbreviate it\n      else {\n        return ip6.abbreviate(addr);\n      }\n    } else {\n      return null; //invalid IP address\n    }\n  } catch (err) {\n    return null; //invalid IP address\n  }\n}\n\n// searchIP is a aliases of storeIP\nexport { storeIP as searchIP };\n\nexport function displayIP(addr: string) {\n  try {\n    var parse_addr = ipaddr.parse(addr);\n    var kind = parse_addr.kind();\n\n    if (kind === 'ipv4') {\n      //is a plain v4 address\n      return addr;\n    } else if (kind === 'ipv6') {\n      //@ts-ignore:  it exists!\n      if (parse_addr.isIPv4MappedAddress()) {\n        //convert v4 mapped to v6 addresses to a v4 in it's original format\n        //@ts-ignore:  it exists!\n        return parse_addr.toIPv4Address().toString();\n      } //is a v6, normalize it\n      else {\n        return ip6.normalize(addr);\n      }\n    } else {\n      return ''; //invalid IP address\n    }\n  } catch (err) {\n    return ''; //invalid IP address\n  }\n}\n","/**\n * Create a wpm namespace under which all functions are declared\n */\n\n// https://stackoverflow.com/a/5947280/4688612\n\n(function (wpm, $, undefined) {\n\n\tconst wpmDeduper = {\n\t\tkeyName          : \"_wpm_order_ids\",\n\t\tcookieExpiresDays: 365,\n\t};\n\n\tconst wpmRestSettings = {\n\t\t// cookiesAvailable                  : '_wpm_cookies_are_available',\n\t\tcookiePmwRestEndpointAvailable: \"restEndpointAvailable\",\n\t\trestEndpointPost              : \"pmw/v1/test/\",\n\t\trestFails                     : 0,\n\t\trestFailsThreshold            : 10,\n\t};\n\n\twpm.emailSelected         = false;\n\twpm.paymentMethodSelected = false;\n\n\twpm.isBelowRestErrorThreshold = () => wpm.retrieveData(wpmRestSettings.restFails) <= wpmRestSettings.restFailsThreshold;\n\n\twpm.isRestEndpointAvailable = async () => {\n\n\t\t// If we already tested the endpoint and have a stored value, return it\n\t\tif (wpm.retrieveData(wpmRestSettings.cookiePmwRestEndpointAvailable)) {\n\t\t\treturn wpm.retrieveData(wpmRestSettings.cookiePmwRestEndpointAvailable);\n\t\t}\n\n\t\treturn await wpm.testEndpoint();\n\t};\n\n\t/**\n\t * Tests a given endpoint by sending a POST request. If the response status is 200, it stores `true` in the dataStorage with given cookie name; else it stores `false`.\n\t *\n\t * @param {string} url - The URL of the endpoint to test. Defaults to concatenation of `wpm.root` and `wpmRestSettings.restEndpointPost`.\n\t * @param {string} cookieName - The name of the cookie where the test result will be stored. Defaults to `wpmRestSettings.cookiePmwRestEndpointAvailable`.\n\t * @returns {Promise<boolean>} - Returns a promise that resolves to `true` if the response status is 200, and `false` otherwise.\n\t * @async\n\t */\n\twpm.testEndpoint = async (\n\t\turl        = wpm.root + wpmRestSettings.restEndpointPost,\n\t\tcookieName = wpmRestSettings.cookiePmwRestEndpointAvailable,\n\t) => {\n\n\t\ttry {\n\n\t\t\tconst response = await fetch(url, {\n\t\t\t\tmethod   : \"POST\",\n\t\t\t\tmode     : \"cors\",\n\t\t\t\tcache    : \"no-cache\",\n\t\t\t\tkeepalive: true,\n\t\t\t\tredirect : \"error\",\t// don't follow redirects\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\twpm.storeData(cookieName, false);\n\t\t\t\tpmw.console.error(\"Error testing the endpoint. Status: \" + response.status + \" | response: \", response);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst responseJson = await response.json();\n\n\t\t\t// Return false if responseJson.success is not true\n\t\t\tif (!responseJson.success) {\n\t\t\t\twpm.storeData(cookieName, false);\n\t\t\t\tpmw.console.error(\"Error testing the endpoint. Response JSON: \" + JSON.stringify(responseJson));\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\twpm.storeData(cookieName, true);\n\t\t\treturn true;\n\n\t\t} catch (e) {\n\t\t\twpm.storeData(cookieName, false);\n\t\t\tpmw.console.error(\"Error testing the endpoint. Error: \" + e);\n\t\t\treturn false;\n\t\t}\n\t};\n\n\twpm.isWpmRestEndpointAvailable = (cookieName = wpmRestSettings.cookiePmwRestEndpointAvailable) => !!wpm.retrieveData(cookieName);\n\n\t/**\n\t * This function writes the provided orderId into storage. It will first retrieve the existing orderIds\n\t * from the storage if any, then add the new orderId into this existing array of orderIds  and stores\n\t * the updated array back to the storage.\n\t * If the function wpm.storeOrderIdOnServer exists and order_duplication_prevention is set to true in wpmDataLayer.shop,\n\t * this function will also store the orderId, orderKey and source on the server side using wpm.storeOrderIdOnServer.\n\t *\n\t * @param {String}  orderId  - The ID of the order to be stored.\n\t * @param {String}  orderKey - The Key of the order to be stored.\n\t * @param {String}  source - The source from which the order originated (default: 'thankyou_page').\n\t */\n\twpm.writeOrderIdToStorage = (orderId, orderKey, source = \"thankyou_page\") => {\n\n\t\t// Get existing order ids\n\t\tlet orderIds = wpm.retrieveData(\"orderIds\", true) || [];\n\n\t\t// Add the new order id\n\t\torderIds.push(orderId);\n\n\t\t// Store the order ids\n\t\twpm.storeData(\"orderIds\", orderIds, true);\n\n\t\tif (typeof wpm.storeOrderIdOnServer === \"function\") {\n\t\t\twpm.storeOrderIdOnServer({\n\t\t\t\torderId : orderId,\n\t\t\t\torderKey: orderKey,\n\t\t\t\tsource  : source,\n\t\t\t});\n\t\t}\n\t};\n\n\twpm.isOrderIdStored = orderId => {\n\n\t\t// If order deduplication is disabled, return false\n\t\tif (!wpmDataLayer.shop.order_duplication_prevention) {\n\t\t\tpmw.console.log(\"order duplication prevention is off\");\n\t\t\treturn false;\n\t\t}\n\n\t\tconst orderIds = wpm.retrieveData(\"orderIds\", true) || [];\n\t\treturn orderIds.includes(orderId);\n\t};\n\n\t/**\n\t * Check if the email address is valid\n\t *\n\t * https://stackoverflow.com/questions/201323/how-can-i-validate-an-email-address-using-a-regular-expression\n\t * https://www.w3.org/TR/html5/forms.html#valid-e-mail-address\n\t * https://fightingforalostcause.net/content/misc/2006/compare-email-regex.php\n\t *\n\t * @param email\n\t * @returns {boolean}\n\t */\n\twpm.isEmail = email => {\n\n\t\t/**\n\t\t * GitHub Copilot generated RFC 5322 compliant regex\n\t\t * - Don't allow emails without a top-level domain like \"john@localhost\"\n\t\t * - Don't allow emails with dots at the end of the name like \"[email protected]\"\n\t\t */\n\t\tconst regex = new RegExp(\n\t\t\t\"^(([^<>()\\\\[\\\\]\\\\\\\\.,;:\\\\s@\\\"]+(\\\\.[^<>()\\\\[\\\\]\\\\\\\\.,;:\\\\s@\\\"]+)*)|(\\\".+\\\"))\"\n\t\t\t+ \"@\"\n\t\t\t+ \"((\\\\[[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\\\\])\"\n\t\t\t+ \"|(([a-zA-Z\\\\-0-9]+\\\\.)+[a-zA-Z]{2,}))$\",\n\t\t);\n\n\t\treturn regex.test(email);\n\t};\n\n\twpm.removeProductFromCart = async (productId, quantityToRemove = null) => {\n\n\t\ttry {\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\t\tproductId = wpm.getIdBasedOndVariationsOutputSetting(productId);\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\t\tlet quantity;\n\n\t\t\tif (quantityToRemove == null) {\n\t\t\t\tquantity = wpmDataLayer.cart[productId].quantity;\n\t\t\t} else {\n\t\t\t\tquantity = quantityToRemove;\n\t\t\t}\n\n\t\t\tif (!wpmDataLayer.cart[productId]) {\n\t\t\t\tawait wpm.getProductsFromBackend([productId]);\n\t\t\t}\n\n\t\t\tlet product = wpm.getProductDetailsFormattedForEvent(productId, quantity);\n\n\t\t\tjQuery(document).trigger(\"pmw:remove-from-cart\", product);\n\n\t\t\tif (quantityToRemove == null || wpmDataLayer.cart[productId].quantity === quantityToRemove) {\n\t\t\t\tdelete wpmDataLayer.cart[productId];\n\t\t\t} else {\n\t\t\t\twpmDataLayer.cart[productId].quantity = wpmDataLayer.cart[productId].quantity - quantity;\n\t\t\t}\n\n\t\t\twpm.storeCartData(wpmDataLayer.cart);\n\n\t\t} catch (e) {\n\t\t\tpmw.console.error(\"error: \", e);\n\t\t}\n\t};\n\n\twpm.getIdBasedOndVariationsOutputSetting = productId => {\n\n\t\ttry {\n\t\t\tif (wpmDataLayer?.shop?.variations_output) return productId;\n\n\t\t\tif (wpmDataLayer.products[productId].is_variation) return wpmDataLayer.products[productId].parent_id;\n\n\t\t\treturn productId;\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\twpm.prepareSelectors = (selectors, type) => {\n\n\t\tif (wpmDataLayer?.shop?.selectors?.[type]) {\n\n\t\t\t// merge the selectors from the addToCartSelectors array with the selectors from the wpmDataLayer.shop.selectors.addToCart array\n\t\t\tselectors = selectors.concat(wpmDataLayer.shop.selectors[type]);\n\n\t\t\t// Remove duplicates\n\t\t\tselectors = [...new Set(selectors)];\n\n\t\t\t// If one of the selectors is document, remove it\n\t\t\tif (selectors.indexOf(\"document\") >= 0) {\n\t\t\t\tselectors.splice(selectors.indexOf(\"document\"), 1);\n\t\t\t}\n\n\t\t\t// If one of the selectors is body, remove all others\n\t\t\tif (selectors.indexOf(\"body\") >= 0) {\n\t\t\t\tselectors = [\"body\"];\n\t\t\t}\n\t\t}\n\n\t\treturn selectors.join(\", \");\n\t};\n\n\t// add_to_cart\n\twpm.addProductToCart = async (productId, quantity) => {\n\n\t\t// Cast quantity to number to make sure it's a number\n\t\tquantity = Number(quantity);\n\n\t\ttry {\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\t\tproductId = wpm.getIdBasedOndVariationsOutputSetting(productId);\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\t\tif (!wpmDataLayer?.products[productId]) {\n\t\t\t\tawait wpm.getProductsFromBackend([productId]);\n\t\t\t}\n\n\t\t\tlet product = wpm.getProductDetailsFormattedForEvent(productId, quantity);\n\n\t\t\tjQuery(document).trigger(\"pmw:add-to-cart\", product);\n\n\t\t\t// add product to cart wpmDataLayer['cart']\n\n\t\t\t// if the product already exists in the object, only add the additional quantity\n\t\t\t// otherwise create that product object in the wpmDataLayer['cart']\n\t\t\tif (wpmDataLayer?.cart[productId]) {\n\n\t\t\t\twpmDataLayer.cart[productId].quantity = wpmDataLayer.cart[productId].quantity + quantity;\n\t\t\t} else {\n\n\t\t\t\tif (!(\"cart\" in wpmDataLayer)) wpmDataLayer.cart = {};\n\n\t\t\t\twpmDataLayer.cart[productId] = wpm.getProductDetailsFormattedForEvent(productId, quantity);\n\t\t\t}\n\n\t\t\twpm.storeCartData(wpmDataLayer.cart);\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\n\t\t\t// fallback if wpmDataLayer.cart and wpmDataLayer.products got out of sync in case cart caching has an issue\n\t\t\twpm.getCartItemsFromBackend();\n\t\t}\n\t};\n\n\twpm.initCart = () => {\n\n\t\t// If the WC cart doesn't exist, eg. after a confirmed purchase,\n\t\t// and we still have a cart object in the storage, reset it.\n\t\tif (\n\t\t\t!wpm.doesWooCommerceCartExist()\n\t\t\t&& Object.keys(wpm.retrieveCartData()).length !== 0\n\t\t) {\n\t\t\twpm.storeCartData({});\n\t\t\treturn;\n\t\t}\n\n\t\t// If the cart object is in the storage, use it\n\t\tif (wpm.retrieveCartData()) {\n\t\t\twpm.saveCartObjectToDataLayer(wpm.retrieveCartData());\n\t\t\treturn;\n\t\t}\n\n\t\t// If the cart object is missing in the storage, create an empty one and get the cart items from the backend\n\t\twpm.storeCartData({});\n\t\twpm.getCartItemsFromBackend();\n\t};\n\n\t// get all cart items from the backend\n\twpm.getCartItemsFromBackend = () => {\n\t\ttry {\n\n\t\t\t/**\n\t\t\t * Can't use a REST API endpoint, as the cart session will not be loaded if the\n\t\t\t * endpoint is called.\n\t\t\t *\n\t\t\t * https://wordpress.org/support/topic/wc-cart-is-null-in-custom-rest-api/#post-11442843\n\t\t\t */\n\n\t\t\t/**\n\t\t\t * Get the cart items from the backend the data object using fetch API\n\t\t\t * and log success or error messages\n\t\t\t * and url encoded data\n\t\t\t */\n\t\t\tfetch(wpm.ajax_url, {\n\t\t\t\tmethod   : \"POST\",\n\t\t\t\tcache    : \"no-cache\",\n\t\t\t\tbody     : new URLSearchParams({action: \"pmw_get_cart_items\"}),\n\t\t\t\tkeepalive: true,\n\t\t\t\tredirect : \"error\",\n\t\t\t})\n\t\t\t\t.then(response => {\n\t\t\t\t\tif (response.ok) {\n\t\t\t\t\t\treturn response.json();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow Error(\"Error getting cart items from backend\");\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.then(data => {\n\n\t\t\t\t\tif (data.success) {\n\n\t\t\t\t\t\tif (!data.data[\"cart\"]) data.data[\"cart\"] = {};\n\t\t\t\t\t\twpm.saveCartObjectToDataLayer(data.data[\"cart\"]);\n\t\t\t\t\t\twpm.storeCartData(data.data[\"cart\"]);\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow Error(\"Error getting cart items from backend\");\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\t// Get product IDs from the backend\n\twpm.getProductsFromBackend = async productIds => {\n\n\t\tif (wpmDataLayer?.products) {\n\t\t\t// If productIds already exists as key in wpmDataLayer.products, remove it from the array\n\t\t\tproductIds = productIds.filter(productId => !(productId in wpmDataLayer.products));\n\t\t}\n\n\t\t// If no product IDs are in the object, don't try to get anything from the server\n\t\tif (!productIds || productIds.length === 0) return;\n\n\t\t// if no page_id is set, don't try to get anything from the server\n\t\tif (!wpmDataLayer.general.page_id) return;\n\n\t\t// if productIds is not an array, or it's an empty array, don't try to get anything from the server\n\t\tif (!Array.isArray(productIds) || productIds.length === 0) return;\n\n\t\ttry {\n\n\t\t\tlet data = {\n\t\t\t\taction     : \"pmw_get_product_ids\",  // for the AJAX call\n\t\t\t\tpage_id    : wpmDataLayer.general.page_id,\n\t\t\t\tpage_type  : wpmDataLayer.shop.page_type,\n\t\t\t\tproduct_ids: productIds,\n\t\t\t};\n\n\t\t\tconst isRestEndpointAvailable = await wpm.isRestEndpointAvailable();\n\t\t\tconst url                     = isRestEndpointAvailable ? wpm.root + \"pmw/v1/products/\" : wpm.ajax_url;\n\n\t\t\tconst options = {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\tcache : \"no-cache\",\n\t\t\t\tbody  : isRestEndpointAvailable ? JSON.stringify(data) : new URLSearchParams(data),\n\t\t\t};\n\n\t\t\t// If the REST API is available, set the headers to JSON\n\t\t\tif (isRestEndpointAvailable) {\n\t\t\t\toptions.headers = {\"Content-Type\": \"application/json\"};\n\t\t\t}\n\n\t\t\tlet response = await fetch(url, options);\n\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new Error(\"Error getting products from backend. Status: \" + response.status + \" Status text: \" + response.statusText);\n\t\t\t}\n\n\t\t\tlet responseData = await response.json();\n\n\t\t\tif (!responseData.success) {\n\t\t\t\tthrow new Error(\"Error getting products from backend: \" + responseData.data);\n\t\t\t}\n\n\t\t\twpmDataLayer.products = Object.assign({}, wpmDataLayer.products, responseData.data);\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\n\t\treturn true;\n\t};\n\n\twpm.saveCartObjectToDataLayer = cartObject => {\n\n\t\twpmDataLayer.cart     = cartObject;\n\t\twpmDataLayer.products = Object.assign({}, wpmDataLayer.products, cartObject);\n\t};\n\n\twpm.triggerViewItemEventPrep = async productId => {\n\n\t\tif (!wpmDataLayer?.products[productId]) {\n\t\t\tawait wpm.getProductsFromBackend([productId]);\n\t\t}\n\n\t\tif (!wpmDataLayer?.products[productId]) {\n\t\t\twpm.triggerViewItemEventNoProduct();\n\t\t\tpmw.console.log(`Product with ID ${productId} not found in the data layer and couldn't be retrieved from the backend. Triggering view-item event without product data.`);\n\t\t} else {\n\t\t\twpm.triggerViewItemEvent(productId);\n\t\t}\n\t};\n\n\twpm.triggerViewItemEvent = productId => {\n\n\t\tlet product = wpm.getProductDetailsFormattedForEvent(productId);\n\n\t\tif (!product) return;\n\n\t\tjQuery(document).trigger(\"pmw:view-item\", product);\n\t};\n\n\twpm.triggerViewItemEventNoProduct = () => {\n\t\tjQuery(document).trigger(\"pmw:view-item\");\n\t};\n\n\twpm.fireCheckoutOption = (step, checkout_option = null, value = null) => {\n\n\t\tlet data = {\n\t\t\tstep           : step,\n\t\t\tcheckout_option: checkout_option,\n\t\t\tvalue          : value,\n\t\t};\n\n\t\tjQuery(document).trigger(\"pmw:checkout-option\", data);\n\t};\n\n\twpm.fireCheckoutProgress = step => {\n\n\t\tlet data = {\n\t\t\tstep: step,\n\t\t};\n\n\t\tjQuery(document).trigger(\"pmw:checkout-progress\", data);\n\t};\n\n\twpm.getPostIdFromString = string => {\n\n\t\ttry {\n\t\t\treturn string.match(/(post-)(\\d+)/)[2];\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\twpm.triggerViewItemList = productId => {\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\tproductId = wpm.getIdBasedOndVariationsOutputSetting(productId);\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\tjQuery(document).trigger(\"pmw:view-item-list\", wpm.getProductDataForViewItemEvent(productId));\n\t};\n\n\twpm.getProductDataForViewItemEvent = productId => {\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\ttry {\n\t\t\tif (wpmDataLayer.products[productId]) {\n\n\t\t\t\treturn wpm.getProductDetailsFormattedForEvent(productId);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\twpm.getMainProductIdFromProductPage = () => {\n\n\t\ttry {\n\t\t\tif ([\"simple\", \"variable\", \"grouped\", \"composite\", \"bundle\"].indexOf(wpmDataLayer.shop.product_type) >= 0) {\n\t\t\t\treturn jQuery(\".wpmProductId:first\").data(\"id\");\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\twpm.viewItemListTriggerTestMode = target => {\n\n\t\tjQuery(target).css({\"position\": \"relative\"});\n\t\tjQuery(target).append(\"<div id=\\\"viewItemListTriggerOverlay\\\"></div>\");\n\t\tjQuery(target).find(\"#viewItemListTriggerOverlay\").css({\n\t\t\t\"z-index\"         : \"10\",\n\t\t\t\"display\"         : \"block\",\n\t\t\t\"position\"        : \"absolute\",\n\t\t\t\"height\"          : \"100%\",\n\t\t\t\"top\"             : \"0\",\n\t\t\t\"left\"            : \"0\",\n\t\t\t\"right\"           : \"0\",\n\t\t\t\"opacity\"         : wpmDataLayer.shop.view_item_list_trigger.opacity,\n\t\t\t\"background-color\": wpmDataLayer.shop.view_item_list_trigger.background_color,\n\t\t});\n\t};\n\n\twpm.getSearchTermFromUrl = () => {\n\n\t\ttry {\n\t\t\tlet urlParameters = new URLSearchParams(window.location.search);\n\t\t\treturn urlParameters.get(\"s\");\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\t// we need this to track timeouts for intersection observers\n\tlet ioTimeouts = {};\n\n\twpm.observerCallback = (entries, observer) => {\n\n\t\tentries.forEach((entry) => {\n\n\t\t\ttry {\n\t\t\t\tlet productId;\n\n\t\t\t\tlet elementId = jQuery(entry.target).data(\"ioid\");\n\n\t\t\t\t// Get the productId from next element, if wpmProductId is a sibling, like in Gutenberg blocks\n\t\t\t\t// otherwise go search in children, like in regular WC loop items\n\t\t\t\tif (jQuery(entry.target).next(\".wpmProductId\").length) {\n\t\t\t\t\t// console.log('test 1');\n\t\t\t\t\tproductId = jQuery(entry.target).next(\".wpmProductId\").data(\"id\");\n\t\t\t\t} else {\n\t\t\t\t\tproductId = jQuery(entry.target).find(\".wpmProductId\").data(\"id\");\n\t\t\t\t}\n\n\n\t\t\t\tif (!productId) throw Error(\"wpmProductId element not found\");\n\n\t\t\t\tif (entry.isIntersecting) {\n\n\t\t\t\t\tioTimeouts[elementId] = setTimeout(() => {\n\n\t\t\t\t\t\twpm.triggerViewItemList(productId);\n\t\t\t\t\t\tif (wpmDataLayer.shop.view_item_list_trigger.test_mode) wpm.viewItemListTriggerTestMode(entry.target);\n\t\t\t\t\t\tif (wpmDataLayer.shop.view_item_list_trigger.repeat === false) observer.unobserve(entry.target);\n\t\t\t\t\t}, wpmDataLayer.shop.view_item_list_trigger.timeout);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tclearTimeout(ioTimeouts[elementId]);\n\t\t\t\t\tif (wpmDataLayer.shop.view_item_list_trigger.test_mode) jQuery(entry.target).find(\"#viewItemListTriggerOverlay\").remove();\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t});\n\t};\n\n\t// fire view_item_list only on products that have become visible\n\tlet io;\n\tlet ioid = 0;\n\n\tconst getCommonIdentifiersToWatch = () => {\n\n\t\tlet listOfClassNames = {\n\t\t\tnested: [],\n\t\t\tflat  : [],\n\t\t};\n\n\t\ttry {\n\n\t\t\tconst haveSameNestingDepth = (element1, element2) => {\n\n\t\t\t\t// If both are the same, return the parent\n\t\t\t\treturn jQuery(element1).parents().length === jQuery(element2).parents().length;\n\t\t\t};\n\n\t\t\tconst findCommonParentElement = (element1, element2) => {\n\t\t\t\t// If both are the same, return the parent\n\t\t\t\tif (jQuery(element1).parent().is(jQuery(element2).parent())) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tnode: jQuery(element1).parent(),\n\t\t\t\t\t\ttype: \"flat\",\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tnode: jQuery(element1).parents().has(jQuery(element2).parents()).first(),\n\t\t\t\t\ttype: \"nested\",\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tconst countOfChildren = (element) => {\n\t\t\t\t// Return the count of \"wpmProductId\" elements\n\t\t\t\treturn jQuery(element).find(\".wpmProductId\").length;\n\t\t\t};\n\n\t\t\tconst getCommonClass = (classes1, classes2) => {\n\n\t\t\t\t// console.log(\"classes1\", classes1);\n\t\t\t\t// console.log(\"classes2\", classes2);\n\t\t\t\t// classes 1 and 2 are arrays of classes\n\t\t\t\t// They may contain the same classes, but not in the same order\n\t\t\t\t// Return the first common class that's present in both arrays\n\n\t\t\t\treturn classes1.filter(value => classes2.includes(value))[0] || null;\n\t\t\t};\n\n\t\t\tconst wpmProductIds = document.querySelectorAll(\".wpmProductId\");\n\n\t\t\t// If zero or only one product template is found, then we can't run the algorithm\n\t\t\tif (wpmProductIds.length === 1) {\n\t\t\t\t// console.log(\"No product or too few templates found\")\n\t\t\t\treturn listOfClassNames;\n\t\t\t}\n\n\t\t\t// console.log(\"wpmProductIds\", wpmProductIds);\n\t\t\t// console.log(\"looping\")\n\n\t\t\tfor (let i = 0; i < wpmProductIds.length - 1; i++) {\n\n\t\t\t\t// console.log(\"i\", i)\n\n\t\t\t\tif (!haveSameNestingDepth(wpmProductIds[i], wpmProductIds[i + 1])) {\n\t\t\t\t\t// console.log(\"The nesting depth is not the same\")\n\t\t\t\t\ti++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tlet productsNode = findCommonParentElement(wpmProductIds[i], wpmProductIds[i + 1]);\n\t\t\t\t// console.log(\"productsNode.node\", productsNode.node)\n\t\t\t\t// console.log(\"productsNode.type\", productsNode.type)\n\n\t\t\t\t// If the productsNode is nested, get the first class of the first child. Then console log the class\n\t\t\t\tif (productsNode.type === \"nested\") {\n\n\t\t\t\t\tlet firstChildClassAttr = productsNode.node.children().first().attr(\"class\");\n\t\t\t\t\tlet firstChildClasses   = firstChildClassAttr ? firstChildClassAttr.split(\" \") : [];\n\n\t\t\t\t\tlet secondChildClassAttr = productsNode.node.children().first().next().attr(\"class\");\n\t\t\t\t\tlet secondChildClasses   = secondChildClassAttr ? secondChildClassAttr.split(\" \") : [];\n\n\t\t\t\t\tconst commonClass = getCommonClass(firstChildClasses, secondChildClasses);\n\n\t\t\t\t\tlistOfClassNames.nested.push(commonClass);\n\t\t\t\t} else if (productsNode.type === \"flat\") {\n\n\t\t\t\t\t// If class is not found, continue\n\t\t\t\t\tif (!productsNode.node.children().first().attr(\"class\")) continue;\n\n\t\t\t\t\t// firstProductTemplateClasses is the classes of the first child element of the productsNode\n\t\t\t\t\tlet firstProductTemplateClasses = productsNode.node.children().first().attr(\"class\").split(\" \")[0];\n\n\t\t\t\t\tlistOfClassNames.flat.push(firstProductTemplateClasses);\n\t\t\t\t}\n\n\t\t\t\t// which wpmProductIds is the last one in the productsNode? console log the index of the last wpmProductId in the productsNode\n\t\t\t\t// console.log(\"productsNode.children().length\", countOfChildren(productsNode));\n\n\t\t\t\ti = i + countOfChildren(productsNode.node) - 1;\n\t\t\t}\n\n\t\t\t// Make the list of class names unique\n\t\t\tlistOfClassNames.nested = [...new Set(listOfClassNames.nested)];\n\t\t\tlistOfClassNames.flat   = [...new Set(listOfClassNames.flat)];\n\n\t\t\treturn listOfClassNames;\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t\treturn listOfClassNames;\n\t\t}\n\t};\n\n\n\tlet detectedProductTemplateClasses = {\n\t\tnested: [],\n\t\tflat  : [],\n\t};\n\n\tconst isNestedClass = (elem) => {\n\t\tlet nestedClassNames = [\n\t\t\t\"product\",\n\t\t\t\"type-product\",\n\t\t\t\"product-item-inner\",\n\t\t\t...detectedProductTemplateClasses.nested,\n\t\t];\n\n\t\treturn nestedClassNames.some(className => jQuery(elem).closest(\".\" + className).length);\n\t};\n\n\tconst isFlatClass = (elem) => {\n\n\t\tlet flatClassNames = [\n\t\t\t\"wc-block-grid__product\",\n\t\t\t\"product\",\n\t\t\t\"product-small\",\n\t\t\t\"woocommerce-LoopProduct-link\",\n\t\t\t...detectedProductTemplateClasses.flat,\n\t\t];\n\n\t\treturn flatClassNames.some(className => jQuery(elem).prev().hasClass(className));\n\t};\n\n\tconst getAllElementsToWatch = () => {\n\n\t\tdetectedProductTemplateClasses = getCommonIdentifiersToWatch();\n\n\t\treturn jQuery(\".wpmProductId\")\n\t\t\t.map(function (i, elem) {\n\n\t\t\t\tif (isNestedClass(elem)) {\n\t\t\t\t\treturn jQuery(elem).parent();\n\t\t\t\t} else if (isFlatClass(elem)) {\n\t\t\t\t\treturn jQuery(this).prev();\n\t\t\t\t} else if (jQuery(elem).closest(\".product\").length) {\n\t\t\t\t\treturn jQuery(elem).closest(\".product\");\n\t\t\t\t}\n\t\t\t});\n\t};\n\n\twpm.startIntersectionObserverToWatch = () => {\n\n\t\ttry {\n\t\t\t// enable view_item_list test mode from browser\n\t\t\tif (wpm.urlHasParameter(\"vildemomode\")) wpmDataLayer.shop.view_item_list_trigger.test_mode = true;\n\n\t\t\t// set up intersection observer\n\t\t\t// https://stackoverflow.com/questions/62084306/intersectionobserver-not-working-in-safari-or-ios\n\t\t\tio = new IntersectionObserver(wpm.observerCallback, {\n\t\t\t\troot: null,\n\t\t\t\t// root     : document.body,\n\t\t\t\tthreshold: wpmDataLayer.shop.view_item_list_trigger.threshold,\n\t\t\t});\n\n\t\t\tgetAllElementsToWatch().each((i, elem) => {\n\n\t\t\t\tjQuery(elem[0]).data(\"ioid\", ioid++);\n\n\t\t\t\tio.observe(elem[0]);\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\t// Watch DOM for new lazy loaded products and add them to the intersection observer\n\twpm.startProductsMutationObserverToWatch = () => {\n\n\t\ttry {\n\t\t\t// Pass in the target node, as well as the observer options\n\n\t\t\t// selects the most common parent node\n\t\t\t// https://stackoverflow.com/a/7648323/4688612\n\t\t\tlet productsNode = jQuery(\".wpmProductId:eq(0)\").parents().has(jQuery(\".wpmProductId:eq(1)\").parents()).first();\n\n\t\t\tif (productsNode.length) {\n\t\t\t\tproductsMutationObserver.observe(productsNode[0], {\n\t\t\t\t\tattributes   : true,\n\t\t\t\t\tchildList    : true,\n\t\t\t\t\tcharacterData: true,\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\t// Create an observer instance\n\tconst productsMutationObserver = new MutationObserver(mutations => {\n\n\t\tmutations.forEach(mutation => {\n\t\t\tlet newNodes = mutation.addedNodes; // DOM NodeList\n\t\t\tif (newNodes !== null) { // If there are new nodes added\n\t\t\t\tlet nodes = jQuery(newNodes); // jQuery set\n\t\t\t\tnodes.each((i, node) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\t// jQuery(this).hasClass(\"type-product\") ||\n\t\t\t\t\t\t// jQuery(this).hasClass(\"product-small\") ||\n\t\t\t\t\t\t// jQuery(this).hasClass(\"wc-block-grid__product\")\n\t\t\t\t\t\t// jQuery(this).hasClass(\"type-product\")\n\t\t\t\t\t\tisNestedClass(node) || isFlatClass(node)\n\t\t\t\t\t) {\n\t\t\t\t\t\t// check if the node has a child or sibling wpmProductId\n\t\t\t\t\t\t// if yes add it to the intersectionObserver\n\t\t\t\t\t\tif (hasWpmProductIdElement(node)) {\n\t\t\t\t\t\t\tjQuery(node).data(\"ioid\", ioid++);\n\t\t\t\t\t\t\tio.observe(node);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t});\n\n\tlet hasWpmProductIdElement = elem =>\n\t\t!!(jQuery(elem).find(\".wpmProductId\").length ||\n\t\t\tjQuery(elem).siblings(\".wpmProductId\").length);\n\n\t/**\n\t * Sets a new cookie or updates an existing one with the provided name and value.\n\t *\n\t * @function setCookie\n\t * @global\n\t * @param {string} cookieName - The name of the cookie.\n\t * @param {string} [cookieValue=\"\"] - The value to set for the cookie. Default value is an empty string.\n\t * @param {number|null} [expiryDays=null] - The number of days until the cookie expires. If not provided, the cookie will last until the end of the session.\n\t * @returns {void}\n\t *\n\t * @example\n\t * // This will create a cookie \"username\" with the value \"JohnDoe\" that expires in 7 days\n\t * wpm.setCookie(\"username\", \"JohnDoe\", 7);\n\t */\n\twpm.setCookie = (cookieName, cookieValue = \"\", expiryDays = null) => {\n\n\t\tif (expiryDays) {\n\n\t\t\tlet d = new Date();\n\t\t\td.setTime(d.getTime() + (expiryDays * 24 * 60 * 60 * 1000));\n\t\t\tlet expires     = \"expires=\" + d.toUTCString();\n\t\t\tdocument.cookie = cookieName + \"=\" + cookieValue + \";\" + expires + \";path=/\";\n\t\t} else {\n\t\t\tdocument.cookie = cookieName + \"=\" + cookieValue + \";path=/\";\n\t\t}\n\t};\n\n\t/**\n\t * Retrieves the value of a specific cookie from the document's cookie string.\n\t *\n\t * @param {String} cookieName - The name of the cookie to retrieve.\n\t * @returns {String} - The value of the cookie if found, an empty string otherwise.\n\t *\n\t * @example\n\t * // returns 'value' if 'cookieName=value' exists in document.cookie\n\t * wpm.getCookie('cookieName')\n\t */\n\twpm.getCookie = cookieName => {\n\n\t\tlet name          = cookieName + \"=\";\n\t\tlet decodedCookie = decodeURIComponent(document.cookie);\n\t\tlet ca            = decodedCookie.split(\";\");\n\n\t\tfor (let i = 0; i < ca.length; i++) {\n\n\t\t\tlet c = ca[i];\n\n\t\t\twhile (c.charAt(0) == \" \") {\n\t\t\t\tc = c.substring(1);\n\t\t\t}\n\n\t\t\tif (c.indexOf(name) == 0) {\n\t\t\t\treturn c.substring(name.length, c.length);\n\t\t\t}\n\t\t}\n\n\t\treturn \"\";\n\t};\n\n\t/**\n\t * Find and get the cookie with a name that contains the string.\n\t * If one is found, then return the cookie.\n\t * If none is found, then return false.\n\t *\n\t * @param string\n\t * @returns {boolean|string}\n\t *\n\t * @since 1.32.5\n\t */\n\twpm.getCookieThatContainsRegex = (regex) => {\n\n\t\tlet cookies = document.cookie.split(\";\");\n\n\t\tfor (let i = 0; i < cookies.length; i++) {\n\t\t\tlet cookie = cookies[i].trim();\n\n\t\t\tif (regex.test(cookie)) {\n\t\t\t\treturn cookie;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t};\n\n\twpm.deleteCookie = cookieName => {\n\t\twpm.setCookie(cookieName, \"\", -1);\n\t};\n\n\t/**\n\t * Store data in the browser\n\t *\n\t * Try to store the data in the local storage (session or persistent) if available.\n\t * If not available, store the data in the cookie.\n\t *\n\t * Max cookie expiry is 400 days as specified by Google Chrome: https://developer.chrome.com/blog/cookie-max-age-expires/\n\t *\n\t * @param key\n\t * @param value\n\t * @param persistent\n\t * @param extension - If true, this will be saved in a separate key\n\t */\n\twpm.storeData = (key, value, persistent = false, extension = false) => {\n\n\t\tconst suffix = extension ? key : \"\";\n\n\t\tlet dataGetter = persistent ? wpm.getPersistentData : wpm.getSessionData;\n\t\tlet dataSetter = persistent ? wpm.setPersistentData : wpm.setSessionData;\n\n\t\tlet data = dataGetter(suffix);\n\t\textension ? data = value : data[key] = value;\n\n\t\tdataSetter(data, suffix);\n\t};\n\n\twpm.retrieveData = (key, persistent = false, extension = false) => {\n\n\t\tconst suffix = extension ? key : \"\";\n\n\t\tlet data = persistent ? wpm.getPersistentData(suffix) : wpm.getSessionData(suffix);\n\n\t\treturn extension ? data : data[key];\n\t};\n\n\twpm.deleteDataKey = (key, persistent = false, extension = false) => {\n\n\t\tconst suffix = extension ? key : \"\";\n\n\t\tlet dataGetter = persistent ? wpm.getPersistentData : wpm.getSessionData;\n\t\tlet dataSetter = persistent ? wpm.setPersistentData : wpm.setSessionData;\n\n\t\tlet data = dataGetter(suffix);\n\t\t// extension ? delete data : delete data[key]\n\n\t\tif (extension) {\n\n\t\t\ttry {\n\t\t\t\tif (persistent && window.localStorage) window.localStorage.removeItem(wpm.getPersistentDataKey(suffix));\n\t\t\t\tif (!persistent && window.sessionStorage) window.sessionStorage.removeItem(wpm.getSessionDataKey(suffix));\n\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tdelete data[key];\n\n\t\tdataSetter(data, suffix);\n\t};\n\n\twpm.storeCartData = data => {\n\t\twpm.storeData(\"cart\", data, false, true);\n\t};\n\n\twpm.retrieveCartData = () => {\n\t\treturn wpm.retrieveData(\"cart\", false, true);\n\t};\n\n\twpm.getSessionDataKey = (suffix = \"\") => {\n\t\tconst defaultStorageKey = \"_pmw_session_data\";\n\n\t\tif (suffix) {\n\t\t\treturn defaultStorageKey + \"_\" + suffix;\n\t\t}\n\n\t\treturn defaultStorageKey;\n\t};\n\n\twpm.getPersistentDataKey = (storageKeySuffix) => {\n\n\t\tconst defaultStorageKey = \"_pmw_persistent_data\";\n\n\t\tif (storageKeySuffix) {\n\t\t\treturn defaultStorageKey + \"_\" + storageKeySuffix;\n\t\t}\n\n\t\treturn defaultStorageKey;\n\t};\n\n\twpm.getSessionData = (suffix = \"\") => {\n\n\t\tif (window.sessionStorage) {\n\n\t\t\tlet data = window.sessionStorage.getItem(wpm.getSessionDataKey(suffix));\n\n\t\t\treturn data !== null ? JSON.parse(data) : {};\n\t\t} else {\n\t\t\t// fallback to cookie\n\t\t\tlet data = wpm.getCookie(wpm.getSessionDataKey(suffix));\n\n\t\t\treturn data !== \"\" ? JSON.parse(data) : {};\n\t\t}\n\t};\n\n\twpm.setSessionData = (data, storageKeySuffix = \"\") => {\n\t\tif (window.sessionStorage) {\n\t\t\twindow.sessionStorage.setItem(wpm.getSessionDataKey(storageKeySuffix), JSON.stringify(data));\n\t\t} else {\n\t\t\t// fallback to cookie\n\t\t\twpm.setCookie(wpm.getSessionDataKey(storageKeySuffix), JSON.stringify(data));\n\t\t}\n\t};\n\n\twpm.getPersistentData = (storageKeySuffix) => {\n\n\t\tif (window.localStorage) {\n\n\t\t\tlet data = window.localStorage.getItem(wpm.getPersistentDataKey(storageKeySuffix));\n\n\t\t\treturn data !== null ? JSON.parse(data) : {};\n\t\t} else {\n\t\t\t// fallback to cookie\n\t\t\tlet data = wpm.getCookie(wpm.getPersistentDataKey(storageKeySuffix));\n\n\t\t\treturn data !== \"\" ? JSON.parse(data) : {};\n\t\t}\n\t};\n\n\twpm.setPersistentData = (data, storageKeySuffix = \"\") => {\n\n\t\tif (window.localStorage) {\n\t\t\twindow.localStorage.setItem(wpm.getPersistentDataKey(storageKeySuffix), JSON.stringify(data));\n\t\t} else {\n\t\t\t// fallback to cookie\n\t\t\twpm.setCookie(wpm.getPersistentDataKey(storageKeySuffix), JSON.stringify(data), 400);\n\t\t}\n\t};\n\n\twpm.storeOrderIdOnServer = async (orderDetails) => {\n\n\t\ttry {\n\n\t\t\tlet response;\n\n\t\t\tif (await wpm.isRestEndpointAvailable()) {\n\n\t\t\t\tresponse = await fetch(wpm.root + \"pmw/v1/pixels-fired/\", {\n\t\t\t\t\tmethod   : \"POST\",\n\t\t\t\t\theaders  : {\n\t\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t\t// \"X-WP-Nonce\"  : wpm.nonce_wp_rest,\n\t\t\t\t\t},\n\t\t\t\t\tbody     : JSON.stringify({\n\t\t\t\t\t\torder_id : orderDetails.orderId,\n\t\t\t\t\t\torder_key: orderDetails.orderKey,\n\t\t\t\t\t\tsource   : orderDetails.source,\n\t\t\t\t\t\t// nonce   : wpm.pmw_nonce,\n\t\t\t\t\t}),\n\t\t\t\t\tkeepalive: true,\n\t\t\t\t\tcache    : \"no-cache\",\n\t\t\t\t\tredirect : \"error\",\n\t\t\t\t});\n\n\t\t\t} else {\n\n\t\t\t\tpmw.console.log(\"REST API not available, falling back to AJAX\");\n\n\t\t\t\t// save the state in the database\n\n\t\t\t\t// Send the data object with ajax request\n\t\t\t\t// and log success or error using fetch API and url encoded\n\t\t\t\tresponse = await fetch(wpm.ajax_url, {\n\t\t\t\t\tmethod   : \"POST\",\n\t\t\t\t\tbody     : new URLSearchParams({\n\t\t\t\t\t\taction   : \"pmw_purchase_pixels_fired\",\n\t\t\t\t\t\torder_id : orderDetails.orderId,\n\t\t\t\t\t\torder_key: orderDetails.orderKey,\n\t\t\t\t\t\tsource   : orderDetails.source,\n\t\t\t\t\t\t// nonce_ajax: wpm.nonce_ajax,\n\t\t\t\t\t}),\n\t\t\t\t\tkeepalive: true,\n\t\t\t\t\tredirect : \"error\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst responseJson = await response.json();\n\n\t\t\tif (responseJson.success) {\n\t\t\t\tpmw.console.log(\"\", responseJson.data);\n\t\t\t} else {\n\t\t\t\tpmw.console.error(\"\", responseJson.data);\n\t\t\t}\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\twpm.getProductIdByCartItemElement = element => {\n\n\t\tconst href = jQuery(element).find(\".product-remove\").find(\"a\").attr(\"href\");\n\t\tif (href) return wpm.getProductIdByCartItemKeyUrl(new URL(href));\n\n\t\tconst productId = jQuery(element).find(\"[data-product_id]\").first().attr(\"data-product_id\");\n\t\treturn productId ? productId : null;\n\t};\n\n\twpm.getProductQuantityByCartItemElement = element => {\n\n\t\treturn jQuery(element).find(\".qty\").val() || null;\n\t};\n\n\twpm.getProductIdByCartItemKeyUrl = url => {\n\n\t\tlet searchParams = new URLSearchParams(url.search);\n\t\tlet cartItemKey  = searchParams.get(\"remove_item\");\n\n\t\tlet productId;\n\n\t\tif (wpmDataLayer.cart_item_keys[cartItemKey][\"variation_id\"] === 0) {\n\t\t\tproductId = wpmDataLayer.cart_item_keys[cartItemKey][\"product_id\"];\n\t\t} else {\n\t\t\tproductId = wpmDataLayer.cart_item_keys[cartItemKey][\"variation_id\"];\n\t\t}\n\n\t\treturn productId;\n\t};\n\n\twpm.getAddToCartLinkProductIds = () =>\n\t\tjQuery(\"a\").map(function () {\n\t\t\tlet href = jQuery(this).attr(\"href\");\n\n\t\t\tif (href && href.includes(\"?add-to-cart=\")) {\n\t\t\t\tlet matches = href.match(/(add-to-cart=)(\\d+)/);\n\t\t\t\tif (matches) return matches[2];\n\t\t\t}\n\t\t}).get();\n\n\twpm.getProductDetailsFormattedForEvent = (productId, quantity = 1) => {\n\n\t\t// If wpmDataLayer.products[productId] doesn't exist, return an empty object\n\t\tif (!wpmDataLayer.products[productId]) return null;\n\n\t\tlet product = {\n\t\t\tid           : productId.toString(),\n\t\t\tdyn_r_ids    : wpmDataLayer.products[productId].dyn_r_ids,\n\t\t\tname         : wpmDataLayer.products[productId].name,\n\t\t\tlist_name    : wpmDataLayer.shop.list_name,\n\t\t\tbrand        : wpmDataLayer.products[productId].brand,\n\t\t\tcategory     : wpmDataLayer.products[productId].category,\n\t\t\tvariant      : wpmDataLayer.products[productId].variant,\n\t\t\tlist_position: wpmDataLayer.products[productId].position,\n\t\t\tquantity     : quantity,\n\t\t\tprice        : wpmDataLayer.products[productId].price,\n\t\t\tcurrency     : wpmDataLayer.shop.currency,\n\t\t\tis_variable  : wpmDataLayer.products[productId].is_variable,\n\t\t\tis_variation : wpmDataLayer.products[productId].is_variation,\n\t\t\tparent_id    : wpmDataLayer.products[productId].parent_id,\n\t\t};\n\n\t\tif (product.is_variation) product[\"parent_id_dyn_r_ids\"] = wpmDataLayer.products[productId].parent_id_dyn_r_ids;\n\n\t\treturn product;\n\t};\n\n\twpm.getClidFromBrowser = (clidId = \"gclid\") => {\n\n\t\tlet clidCookieId;\n\n\t\tclidCookieId = {\n\t\t\tgclid: \"_gcl_aw\",\n\t\t\tdclid: \"_gcl_dc\",\n\t\t};\n\n\t\tif (wpm.getCookie(clidCookieId[clidId])) {\n\n\t\t\tlet clidCookie = wpm.getCookie(clidCookieId[clidId]);\n\t\t\tlet matches    = clidCookie.match(/(GCL.[\\d]*.)(.*)/);\n\t\t\treturn matches[2];\n\t\t} else {\n\t\t\treturn \"\";\n\t\t}\n\t};\n\n\twpm.getUserAgent = () => navigator.userAgent;\n\n\twpm.getViewPort = () => ({\n\t\twidth : Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0),\n\t\theight: Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0),\n\t});\n\n\n\twpm.consoleLogVersion = () => {\n\t\tconsole.log(wpmDataLayer.version);\n\t};\n\n\t/**\n\t * https://api.jquery.com/jquery.getscript/\n\t *\n\t * Switched back to jQuery.ajax as the fetch method on some sites returned a type error\n\t * Possible reasons are:\n\t *    * CORS mismatch\n\t *    * The user is using an ad blocker\n\t *\n\t * This code is .thenable\n\t */\n\n\twpm.loadScriptAndCacheIt = (url, fallbackUrl) => {\n\n\t\tlet options = {\n\t\t\tdataType: \"script\",\n\t\t\tcache   : true,\n\t\t\turl     : url,\n\t\t};\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tjQuery.ajax(options)\n\t\t\t\t.done(() => {\n\t\t\t\t\tpmw.console.log(\"Successfully loaded primary script: \" + url);\n\t\t\t\t\tresolve();\n\t\t\t\t})\n\t\t\t\t.fail(() => {\n\t\t\t\t\tif (fallbackUrl) {\n\n\t\t\t\t\t\tpmw.console.log(\"Loading fallback script: \" + fallbackUrl);\n\n\t\t\t\t\t\tlet fallbackOptions = {\n\t\t\t\t\t\t\tdataType: \"script\",\n\t\t\t\t\t\t\tcache   : true,\n\t\t\t\t\t\t\turl     : fallbackUrl,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tjQuery.ajax(fallbackOptions)\n\t\t\t\t\t\t\t.done(() => {\n\t\t\t\t\t\t\t\tpmw.console.log(\"Successfully loaded fallback script: \" + fallbackUrl);\n\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.fail(() => reject(new Error(\"Both primary and fallback scripts failed to load.\")));\n\t\t\t\t\t} else {\n\t\t\t\t\t\treject(new Error(\"Primary script failed to load, and no fallback URL provided.\"));\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t});\n\t};\n\n\twpm.getOrderItemPrice = orderItem => (orderItem.total + orderItem.total_tax) / orderItem.quantity;\n\n\twpm.hasLoginEventFired = () => {\n\t\tlet data = wpm.getSessionData();\n\t\treturn data?.loginEventFired;\n\t};\n\n\twpm.setLoginEventFired = () => {\n\t\tlet data                = wpm.getSessionData();\n\t\tdata[\"loginEventFired\"] = true;\n\t\twpm.setSessionData(data);\n\t};\n\n\twpm.pageLoaded = async () => new Promise(resolve => {\n\t\t(function waitForVar() {\n\t\t\tif (\"complete\" === document.readyState) return resolve();\n\t\t\tsetTimeout(waitForVar, 50);\n\t\t})();\n\t});\n\n\twpm.pageReady = () => {\n\t\treturn new Promise(resolve => {\n\t\t\t(function waitForVar() {\n\t\t\t\tif (\"interactive\" === document.readyState || \"complete\" === document.readyState) return resolve();\n\t\t\t\tsetTimeout(waitForVar, 50);\n\t\t\t})();\n\t\t});\n\t};\n\n\twpm.isMiniCartActive = () => {\n\t\tif (window.sessionStorage) {\n\t\t\tObject.keys(window.sessionStorage).forEach(key => {\n\t\t\t\tif (key.includes(\"wc_fragments\")) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn false;\n\t};\n\n\twpm.doesWooCommerceCartExist = () => document.cookie.includes(\"woocommerce_items_in_cart\");\n\n\twpm.urlHasParameter = parameter => {\n\t\tlet urlParams = new URLSearchParams(window.location.search);\n\t\treturn urlParams.has(parameter);\n\t};\n\n\twpm.getUrlParameter = parameter => {\n\t\tlet urlParams = new URLSearchParams(window.location.search);\n\t\treturn urlParams.get(parameter);\n\t};\n\n\t// https://stackoverflow.com/a/60606893/4688612\n\twpm.hashAsync = (algo, str) => {\n\t\treturn crypto.subtle.digest(algo, new TextEncoder(\"utf-8\").encode(str)).then(buf => {\n\t\t\treturn Array.prototype.map.call(new Uint8Array(buf), x => ((\"00\" + x.toString(16)).slice(-2))).join(\"\");\n\t\t});\n\t};\n\n\twpm.getCartValue = () => {\n\n\t\tlet value = 0;\n\n\t\tif (wpmDataLayer?.cart) {\n\n\t\t\tfor (const key in wpmDataLayer.cart) {\n\t\t\t\t// content_ids.push(wpmDataLayer.products[key].dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type])\n\n\t\t\t\tlet product = wpmDataLayer.cart[key];\n\n\t\t\t\tvalue += product.quantity * product.price;\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t};\n\n\t/**\n\t * Detect if the current URL contains at least one pattern\n\t *\n\t * @param patterns\n\t * @returns {boolean}\n\t */\n\twpm.doesUrlContainPatterns = patterns => {\n\n\t\tfor (const pattern of patterns) {\n\t\t\tif (new RegExp(pattern).test(window.location.href)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t};\n\n\t/**\n\t * Detect if the current URL contains at least one pattern that is on the tracking exclusion list\n\t *\n\t * https://www.linkedin.com/pulse/how-remove-google-robot-problem-via-gtm-facebook-pixel-hjelpdahl/\n\t * https://www.youtube.com/watch?v=b4I1ePZt8Z0\n\t *\n\t * @returns {boolean}\n\t */\n\twpm.excludeDomainFromTracking = () => {\n\n\t\tlet exclude_domains = [\n\t\t\t\"appspot.com\",\n\t\t\t\"translate.google.com\",\n\t\t];\n\n\t\tif (wpmDataLayer?.general?.exclude_domains) {\n\t\t\texclude_domains = [...exclude_domains, ...wpmDataLayer.general.exclude_domains];\n\t\t}\n\n\t\t// Abort if URL contains excluded domains\n\t\tif (exclude_domains.some(domain => window.location.href.includes(domain))) {\n\t\t\tconsole.debug(\"Pixel Manager: Aborted due to excluded domain\");\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t};\n\n\t/**\n\t * Get a random event ID\n\t *\n\t * @param length\n\t * @return {string}\n\t */\n\twpm.getRandomEventId = (length = 16) => {\n\t\tlet id = \"\";\n\t\twhile (id.length < length) {\n\t\t\tid += (Math.random() + 1).toString(36).substring(2);\n\t\t}\n\t\treturn id.substring(0, length);\n\t};\n\n\twpm.pmwConsoleMessage = () => {\n\t\tlet message = \"Pixel Manager for WooCommerce: \";\n\t\tmessage += wpmDataLayer.version.pro ? \"pro\" : \"free\";\n\t\tmessage += \" | distro: \" + wpmDataLayer.version.distro;\n\t\tif (wpmDataLayer.version.distro === \"fms\" && wpmDataLayer.version.pro) {\n\t\t\tmessage += \" | active license: \" + (wpmDataLayer.version.eligible_for_updates ? \"yes\" : \"no\");\n\t\t}\n\t\tmessage += \" | version: \" + wpmDataLayer.version.number;\n\n\t\tif (wpmDataLayer.version.show === true) {\n\t\t\tconsole.log(message);\n\t\t} else {\n\t\t\tpmw.console.log(message);\n\t\t}\n\t};\n\n\twpm.canLoadPremiumFeatures = () => {\n\t\treturn (wpmDataLayer.version.distro === \"fms\" && wpmDataLayer.version.pro && wpmDataLayer.version.eligible_for_updates) || wpmDataLayer.version.distro === \"wcm\";\n\t};\n\n\t/**\n\t * State if the pmw:dom:ready event has been fired\n\t *\n\t * @type {boolean}\n\t */\n\tlet pmwDomReadyFired = false;\n\n\n\t/**\n\t * Trigger the pmw:dom:ready event\n\t *\n\t * @returns {void}\n\t */\n\twpm.triggerPmwDomReadyEvent = () => {\n\n\t\t// If the event has already been fired, return\n\t\tif (pmwDomReadyFired) return;\n\n\t\t// If the document is already loaded, fire the event\n\t\tif (document.readyState === \"complete\") {\n\t\t\tfirePmwDomReadyEvent();\n\t\t\treturn;\n\t\t}\n\n\t\t// Continue processing if the DOM has not yet been loaded\n\t\t// and attach the event listener to the DOMContentLoaded,\n\t\t// once through jQuery and once through the native DOM API\n\t\t// to maximize compatibility\n\n\t\t// If jQuery is available, use it to fire add the event listener\n\t\tjQuery(() => {\n\t\t\tfirePmwDomReadyEvent();\n\t\t});\n\n\t\t// Also add the event listener using the native DOM API\n\t\tdocument.addEventListener(\"DOMContentLoaded\", () => {\n\t\t\tfirePmwDomReadyEvent();\n\t\t}, true);\n\t};\n\n\t/**\n\t * Fire the pmw:dom:ready event\n\t *\n\t * @returns {void}\n\t */\n\tconst firePmwDomReadyEvent = () => {\n\n\t\t// If the event has already been fired, return\n\t\tif (pmwDomReadyFired) return;\n\n\t\t// Fire the event\n\t\tdocument.dispatchEvent(new Event(\"pmw:dom:ready\"));\n\n\t\t// Set the flag to true to indicate that the event has been fired\n\t\tpmwDomReadyFired = true;\n\t};\n\n\twpm.getEmailFromTarget = target => {\n\n\t\t// Only try to add the clicked email if href is set\n\t\tif (target.href) {\n\n\t\t\t// Get the email from the link\n\t\t\t// But only if there is a valid email address in the link\n\t\t\t// Also, the href may contain other parameters, so we need to check for that and remove them\n\t\t\tlet email = target.href.replace(\"mailto:\", \"\");\n\n\n\t\t\tif (email.indexOf(\"?\") > -1) {\n\t\t\t\temail = email.split(\"?\")[0];\n\t\t\t}\n\n\t\t\t// Trim the email and remove all whitespaces\n\t\t\temail = email.replace(/\\s/g, \"\");\n\n\t\t\t// If the email is not empty and valid, add it to the data object\n\t\t\tif (email && wpm.isEmail(email)) {\n\t\t\t\treturn email;\n\t\t\t}\n\t\t}\n\n\t\treturn \"\";\n\t};\n\n\twpm.sendEventPayloadToServer = payload => {\n\t\tif (typeof wpm.sendEventPayloadToServerPremium === \"function\") {\n\t\t\twpm.sendEventPayloadToServerPremium(payload);\n\t\t}\n\t};\n\n\t/**\n\t * Waits for all active pixels to load and then triggers the page view event.\n\t *\n\t * @return {Promise<unknown>}\n\t *\n\t * @since 1.49.0\n\t */\n\twpm.waitForPixelsAndTriggerPageView = async () => {\n\n\t\treturn new Promise(resolve => {\n\n\t\t\t// Check if at least one pixel is active in the data layer\n\t\t\tif (!wpmDataLayer?.pixels) {\n\t\t\t\tpmw.console.error(\"wpmDataLayer or wpmDataLayer.pixels is not defined, triggering page view event immediately.\");\n\t\t\t\tdocument.dispatchEvent(new Event(\"pmw:page-view\"));\n\t\t\t\tresolve();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet activePixels = wpmDataLayer?.general?.server_2_server?.pageview_event_s2s?.pixels || [];\n\n\t\t\t// This line filters the activePixels array, keeping only those pixel names that exist as keys\n\t\t\t// in the wpmDataLayer.pixels object (i.e., only pixels that are currently defined/active in the data layer)\n\t\t\tactivePixels = activePixels.filter(pixelName => wpmDataLayer.pixels[pixelName]);\n\n\t\t\t// If no pixels to check, trigger event immediately\n\t\t\tif (activePixels.length === 0) {\n\t\t\t\tpmw.console.log(\"No specific pixels to wait for, triggering page view event.\");\n\t\t\t\tdocument.dispatchEvent(new Event(\"pmw:page-view\"));\n\t\t\t\tresolve();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Check if all active pixels are loaded\n\t\t\tconst checkPixelsLoaded = () => {\n\t\t\t\tconst allLoaded = activePixels.every(pixelName =>\n\t\t\t\t\t!wpmDataLayer.pixels[pixelName] || wpmDataLayer.pixels[pixelName].loaded);\n\n\t\t\t\tif (allLoaded) {\n\t\t\t\t\t// pmw.console.log(\"All specified pixels to track s2s page-view events have been loaded. Triggering page-view event.\");\n\t\t\t\t\tdocument.dispatchEvent(new Event(\"pmw:page-view\"));\n\t\t\t\t\tresolve();\n\t\t\t\t} else {\n\t\t\t\t\tsetTimeout(checkPixelsLoaded, 100);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tcheckPixelsLoaded();\n\t\t});\n\t};\n\n\twpm.isWooCommerceActive = () => {\n\t\treturn !!wpmDataLayer.shop;\n\t};\n\n\t/**\n\t * Retrieves the product ID associated with a specific pixel.\n\t *\n\t * @param {string} pixelId - The ID of the pixel to get the product ID for.\n\t * @returns {string|null} - The product ID associated with the given pixel ID,\n\t *                          or null if no product ID is found.\n\t */\n\twpm.getProductIdForSpecificPixel = (product, pixelName) => {\n\t\treturn String(product.dyn_r_ids[wpmDataLayer.pixels[pixelName].dynamic_remarketing.id_type]);\n\t};\n\n\twpm.isInWooCommerceSesssion = () => {\n\n\t\tif (wpmDataLayer?.shop?.session_active) return true;\n\n\t\tlet regex           = new RegExp(\"woocommerce_cart_hash\");\n\t\tlet wcSessionCookie = wpm.getCookieThatContainsRegex(regex);\n\n\t\tif (wcSessionCookie) return true;\n\n\t\treturn false;\n\t};\n\n\twpm.isNotInWooCommerceSesssion = () => {\n\t\treturn !wpm.isInWooCommerceSesssion();\n\t};\n\n\twpm.makeFullUrl = url => {\n\n\t\t// Trim any leading or trailing whitespace\n\t\turl = url.trim();\n\n\t\t// Check if the URL already contains a protocol\n\t\tif (/^(http:\\/\\/|https:\\/\\/)/.test(url)) {\n\t\t\treturn url;\n\t\t}\n\n\t\t// Remove leading slashes\n\t\turl = url.replace(/^\\/+/, \"\");\n\n\t\t// Add 'https://' as default protocol\n\t\treturn \"https://\" + url;\n\t};\n\n\twpm.registerShowVariationEventListener = () => {\n\t\tlet previousVariationId = null;\n\n\t\tjQuery(\".single_variation_wrap\").on(\"show_variation\", (event, variation) => {\n\n\t\t\t// Abort if lazy loading is enabled\n\t\t\t// if (wpmDataLayer?.general?.lazy_load_pmw) return;\n\n\t\t\ttry {\n\n\t\t\t\tlet productId = wpm.getIdBasedOndVariationsOutputSetting(variation.variation_id);\n\n\t\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\t\t\t// If the variation id is not the same as the previous one, run the function\n\t\t\t\tif (previousVariationId !== variation.variation_id) {\n\t\t\t\t\twpm.triggerViewItemEventPrep(productId);\n\t\t\t\t\tpreviousVariationId = variation.variation_id;\n\t\t\t\t}\n\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t});\n\t};\n\n\t/**\n\t * Initializes the command queue for the application to ensure that commands\n\t * are queued and executed in a controlled manner. This function sets up\n\t * the underlying mechanism to manage and process commands effectively.\n\t *\n\t * Typically, the command queue is used by external developers\n\t * who want to make sure that their Pixel Manager API calls safely get executed,\n\t * no matter if the initialization order of the Pixel Manager is shuffled,\n\t * delayed, or lazy loaded.\n\t *\n\t * @since 1.49.0\n\t */\n\twpm.initializeCommandQueue = () => {\n\n\t\tconst queue = window._pmwq = window._pmwq || [];\n\n\t\tqueue.forEach(function (fn) {\n\t\t\tif (typeof fn === \"function\") {\n\t\t\t\ttry {\n\t\t\t\t\tfn();\n\t\t\t\t} catch (e) {\n\t\t\t\t\tpmw.console.error('Error executing queued command:', e);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// Override push to execute commands immediately now that PMW is ready\n\t\tqueue.push = function (fn) {\n\t\t\tif (typeof fn === \"function\") {\n\t\t\t\ttry {\n\t\t\t\t\tfn();\n\t\t\t\t} catch (e) {\n\t\t\t\t\tpmw.console.error('Error executing command from queue:', e);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t};\n\n}(window.wpm = window.wpm || {}, jQuery));\n","/**\n * Event Processor\n * \n * Unified event processing system that orchestrates:\n * - Building standardized event payloads\n * - Applying filters at multiple stages\n * - Adapting data for each active pixel\n * - Dispatching to browser pixels and S2S endpoints\n * \n * @since 1.51.0\n */\n\n(function (wpm, $, undefined) {\n\n\t/**\n\t * Global event context that's added to all events\n\t * \n\t * @returns {object} Context object with user, session, and page data\n\t */\n\twpm.getEventContext = function() {\n\t\treturn {\n\t\t\ttimestamp: Math.floor(Date.now() / 1000),\n\t\t\turl: window.location.href,\n\t\t\treferrer: wpm.retrieveData('referrer') ? wpm.makeFullUrl(wpm.retrieveData('referrer')) : document.referrer,\n\t\t\tuser_agent: navigator.userAgent,\n\t\t\tpage_type: wpmDataLayer?.shop?.page_type,\n\t\t\tuser_id: wpmDataLayer?.user?.id?.raw || null,\n\t\t\t// Additional context can be added here\n\t\t};\n\t};\n\n\t/**\n\t * Process an event through the unified pipeline\n\t * \n\t * This is the main entry point for processing events with the new filter system.\n\t * \n\t * @param {string} eventName - Standardized event name (e.g., 'add_to_cart', 'view_item')\n\t * @param {object} eventData - Core event data (product, cart, order, etc.)\n\t * @returns {Promise<object>} The processed payload\n\t */\n\twpm.processEvent = async function(eventName, eventData) {\n\t\t\n\t\tpmw.console.log(`Processing event: ${eventName}`, eventData);\n\t\t\n\t\ttry {\n\t\t\t// 1. Create base payload with standardized structure\n\t\t\tlet payload = {\n\t\t\t\tevent: eventName,\n\t\t\t\tevent_data: eventData,\n\t\t\t\tpixels: {},\n\t\t\t\tcontext: wpm.getEventContext()\n\t\t\t};\n\t\t\t\n\t\t\t// 2. Apply pre-processing filter\n\t\t\t// Use case: Add global tracking params, modify core data before pixel adaptations\n\t\t\tpayload = pmw.hooks.applyFilters('pmw_event_payload_pre', payload, eventName);\n\t\t\t\n\t\t\t// 3. Transform for each active pixel\n\t\t\tconst activePixels = wpm.pixelRegistry.getActivePixels();\n\t\t\t\n\t\t\tfor (const pixelName of activePixels) {\n\t\t\t\tconst adapter = wpm.pixelRegistry.getAdapter(pixelName);\n\t\t\t\t\n\t\t\t\tif (!adapter || typeof adapter.adapt !== 'function') {\n\t\t\t\t\tpmw.console.log(`No adapter found for pixel: ${pixelName}`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\ttry {\n\t\t\t\t\t// Adapt event data to pixel-specific format\n\t\t\t\t\tlet pixelData = adapter.adapt(payload.event_data, eventName, payload.context);\n\t\t\t\t\t\n\t\t\t\t\tif (!pixelData) {\n\t\t\t\t\t\t// Some pixels (like Hotjar, VWO) don't track events, only load tracking scripts\n\t\t\t\t\t\t// So null is expected and not an error - skip silently\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// Apply pixel-specific filter\n\t\t\t\t\t// Use case: Modify Facebook-specific data, add custom parameters per pixel\n\t\t\t\t\tpixelData = pmw.hooks.applyFilters(\n\t\t\t\t\t\t`pmw_pixel_data_${pixelName}`,\n\t\t\t\t\t\tpixelData,\n\t\t\t\t\t\teventName,\n\t\t\t\t\t\tpayload.event_data,\n\t\t\t\t\t\tpayload.context\n\t\t\t\t\t);\n\t\t\t\t\t\n\t\t\t\t\tpayload.pixels[pixelName] = pixelData;\n\t\t\t\t\t\n\t\t\t\t} catch (e) {\n\t\t\t\t\tpmw.console.error(`Error adapting data for ${pixelName}:`, e);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t// 4. Apply event-specific filter\n\t\t\t// Use case: Modify all pixels for a specific event type (e.g., all add_to_cart events)\n\t\t\tpayload = pmw.hooks.applyFilters(\n\t\t\t\t`pmw_event_payload_${eventName}`,\n\t\t\t\tpayload,\n\t\t\t\tpayload.event_data\n\t\t\t);\n\t\t\t\n\t\t\t// 5. Apply post-processing filter\n\t\t\t// Use case: Final validation, logging, debugging, cross-pixel modifications\n\t\t\tpayload = pmw.hooks.applyFilters('pmw_event_payload_post', payload, eventName);\n\t\t\t\n\t\t\t// 6. Dispatch to pixels\n\t\t\tawait wpm.dispatchToPixels(payload);\n\t\t\t\n\t\t\treturn payload;\n\t\t\t\n\t\t} catch (e) {\n\t\t\tpmw.console.error(`Error processing event ${eventName}:`, e);\n\t\t\tthrow e;\n\t\t}\n\t};\n\n\t/**\n\t * Dispatch the processed payload to pixels\n\t * \n\t * This handles both S2S-capable pixels (which need server requests)\n\t * and browser-only pixels (which are handled by their event listeners)\n\t * \n\t * @param {object} payload - The fully processed event payload\n\t * @returns {Promise<void>}\n\t */\n\twpm.dispatchToPixels = async function(payload) {\n\t\t\n\t\tconst eventName = payload.event;\n\t\t\n\t\t// Dispatch to browser-only pixels\n\t\twpm.dispatchToBrowserPixels(payload);\n\t\t\n\t\t// Dispatch to S2S-capable pixels\n\t\t// These pixels handle both browser (fbq, ttq, etc.) and server-side events\n\t\t// They listen to pmw:s2s:* events to get the adapted data with event_id for deduplication\n\t\twpm.dispatchToS2SPixels(payload);\n\t\t\n\t\t// Purchase events are handled entirely server-side and should never be sent from browser to server\n\t\t// to prevent duplicates and race conditions. However, browser-side pixels still need to fire.\n\t\tif (eventName === 'purchase') {\n\t\t\tpmw.console.log('Purchase event - skipping browser-to-server transmission (handled server-side only)');\n\t\t\treturn; // Return early, but browser pixels have already been dispatched above\n\t\t}\n\t\t\n\t\t// Only send to server if S2S is globally enabled\n\t\tif (wpmDataLayer?.general?.server_2_server?.active) {\n\t\t\t// Extract S2S data for server transmission\n\t\t\tconst s2sData = wpm.extractS2SData(payload);\n\t\t\t\n\t\t\t// Send to server if there's S2S data to send\n\t\t\tif (Object.keys(s2sData).length > 0) {\n\t\t\t\tpmw.console.log(`Sending S2S data for ${eventName}:`, s2sData);\n\t\t\t\tawait wpm.sendEventPayloadToServer(s2sData);\n\t\t\t}\n\t\t}\n\t};\t/**\n\t * Dispatch to browser-only pixels\n\t * \n\t * Triggers a browser-specific event that browser-only pixels can listen to.\n\t * The payload includes adapted data for each browser-only pixel.\n\t * \n\t * @param {object} payload - The fully processed event payload\n\t */\n\twpm.dispatchToBrowserPixels = function(payload) {\n\t\t\n\t\tconst browserPixels = wpm.pixelRegistry.getActiveBrowserOnlyPixels();\n\t\t\n\t\tif (browserPixels.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tpmw.console.log(`Dispatching to browser-only pixels for ${payload.event}:`, browserPixels);\n\t\t\n\t\t// Trigger browser-specific event that browser-only pixels can listen to\n\t\t// This allows them to access the filtered, adapted data\n\t\t// Convert underscores to hyphens for event name (public API uses hyphens)\n\t\tconst browserEventName = payload.event.replace(/_/g, '-');\n\t\tjQuery(document).trigger(`pmw:browser:${browserEventName}`, payload);\n\t};\n\n\t/**\n\t * Dispatch to S2S-capable pixels\n\t * \n\t * Triggers events for S2S-capable pixels (Facebook, TikTok, Pinterest, Snapchat).\n\t * These pixels handle both browser-side (fbq, ttq, etc.) and server-side events.\n\t * They always receive the event to fire their browser pixels, regardless of S2S status.\n\t * \n\t * @param {object} payload - The fully processed event payload\n\t */\n\twpm.dispatchToS2SPixels = function(payload) {\n\t\t\n\t\tconst s2sPixels = wpm.pixelRegistry.getActiveS2SPixels();\n\t\t\n\t\tif (s2sPixels.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tpmw.console.log(`Dispatching to S2S-capable pixels for ${payload.event}:`, s2sPixels);\n\t\t\n\t\t// Trigger S2S event that S2S-capable pixels listen to\n\t\t// This provides adapted data with event_id for deduplication between browser and server\n\t\t// Convert underscores to hyphens for event name (public API uses hyphens)\n\t\tconst s2sEventName = payload.event.replace(/_/g, '-');\n\t\tjQuery(document).trigger(`pmw:s2s:${s2sEventName}`, payload);\n\t};\n\n\t/**\n\t * Extract server-to-server data from the payload\n\t * \n\t * Only S2S-capable pixels should be included in the server request.\n\t * This creates a single payload with data for all S2S pixels.\n\t * \n\t * @param {object} payload - The full event payload\n\t * @returns {object} S2S-only data for server transmission\n\t */\n\twpm.extractS2SData = function(payload) {\n\t\t\n\t\tconst s2sData = {\n\t\t\tevent: payload.event\n\t\t};\n\t\t\n\t\tconst s2sPixels = wpm.pixelRegistry.getActiveS2SPixels();\n\t\t\n\t\tfor (const pixelName of s2sPixels) {\n\t\t\tif (payload.pixels[pixelName]) {\n\t\t\t\ts2sData[pixelName] = payload.pixels[pixelName];\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Add product data if present (for server-side processing)\n\t\tif (payload.event_data?.product) {\n\t\t\ts2sData.product = payload.event_data.product;\n\t\t}\n\t\t\n\t\treturn s2sData;\n\t};\n\n\t/**\n\t * Initialize adapters namespace\n\t */\n\tif (!wpm.adapters) {\n\t\twpm.adapters = {};\n\t}\n\n\t/**\n\t * Helper function to register an adapter with optional capabilities\n\t * \n\t * @param {string} pixelName - The pixel name\n\t * @param {object} adapter - The adapter object with an adapt() method\n\t * @param {object} [options] - Optional capabilities configuration\n\t * @param {boolean} [options.supportsS2S=false] - Whether pixel supports server-to-server tracking\n\t * @param {boolean} [options.supportsEventDeduplication=false] - Whether pixel supports event deduplication\n\t * @param {function} [options.isActive] - Function that returns true if pixel is active/loaded\n\t */\n\twpm.registerAdapter = function(pixelName, adapter, options = {}) {\n\t\tif (!adapter || typeof adapter.adapt !== 'function') {\n\t\t\tpmw.console.error(`Invalid adapter for ${pixelName}: must have an adapt() method`);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t// Store the adapter\n\t\twpm.adapters[pixelName] = adapter;\n\t\t\n\t\t// Store pixel capabilities\n\t\tif (!wpm.pixelCapabilities) {\n\t\t\twpm.pixelCapabilities = {};\n\t\t}\n\t\t\n\t\twpm.pixelCapabilities[pixelName] = {\n\t\t\tsupportsS2S: options.supportsS2S || false,\n\t\t\tsupportsEventDeduplication: options.supportsEventDeduplication || false,\n\t\t\tisActive: options.isActive || null\n\t\t};\n\t\t\n\t\t// pmw.console.log(`Adapter registered for: ${pixelName}`, wpm.pixelCapabilities[pixelName]);\n\t};\n\n}(window.wpm = window.wpm || {}, jQuery));\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + {\"194\":\"wc-hooks\",\"264\":\"deprecated-functions\",\"526\":\"pixel-facebook\",\"625\":\"consent-management\",\"671\":\"pixel-google\",\"818\":\"pixel-hotjar\",\"968\":\"consent-api\",\"972\":\"doofinder-listener\"}[chunkId] + \".\" + {\"194\":\"748deb38\",\"264\":\"9b411c79\",\"526\":\"0ae541d1\",\"625\":\"414e6bb6\",\"671\":\"62e8b182\",\"818\":\"05256bbc\",\"968\":\"12d29397\",\"972\":\"8afb6ac4\"}[chunkId] + \".chunk.min.js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/^blob:/, \"\").replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t792: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkPixel_Manager_for_WooCommerce\"] = self[\"webpackChunkPixel_Manager_for_WooCommerce\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","/**\n * Run PMW main loader\n */\n\nconst main = async () => {\n\n\trequire(\"./wpm/functions_main\");\n\trequire(\"./version.js\");\n\n\t// Wait until jQuery is loaded\n\tawait wpm.jQueryExists();\n\n\t// Wait until wpmDataLayer is loaded\n\tawait wpm.wpmDataLayerFullyLoaded();\n\n\t/**\n\t * Set webpack public path for chunk loading\n\t * This ensures chunks load correctly even when scripts are combined/moved \n\t * by optimization plugins (SiteGround, Autoptimize, WP Rocket, etc.)\n\t */\n\tif (wpmDataLayer?.general?.chunk_base_path) {\n\t\t// eslint-disable-next-line no-undef, camelcase\n\t\t__webpack_public_path__ = wpmDataLayer.general.chunk_base_path;\n\t}\n\n\t// wait 1000ms\n\t// await new Promise(resolve => setTimeout(resolve, 1000))\n\n\t// Load all essential scripts first\n\trequire(\"./wpm/functions_loader\");\n\t\n\t// Load new event filtering system\n\trequire(\"./wpm/hooks\");\n\trequire(\"./wpm/pixel-registry\");\n\trequire(\"./wpm/event-processor\");\n\n\t// Initialize command queue early so filters can be registered before events fire\n\twpm.initializeCommandQueue();\n\n\t// Output PMW console message\n\twpm.pmwConsoleMessage();\n\n\t// Load the consent management module as a chunk\n\tawait wpm.loadConsentModule();\n\tawait wpm.consent.load();\n\n\t// Doesn't work if we listen to pmw:dom:ready because it runs too late\n\t// (at the end of the main.js file)\n\t// TODO: Find out why that order is important and optimize it. It is also difficult to test. In Cypress it works just with \"pmw:dom:ready\"\n\tjQuery(() => {\n\t\trequire(\"./wpm/event_listeners_on_ready\");\n\t});\n\n\t// Load remaining event listeners\n\trequire(\"./wpm/event_listeners\");\n\t\n\t// Load doofinder listener as a chunk\n\timport(/* webpackChunkName: \"doofinder-listener\" */ \"./wpm/listeners/doofinder\");\n\n\twpm.loadWcHooksFunctions();\n\n\t// Check if domain is excluded from tracking\n\t// If so, return\n\tif (wpm.excludeDomainFromTracking()) return;\n\n\t// Load pixels dynamically based on configuration\n\tconst pixelLoaders = [];\n\n\t// Load free pixels conditionally\n\tif (wpmDataLayer?.pixels?.google) {\n\t\tpixelLoaders.push(\n\t\t\timport(/* webpackChunkName: \"pixel-google\" */ \"./pixels/google/loader\")\n\t\t);\n\t}\n\t\n\tif (wpmDataLayer?.pixels?.facebook) {\n\t\tpixelLoaders.push(\n\t\t\timport(/* webpackChunkName: \"pixel-facebook\" */ \"./pixels/facebook/loader\")\n\t\t);\n\t}\n\t\n\tif (wpmDataLayer?.pixels?.hotjar) {\n\t\tpixelLoaders.push(\n\t\t\timport(/* webpackChunkName: \"pixel-hotjar\" */ \"./pixels/hotjar/loader\")\n\t\t);\n\t}\n\n\t// #if process.env.TIER === 'premium'\n// \t/**\n// \t *  Load premium pixels conditionally\n// \t */\n// \tif (wpm.canLoadPremiumFeatures()) {\n// \t\tpixelLoaders.push(\n// \t\t\timport(/* webpackChunkName: \"wpm-premium-events\" */ \"./wpm/event_listeners_premium\")\n// \t\t);\n// \n// \t\tif (wpmDataLayer?.pixels?.adroll) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-adroll\" */ \"./pixels/adroll/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (wpmDataLayer?.pixels?.linkedin) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-linkedin\" */ \"./pixels/linkedin/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (wpmDataLayer?.pixels?.bing) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-microsoft\" */ \"./pixels/microsoft-ads/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (wpmDataLayer?.pixels?.outbrain) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-outbrain\" */ \"./pixels/outbrain/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (wpmDataLayer?.pixels?.pinterest) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-pinterest\" */ \"./pixels/pinterest/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (wpmDataLayer?.pixels?.snapchat) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-snapchat\" */ \"./pixels/snapchat/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (wpmDataLayer?.pixels?.taboola) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-taboola\" */ \"./pixels/taboola/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (wpmDataLayer?.pixels?.tiktok) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-tiktok\" */ \"./pixels/tiktok/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (wpmDataLayer?.pixels?.twitter) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-twitter\" */ \"./pixels/twitter/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (wpmDataLayer?.pixels?.reddit) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-reddit\" */ \"./pixels/reddit/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (wpmDataLayer?.pixels?.vwo) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-vwo\" */ \"./pixels/vwo/loader\")\n// \t\t\t);\n// \t\t}\n// \t}\n\t// #endif\n\n\t// Load all active pixels in parallel\n\tawait Promise.all(pixelLoaders);\n\n\t/** Load the deprecated functions as a chunk */\n\tconst {loadDeprecatedFunctions} = await import(/* webpackChunkName: \"deprecated-functions\" */ \"./wpm/deprecated.mjs\");\n\tloadDeprecatedFunctions();\n\n\t// Preload pixels\n\tdocument.dispatchEvent(new Event(\"pmw:load-pixels\"));\n\n\t// Trigger wpmLoad event\n\tdocument.dispatchEvent(new Event(\"wpmLoad\"));\n\n\t// Wait until page is loaded\n\tawait wpm.pageLoaded();\n\n\tdocument.dispatchEvent(new Event(\"pmw:ready\"));\n\twpm.triggerPmwDomReadyEvent();\n\n\t// Check if the library version matches the PMW version that's installed on the server\n\twpm.checkLibraryVersion();\n};\n\nmain();\n\n\n\n\n\n\n\n\n"],"names":["leafPrototypes","getProto","inProgress","dataWebpackPrefix","getLocationByTimeZone","timezone","Intl","DateTimeFormat","resolvedOptions","timeZone","geoLocation","countryCode","toUpperCase","regionCode","log","message","objects","isLoggerEnabled","console","length","error","urlLoggerOff","sessionLoggerEnabled","urlLoggerOn","wpmDataLayer","general","logger","is_active","wpm","urlHasParameter","storeData","retrieveData","require","window","loadConsentModule","async","consentModule","consent","apiModule","pmw","api","removeHtmlTagsAndWhitespace","string","replace","trim","jQuery","on","event","target","value","id","triggerAddShippingInfoEvent","slug","text","checkedShippingMethod","find","val","attr","shippingTier","document","trigger","paymentMethodChangeLogged","triggerAddPaymentInfoEvent","checkedPaymentMethod","paymentType","url","URL","currentTarget","productId","getProductIdByCartItemKeyUrl","removeProductFromCart","e","checkoutButtonSelectors","prepareSelectors","paymentMethodSelected","fireCheckoutProgress","fireCheckoutOption","initCart","products","productIds","getAddToCartLinkProductIds","getProductsFromBackend","referrer","referrerHostname","hostname","location","host","gclid","getUrlParameter","wbraid","gbraid","fbclid","Math","floor","Date","now","ttclid","scid","epik","pmw_loaded","shop","page_type","product_type","getMainProductIdFromProductPage","product","getProductDataForViewItemEvent","order","isOrderIdStored","writeOrderIdToStorage","key","acrRemoveCookie","user","hasLoginEventFired","setLoginEventFired","lazy_load_pmw","registerShowVariationEventListener","$variationForm","selectedValues","toArray","every","select","productVariations","data","matchingVariation","variation","Object","entries","attributes","triggerViewItemEventPrep","variation_id","payload","pixels","facebook","loaded","event_name","event_id","getFbRandomEventId","user_data","getFbUserData","event_source_url","href","referrer_url","makeFullUrl","snapchat","getSnapchatS2SBaseData","server_2_server","pageview_event_s2s","sendEventPayloadToServer","processEvent","custom_data","fbGetProductDataForCapiEvent","tiktok","getRandomEventId","tiktokGetEventUserData","page","tiktokGetEventPageData","properties","price","quantity","currency","content_type","contents","content_id","getProductIdForSpecificPixel","content_name","name","getSnapchatCustomDataForProduct","pinterest","getPinterestS2SBaseData","tiktokGetPropertiesFromCart","isWooCommerceActive","startIntersectionObserverToWatch","startProductsMutationObserverToWatch","waitForPixelsAndTriggerPageView","pixelRegistry","getActivePixels","activePixels","pixelCapabilities","pixelName","capabilities","isActive","push","getActiveBrowserOnlyPixels","browserPixels","this","supportsS2S","getActiveS2SPixels","s2sPixels","getAdapter","adapters","jQueryExists","Promise","resolve","waitForjQuery","setTimeout","waitForLibrary","library","timeout","interval","startTime","wpmDataLayerFullyLoaded","checkVar","waitForVar","version","logTimeoutId","then","clearTimeout","wpHooksExists","wp","hooks","loadWcHooksFunctions","filters","addFilter","hookName","namespace","callback","priority","sort","a","b","applyFilters","args","filteredValue","filter","result","warn","removeFilter","initialLength","f","removeAllFilters","hasFilter","some","getFilters","getLibraryVersion","checkLibraryVersion","number","$","undefined","isRange","isIP","isV4","isV6","getIpVersion","ipServices","getGeoInfo","cloudflare","response","fetch","ok","Error","status","split","reduce","obj","pair","ip","loc","processRegion","service","geojs","json","country_code","region","ipinfo","country","ipapi","consent_management","restricted_regions","includes","isVisitorAllowed","JSON","parse","isBotUserAgent","Array","isArray","ip_exclude_list","getIp","isOnIpExclusionList","ipVersion","maxServicesToCheck","validVersions","join","ipv","getIpFromAnyService","getBrowserGeoFromExternalService","performance","promises","keys","forEach","any","toFixed","getBrowserGeo","geoFromStorage","geoInfo","gepLocationByTimeZone","getBrowserLocationByTimeZone","ipServicesFiltered","slice","getIpFromService","timeTaken","reject","serviceResponseData","isVisitorNotAllowed","userAgent","navigator","botPatterns","getBotPatterns","pattern","toLowerCase","customPatterns","user_agent_exclude_patterns","concat","isCidr","ipName","ipExcludeList","isInSubnet","addToCartSelectors","dataset","product_id","addProductToCart","Number","indexOf","each","index","element","classes","getPostIdFromString","one","closest","origin","searchParams","has","get","parseInt","nextAll","getIdBasedOndVariationsOutputSetting","getProductDetailsFormattedForEvent","isEmail","emailSelected","getProductIdByCartItemElement","getProductQuantityByCartItemElement","cart","getCartItemsFromBackend","expandIPv6","ipaddr","ipv4Part","ipv4Regexes","ipv6Part","ipv6Regexes","matchCIDR","zoneIndex","module","exports","first","second","partSize","cidrBits","part","shift","subnetMatch","address","rangeList","defaultName","k","len","rangeName","rangeSubnets","subnet","kind","match","apply","IPv4","octets","octet","prototype","toString","toNormalizedString","toByteArray","other","cidrRange","ref","SpecialRanges","unspecified","broadcast","multicast","linkLocal","loopback","carrierGradeNat","reserved","range","toIPv4MappedAddress","IPv6","prefixLengthFromSubnetMask","cidr","i","stop","zeros","zerotable","fourOctet","RegExp","longValue","parser","parseIntAuto","results","reverse","parts","zoneId","l","toRFC5952String","bestMatchIndex","bestMatchLength","regex","exec","substring","bytes","addr","suffix","call","toFixedLengthString","padStart","uniqueLocal","ipv4Mapped","rfc6145","rfc6052","teredo","isIPv4MappedAddress","toIPv4Address","high","low","transitional","colonCount","lastColon","replacement","replacementCount","lastIndexOf","substr","test","isIPv4","isIPv6","isValid","error1","isValidFourPartDecimal","parseCIDR","maskLength","parsed","defineProperty","subnetMaskFromPrefixLength","prefix","filledOctetCount","j","pow","broadcastAddressFromCIDR","ipInterfaceOctets","subnetMaskOctets","networkAddressFromCIDR","fromByteArray","process","commonjsGlobal","normalize","_validate","nh","sections","n","h","ns","hs","_leftPad","abbreviate","zPreviousFlag","zeroStartIndex","zeroLength","zStartIndex","zLength","section","zFlag","splice","d","p","padding","repeat","_hex2bin","hex","_bin2hex","bin","_addr2bin","binAddr","_bin2addr","binPart","hexSection","divideSubnet","mask0","mask1","limit","abbr","ret","binNetPart","binHostPart","numSubnets","binSubnet","hexAddr","binStartAddr","binEndAddr","start","end","size","randomSubnet","random","ptr","mask","err","inRange","check_range","ip6","range_data","parse_addr","parse_range","storeIP","displayIP","wpmRestSettings","isBelowRestErrorThreshold","isRestEndpointAvailable","testEndpoint","root","cookieName","method","mode","cache","keepalive","redirect","responseJson","success","stringify","isWpmRestEndpointAvailable","orderId","orderKey","source","orderIds","storeOrderIdOnServer","order_duplication_prevention","email","quantityToRemove","storeCartData","variations_output","is_variation","parent_id","selectors","type","Set","doesWooCommerceCartExist","retrieveCartData","saveCartObjectToDataLayer","ajax_url","body","URLSearchParams","action","page_id","product_ids","options","headers","statusText","responseData","assign","cartObject","triggerViewItemEvent","triggerViewItemEventNoProduct","step","checkout_option","triggerViewItemList","viewItemListTriggerTestMode","css","append","view_item_list_trigger","opacity","background_color","getSearchTermFromUrl","search","io","ioTimeouts","observerCallback","observer","entry","elementId","next","isIntersecting","test_mode","unobserve","remove","ioid","detectedProductTemplateClasses","nested","flat","isNestedClass","elem","className","isFlatClass","prev","hasClass","getAllElementsToWatch","getCommonIdentifiersToWatch","listOfClassNames","haveSameNestingDepth","element1","element2","parents","findCommonParentElement","parent","is","node","countOfChildren","getCommonClass","classes1","classes2","wpmProductIds","querySelectorAll","productsNode","firstChildClassAttr","children","firstChildClasses","secondChildClassAttr","commonClass","firstProductTemplateClasses","map","IntersectionObserver","threshold","observe","productsMutationObserver","childList","characterData","MutationObserver","mutations","mutation","newNodes","addedNodes","hasWpmProductIdElement","siblings","setCookie","cookieValue","expiryDays","setTime","getTime","expires","toUTCString","cookie","getCookie","ca","decodeURIComponent","c","charAt","getCookieThatContainsRegex","cookies","deleteCookie","persistent","extension","dataGetter","getPersistentData","getSessionData","dataSetter","setPersistentData","setSessionData","deleteDataKey","localStorage","removeItem","getPersistentDataKey","sessionStorage","getSessionDataKey","defaultStorageKey","storageKeySuffix","getItem","setItem","order_id","orderDetails","order_key","cartItemKey","cart_item_keys","matches","dyn_r_ids","list_name","brand","category","variant","list_position","position","is_variable","parent_id_dyn_r_ids","getClidFromBrowser","clidId","clidCookieId","dclid","getUserAgent","getViewPort","width","max","documentElement","clientWidth","innerWidth","height","clientHeight","innerHeight","consoleLogVersion","loadScriptAndCacheIt","fallbackUrl","dataType","ajax","done","fail","fallbackOptions","getOrderItemPrice","orderItem","total","total_tax","loginEventFired","pageLoaded","readyState","pageReady","isMiniCartActive","parameter","hashAsync","algo","str","crypto","subtle","digest","TextEncoder","encode","buf","Uint8Array","x","getCartValue","doesUrlContainPatterns","patterns","excludeDomainFromTracking","exclude_domains","domain","debug","pmwConsoleMessage","pro","distro","eligible_for_updates","show","canLoadPremiumFeatures","pmwDomReadyFired","triggerPmwDomReadyEvent","firePmwDomReadyEvent","addEventListener","dispatchEvent","Event","getEmailFromTarget","sendEventPayloadToServerPremium","checkPixelsLoaded","String","dynamic_remarketing","id_type","isInWooCommerceSesssion","session_active","isNotInWooCommerceSesssion","previousVariationId","initializeCommandQueue","queue","_pmwq","fn","getEventContext","timestamp","user_agent","user_id","raw","eventName","eventData","event_data","context","adapter","adapt","pixelData","dispatchToPixels","dispatchToBrowserPixels","dispatchToS2SPixels","active","s2sData","extractS2SData","browserEventName","s2sEventName","registerAdapter","supportsEventDeduplication","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","m","getPrototypeOf","t","__esModule","create","r","def","current","getOwnPropertyNames","definition","o","enumerable","chunkId","all","u","g","globalThis","Function","prop","hasOwnProperty","script","needAttach","scripts","getElementsByTagName","s","getAttribute","createElement","charset","nc","setAttribute","src","onScriptComplete","onerror","onload","doneFns","parentNode","removeChild","bind","head","appendChild","Symbol","toStringTag","scriptUrl","importScripts","currentScript","tagName","installedChunks","installedChunkData","promise","errorType","realSrc","request","webpackJsonpCallback","parentChunkLoadingFunction","chunkIds","moreModules","runtime","chunkLoadingGlobal","self","chunk_base_path","__webpack_public_path__","load","pixelLoaders","google","hotjar","loadDeprecatedFunctions","main"],"sourceRoot":""}
     1{"version":3,"file":"wpm-public.p1.min.js","mappings":"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","sources":["webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/create fake namespace object","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/load script","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/wpm/geo/geo.mjs","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/wpm/console.mjs","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/wpm/functions_loader.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/wpm/event_listeners.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/wpm/pixel-registry.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/wpm/functions_main.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/wpm/hooks.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/version.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/wpm/ip_services.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/wpm/event_listeners_on_ready.js","webpack://Pixel-Manager-for-WooCommerce/../node_modules/ipaddr.js/lib/ipaddr.js","webpack://Pixel-Manager-for-WooCommerce/../node_modules/ip6/ip6.js","webpack://Pixel-Manager-for-WooCommerce/../src/range-check.ts","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/wpm/functions.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/wpm/event-processor.js","webpack://Pixel-Manager-for-WooCommerce/webpack/bootstrap","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/define property getters","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/ensure chunk","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/get javascript chunk filename","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/global","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/hasOwnProperty shorthand","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/make namespace object","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/publicPath","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/jsonp chunk loading","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/main.js"],"sourcesContent":["var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; (typeof current == 'object' || typeof current == 'function') && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"Pixel Manager for WooCommerce:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// https://stackoverflow.com/a/70870895/4688612\nexport const getLocationByTimeZone = () => {\n\n\tconst timezones = {\n\t\t\"Africa/Abidjan\"                : [\"CI\", \"BF\", \"GH\", \"GM\", \"GN\", \"ML\", \"MR\", \"SH\", \"SL\", \"SN\", \"TG\"],\n\t\t\"Africa/Accra\"                  : [\"GH\"],\n\t\t\"Africa/Addis_Ababa\"            : [\"ET\"],\n\t\t\"Africa/Algiers\"                : [\"DZ\"],\n\t\t\"Africa/Asmara\"                 : [\"ER\"],\n\t\t\"Africa/Asmera\"                 : [\"ER\"],\n\t\t\"Africa/Bamako\"                 : [\"ML\"],\n\t\t\"Africa/Bangui\"                 : [\"CF\"],\n\t\t\"Africa/Banjul\"                 : [\"GM\"],\n\t\t\"Africa/Bissau\"                 : [\"GW\"],\n\t\t\"Africa/Blantyre\"               : [\"MW\"],\n\t\t\"Africa/Brazzaville\"            : [\"CG\"],\n\t\t\"Africa/Bujumbura\"              : [\"BI\"],\n\t\t\"Africa/Cairo\"                  : [\"EG\"],\n\t\t\"Africa/Casablanca\"             : [\"MA\"],\n\t\t\"Africa/Ceuta\"                  : [\"ES\"],\n\t\t\"Africa/Conakry\"                : [\"GN\"],\n\t\t\"Africa/Dakar\"                  : [\"SN\"],\n\t\t\"Africa/Dar_es_Salaam\"          : [\"TZ\"],\n\t\t\"Africa/Djibouti\"               : [\"DJ\"],\n\t\t\"Africa/Douala\"                 : [\"CM\"],\n\t\t\"Africa/El_Aaiun\"               : [\"EH\"],\n\t\t\"Africa/Freetown\"               : [\"SL\"],\n\t\t\"Africa/Gaborone\"               : [\"BW\"],\n\t\t\"Africa/Harare\"                 : [\"ZW\"],\n\t\t\"Africa/Johannesburg\"           : [\"ZA\", \"LS\", \"SZ\"],\n\t\t\"Africa/Juba\"                   : [\"SS\"],\n\t\t\"Africa/Kampala\"                : [\"UG\"],\n\t\t\"Africa/Khartoum\"               : [\"SD\"],\n\t\t\"Africa/Kigali\"                 : [\"RW\"],\n\t\t\"Africa/Kinshasa\"               : [\"CD\"],\n\t\t\"Africa/Lagos\"                  : [\"NG\", \"AO\", \"BJ\", \"CD\", \"CF\", \"CG\", \"CM\", \"GA\", \"GQ\", \"NE\"],\n\t\t\"Africa/Libreville\"             : [\"GA\"],\n\t\t\"Africa/Lome\"                   : [\"TG\"],\n\t\t\"Africa/Luanda\"                 : [\"AO\"],\n\t\t\"Africa/Lubumbashi\"             : [\"CD\"],\n\t\t\"Africa/Lusaka\"                 : [\"ZM\"],\n\t\t\"Africa/Malabo\"                 : [\"GQ\"],\n\t\t\"Africa/Maputo\"                 : [\"MZ\", \"BI\", \"BW\", \"CD\", \"MW\", \"RW\", \"ZM\", \"ZW\"],\n\t\t\"Africa/Maseru\"                 : [\"LS\"],\n\t\t\"Africa/Mbabane\"                : [\"SZ\"],\n\t\t\"Africa/Mogadishu\"              : [\"SO\"],\n\t\t\"Africa/Monrovia\"               : [\"LR\"],\n\t\t\"Africa/Nairobi\"                : [\"KE\", \"DJ\", \"ER\", \"ET\", \"KM\", \"MG\", \"SO\", \"TZ\", \"UG\", \"YT\"],\n\t\t\"Africa/Ndjamena\"               : [\"TD\"],\n\t\t\"Africa/Niamey\"                 : [\"NE\"],\n\t\t\"Africa/Nouakchott\"             : [\"MR\"],\n\t\t\"Africa/Ouagadougou\"            : [\"BF\"],\n\t\t\"Africa/Porto-Novo\"             : [\"BJ\"],\n\t\t\"Africa/Sao_Tome\"               : [\"ST\"],\n\t\t\"Africa/Timbuktu\"               : [\"ML\"],\n\t\t\"Africa/Tripoli\"                : [\"LY\"],\n\t\t\"Africa/Tunis\"                  : [\"TN\"],\n\t\t\"Africa/Windhoek\"               : [\"NA\"],\n\t\t\"America/Adak\"                  : [\"US\"],\n\t\t\"America/Anchorage\"             : [\"US\"],\n\t\t\"America/Anguilla\"              : [\"AI\"],\n\t\t\"America/Antigua\"               : [\"AG\"],\n\t\t\"America/Araguaina\"             : [\"BR\"],\n\t\t\"America/Argentina/Buenos_Aires\": [\"AR\"],\n\t\t\"America/Argentina/Catamarca\"   : [\"AR\"],\n\t\t\"America/Argentina/Cordoba\"     : [\"AR\"],\n\t\t\"America/Argentina/Jujuy\"       : [\"AR\"],\n\t\t\"America/Argentina/La_Rioja\"    : [\"AR\"],\n\t\t\"America/Argentina/Mendoza\"     : [\"AR\"],\n\t\t\"America/Argentina/Rio_Gallegos\": [\"AR\"],\n\t\t\"America/Argentina/Salta\"       : [\"AR\"],\n\t\t\"America/Argentina/San_Juan\"    : [\"AR\"],\n\t\t\"America/Argentina/San_Luis\"    : [\"AR\"],\n\t\t\"America/Argentina/Tucuman\"     : [\"AR\"],\n\t\t\"America/Argentina/Ushuaia\"     : [\"AR\"],\n\t\t\"America/Aruba\"                 : [\"AW\"],\n\t\t\"America/Asuncion\"              : [\"PY\"],\n\t\t\"America/Atikokan\"              : [\"CA\"],\n\t\t\"America/Bahia\"                 : [\"BR\"],\n\t\t\"America/Bahia_Banderas\"        : [\"MX\"],\n\t\t\"America/Barbados\"              : [\"BB\"],\n\t\t\"America/Belem\"                 : [\"BR\"],\n\t\t\"America/Belize\"                : [\"BZ\"],\n\t\t\"America/Blanc-Sablon\"          : [\"CA\"],\n\t\t\"America/Boa_Vista\"             : [\"BR\"],\n\t\t\"America/Bogota\"                : [\"CO\"],\n\t\t\"America/Boise\"                 : [\"US\"],\n\t\t\"America/Cambridge_Bay\"         : [\"CA\"],\n\t\t\"America/Campo_Grande\"          : [\"BR\"],\n\t\t\"America/Cancun\"                : [\"MX\"],\n\t\t\"America/Caracas\"               : [\"VE\"],\n\t\t\"America/Cayenne\"               : [\"GF\"],\n\t\t\"America/Cayman\"                : [\"KY\"],\n\t\t\"America/Chicago\"               : [\"US\"],\n\t\t\"America/Chihuahua\"             : [\"MX\"],\n\t\t\"America/Coral_Harbour\"         : [\"CA\"],\n\t\t\"America/Costa_Rica\"            : [\"CR\"],\n\t\t\"America/Creston\"               : [\"CA\"],\n\t\t\"America/Cuiaba\"                : [\"BR\"],\n\t\t\"America/Curacao\"               : [\"CW\"],\n\t\t\"America/Danmarkshavn\"          : [\"GL\"],\n\t\t\"America/Dawson\"                : [\"CA\"],\n\t\t\"America/Dawson_Creek\"          : [\"CA\"],\n\t\t\"America/Denver\"                : [\"US\"],\n\t\t\"America/Detroit\"               : [\"US\"],\n\t\t\"America/Dominica\"              : [\"DM\"],\n\t\t\"America/Edmonton\"              : [\"CA\"],\n\t\t\"America/Eirunepe\"              : [\"BR\"],\n\t\t\"America/El_Salvador\"           : [\"SV\"],\n\t\t\"America/Fort_Nelson\"           : [\"CA\"],\n\t\t\"America/Fortaleza\"             : [\"BR\"],\n\t\t\"America/Glace_Bay\"             : [\"CA\"],\n\t\t\"America/Goose_Bay\"             : [\"CA\"],\n\t\t\"America/Grand_Turk\"            : [\"TC\"],\n\t\t\"America/Grenada\"               : [\"GD\"],\n\t\t\"America/Guadeloupe\"            : [\"GP\"],\n\t\t\"America/Guatemala\"             : [\"GT\"],\n\t\t\"America/Guayaquil\"             : [\"EC\"],\n\t\t\"America/Guyana\"                : [\"GY\"],\n\t\t\"America/Halifax\"               : [\"CA\"],\n\t\t\"America/Havana\"                : [\"CU\"],\n\t\t\"America/Hermosillo\"            : [\"MX\"],\n\t\t\"America/Indiana/Indianapolis\"  : [\"US\"],\n\t\t\"America/Indiana/Knox\"          : [\"US\"],\n\t\t\"America/Indiana/Marengo\"       : [\"US\"],\n\t\t\"America/Indiana/Petersburg\"    : [\"US\"],\n\t\t\"America/Indiana/Tell_City\"     : [\"US\"],\n\t\t\"America/Indiana/Vevay\"         : [\"US\"],\n\t\t\"America/Indiana/Vincennes\"     : [\"US\"],\n\t\t\"America/Indiana/Winamac\"       : [\"US\"],\n\t\t\"America/Inuvik\"                : [\"CA\"],\n\t\t\"America/Iqaluit\"               : [\"CA\"],\n\t\t\"America/Jamaica\"               : [\"JM\"],\n\t\t\"America/Juneau\"                : [\"US\"],\n\t\t\"America/Kentucky/Louisville\"   : [\"US\"],\n\t\t\"America/Kentucky/Monticello\"   : [\"US\"],\n\t\t\"America/Kralendijk\"            : [\"BQ\"],\n\t\t\"America/La_Paz\"                : [\"BO\"],\n\t\t\"America/Lima\"                  : [\"PE\"],\n\t\t\"America/Los_Angeles\"           : [\"US\"],\n\t\t\"America/Lower_Princes\"         : [\"SX\"],\n\t\t\"America/Maceio\"                : [\"BR\"],\n\t\t\"America/Managua\"               : [\"NI\"],\n\t\t\"America/Manaus\"                : [\"BR\"],\n\t\t\"America/Marigot\"               : [\"MF\"],\n\t\t\"America/Martinique\"            : [\"MQ\"],\n\t\t\"America/Matamoros\"             : [\"MX\"],\n\t\t\"America/Mazatlan\"              : [\"MX\"],\n\t\t\"America/Menominee\"             : [\"US\"],\n\t\t\"America/Merida\"                : [\"MX\"],\n\t\t\"America/Metlakatla\"            : [\"US\"],\n\t\t\"America/Mexico_City\"           : [\"MX\"],\n\t\t\"America/Miquelon\"              : [\"PM\"],\n\t\t\"America/Moncton\"               : [\"CA\"],\n\t\t\"America/Monterrey\"             : [\"MX\"],\n\t\t\"America/Montevideo\"            : [\"UY\"],\n\t\t\"America/Montreal\"              : [\"CA\"],\n\t\t\"America/Montserrat\"            : [\"MS\"],\n\t\t\"America/Nassau\"                : [\"BS\"],\n\t\t\"America/New_York\"              : [\"US\"],\n\t\t\"America/Nipigon\"               : [\"CA\"],\n\t\t\"America/Nome\"                  : [\"US\"],\n\t\t\"America/Noronha\"               : [\"BR\"],\n\t\t\"America/North_Dakota/Beulah\"   : [\"US\"],\n\t\t\"America/North_Dakota/Center\"   : [\"US\"],\n\t\t\"America/North_Dakota/New_Salem\": [\"US\"],\n\t\t\"America/Nuuk\"                  : [\"GL\"],\n\t\t\"America/Ojinaga\"               : [\"MX\"],\n\t\t\"America/Panama\"                : [\"PA\", \"CA\", \"KY\"],\n\t\t\"America/Pangnirtung\"           : [\"CA\"],\n\t\t\"America/Paramaribo\"            : [\"SR\"],\n\t\t\"America/Phoenix\"               : [\"US\", \"CA\"],\n\t\t\"America/Port-au-Prince\"        : [\"HT\"],\n\t\t\"America/Port_of_Spain\"         : [\"TT\"],\n\t\t\"America/Porto_Velho\"           : [\"BR\"],\n\t\t\"America/Puerto_Rico\"           : [\"PR\", \"AG\", \"CA\", \"AI\", \"AW\", \"BL\", \"BQ\", \"CW\", \"DM\", \"GD\", \"GP\", \"KN\", \"LC\", \"MF\", \"MS\", \"SX\", \"TT\", \"VC\", \"VG\", \"VI\"],\n\t\t\"America/Punta_Arenas\"          : [\"CL\"],\n\t\t\"America/Rainy_River\"           : [\"CA\"],\n\t\t\"America/Rankin_Inlet\"          : [\"CA\"],\n\t\t\"America/Recife\"                : [\"BR\"],\n\t\t\"America/Regina\"                : [\"CA\"],\n\t\t\"America/Resolute\"              : [\"CA\"],\n\t\t\"America/Rio_Branco\"            : [\"BR\"],\n\t\t\"America/Santarem\"              : [\"BR\"],\n\t\t\"America/Santiago\"              : [\"CL\"],\n\t\t\"America/Santo_Domingo\"         : [\"DO\"],\n\t\t\"America/Sao_Paulo\"             : [\"BR\"],\n\t\t\"America/Scoresbysund\"          : [\"GL\"],\n\t\t\"America/Sitka\"                 : [\"US\"],\n\t\t\"America/St_Barthelemy\"         : [\"BL\"],\n\t\t\"America/St_Johns\"              : [\"CA\"],\n\t\t\"America/St_Kitts\"              : [\"KN\"],\n\t\t\"America/St_Lucia\"              : [\"LC\"],\n\t\t\"America/St_Thomas\"             : [\"VI\"],\n\t\t\"America/St_Vincent\"            : [\"VC\"],\n\t\t\"America/Swift_Current\"         : [\"CA\"],\n\t\t\"America/Tegucigalpa\"           : [\"HN\"],\n\t\t\"America/Thule\"                 : [\"GL\"],\n\t\t\"America/Thunder_Bay\"           : [\"CA\"],\n\t\t\"America/Tijuana\"               : [\"MX\"],\n\t\t\"America/Toronto\"               : [\"CA\", \"BS\"],\n\t\t\"America/Tortola\"               : [\"VG\"],\n\t\t\"America/Vancouver\"             : [\"CA\"],\n\t\t\"America/Virgin\"                : [\"VI\"],\n\t\t\"America/Whitehorse\"            : [\"CA\"],\n\t\t\"America/Winnipeg\"              : [\"CA\"],\n\t\t\"America/Yakutat\"               : [\"US\"],\n\t\t\"America/Yellowknife\"           : [\"CA\"],\n\t\t\"Antarctica/Casey\"              : [\"AQ\"],\n\t\t\"Antarctica/Davis\"              : [\"AQ\"],\n\t\t\"Antarctica/DumontDUrville\"     : [\"AQ\"],\n\t\t\"Antarctica/Macquarie\"          : [\"AU\"],\n\t\t\"Antarctica/Mawson\"             : [\"AQ\"],\n\t\t\"Antarctica/McMurdo\"            : [\"AQ\"],\n\t\t\"Antarctica/Palmer\"             : [\"AQ\"],\n\t\t\"Antarctica/Rothera\"            : [\"AQ\"],\n\t\t\"Antarctica/South_Pole\"         : [\"AQ\"],\n\t\t\"Antarctica/Syowa\"              : [\"AQ\"],\n\t\t\"Antarctica/Troll\"              : [\"AQ\"],\n\t\t\"Antarctica/Vostok\"             : [\"AQ\"],\n\t\t\"Arctic/Longyearbyen\"           : [\"SJ\"],\n\t\t\"Asia/Aden\"                     : [\"YE\"],\n\t\t\"Asia/Almaty\"                   : [\"KZ\"],\n\t\t\"Asia/Amman\"                    : [\"JO\"],\n\t\t\"Asia/Anadyr\"                   : [\"RU\"],\n\t\t\"Asia/Aqtau\"                    : [\"KZ\"],\n\t\t\"Asia/Aqtobe\"                   : [\"KZ\"],\n\t\t\"Asia/Ashgabat\"                 : [\"TM\"],\n\t\t\"Asia/Atyrau\"                   : [\"KZ\"],\n\t\t\"Asia/Baghdad\"                  : [\"IQ\"],\n\t\t\"Asia/Bahrain\"                  : [\"BH\"],\n\t\t\"Asia/Baku\"                     : [\"AZ\"],\n\t\t\"Asia/Bangkok\"                  : [\"TH\", \"KH\", \"LA\", \"VN\"],\n\t\t\"Asia/Barnaul\"                  : [\"RU\"],\n\t\t\"Asia/Beirut\"                   : [\"LB\"],\n\t\t\"Asia/Bishkek\"                  : [\"KG\"],\n\t\t\"Asia/Brunei\"                   : [\"BN\"],\n\t\t\"Asia/Chita\"                    : [\"RU\"],\n\t\t\"Asia/Choibalsan\"               : [\"MN\"],\n\t\t\"Asia/Colombo\"                  : [\"LK\"],\n\t\t\"Asia/Damascus\"                 : [\"SY\"],\n\t\t\"Asia/Dhaka\"                    : [\"BD\"],\n\t\t\"Asia/Dili\"                     : [\"TL\"],\n\t\t\"Asia/Dubai\"                    : [\"AE\", \"OM\"],\n\t\t\"Asia/Dushanbe\"                 : [\"TJ\"],\n\t\t\"Asia/Famagusta\"                : [\"CY\"],\n\t\t\"Asia/Gaza\"                     : [\"PS\"],\n\t\t\"Asia/Hebron\"                   : [\"PS\"],\n\t\t\"Asia/Ho_Chi_Minh\"              : [\"VN\"],\n\t\t\"Asia/Hong_Kong\"                : [\"HK\"],\n\t\t\"Asia/Hovd\"                     : [\"MN\"],\n\t\t\"Asia/Irkutsk\"                  : [\"RU\"],\n\t\t\"Asia/Jakarta\"                  : [\"ID\"],\n\t\t\"Asia/Jayapura\"                 : [\"ID\"],\n\t\t\"Asia/Jerusalem\"                : [\"IL\"],\n\t\t\"Asia/Kabul\"                    : [\"AF\"],\n\t\t\"Asia/Kamchatka\"                : [\"RU\"],\n\t\t\"Asia/Karachi\"                  : [\"PK\"],\n\t\t\"Asia/Kathmandu\"                : [\"NP\"],\n\t\t\"Asia/Khandyga\"                 : [\"RU\"],\n\t\t\"Asia/Kolkata\"                  : [\"IN\"],\n\t\t\"Asia/Krasnoyarsk\"              : [\"RU\"],\n\t\t\"Asia/Kuala_Lumpur\"             : [\"MY\"],\n\t\t\"Asia/Kuching\"                  : [\"MY\"],\n\t\t\"Asia/Kuwait\"                   : [\"KW\"],\n\t\t\"Asia/Macau\"                    : [\"MO\"],\n\t\t\"Asia/Magadan\"                  : [\"RU\"],\n\t\t\"Asia/Makassar\"                 : [\"ID\"],\n\t\t\"Asia/Manila\"                   : [\"PH\"],\n\t\t\"Asia/Muscat\"                   : [\"OM\"],\n\t\t\"Asia/Nicosia\"                  : [\"CY\"],\n\t\t\"Asia/Novokuznetsk\"             : [\"RU\"],\n\t\t\"Asia/Novosibirsk\"              : [\"RU\"],\n\t\t\"Asia/Omsk\"                     : [\"RU\"],\n\t\t\"Asia/Oral\"                     : [\"KZ\"],\n\t\t\"Asia/Phnom_Penh\"               : [\"KH\"],\n\t\t\"Asia/Pontianak\"                : [\"ID\"],\n\t\t\"Asia/Pyongyang\"                : [\"KP\"],\n\t\t\"Asia/Qatar\"                    : [\"QA\", \"BH\"],\n\t\t\"Asia/Qostanay\"                 : [\"KZ\"],\n\t\t\"Asia/Qyzylorda\"                : [\"KZ\"],\n\t\t\"Asia/Riyadh\"                   : [\"SA\", \"AQ\", \"KW\", \"YE\"],\n\t\t\"Asia/Sakhalin\"                 : [\"RU\"],\n\t\t\"Asia/Samarkand\"                : [\"UZ\"],\n\t\t\"Asia/Seoul\"                    : [\"KR\"],\n\t\t\"Asia/Shanghai\"                 : [\"CN\"],\n\t\t\"Asia/Singapore\"                : [\"SG\", \"MY\"],\n\t\t\"Asia/Srednekolymsk\"            : [\"RU\"],\n\t\t\"Asia/Taipei\"                   : [\"TW\"],\n\t\t\"Asia/Tashkent\"                 : [\"UZ\"],\n\t\t\"Asia/Tbilisi\"                  : [\"GE\"],\n\t\t\"Asia/Tehran\"                   : [\"IR\"],\n\t\t\"Asia/Thimphu\"                  : [\"BT\"],\n\t\t\"Asia/Tokyo\"                    : [\"JP\"],\n\t\t\"Asia/Tomsk\"                    : [\"RU\"],\n\t\t\"Asia/Ulaanbaatar\"              : [\"MN\"],\n\t\t\"Asia/Urumqi\"                   : [\"CN\"],\n\t\t\"Asia/Ust-Nera\"                 : [\"RU\"],\n\t\t\"Asia/Vientiane\"                : [\"LA\"],\n\t\t\"Asia/Vladivostok\"              : [\"RU\"],\n\t\t\"Asia/Yakutsk\"                  : [\"RU\"],\n\t\t\"Asia/Yangon\"                   : [\"MM\"],\n\t\t\"Asia/Yekaterinburg\"            : [\"RU\"],\n\t\t\"Asia/Yerevan\"                  : [\"AM\"],\n\t\t\"Atlantic/Azores\"               : [\"PT\"],\n\t\t\"Atlantic/Bermuda\"              : [\"BM\"],\n\t\t\"Atlantic/Canary\"               : [\"ES\"],\n\t\t\"Atlantic/Cape_Verde\"           : [\"CV\"],\n\t\t\"Atlantic/Faroe\"                : [\"FO\"],\n\t\t\"Atlantic/Jan_Mayen\"            : [\"SJ\"],\n\t\t\"Atlantic/Madeira\"              : [\"PT\"],\n\t\t\"Atlantic/Reykjavik\"            : [\"IS\"],\n\t\t\"Atlantic/South_Georgia\"        : [\"GS\"],\n\t\t\"Atlantic/St_Helena\"            : [\"SH\"],\n\t\t\"Atlantic/Stanley\"              : [\"FK\"],\n\t\t\"Australia/Adelaide\"            : [\"AU\"],\n\t\t\"Australia/Brisbane\"            : [\"AU\"],\n\t\t\"Australia/Broken_Hill\"         : [\"AU\"],\n\t\t\"Australia/Darwin\"              : [\"AU\"],\n\t\t\"Australia/Eucla\"               : [\"AU\"],\n\t\t\"Australia/Hobart\"              : [\"AU\"],\n\t\t\"Australia/Lindeman\"            : [\"AU\"],\n\t\t\"Australia/Lord_Howe\"           : [\"AU\"],\n\t\t\"Australia/Melbourne\"           : [\"AU\"],\n\t\t\"Australia/Perth\"               : [\"AU\"],\n\t\t\"Australia/Sydney\"              : [\"AU\"],\n\t\t\"Canada/Eastern\"                : [\"CA\"],\n\t\t\"Europe/Amsterdam\"              : [\"NL\"],\n\t\t\"Europe/Andorra\"                : [\"AD\"],\n\t\t\"Europe/Astrakhan\"              : [\"RU\"],\n\t\t\"Europe/Athens\"                 : [\"GR\"],\n\t\t\"Europe/Belfast\"                : [\"GB\"],\n\t\t\"Europe/Belgrade\"               : [\"RS\", \"BA\", \"HR\", \"ME\", \"MK\", \"SI\"],\n\t\t\"Europe/Berlin\"                 : [\"DE\"],\n\t\t\"Europe/Bratislava\"             : [\"SK\"],\n\t\t\"Europe/Brussels\"               : [\"BE\"],\n\t\t\"Europe/Bucharest\"              : [\"RO\"],\n\t\t\"Europe/Budapest\"               : [\"HU\"],\n\t\t\"Europe/Busingen\"               : [\"DE\"],\n\t\t\"Europe/Chisinau\"               : [\"MD\"],\n\t\t\"Europe/Copenhagen\"             : [\"DK\"],\n\t\t\"Europe/Dublin\"                 : [\"IE\"],\n\t\t\"Europe/Gibraltar\"              : [\"GI\"],\n\t\t\"Europe/Guernsey\"               : [\"GG\"],\n\t\t\"Europe/Helsinki\"               : [\"FI\", \"AX\"],\n\t\t\"Europe/Isle_of_Man\"            : [\"IM\"],\n\t\t\"Europe/Istanbul\"               : [\"TR\"],\n\t\t\"Europe/Jersey\"                 : [\"JE\"],\n\t\t\"Europe/Kaliningrad\"            : [\"RU\"],\n\t\t\"Europe/Kiev\"                   : [\"UA\"],\n\t\t\"Europe/Kirov\"                  : [\"RU\"],\n\t\t\"Europe/Lisbon\"                 : [\"PT\"],\n\t\t\"Europe/Ljubljana\"              : [\"SI\"],\n\t\t\"Europe/London\"                 : [\"GB\", \"GG\", \"IM\", \"JE\"],\n\t\t\"Europe/Luxembourg\"             : [\"LU\"],\n\t\t\"Europe/Madrid\"                 : [\"ES\"],\n\t\t\"Europe/Malta\"                  : [\"MT\"],\n\t\t\"Europe/Mariehamn\"              : [\"AX\"],\n\t\t\"Europe/Minsk\"                  : [\"BY\"],\n\t\t\"Europe/Monaco\"                 : [\"MC\"],\n\t\t\"Europe/Moscow\"                 : [\"RU\"],\n\t\t\"Europe/Oslo\"                   : [\"NO\", \"SJ\", \"BV\"],\n\t\t\"Europe/Paris\"                  : [\"FR\"],\n\t\t\"Europe/Podgorica\"              : [\"ME\"],\n\t\t\"Europe/Prague\"                 : [\"CZ\", \"SK\"],\n\t\t\"Europe/Riga\"                   : [\"LV\"],\n\t\t\"Europe/Rome\"                   : [\"IT\", \"SM\", \"VA\"],\n\t\t\"Europe/Samara\"                 : [\"RU\"],\n\t\t\"Europe/San_Marino\"             : [\"SM\"],\n\t\t\"Europe/Sarajevo\"               : [\"BA\"],\n\t\t\"Europe/Saratov\"                : [\"RU\"],\n\t\t\"Europe/Simferopol\"             : [\"RU\", \"UA\"],\n\t\t\"Europe/Skopje\"                 : [\"MK\"],\n\t\t\"Europe/Sofia\"                  : [\"BG\"],\n\t\t\"Europe/Stockholm\"              : [\"SE\"],\n\t\t\"Europe/Tallinn\"                : [\"EE\"],\n\t\t\"Europe/Tirane\"                 : [\"AL\"],\n\t\t\"Europe/Ulyanovsk\"              : [\"RU\"],\n\t\t\"Europe/Uzhgorod\"               : [\"UA\"],\n\t\t\"Europe/Vaduz\"                  : [\"LI\"],\n\t\t\"Europe/Vatican\"                : [\"VA\"],\n\t\t\"Europe/Vienna\"                 : [\"AT\"],\n\t\t\"Europe/Vilnius\"                : [\"LT\"],\n\t\t\"Europe/Volgograd\"              : [\"RU\"],\n\t\t\"Europe/Warsaw\"                 : [\"PL\"],\n\t\t\"Europe/Zagreb\"                 : [\"HR\"],\n\t\t\"Europe/Zaporozhye\"             : [\"UA\"],\n\t\t\"Europe/Zurich\"                 : [\"CH\", \"DE\", \"LI\"],\n\t\t\"GB\"                            : [\"GB\"],\n\t\t\"GB-Eire\"                       : [\"GB\"],\n\t\t\"Indian/Antananarivo\"           : [\"MG\"],\n\t\t\"Indian/Chagos\"                 : [\"IO\"],\n\t\t\"Indian/Christmas\"              : [\"CX\"],\n\t\t\"Indian/Cocos\"                  : [\"CC\"],\n\t\t\"Indian/Comoro\"                 : [\"KM\"],\n\t\t\"Indian/Kerguelen\"              : [\"TF\", \"HM\"],\n\t\t\"Indian/Mahe\"                   : [\"SC\"],\n\t\t\"Indian/Maldives\"               : [\"MV\"],\n\t\t\"Indian/Mauritius\"              : [\"MU\"],\n\t\t\"Indian/Mayotte\"                : [\"YT\"],\n\t\t\"Indian/Reunion\"                : [\"RE\", \"TF\"],\n\t\t\"NZ\"                            : [\"NZ\"],\n\t\t\"Pacific/Apia\"                  : [\"WS\"],\n\t\t\"Pacific/Auckland\"              : [\"NZ\", \"AQ\"],\n\t\t\"Pacific/Bougainville\"          : [\"PG\"],\n\t\t\"Pacific/Chatham\"               : [\"NZ\"],\n\t\t\"Pacific/Chuuk\"                 : [\"FM\"],\n\t\t\"Pacific/Easter\"                : [\"CL\"],\n\t\t\"Pacific/Efate\"                 : [\"VU\"],\n\t\t\"Pacific/Fakaofo\"               : [\"TK\"],\n\t\t\"Pacific/Fiji\"                  : [\"FJ\"],\n\t\t\"Pacific/Funafuti\"              : [\"TV\"],\n\t\t\"Pacific/Galapagos\"             : [\"EC\"],\n\t\t\"Pacific/Gambier\"               : [\"PF\"],\n\t\t\"Pacific/Guadalcanal\"           : [\"SB\"],\n\t\t\"Pacific/Guam\"                  : [\"GU\", \"MP\"],\n\t\t\"Pacific/Honolulu\"              : [\"US\", \"UM\"],\n\t\t\"Pacific/Johnston\"              : [\"UM\"],\n\t\t\"Pacific/Kanton\"                : [\"KI\"],\n\t\t\"Pacific/Kiritimati\"            : [\"KI\"],\n\t\t\"Pacific/Kosrae\"                : [\"FM\"],\n\t\t\"Pacific/Kwajalein\"             : [\"MH\"],\n\t\t\"Pacific/Majuro\"                : [\"MH\"],\n\t\t\"Pacific/Marquesas\"             : [\"PF\"],\n\t\t\"Pacific/Midway\"                : [\"UM\"],\n\t\t\"Pacific/Nauru\"                 : [\"NR\"],\n\t\t\"Pacific/Niue\"                  : [\"NU\"],\n\t\t\"Pacific/Norfolk\"               : [\"NF\"],\n\t\t\"Pacific/Noumea\"                : [\"NC\"],\n\t\t\"Pacific/Pago_Pago\"             : [\"AS\", \"UM\"],\n\t\t\"Pacific/Palau\"                 : [\"PW\"],\n\t\t\"Pacific/Pitcairn\"              : [\"PN\"],\n\t\t\"Pacific/Pohnpei\"               : [\"FM\"],\n\t\t\"Pacific/Port_Moresby\"          : [\"PG\", \"AQ\"],\n\t\t\"Pacific/Rarotonga\"             : [\"CK\"],\n\t\t\"Pacific/Saipan\"                : [\"MP\"],\n\t\t\"Pacific/Samoa\"                 : [\"WS\"],\n\t\t\"Pacific/Tahiti\"                : [\"PF\"],\n\t\t\"Pacific/Tarawa\"                : [\"KI\"],\n\t\t\"Pacific/Tongatapu\"             : [\"TO\"],\n\t\t\"Pacific/Wake\"                  : [\"UM\"],\n\t\t\"Pacific/Wallis\"                : [\"WF\"],\n\t\t\"Singapore\"                     : [\"SG\"],\n\t\t\"US/Arizona\"                    : [\"US\"],\n\t\t\"US/Hawaii\"                     : [\"US\"],\n\t\t\"US/Samoa\"                      : [\"WS\"],\n\t}\n\n\tconst timezone = Intl.DateTimeFormat().resolvedOptions().timeZone\n\n\tif (timezone === \"\" || !timezone) {\n\t\treturn null\n\t}\n\n\tlet geoLocation = {\n\t\tcountryCode: timezones[timezone][0].toUpperCase(),\n\t}\n\n\t// if the timezone is equals \"America/Los_Angeles\" then add the regionCode \"US-CA\"\n\tif (timezone === \"America/Los_Angeles\") {\n\t\tgeoLocation.regionCode = \"US-CA\"\n\t}\n\n\tif (timezone === \"Europe/Zurich\") {\n\t\tgeoLocation.regionCode = \"CH-ZH\"\n\t}\n\n\treturn geoLocation\n}\n\n\n\n\n","/**\n * Logs a message to the console if the logger is enabled.\n *\n * @module console\n * @param message\n * @param objects\n * @public\n * @returns {void}\n */\nexport const log = (message, ...objects) => {\n\n\tif (!isLoggerEnabled()) return\n\n\tif (typeof message === \"object\") {\n\t\tconsole.log(\"Pixel Manager: \", message, ...objects)\n\t} else if (objects.length) {\n\t\tconsole.log(\"Pixel Manager: \" + message, ...objects)\n\t} else {\n\t\tconsole.log(\"Pixel Manager: \" + message)\n\t}\n}\n\n/**\n * Logs an error message to the console.\n *\n * @module console\n * @param message\n * @param objects\n * @public\n * @returns {void}\n */\nexport const error = (message, ...objects) => {\n\n\t// if (!isLoggerEnabled()) return\n\n\t// if message is an object, log the keys\n\tif (typeof message === \"object\") {\n\t\tconsole.error(\"Pixel Manager: \", message, ...objects)\n\t} else if (objects.length) {\n\t\tconsole.error(\"Pixel Manager: \" + message, ...objects)\n\t} else {\n\t\tconsole.error(\"Pixel Manager: \" + message)\n\t}\n}\n\n/**\n * Checks if the logger is enabled.\n *\n * @return {boolean}\n */\nconst isLoggerEnabled = () => {\n\n\tif (urlLoggerOff()) return false\n\n\tif (sessionLoggerEnabled()) return true\n\n\tif (urlLoggerOn()) return true\n\n\treturn !!wpmDataLayer?.general?.logger?.is_active\n}\n\n/**\n * Turn off the logger if the URL parameter is set.\n *\n * @return {boolean}\n */\nconst urlLoggerOff = () => {\n\n\tif (wpm.urlHasParameter(\"pmwloggeroff\")) {\n\t\twpm.storeData(\"loggerEnabled\", false)\n\t}\n\n\treturn wpm.urlHasParameter(\"pmwloggeroff\")\n}\n\n/**\n * Check if the logger is enabled for the session.\n *\n * @return {boolean}\n */\nconst sessionLoggerEnabled = () => {\n\treturn wpm.retrieveData(\"loggerEnabled\")\n}\n\n/**\n * Turn on the logger if the URL parameter is set.\n *\n * @return {boolean}\n */\nconst urlLoggerOn = () => {\n\n\tif (wpm.urlHasParameter(\"pmwloggeron\")) {\n\t\twpm.storeData(\"loggerEnabled\", true)\n\t}\n\n\treturn wpm.urlHasParameter(\"pmwloggeron\")\n}\n","/**\n * Load all PMW functions\n *\n * Ignore event listeners. They need to be loaded after\n * we made sure that jQuery has been loaded.\n */\n\nrequire(\"./functions\")\n\n/**\n * Load consent management module as a chunk\n * @returns {Promise<void>}\n */\nwindow.wpm.loadConsentModule = async () => {\n\tconst consentModule = await import(/* webpackChunkName: \"consent-management\" */ \"./consent/consent.mjs\")\n\twindow.wpm.consent = consentModule\n\t\n\tconst apiModule = await import(/* webpackChunkName: \"consent-api\" */ \"./consent/api.mjs\")\n\twindow.pmw = window.pmw || {}\n\twindow.pmw.consent = window.pmw.consent || {}\n\twindow.pmw.consent.api = apiModule\n\t\n\treturn consentModule\n}\n\nwindow.pmw = window.pmw || {\n\tconsole: require(\"./console.mjs\"),\n}\n\nrequire(\"./ip_services\")\n\n// #if process.env.TIER === 'premium'\n// if (wpm.canLoadPremiumFeatures()) {\n// \trequire(\"./functions_premium\")\n// }\n// #endif\n","// a function that removes all \\n and \\t and html tags from a string\nconst removeHtmlTagsAndWhitespace = string => {\n\n\tstring = string.replace(/<[^>]*>?/gm, \"\").replace(/\\n/gm, \"\").replace(/\\t/gm, \"\");\n\tstring = string.trim();\n\n\treturn string;\n};\n\n/**\n * add_shipping_info event\n */\n\n// trigger when #shipping_method is changed\njQuery(\"form.woocommerce-checkout\").on(\"change\", \"#shipping_method\", (event) => {\n\n\tif (!event.target?.value) return;\n\tif (!event.target?.id) return;\n\n\ttriggerAddShippingInfoEvent({\n\t\tslug: event.target.value,\n\t\ttext: removeHtmlTagsAndWhitespace(jQuery(\"label[for='\" + event.target.id + \"']\").text()),\n\t});\n});\n\n// trigger when a shipping method is already selected on page load\njQuery(() => {\n\tif (jQuery(\"#shipping_method\").length) {\n\n\t\t// get the checked shipping method from #shipping_method\n\t\tlet checkedShippingMethod = jQuery(\"#shipping_method\").find(\":checked\");\n\n\t\t// if there is a checked shipping method\n\t\tif (checkedShippingMethod.length) {\n\n\t\t\tif (!checkedShippingMethod.val()) return;\n\t\t\tif (!checkedShippingMethod.attr(\"id\")) return;\n\n\t\t\ttriggerAddShippingInfoEvent({\n\t\t\t\tslug: checkedShippingMethod.val(),\n\t\t\t\ttext: removeHtmlTagsAndWhitespace(jQuery(\"label[for='\" + checkedShippingMethod.attr(\"id\") + \"']\").text()),\n\t\t\t});\n\t\t}\n\t}\n});\n\n// trigger when a shipping method is selected on page load\nconst triggerAddShippingInfoEvent = shippingTier => {\n\tjQuery(document).trigger(\"pmw:add-shipping-info\", {shippingTier});\n};\n\n/**\n * add_payment_info event\n */\n\n\t  // flag to prevent double logging of payment method change on pageload\nlet paymentMethodChangeLogged = false;\n\n// trigger when a payment method is selected\njQuery(\"form.woocommerce-checkout\").on(\"change\", \"input[name=\\\"payment_method\\\"]\", event => {\n\n\tif (!event.target.value) return;\n\tif (!event.target.id) return;\n\n\ttriggerAddPaymentInfoEvent({\n\t\tslug: event.target.value,\n\t\ttext: removeHtmlTagsAndWhitespace(jQuery(\"label[for='\" + event.target.id + \"']\").text()),\n\t});\n\n\tpaymentMethodChangeLogged = true;\n});\n\n// trigger when a payment method is already selected on page load\njQuery(() => {\n\n\t// prevent double logging of payment method change on pageload\n\tif (paymentMethodChangeLogged) return;\n\n\tlet checkedPaymentMethod = jQuery(\"input[name=\\\"payment_method\\\"]:checked\");\n\n\tif (checkedPaymentMethod.length) {\n\n\t\tif (!checkedPaymentMethod.val()) return;\n\t\tif (!checkedPaymentMethod.attr(\"id\")) return;\n\n\t\ttriggerAddPaymentInfoEvent({\n\t\t\tslug: checkedPaymentMethod.val(),\n\t\t\ttext: removeHtmlTagsAndWhitespace(jQuery(\"label[for='\" + checkedPaymentMethod.attr(\"id\") + \"']\").text()),\n\t\t});\n\t}\n});\n\n// trigger when a payment method is selected on page load\nconst triggerAddPaymentInfoEvent = paymentType => {\n\tjQuery(document).trigger(\"pmw:add-payment-info\", {paymentType});\n};\n\n/**\n * remove_from_cart event\n *\n * Cannot be attached directly because the mini cart doesn't necessarily contain the remove button on page load.\n */\njQuery(document).on(\"click\", \".remove_from_cart_button, .remove\", (event) => {\n\n\t// console.log(\"remove_from_cart event\" + new Date().getTime())\n\n\ttry {\n\n\t\tlet url       = new URL(jQuery(event.currentTarget).attr(\"href\"));\n\t\tlet productId = wpm.getProductIdByCartItemKeyUrl(url);\n\n\t\twpm.removeProductFromCart(productId);\n\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n\n/**\n * begin_checkout event\n *\n * Cannot be attached directly because the mini cart doesn't necessarily contain the remove button on page load.\n */\nlet checkoutButtonClasses = [\n\t// \".checkout\", // this is too generic. It triggers on the checkout page on some themes fore each interaction with the checkout form.\n\t\".checkout-button\",\n\t\".cart-checkout-button\",\n\t\".button.checkout\",\n\t\".xoo-wsc-ft-btn-checkout\", // https://xootix.com/side-cart-for-woocommerce/\n\t\".elementor-button--checkout\",\n\t\".xt_woofc-checkout\", // https://wordpress.org/plugins/woo-floating-cart-lite/\n\t\".fkcart-checkout--text\", // https://funnelkit.com/\n];\n\nconst checkoutButtonSelectors = wpm.prepareSelectors(checkoutButtonClasses, \"beginCheckout\");\n\n// https://wordpress.stackexchange.com/a/352171/68337\njQuery(document).on(\"click init_checkout\", checkoutButtonSelectors, () => {\n\tjQuery(document).trigger(\"pmw:begin-checkout\");\n});\n\njQuery(document).on(\"updated_cart_totals\", () => {\n\tjQuery(document).trigger(\"pmw:view-cart\");\n});\n\n/**\n * Set up PWM events\n */\n\n// track checkout option event: purchase click\n// https://wordpress.stackexchange.com/a/352171/68337\njQuery(document).on(\"wpmLoad\", (event) => {\n\tjQuery(document).on(\"payment_method_selected\", () => {\n\n\t\tif (false === wpm.paymentMethodSelected) {\n\t\t\twpm.fireCheckoutProgress(3);\n\t\t}\n\n\t\twpm.fireCheckoutOption(3, jQuery(\"input[name='payment_method']:checked\").val());\n\t\twpm.paymentMethodSelected = true;\n\t});\n});\n\n// populate the wpmDataLayer with the cart items\njQuery(document).on(\"wpmLoad\", () => {\n\n\ttry {\n\t\twpm.initCart();\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n// get all add-to-cart= products from backend\njQuery(document).on(\"wpmLoad\", () => {\n\n\twpmDataLayer.products = wpmDataLayer.products || {};\n\n\t// scan page for add-to-cart= links\n\tlet productIds = wpm.getAddToCartLinkProductIds();\n\n\twpm.getProductsFromBackend(productIds);\n});\n\n/**\n * Save the referrer into a cookie\n *\n * @returns {void}\n */\njQuery(document).on(\"wpmLoad\", () => {\n\n\t// If there is no referrer, then return\n\tif (!document.referrer) {\n\t\treturn;\n\t}\n\n\t// If the referrer is already stored, then return\n\tif (wpm.retrieveData(\"referrer\")) {\n\t\treturn;\n\t}\n\n\tlet referrerUrl      = new URL(document.referrer);\n\tlet referrerHostname = referrerUrl.hostname;\n\n\tif (referrerHostname !== window.location.host) {\n\t\twpm.storeData(\"referrer\", referrerHostname);\n\t}\n});\n\n/**\n * Collect parameters from the URL\n * and save them to the PMW session storage.\n * Parameters:\n * - gclid\n * - wbraid\n * - gbraid\n * - fbclid\n * - ttclid\n * - ScCid\n * - epik\n *\n * @returns {void}\n * */\njQuery(document).on(\"wpmLoad\", () => {\n\n\tlet gclid = wpm.getUrlParameter(\"gclid\");\n\tif (gclid) wpm.storeData(\"gclid\", gclid);\n\n\tlet wbraid = wpm.getUrlParameter(\"wbraid\");\n\tif (wbraid) wpm.storeData(\"wbraid\", wbraid);\n\n\tlet gbraid = wpm.getUrlParameter(\"gbraid\");\n\tif (gbraid) wpm.storeData(\"gbraid\", gbraid);\n\n\t// https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/fbp-and-fbc\n\tlet fbclid = wpm.getUrlParameter(\"fbclid\");\n\tif (fbclid) {\n\t\tfbclid = \"fb.1.\" + Math.floor(Date.now() / 1000) + \".\" + fbclid;\n\t\twpm.storeData(\"fbclid\", fbclid);\n\t}\n\n\tlet ttclid = wpm.getUrlParameter(\"ttclid\");\n\tif (ttclid) wpm.storeData(\"ttclid\", ttclid);\n\n\tlet scid = wpm.getUrlParameter(\"ScCid\");\n\tif (scid) wpm.storeData(\"scid\", scid);\n\n\tlet epik = wpm.getUrlParameter(\"epik\");\n\tif (epik) wpm.storeData(\"epik\", epik);\n});\n\n/**\n * Create our own load event in order to better handle script flow execution when JS \"optimizers\" shuffle the code.\n */\njQuery(document).on(\"wpmLoad\", () => {\n\t// document.addEventListener(\"wpmLoad\", function () {\n\ttry {\n\t\tif (typeof wpmDataLayer != \"undefined\" && !wpmDataLayer?.pmw_loaded) {\n\n\t\t\tjQuery(document).trigger(\"pmw:load-always\");\n\n\t\t\tif (wpmDataLayer?.shop) {\n\t\t\t\tif (\n\t\t\t\t\t\"product\" === wpmDataLayer.shop.page_type &&\n\t\t\t\t\t\"variable\" !== wpmDataLayer.shop.product_type &&\n\t\t\t\t\twpm.getMainProductIdFromProductPage()\n\t\t\t\t) {\n\t\t\t\t\tlet product = wpm.getProductDataForViewItemEvent(wpm.getMainProductIdFromProductPage());\n\t\t\t\tjQuery(document).trigger(\"pmw:view-item\", product);\n\t\t\t} else if (\"product_category\" === wpmDataLayer.shop.page_type) {\n\t\t\t\tjQuery(document).trigger(\"pmw:view-category\");\n\t\t\t} else if (\"search\" === wpmDataLayer.shop.page_type) {\n\t\t\t\tjQuery(document).trigger(\"pmw:search\");\n\t\t\t} else if (\"cart\" === wpmDataLayer.shop.page_type) {\n\t\t\t\tjQuery(document).trigger(\"pmw:view-cart\");\n\t\t\t} else if (\"order_received_page\" === wpmDataLayer.shop.page_type) {\n\t\t\t\tif (wpmDataLayer?.order && !wpm.isOrderIdStored(wpmDataLayer.order.id)) {\n\t\t\t\t\tjQuery(document).trigger(\"pmw:purchase\");\n\t\t\t\t\twpm.writeOrderIdToStorage(wpmDataLayer.order.id, wpmDataLayer.order.key);\n\t\t\t\t\tif (typeof wpm.acrRemoveCookie === \"function\") wpm.acrRemoveCookie();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tjQuery(document).trigger(\"pmw:everywhere-else\");\n\t\t\t}\n\t\t} else {\n\t\t\tjQuery(document).trigger(\"pmw:everywhere-else\");\n\t\t}\t\t\tif (wpmDataLayer?.user?.id && !wpm.hasLoginEventFired()) {\n\t\t\t\tjQuery(document).trigger(\"pmw:login\");\n\t\t\t\twpm.setLoginEventFired();\n\t\t\t}\n\n\t\t\twpmDataLayer.pmw_loaded = true;\n\t\t}\n\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n/**\n * Register the show_variation event listener\n * in case lazy loading is enabled\n * because we have to register it immediately\n * and not after the onready event.\n */\nif (wpmDataLayer?.general?.lazy_load_pmw) {\n\twpm.registerShowVariationEventListener();\n}\n\n/**\n * In case lazy loading is enabled\n * we need to trigger the view-item event on\n * preselected variations.\n *\n * Check if a variation is selected on a variable product page\n * and trigger the view-item event if a variation is selected\n *\n * Fallback for the jQuery(\".single_variation_wrap\").on(\"show_variation\", (event, variation) => {}) event listener\n * in case lazy loading is enabled and the event listener is not triggered.\n */\njQuery(document).on(\"wpmLoad\", () => {\n\tif (!wpmDataLayer?.general?.lazy_load_pmw) return;\n\n\ttry {\n\t\tconst $variationForm = jQuery(\".variations_form\");\n\t\tif (!$variationForm.length) return;\n\n\t\tconst selectedValues = {};\n\t\tconst allSelected    = $variationForm.find(\"select\").toArray().every(select => {\n\t\t\tconst value = jQuery(select).val();\n\t\t\tif (value) {\n\t\t\t\tselectedValues[jQuery(select).attr(\"name\")] = value;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\n\t\tif (!allSelected) return;\n\n\t\tconst productVariations = $variationForm.data(\"product_variations\");\n\t\tif (!productVariations) return;\n\n\t\tconst matchingVariation = productVariations.find(variation =>\n\t\t\tObject.entries(selectedValues).every(([key, value]) =>\n\t\t\t\tvariation.attributes[key] === value,\n\t\t\t),\n\t\t);\n\n\t\tif (matchingVariation) {\n\t\t\twpm.triggerViewItemEventPrep(matchingVariation.variation_id);\n\t\t}\n\t} catch (e) {\n\t\tpmw.console.error(e);\n\t}\n});\n\n// Check if the REST endpoint is available and log an error if it is not\njQuery(document).on(\"wpmLoad\", async () => {\n\tif (wpm.retrieveData(\"restEndpointAvailable\") === false) pmw.console.error(\"REST endpoint is not available. Using admin-ajax.php instead.\");\n});\n\n/**\n * All s2s events\n */\n\n/**\n * PageView event\n */\njQuery(document).on(\"pmw:page-view\", (event) => {\n\n\tpmw.console.log(\"pmw:page-view event fired\", {event});\n\n\t/**\n\t * Prepare the payload\n\t */\n\n\tlet payload = {\n\t\tevent: \"page_view\",\n\t\tpixels: {}\n\t};\n\n\t// Facebook\n\t// If Facebook pixel is loaded, add Facebook server to server event data to the payload\n\tif (wpmDataLayer?.pixels?.facebook?.loaded) {\n\t\tpayload.pixels.facebook = {\n\t\t\tevent_name      : \"PageView\",\n\t\t\tevent_id        : wpm.getFbRandomEventId(),\n\t\t\tuser_data       : wpm.getFbUserData(),\n\t\t\tevent_source_url: window.location.href,\n\t\t};\n\n\t\tif (wpm.retrieveData(\"referrer\")) {\n\t\t\tpayload.pixels.facebook.referrer_url = wpm.makeFullUrl(wpm.retrieveData(\"referrer\"));\n\t\t}\n\t}\n\n\t// Reddit\n\t// If Reddit pixel is loaded, add Reddit server to server event data to the payload\n\tif (wpmDataLayer?.pixels?.reddit?.loaded) {\n\t\tconst redditS2SData = wpm.getRedditS2SBaseData();\n\t\t\n\t\tpayload.pixels.reddit = {\n\t\t\t...redditS2SData,\n\t\t\tevent_id: wpm.getRandomEventId(),\n\t\t\tevent_type: {\n\t\t\t\ttracking_type: 'PageVisit'\n\t\t\t},\n\t\t\tevent_metadata: {\n\t\t\t\tconversion_id: wpm.getRandomEventId()\n\t\t\t}\n\t\t};\n\t}\n\n\t// Pinterest\n\t// https://developers.pinterest.com/docs/conversions/best/\n\t// https://developers.pinterest.com/docs/api/v5/#operation/events/create\n\t// https://developers.pinterest.com/docs/conversions/event/\n\t// if (wpmDataLayer?.pixels?.pinterest?.loaded) {\n\t//\n\t// \tpayload.pixels.pinterest = wpm.getPinterestS2SBaseData();\n\t//\n\t// \tpayload.pixels.pinterest.event_name  = \"addtocart\";\n\t// \tpayload.pixels.pinterest.custom_data = wpm.pinterestGetProductDataForCapiEvent(product);\n\t// }\n\n\t// TikTok\n\t// https://ads.tiktok.com/gateway/docs/index?identify_key=c0138ffadd90a955c1f0670a56fe348d1d40680b3c89461e09f78ed26785164b&language=ENGLISH&doc_id=1739585702922241#item-link-Adding%20parameters%20to%20event%20code\n\t// if (wpmDataLayer?.pixels?.tiktok?.loaded) {\n\t// \tpayload.pixels.tiktok = {\n\t// \t\tevent     : \"AddToCart\",\n\t// \t\tevent_id  : wpm.getRandomEventId(),\n\t// \t\tuser      : wpm.tiktokGetEventUserData(),\n\t// \t\tpage      : wpm.tiktokGetEventPageData(),\n\t// \t\tproperties: {\n\t// \t\t\tvalue       : product.price * product.quantity,\n\t// \t\t\tcurrency    : product.currency,\n\t// \t\t\tcontent_type: \"product\",\n\t// \t\t\tcontents    : [{\n\t// \t\t\t\tcontent_id  : wpm.getProductIdForSpecificPixel(product, \"tiktok\"),\n\t// \t\t\t\tcontent_name: product.name,\n\t// \t\t\t\tquantity    : product.quantity,\n\t// \t\t\t\tprice       : product.price,\n\t// \t\t\t}],\n\t// \t\t},\n\t// \t};\n\t// }\n\n\t// Snapchat\n\t// https://docs.snap.com/api/marketing-api/Conversions-API/Parameters\n\t// https://businesshelp.snapchat.com/s/article/pixel-direct-implementation\n\tif (wpmDataLayer?.pixels?.snapchat?.loaded) {\n\t\tpayload.pixels.snapchat             = wpm.getSnapchatS2SBaseData();\n\t\tpayload.pixels.snapchat.event_name  = \"PAGE_VIEW\";\n\t}\n\n\t/**\n\t * Process the client-to-server event\n\t */\n\n\tjQuery(document).trigger(\"pmw:s2s:page-view\", payload);\n\n\t/**\n\t * Process the server-to-server event\n\t */\n\n\tif (wpmDataLayer?.general?.server_2_server?.pageview_event_s2s?.is_active) {\n\t\t// Extract S2S data (flattens pixels.reddit to reddit)\n\t\tconst s2sData = wpm.extractS2SData(payload);\n\t\t\n\t\tif (Object.keys(s2sData).length > 1) { // More than just 'event' key\n\t\t\twpm.sendEventPayloadToServer(s2sData);\n\t\t}\n\t}\n});\n\n/**\n * Add to cart event\n * \n * Uses the new unified event processing system with filters\n */\njQuery(document).on(\"pmw:add-to-cart\", async (event, product) => {\n\n\tpmw.console.log(\"pmw:add-to-cart event fired\", {event, product});\n\n\t// Use the new unified event processor\n\tawait wpm.processEvent('add_to_cart', {\n\t\tproduct: product\n\t});\n});\n\n/**\n * Remove from cart event\n * Uses the new unified event processing system with filters\n */\njQuery(document).on(\"pmw:remove-from-cart\", async (event, product) => {\n\n\tpmw.console.log(\"pmw:remove-from-cart event fired\", {event, product});\n\n\t// Use the new unified event processor\n\tawait wpm.processEvent('remove_from_cart', {\n\t\tproduct: product\n\t});\n});\n\n/**\n * Select item event\n * Uses the new unified event processing system with filters\n */\njQuery(document).on(\"pmw:select-item\", async (event, product) => {\n\n\tpmw.console.log(\"pmw:select-item event fired\", {event, product});\n\n\t// Use the new unified event processor\n\tawait wpm.processEvent('select_item', {\n\t\tproduct: product\n\t});\n});\n\n/**\n * Begin checkout event\n */\njQuery(document).on(\"pmw:begin-checkout\", (event) => {\n\n\tpmw.console.log(\"pmw:begin-checkout event fired\", {event});\n\n\t/**\n\t * Process the event through the unified event processor\n\t */\n\twpm.processEvent(\"begin_checkout\", {});\n});\n\n/**\n * Add Payment Info\n */\njQuery(document).on(\"pmw:add-payment-info\", (event) => {\n\n\tpmw.console.log(\"pmw:add-payment-info event fired\", {event});\n\n\t/**\n\t * Process the event through the unified event processor\n\t */\n\twpm.processEvent(\"add_payment_info\", {});\n});\n\n/**\n * Add to wishlist event\n */\njQuery(document).on(\"pmw:add-to-wishlist\", (event, product) => {\n\n\tpmw.console.log(\"pmw:add-to-wishlist event fired\", {event, product});\n\n\t/**\n\t * Prepare the payload\n\t */\n\n\tlet payload = {\n\t\tevent  : \"add_to_wishlist\",\n\t\tproduct: product,\n\t\tpixels: {}\n\t};\n\n\t// Facebook\n\tif (wpmDataLayer?.pixels?.facebook?.loaded) {\n\t\tpayload.pixels.facebook = {\n\t\t\tevent_name      : \"AddToWishlist\",\n\t\t\tevent_id        : wpm.getFbRandomEventId(),\n\t\t\tuser_data       : wpm.getFbUserData(),\n\t\t\tevent_source_url: window.location.href,\n\t\t\tcustom_data     : wpm.fbGetProductDataForCapiEvent(product),\n\t\t};\n\n\t\tif (wpm.retrieveData(\"referrer\")) {\n\t\t\tpayload.pixels.facebook.referrer_url = wpm.makeFullUrl(wpm.retrieveData(\"referrer\"));\n\t\t}\n\t}\n\n\t// TikTok\n\tif (wpmDataLayer?.pixels?.tiktok?.loaded) {\n\t\tpayload.pixels.tiktok = {\n\t\t\tevent     : \"AddToWishlist\",\n\t\t\tevent_id  : wpm.getRandomEventId(),\n\t\t\tuser      : wpm.tiktokGetEventUserData(),\n\t\t\tpage      : wpm.tiktokGetEventPageData(),\n\t\t\tproperties: {\n\t\t\t\tvalue       : product.price * product.quantity,\n\t\t\t\tcurrency    : product.currency,\n\t\t\t\tcontent_type: \"product\",\n\t\t\t\tcontents    : [{\n\t\t\t\t\tcontent_id  : wpm.getProductIdForSpecificPixel(product, \"tiktok\"),\n\t\t\t\t\tcontent_name: product.name,\n\t\t\t\t\tquantity    : product.quantity,\n\t\t\t\t\tprice       : product.price,\n\t\t\t\t}],\n\t\t\t},\n\t\t};\n\t}\n\n\t// Snapchat\n\t// https://docs.snap.com/api/marketing-api/Conversions-API/Parameters\n\t// https://businesshelp.snapchat.com/s/article/pixel-direct-implementation\n\tif (wpmDataLayer?.pixels?.snapchat?.loaded) {\n\t\tpayload.pixels.snapchat             = wpm.getSnapchatS2SBaseData();\n\t\tpayload.pixels.snapchat.event_name  = \"ADD_TO_WISHLIST\";\n\t\tpayload.pixels.snapchat.custom_data = wpm.getSnapchatCustomDataForProduct(product);\n\t}\n\n\t/**\n\t * Process the client-to-server event\n\t */\n\n\tjQuery(document).trigger(\"pmw:s2s:add-to-wishlist\", payload);\n\n\t/**\n\t * Process the server-to-server event\n\t */\n\n\twpm.sendEventPayloadToServer(payload);\n});\n\n/**\n * View Item event\n */\njQuery(document).on(\"pmw:view-item\", (event, product = null) => {\n\n\tpmw.console.log(\"pmw:view-item event fired\", {event, product});\n\n\t/**\n\t * Process the event through the unified event processor\n\t */\n\twpm.processEvent(\"view_item\", {\n\t\tproduct: product,\n\t});\n});\n\n/**\n * View category event\n */\njQuery(document).on(\"pmw:view-category\", (event, product = null) => {\n\n\tpmw.console.log(\"pmw:view-category event fired\", {event, product});\n\n\t/**\n\t * Prepare the payload\n\t */\n\n\tlet payload = {\n\t\tevent: \"view_category\",\n\t\tpixels: {}\n\t};\n\n\t// Pinterest\n\t// https://developers.pinterest.com/docs/conversions/best/\n\t// https://developers.pinterest.com/docs/api/v5/#operation/events/create\n\t// https://developers.pinterest.com/docs/conversions/event/\n\tif (wpmDataLayer?.pixels?.pinterest?.loaded) {\n\n\t\tpayload.pixels.pinterest = wpm.getPinterestS2SBaseData();\n\n\t\tpayload.pixels.pinterest.event_name = \"viewcategory\";\n\t}\n\n\t/**\n\t * Process the client-to-server event\n\t */\n\n\tjQuery(document).trigger(\"pmw:s2s:view-category\", payload);\n\n\t/**\n\t * Process the server-to-server event\n\t */\n\n\twpm.sendEventPayloadToServer(payload);\n});\n\n/**\n * Search event\n */\njQuery(document).on(\"pmw:search\", (event) => {\n\n\tpmw.console.log(\"pmw:search event fired\", {event});\n\n\t/**\n\t * Process the event through the unified event processor\n\t */\n\twpm.processEvent(\"search\", {});\n});\n\n/**\n * Place order event\n */\njQuery(document).on(\"pmw:place-order\", (event) => {\n\n\tpmw.console.log(\"pmw:place-order event fired\", {event});\n\n\t/**\n\t * Prepare the payload\n\t */\n\n\tlet payload = {\n\t\tevent: \"place_order\",\n\t\tpixels: {}\n\t};\n\n\t// TikTok\n\tif (wpmDataLayer?.pixels?.tiktok?.loaded) {\n\t\tpayload.pixels.tiktok = {\n\t\t\tevent     : \"PlaceAnOrder\",\n\t\t\tevent_id  : wpm.getRandomEventId(),\n\t\t\tuser      : wpm.tiktokGetEventUserData(),\n\t\t\tpage      : wpm.tiktokGetEventPageData(),\n\t\t\tproperties: wpm.tiktokGetPropertiesFromCart(),\n\t\t};\n\t}\n\n\t/**\n\t * Process the client-to-server event\n\t */\n\n\tjQuery(document).trigger(\"pmw:s2s:place-order\", payload);\n\n\t/**\n\t * Process the server-to-server event\n\t */\n\n\twpm.sendEventPayloadToServer(payload);\n});\n\n/**\n * Purchase event\n */\njQuery(document).on(\"pmw:purchase\", async (event) => {\n\n\tpmw.console.log(\"pmw:purchase event fired\", {event});\n\t\n\t// Use the unified event processor\n\tawait wpm.processEvent('purchase', {\n\t\torder: wpmDataLayer.order\n\t});\n});\n\n/**\n * Login event\n */\njQuery(document).on(\"pmw:login\", () => {\n\n\tpmw.console.log(\"pmw:login event fired\");\n\n\t/**\n\t * Prepare the payload\n\t */\n\n\tlet payload = {\n\t\tevent: \"login\",\n\t\tpixels: {}\n\t};\n\n\t// Snapchat\n\t// https://docs.snap.com/api/marketing-api/Conversions-API/Parameters\n\t// https://businesshelp.snapchat.com/s/article/pixel-direct-implementation\n\tif (wpmDataLayer?.pixels?.snapchat?.loaded) {\n\t\tpayload.pixels.snapchat            = wpm.getSnapchatS2SBaseData();\n\t\tpayload.pixels.snapchat.event_name = \"LOGIN\";\n\t}\n\n\t/**\n\t * Process the client-to-server event\n\t */\n\n\tjQuery(document).trigger(\"pmw:s2s:login\", payload);\n\n\t/**\n\t * Process the server-to-server event\n\t */\n\n\twpm.sendEventPayloadToServer(payload);\n});\n\n/**\n * Run WooCommerce specific functions\n */\njQuery(document).on(\"pmw:ready\", async () => {\n\n\t// Only run if WooCommerce is active\n\tif (!wpm.isWooCommerceActive()) {\n\t\treturn;\n\t}\n\n\t/**\n\t * Run as soon as wpm namespace is loaded\n\t */\n\n\t// Watch for products visible in viewport\n\twpm.startIntersectionObserverToWatch();\n\n\t// Watch for lazy loaded products\n\twpm.startProductsMutationObserverToWatch();\n});\n\njQuery(document).on(\"pmw:load-pixels\", () => {\n\twpm.waitForPixelsAndTriggerPageView();\n});\n","/**\n * Pixel Registry\n *\n * Central registry for managing pixel configurations and adapters.\n * Provides methods to query which pixels are active and retrieve their adapters.\n *\n * @since 1.51.0\n */\n\n(function (wpm, $, undefined) {\n\n\t/**\n\t * Pixel Registry namespace\n\t */\n\twpm.pixelRegistry = {\n\n\t\t/**\n\t\t * Get all active pixels (both browser-only and S2S-capable)\n\t\t *\n\t\t * Queries each registered adapter's isActive function to determine\n\t\t * if the pixel should be loaded based on wpmDataLayer configuration.\n\t\t *\n\t\t * @returns {string[]} Array of active pixel names\n\t\t */\n\t\tgetActivePixels() {\n\t\t\tconst activePixels = [];\n\n\t\t\tif (!wpm.pixelCapabilities) {\n\t\t\t\treturn activePixels;\n\t\t\t}\n\n\t\t\t// Check each registered pixel's isActive function\n\t\t\tfor (const [pixelName, capabilities] of Object.entries(wpm.pixelCapabilities)) {\n\t\t\t\tif (typeof capabilities.isActive === \"function\") {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (capabilities.isActive()) {\n\t\t\t\t\t\t\tactivePixels.push(pixelName);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tpmw.console.error(`Error checking if ${pixelName} is active:`, e);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn activePixels;\n\t\t},\n\n\t\t/**\n\t\t * Get browser-only pixels (pixels that don't support S2S)\n\t\t *\n\t\t * @returns {string[]} Array of browser-only pixel names\n\t\t */\n\t\tgetActiveBrowserOnlyPixels() {\n\t\t\tconst browserPixels = [];\n\t\t\tconst activePixels  = this.getActivePixels();\n\n\t\t\tfor (const pixelName of activePixels) {\n\t\t\t\t// If pixel doesn't support S2S, it's browser-only\n\t\t\t\tif (wpm.pixelCapabilities?.[pixelName]?.supportsS2S !== true) {\n\t\t\t\t\tbrowserPixels.push(pixelName);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn browserPixels;\n\t\t},\n\n\t\t/**\n\t\t * Get S2S-capable pixels\n\t\t *\n\t\t * Returns pixels that declared supportsS2S capability when registering.\n\t\t * These pixels ALWAYS receive the pmw:s2s:* events to fire their browser pixels (fbq, ttq, etc.),\n\t\t * regardless of whether S2S is actually enabled. They handle their own S2S logic internally.\n\t\t *\n\t\t * @returns {string[]} Array of S2S pixel names\n\t\t */\n\t\tgetActiveS2SPixels() {\n\t\t\tconst s2sPixels    = [];\n\t\t\tconst activePixels = this.getActivePixels();\n\n\t\t\t// Check each active pixel's capabilities\n\t\t\tfor (const pixelName of activePixels) {\n\t\t\t\t// Check if this pixel declared supportsS2S capability when registering\n\t\t\t\tif (wpm.pixelCapabilities?.[pixelName]?.supportsS2S === true) {\n\t\t\t\t\ts2sPixels.push(pixelName);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn s2sPixels;\n\t\t},\n\n\t\t/**\n\t\t * Get adapter for a specific pixel\n\t\t *\n\t\t * @param {string} pixelName - The pixel name (e.g., 'facebook', 'google_ads')\n\t\t * @returns {object|null} The adapter object or null if not found\n\t\t */\n\t\tgetAdapter(pixelName) {\n\t\t\tif (!wpm.adapters) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn wpm.adapters[pixelName] || null;\n\t\t},\n\t};\n\n}(window.wpm = window.wpm || {}, jQuery));\n","(function (wpm, $, undefined) {\n\n\twpm.jQueryExists = async () => new Promise(resolve => {\n\n\t\t(function waitForjQuery() {\n\t\t\tif (typeof jQuery !== \"undefined\") return resolve()\n\t\t\tsetTimeout(waitForjQuery, 100)\n\t\t})()\n\t})\n\n\twpm.waitForLibrary = (library, timeout = 5000, interval = 100) => {\n\n\t\tconst startTime = Date.now()\n\t\twhile (typeof window[library] === \"undefined\") {\n\t\t\t// Check if timeout in milliseconds has passed\n\t\t\tif (Date.now() - startTime > timeout) {\n\t\t\t\tbreak // Maximum wait time reached, exit the loop\n\t\t\t}\n\t\t\t// Wait for the interval in milliseconds before checking again\n\t\t\tsetTimeout(() => {\n\t\t\t}, interval)\n\t\t}\n\t}\n\n\twpm.wpmDataLayerFullyLoaded = async () => {\n\n\t\t// Promise that checks if the nested object wpmDataLayer.version is defined.\n\t\t// If so, resolve.\n\t\t// We must check for the nested object wpmDataLayer.version,\n\t\t// because the wpmDataLayer object can be defined early by adding products to the data layer through\n\t\t// template inline scripts. So we need to wait until the wpmDataLayer configuration objects\n\t\t// are defined.\n\t\tlet checkVar = new Promise((resolve) => {\n\t\t\t(function waitForVar() {\n\t\t\t\tif (\n\t\t\t\t\ttypeof wpmDataLayer !== \"undefined\"\n\t\t\t\t\t&& typeof wpmDataLayer.version !== \"undefined\"\n\t\t\t\t) {\n\t\t\t\t\treturn resolve()\n\t\t\t\t}\n\t\t\t\tsetTimeout(waitForVar, 100)\n\t\t\t})()\n\t\t})\n\n\t\t// Set a timeout to log a message after 6 seconds\n\t\tlet logTimeoutId = setTimeout(() => {\n\t\t\tconsole.error(\"Pixel Manager error: The wpmDataLayer is not defined. Please make sure that the wpmDataLayer script snippet is inserted and not modified by any third-party plugin, such as a consent management platform or a JavaScript optimizer.\")\n\n\t\t}, 6000)\n\n\t\tcheckVar.then(() => {\n\t\t\tclearTimeout(logTimeoutId)\n\t\t})\n\n\t\treturn checkVar\n\t}\n\n\twpm.wpHooksExists = async () => new Promise(resolve => {\n\t\t(function waitForVar() {\n\n\t\t\t// Resolve if wp.hooks is defined\n\t\t\tif (typeof wp !== \"undefined\" && typeof wp.hooks !== \"undefined\") return resolve()\n\t\t\tsetTimeout(waitForVar, 50)\n\t\t})()\n\t})\n\n\t/**\n\t * Load all WooCommerce hooks functions\n\t *\n\t * Includes safeguard in case the user changed the default load order for wp-hooks, or removed it completely.\n\t *\n\t * @returns {Promise<void>}\n\t */\n\twpm.loadWcHooksFunctions = async () => {\n\t\t// Load all WooCommerce Blocks hooks\n\t\tawait wpm.wpHooksExists()\n\t\tawait import(/* webpackChunkName: \"wc-hooks\" */ \"./wc_hooks\")\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery))\n","/**\n * WordPress-style hooks system for Pixel Manager\n *\n * Provides a filter API that allows developers to modify event data\n * at various points in the event processing pipeline.\n *\n * @since 1.51.0\n */\n\n(function (wpm, $, undefined) {\n\n\t// Initialize pmw namespace if it doesn't exist\n\twindow.pmw = window.pmw || {};\n\n\t/**\n\t * Hook system for filtering event data\n\t */\n\tpmw.hooks = {\n\t\tfilters: {},\n\n\t\t/**\n\t\t * Add a filter callback\n\t\t *\n\t\t * @param {string} hookName - The filter hook name (e.g., 'pmw_event_payload')\n\t\t * @param {string} namespace - Unique identifier for your filter (e.g., 'my-plugin')\n\t\t * @param {function} callback - The filter function that modifies the value\n\t\t * @param {number} priority - Execution order, lower numbers run first (default: 10)\n\t\t *\n\t\t * @example\n\t\t * pmw.hooks.addFilter('pmw_pixel_data_facebook', 'my-plugin', (data) => {\n\t\t *   data.custom_param = 'my_value';\n\t\t *   return data;\n\t\t * }, 10);\n\t\t */\n\t\taddFilter: function (hookName, namespace, callback, priority = 10) {\n\t\t\tif (!hookName || typeof hookName !== \"string\") {\n\t\t\t\tpmw.console.error(\"Invalid hook name provided to addFilter\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!namespace || typeof namespace !== \"string\") {\n\t\t\t\tpmw.console.error(\"Invalid namespace provided to addFilter\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (typeof callback !== \"function\") {\n\t\t\t\tpmw.console.error(\"Invalid callback provided to addFilter\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!this.filters[hookName]) {\n\t\t\t\tthis.filters[hookName] = [];\n\t\t\t}\n\n\t\t\tthis.filters[hookName].push({\n\t\t\t\tnamespace: namespace,\n\t\t\t\tcallback : callback,\n\t\t\t\tpriority : priority,\n\t\t\t});\n\n\t\t\t// Sort by priority (ascending order)\n\t\t\tthis.filters[hookName].sort((a, b) => a.priority - b.priority);\n\n\t\t\tpmw.console.log(`Filter added: ${hookName} (${namespace}) with priority ${priority}`);\n\t\t},\n\n\t\t/**\n\t\t * Apply all registered filters to a value\n\t\t *\n\t\t * @param {string} hookName - The filter hook name\n\t\t * @param {*} value - The value to filter\n\t\t * @param {...*} args - Additional arguments passed to filter callbacks\n\t\t * @returns {*} The filtered value\n\t\t *\n\t\t * @example\n\t\t * let payload = pmw.hooks.applyFilters('pmw_event_payload_pre', payload, eventName);\n\t\t */\n\t\tapplyFilters: function (hookName, value, ...args) {\n\t\t\tif (!this.filters[hookName] || this.filters[hookName].length === 0) {\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t\tlet filteredValue = value;\n\n\t\t\tfor (const filter of this.filters[hookName]) {\n\t\t\t\ttry {\n\t\t\t\t\tconst result = filter.callback(filteredValue, ...args);\n\n\t\t\t\t\t// Ensure callback returns a value\n\t\t\t\t\tif (result !== undefined) {\n\t\t\t\t\t\tfilteredValue = result;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpmw.console.warn(`Filter ${filter.namespace} on ${hookName} returned undefined, keeping previous value`);\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\tpmw.console.error(`Filter error in ${filter.namespace} on ${hookName}:`, e);\n\t\t\t\t\t// Continue with the previous value if this filter fails\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn filteredValue;\n\t\t},\n\n\t\t/**\n\t\t * Remove a specific filter\n\t\t *\n\t\t * @param {string} hookName - The filter hook name\n\t\t * @param {string} namespace - The namespace of the filter to remove\n\t\t *\n\t\t * @example\n\t\t * pmw.hooks.removeFilter('pmw_pixel_data_facebook', 'my-plugin');\n\t\t */\n\t\tremoveFilter: function (hookName, namespace) {\n\t\t\tif (!this.filters[hookName]) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst initialLength    = this.filters[hookName].length;\n\t\t\tthis.filters[hookName] = this.filters[hookName].filter(f => f.namespace !== namespace);\n\n\t\t\tif (this.filters[hookName].length < initialLength) {\n\t\t\t\tpmw.console.log(`Filter removed: ${hookName} (${namespace})`);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Remove all filters for a specific hook\n\t\t *\n\t\t * @param {string} hookName - The filter hook name\n\t\t */\n\t\tremoveAllFilters: function (hookName) {\n\t\t\tif (this.filters[hookName]) {\n\t\t\t\tdelete this.filters[hookName];\n\t\t\t\tpmw.console.log(`All filters removed for: ${hookName}`);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Check if a specific hook has any filters\n\t\t *\n\t\t * @param {string} hookName - The filter hook name\n\t\t * @param {string} namespace - Optional: check for a specific namespace\n\t\t * @returns {boolean}\n\t\t */\n\t\thasFilter: function (hookName, namespace = null) {\n\t\t\tif (!this.filters[hookName] || this.filters[hookName].length === 0) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (namespace) {\n\t\t\t\treturn this.filters[hookName].some(f => f.namespace === namespace);\n\t\t\t}\n\n\t\t\treturn true;\n\t\t},\n\n\t\t/**\n\t\t * Get all registered filters for a hook\n\t\t *\n\t\t * @param {string} hookName - The filter hook name\n\t\t * @returns {Array} Array of filter objects\n\t\t */\n\t\tgetFilters: function (hookName) {\n\t\t\treturn this.filters[hookName] || [];\n\t\t},\n\t};\n\n\t// Backward compatibility: create wpm.hooks as an alias to pmw.hooks\n\twpm.hooks = pmw.hooks;\n\n}(window.wpm = window.wpm || {}, jQuery));\n","(function (wpm, $, undefined) {\n\n\tconst PMW_LIBRARY_VERSION = \"1.52.0\"\n\n\twpm.getLibraryVersion = () => {\n\t\treturn PMW_LIBRARY_VERSION\n\t}\n\n\twpm.checkLibraryVersion = () => {\n\n\t\tif (wpm.getLibraryVersion() !== wpmDataLayer?.version?.number) {\n\t\t\tconsole.error(`Pixel Manager: The library version ${wpm.getLibraryVersion()} and wpmDataLayer.version.number ${wpmDataLayer.version.number} do not match. Delete the server-side cache and try again.`)\n\t\t}\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery))\n\n","/**\n * IP functions\n */\n\n(function (wpm, $, undefined) {\n\n\tconst {isRange, isIP, isV4, isV6, version: getIpVersion} = require(\"range_check\")\n\n\tconst ipServices = {\n\t\t\"cloudflare\": {\n\t\t\t\"any\": \"https://www.cloudflare.com/cdn-cgi/trace\",\n\t\t},\n\t\t// icanhazip seems to regularly be added to malware databases, despite being a legitimate service run by Cloudflare\n\t\t// https://blog.apnic.net/2021/06/17/how-a-small-free-ip-tool-survived/\n\t\t// https://major.io/p/a-new-future-for-icanhazip/\n\t\t// https://major.io/p/extra-icanhaz-services-going-offline/\n\t\t\"icanhazip\"   : {\n\t\t\t\"4\"  : \"https://ipv4.icanhazip.com\",\n\t\t\t\"6\"  : \"https://ipv6.icanhazip.com\",\n\t\t\t\"any\": \"https://icanhazip.com\",\n\t\t},\n\t\t\"ipinfo\"      : {\n\t\t\t\"any\": \"https://ipinfo.io/ip\",\n\t\t},\n\t\t\"myexternalip\": {\n\t\t\t\"any\": \"https://myexternalip.com/raw\",\n\t\t\t// \"6\": \"https://api-ipv6.myexternalip.com/raw\", // This can return an IPv4 address, so we can't use it\n\t\t},\n\t\t\"ipify\"       : {\n\t\t\t\"4\"  : \"https://api4.ipify.org\",\n\t\t\t\"6\"  : \"https://api6.ipify.org\",\n\t\t\t\"any\": \"https://api64.ipify.org\", // If IPv6 is available, AND the client is configured to prefer IPv6, this will return an IPv6 address\n\t\t},\n\t\t// Can't use amazon because its CORS policy blocks requests from the browser\n\t\t// \"amazon\"    : {\n\t\t// \t\"any\": \"https://checkip.amazonaws.com/\",\n\t\t// },\n\t\t// Can't use ip.sb because its CORS policy blocks requests from the browser\n\t\t// \"ip.sb\"     : {\n\t\t// \t\"any\": \"https://api.ip.sb/ip\",\n\t\t// },\n\t\t// Can't use seeip because its CORS policy blocks requests from the browser\n\t\t// \"seeip\"       : {\n\t\t// \t\"any\": \"https://api.seeip.org\",\n\t\t// \t\"4\": \"https://ipv4.seeip.org\",\n\t\t// \t\"6\": \"https://ipv6.seeip.org\",\n\t\t// },\n\t}\n\n\twpm.getGeoInfo = {\n\n\t\tcloudflare: async () => {\n\n\t\t\tconst response = await fetch(\"https://www.cloudflare.com/cdn-cgi/trace\")\n\n\t\t\tif (!response.ok) throw new Error(`The response from Cloudflare was not OK. Status: ${response.status}`)\n\n\t\t\tlet data = await response.text()\n\n\t\t\tif (!data) throw new Error(\"No data was returned from Cloudflare\")\n\n\t\t\t// Convert key-value pairs to JSON\n\t\t\t// https://stackoverflow.com/a/39284735/452587\n\t\t\tdata = data\n\t\t\t\t.trim()\n\t\t\t\t.split(\"\\n\")\n\t\t\t\t.reduce((obj, pair) => {\n\t\t\t\t\tpair = pair.split(\"=\")\n\t\t\t\t\treturn obj[pair[0]] = pair[1], obj\n\t\t\t\t}, {})\n\n\t\t\tif (!data.ip || !data.loc) throw new Error(\"The JSON data is missing the ip or loc key from Cloudflare\")\n\n\t\t\t/**\n\t\t\t * Cloudflare doesn't return the region.\n\t\t\t * If the website manager has set a region such as California in the restricted_regions array,\n\t\t\t * we have to validate the region. This is not possible with the data from Cloudflare.\n\t\t\t * So we have to abort the process and give the other services a chance to return the region.\n\t\t\t */\n\t\t\tif (processRegion(data.loc)) throw new Error(\"We have to validate the region, and this service is not returning the region.\")\n\n\t\t\treturn {\n\t\t\t\tip         : data.ip,\n\t\t\t\tcountryCode: data.loc,\n\t\t\t\tservice    : \"cloudflare\",\n\t\t\t}\n\t\t},\n\n\t\tgeojs: async () => {\n\n\t\t\tconst response = await fetch(\"https://get.geojs.io/v1/ip/geo.json\")\n\n\t\t\tif (!response.ok) throw new Error(`The response from geojs was not OK. Status: ${response.status}`)\n\n\t\t\tlet data = await response.json()\n\n\t\t\tif (!data) throw new Error(\"No JSON data was returned from geojs\")\n\t\t\tif (!data.ip || !data.country_code || !data.region) throw new Error(\"The JSON data is missing the ip, country_code, or region key from geojs\")\n\n\t\t\treturn {\n\t\t\t\tip         : data.ip,\n\t\t\t\tcountryCode: data.country_code,\n\t\t\t\tregion     : data.region,\n\t\t\t\tservice    : \"geojs\",\n\t\t\t}\n\t\t},\n\n\t\tipinfo: async () => {\n\n\t\t\tconst response = await fetch(\"https://ipinfo.io/json\")\n\n\t\t\tif (!response.ok) throw new Error(`The response from ipinfo was not OK from ipinfo. Status: ${response.status}`)\n\n\t\t\tlet data = await response.json()\n\n\t\t\tif (!data) throw new Error(\"No JSON data was returned from ipinfo\")\n\t\t\tif (!data.ip || !data.country || !data.region) throw new Error(\"The JSON data is missing the ip, country, or region key from ipinfo\")\n\n\t\t\treturn {\n\t\t\t\tip         : data.ip,\n\t\t\t\tcountryCode: data.country,\n\t\t\t\tregion     : data.region,\n\t\t\t\tservice    : \"ipinfo\",\n\t\t\t}\n\t\t},\n\n\t\tipapi: async () => {\n\n\t\t\tconst response = await fetch(\"https://ipapi.co/json\")\n\n\t\t\tif (!response.ok) throw new Error(`The response from ipapi was not OK. Status: ${response.status}`)\n\n\t\t\tlet data = await response.json()\n\n\t\t\tif (!data) throw new Error(\"No JSON data was returned from ipapi\")\n\t\t\tif (!data.ip || !data.country || !data.region) throw new Error(\"The JSON data is missing the ip, country, or region key from ipapi\")\n\n\t\t\treturn {\n\t\t\t\tip         : data.ip,\n\t\t\t\tcountryCode: data.country,\n\t\t\t\tregion     : data.region,\n\t\t\t\tservice    : \"ipapi\",\n\t\t\t}\n\t\t},\n\t}\n\n\t/**\n\t * /**\n\t * Cloudflare doesn't return the region.\n\t * If the website manager has set a region such as California in the restricted_regions array,\n\t * we have to validate the region. This is not possible with the data from Cloudflare.\n\t * So we have to abort the process and give the other services a chance to return the region.\n\t *\n\t * If the country code is US,\n\t * and the restricted_regions array contains \"US-CA\" or \"US-VA\",\n\t * we must process the region.\n\t *\n\t * @param countryCode\n\t * @returns {boolean}\n\t */\n\tconst processRegion = (countryCode) => {\n\n\t\tif (countryCode !== \"US \") return false\n\n\t\tconst regionsToCheck = [\"US-CA\", \"US-VA\"]\n\n\t\treturn regionsToCheck.some(region =>\n\t\t\twpmDataLayer?.general?.consent_management.restricted_regions.includes(region),\n\t\t)\n\t}\n\n\t/**\n\t * Check if the visitor is allowed to trigger server-to-server events\n\t * This checks both bot user-agent patterns and custom IP exclusion list\n\t *\n\t * @returns {Promise<boolean>} True if the visitor is allowed\n\t */\n\twpm.isVisitorAllowed = async () => {\n\n\t\t// Check the cache if visitor is allowed\n\t\tif (wpm.retrieveData(\"visitorAllowed\") !== null && wpm.retrieveData(\"visitorAllowed\") !== undefined) {\n\t\t\treturn !!JSON.parse(wpm.retrieveData(\"visitorAllowed\"))\n\t\t}\n\n\t\t// Check if user agent is a bot\n\t\tif (isBotUserAgent()) {\n\t\t\twpm.storeData(\"visitorAllowed\", false)\n\t\t\treturn false\n\t\t}\n\n\t\t// Check if IP is on the exclusion list (if custom exclusions are defined)\n\t\tif (Array.isArray(wpmDataLayer?.general?.server_2_server?.ip_exclude_list) \n\t\t\t&& wpmDataLayer.general.server_2_server.ip_exclude_list.length > 0) {\n\t\t\t\n\t\t\tconst ip = await wpm.getIp()\n\t\t\t\n\t\t\tif (isOnIpExclusionList(ip)) {\n\t\t\t\twpm.storeData(\"visitorAllowed\", false)\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\n\t\t// If not a bot and not on IP exclusion list, visitor is allowed\n\t\twpm.storeData(\"visitorAllowed\", true)\n\t\treturn true\n\t}\n\n\twpm.getIp = async (ipVersion = \"any\", maxServicesToCheck = 3) => {\n\n\t\tconst validVersions = [\"any\", \"4\", \"6\"]\n\n\t\t// return null if the version is not valid and console log an error\n\t\tif (!validVersions.includes(ipVersion)) {\n\t\t\tconsole.error(\"The version argument must be one of the following: \" + validVersions.join(\", \"))\n\t\t\treturn null\n\t\t}\n\n\t\tif (ipVersion === \"any\" && wpm.retrieveData(\"ip\")) {\n\t\t\treturn wpm.retrieveData(\"ip\")\n\t\t}\n\n\t\t// Get the ipv data from the cache\n\t\tconst ipv = wpm.retrieveData(`ipv${ipVersion}`)\n\n\t\t// Return it if it is not undefined\n\t\t// The value can be an IP\n\t\t// or null if we ran the test but no IP could be retrieved\n\t\t// It is undefined if the ipVersion was not tested yet\n\t\tif (ipv !== undefined) return ipv\n\n\t\tpmw.console.log(\"Testing the IP address of the browser because one ore more server-to-server APIs are enabled and require the browser IP. It may trigger connection request errors in the console while testing the IP address. This is normal and expected behavior.\")\n\n\t\ttry {// Check the cache if the IP is already stored\n\n\t\t\tconst ip = await wpm.getIpFromAnyService(ipVersion, maxServicesToCheck)\n\n\t\t\t// if (!isIP(ip)) throw new Error(\"The returned value is not an IP address\")\n\n\t\t\t// Store the IP in the cache\n\t\t\tif (ipVersion === \"any\") {\n\t\t\t\twpm.storeData(\"ip\", ip)\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tgetIpVersion(ip) === 4\n\t\t\t\t|| (ipVersion === \"4\" && ip === null)\n\t\t\t) {\n\t\t\t\twpm.storeData(\"ipv4\", ip)\n\t\t\t}\n\n\t\t\tif (getIpVersion(ip) === 6\n\t\t\t\t|| (ipVersion === \"6\" && ip === null)\n\t\t\t) {\n\t\t\t\twpm.storeData(\"ipv6\", ip)\n\t\t\t}\n\n\t\t\treturn ip\n\t\t} catch (error) {\n\t\t\t// console.error(error)\n\t\t\treturn null\n\t\t}\n\t}\n\n\twpm.getBrowserGeoFromExternalService = async () => {\n\n\t\tconst startTime = performance.now()\n\n\t\tlet promises = []\n\n\t\tObject.keys(wpm.getGeoInfo).forEach(service => {\n\t\t\tpromises.push(wpm.getGeoInfo[service]())\n\t\t})\n\n\t\ttry {\n\t\t\tconst data = await Promise.any(promises)\n\n\t\t\tdata.countryCode = data.countryCode.toUpperCase()\n\n\t\t\tif (data.region && data.region === \"California\") {\n\t\t\t\tdata.regionCode = \"US-CA\"\n\t\t\t}\n\n\t\t\tif (data.region && data.region === \"Virginia\") {\n\t\t\t\tdata.regionCode = \"US-VA\"\n\t\t\t}\n\n\t\t\tpmw.console.log(\n\t\t\t\t\"Retrieved the browser geo info from an external service: \",\n\t\t\t\tdata,\n\t\t\t\t\" which took \",\n\t\t\t\t(performance.now() - startTime).toFixed(2) + \" ms\",\n\t\t\t)\n\n\t\t\t// wpm.storeData(\"countryCode\", data.countryCode)\n\t\t\t// wpm.storeData(\"ip\", data.ip)\n\t\t\treturn data\n\t\t} catch (error) {\n\t\t\tpmw.console.error(\"error: \", error)\n\t\t\treturn null\n\t\t}\n\t}\n\n\tconst getBrowserLocationByTimeZone = () => {\n\n\t\tconst geo         = require(\"./geo/geo.mjs\")\n\t\tconst geoLocation = geo.getLocationByTimeZone()\n\n\t\tif (geoLocation.countryCode) {\n\t\t\treturn geoLocation\n\t\t}\n\n\t\treturn null\n\t}\n\n\twpm.getBrowserGeo = async () => {\n\n\t\tlet geoFromStorage = {}\n\n\t\tif (wpm.retrieveData(\"geoCountryCode\")) geoFromStorage.countryCode = wpm.retrieveData(\"geoCountryCode\")\n\t\tif (wpm.retrieveData(\"geoRegionCode\")) geoFromStorage.regionCode = wpm.retrieveData(\"geoRegionCode\")\n\t\tif (wpm.retrieveData(\"geoRegion\")) geoFromStorage.region = wpm.retrieveData(\"geoRegion\")\n\n\t\tif (geoFromStorage.countryCode) {\n\t\t\tpmw.console.log(\"Retrieved the browser geo location from the cache: \", geoFromStorage)\n\t\t\treturn geoFromStorage\n\t\t}\n\n\t\tlet geoInfo = await wpm.getBrowserGeoFromExternalService()\n\n\t\t// If the external services fail, try to use the timezone fallback to get the country\n\t\tif (!geoInfo) {\n\n\t\t\tconst gepLocationByTimeZone = getBrowserLocationByTimeZone()\n\n\t\t\tgeoInfo = {}\n\n\t\t\tif (gepLocationByTimeZone) pmw.console.log(\"Retrieved the browser geo location from the timezone: \", gepLocationByTimeZone)\n\t\t\tif (gepLocationByTimeZone.countryCode) geoInfo.countryCode = gepLocationByTimeZone.countryCode\n\t\t\tif (gepLocationByTimeZone.regionCode) geoInfo.regionCode = gepLocationByTimeZone.regionCode\n\t\t}\n\n\t\tif (geoInfo?.ip) wpm.storeData(\"ip\", geoInfo.ip)\n\t\tif (geoInfo?.countryCode) wpm.storeData(\"geoCountryCode\", geoInfo.countryCode)\n\t\tif (geoInfo?.regionCode) wpm.storeData(\"geoRegionCode\", geoInfo.regionCode)\n\t\tif (geoInfo?.region) wpm.storeData(\"geoRegion\", geoInfo.region)\n\n\t\tif (geoInfo?.countryCode) {\n\t\t\treturn geoInfo\n\t\t}\n\n\t\treturn null\n\t}\n\n\t/**\n\t * Get the IP from the visitor using different services.\n\t * Return the first valid IP address that can be retrieved the fastest.\n\t *\n\t * @returns {Promise<IP>}\n\t */\n\twpm.getIpFromAnyService = async (ipVersion = \"any\", maxServicesToCheck = 3) => {\n\n\t\t// start tracking time\n\t\tconst startTime = performance.now()\n\n\t\t// take the ipServices object and filter it to only contain objects with an ipVersion key that matches the ipVersion argument\n\t\t// keep the original order of the ipServices object\n\t\t// also keep only the first maxServicesToCheck objects\n\n\t\tconst ipServicesFiltered = Object.keys(ipServices)\n\t\t\t.filter(service => ipServices[service][ipVersion])\n\t\t\t.slice(0, maxServicesToCheck)\n\t\t\t.reduce((obj, key) => {\n\t\t\t\t\tobj[key] = ipServices[key]\n\t\t\t\t\treturn obj\n\t\t\t\t}\n\t\t\t\t, {})\n\n\t\tlet promises = []\n\n\t\tObject.keys(ipServicesFiltered).forEach(service => {\n\t\t\t// only push if the ipVersion is available for the service\n\t\t\tif (ipServicesFiltered[service][ipVersion]) {\n\t\t\t\t// console.log(`pushing ${service} to promises array with ipVersion ${ipVersion}`)\n\t\t\t\tpromises.push(wpm.getIpFromService(service, ipVersion))\n\t\t\t}\n\t\t})\n\n\t\t// If the promises array is not empty, return the first promise that resolves the fastest\n\t\t// Ignore the promises that reject\n\t\tif (promises.length > 0) {\n\n\t\t\ttry {\n\t\t\t\tconst data = await Promise.any(promises)\n\t\t\t\t// console.log(`The Pixel Manager retrieved the IP address ${data.ip} from ${data.service} using IP version ${data.ipVersion}`)\n\n\t\t\t\t// stop tracking time\n\t\t\t\tconst endTime   = performance.now()\n\t\t\t\tconst timeTaken = (endTime - startTime).toFixed(2)\n\n\t\t\t\tpmw.console.log(`Retrieved the IP address ${data.ip} from ${data.service} which took ${timeTaken} ms`)\n\t\t\t\treturn data.ip\n\t\t\t} catch (error) {\n\t\t\t\t// console.error(error)\n\t\t\t\tpmw.console.log(`Could not retrieve an IP with version ${ipVersion} from any of the services.`)\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t} else {\n\t\t\tpmw.console.log(\"No promises to resolve\")\n\t\t\treturn null\n\t\t}\n\t}\n\n\t/**\n\t * Fetches the IP address from a specified service.\n\t *\n\t * @async\n\t * @param {string} service - The name of the service to fetch the IP from.\n\t * @param {string} [ipVersion=\"any\"] - The version of the IP (e.g., \"any\" for global).\n\t * @returns {Promise<Object>} A promise that resolves to an object containing the IP address, service name, and IP version.\n\t * @throws {Error} Will reject the promise with an error if the IP version is not available for the service, the response from the service is not OK, the returned value from the service is not an IP address, or any other error occurs.\n\t */\n\twpm.getIpFromService = async (service, ipVersion = \"any\") => {\n\t\ttry {\n\n\t\t\tlet data = {\n\t\t\t\tip       : null,\n\t\t\t\tservice  : service,\n\t\t\t\tipVersion: ipVersion,\n\t\t\t}\n\n\t\t\t// Return reject if the ipVersion is not available for the service\n\t\t\tif (!ipServices[service][ipVersion]) return Promise.reject(new Error(`The IP version ${ipVersion} is not available for the service ${service}`))\n\n\t\t\tpmw.console.log(`Fetching IP from ${service} using IP version ${ipVersion}`)\n\n\t\t\tconst response = await fetch(ipServices[service][ipVersion])\n\n\t\t\tif (!response.ok) {\n\t\t\t\treturn Promise.reject(new Error(`The response from ${service} was not OK. Status: ${response.status}`))\n\t\t\t}\n\n\t\t\tlet serviceResponseData = await response.text()\n\n\t\t\tif (service === \"cloudflare\") {\n\t\t\t\t// Convert key-value pairs to JSON\n\t\t\t\tserviceResponseData = serviceResponseData\n\t\t\t\t\t.trim()\n\t\t\t\t\t.split(\"\\n\")\n\t\t\t\t\t.reduce((obj, pair) => {\n\t\t\t\t\t\tpair = pair.split(\"=\")\n\t\t\t\t\t\treturn (obj[pair[0]] = pair[1]), obj\n\t\t\t\t\t}, {})\n\n\t\t\t\tdata.ip = serviceResponseData.ip\n\t\t\t} else {\n\t\t\t\tdata.ip = serviceResponseData.trim()\n\t\t\t}\n\n\t\t\tif (!isIP(data.ip)) {\n\t\t\t\treturn Promise.reject(new Error(`The returned value from ${service} is not an IP address`))\n\t\t\t}\n\n\t\t\treturn data\n\t\t} catch (error) {\n\t\t\treturn Promise.reject(error)\n\t\t}\n\t}\n\n\t/**\n\t * Cloudflare\n\t *\n\t * Response time: approx. 70ms\n\t * IPv: Returns IPv4 or IPv6 depending on the client\n\t * Dual stack: Doesn't offer dual stack detection\n\t *\n\t * @returns {Promise<*>}\n\t */\n\tconst getIpFromCloudflare = async () => {\n\n\t\tconst response = await fetch(\"https://www.cloudflare.com/cdn-cgi/trace\")\n\t\tlet data       = await response.text()\n\n\t\t// Convert key-value pairs to JSON\n\t\t// https://stackoverflow.com/a/39284735/452587\n\t\tdata = data\n\t\t\t.trim()\n\t\t\t.split(\"\\n\")\n\t\t\t.reduce((obj, pair) => {\n\t\t\t\tpair = pair.split(\"=\")\n\t\t\t\treturn obj[pair[0]] = pair[1], obj\n\t\t\t}, {})\n\n\t\t// return the data.ip not a promise\n\t\treturn data.ip\n\t}\n\n\t/**\n\t * Check if the visitor is NOT allowed to trigger server-to-server events\n\t * This checks both bot user-agent patterns and custom IP exclusion list\n\t *\n\t * @returns {Promise<boolean>} True if the visitor should be blocked\n\t */\n\twpm.isVisitorNotAllowed = async () => {\n\t\treturn await wpm.isVisitorAllowed() === false\n\t}\n\n\t/**\n\t * Check if the current user agent matches known bot patterns\n\t *\n\t * @returns {boolean} True if the user agent is a bot\n\t */\n\tconst isBotUserAgent = () => {\n\t\tconst userAgent = navigator.userAgent || ''\n\t\t\n\t\t// If no user agent, assume it might be a bot\n\t\tif (!userAgent) {\n\t\t\treturn true\n\t\t}\n\n\t\tconst botPatterns = getBotPatterns()\n\n\t\t// Check if user agent matches any bot pattern (case-insensitive)\n\t\tfor (const pattern of botPatterns) {\n\t\t\tif (userAgent.toLowerCase().includes(pattern.toLowerCase())) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\n\t\treturn false\n\t}\n\n\t/**\n\t * Get list of known bot user-agent patterns\n\t *\n\t * @returns {string[]} Array of bot patterns\n\t */\n\tconst getBotPatterns = () => {\n\t\t// Get custom patterns from wpmDataLayer if available\n\t\tlet customPatterns = []\n\t\tif (Array.isArray(wpmDataLayer?.general?.server_2_server?.user_agent_exclude_patterns)) {\n\t\t\tcustomPatterns = wpmDataLayer.general.server_2_server.user_agent_exclude_patterns\n\t\t}\n\n\t\t// Default bot patterns - focusing on legitimate crawlers that identify themselves\n\t\tconst defaultPatterns = [\n\t\t\t// Search engine crawlers\n\t\t\t'Googlebot',\n\t\t\t'Google-InspectionTool',\n\t\t\t'Google-Extended',\n\t\t\t'Storebot-Google',\n\t\t\t'bingbot',\n\t\t\t'BingPreview',\n\t\t\t'msnbot',\n\t\t\t'Slurp',\n\t\t\t'DuckDuckBot',\n\t\t\t'Baiduspider',\n\t\t\t'YandexBot',\n\t\t\t'Sogou',\n\t\t\t\n\t\t\t// Social media crawlers\n\t\t\t'facebookexternalhit',\n\t\t\t'FacebookBot',\n\t\t\t'LinkedInBot',\n\t\t\t'Twitterbot',\n\t\t\t'PinterestBot',\n\t\t\t'TikTokBot',\n\t\t\t'SnapchatAds',\n\t\t\t'DiscordBot',\n\t\t\t'InstagramBot',\n\t\t\t'WhatsApp',\n\t\t\t\n\t\t\t// SEO & Analytics\n\t\t\t'AhrefsBot',\n\t\t\t'SemrushBot',\n\t\t\t'MJ12bot',\n\t\t\t'DotBot',\n\t\t\t'rogerbot',\n\t\t\t\n\t\t\t// Monitoring services\n\t\t\t'UptimeRobot',\n\t\t\t'Pingdom',\n\t\t\t'StatusCake',\n\t\t\t'GTmetrix',\n\t\t\t\n\t\t\t// AI & Research\n\t\t\t'ClaudeBot',\n\t\t\t'GPTBot',\n\t\t\t'ChatGPT',\n\t\t\t'anthropic-ai',\n\t\t\t'CCBot',\n\t\t\t'PerplexityBot',\n\t\t\t\n\t\t\t// Generic patterns\n\t\t\t'crawler',\n\t\t\t'spider',\n\t\t\t'scraper',\n\t\t\t'bot/',\n\t\t\t'/bot',\n\t\t\t'bot-',\n\t\t]\n\n\t\treturn defaultPatterns.concat(customPatterns)\n\t}\n\n\t/**\n\t * Check if an IP address is in CIDR notation\n\t *\n\t * @param {string} ipName - The IP or CIDR notation to check\n\t * @returns {boolean} True if the string contains CIDR notation\n\t */\n\tconst isCidr = (ipName) => {\n\t\treturn ipName.includes('/')\n\t}\n\n\t/**\n\t * Check if an IP address is on the custom exclusion list\n\t *\n\t * @param {string} ip - The IP address to check\n\t * @returns {boolean} True if the IP is on the exclusion list\n\t */\n\tconst isOnIpExclusionList = (ip) => {\n\t\tconst ipExcludeList = wpmDataLayer?.general?.server_2_server?.ip_exclude_list || []\n\n\t\tfor (const ipName of ipExcludeList) {\n\t\t\tif (isCidr(ipName)) {\n\t\t\t\t// Check CIDR range\n\t\t\t\tif (isInSubnet.isInSubnet(ip, ipName)) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t} else if (ip === ipName) {\n\t\t\t\t// Exact IP match\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\n\t\treturn false\n\t}\n\n}(window.wpm = window.wpm || {}, jQuery))\n","/**\n * Register event listeners\n */\n\n\n/**\n * add_to_cart event\n *\n * WC is inconsistent with events that emit add-to-cart events.\n * adding_to_cart and added_to_are legacy events. Also, they only work\n * on Ajax buttons on shop pages.\n *\n * Never add document or body selectors.\n * The document selector doesn't work.\n * The body selector will cause the events to fire twice and other erratic behavior if used along with other selectors.\n */\nconst addToCartSelectorsArray = [\n\t// \"document\",\n\t// \"body\",\n\t\".add_to_cart_button:not(.product_type_variable)\",\n\t\".ajax_add_to_cart\",\n\t\".single_add_to_cart_button\",\n];\n\nconst addToCartSelectors = wpm.prepareSelectors(addToCartSelectorsArray, \"addToCart\");\n\njQuery(addToCartSelectors).on(\"click adding_to_cart\", (event, data) => {\n\n\t// console.log(\"add_to_cart event fired at: \" + new Date().getTime())\n\t// console.log('add to cart data', data)\n\t// console.log('add to cart event', event)\n\t// console.log('add to cart jQuery(event.target.dataset)', jQuery(event.target.dataset))\n\t// console.log(\"add to cart event.target.dataset\", event.target.dataset)\n\t// console.log(\"add to cart event.target.dataset.quantity\", event.target.dataset.quantity)\n\t// console.log(\"add to cart event.target.dataset.product_id\", event.target.dataset.product_id)\n\n\ttry {\n\n\t\t// console.log(\"add_to_cart event detected\")\n\n\t\tlet quantity  = event?.target?.dataset?.quantity ? event.target.dataset.quantity : null;\n\t\tlet productId = event?.target?.dataset?.product_id ? event.target.dataset.product_id : event?.target?.value ? event.target.value : null;\n\n\t\t// let quantity  = event.target.dataset.quantity ? event.target.dataset.quantity : 1\n\t\t// let productId = event.target.dataset.product_id ? event.target.dataset.product_id : null\n\n\t\t// Only process on product pages\n\t\tif (wpmDataLayer.shop.page_type === \"product\") {\n\n\t\t\t// First process related and upsell products\n\t\t\tif (\n\t\t\t\ttypeof jQuery(event.currentTarget).attr(\"href\") !== \"undefined\"\n\t\t\t\t&& jQuery(event.currentTarget).attr(\"href\").includes(\"add-to-cart\")\n\t\t\t) {\n\n\t\t\t\tif (!productId) {\n\t\t\t\t\tproductId = jQuery(event.currentTarget).data(\"product_id\");\n\t\t\t\t}\n\n\t\t\t\twpm.addProductToCart(productId, 1);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If is simple product\n\t\t\tif (wpmDataLayer.shop.product_type === \"simple\") {\n\n\t\t\t\tif (quantity === null) {\n\t\t\t\t\tquantity = Number(jQuery(\".input-text.qty\").val()) ? Number(jQuery(\".input-text.qty\").val()) : 1;\n\t\t\t\t}\n\n\t\t\t\tif (!productId) {\n\t\t\t\t\tproductId = jQuery(event.currentTarget).val();\n\t\t\t\t}\n\n\t\t\t\t// Fallback if the body selector is used\n\t\t\t\tif (!productId) {\n\t\t\t\t\t// get the product ID from the element that has the class .product\n\t\t\t\t\t// that element will also have an ID that start with product- and ends with the product ID\n\t\t\t\t\t// example: product-123\n\t\t\t\t\t// save the product ID in the variable productId\n\t\t\t\t\tproductId = jQuery(\".product\").attr(\"id\").replace(\"product-\", \"\");\n\t\t\t\t}\n\n\t\t\t\twpm.addProductToCart(productId, quantity);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If is variable product or variable-subscription\n\t\t\tif ([\"variable\", \"variable-subscription\"].indexOf(wpmDataLayer.shop.product_type) >= 0) {\n\n\t\t\t\tif (quantity === null) {\n\t\t\t\t\tquantity = Number(jQuery(\".input-text.qty\").val()) ? Number(jQuery(\".input-text.qty\").val()) : 1;\n\t\t\t\t}\n\n\t\t\t\tif (!productId) {\n\t\t\t\t\tproductId = jQuery(\"[name='variation_id']\").val();\n\t\t\t\t}\n\n\t\t\t\twpm.addProductToCart(productId, quantity);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If is grouped product\n\t\t\tif (wpmDataLayer.shop.product_type === \"grouped\") {\n\n\t\t\t\tjQuery(\".woocommerce-grouped-product-list-item\").each((index, element) => {\n\n\t\t\t\t\t// Can't rely on  event.target.dataset as it always is sent with the parent product ID and the quantity 1\n\n\t\t\t\t\tquantity = Number(jQuery(element).find(\".input-text.qty\").val()) ? Number(jQuery(element).find(\".input-text.qty\").val()) : 1;\n\n\t\t\t\t\tlet classes = jQuery(element).attr(\"class\");\n\t\t\t\t\tproductId   = wpm.getPostIdFromString(classes);\n\n\t\t\t\t\twpm.addProductToCart(productId, quantity);\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If is bundle product\n\t\t\tif (wpmDataLayer.shop.product_type === \"bundle\") {\n\n\t\t\t\tif (quantity === null) {\n\t\t\t\t\tquantity = Number(jQuery(\".input-text.qty\").val()) ? Number(jQuery(\".input-text.qty\").val()) : 1;\n\t\t\t\t}\n\n\t\t\t\tif (!productId) {\n\t\t\t\t\tproductId = jQuery(\"input[name=add-to-cart]\").val();\n\t\t\t\t}\n\n\t\t\t\twpm.addProductToCart(productId, quantity);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// everything else\n\t\t\tif (quantity === null) {\n\t\t\t\tquantity = Number(jQuery(\".input-text.qty\").val()) ? Number(jQuery(\".input-text.qty\").val()) : 1;\n\t\t\t}\n\n\t\t\twpm.addProductToCart(productId, quantity);\n\n\t\t} else {\n\n\t\t\tif (quantity === null) {\n\t\t\t\tquantity = 1;\n\t\t\t}\n\n\t\t\tif (!productId) {\n\t\t\t\t// console.log(\"add to cart event.currentTarget\", event.currentTarget)\n\t\t\t\tproductId = jQuery(event.currentTarget).data(\"product_id\") ? jQuery(event.currentTarget).data(\"product_id\") : null;\n\t\t\t}\n\n\t\t\t// Another fallback to retrieve the product ID in case the ID is saved in the value attribute\n\t\t\tif (!productId) {\n\t\t\t\tproductId = jQuery(event.currentTarget).val() ? jQuery(event.currentTarget).val() : null;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tproductId\n\t\t\t\t&& quantity\n\t\t\t) {\n\t\t\t\twpm.addProductToCart(productId, quantity);\n\t\t\t}\n\t\t}\n\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n\n/**\n * If someone clicks anywhere on a custom /?add-to-cart=123 link\n * trigger the add to cart event\n */\n\n// jQuery(document).one(\"click\", \"a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)\", (event) => {\njQuery(\"a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)\").one(\"click\", (event) => {\n\n\ttry {\n\t\tif (jQuery(event.target).closest(\"a\").attr(\"href\")) {\n\n\t\t\tlet url = new URL(jQuery(event.currentTarget).attr(\"href\"), window.location.origin);\n\n\t\t\tif (url.searchParams.has(\"add-to-cart\")) {\n\n\t\t\t\tlet productId = url.searchParams.get(\"add-to-cart\");\n\t\t\t\tlet quantity  = url.searchParams.has(\"quantity\") ? parseInt(url.searchParams.get(\"quantity\"), 10) : 1;\n\t\t\t\twpm.addProductToCart(productId, quantity);\n\t\t\t}\n\t\t}\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n// select item event\n// jQuery(document).on(\"click\", \".woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product\", (event) => {\njQuery(\".woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product\").on(\"click\", (event) => {\n\n\ttry {\n\n\t\t/**\n\t\t * On some pages the event fires multiple times, and on product pages\n\t\t * even on page load. Using e.stopPropagation helps to prevent this,\n\t\t * but I don't know why. We don't even have to use this, since only a real\n\t\t * product click yields a valid productId. So we filter the invalid click\n\t\t * events out later down in the code. I'll keep it that way because this is\n\t\t * the most compatible way across shops.\n\t\t *\n\t\t * e.stopPropagation();\n\t\t * */\n\n\t\tlet productId = jQuery(event.currentTarget).nextAll(\".wpmProductId:first\").data(\"id\");\n\n\t\t/**\n\t\t * On product pages, for some reason, the click event is triggered on the main product on page load.\n\t\t * In that case no ID is found. But we can discard it, since we only want to trigger the event on\n\t\t * related products, which are found below.\n\t\t */\n\n\t\tif (productId) {\n\n\t\t\tproductId = wpm.getIdBasedOndVariationsOutputSetting(productId);\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\t\tif (wpmDataLayer.products && wpmDataLayer.products[productId]) {\n\n\t\t\t\tlet product = wpm.getProductDetailsFormattedForEvent(productId);\n\n\t\t\t\tjQuery(document).trigger(\"pmw:select-item\", product);\n\t\t\t}\n\t\t}\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n\n// checkout_progress event\n// track checkout option event: entered valid billing email\n// jQuery(document).on(\"input\", \"#billing_email\", (event) => {\njQuery(\"#billing_email\").on(\"input\", (event) => {\n\n\tif (wpm.isEmail(jQuery(event.currentTarget).val())) {\n\t\t// wpm.fireCheckoutOption(2);\n\t\twpm.fireCheckoutProgress(2);\n\t\twpm.emailSelected = true;\n\t}\n});\n\n\n/**\n * Place order button\n *\n * Track checkout option event: purchase click\n * https://stackoverflow.com/a/34112407/4688612\n * jQuery(document).one(\"click\", \"#place_order\", () => {\n *\n * Has to be hooked after document ready !\n */\njQuery(\"form.checkout\").on(\"checkout_place_order_success\", () => {\n\n\t// console log current time\n\t// console.log(\"checkout_place_order_success event fired at: \" + new Date().getTime())\n\n\tif (false === wpm.emailSelected) {\n\t\twpm.fireCheckoutProgress(2);\n\t}\n\n\tif (false === wpm.paymentMethodSelected) {\n\t\twpm.fireCheckoutProgress(3);\n\t\twpm.fireCheckoutOption(3, jQuery(\"input[name='payment_method']:checked\").val());\n\t}\n\n\twpm.fireCheckoutProgress(4);\n\n\tjQuery(document).trigger(\"pmw:place-order\", {});\n});\n\n/**\n * Update cart event\n *\n * Has to be hooked after document ready !\n */\njQuery(document).on(\"click\", \"[name='update_cart']\", () => {\n\n\ttry {\n\t\tjQuery(\".cart_item\").each((index, element) => {\n\n\t\t\tconst productId = wpm.getProductIdByCartItemElement(element);\n\n\t\t\tif (!productId) {\n\t\t\t\tconsole.error(\"Pixel Manager: Wasn't able to retrieve a productId\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst quantity = wpm.getProductQuantityByCartItemElement(element);\n\n\t\t\tif (!quantity) {\n\t\t\t\tconsole.error(\"Pixel Manager: Wasn't able to retrieve a quantity\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// console.log(\"productId\", productId)\n\t\t\t// console.log(\"quantity\", quantity)\n\n\t\t\tif (quantity === 0) {\n\t\t\t\twpm.removeProductFromCart(productId);\n\t\t\t} else if (quantity < wpmDataLayer.cart[productId].quantity) {\n\t\t\t\twpm.removeProductFromCart(productId, wpmDataLayer.cart[productId].quantity - quantity);\n\t\t\t} else if (quantity > wpmDataLayer.cart[productId].quantity) {\n\t\t\t\twpm.addProductToCart(productId, quantity - wpmDataLayer.cart[productId].quantity);\n\t\t\t}\n\t\t});\n\t} catch (e) {\n\t\tconsole.error(e);\n\t\twpm.getCartItemsFromBackend();\n\t}\n});\n\n// Supports the following plugins:\n// WooCommerce Wishlist: https://woo.com/products/woocommerce-wishlists/\n// YITH WooCommerce Wishlist: https://wordpress.org/plugins/yith-woocommerce-wishlist/\n// add_to_wishlist\njQuery(\".add_to_wishlist,.wl-add-to\").on(\"click\", event => {\n\n\ttry {\n\n\t\tlet productId;\n\n\t\tif (jQuery(event.currentTarget).data(\"productid\")) { // for the WooCommerce wishlist plugin\n\n\t\t\tproductId = jQuery(event.currentTarget).data(\"productid\");\n\t\t} else if (jQuery(event.currentTarget).data(\"product-id\")) {  // for the YITH wishlist plugin\n\n\t\t\tproductId = jQuery(event.currentTarget).data(\"product-id\");\n\t\t}\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\tlet product = wpm.getProductDetailsFormattedForEvent(productId);\n\n\n\t\tjQuery(document).trigger(\"pmw:add-to-wishlist\", product);\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n\n/**\n * Called when the user selects all the required dropdowns / attributes\n *\n * Replaced by code in the event_listeners.js file in case of lazy loading\n *\n * Has to be hooked after document ready !\n *\n * https://stackoverflow.com/a/27849208/4688612\n * https://stackoverflow.com/a/65065335/4688612\n *\n */\n\nif (!wpmDataLayer?.general?.lazy_load_pmw) {\n\twpm.registerShowVariationEventListener();\n}\n\n\n/**\n * Called on variable products when no selection has been done yet\n * or when the visitor deselects his choice.\n *\n * Has to be hooked after document ready !\n */\n\n// jQuery(function () {\n//\n// \tjQuery(\".single_variation_wrap\").on(\"hide_variation\", function () {\n//\n// \t\ttry {\n// \t\t\tlet classes   = jQuery(\"body\").attr(\"class\")\n// \t\t\tlet productId = classes.match(/(postid-)(\\d+)/)[2]\n//\n// \t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n//\n// \t\t\t/**\n// \t\t\t * If we have a variable product with no preset,\n// \t\t\t * and variations output is enabled,\n// \t\t\t * then we send a viewItem event with the first\n// \t\t\t * variation we find for the parent.\n// \t\t\t * If variations output is disabled,\n// \t\t\t * we just send the parent ID.\n// \t\t\t *\n// \t\t\t * And if Facebook microdata is active, use the\n// \t\t\t * microdata product ID.\n// \t\t\t */\n//\n// \t\t\tif (\n// \t\t\t\t\"variable\" === wpmDataLayer.shop.product_type &&\n// \t\t\t\twpmDataLayer?.shop?.variations_output\n// \t\t\t) {\n// \t\t\t\tfor (const [key, product] of Object.entries(wpmDataLayer.products)) {\n// \t\t\t\t\tif (\"parent_id\" in product) {\n//\n// \t\t\t\t\t\tproductId = product.id\n// \t\t\t\t\t\tbreak\n// \t\t\t\t\t}\n// \t\t\t\t}\n//\n// \t\t\t\tif (wpmDataLayer?.pixels?.facebook?.microdata_product_id) {\n// \t\t\t\t\tproductId = wpmDataLayer.pixels.facebook.microdata_product_id\n// \t\t\t\t}\n// \t\t\t}\n//\n// \t\t\t// console.log(\"hmm\")\n// \t\t\twpm.triggerViewItemEventPrep(productId)\n//\n// \t\t} catch (e) {\n// \t\t\tconsole.error(e)\n// \t\t}\n// \t})\n// })\n\n// jQuery(function () {\n//\n// \tjQuery(\".single_variation_wrap\").on(\"hide_variation\", function () {\n// \t\tjQuery(document).trigger(\"pmw:view-item\")\n// \t})\n// })\n","(function() {\n  var expandIPv6, ipaddr, ipv4Part, ipv4Regexes, ipv6Part, ipv6Regexes, matchCIDR, root, zoneIndex;\n\n  ipaddr = {};\n\n  root = this;\n\n  if ((typeof module !== \"undefined\" && module !== null) && module.exports) {\n    module.exports = ipaddr;\n  } else {\n    root['ipaddr'] = ipaddr;\n  }\n\n  matchCIDR = function(first, second, partSize, cidrBits) {\n    var part, shift;\n    if (first.length !== second.length) {\n      throw new Error(\"ipaddr: cannot match CIDR for objects with different lengths\");\n    }\n    part = 0;\n    while (cidrBits > 0) {\n      shift = partSize - cidrBits;\n      if (shift < 0) {\n        shift = 0;\n      }\n      if (first[part] >> shift !== second[part] >> shift) {\n        return false;\n      }\n      cidrBits -= partSize;\n      part += 1;\n    }\n    return true;\n  };\n\n  ipaddr.subnetMatch = function(address, rangeList, defaultName) {\n    var k, len, rangeName, rangeSubnets, subnet;\n    if (defaultName == null) {\n      defaultName = 'unicast';\n    }\n    for (rangeName in rangeList) {\n      rangeSubnets = rangeList[rangeName];\n      if (rangeSubnets[0] && !(rangeSubnets[0] instanceof Array)) {\n        rangeSubnets = [rangeSubnets];\n      }\n      for (k = 0, len = rangeSubnets.length; k < len; k++) {\n        subnet = rangeSubnets[k];\n        if (address.kind() === subnet[0].kind()) {\n          if (address.match.apply(address, subnet)) {\n            return rangeName;\n          }\n        }\n      }\n    }\n    return defaultName;\n  };\n\n  ipaddr.IPv4 = (function() {\n    function IPv4(octets) {\n      var k, len, octet;\n      if (octets.length !== 4) {\n        throw new Error(\"ipaddr: ipv4 octet count should be 4\");\n      }\n      for (k = 0, len = octets.length; k < len; k++) {\n        octet = octets[k];\n        if (!((0 <= octet && octet <= 255))) {\n          throw new Error(\"ipaddr: ipv4 octet should fit in 8 bits\");\n        }\n      }\n      this.octets = octets;\n    }\n\n    IPv4.prototype.kind = function() {\n      return 'ipv4';\n    };\n\n    IPv4.prototype.toString = function() {\n      return this.octets.join(\".\");\n    };\n\n    IPv4.prototype.toNormalizedString = function() {\n      return this.toString();\n    };\n\n    IPv4.prototype.toByteArray = function() {\n      return this.octets.slice(0);\n    };\n\n    IPv4.prototype.match = function(other, cidrRange) {\n      var ref;\n      if (cidrRange === void 0) {\n        ref = other, other = ref[0], cidrRange = ref[1];\n      }\n      if (other.kind() !== 'ipv4') {\n        throw new Error(\"ipaddr: cannot match ipv4 address with non-ipv4 one\");\n      }\n      return matchCIDR(this.octets, other.octets, 8, cidrRange);\n    };\n\n    IPv4.prototype.SpecialRanges = {\n      unspecified: [[new IPv4([0, 0, 0, 0]), 8]],\n      broadcast: [[new IPv4([255, 255, 255, 255]), 32]],\n      multicast: [[new IPv4([224, 0, 0, 0]), 4]],\n      linkLocal: [[new IPv4([169, 254, 0, 0]), 16]],\n      loopback: [[new IPv4([127, 0, 0, 0]), 8]],\n      carrierGradeNat: [[new IPv4([100, 64, 0, 0]), 10]],\n      \"private\": [[new IPv4([10, 0, 0, 0]), 8], [new IPv4([172, 16, 0, 0]), 12], [new IPv4([192, 168, 0, 0]), 16]],\n      reserved: [[new IPv4([192, 0, 0, 0]), 24], [new IPv4([192, 0, 2, 0]), 24], [new IPv4([192, 88, 99, 0]), 24], [new IPv4([198, 51, 100, 0]), 24], [new IPv4([203, 0, 113, 0]), 24], [new IPv4([240, 0, 0, 0]), 4]]\n    };\n\n    IPv4.prototype.range = function() {\n      return ipaddr.subnetMatch(this, this.SpecialRanges);\n    };\n\n    IPv4.prototype.toIPv4MappedAddress = function() {\n      return ipaddr.IPv6.parse(\"::ffff:\" + (this.toString()));\n    };\n\n    IPv4.prototype.prefixLengthFromSubnetMask = function() {\n      var cidr, i, k, octet, stop, zeros, zerotable;\n      zerotable = {\n        0: 8,\n        128: 7,\n        192: 6,\n        224: 5,\n        240: 4,\n        248: 3,\n        252: 2,\n        254: 1,\n        255: 0\n      };\n      cidr = 0;\n      stop = false;\n      for (i = k = 3; k >= 0; i = k += -1) {\n        octet = this.octets[i];\n        if (octet in zerotable) {\n          zeros = zerotable[octet];\n          if (stop && zeros !== 0) {\n            return null;\n          }\n          if (zeros !== 8) {\n            stop = true;\n          }\n          cidr += zeros;\n        } else {\n          return null;\n        }\n      }\n      return 32 - cidr;\n    };\n\n    return IPv4;\n\n  })();\n\n  ipv4Part = \"(0?\\\\d+|0x[a-f0-9]+)\";\n\n  ipv4Regexes = {\n    fourOctet: new RegExp(\"^\" + ipv4Part + \"\\\\.\" + ipv4Part + \"\\\\.\" + ipv4Part + \"\\\\.\" + ipv4Part + \"$\", 'i'),\n    longValue: new RegExp(\"^\" + ipv4Part + \"$\", 'i')\n  };\n\n  ipaddr.IPv4.parser = function(string) {\n    var match, parseIntAuto, part, shift, value;\n    parseIntAuto = function(string) {\n      if (string[0] === \"0\" && string[1] !== \"x\") {\n        return parseInt(string, 8);\n      } else {\n        return parseInt(string);\n      }\n    };\n    if (match = string.match(ipv4Regexes.fourOctet)) {\n      return (function() {\n        var k, len, ref, results;\n        ref = match.slice(1, 6);\n        results = [];\n        for (k = 0, len = ref.length; k < len; k++) {\n          part = ref[k];\n          results.push(parseIntAuto(part));\n        }\n        return results;\n      })();\n    } else if (match = string.match(ipv4Regexes.longValue)) {\n      value = parseIntAuto(match[1]);\n      if (value > 0xffffffff || value < 0) {\n        throw new Error(\"ipaddr: address outside defined range\");\n      }\n      return ((function() {\n        var k, results;\n        results = [];\n        for (shift = k = 0; k <= 24; shift = k += 8) {\n          results.push((value >> shift) & 0xff);\n        }\n        return results;\n      })()).reverse();\n    } else {\n      return null;\n    }\n  };\n\n  ipaddr.IPv6 = (function() {\n    function IPv6(parts, zoneId) {\n      var i, k, l, len, part, ref;\n      if (parts.length === 16) {\n        this.parts = [];\n        for (i = k = 0; k <= 14; i = k += 2) {\n          this.parts.push((parts[i] << 8) | parts[i + 1]);\n        }\n      } else if (parts.length === 8) {\n        this.parts = parts;\n      } else {\n        throw new Error(\"ipaddr: ipv6 part count should be 8 or 16\");\n      }\n      ref = this.parts;\n      for (l = 0, len = ref.length; l < len; l++) {\n        part = ref[l];\n        if (!((0 <= part && part <= 0xffff))) {\n          throw new Error(\"ipaddr: ipv6 part should fit in 16 bits\");\n        }\n      }\n      if (zoneId) {\n        this.zoneId = zoneId;\n      }\n    }\n\n    IPv6.prototype.kind = function() {\n      return 'ipv6';\n    };\n\n    IPv6.prototype.toString = function() {\n      return this.toNormalizedString().replace(/((^|:)(0(:|$))+)/, '::');\n    };\n\n    IPv6.prototype.toRFC5952String = function() {\n      var bestMatchIndex, bestMatchLength, match, regex, string;\n      regex = /((^|:)(0(:|$)){2,})/g;\n      string = this.toNormalizedString();\n      bestMatchIndex = 0;\n      bestMatchLength = -1;\n      while ((match = regex.exec(string))) {\n        if (match[0].length > bestMatchLength) {\n          bestMatchIndex = match.index;\n          bestMatchLength = match[0].length;\n        }\n      }\n      if (bestMatchLength < 0) {\n        return string;\n      }\n      return string.substring(0, bestMatchIndex) + '::' + string.substring(bestMatchIndex + bestMatchLength);\n    };\n\n    IPv6.prototype.toByteArray = function() {\n      var bytes, k, len, part, ref;\n      bytes = [];\n      ref = this.parts;\n      for (k = 0, len = ref.length; k < len; k++) {\n        part = ref[k];\n        bytes.push(part >> 8);\n        bytes.push(part & 0xff);\n      }\n      return bytes;\n    };\n\n    IPv6.prototype.toNormalizedString = function() {\n      var addr, part, suffix;\n      addr = ((function() {\n        var k, len, ref, results;\n        ref = this.parts;\n        results = [];\n        for (k = 0, len = ref.length; k < len; k++) {\n          part = ref[k];\n          results.push(part.toString(16));\n        }\n        return results;\n      }).call(this)).join(\":\");\n      suffix = '';\n      if (this.zoneId) {\n        suffix = '%' + this.zoneId;\n      }\n      return addr + suffix;\n    };\n\n    IPv6.prototype.toFixedLengthString = function() {\n      var addr, part, suffix;\n      addr = ((function() {\n        var k, len, ref, results;\n        ref = this.parts;\n        results = [];\n        for (k = 0, len = ref.length; k < len; k++) {\n          part = ref[k];\n          results.push(part.toString(16).padStart(4, '0'));\n        }\n        return results;\n      }).call(this)).join(\":\");\n      suffix = '';\n      if (this.zoneId) {\n        suffix = '%' + this.zoneId;\n      }\n      return addr + suffix;\n    };\n\n    IPv6.prototype.match = function(other, cidrRange) {\n      var ref;\n      if (cidrRange === void 0) {\n        ref = other, other = ref[0], cidrRange = ref[1];\n      }\n      if (other.kind() !== 'ipv6') {\n        throw new Error(\"ipaddr: cannot match ipv6 address with non-ipv6 one\");\n      }\n      return matchCIDR(this.parts, other.parts, 16, cidrRange);\n    };\n\n    IPv6.prototype.SpecialRanges = {\n      unspecified: [new IPv6([0, 0, 0, 0, 0, 0, 0, 0]), 128],\n      linkLocal: [new IPv6([0xfe80, 0, 0, 0, 0, 0, 0, 0]), 10],\n      multicast: [new IPv6([0xff00, 0, 0, 0, 0, 0, 0, 0]), 8],\n      loopback: [new IPv6([0, 0, 0, 0, 0, 0, 0, 1]), 128],\n      uniqueLocal: [new IPv6([0xfc00, 0, 0, 0, 0, 0, 0, 0]), 7],\n      ipv4Mapped: [new IPv6([0, 0, 0, 0, 0, 0xffff, 0, 0]), 96],\n      rfc6145: [new IPv6([0, 0, 0, 0, 0xffff, 0, 0, 0]), 96],\n      rfc6052: [new IPv6([0x64, 0xff9b, 0, 0, 0, 0, 0, 0]), 96],\n      '6to4': [new IPv6([0x2002, 0, 0, 0, 0, 0, 0, 0]), 16],\n      teredo: [new IPv6([0x2001, 0, 0, 0, 0, 0, 0, 0]), 32],\n      reserved: [[new IPv6([0x2001, 0xdb8, 0, 0, 0, 0, 0, 0]), 32]]\n    };\n\n    IPv6.prototype.range = function() {\n      return ipaddr.subnetMatch(this, this.SpecialRanges);\n    };\n\n    IPv6.prototype.isIPv4MappedAddress = function() {\n      return this.range() === 'ipv4Mapped';\n    };\n\n    IPv6.prototype.toIPv4Address = function() {\n      var high, low, ref;\n      if (!this.isIPv4MappedAddress()) {\n        throw new Error(\"ipaddr: trying to convert a generic ipv6 address to ipv4\");\n      }\n      ref = this.parts.slice(-2), high = ref[0], low = ref[1];\n      return new ipaddr.IPv4([high >> 8, high & 0xff, low >> 8, low & 0xff]);\n    };\n\n    IPv6.prototype.prefixLengthFromSubnetMask = function() {\n      var cidr, i, k, part, stop, zeros, zerotable;\n      zerotable = {\n        0: 16,\n        32768: 15,\n        49152: 14,\n        57344: 13,\n        61440: 12,\n        63488: 11,\n        64512: 10,\n        65024: 9,\n        65280: 8,\n        65408: 7,\n        65472: 6,\n        65504: 5,\n        65520: 4,\n        65528: 3,\n        65532: 2,\n        65534: 1,\n        65535: 0\n      };\n      cidr = 0;\n      stop = false;\n      for (i = k = 7; k >= 0; i = k += -1) {\n        part = this.parts[i];\n        if (part in zerotable) {\n          zeros = zerotable[part];\n          if (stop && zeros !== 0) {\n            return null;\n          }\n          if (zeros !== 16) {\n            stop = true;\n          }\n          cidr += zeros;\n        } else {\n          return null;\n        }\n      }\n      return 128 - cidr;\n    };\n\n    return IPv6;\n\n  })();\n\n  ipv6Part = \"(?:[0-9a-f]+::?)+\";\n\n  zoneIndex = \"%[0-9a-z]{1,}\";\n\n  ipv6Regexes = {\n    zoneIndex: new RegExp(zoneIndex, 'i'),\n    \"native\": new RegExp(\"^(::)?(\" + ipv6Part + \")?([0-9a-f]+)?(::)?(\" + zoneIndex + \")?$\", 'i'),\n    transitional: new RegExp((\"^((?:\" + ipv6Part + \")|(?:::)(?:\" + ipv6Part + \")?)\") + (ipv4Part + \"\\\\.\" + ipv4Part + \"\\\\.\" + ipv4Part + \"\\\\.\" + ipv4Part) + (\"(\" + zoneIndex + \")?$\"), 'i')\n  };\n\n  expandIPv6 = function(string, parts) {\n    var colonCount, lastColon, part, replacement, replacementCount, zoneId;\n    if (string.indexOf('::') !== string.lastIndexOf('::')) {\n      return null;\n    }\n    zoneId = (string.match(ipv6Regexes['zoneIndex']) || [])[0];\n    if (zoneId) {\n      zoneId = zoneId.substring(1);\n      string = string.replace(/%.+$/, '');\n    }\n    colonCount = 0;\n    lastColon = -1;\n    while ((lastColon = string.indexOf(':', lastColon + 1)) >= 0) {\n      colonCount++;\n    }\n    if (string.substr(0, 2) === '::') {\n      colonCount--;\n    }\n    if (string.substr(-2, 2) === '::') {\n      colonCount--;\n    }\n    if (colonCount > parts) {\n      return null;\n    }\n    replacementCount = parts - colonCount;\n    replacement = ':';\n    while (replacementCount--) {\n      replacement += '0:';\n    }\n    string = string.replace('::', replacement);\n    if (string[0] === ':') {\n      string = string.slice(1);\n    }\n    if (string[string.length - 1] === ':') {\n      string = string.slice(0, -1);\n    }\n    parts = (function() {\n      var k, len, ref, results;\n      ref = string.split(\":\");\n      results = [];\n      for (k = 0, len = ref.length; k < len; k++) {\n        part = ref[k];\n        results.push(parseInt(part, 16));\n      }\n      return results;\n    })();\n    return {\n      parts: parts,\n      zoneId: zoneId\n    };\n  };\n\n  ipaddr.IPv6.parser = function(string) {\n    var addr, k, len, match, octet, octets, zoneId;\n    if (ipv6Regexes['native'].test(string)) {\n      return expandIPv6(string, 8);\n    } else if (match = string.match(ipv6Regexes['transitional'])) {\n      zoneId = match[6] || '';\n      addr = expandIPv6(match[1].slice(0, -1) + zoneId, 6);\n      if (addr.parts) {\n        octets = [parseInt(match[2]), parseInt(match[3]), parseInt(match[4]), parseInt(match[5])];\n        for (k = 0, len = octets.length; k < len; k++) {\n          octet = octets[k];\n          if (!((0 <= octet && octet <= 255))) {\n            return null;\n          }\n        }\n        addr.parts.push(octets[0] << 8 | octets[1]);\n        addr.parts.push(octets[2] << 8 | octets[3]);\n        return {\n          parts: addr.parts,\n          zoneId: addr.zoneId\n        };\n      }\n    }\n    return null;\n  };\n\n  ipaddr.IPv4.isIPv4 = ipaddr.IPv6.isIPv6 = function(string) {\n    return this.parser(string) !== null;\n  };\n\n  ipaddr.IPv4.isValid = function(string) {\n    var e;\n    try {\n      new this(this.parser(string));\n      return true;\n    } catch (error1) {\n      e = error1;\n      return false;\n    }\n  };\n\n  ipaddr.IPv4.isValidFourPartDecimal = function(string) {\n    if (ipaddr.IPv4.isValid(string) && string.match(/^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){3}$/)) {\n      return true;\n    } else {\n      return false;\n    }\n  };\n\n  ipaddr.IPv6.isValid = function(string) {\n    var addr, e;\n    if (typeof string === \"string\" && string.indexOf(\":\") === -1) {\n      return false;\n    }\n    try {\n      addr = this.parser(string);\n      new this(addr.parts, addr.zoneId);\n      return true;\n    } catch (error1) {\n      e = error1;\n      return false;\n    }\n  };\n\n  ipaddr.IPv4.parse = function(string) {\n    var parts;\n    parts = this.parser(string);\n    if (parts === null) {\n      throw new Error(\"ipaddr: string is not formatted like ip address\");\n    }\n    return new this(parts);\n  };\n\n  ipaddr.IPv6.parse = function(string) {\n    var addr;\n    addr = this.parser(string);\n    if (addr.parts === null) {\n      throw new Error(\"ipaddr: string is not formatted like ip address\");\n    }\n    return new this(addr.parts, addr.zoneId);\n  };\n\n  ipaddr.IPv4.parseCIDR = function(string) {\n    var maskLength, match, parsed;\n    if (match = string.match(/^(.+)\\/(\\d+)$/)) {\n      maskLength = parseInt(match[2]);\n      if (maskLength >= 0 && maskLength <= 32) {\n        parsed = [this.parse(match[1]), maskLength];\n        Object.defineProperty(parsed, 'toString', {\n          value: function() {\n            return this.join('/');\n          }\n        });\n        return parsed;\n      }\n    }\n    throw new Error(\"ipaddr: string is not formatted like an IPv4 CIDR range\");\n  };\n\n  ipaddr.IPv4.subnetMaskFromPrefixLength = function(prefix) {\n    var filledOctetCount, j, octets;\n    prefix = parseInt(prefix);\n    if (prefix < 0 || prefix > 32) {\n      throw new Error('ipaddr: invalid IPv4 prefix length');\n    }\n    octets = [0, 0, 0, 0];\n    j = 0;\n    filledOctetCount = Math.floor(prefix / 8);\n    while (j < filledOctetCount) {\n      octets[j] = 255;\n      j++;\n    }\n    if (filledOctetCount < 4) {\n      octets[filledOctetCount] = Math.pow(2, prefix % 8) - 1 << 8 - (prefix % 8);\n    }\n    return new this(octets);\n  };\n\n  ipaddr.IPv4.broadcastAddressFromCIDR = function(string) {\n    var cidr, error, i, ipInterfaceOctets, octets, subnetMaskOctets;\n    try {\n      cidr = this.parseCIDR(string);\n      ipInterfaceOctets = cidr[0].toByteArray();\n      subnetMaskOctets = this.subnetMaskFromPrefixLength(cidr[1]).toByteArray();\n      octets = [];\n      i = 0;\n      while (i < 4) {\n        octets.push(parseInt(ipInterfaceOctets[i], 10) | parseInt(subnetMaskOctets[i], 10) ^ 255);\n        i++;\n      }\n      return new this(octets);\n    } catch (error1) {\n      error = error1;\n      throw new Error('ipaddr: the address does not have IPv4 CIDR format');\n    }\n  };\n\n  ipaddr.IPv4.networkAddressFromCIDR = function(string) {\n    var cidr, error, i, ipInterfaceOctets, octets, subnetMaskOctets;\n    try {\n      cidr = this.parseCIDR(string);\n      ipInterfaceOctets = cidr[0].toByteArray();\n      subnetMaskOctets = this.subnetMaskFromPrefixLength(cidr[1]).toByteArray();\n      octets = [];\n      i = 0;\n      while (i < 4) {\n        octets.push(parseInt(ipInterfaceOctets[i], 10) & parseInt(subnetMaskOctets[i], 10));\n        i++;\n      }\n      return new this(octets);\n    } catch (error1) {\n      error = error1;\n      throw new Error('ipaddr: the address does not have IPv4 CIDR format');\n    }\n  };\n\n  ipaddr.IPv6.parseCIDR = function(string) {\n    var maskLength, match, parsed;\n    if (match = string.match(/^(.+)\\/(\\d+)$/)) {\n      maskLength = parseInt(match[2]);\n      if (maskLength >= 0 && maskLength <= 128) {\n        parsed = [this.parse(match[1]), maskLength];\n        Object.defineProperty(parsed, 'toString', {\n          value: function() {\n            return this.join('/');\n          }\n        });\n        return parsed;\n      }\n    }\n    throw new Error(\"ipaddr: string is not formatted like an IPv6 CIDR range\");\n  };\n\n  ipaddr.isValid = function(string) {\n    return ipaddr.IPv6.isValid(string) || ipaddr.IPv4.isValid(string);\n  };\n\n  ipaddr.parse = function(string) {\n    if (ipaddr.IPv6.isValid(string)) {\n      return ipaddr.IPv6.parse(string);\n    } else if (ipaddr.IPv4.isValid(string)) {\n      return ipaddr.IPv4.parse(string);\n    } else {\n      throw new Error(\"ipaddr: the address has neither IPv6 nor IPv4 format\");\n    }\n  };\n\n  ipaddr.parseCIDR = function(string) {\n    var e;\n    try {\n      return ipaddr.IPv6.parseCIDR(string);\n    } catch (error1) {\n      e = error1;\n      try {\n        return ipaddr.IPv4.parseCIDR(string);\n      } catch (error1) {\n        e = error1;\n        throw new Error(\"ipaddr: the address has neither IPv6 nor IPv4 CIDR format\");\n      }\n    }\n  };\n\n  ipaddr.fromByteArray = function(bytes) {\n    var length;\n    length = bytes.length;\n    if (length === 4) {\n      return new ipaddr.IPv4(bytes);\n    } else if (length === 16) {\n      return new ipaddr.IPv6(bytes);\n    } else {\n      throw new Error(\"ipaddr: the binary input is neither an IPv6 nor IPv4 address\");\n    }\n  };\n\n  ipaddr.process = function(string) {\n    var addr;\n    addr = this.parse(string);\n    if (addr.kind() === 'ipv6' && addr.isIPv4MappedAddress()) {\n      return addr.toIPv4Address();\n    } else {\n      return addr;\n    }\n  };\n\n}).call(this);\n","/**\n * Created by elgs on 3/5/16.\n */\nconst normalize = function (a) {\n   if (!_validate(a)) {\n      throw new Error('Invalid address: ' + a);\n   }\n   a = a.toLowerCase()\n\n   const nh = a.split(/\\:\\:/g);\n   if (nh.length > 2) {\n      throw new Error('Invalid address: ' + a);\n   }\n\n   let sections = [];\n   if (nh.length == 1) {\n      // full mode\n      sections = a.split(/\\:/g);\n      if (sections.length !== 8) {\n         throw new Error('Invalid address: ' + a);\n      }\n   } else if (nh.length == 2) {\n      // compact mode\n      const n = nh[0];\n      const h = nh[1];\n      const ns = n.split(/\\:/g);\n      const hs = h.split(/\\:/g);\n      for (let i in ns) {\n         sections[i] = ns[i];\n      }\n      for (let i = hs.length; i > 0; --i) {\n         sections[7 - (hs.length - i)] = hs[i - 1];\n      }\n   }\n   for (let i = 0; i < 8; ++i) {\n      if (sections[i] === undefined) {\n         sections[i] = '0000';\n      }\n      sections[i] = _leftPad(sections[i], '0', 4);\n   }\n   return sections.join(':');\n};\n\nconst abbreviate = function (a) {\n   if (!_validate(a)) {\n      throw new Error('Invalid address: ' + a);\n   }\n   a = normalize(a);\n   a = a.replace(/0000/g, 'g');\n   a = a.replace(/\\:000/g, ':');\n   a = a.replace(/\\:00/g, ':');\n   a = a.replace(/\\:0/g, ':');\n   a = a.replace(/g/g, '0');\n   const sections = a.split(/\\:/g);\n   let zPreviousFlag = false;\n   let zeroStartIndex = -1;\n   let zeroLength = 0;\n   let zStartIndex = -1;\n   let zLength = 0;\n   for (let i = 0; i < 8; ++i) {\n      const section = sections[i];\n      let zFlag = (section === '0');\n      if (zFlag && !zPreviousFlag) {\n         zStartIndex = i;\n      }\n      if (!zFlag && zPreviousFlag) {\n         zLength = i - zStartIndex;\n      }\n      if (zLength > 1 && zLength > zeroLength) {\n         zeroStartIndex = zStartIndex;\n         zeroLength = zLength;\n      }\n      zPreviousFlag = (section === '0');\n   }\n   if (zPreviousFlag) {\n      zLength = 8 - zStartIndex;\n   }\n   if (zLength > 1 && zLength > zeroLength) {\n      zeroStartIndex = zStartIndex;\n      zeroLength = zLength;\n   }\n   //console.log(zeroStartIndex, zeroLength);\n   //console.log(sections);\n   if (zeroStartIndex >= 0 && zeroLength > 1) {\n      sections.splice(zeroStartIndex, zeroLength, 'g');\n   }\n   //console.log(sections);\n   a = sections.join(':');\n   //console.log(a);\n   a = a.replace(/\\:g\\:/g, '::');\n   a = a.replace(/\\:g/g, '::');\n   a = a.replace(/g\\:/g, '::');\n   a = a.replace(/g/g, '::');\n   //console.log(a);\n   return a;\n};\n\n// Basic validation\nconst _validate = function (a) {\n   return /^[a-f0-9\\\\:]+$/ig.test(a);\n};\n\nconst _leftPad = function (d, p, n) {\n   const padding = p.repeat(n);\n   if (d.length < padding.length) {\n      d = padding.substring(0, padding.length - d.length) + d;\n   }\n   return d;\n};\n\nconst _hex2bin = function (hex) {\n   return parseInt(hex, 16).toString(2)\n};\nconst _bin2hex = function (bin) {\n   return parseInt(bin, 2).toString(16)\n};\n\nconst _addr2bin = function (addr) {\n   const nAddr = normalize(addr);\n   const sections = nAddr.split(\":\");\n   let binAddr = '';\n   for (const section of sections) {\n      binAddr += _leftPad(_hex2bin(section), '0', 16);\n   }\n   return binAddr;\n};\n\nconst _bin2addr = function (bin) {\n   const addr = [];\n   for (let i = 0; i < 8; ++i) {\n      const binPart = bin.substr(i * 16, 16);\n      const hexSection = _leftPad(_bin2hex(binPart), '0', 4);\n      addr.push(hexSection);\n   }\n   return addr.join(':');\n};\n\nconst divideSubnet = function (addr, mask0, mask1, limit, abbr) {\n   if (!_validate(addr)) {\n      throw new Error('Invalid address: ' + addr);\n   }\n   mask0 *= 1;\n   mask1 *= 1;\n   limit *= 1;\n   mask1 = mask1 || 128;\n   if (mask0 < 1 || mask1 < 1 || mask0 > 128 || mask1 > 128 || mask0 > mask1) {\n      throw new Error('Invalid masks.');\n   }\n   const ret = [];\n   const binAddr = _addr2bin(addr);\n   const binNetPart = binAddr.substr(0, mask0);\n   const binHostPart = '0'.repeat(128 - mask1);\n   const numSubnets = Math.pow(2, mask1 - mask0);\n   for (let i = 0; i < numSubnets; ++i) {\n      if (!!limit && i >= limit) {\n         break;\n      }\n      const binSubnet = _leftPad(i.toString(2), '0', mask1 - mask0);\n      const binSubAddr = binNetPart + binSubnet + binHostPart;\n      const hexAddr = _bin2addr(binSubAddr);\n      if (!!abbr) {\n         ret.push(abbreviate(hexAddr));\n      } else {\n         ret.push(hexAddr);\n      }\n\n   }\n   // console.log(numSubnets);\n   // console.log(binNetPart, binSubnetPart, binHostPart);\n   // console.log(binNetPart.length, binSubnetPart.length, binHostPart.length);\n   // console.log(ret.length);\n   return ret;\n};\n\nconst range = function (addr, mask0, mask1, abbr) {\n   if (!_validate(addr)) {\n      throw new Error('Invalid address: ' + addr);\n   }\n   mask0 *= 1;\n   mask1 *= 1;\n   mask1 = mask1 || 128;\n   if (mask0 < 1 || mask1 < 1 || mask0 > 128 || mask1 > 128 || mask0 > mask1) {\n      throw new Error('Invalid masks.');\n   }\n   const binAddr = _addr2bin(addr);\n   const binNetPart = binAddr.substr(0, mask0);\n   const binHostPart = '0'.repeat(128 - mask1);\n   const binStartAddr = binNetPart + '0'.repeat(mask1 - mask0) + binHostPart;\n   const binEndAddr = binNetPart + '1'.repeat(mask1 - mask0) + binHostPart;\n   if (!!abbr) {\n      return {\n         start: abbreviate(_bin2addr(binStartAddr)),\n         end: abbreviate(_bin2addr(binEndAddr)),\n         size: Math.pow(2, mask1 - mask0)\n      };\n   } else {\n      return {\n         start: _bin2addr(binStartAddr),\n         end: _bin2addr(binEndAddr),\n         size: Math.pow(2, mask1 - mask0)\n      };\n   }\n};\n\nconst randomSubnet = function (addr, mask0, mask1, limit, abbr) {\n   if (!_validate(addr)) {\n      throw new Error('Invalid address: ' + addr);\n   }\n   mask0 *= 1;\n   mask1 *= 1;\n   limit *= 1;\n   mask1 = mask1 || 128;\n   limit = limit || 1;\n   if (mask0 < 1 || mask1 < 1 || mask0 > 128 || mask1 > 128 || mask0 > mask1) {\n      throw new Error('Invalid masks.');\n   }\n   const ret = [];\n   const binAddr = _addr2bin(addr);\n   const binNetPart = binAddr.substr(0, mask0);\n   const binHostPart = '0'.repeat(128 - mask1);\n   const numSubnets = Math.pow(2, mask1 - mask0);\n   for (let i = 0; i < numSubnets && i < limit; ++i) {\n      // generate an binary string with length of mask1 - mask0\n      let binSubnet = '';\n      for (let j = 0; j < mask1 - mask0; ++j) {\n         binSubnet += Math.floor(Math.random() * 2);\n      }\n      const binSubAddr = binNetPart + binSubnet + binHostPart;\n      const hexAddr = _bin2addr(binSubAddr);\n      if (!!abbr) {\n         ret.push(abbreviate(hexAddr));\n      } else {\n         ret.push(hexAddr);\n      }\n   }\n   // console.log(numSubnets);\n   // console.log(binNetPart, binSubnetPart, binHostPart);\n   // console.log(binNetPart.length, binSubnetPart.length, binHostPart.length);\n   // console.log(ret.length);\n   return ret;\n};\n\nconst ptr = function (addr, mask) {\n   if (!_validate(addr)) {\n      throw new Error('Invalid address: ' + addr);\n   }\n   mask *= 1;\n   if (mask < 1 || mask > 128 || Math.floor(mask / 4) != mask / 4) {\n      throw new Error('Invalid masks.');\n   }\n   const fullAddr = normalize(addr);\n   const reverse = fullAddr.replace(/:/g, '').split('').reverse();\n   return reverse.slice(0, (128 - mask) / 4).join('.');\n};\n\nif (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {\n   exports.normalize = normalize;\n   exports.abbreviate = abbreviate;\n   exports.divideSubnet = divideSubnet;\n   exports.range = range;\n   exports.randomSubnet = randomSubnet;\n   exports.ptr = ptr;\n} else {\n   window.normalize = normalize;\n   window.abbreviate = abbreviate;\n   window.divideSubnet = divideSubnet;\n   window.range = range;\n   window.randomSubnet = randomSubnet;\n   window.ptr = ptr;\n}\n","import ipaddr from 'ipaddr.js';\n// @ts-ignore: Can't find a @types/ip6 package\nimport ip6 from 'ip6';\n\nexport function isIP(addr: string) {\n  return ipaddr.isValid(addr);\n}\n\nexport function version(addr: string): number {\n  try {\n    const parse_addr = ipaddr.parse(addr);\n    const kind = parse_addr.kind();\n\n    if (kind === 'ipv4') {\n      return 4; //IPv4\n    } else if (kind === 'ipv6') {\n      return 6; //IPv6\n    } else {\n      /* istanbul ignore next */\n      return 0; //not 4 or 6\n    }\n  } catch (err) {\n    return 0; //not 4 or 6\n  }\n}\n\nexport function isV4(addr: string) {\n  return version(addr) === 4;\n}\n\nexport function isV6(addr: string) {\n  return version(addr) === 6;\n}\n\nexport function isRange(range: string) {\n  try {\n    const cidr = ipaddr.parseCIDR(range);\n    return true;\n  } catch (err) {\n    return false;\n  }\n}\n\nexport function inRange(addr: string, range: string | string[]) {\n  if (typeof range === 'string') {\n    if (range.indexOf('/') !== -1) {\n      try {\n        const range_data = range.split('/');\n\n        const parse_addr = ipaddr.parse(addr);\n        const parse_range = ipaddr.parse(range_data[0]);\n\n        //@ts-ignore:  It works.\n        return parse_addr.match(parse_range, range_data[1]);\n      } catch (err) {\n        return false;\n      }\n    } else {\n      addr = isV6(addr) ? ip6.normalize(addr) : addr; //v6 normalize addr\n      range = isV6(range) ? ip6.normalize(range) : range; //v6 normalize range\n\n      return isIP(range as string) && addr === range;\n    }\n  } else if (range && typeof range === 'object') {\n    //list\n    for (const check_range in range) {\n      if (inRange(addr, range[check_range]) === true) {\n        return true;\n      }\n    }\n    return false;\n  } else {\n    return false;\n  }\n}\n\nexport function storeIP(addr: string) {\n  try {\n    var parse_addr = ipaddr.parse(addr);\n    var kind = parse_addr.kind();\n\n    if (kind === 'ipv4') {\n      //is a plain v4 address\n      return addr;\n    } else if (kind === 'ipv6') {\n      //@ts-ignore:  it exists!\n      if (parse_addr.isIPv4MappedAddress()) {\n        //convert v4 mapped to v6 addresses to a v4 in it's original format\n        //@ts-ignore:  it exists!\n        return parse_addr.toIPv4Address().toString();\n      } //is a v6, abbreviate it\n      else {\n        return ip6.abbreviate(addr);\n      }\n    } else {\n      return null; //invalid IP address\n    }\n  } catch (err) {\n    return null; //invalid IP address\n  }\n}\n\n// searchIP is a aliases of storeIP\nexport { storeIP as searchIP };\n\nexport function displayIP(addr: string) {\n  try {\n    var parse_addr = ipaddr.parse(addr);\n    var kind = parse_addr.kind();\n\n    if (kind === 'ipv4') {\n      //is a plain v4 address\n      return addr;\n    } else if (kind === 'ipv6') {\n      //@ts-ignore:  it exists!\n      if (parse_addr.isIPv4MappedAddress()) {\n        //convert v4 mapped to v6 addresses to a v4 in it's original format\n        //@ts-ignore:  it exists!\n        return parse_addr.toIPv4Address().toString();\n      } //is a v6, normalize it\n      else {\n        return ip6.normalize(addr);\n      }\n    } else {\n      return ''; //invalid IP address\n    }\n  } catch (err) {\n    return ''; //invalid IP address\n  }\n}\n","/**\n * Create a wpm namespace under which all functions are declared\n */\n\n// https://stackoverflow.com/a/5947280/4688612\n\n(function (wpm, $, undefined) {\n\n\tconst wpmDeduper = {\n\t\tkeyName          : \"_wpm_order_ids\",\n\t\tcookieExpiresDays: 365,\n\t};\n\n\tconst wpmRestSettings = {\n\t\t// cookiesAvailable                  : '_wpm_cookies_are_available',\n\t\tcookiePmwRestEndpointAvailable: \"restEndpointAvailable\",\n\t\trestEndpointPost              : \"pmw/v1/test/\",\n\t\trestFails                     : 0,\n\t\trestFailsThreshold            : 10,\n\t};\n\n\twpm.emailSelected         = false;\n\twpm.paymentMethodSelected = false;\n\n\twpm.isBelowRestErrorThreshold = () => wpm.retrieveData(wpmRestSettings.restFails) <= wpmRestSettings.restFailsThreshold;\n\n\twpm.isRestEndpointAvailable = async () => {\n\n\t\t// If we already tested the endpoint and have a stored value, return it\n\t\tif (wpm.retrieveData(wpmRestSettings.cookiePmwRestEndpointAvailable)) {\n\t\t\treturn wpm.retrieveData(wpmRestSettings.cookiePmwRestEndpointAvailable);\n\t\t}\n\n\t\treturn await wpm.testEndpoint();\n\t};\n\n\t/**\n\t * Tests a given endpoint by sending a POST request. If the response status is 200, it stores `true` in the dataStorage with given cookie name; else it stores `false`.\n\t *\n\t * @param {string} url - The URL of the endpoint to test. Defaults to concatenation of `wpm.root` and `wpmRestSettings.restEndpointPost`.\n\t * @param {string} cookieName - The name of the cookie where the test result will be stored. Defaults to `wpmRestSettings.cookiePmwRestEndpointAvailable`.\n\t * @returns {Promise<boolean>} - Returns a promise that resolves to `true` if the response status is 200, and `false` otherwise.\n\t * @async\n\t */\n\twpm.testEndpoint = async (\n\t\turl        = wpm.root + wpmRestSettings.restEndpointPost,\n\t\tcookieName = wpmRestSettings.cookiePmwRestEndpointAvailable,\n\t) => {\n\n\t\ttry {\n\n\t\t\tconst response = await fetch(url, {\n\t\t\t\tmethod   : \"POST\",\n\t\t\t\tmode     : \"cors\",\n\t\t\t\tcache    : \"no-cache\",\n\t\t\t\tkeepalive: true,\n\t\t\t\tredirect : \"error\",\t// don't follow redirects\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\twpm.storeData(cookieName, false);\n\t\t\t\tpmw.console.error(\"Error testing the endpoint. Status: \" + response.status + \" | response: \", response);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst responseJson = await response.json();\n\n\t\t\t// Return false if responseJson.success is not true\n\t\t\tif (!responseJson.success) {\n\t\t\t\twpm.storeData(cookieName, false);\n\t\t\t\tpmw.console.error(\"Error testing the endpoint. Response JSON: \" + JSON.stringify(responseJson));\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\twpm.storeData(cookieName, true);\n\t\t\treturn true;\n\n\t\t} catch (e) {\n\t\t\twpm.storeData(cookieName, false);\n\t\t\tpmw.console.error(\"Error testing the endpoint. Error: \" + e);\n\t\t\treturn false;\n\t\t}\n\t};\n\n\twpm.isWpmRestEndpointAvailable = (cookieName = wpmRestSettings.cookiePmwRestEndpointAvailable) => !!wpm.retrieveData(cookieName);\n\n\t/**\n\t * This function writes the provided orderId into storage. It will first retrieve the existing orderIds\n\t * from the storage if any, then add the new orderId into this existing array of orderIds  and stores\n\t * the updated array back to the storage.\n\t * If the function wpm.storeOrderIdOnServer exists and order_duplication_prevention is set to true in wpmDataLayer.shop,\n\t * this function will also store the orderId, orderKey and source on the server side using wpm.storeOrderIdOnServer.\n\t *\n\t * @param {String}  orderId  - The ID of the order to be stored.\n\t * @param {String}  orderKey - The Key of the order to be stored.\n\t * @param {String}  source - The source from which the order originated (default: 'thankyou_page').\n\t */\n\twpm.writeOrderIdToStorage = (orderId, orderKey, source = \"thankyou_page\") => {\n\n\t\t// Get existing order ids\n\t\tlet orderIds = wpm.retrieveData(\"orderIds\", true) || [];\n\n\t\t// Add the new order id\n\t\torderIds.push(orderId);\n\n\t\t// Store the order ids\n\t\twpm.storeData(\"orderIds\", orderIds, true);\n\n\t\tif (typeof wpm.storeOrderIdOnServer === \"function\") {\n\t\t\twpm.storeOrderIdOnServer({\n\t\t\t\torderId : orderId,\n\t\t\t\torderKey: orderKey,\n\t\t\t\tsource  : source,\n\t\t\t});\n\t\t}\n\t};\n\n\twpm.isOrderIdStored = orderId => {\n\n\t\t// If order deduplication is disabled, return false\n\t\tif (!wpmDataLayer.shop.order_duplication_prevention) {\n\t\t\tpmw.console.log(\"order duplication prevention is off\");\n\t\t\treturn false;\n\t\t}\n\n\t\tconst orderIds = wpm.retrieveData(\"orderIds\", true) || [];\n\t\treturn orderIds.includes(orderId);\n\t};\n\n\t/**\n\t * Check if the email address is valid\n\t *\n\t * https://stackoverflow.com/questions/201323/how-can-i-validate-an-email-address-using-a-regular-expression\n\t * https://www.w3.org/TR/html5/forms.html#valid-e-mail-address\n\t * https://fightingforalostcause.net/content/misc/2006/compare-email-regex.php\n\t *\n\t * @param email\n\t * @returns {boolean}\n\t */\n\twpm.isEmail = email => {\n\n\t\t/**\n\t\t * GitHub Copilot generated RFC 5322 compliant regex\n\t\t * - Don't allow emails without a top-level domain like \"john@localhost\"\n\t\t * - Don't allow emails with dots at the end of the name like \"[email protected]\"\n\t\t */\n\t\tconst regex = new RegExp(\n\t\t\t\"^(([^<>()\\\\[\\\\]\\\\\\\\.,;:\\\\s@\\\"]+(\\\\.[^<>()\\\\[\\\\]\\\\\\\\.,;:\\\\s@\\\"]+)*)|(\\\".+\\\"))\"\n\t\t\t+ \"@\"\n\t\t\t+ \"((\\\\[[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\\\\])\"\n\t\t\t+ \"|(([a-zA-Z\\\\-0-9]+\\\\.)+[a-zA-Z]{2,}))$\",\n\t\t);\n\n\t\treturn regex.test(email);\n\t};\n\n\twpm.removeProductFromCart = async (productId, quantityToRemove = null) => {\n\n\t\ttry {\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\t\tproductId = wpm.getIdBasedOndVariationsOutputSetting(productId);\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\t\tlet quantity;\n\n\t\t\tif (quantityToRemove == null) {\n\t\t\t\tquantity = wpmDataLayer.cart[productId].quantity;\n\t\t\t} else {\n\t\t\t\tquantity = quantityToRemove;\n\t\t\t}\n\n\t\t\tif (!wpmDataLayer.cart[productId]) {\n\t\t\t\tawait wpm.getProductsFromBackend([productId]);\n\t\t\t}\n\n\t\t\tlet product = wpm.getProductDetailsFormattedForEvent(productId, quantity);\n\n\t\t\tjQuery(document).trigger(\"pmw:remove-from-cart\", product);\n\n\t\t\tif (quantityToRemove == null || wpmDataLayer.cart[productId].quantity === quantityToRemove) {\n\t\t\t\tdelete wpmDataLayer.cart[productId];\n\t\t\t} else {\n\t\t\t\twpmDataLayer.cart[productId].quantity = wpmDataLayer.cart[productId].quantity - quantity;\n\t\t\t}\n\n\t\t\twpm.storeCartData(wpmDataLayer.cart);\n\n\t\t} catch (e) {\n\t\t\tpmw.console.error(\"error: \", e);\n\t\t}\n\t};\n\n\twpm.getIdBasedOndVariationsOutputSetting = productId => {\n\n\t\ttry {\n\t\t\tif (wpmDataLayer?.shop?.variations_output) return productId;\n\n\t\t\tif (wpmDataLayer.products[productId].is_variation) return wpmDataLayer.products[productId].parent_id;\n\n\t\t\treturn productId;\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\twpm.prepareSelectors = (selectors, type) => {\n\n\t\tif (wpmDataLayer?.shop?.selectors?.[type]) {\n\n\t\t\t// merge the selectors from the addToCartSelectors array with the selectors from the wpmDataLayer.shop.selectors.addToCart array\n\t\t\tselectors = selectors.concat(wpmDataLayer.shop.selectors[type]);\n\n\t\t\t// Remove duplicates\n\t\t\tselectors = [...new Set(selectors)];\n\n\t\t\t// If one of the selectors is document, remove it\n\t\t\tif (selectors.indexOf(\"document\") >= 0) {\n\t\t\t\tselectors.splice(selectors.indexOf(\"document\"), 1);\n\t\t\t}\n\n\t\t\t// If one of the selectors is body, remove all others\n\t\t\tif (selectors.indexOf(\"body\") >= 0) {\n\t\t\t\tselectors = [\"body\"];\n\t\t\t}\n\t\t}\n\n\t\treturn selectors.join(\", \");\n\t};\n\n\t// add_to_cart\n\twpm.addProductToCart = async (productId, quantity) => {\n\n\t\t// Cast quantity to number to make sure it's a number\n\t\tquantity = Number(quantity);\n\n\t\ttry {\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\t\tproductId = wpm.getIdBasedOndVariationsOutputSetting(productId);\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\t\tif (!wpmDataLayer?.products[productId]) {\n\t\t\t\tawait wpm.getProductsFromBackend([productId]);\n\t\t\t}\n\n\t\t\tlet product = wpm.getProductDetailsFormattedForEvent(productId, quantity);\n\n\t\t\tjQuery(document).trigger(\"pmw:add-to-cart\", product);\n\n\t\t\t// add product to cart wpmDataLayer['cart']\n\n\t\t\t// if the product already exists in the object, only add the additional quantity\n\t\t\t// otherwise create that product object in the wpmDataLayer['cart']\n\t\t\tif (wpmDataLayer?.cart[productId]) {\n\n\t\t\t\twpmDataLayer.cart[productId].quantity = wpmDataLayer.cart[productId].quantity + quantity;\n\t\t\t} else {\n\n\t\t\t\tif (!(\"cart\" in wpmDataLayer)) wpmDataLayer.cart = {};\n\n\t\t\t\twpmDataLayer.cart[productId] = wpm.getProductDetailsFormattedForEvent(productId, quantity);\n\t\t\t}\n\n\t\t\twpm.storeCartData(wpmDataLayer.cart);\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\n\t\t\t// fallback if wpmDataLayer.cart and wpmDataLayer.products got out of sync in case cart caching has an issue\n\t\t\twpm.getCartItemsFromBackend();\n\t\t}\n\t};\n\n\twpm.initCart = () => {\n\n\t\t// If the WC cart doesn't exist, eg. after a confirmed purchase,\n\t\t// and we still have a cart object in the storage, reset it.\n\t\tif (\n\t\t\t!wpm.doesWooCommerceCartExist()\n\t\t\t&& Object.keys(wpm.retrieveCartData()).length !== 0\n\t\t) {\n\t\t\twpm.storeCartData({});\n\t\t\treturn;\n\t\t}\n\n\t\t// If the cart object is in the storage, use it\n\t\tif (wpm.retrieveCartData()) {\n\t\t\twpm.saveCartObjectToDataLayer(wpm.retrieveCartData());\n\t\t\treturn;\n\t\t}\n\n\t\t// If the cart object is missing in the storage, create an empty one and get the cart items from the backend\n\t\twpm.storeCartData({});\n\t\twpm.getCartItemsFromBackend();\n\t};\n\n\t// get all cart items from the backend\n\twpm.getCartItemsFromBackend = () => {\n\t\ttry {\n\n\t\t\t/**\n\t\t\t * Can't use a REST API endpoint, as the cart session will not be loaded if the\n\t\t\t * endpoint is called.\n\t\t\t *\n\t\t\t * https://wordpress.org/support/topic/wc-cart-is-null-in-custom-rest-api/#post-11442843\n\t\t\t */\n\n\t\t\t/**\n\t\t\t * Get the cart items from the backend the data object using fetch API\n\t\t\t * and log success or error messages\n\t\t\t * and url encoded data\n\t\t\t */\n\t\t\tfetch(wpm.ajax_url, {\n\t\t\t\tmethod   : \"POST\",\n\t\t\t\tcache    : \"no-cache\",\n\t\t\t\tbody     : new URLSearchParams({action: \"pmw_get_cart_items\"}),\n\t\t\t\tkeepalive: true,\n\t\t\t\tredirect : \"error\",\n\t\t\t})\n\t\t\t\t.then(response => {\n\t\t\t\t\tif (response.ok) {\n\t\t\t\t\t\treturn response.json();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow Error(\"Error getting cart items from backend\");\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.then(data => {\n\n\t\t\t\t\tif (data.success) {\n\n\t\t\t\t\t\tif (!data.data[\"cart\"]) data.data[\"cart\"] = {};\n\t\t\t\t\t\twpm.saveCartObjectToDataLayer(data.data[\"cart\"]);\n\t\t\t\t\t\twpm.storeCartData(data.data[\"cart\"]);\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow Error(\"Error getting cart items from backend\");\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\t// Get product IDs from the backend\n\twpm.getProductsFromBackend = async productIds => {\n\n\t\tif (wpmDataLayer?.products) {\n\t\t\t// If productIds already exists as key in wpmDataLayer.products, remove it from the array\n\t\t\tproductIds = productIds.filter(productId => !(productId in wpmDataLayer.products));\n\t\t}\n\n\t\t// If no product IDs are in the object, don't try to get anything from the server\n\t\tif (!productIds || productIds.length === 0) return;\n\n\t\t// if no page_id is set, don't try to get anything from the server\n\t\tif (!wpmDataLayer.general.page_id) return;\n\n\t\t// if productIds is not an array, or it's an empty array, don't try to get anything from the server\n\t\tif (!Array.isArray(productIds) || productIds.length === 0) return;\n\n\t\ttry {\n\n\t\t\tlet data = {\n\t\t\t\taction     : \"pmw_get_product_ids\",  // for the AJAX call\n\t\t\t\tpage_id    : wpmDataLayer.general.page_id,\n\t\t\t\tpage_type  : wpmDataLayer.shop.page_type,\n\t\t\t\tproduct_ids: productIds,\n\t\t\t};\n\n\t\t\tconst isRestEndpointAvailable = await wpm.isRestEndpointAvailable();\n\t\t\tconst url                     = isRestEndpointAvailable ? wpm.root + \"pmw/v1/products/\" : wpm.ajax_url;\n\n\t\t\tconst options = {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\tcache : \"no-cache\",\n\t\t\t\tbody  : isRestEndpointAvailable ? JSON.stringify(data) : new URLSearchParams(data),\n\t\t\t};\n\n\t\t\t// If the REST API is available, set the headers to JSON\n\t\t\tif (isRestEndpointAvailable) {\n\t\t\t\toptions.headers = {\"Content-Type\": \"application/json\"};\n\t\t\t}\n\n\t\t\tlet response = await fetch(url, options);\n\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new Error(\"Error getting products from backend. Status: \" + response.status + \" Status text: \" + response.statusText);\n\t\t\t}\n\n\t\t\tlet responseData = await response.json();\n\n\t\t\tif (!responseData.success) {\n\t\t\t\tthrow new Error(\"Error getting products from backend: \" + responseData.data);\n\t\t\t}\n\n\t\t\twpmDataLayer.products = Object.assign({}, wpmDataLayer.products, responseData.data);\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\n\t\treturn true;\n\t};\n\n\twpm.saveCartObjectToDataLayer = cartObject => {\n\n\t\twpmDataLayer.cart     = cartObject;\n\t\twpmDataLayer.products = Object.assign({}, wpmDataLayer.products, cartObject);\n\t};\n\n\twpm.triggerViewItemEventPrep = async productId => {\n\n\t\tif (!wpmDataLayer?.products[productId]) {\n\t\t\tawait wpm.getProductsFromBackend([productId]);\n\t\t}\n\n\t\tif (!wpmDataLayer?.products[productId]) {\n\t\t\twpm.triggerViewItemEventNoProduct();\n\t\t\tpmw.console.log(`Product with ID ${productId} not found in the data layer and couldn't be retrieved from the backend. Triggering view-item event without product data.`);\n\t\t} else {\n\t\t\twpm.triggerViewItemEvent(productId);\n\t\t}\n\t};\n\n\twpm.triggerViewItemEvent = productId => {\n\n\t\tlet product = wpm.getProductDetailsFormattedForEvent(productId);\n\n\t\tif (!product) return;\n\n\t\tjQuery(document).trigger(\"pmw:view-item\", product);\n\t};\n\n\twpm.triggerViewItemEventNoProduct = () => {\n\t\tjQuery(document).trigger(\"pmw:view-item\");\n\t};\n\n\twpm.fireCheckoutOption = (step, checkout_option = null, value = null) => {\n\n\t\tlet data = {\n\t\t\tstep           : step,\n\t\t\tcheckout_option: checkout_option,\n\t\t\tvalue          : value,\n\t\t};\n\n\t\tjQuery(document).trigger(\"pmw:checkout-option\", data);\n\t};\n\n\twpm.fireCheckoutProgress = step => {\n\n\t\tlet data = {\n\t\t\tstep: step,\n\t\t};\n\n\t\tjQuery(document).trigger(\"pmw:checkout-progress\", data);\n\t};\n\n\twpm.getPostIdFromString = string => {\n\n\t\ttry {\n\t\t\treturn string.match(/(post-)(\\d+)/)[2];\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\twpm.triggerViewItemList = productId => {\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\tproductId = wpm.getIdBasedOndVariationsOutputSetting(productId);\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\tjQuery(document).trigger(\"pmw:view-item-list\", wpm.getProductDataForViewItemEvent(productId));\n\t};\n\n\twpm.getProductDataForViewItemEvent = productId => {\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\ttry {\n\t\t\tif (wpmDataLayer.products[productId]) {\n\n\t\t\t\treturn wpm.getProductDetailsFormattedForEvent(productId);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\twpm.getMainProductIdFromProductPage = () => {\n\n\t\ttry {\n\t\t\tif ([\"simple\", \"variable\", \"grouped\", \"composite\", \"bundle\"].indexOf(wpmDataLayer.shop.product_type) >= 0) {\n\t\t\t\treturn jQuery(\".wpmProductId:first\").data(\"id\");\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\twpm.viewItemListTriggerTestMode = target => {\n\n\t\tjQuery(target).css({\"position\": \"relative\"});\n\t\tjQuery(target).append(\"<div id=\\\"viewItemListTriggerOverlay\\\"></div>\");\n\t\tjQuery(target).find(\"#viewItemListTriggerOverlay\").css({\n\t\t\t\"z-index\"         : \"10\",\n\t\t\t\"display\"         : \"block\",\n\t\t\t\"position\"        : \"absolute\",\n\t\t\t\"height\"          : \"100%\",\n\t\t\t\"top\"             : \"0\",\n\t\t\t\"left\"            : \"0\",\n\t\t\t\"right\"           : \"0\",\n\t\t\t\"opacity\"         : wpmDataLayer.shop.view_item_list_trigger.opacity,\n\t\t\t\"background-color\": wpmDataLayer.shop.view_item_list_trigger.background_color,\n\t\t});\n\t};\n\n\twpm.getSearchTermFromUrl = () => {\n\n\t\ttry {\n\t\t\tlet urlParameters = new URLSearchParams(window.location.search);\n\t\t\treturn urlParameters.get(\"s\");\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\t// we need this to track timeouts for intersection observers\n\tlet ioTimeouts = {};\n\n\twpm.observerCallback = (entries, observer) => {\n\n\t\tentries.forEach((entry) => {\n\n\t\t\ttry {\n\t\t\t\tlet productId;\n\n\t\t\t\tlet elementId = jQuery(entry.target).data(\"ioid\");\n\n\t\t\t\t// Get the productId from next element, if wpmProductId is a sibling, like in Gutenberg blocks\n\t\t\t\t// otherwise go search in children, like in regular WC loop items\n\t\t\t\tif (jQuery(entry.target).next(\".wpmProductId\").length) {\n\t\t\t\t\t// console.log('test 1');\n\t\t\t\t\tproductId = jQuery(entry.target).next(\".wpmProductId\").data(\"id\");\n\t\t\t\t} else {\n\t\t\t\t\tproductId = jQuery(entry.target).find(\".wpmProductId\").data(\"id\");\n\t\t\t\t}\n\n\n\t\t\t\tif (!productId) throw Error(\"wpmProductId element not found\");\n\n\t\t\t\tif (entry.isIntersecting) {\n\n\t\t\t\t\tioTimeouts[elementId] = setTimeout(() => {\n\n\t\t\t\t\t\twpm.triggerViewItemList(productId);\n\t\t\t\t\t\tif (wpmDataLayer.shop.view_item_list_trigger.test_mode) wpm.viewItemListTriggerTestMode(entry.target);\n\t\t\t\t\t\tif (wpmDataLayer.shop.view_item_list_trigger.repeat === false) observer.unobserve(entry.target);\n\t\t\t\t\t}, wpmDataLayer.shop.view_item_list_trigger.timeout);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tclearTimeout(ioTimeouts[elementId]);\n\t\t\t\t\tif (wpmDataLayer.shop.view_item_list_trigger.test_mode) jQuery(entry.target).find(\"#viewItemListTriggerOverlay\").remove();\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t});\n\t};\n\n\t// fire view_item_list only on products that have become visible\n\tlet io;\n\tlet ioid = 0;\n\n\tconst getCommonIdentifiersToWatch = () => {\n\n\t\tlet listOfClassNames = {\n\t\t\tnested: [],\n\t\t\tflat  : [],\n\t\t};\n\n\t\ttry {\n\n\t\t\tconst haveSameNestingDepth = (element1, element2) => {\n\n\t\t\t\t// If both are the same, return the parent\n\t\t\t\treturn jQuery(element1).parents().length === jQuery(element2).parents().length;\n\t\t\t};\n\n\t\t\tconst findCommonParentElement = (element1, element2) => {\n\t\t\t\t// If both are the same, return the parent\n\t\t\t\tif (jQuery(element1).parent().is(jQuery(element2).parent())) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tnode: jQuery(element1).parent(),\n\t\t\t\t\t\ttype: \"flat\",\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tnode: jQuery(element1).parents().has(jQuery(element2).parents()).first(),\n\t\t\t\t\ttype: \"nested\",\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tconst countOfChildren = (element) => {\n\t\t\t\t// Return the count of \"wpmProductId\" elements\n\t\t\t\treturn jQuery(element).find(\".wpmProductId\").length;\n\t\t\t};\n\n\t\t\tconst getCommonClass = (classes1, classes2) => {\n\n\t\t\t\t// console.log(\"classes1\", classes1);\n\t\t\t\t// console.log(\"classes2\", classes2);\n\t\t\t\t// classes 1 and 2 are arrays of classes\n\t\t\t\t// They may contain the same classes, but not in the same order\n\t\t\t\t// Return the first common class that's present in both arrays\n\n\t\t\t\treturn classes1.filter(value => classes2.includes(value))[0] || null;\n\t\t\t};\n\n\t\t\tconst wpmProductIds = document.querySelectorAll(\".wpmProductId\");\n\n\t\t\t// If zero or only one product template is found, then we can't run the algorithm\n\t\t\tif (wpmProductIds.length === 1) {\n\t\t\t\t// console.log(\"No product or too few templates found\")\n\t\t\t\treturn listOfClassNames;\n\t\t\t}\n\n\t\t\t// console.log(\"wpmProductIds\", wpmProductIds);\n\t\t\t// console.log(\"looping\")\n\n\t\t\tfor (let i = 0; i < wpmProductIds.length - 1; i++) {\n\n\t\t\t\t// console.log(\"i\", i)\n\n\t\t\t\tif (!haveSameNestingDepth(wpmProductIds[i], wpmProductIds[i + 1])) {\n\t\t\t\t\t// console.log(\"The nesting depth is not the same\")\n\t\t\t\t\ti++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tlet productsNode = findCommonParentElement(wpmProductIds[i], wpmProductIds[i + 1]);\n\t\t\t\t// console.log(\"productsNode.node\", productsNode.node)\n\t\t\t\t// console.log(\"productsNode.type\", productsNode.type)\n\n\t\t\t\t// If the productsNode is nested, get the first class of the first child. Then console log the class\n\t\t\t\tif (productsNode.type === \"nested\") {\n\n\t\t\t\t\tlet firstChildClassAttr = productsNode.node.children().first().attr(\"class\");\n\t\t\t\t\tlet firstChildClasses   = firstChildClassAttr ? firstChildClassAttr.split(\" \") : [];\n\n\t\t\t\t\tlet secondChildClassAttr = productsNode.node.children().first().next().attr(\"class\");\n\t\t\t\t\tlet secondChildClasses   = secondChildClassAttr ? secondChildClassAttr.split(\" \") : [];\n\n\t\t\t\t\tconst commonClass = getCommonClass(firstChildClasses, secondChildClasses);\n\n\t\t\t\t\tlistOfClassNames.nested.push(commonClass);\n\t\t\t\t} else if (productsNode.type === \"flat\") {\n\n\t\t\t\t\t// If class is not found, continue\n\t\t\t\t\tif (!productsNode.node.children().first().attr(\"class\")) continue;\n\n\t\t\t\t\t// firstProductTemplateClasses is the classes of the first child element of the productsNode\n\t\t\t\t\tlet firstProductTemplateClasses = productsNode.node.children().first().attr(\"class\").split(\" \")[0];\n\n\t\t\t\t\tlistOfClassNames.flat.push(firstProductTemplateClasses);\n\t\t\t\t}\n\n\t\t\t\t// which wpmProductIds is the last one in the productsNode? console log the index of the last wpmProductId in the productsNode\n\t\t\t\t// console.log(\"productsNode.children().length\", countOfChildren(productsNode));\n\n\t\t\t\ti = i + countOfChildren(productsNode.node) - 1;\n\t\t\t}\n\n\t\t\t// Make the list of class names unique\n\t\t\tlistOfClassNames.nested = [...new Set(listOfClassNames.nested)];\n\t\t\tlistOfClassNames.flat   = [...new Set(listOfClassNames.flat)];\n\n\t\t\treturn listOfClassNames;\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t\treturn listOfClassNames;\n\t\t}\n\t};\n\n\n\tlet detectedProductTemplateClasses = {\n\t\tnested: [],\n\t\tflat  : [],\n\t};\n\n\tconst isNestedClass = (elem) => {\n\t\tlet nestedClassNames = [\n\t\t\t\"product\",\n\t\t\t\"type-product\",\n\t\t\t\"product-item-inner\",\n\t\t\t...detectedProductTemplateClasses.nested,\n\t\t];\n\n\t\treturn nestedClassNames.some(className => jQuery(elem).closest(\".\" + className).length);\n\t};\n\n\tconst isFlatClass = (elem) => {\n\n\t\tlet flatClassNames = [\n\t\t\t\"wc-block-grid__product\",\n\t\t\t\"product\",\n\t\t\t\"product-small\",\n\t\t\t\"woocommerce-LoopProduct-link\",\n\t\t\t...detectedProductTemplateClasses.flat,\n\t\t];\n\n\t\treturn flatClassNames.some(className => jQuery(elem).prev().hasClass(className));\n\t};\n\n\tconst getAllElementsToWatch = () => {\n\n\t\tdetectedProductTemplateClasses = getCommonIdentifiersToWatch();\n\n\t\treturn jQuery(\".wpmProductId\")\n\t\t\t.map(function (i, elem) {\n\n\t\t\t\tif (isNestedClass(elem)) {\n\t\t\t\t\treturn jQuery(elem).parent();\n\t\t\t\t} else if (isFlatClass(elem)) {\n\t\t\t\t\treturn jQuery(this).prev();\n\t\t\t\t} else if (jQuery(elem).closest(\".product\").length) {\n\t\t\t\t\treturn jQuery(elem).closest(\".product\");\n\t\t\t\t}\n\t\t\t});\n\t};\n\n\twpm.startIntersectionObserverToWatch = () => {\n\n\t\ttry {\n\t\t\t// enable view_item_list test mode from browser\n\t\t\tif (wpm.urlHasParameter(\"vildemomode\")) wpmDataLayer.shop.view_item_list_trigger.test_mode = true;\n\n\t\t\t// set up intersection observer\n\t\t\t// https://stackoverflow.com/questions/62084306/intersectionobserver-not-working-in-safari-or-ios\n\t\t\tio = new IntersectionObserver(wpm.observerCallback, {\n\t\t\t\troot: null,\n\t\t\t\t// root     : document.body,\n\t\t\t\tthreshold: wpmDataLayer.shop.view_item_list_trigger.threshold,\n\t\t\t});\n\n\t\t\tgetAllElementsToWatch().each((i, elem) => {\n\n\t\t\t\tjQuery(elem[0]).data(\"ioid\", ioid++);\n\n\t\t\t\tio.observe(elem[0]);\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\t// Watch DOM for new lazy loaded products and add them to the intersection observer\n\twpm.startProductsMutationObserverToWatch = () => {\n\n\t\ttry {\n\t\t\t// Pass in the target node, as well as the observer options\n\n\t\t\t// selects the most common parent node\n\t\t\t// https://stackoverflow.com/a/7648323/4688612\n\t\t\tlet productsNode = jQuery(\".wpmProductId:eq(0)\").parents().has(jQuery(\".wpmProductId:eq(1)\").parents()).first();\n\n\t\t\tif (productsNode.length) {\n\t\t\t\tproductsMutationObserver.observe(productsNode[0], {\n\t\t\t\t\tattributes   : true,\n\t\t\t\t\tchildList    : true,\n\t\t\t\t\tcharacterData: true,\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\t// Create an observer instance\n\tconst productsMutationObserver = new MutationObserver(mutations => {\n\n\t\tmutations.forEach(mutation => {\n\t\t\tlet newNodes = mutation.addedNodes; // DOM NodeList\n\t\t\tif (newNodes !== null) { // If there are new nodes added\n\t\t\t\tlet nodes = jQuery(newNodes); // jQuery set\n\t\t\t\tnodes.each((i, node) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\t// jQuery(this).hasClass(\"type-product\") ||\n\t\t\t\t\t\t// jQuery(this).hasClass(\"product-small\") ||\n\t\t\t\t\t\t// jQuery(this).hasClass(\"wc-block-grid__product\")\n\t\t\t\t\t\t// jQuery(this).hasClass(\"type-product\")\n\t\t\t\t\t\tisNestedClass(node) || isFlatClass(node)\n\t\t\t\t\t) {\n\t\t\t\t\t\t// check if the node has a child or sibling wpmProductId\n\t\t\t\t\t\t// if yes add it to the intersectionObserver\n\t\t\t\t\t\tif (hasWpmProductIdElement(node)) {\n\t\t\t\t\t\t\tjQuery(node).data(\"ioid\", ioid++);\n\t\t\t\t\t\t\tio.observe(node);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t});\n\n\tlet hasWpmProductIdElement = elem =>\n\t\t!!(jQuery(elem).find(\".wpmProductId\").length ||\n\t\t\tjQuery(elem).siblings(\".wpmProductId\").length);\n\n\t/**\n\t * Sets a new cookie or updates an existing one with the provided name and value.\n\t *\n\t * @function setCookie\n\t * @global\n\t * @param {string} cookieName - The name of the cookie.\n\t * @param {string} [cookieValue=\"\"] - The value to set for the cookie. Default value is an empty string.\n\t * @param {number|null} [expiryDays=null] - The number of days until the cookie expires. If not provided, the cookie will last until the end of the session.\n\t * @returns {void}\n\t *\n\t * @example\n\t * // This will create a cookie \"username\" with the value \"JohnDoe\" that expires in 7 days\n\t * wpm.setCookie(\"username\", \"JohnDoe\", 7);\n\t */\n\twpm.setCookie = (cookieName, cookieValue = \"\", expiryDays = null) => {\n\n\t\tif (expiryDays) {\n\n\t\t\tlet d = new Date();\n\t\t\td.setTime(d.getTime() + (expiryDays * 24 * 60 * 60 * 1000));\n\t\t\tlet expires     = \"expires=\" + d.toUTCString();\n\t\t\tdocument.cookie = cookieName + \"=\" + cookieValue + \";\" + expires + \";path=/\";\n\t\t} else {\n\t\t\tdocument.cookie = cookieName + \"=\" + cookieValue + \";path=/\";\n\t\t}\n\t};\n\n\t/**\n\t * Retrieves the value of a specific cookie from the document's cookie string.\n\t *\n\t * @param {String} cookieName - The name of the cookie to retrieve.\n\t * @returns {String} - The value of the cookie if found, an empty string otherwise.\n\t *\n\t * @example\n\t * // returns 'value' if 'cookieName=value' exists in document.cookie\n\t * wpm.getCookie('cookieName')\n\t */\n\twpm.getCookie = cookieName => {\n\n\t\tlet name          = cookieName + \"=\";\n\t\tlet decodedCookie = decodeURIComponent(document.cookie);\n\t\tlet ca            = decodedCookie.split(\";\");\n\n\t\tfor (let i = 0; i < ca.length; i++) {\n\n\t\t\tlet c = ca[i];\n\n\t\t\twhile (c.charAt(0) == \" \") {\n\t\t\t\tc = c.substring(1);\n\t\t\t}\n\n\t\t\tif (c.indexOf(name) == 0) {\n\t\t\t\treturn c.substring(name.length, c.length);\n\t\t\t}\n\t\t}\n\n\t\treturn \"\";\n\t};\n\n\t/**\n\t * Find and get the cookie with a name that contains the string.\n\t * If one is found, then return the cookie.\n\t * If none is found, then return false.\n\t *\n\t * @param string\n\t * @returns {boolean|string}\n\t *\n\t * @since 1.32.5\n\t */\n\twpm.getCookieThatContainsRegex = (regex) => {\n\n\t\tlet cookies = document.cookie.split(\";\");\n\n\t\tfor (let i = 0; i < cookies.length; i++) {\n\t\t\tlet cookie = cookies[i].trim();\n\n\t\t\tif (regex.test(cookie)) {\n\t\t\t\treturn cookie;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t};\n\n\twpm.deleteCookie = cookieName => {\n\t\twpm.setCookie(cookieName, \"\", -1);\n\t};\n\n\t/**\n\t * Store data in the browser\n\t *\n\t * Try to store the data in the local storage (session or persistent) if available.\n\t * If not available, store the data in the cookie.\n\t *\n\t * Max cookie expiry is 400 days as specified by Google Chrome: https://developer.chrome.com/blog/cookie-max-age-expires/\n\t *\n\t * @param key\n\t * @param value\n\t * @param persistent\n\t * @param extension - If true, this will be saved in a separate key\n\t */\n\twpm.storeData = (key, value, persistent = false, extension = false) => {\n\n\t\tconst suffix = extension ? key : \"\";\n\n\t\tlet dataGetter = persistent ? wpm.getPersistentData : wpm.getSessionData;\n\t\tlet dataSetter = persistent ? wpm.setPersistentData : wpm.setSessionData;\n\n\t\tlet data = dataGetter(suffix);\n\t\textension ? data = value : data[key] = value;\n\n\t\tdataSetter(data, suffix);\n\t};\n\n\twpm.retrieveData = (key, persistent = false, extension = false) => {\n\n\t\tconst suffix = extension ? key : \"\";\n\n\t\tlet data = persistent ? wpm.getPersistentData(suffix) : wpm.getSessionData(suffix);\n\n\t\treturn extension ? data : data[key];\n\t};\n\n\twpm.deleteDataKey = (key, persistent = false, extension = false) => {\n\n\t\tconst suffix = extension ? key : \"\";\n\n\t\tlet dataGetter = persistent ? wpm.getPersistentData : wpm.getSessionData;\n\t\tlet dataSetter = persistent ? wpm.setPersistentData : wpm.setSessionData;\n\n\t\tlet data = dataGetter(suffix);\n\t\t// extension ? delete data : delete data[key]\n\n\t\tif (extension) {\n\n\t\t\ttry {\n\t\t\t\tif (persistent && window.localStorage) window.localStorage.removeItem(wpm.getPersistentDataKey(suffix));\n\t\t\t\tif (!persistent && window.sessionStorage) window.sessionStorage.removeItem(wpm.getSessionDataKey(suffix));\n\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tdelete data[key];\n\n\t\tdataSetter(data, suffix);\n\t};\n\n\twpm.storeCartData = data => {\n\t\twpm.storeData(\"cart\", data, false, true);\n\t};\n\n\twpm.retrieveCartData = () => {\n\t\treturn wpm.retrieveData(\"cart\", false, true);\n\t};\n\n\twpm.getSessionDataKey = (suffix = \"\") => {\n\t\tconst defaultStorageKey = \"_pmw_session_data\";\n\n\t\tif (suffix) {\n\t\t\treturn defaultStorageKey + \"_\" + suffix;\n\t\t}\n\n\t\treturn defaultStorageKey;\n\t};\n\n\twpm.getPersistentDataKey = (storageKeySuffix) => {\n\n\t\tconst defaultStorageKey = \"_pmw_persistent_data\";\n\n\t\tif (storageKeySuffix) {\n\t\t\treturn defaultStorageKey + \"_\" + storageKeySuffix;\n\t\t}\n\n\t\treturn defaultStorageKey;\n\t};\n\n\twpm.getSessionData = (suffix = \"\") => {\n\n\t\tif (window.sessionStorage) {\n\n\t\t\tlet data = window.sessionStorage.getItem(wpm.getSessionDataKey(suffix));\n\n\t\t\treturn data !== null ? JSON.parse(data) : {};\n\t\t} else {\n\t\t\t// fallback to cookie\n\t\t\tlet data = wpm.getCookie(wpm.getSessionDataKey(suffix));\n\n\t\t\treturn data !== \"\" ? JSON.parse(data) : {};\n\t\t}\n\t};\n\n\twpm.setSessionData = (data, storageKeySuffix = \"\") => {\n\t\tif (window.sessionStorage) {\n\t\t\twindow.sessionStorage.setItem(wpm.getSessionDataKey(storageKeySuffix), JSON.stringify(data));\n\t\t} else {\n\t\t\t// fallback to cookie\n\t\t\twpm.setCookie(wpm.getSessionDataKey(storageKeySuffix), JSON.stringify(data));\n\t\t}\n\t};\n\n\twpm.getPersistentData = (storageKeySuffix) => {\n\n\t\tif (window.localStorage) {\n\n\t\t\tlet data = window.localStorage.getItem(wpm.getPersistentDataKey(storageKeySuffix));\n\n\t\t\treturn data !== null ? JSON.parse(data) : {};\n\t\t} else {\n\t\t\t// fallback to cookie\n\t\t\tlet data = wpm.getCookie(wpm.getPersistentDataKey(storageKeySuffix));\n\n\t\t\treturn data !== \"\" ? JSON.parse(data) : {};\n\t\t}\n\t};\n\n\twpm.setPersistentData = (data, storageKeySuffix = \"\") => {\n\n\t\tif (window.localStorage) {\n\t\t\twindow.localStorage.setItem(wpm.getPersistentDataKey(storageKeySuffix), JSON.stringify(data));\n\t\t} else {\n\t\t\t// fallback to cookie\n\t\t\twpm.setCookie(wpm.getPersistentDataKey(storageKeySuffix), JSON.stringify(data), 400);\n\t\t}\n\t};\n\n\twpm.storeOrderIdOnServer = async (orderDetails) => {\n\n\t\ttry {\n\n\t\t\tlet response;\n\n\t\t\tif (await wpm.isRestEndpointAvailable()) {\n\n\t\t\t\tresponse = await fetch(wpm.root + \"pmw/v1/pixels-fired/\", {\n\t\t\t\t\tmethod   : \"POST\",\n\t\t\t\t\theaders  : {\n\t\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t\t// \"X-WP-Nonce\"  : wpm.nonce_wp_rest,\n\t\t\t\t\t},\n\t\t\t\t\tbody     : JSON.stringify({\n\t\t\t\t\t\torder_id : orderDetails.orderId,\n\t\t\t\t\t\torder_key: orderDetails.orderKey,\n\t\t\t\t\t\tsource   : orderDetails.source,\n\t\t\t\t\t\t// nonce   : wpm.pmw_nonce,\n\t\t\t\t\t}),\n\t\t\t\t\tkeepalive: true,\n\t\t\t\t\tcache    : \"no-cache\",\n\t\t\t\t\tredirect : \"error\",\n\t\t\t\t});\n\n\t\t\t} else {\n\n\t\t\t\tpmw.console.log(\"REST API not available, falling back to AJAX\");\n\n\t\t\t\t// save the state in the database\n\n\t\t\t\t// Send the data object with ajax request\n\t\t\t\t// and log success or error using fetch API and url encoded\n\t\t\t\tresponse = await fetch(wpm.ajax_url, {\n\t\t\t\t\tmethod   : \"POST\",\n\t\t\t\t\tbody     : new URLSearchParams({\n\t\t\t\t\t\taction   : \"pmw_purchase_pixels_fired\",\n\t\t\t\t\t\torder_id : orderDetails.orderId,\n\t\t\t\t\t\torder_key: orderDetails.orderKey,\n\t\t\t\t\t\tsource   : orderDetails.source,\n\t\t\t\t\t\t// nonce_ajax: wpm.nonce_ajax,\n\t\t\t\t\t}),\n\t\t\t\t\tkeepalive: true,\n\t\t\t\t\tredirect : \"error\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst responseJson = await response.json();\n\n\t\t\tif (responseJson.success) {\n\t\t\t\tpmw.console.log(\"\", responseJson.data);\n\t\t\t} else {\n\t\t\t\tpmw.console.error(\"\", responseJson.data);\n\t\t\t}\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\twpm.getProductIdByCartItemElement = element => {\n\n\t\tconst href = jQuery(element).find(\".product-remove\").find(\"a\").attr(\"href\");\n\t\tif (href) return wpm.getProductIdByCartItemKeyUrl(new URL(href));\n\n\t\tconst productId = jQuery(element).find(\"[data-product_id]\").first().attr(\"data-product_id\");\n\t\treturn productId ? productId : null;\n\t};\n\n\twpm.getProductQuantityByCartItemElement = element => {\n\n\t\treturn jQuery(element).find(\".qty\").val() || null;\n\t};\n\n\twpm.getProductIdByCartItemKeyUrl = url => {\n\n\t\tlet searchParams = new URLSearchParams(url.search);\n\t\tlet cartItemKey  = searchParams.get(\"remove_item\");\n\n\t\tlet productId;\n\n\t\tif (wpmDataLayer.cart_item_keys[cartItemKey][\"variation_id\"] === 0) {\n\t\t\tproductId = wpmDataLayer.cart_item_keys[cartItemKey][\"product_id\"];\n\t\t} else {\n\t\t\tproductId = wpmDataLayer.cart_item_keys[cartItemKey][\"variation_id\"];\n\t\t}\n\n\t\treturn productId;\n\t};\n\n\twpm.getAddToCartLinkProductIds = () =>\n\t\tjQuery(\"a\").map(function () {\n\t\t\tlet href = jQuery(this).attr(\"href\");\n\n\t\t\tif (href && href.includes(\"?add-to-cart=\")) {\n\t\t\t\tlet matches = href.match(/(add-to-cart=)(\\d+)/);\n\t\t\t\tif (matches) return matches[2];\n\t\t\t}\n\t\t}).get();\n\n\twpm.getProductDetailsFormattedForEvent = (productId, quantity = 1) => {\n\n\t\t// If wpmDataLayer.products[productId] doesn't exist, return an empty object\n\t\tif (!wpmDataLayer.products[productId]) return null;\n\n\t\tlet product = {\n\t\t\tid           : productId.toString(),\n\t\t\tdyn_r_ids    : wpmDataLayer.products[productId].dyn_r_ids,\n\t\t\tname         : wpmDataLayer.products[productId].name,\n\t\t\tlist_name    : wpmDataLayer.shop.list_name,\n\t\t\tbrand        : wpmDataLayer.products[productId].brand,\n\t\t\tcategory     : wpmDataLayer.products[productId].category,\n\t\t\tvariant      : wpmDataLayer.products[productId].variant,\n\t\t\tlist_position: wpmDataLayer.products[productId].position,\n\t\t\tquantity     : quantity,\n\t\t\tprice        : wpmDataLayer.products[productId].price,\n\t\t\tcurrency     : wpmDataLayer.shop.currency,\n\t\t\tis_variable  : wpmDataLayer.products[productId].is_variable,\n\t\t\tis_variation : wpmDataLayer.products[productId].is_variation,\n\t\t\tparent_id    : wpmDataLayer.products[productId].parent_id,\n\t\t};\n\n\t\tif (product.is_variation) product[\"parent_id_dyn_r_ids\"] = wpmDataLayer.products[productId].parent_id_dyn_r_ids;\n\n\t\treturn product;\n\t};\n\n\twpm.getClidFromBrowser = (clidId = \"gclid\") => {\n\n\t\tlet clidCookieId;\n\n\t\tclidCookieId = {\n\t\t\tgclid: \"_gcl_aw\",\n\t\t\tdclid: \"_gcl_dc\",\n\t\t};\n\n\t\tif (wpm.getCookie(clidCookieId[clidId])) {\n\n\t\t\tlet clidCookie = wpm.getCookie(clidCookieId[clidId]);\n\t\t\tlet matches    = clidCookie.match(/(GCL.[\\d]*.)(.*)/);\n\t\t\treturn matches[2];\n\t\t} else {\n\t\t\treturn \"\";\n\t\t}\n\t};\n\n\twpm.getUserAgent = () => navigator.userAgent;\n\n\twpm.getViewPort = () => ({\n\t\twidth : Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0),\n\t\theight: Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0),\n\t});\n\n\n\twpm.consoleLogVersion = () => {\n\t\tconsole.log(wpmDataLayer.version);\n\t};\n\n\t/**\n\t * https://api.jquery.com/jquery.getscript/\n\t *\n\t * Switched back to jQuery.ajax as the fetch method on some sites returned a type error\n\t * Possible reasons are:\n\t *    * CORS mismatch\n\t *    * The user is using an ad blocker\n\t *\n\t * This code is .thenable\n\t */\n\n\twpm.loadScriptAndCacheIt = (url, fallbackUrl) => {\n\n\t\tlet options = {\n\t\t\tdataType: \"script\",\n\t\t\tcache   : true,\n\t\t\turl     : url,\n\t\t};\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tjQuery.ajax(options)\n\t\t\t\t.done(() => {\n\t\t\t\t\tpmw.console.log(\"Successfully loaded primary script: \" + url);\n\t\t\t\t\tresolve();\n\t\t\t\t})\n\t\t\t\t.fail(() => {\n\t\t\t\t\tif (fallbackUrl) {\n\n\t\t\t\t\t\tpmw.console.log(\"Loading fallback script: \" + fallbackUrl);\n\n\t\t\t\t\t\tlet fallbackOptions = {\n\t\t\t\t\t\t\tdataType: \"script\",\n\t\t\t\t\t\t\tcache   : true,\n\t\t\t\t\t\t\turl     : fallbackUrl,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tjQuery.ajax(fallbackOptions)\n\t\t\t\t\t\t\t.done(() => {\n\t\t\t\t\t\t\t\tpmw.console.log(\"Successfully loaded fallback script: \" + fallbackUrl);\n\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.fail(() => reject(new Error(\"Both primary and fallback scripts failed to load.\")));\n\t\t\t\t\t} else {\n\t\t\t\t\t\treject(new Error(\"Primary script failed to load, and no fallback URL provided.\"));\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t});\n\t};\n\n\twpm.getOrderItemPrice = orderItem => (orderItem.total + orderItem.total_tax) / orderItem.quantity;\n\n\twpm.hasLoginEventFired = () => {\n\t\tlet data = wpm.getSessionData();\n\t\treturn data?.loginEventFired;\n\t};\n\n\twpm.setLoginEventFired = () => {\n\t\tlet data                = wpm.getSessionData();\n\t\tdata[\"loginEventFired\"] = true;\n\t\twpm.setSessionData(data);\n\t};\n\n\twpm.pageLoaded = async () => new Promise(resolve => {\n\t\t(function waitForVar() {\n\t\t\tif (\"complete\" === document.readyState) return resolve();\n\t\t\tsetTimeout(waitForVar, 50);\n\t\t})();\n\t});\n\n\twpm.pageReady = () => {\n\t\treturn new Promise(resolve => {\n\t\t\t(function waitForVar() {\n\t\t\t\tif (\"interactive\" === document.readyState || \"complete\" === document.readyState) return resolve();\n\t\t\t\tsetTimeout(waitForVar, 50);\n\t\t\t})();\n\t\t});\n\t};\n\n\twpm.isMiniCartActive = () => {\n\t\tif (window.sessionStorage) {\n\t\t\tObject.keys(window.sessionStorage).forEach(key => {\n\t\t\t\tif (key.includes(\"wc_fragments\")) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn false;\n\t};\n\n\twpm.doesWooCommerceCartExist = () => document.cookie.includes(\"woocommerce_items_in_cart\");\n\n\twpm.urlHasParameter = parameter => {\n\t\tlet urlParams = new URLSearchParams(window.location.search);\n\t\treturn urlParams.has(parameter);\n\t};\n\n\twpm.getUrlParameter = parameter => {\n\t\tlet urlParams = new URLSearchParams(window.location.search);\n\t\treturn urlParams.get(parameter);\n\t};\n\n\t// https://stackoverflow.com/a/60606893/4688612\n\twpm.hashAsync = (algo, str) => {\n\t\treturn crypto.subtle.digest(algo, new TextEncoder(\"utf-8\").encode(str)).then(buf => {\n\t\t\treturn Array.prototype.map.call(new Uint8Array(buf), x => ((\"00\" + x.toString(16)).slice(-2))).join(\"\");\n\t\t});\n\t};\n\n\twpm.getCartValue = () => {\n\n\t\tlet value = 0;\n\n\t\tif (wpmDataLayer?.cart) {\n\n\t\t\tfor (const key in wpmDataLayer.cart) {\n\t\t\t\t// content_ids.push(wpmDataLayer.products[key].dyn_r_ids[wpmDataLayer.pixels.facebook.dynamic_remarketing.id_type])\n\n\t\t\t\tlet product = wpmDataLayer.cart[key];\n\n\t\t\t\tvalue += product.quantity * product.price;\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t};\n\n\t/**\n\t * Detect if the current URL contains at least one pattern\n\t *\n\t * @param patterns\n\t * @returns {boolean}\n\t */\n\twpm.doesUrlContainPatterns = patterns => {\n\n\t\tfor (const pattern of patterns) {\n\t\t\tif (new RegExp(pattern).test(window.location.href)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t};\n\n\t/**\n\t * Detect if the current URL contains at least one pattern that is on the tracking exclusion list\n\t *\n\t * https://www.linkedin.com/pulse/how-remove-google-robot-problem-via-gtm-facebook-pixel-hjelpdahl/\n\t * https://www.youtube.com/watch?v=b4I1ePZt8Z0\n\t *\n\t * @returns {boolean}\n\t */\n\twpm.excludeDomainFromTracking = () => {\n\n\t\tlet exclude_domains = [\n\t\t\t\"appspot.com\",\n\t\t\t\"translate.google.com\",\n\t\t];\n\n\t\tif (wpmDataLayer?.general?.exclude_domains) {\n\t\t\texclude_domains = [...exclude_domains, ...wpmDataLayer.general.exclude_domains];\n\t\t}\n\n\t\t// Abort if URL contains excluded domains\n\t\tif (exclude_domains.some(domain => window.location.href.includes(domain))) {\n\t\t\tconsole.debug(\"Pixel Manager: Aborted due to excluded domain\");\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t};\n\n\t/**\n\t * Get a random event ID\n\t *\n\t * @param length\n\t * @return {string}\n\t */\n\twpm.getRandomEventId = (length = 16) => {\n\t\tlet id = \"\";\n\t\twhile (id.length < length) {\n\t\t\tid += (Math.random() + 1).toString(36).substring(2);\n\t\t}\n\t\treturn id.substring(0, length);\n\t};\n\n\twpm.pmwConsoleMessage = () => {\n\t\tlet message = \"Pixel Manager for WooCommerce: \";\n\t\tmessage += wpmDataLayer.version.pro ? \"pro\" : \"free\";\n\t\tmessage += \" | distro: \" + wpmDataLayer.version.distro;\n\t\tif (wpmDataLayer.version.distro === \"fms\" && wpmDataLayer.version.pro) {\n\t\t\tmessage += \" | active license: \" + (wpmDataLayer.version.eligible_for_updates ? \"yes\" : \"no\");\n\t\t}\n\t\tmessage += \" | version: \" + wpmDataLayer.version.number;\n\n\t\tif (wpmDataLayer.version.show === true) {\n\t\t\tconsole.log(message);\n\t\t} else {\n\t\t\tpmw.console.log(message);\n\t\t}\n\t};\n\n\twpm.canLoadPremiumFeatures = () => {\n\t\treturn (wpmDataLayer.version.distro === \"fms\" && wpmDataLayer.version.pro && wpmDataLayer.version.eligible_for_updates) || wpmDataLayer.version.distro === \"wcm\";\n\t};\n\n\t/**\n\t * State if the pmw:dom:ready event has been fired\n\t *\n\t * @type {boolean}\n\t */\n\tlet pmwDomReadyFired = false;\n\n\n\t/**\n\t * Trigger the pmw:dom:ready event\n\t *\n\t * @returns {void}\n\t */\n\twpm.triggerPmwDomReadyEvent = () => {\n\n\t\t// If the event has already been fired, return\n\t\tif (pmwDomReadyFired) return;\n\n\t\t// If the document is already loaded, fire the event\n\t\tif (document.readyState === \"complete\") {\n\t\t\tfirePmwDomReadyEvent();\n\t\t\treturn;\n\t\t}\n\n\t\t// Continue processing if the DOM has not yet been loaded\n\t\t// and attach the event listener to the DOMContentLoaded,\n\t\t// once through jQuery and once through the native DOM API\n\t\t// to maximize compatibility\n\n\t\t// If jQuery is available, use it to fire add the event listener\n\t\tjQuery(() => {\n\t\t\tfirePmwDomReadyEvent();\n\t\t});\n\n\t\t// Also add the event listener using the native DOM API\n\t\tdocument.addEventListener(\"DOMContentLoaded\", () => {\n\t\t\tfirePmwDomReadyEvent();\n\t\t}, true);\n\t};\n\n\t/**\n\t * Fire the pmw:dom:ready event\n\t *\n\t * @returns {void}\n\t */\n\tconst firePmwDomReadyEvent = () => {\n\n\t\t// If the event has already been fired, return\n\t\tif (pmwDomReadyFired) return;\n\n\t\t// Fire the event\n\t\tdocument.dispatchEvent(new Event(\"pmw:dom:ready\"));\n\n\t\t// Set the flag to true to indicate that the event has been fired\n\t\tpmwDomReadyFired = true;\n\t};\n\n\twpm.getEmailFromTarget = target => {\n\n\t\t// Only try to add the clicked email if href is set\n\t\tif (target.href) {\n\n\t\t\t// Get the email from the link\n\t\t\t// But only if there is a valid email address in the link\n\t\t\t// Also, the href may contain other parameters, so we need to check for that and remove them\n\t\t\tlet email = target.href.replace(\"mailto:\", \"\");\n\n\n\t\t\tif (email.indexOf(\"?\") > -1) {\n\t\t\t\temail = email.split(\"?\")[0];\n\t\t\t}\n\n\t\t\t// Trim the email and remove all whitespaces\n\t\t\temail = email.replace(/\\s/g, \"\");\n\n\t\t\t// If the email is not empty and valid, add it to the data object\n\t\t\tif (email && wpm.isEmail(email)) {\n\t\t\t\treturn email;\n\t\t\t}\n\t\t}\n\n\t\treturn \"\";\n\t};\n\n\twpm.sendEventPayloadToServer = payload => {\n\t\tif (typeof wpm.sendEventPayloadToServerPremium === \"function\") {\n\t\t\twpm.sendEventPayloadToServerPremium(payload);\n\t\t}\n\t};\n\n\t/**\n\t * Waits for all active pixels to load and then triggers the page view event.\n\t *\n\t * @return {Promise<unknown>}\n\t *\n\t * @since 1.49.0\n\t */\n\twpm.waitForPixelsAndTriggerPageView = async () => {\n\n\t\treturn new Promise(resolve => {\n\n\t\t\t// Check if at least one pixel is active in the data layer\n\t\t\tif (!wpmDataLayer?.pixels) {\n\t\t\t\tpmw.console.error(\"wpmDataLayer or wpmDataLayer.pixels is not defined, triggering page view event immediately.\");\n\t\t\t\tdocument.dispatchEvent(new Event(\"pmw:page-view\"));\n\t\t\t\tresolve();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet activePixels = wpmDataLayer?.general?.server_2_server?.pageview_event_s2s?.pixels || [];\n\n\t\t\t// This line filters the activePixels array, keeping only those pixel names that exist as keys\n\t\t\t// in the wpmDataLayer.pixels object (i.e., only pixels that are currently defined/active in the data layer)\n\t\t\tactivePixels = activePixels.filter(pixelName => wpmDataLayer.pixels[pixelName]);\n\n\t\t\t// If no pixels to check, trigger event immediately\n\t\t\tif (activePixels.length === 0) {\n\t\t\t\tpmw.console.log(\"No specific pixels to wait for, triggering page view event.\");\n\t\t\t\tdocument.dispatchEvent(new Event(\"pmw:page-view\"));\n\t\t\t\tresolve();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Check if all active pixels are loaded\n\t\t\tconst checkPixelsLoaded = () => {\n\t\t\t\tconst allLoaded = activePixels.every(pixelName =>\n\t\t\t\t\t!wpmDataLayer.pixels[pixelName] || wpmDataLayer.pixels[pixelName].loaded);\n\n\t\t\t\tif (allLoaded) {\n\t\t\t\t\t// pmw.console.log(\"All specified pixels to track s2s page-view events have been loaded. Triggering page-view event.\");\n\t\t\t\t\tdocument.dispatchEvent(new Event(\"pmw:page-view\"));\n\t\t\t\t\tresolve();\n\t\t\t\t} else {\n\t\t\t\t\tsetTimeout(checkPixelsLoaded, 100);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tcheckPixelsLoaded();\n\t\t});\n\t};\n\n\twpm.isWooCommerceActive = () => {\n\t\treturn !!wpmDataLayer.shop;\n\t};\n\n\t/**\n\t * Retrieves the product ID associated with a specific pixel.\n\t *\n\t * @param {string} pixelId - The ID of the pixel to get the product ID for.\n\t * @returns {string|null} - The product ID associated with the given pixel ID,\n\t *                          or null if no product ID is found.\n\t */\n\twpm.getProductIdForSpecificPixel = (product, pixelName) => {\n\t\treturn String(product.dyn_r_ids[wpmDataLayer.pixels[pixelName].dynamic_remarketing.id_type]);\n\t};\n\n\twpm.isInWooCommerceSesssion = () => {\n\n\t\tif (wpmDataLayer?.shop?.session_active) return true;\n\n\t\tlet regex           = new RegExp(\"woocommerce_cart_hash\");\n\t\tlet wcSessionCookie = wpm.getCookieThatContainsRegex(regex);\n\n\t\tif (wcSessionCookie) return true;\n\n\t\treturn false;\n\t};\n\n\twpm.isNotInWooCommerceSesssion = () => {\n\t\treturn !wpm.isInWooCommerceSesssion();\n\t};\n\n\twpm.makeFullUrl = url => {\n\n\t\t// Trim any leading or trailing whitespace\n\t\turl = url.trim();\n\n\t\t// Check if the URL already contains a protocol\n\t\tif (/^(http:\\/\\/|https:\\/\\/)/.test(url)) {\n\t\t\treturn url;\n\t\t}\n\n\t\t// Remove leading slashes\n\t\turl = url.replace(/^\\/+/, \"\");\n\n\t\t// Add 'https://' as default protocol\n\t\treturn \"https://\" + url;\n\t};\n\n\twpm.registerShowVariationEventListener = () => {\n\t\tlet previousVariationId = null;\n\n\t\tjQuery(\".single_variation_wrap\").on(\"show_variation\", (event, variation) => {\n\n\t\t\t// Abort if lazy loading is enabled\n\t\t\t// if (wpmDataLayer?.general?.lazy_load_pmw) return;\n\n\t\t\ttry {\n\n\t\t\t\tlet productId = wpm.getIdBasedOndVariationsOutputSetting(variation.variation_id);\n\n\t\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\t\t\t// If the variation id is not the same as the previous one, run the function\n\t\t\t\tif (previousVariationId !== variation.variation_id) {\n\t\t\t\t\twpm.triggerViewItemEventPrep(productId);\n\t\t\t\t\tpreviousVariationId = variation.variation_id;\n\t\t\t\t}\n\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t});\n\t};\n\n\t/**\n\t * Initializes the command queue for the application to ensure that commands\n\t * are queued and executed in a controlled manner. This function sets up\n\t * the underlying mechanism to manage and process commands effectively.\n\t *\n\t * Typically, the command queue is used by external developers\n\t * who want to make sure that their Pixel Manager API calls safely get executed,\n\t * no matter if the initialization order of the Pixel Manager is shuffled,\n\t * delayed, or lazy loaded.\n\t *\n\t * @since 1.49.0\n\t */\n\twpm.initializeCommandQueue = () => {\n\n\t\tconst queue = window._pmwq = window._pmwq || [];\n\n\t\tqueue.forEach(function (fn) {\n\t\t\tif (typeof fn === \"function\") {\n\t\t\t\ttry {\n\t\t\t\t\tfn();\n\t\t\t\t} catch (e) {\n\t\t\t\t\tpmw.console.error('Error executing queued command:', e);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// Override push to execute commands immediately now that PMW is ready\n\t\tqueue.push = function (fn) {\n\t\t\tif (typeof fn === \"function\") {\n\t\t\t\ttry {\n\t\t\t\t\tfn();\n\t\t\t\t} catch (e) {\n\t\t\t\t\tpmw.console.error('Error executing command from queue:', e);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t};\n\n}(window.wpm = window.wpm || {}, jQuery));\n","/**\n * Event Processor\n *\n * Unified event processing system that orchestrates:\n * - Building standardized event payloads\n * - Applying filters at multiple stages\n * - Adapting data for each active pixel\n * - Dispatching to browser pixels and S2S endpoints\n *\n * @since 1.51.0\n */\n\n(function (wpm, $, undefined) {\n\n\t/**\n\t * Global event context that's added to all events\n\t *\n\t * @returns {object} Context object with user, session, and page data\n\t */\n\twpm.getEventContext = function () {\n\t\treturn {\n\t\t\ttimestamp : Math.floor(Date.now() / 1000),\n\t\t\turl       : window.location.href,\n\t\t\treferrer  : wpm.retrieveData(\"referrer\") ? wpm.makeFullUrl(wpm.retrieveData(\"referrer\")) : document.referrer,\n\t\t\tuser_agent: navigator.userAgent,\n\t\t\tpage_type : wpmDataLayer?.shop?.page_type,\n\t\t\tuser_id   : wpmDataLayer?.user?.id?.raw || null,\n\t\t\t// Additional context can be added here\n\t\t};\n\t};\n\n\t/**\n\t * Process an event through the unified pipeline\n\t *\n\t * This is the main entry point for processing events with the new filter system.\n\t *\n\t * @param {string} eventName - Standardized event name (e.g., 'add_to_cart', 'view_item')\n\t * @param {object} eventData - Core event data (product, cart, order, etc.)\n\t * @returns {Promise<object>} The processed payload\n\t */\n\twpm.processEvent = async function (eventName, eventData) {\n\n\t\tpmw.console.log(`Processing event: ${eventName}`, eventData);\n\n\t\ttry {\n\t\t\t// 1. Create base payload with standardized structure\n\t\t\tlet payload = {\n\t\t\t\tevent     : eventName,\n\t\t\t\tevent_data: eventData,\n\t\t\t\tpixels    : {},\n\t\t\t\tcontext   : wpm.getEventContext(),\n\t\t\t};\n\n\t\t\t// 2. Apply pre-processing filter\n\t\t\t// Use case: Add global tracking params, modify core data before pixel adaptations\n\t\t\tpayload = pmw.hooks.applyFilters(\"pmw_event_payload_pre\", payload, eventName);\n\n\t\t\t// 3. Transform for each active pixel\n\t\t\tconst activePixels = wpm.pixelRegistry.getActivePixels();\n\n\t\t\tfor (const pixelName of activePixels) {\n\t\t\t\tconst adapter = wpm.pixelRegistry.getAdapter(pixelName);\n\n\t\t\t\tif (!adapter || typeof adapter.adapt !== \"function\") {\n\t\t\t\t\tpmw.console.log(`No adapter found for pixel: ${pixelName}`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\t// Adapt event data to pixel-specific format\n\t\t\t\t\tlet pixelData = adapter.adapt(payload.event_data, eventName, payload.context);\n\n\t\t\t\t\tif (!pixelData) {\n\t\t\t\t\t\t// Some pixels (like Hotjar, VWO) don't track events, only load tracking scripts\n\t\t\t\t\t\t// So null is expected and not an error - skip silently\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Apply pixel-specific filter\n\t\t\t\t\t// Use case: Modify Facebook-specific data, add custom parameters per pixel\n\t\t\t\t\tpixelData = pmw.hooks.applyFilters(\n\t\t\t\t\t\t`pmw_pixel_data_${pixelName}`,\n\t\t\t\t\t\tpixelData,\n\t\t\t\t\t\teventName,\n\t\t\t\t\t\tpayload.event_data,\n\t\t\t\t\t\tpayload.context,\n\t\t\t\t\t);\n\n\t\t\t\t\tpayload.pixels[pixelName] = pixelData;\n\t\t\t\t} catch (e) {\n\t\t\t\t\tpmw.console.error(`Error adapting data for ${pixelName}:`, e);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// 4. Apply event-specific filter\n\t\t\t// Use case: Modify all pixels for a specific event type (e.g., all add_to_cart events)\n\t\t\tpayload = pmw.hooks.applyFilters(\n\t\t\t\t`pmw_event_payload_${eventName}`,\n\t\t\t\tpayload,\n\t\t\t\tpayload.event_data,\n\t\t\t);\n\n\t\t\t// 5. Apply post-processing filter\n\t\t\t// Use case: Final validation, logging, debugging, cross-pixel modifications\n\t\t\tpayload = pmw.hooks.applyFilters(\"pmw_event_payload_post\", payload, eventName);\n\n\t\t\t// 6. Dispatch to pixels\n\t\t\tawait wpm.dispatchToPixels(payload);\n\n\t\t\treturn payload;\n\n\t\t} catch (e) {\n\t\t\tpmw.console.error(`Error processing event ${eventName}:`, e);\n\t\t\tthrow e;\n\t\t}\n\t};\n\n\t/**\n\t * Dispatch the processed payload to pixels\n\t *\n\t * This handles both S2S-capable pixels (which need server requests)\n\t * and browser-only pixels (which are handled by their event listeners)\n\t *\n\t * @param {object} payload - The fully processed event payload\n\t * @returns {Promise<void>}\n\t */\n\twpm.dispatchToPixels = async function (payload) {\n\n\t\tconst eventName = payload.event;\n\n\t\t// Dispatch to browser-only pixels\n\t\twpm.dispatchToBrowserPixels(payload);\n\n\t\t// Dispatch to S2S-capable pixels\n\t\t// These pixels handle both browser (fbq, ttq, etc.) and server-side events\n\t\t// They listen to pmw:s2s:* events to get the adapted data with event_id for deduplication\n\t\twpm.dispatchToS2SPixels(payload);\n\n\t\t// Purchase events are handled entirely server-side and should never be sent from browser to server\n\t\t// to prevent duplicates and race conditions. However, browser-side pixels still need to fire.\n\t\tif (eventName === \"purchase\") {\n\t\t\tpmw.console.log(\"Purchase event - skipping browser-to-server transmission (handled server-side only)\");\n\t\t\treturn; // Return early, but browser pixels have already been dispatched above\n\t\t}\n\n\t\t// Only send to server if S2S is globally enabled\n\t\tif (wpmDataLayer?.general?.server_2_server?.active) {\n\t\t\t// Extract S2S data for server transmission\n\t\t\tconst s2sData = wpm.extractS2SData(payload);\n\n\t\t\t// Send to server if there's S2S data to send\n\t\t\tif (Object.keys(s2sData).length > 0) {\n\t\t\t\tconst s2sPixels = wpm.pixelRegistry.getActiveS2SPixels();\n\t\t\t\tpmw.console.log(`S2S enabled pixels for ${eventName}:`, s2sPixels);\n\t\t\t\tawait wpm.sendEventPayloadToServer(s2sData);\n\t\t\t}\n\t\t}\n\t};\n\t/**ggers a browser-specific event that browser-only pixels can listen to.\n\t * The payload includes adapted data for each browser-only pixel.\n\t *\n\t * @param {object} payload - The fully processed event payload\n\t */\n\twpm.dispatchToBrowserPixels = function (payload) {\n\n\t\tconst browserPixels = wpm.pixelRegistry.getActiveBrowserOnlyPixels();\n\n\t\tif (browserPixels.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tpmw.console.log(`Dispatching to browser-only pixels for ${payload.event}:`, browserPixels);\n\n\t\t// Trigger browser-specific event that browser-only pixels can listen to\n\t\t// This allows them to access the filtered, adapted data\n\t\t// Convert underscores to hyphens for event name (public API uses hyphens)\n\t\tconst browserEventName = payload.event.replace(/_/g, \"-\");\n\t\tjQuery(document).trigger(`pmw:browser:${browserEventName}`, payload);\n\t};\n\n\t/**\n\t * Dispatch to S2S-capable pixels\n\t *\n\t * Triggers events for S2S-capable pixels (Facebook, TikTok, Pinterest, Snapchat).\n\t * These pixels handle both browser-side (fbq, ttq, etc.) and server-side events.\n\t * They always receive the event to fire their browser pixels, regardless of S2S status.\n\t *\n\t * @param {object} payload - The fully processed event payload\n\t */\n\twpm.dispatchToS2SPixels = function (payload) {\n\n\t\tconst s2sPixels = wpm.pixelRegistry.getActiveS2SPixels();\n\n\t\tif (s2sPixels.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Trigger S2S event that S2S-capable pixels listen to\n\t\t// This provides adapted data with event_id for deduplication between browser and server\n\t\t// Convert underscores to hyphens for event name (public API uses hyphens)\n\t\tconst s2sEventName = payload.event.replace(/_/g, \"-\");\n\t\tjQuery(document).trigger(`pmw:s2s:${s2sEventName}`, payload);\n\t};\n\t/**\n\t * Extract server-to-server data from the payload\n\t *\n\t * Only S2S-capable pixels should be included in the server request.\n\t * This creates a single payload with data for all S2S pixels.\n\t *\n\t * @param {object} payload - The full event payload\n\t * @returns {object} S2S-only data for server transmission\n\t */\n\twpm.extractS2SData = function (payload) {\n\n\t\tconst s2sData = {\n\t\t\tevent: payload.event,\n\t\t};\n\n\t\tconst s2sPixels = wpm.pixelRegistry.getActiveS2SPixels();\n\n\t\tfor (const pixelName of s2sPixels) {\n\t\t\tif (payload.pixels[pixelName]) {\n\t\t\t\ts2sData[pixelName] = payload.pixels[pixelName];\n\t\t\t}\n\t\t}\n\n\t\t// Add product data if present (for server-side processing)\n\t\tif (payload.event_data?.product) {\n\t\t\ts2sData.product = payload.event_data.product;\n\t\t}\n\n\t\treturn s2sData;\n\t};\n\n\t/**\n\t * Initialize adapters namespace\n\t */\n\tif (!wpm.adapters) {\n\t\twpm.adapters = {};\n\t}\n\n\t/**\n\t * Helper function to register an adapter with optional capabilities\n\t *\n\t * @param {string} pixelName - The pixel name\n\t * @param {object} adapter - The adapter object with an adapt() method\n\t * @param {object} [options] - Optional capabilities configuration\n\t * @param {boolean} [options.supportsS2S=false] - Whether pixel supports server-to-server tracking\n\t * @param {boolean} [options.supportsEventDeduplication=false] - Whether pixel supports event deduplication\n\t * @param {function} [options.isActive] - Function that returns true if pixel is active/loaded\n\t */\n\twpm.registerAdapter = function (pixelName, adapter, options = {}) {\n\t\tif (!adapter || typeof adapter.adapt !== \"function\") {\n\t\t\tpmw.console.error(`Invalid adapter for ${pixelName}: must have an adapt() method`);\n\t\t\treturn;\n\t\t}\n\n\t\t// Store the adapter\n\t\twpm.adapters[pixelName] = adapter;\n\n\t\t// Store pixel capabilities\n\t\tif (!wpm.pixelCapabilities) {\n\t\t\twpm.pixelCapabilities = {};\n\t\t}\n\n\t\twpm.pixelCapabilities[pixelName] = {\n\t\t\tsupportsS2S               : options.supportsS2S || false,\n\t\t\tsupportsEventDeduplication: options.supportsEventDeduplication || false,\n\t\t\tisActive                  : options.isActive || null,\n\t\t};\n\n\t\t// pmw.console.log(`Adapter registered for: ${pixelName}`, wpm.pixelCapabilities[pixelName]);\n\t};\n\n}(window.wpm = window.wpm || {}, jQuery));\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + {\"194\":\"wc-hooks\",\"264\":\"deprecated-functions\",\"526\":\"pixel-facebook\",\"625\":\"consent-management\",\"671\":\"pixel-google\",\"818\":\"pixel-hotjar\",\"968\":\"consent-api\",\"972\":\"doofinder-listener\"}[chunkId] + \".\" + {\"194\":\"748deb38\",\"264\":\"9b411c79\",\"526\":\"0ae541d1\",\"625\":\"414e6bb6\",\"671\":\"91d8c5a4\",\"818\":\"05256bbc\",\"968\":\"12d29397\",\"972\":\"8afb6ac4\"}[chunkId] + \".chunk.min.js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/^blob:/, \"\").replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t792: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkPixel_Manager_for_WooCommerce\"] = self[\"webpackChunkPixel_Manager_for_WooCommerce\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","/**\n * Run PMW main loader\n */\n\nconst main = async () => {\n\n\trequire(\"./wpm/functions_main\");\n\trequire(\"./version.js\");\n\n\t// Wait until jQuery is loaded\n\tawait wpm.jQueryExists();\n\n\t// Wait until wpmDataLayer is loaded\n\tawait wpm.wpmDataLayerFullyLoaded();\n\n\t/**\n\t * Set webpack public path for chunk loading\n\t * This ensures chunks load correctly even when scripts are combined/moved \n\t * by optimization plugins (SiteGround, Autoptimize, WP Rocket, etc.)\n\t */\n\tif (wpmDataLayer?.general?.chunk_base_path) {\n\t\t// eslint-disable-next-line no-undef, camelcase\n\t\t__webpack_public_path__ = wpmDataLayer.general.chunk_base_path;\n\t}\n\n\t// wait 1000ms\n\t// await new Promise(resolve => setTimeout(resolve, 1000))\n\n\t// Load all essential scripts first\n\trequire(\"./wpm/functions_loader\");\n\t\n\t// Load new event filtering system\n\trequire(\"./wpm/hooks\");\n\trequire(\"./wpm/pixel-registry\");\n\trequire(\"./wpm/event-processor\");\n\n\t// Initialize command queue early so filters can be registered before events fire\n\twpm.initializeCommandQueue();\n\n\t// Output PMW console message\n\twpm.pmwConsoleMessage();\n\n\t// Load the consent management module as a chunk\n\tawait wpm.loadConsentModule();\n\tawait wpm.consent.load();\n\n\t// Doesn't work if we listen to pmw:dom:ready because it runs too late\n\t// (at the end of the main.js file)\n\t// TODO: Find out why that order is important and optimize it. It is also difficult to test. In Cypress it works just with \"pmw:dom:ready\"\n\tjQuery(() => {\n\t\trequire(\"./wpm/event_listeners_on_ready\");\n\t});\n\n\t// Load remaining event listeners\n\trequire(\"./wpm/event_listeners\");\n\t\n\t// Load doofinder listener as a chunk\n\timport(/* webpackChunkName: \"doofinder-listener\" */ \"./wpm/listeners/doofinder\");\n\n\twpm.loadWcHooksFunctions();\n\n\t// Check if domain is excluded from tracking\n\t// If so, return\n\tif (wpm.excludeDomainFromTracking()) return;\n\n\t// Load pixels dynamically based on configuration\n\tconst pixelLoaders = [];\n\n\t// Load free pixels conditionally\n\tif (wpmDataLayer?.pixels?.google) {\n\t\tpixelLoaders.push(\n\t\t\timport(/* webpackChunkName: \"pixel-google\" */ \"./pixels/google/loader\")\n\t\t);\n\t}\n\t\n\tif (wpmDataLayer?.pixels?.facebook) {\n\t\tpixelLoaders.push(\n\t\t\timport(/* webpackChunkName: \"pixel-facebook\" */ \"./pixels/facebook/loader\")\n\t\t);\n\t}\n\t\n\tif (wpmDataLayer?.pixels?.hotjar) {\n\t\tpixelLoaders.push(\n\t\t\timport(/* webpackChunkName: \"pixel-hotjar\" */ \"./pixels/hotjar/loader\")\n\t\t);\n\t}\n\n\t// #if process.env.TIER === 'premium'\n// \t/**\n// \t *  Load premium pixels conditionally\n// \t */\n// \tif (wpm.canLoadPremiumFeatures()) {\n// \t\tpixelLoaders.push(\n// \t\t\timport(/* webpackChunkName: \"wpm-premium-events\" */ \"./wpm/event_listeners_premium\")\n// \t\t);\n// \n// \t\tif (wpmDataLayer?.pixels?.adroll) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-adroll\" */ \"./pixels/adroll/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (wpmDataLayer?.pixels?.linkedin) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-linkedin\" */ \"./pixels/linkedin/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (wpmDataLayer?.pixels?.bing) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-microsoft\" */ \"./pixels/microsoft-ads/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (wpmDataLayer?.pixels?.outbrain) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-outbrain\" */ \"./pixels/outbrain/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (wpmDataLayer?.pixels?.pinterest) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-pinterest\" */ \"./pixels/pinterest/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (wpmDataLayer?.pixels?.snapchat) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-snapchat\" */ \"./pixels/snapchat/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (wpmDataLayer?.pixels?.taboola) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-taboola\" */ \"./pixels/taboola/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (wpmDataLayer?.pixels?.tiktok) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-tiktok\" */ \"./pixels/tiktok/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (wpmDataLayer?.pixels?.twitter) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-twitter\" */ \"./pixels/twitter/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (wpmDataLayer?.pixels?.reddit) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-reddit\" */ \"./pixels/reddit/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (wpmDataLayer?.pixels?.vwo) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-vwo\" */ \"./pixels/vwo/loader\")\n// \t\t\t);\n// \t\t}\n// \t}\n\t// #endif\n\n\t// Load all active pixels in parallel\n\tawait Promise.all(pixelLoaders);\n\n\t/** Load the deprecated functions as a chunk */\n\tconst {loadDeprecatedFunctions} = await import(/* webpackChunkName: \"deprecated-functions\" */ \"./wpm/deprecated.mjs\");\n\tloadDeprecatedFunctions();\n\n\t// Preload pixels\n\tdocument.dispatchEvent(new Event(\"pmw:load-pixels\"));\n\n\t// Trigger wpmLoad event\n\tdocument.dispatchEvent(new Event(\"wpmLoad\"));\n\n\t// Wait until page is loaded\n\tawait wpm.pageLoaded();\n\n\tdocument.dispatchEvent(new Event(\"pmw:ready\"));\n\twpm.triggerPmwDomReadyEvent();\n\n\t// Check if the library version matches the PMW version that's installed on the server\n\twpm.checkLibraryVersion();\n};\n\nmain();\n\n\n\n\n\n\n\n\n"],"names":["leafPrototypes","getProto","inProgress","dataWebpackPrefix","getLocationByTimeZone","timezone","Intl","DateTimeFormat","resolvedOptions","timeZone","geoLocation","countryCode","toUpperCase","regionCode","log","message","objects","isLoggerEnabled","console","length","error","urlLoggerOff","sessionLoggerEnabled","urlLoggerOn","wpmDataLayer","general","logger","is_active","wpm","urlHasParameter","storeData","retrieveData","require","window","loadConsentModule","async","consentModule","consent","apiModule","pmw","api","removeHtmlTagsAndWhitespace","string","replace","trim","jQuery","on","event","target","value","id","triggerAddShippingInfoEvent","slug","text","checkedShippingMethod","find","val","attr","shippingTier","document","trigger","paymentMethodChangeLogged","triggerAddPaymentInfoEvent","checkedPaymentMethod","paymentType","url","URL","currentTarget","productId","getProductIdByCartItemKeyUrl","removeProductFromCart","e","checkoutButtonSelectors","prepareSelectors","paymentMethodSelected","fireCheckoutProgress","fireCheckoutOption","initCart","products","productIds","getAddToCartLinkProductIds","getProductsFromBackend","referrer","referrerHostname","hostname","location","host","gclid","getUrlParameter","wbraid","gbraid","fbclid","Math","floor","Date","now","ttclid","scid","epik","pmw_loaded","shop","page_type","product_type","getMainProductIdFromProductPage","product","getProductDataForViewItemEvent","order","isOrderIdStored","writeOrderIdToStorage","key","acrRemoveCookie","user","hasLoginEventFired","setLoginEventFired","lazy_load_pmw","registerShowVariationEventListener","$variationForm","selectedValues","toArray","every","select","productVariations","data","matchingVariation","variation","Object","entries","attributes","triggerViewItemEventPrep","variation_id","payload","pixels","facebook","loaded","event_name","event_id","getFbRandomEventId","user_data","getFbUserData","event_source_url","href","referrer_url","makeFullUrl","reddit","redditS2SData","getRedditS2SBaseData","getRandomEventId","event_type","tracking_type","event_metadata","conversion_id","snapchat","getSnapchatS2SBaseData","server_2_server","pageview_event_s2s","s2sData","extractS2SData","keys","sendEventPayloadToServer","processEvent","custom_data","fbGetProductDataForCapiEvent","tiktok","tiktokGetEventUserData","page","tiktokGetEventPageData","properties","price","quantity","currency","content_type","contents","content_id","getProductIdForSpecificPixel","content_name","name","getSnapchatCustomDataForProduct","pinterest","getPinterestS2SBaseData","tiktokGetPropertiesFromCart","isWooCommerceActive","startIntersectionObserverToWatch","startProductsMutationObserverToWatch","waitForPixelsAndTriggerPageView","pixelRegistry","getActivePixels","activePixels","pixelCapabilities","pixelName","capabilities","isActive","push","getActiveBrowserOnlyPixels","browserPixels","this","supportsS2S","getActiveS2SPixels","s2sPixels","getAdapter","adapters","jQueryExists","Promise","resolve","waitForjQuery","setTimeout","waitForLibrary","library","timeout","interval","startTime","wpmDataLayerFullyLoaded","checkVar","waitForVar","version","logTimeoutId","then","clearTimeout","wpHooksExists","wp","hooks","loadWcHooksFunctions","filters","addFilter","hookName","namespace","callback","priority","sort","a","b","applyFilters","args","filteredValue","filter","result","warn","removeFilter","initialLength","f","removeAllFilters","hasFilter","some","getFilters","getLibraryVersion","checkLibraryVersion","number","$","undefined","isRange","isIP","isV4","isV6","getIpVersion","ipServices","getGeoInfo","cloudflare","response","fetch","ok","Error","status","split","reduce","obj","pair","ip","loc","processRegion","service","geojs","json","country_code","region","ipinfo","country","ipapi","consent_management","restricted_regions","includes","isVisitorAllowed","JSON","parse","isBotUserAgent","Array","isArray","ip_exclude_list","getIp","isOnIpExclusionList","ipVersion","maxServicesToCheck","validVersions","join","ipv","getIpFromAnyService","getBrowserGeoFromExternalService","performance","promises","forEach","any","toFixed","getBrowserGeo","geoFromStorage","geoInfo","gepLocationByTimeZone","getBrowserLocationByTimeZone","ipServicesFiltered","slice","getIpFromService","timeTaken","reject","serviceResponseData","isVisitorNotAllowed","userAgent","navigator","botPatterns","getBotPatterns","pattern","toLowerCase","customPatterns","user_agent_exclude_patterns","concat","isCidr","ipName","ipExcludeList","isInSubnet","addToCartSelectors","dataset","product_id","addProductToCart","Number","indexOf","each","index","element","classes","getPostIdFromString","one","closest","origin","searchParams","has","get","parseInt","nextAll","getIdBasedOndVariationsOutputSetting","getProductDetailsFormattedForEvent","isEmail","emailSelected","getProductIdByCartItemElement","getProductQuantityByCartItemElement","cart","getCartItemsFromBackend","expandIPv6","ipaddr","ipv4Part","ipv4Regexes","ipv6Part","ipv6Regexes","matchCIDR","zoneIndex","module","exports","first","second","partSize","cidrBits","part","shift","subnetMatch","address","rangeList","defaultName","k","len","rangeName","rangeSubnets","subnet","kind","match","apply","IPv4","octets","octet","prototype","toString","toNormalizedString","toByteArray","other","cidrRange","ref","SpecialRanges","unspecified","broadcast","multicast","linkLocal","loopback","carrierGradeNat","reserved","range","toIPv4MappedAddress","IPv6","prefixLengthFromSubnetMask","cidr","i","stop","zeros","zerotable","fourOctet","RegExp","longValue","parser","parseIntAuto","results","reverse","parts","zoneId","l","toRFC5952String","bestMatchIndex","bestMatchLength","regex","exec","substring","bytes","addr","suffix","call","toFixedLengthString","padStart","uniqueLocal","ipv4Mapped","rfc6145","rfc6052","teredo","isIPv4MappedAddress","toIPv4Address","high","low","transitional","colonCount","lastColon","replacement","replacementCount","lastIndexOf","substr","test","isIPv4","isIPv6","isValid","error1","isValidFourPartDecimal","parseCIDR","maskLength","parsed","defineProperty","subnetMaskFromPrefixLength","prefix","filledOctetCount","j","pow","broadcastAddressFromCIDR","ipInterfaceOctets","subnetMaskOctets","networkAddressFromCIDR","fromByteArray","process","commonjsGlobal","normalize","_validate","nh","sections","n","h","ns","hs","_leftPad","abbreviate","zPreviousFlag","zeroStartIndex","zeroLength","zStartIndex","zLength","section","zFlag","splice","d","p","padding","repeat","_hex2bin","hex","_bin2hex","bin","_addr2bin","binAddr","_bin2addr","binPart","hexSection","divideSubnet","mask0","mask1","limit","abbr","ret","binNetPart","binHostPart","numSubnets","binSubnet","hexAddr","binStartAddr","binEndAddr","start","end","size","randomSubnet","random","ptr","mask","err","inRange","check_range","ip6","range_data","parse_addr","parse_range","storeIP","displayIP","wpmRestSettings","isBelowRestErrorThreshold","isRestEndpointAvailable","testEndpoint","root","cookieName","method","mode","cache","keepalive","redirect","responseJson","success","stringify","isWpmRestEndpointAvailable","orderId","orderKey","source","orderIds","storeOrderIdOnServer","order_duplication_prevention","email","quantityToRemove","storeCartData","variations_output","is_variation","parent_id","selectors","type","Set","doesWooCommerceCartExist","retrieveCartData","saveCartObjectToDataLayer","ajax_url","body","URLSearchParams","action","page_id","product_ids","options","headers","statusText","responseData","assign","cartObject","triggerViewItemEvent","triggerViewItemEventNoProduct","step","checkout_option","triggerViewItemList","viewItemListTriggerTestMode","css","append","view_item_list_trigger","opacity","background_color","getSearchTermFromUrl","search","io","ioTimeouts","observerCallback","observer","entry","elementId","next","isIntersecting","test_mode","unobserve","remove","ioid","detectedProductTemplateClasses","nested","flat","isNestedClass","elem","className","isFlatClass","prev","hasClass","getAllElementsToWatch","getCommonIdentifiersToWatch","listOfClassNames","haveSameNestingDepth","element1","element2","parents","findCommonParentElement","parent","is","node","countOfChildren","getCommonClass","classes1","classes2","wpmProductIds","querySelectorAll","productsNode","firstChildClassAttr","children","firstChildClasses","secondChildClassAttr","commonClass","firstProductTemplateClasses","map","IntersectionObserver","threshold","observe","productsMutationObserver","childList","characterData","MutationObserver","mutations","mutation","newNodes","addedNodes","hasWpmProductIdElement","siblings","setCookie","cookieValue","expiryDays","setTime","getTime","expires","toUTCString","cookie","getCookie","ca","decodeURIComponent","c","charAt","getCookieThatContainsRegex","cookies","deleteCookie","persistent","extension","dataGetter","getPersistentData","getSessionData","dataSetter","setPersistentData","setSessionData","deleteDataKey","localStorage","removeItem","getPersistentDataKey","sessionStorage","getSessionDataKey","defaultStorageKey","storageKeySuffix","getItem","setItem","order_id","orderDetails","order_key","cartItemKey","cart_item_keys","matches","dyn_r_ids","list_name","brand","category","variant","list_position","position","is_variable","parent_id_dyn_r_ids","getClidFromBrowser","clidId","clidCookieId","dclid","getUserAgent","getViewPort","width","max","documentElement","clientWidth","innerWidth","height","clientHeight","innerHeight","consoleLogVersion","loadScriptAndCacheIt","fallbackUrl","dataType","ajax","done","fail","fallbackOptions","getOrderItemPrice","orderItem","total","total_tax","loginEventFired","pageLoaded","readyState","pageReady","isMiniCartActive","parameter","hashAsync","algo","str","crypto","subtle","digest","TextEncoder","encode","buf","Uint8Array","x","getCartValue","doesUrlContainPatterns","patterns","excludeDomainFromTracking","exclude_domains","domain","debug","pmwConsoleMessage","pro","distro","eligible_for_updates","show","canLoadPremiumFeatures","pmwDomReadyFired","triggerPmwDomReadyEvent","firePmwDomReadyEvent","addEventListener","dispatchEvent","Event","getEmailFromTarget","sendEventPayloadToServerPremium","checkPixelsLoaded","String","dynamic_remarketing","id_type","isInWooCommerceSesssion","session_active","isNotInWooCommerceSesssion","previousVariationId","initializeCommandQueue","queue","_pmwq","fn","getEventContext","timestamp","user_agent","user_id","raw","eventName","eventData","event_data","context","adapter","adapt","pixelData","dispatchToPixels","dispatchToBrowserPixels","dispatchToS2SPixels","active","browserEventName","s2sEventName","registerAdapter","supportsEventDeduplication","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","m","getPrototypeOf","t","__esModule","create","r","def","current","getOwnPropertyNames","definition","o","enumerable","chunkId","all","u","g","globalThis","Function","prop","hasOwnProperty","script","needAttach","scripts","getElementsByTagName","s","getAttribute","createElement","charset","nc","setAttribute","src","onScriptComplete","onerror","onload","doneFns","parentNode","removeChild","bind","head","appendChild","Symbol","toStringTag","scriptUrl","importScripts","currentScript","tagName","installedChunks","installedChunkData","promise","errorType","realSrc","request","webpackJsonpCallback","parentChunkLoadingFunction","chunkIds","moreModules","runtime","chunkLoadingGlobal","self","chunk_base_path","__webpack_public_path__","load","pixelLoaders","google","hotjar","loadDeprecatedFunctions","main"],"sourceRoot":""}
  • woocommerce-google-adwords-conversion-tracking-tag/trunk/languages/woocommerce-google-adwords-conversion-tracking-tag.pot

    r3374377 r3406541  
    33msgid ""
    44msgstr ""
    5 "Project-Id-Version: Pixel Manager for WooCommerce 1.49.2\n"
     5"Project-Id-Version: Pixel Manager for WooCommerce 1.52.0\n"
    66"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/src\n"
    77"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
     
    1010"Content-Type: text/plain; charset=UTF-8\n"
    1111"Content-Transfer-Encoding: 8bit\n"
    12 "POT-Creation-Date: 2025-10-07T10:17:45+00:00\n"
     12"POT-Creation-Date: 2025-12-01T06:32:14+00:00\n"
    1313"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
    1414"X-Generator: WP-CLI 2.12.0\n"
     
    4343#: class-wgact.php:264
    4444#: includes/admin/class-admin.php:82
    45 #: includes/admin/class-admin.php:412
    46 #: includes/admin/class-admin.php:413
     45#: includes/admin/class-admin.php:444
     46#: includes/admin/class-admin.php:445
    4747#: includes/admin/notifications/class-notifications.php:308
    4848msgid "Pixel Manager"
     
    9393msgstr ""
    9494
    95 #: includes/admin/class-admin.php:149
     95#: includes/admin/class-admin.php:132
     96msgid "Open chat"
     97msgstr ""
     98
     99#: includes/admin/class-admin.php:143
     100msgid "Chat with Pixie"
     101msgstr ""
     102
     103#: includes/admin/class-admin.php:144
     104msgid "Close chat"
     105msgstr ""
     106
     107#: includes/admin/class-admin.php:180
    96108msgid "GA4 Attribution"
    97109msgstr ""
    98110
    99 #: includes/admin/class-admin.php:161
     111#: includes/admin/class-admin.php:192
    100112msgid "Lifetime Value"
    101113msgstr ""
    102114
    103 #: includes/admin/class-admin.php:165
     115#: includes/admin/class-admin.php:196
    104116msgid "by total order value"
    105117msgstr ""
    106118
    107 #: includes/admin/class-admin.php:167
     119#: includes/admin/class-admin.php:198
    108120msgid "by marketing order value"
    109121msgstr ""
    110122
    111 #: includes/admin/class-admin.php:350
     123#: includes/admin/class-admin.php:382
    112124msgid "Pixel Manager Order Details"
    113125msgstr ""
    114126
    115 #: includes/admin/class-admin.php:353
     127#: includes/admin/class-admin.php:385
    116128msgid "order URL"
    117129msgstr ""
    118130
    119 #: includes/admin/class-admin.php:459
     131#: includes/admin/class-admin.php:491
    120132msgid "Main"
    121133msgstr ""
    122134
    123 #: includes/admin/class-admin.php:502
     135#: includes/admin/class-admin.php:534
    124136msgid "Statistics"
    125137msgstr ""
    126138
    127 #: includes/admin/class-admin.php:518
     139#: includes/admin/class-admin.php:550
    128140msgid "Google Analytics 4"
    129141msgstr ""
    130142
    131 #: includes/admin/class-admin.php:530
     143#: includes/admin/class-admin.php:562
    132144msgid "Hotjar site ID"
    133145msgstr ""
    134146
    135 #: includes/admin/class-admin.php:548
     147#: includes/admin/class-admin.php:580
    136148msgid "Marketing"
    137149msgstr ""
    138150
    139 #: includes/admin/class-admin.php:565
     151#: includes/admin/class-admin.php:597
    140152msgid "Google Ads Conversion ID"
    141153msgstr ""
    142154
    143 #: includes/admin/class-admin.php:579
     155#: includes/admin/class-admin.php:611
    144156msgid "Google Ads Purchase Conversion Label"
    145157msgstr ""
    146158
    147 #: includes/admin/class-admin.php:592
     159#: includes/admin/class-admin.php:624
    148160msgid "Meta (Facebook) pixel ID"
    149161msgstr ""
    150162
    151 #: includes/admin/class-admin.php:612
     163#: includes/admin/class-admin.php:644
    152164msgid "Adroll advertiser ID"
    153165msgstr ""
    154166
    155 #: includes/admin/class-admin.php:624
     167#: includes/admin/class-admin.php:656
    156168msgid "Adroll pixel ID"
    157169msgstr ""
    158170
    159 #: includes/admin/class-admin.php:637
     171#: includes/admin/class-admin.php:669
    160172msgid "LinkedIn partner ID"
    161173msgstr ""
    162174
    163 #: includes/admin/class-admin.php:649
     175#: includes/admin/class-admin.php:681
    164176msgid "Microsoft Advertising UET tag ID"
    165177msgstr ""
    166178
    167 #: includes/admin/class-admin.php:663
     179#: includes/admin/class-admin.php:695
    168180msgid "Outbrain advertiser ID"
    169181msgstr ""
    170182
    171 #: includes/admin/class-admin.php:677
     183#: includes/admin/class-admin.php:709
    172184msgid "Pinterest pixel ID"
    173185msgstr ""
    174186
    175 #: includes/admin/class-admin.php:689
     187#: includes/admin/class-admin.php:721
    176188msgid "Reddit pixel ID"
    177189msgstr ""
    178190
    179 #: includes/admin/class-admin.php:701
     191#: includes/admin/class-admin.php:733
    180192msgid "Snapchat pixel ID"
    181193msgstr ""
    182194
    183 #: includes/admin/class-admin.php:713
     195#: includes/admin/class-admin.php:745
    184196msgid "Taboola account ID"
    185197msgstr ""
    186198
    187 #: includes/admin/class-admin.php:725
     199#: includes/admin/class-admin.php:757
    188200msgid "TikTok pixel ID"
    189201msgstr ""
    190202
    191 #: includes/admin/class-admin.php:737
     203#: includes/admin/class-admin.php:769
    192204msgid "X (Twitter) pixel ID"
    193205msgstr ""
    194206
    195 #: includes/admin/class-admin.php:756
     207#: includes/admin/class-admin.php:788
    196208msgid "Optimization"
    197209msgstr ""
    198210
    199 #: includes/admin/class-admin.php:774
     211#: includes/admin/class-admin.php:806
    200212msgid "AB Tasty"
    201213msgstr ""
    202214
    203 #: includes/admin/class-admin.php:785
     215#: includes/admin/class-admin.php:817
    204216msgid "Optimizely"
    205217msgstr ""
    206218
    207 #: includes/admin/class-admin.php:797
     219#: includes/admin/class-admin.php:829
    208220msgid "VWO"
    209221msgstr ""
    210222
    211 #: includes/admin/class-admin.php:809
     223#: includes/admin/class-admin.php:841
    212224msgid "Advanced"
    213225msgstr ""
    214226
    215 #: includes/admin/class-admin.php:858
     227#: includes/admin/class-admin.php:890
    216228msgid "Disable Tracking for User Roles"
    217229msgstr ""
    218230
    219 #: includes/admin/class-admin.php:869
     231#: includes/admin/class-admin.php:901
    220232msgid "Scroll Tracker"
    221233msgstr ""
    222234
    223 #: includes/admin/class-admin.php:881
     235#: includes/admin/class-admin.php:913
    224236msgid "Lazy Load PMW"
    225237msgstr ""
    226238
    227 #: includes/admin/class-admin.php:893
     239#: includes/admin/class-admin.php:925
    228240msgid "Track PageView Events Server-to-Server"
    229241msgstr ""
    230242
    231 #: includes/admin/class-admin.php:906
     243#: includes/admin/class-admin.php:938
    232244msgid "Maximum Compatibility Mode"
    233245msgstr ""
    234246
    235 #: includes/admin/class-admin.php:920
    236 #: includes/admin/class-admin.php:929
     247#: includes/admin/class-admin.php:952
     248#: includes/admin/class-admin.php:961
    237249msgid "Shop"
    238250msgstr ""
    239251
    240 #: includes/admin/class-admin.php:937
     252#: includes/admin/class-admin.php:969
    241253msgid "Marketing Value Logic"
    242254msgstr ""
    243255
    244 #: includes/admin/class-admin.php:949
     256#: includes/admin/class-admin.php:981
    245257msgid "Dynamic Remarketing"
    246258msgstr ""
    247259
    248 #: includes/admin/class-admin.php:961
     260#: includes/admin/class-admin.php:993
    249261msgid "Product Identifier"
    250262msgstr ""
    251263
    252 #: includes/admin/class-admin.php:973
     264#: includes/admin/class-admin.php:1005
    253265msgid "Variations output"
    254266msgstr ""
    255267
    256 #: includes/admin/class-admin.php:986
     268#: includes/admin/class-admin.php:1018
    257269msgid "Google Business Vertical"
    258270msgstr ""
    259271
    260 #: includes/admin/class-admin.php:999
     272#: includes/admin/class-admin.php:1031
    261273msgid "Order Duplication Prevention"
    262274msgstr ""
    263275
    264 #: includes/admin/class-admin.php:1013
     276#: includes/admin/class-admin.php:1045
    265277msgid "ACR"
    266278msgstr ""
    267279
    268 #: includes/admin/class-admin.php:1026
     280#: includes/admin/class-admin.php:1058
    269281msgid "Order List Info"
    270282msgstr ""
    271283
    272 #: includes/admin/class-admin.php:1040
     284#: includes/admin/class-admin.php:1072
    273285msgid "Subscription Value Multiplier"
    274286msgstr ""
    275287
    276 #: includes/admin/class-admin.php:1053
     288#: includes/admin/class-admin.php:1085
    277289msgid "Lifetime Value Calculation on Orders"
    278290msgstr ""
    279291
    280 #: includes/admin/class-admin.php:1066
     292#: includes/admin/class-admin.php:1098
    281293msgid "Automatic Lifetime Value Recalculation"
    282294msgstr ""
    283295
    284 #: includes/admin/class-admin.php:1079
     296#: includes/admin/class-admin.php:1111
    285297msgid "Manual Lifetime Value Recalculation"
    286298msgstr ""
    287299
    288 #: includes/admin/class-admin.php:1090
     300#: includes/admin/class-admin.php:1122
    289301msgid "Order Extra Details Output"
    290302msgstr ""
    291303
    292 #: includes/admin/class-admin.php:1113
     304#: includes/admin/class-admin.php:1145
    293305msgid "Google Tag ID"
    294306msgstr ""
    295307
    296 #: includes/admin/class-admin.php:1125
     308#: includes/admin/class-admin.php:1157
    297309msgid "Google Tag Gateway Measurement Path"
    298310msgstr ""
    299311
    300 #: includes/admin/class-admin.php:1137
     312#: includes/admin/class-admin.php:1169
    301313msgid "Conversion Cart Data"
    302314msgstr ""
    303315
    304 #: includes/admin/class-admin.php:1149
     316#: includes/admin/class-admin.php:1181
    305317msgid "Enhanced E-Commerce"
    306318msgstr ""
    307319
    308 #: includes/admin/class-admin.php:1164
     320#: includes/admin/class-admin.php:1196
    309321msgid "GA4 API secret"
    310322msgstr ""
    311323
    312 #: includes/admin/class-admin.php:1176
     324#: includes/admin/class-admin.php:1208
    313325msgid "GA4 Property ID"
    314326msgstr ""
    315327
    316 #: includes/admin/class-admin.php:1188
     328#: includes/admin/class-admin.php:1220
    317329msgid "GA4 Data API Credentials"
    318330msgstr ""
    319331
    320 #: includes/admin/class-admin.php:1203
     332#: includes/admin/class-admin.php:1235
    321333msgid "GA4 Page Load Time Tracking"
    322334msgstr ""
    323335
    324 #: includes/admin/class-admin.php:1217
     336#: includes/admin/class-admin.php:1249
    325337msgid "Google User ID"
    326338msgstr ""
    327339
    328 #: includes/admin/class-admin.php:1231
     340#: includes/admin/class-admin.php:1263
    329341#: includes/admin/opportunities/pro/class-google-enhanced-conversions-opportunity.php:37
    330342msgid "Google Enhanced Conversions"
    331343msgstr ""
    332344
    333 #: includes/admin/class-admin.php:1246
     345#: includes/admin/class-admin.php:1278
    334346msgid "Google Ads Phone Conversion Number"
    335347msgstr ""
    336348
    337 #: includes/admin/class-admin.php:1258
     349#: includes/admin/class-admin.php:1290
    338350msgid "Google Ads Phone Conversion Label"
    339351msgstr ""
    340352
    341 #: includes/admin/class-admin.php:1272
     353#: includes/admin/class-admin.php:1304
    342354msgid "Google Ads Conversion Adjustments: Conversion Name"
    343355msgstr ""
    344356
    345 #: includes/admin/class-admin.php:1284
     357#: includes/admin/class-admin.php:1316
    346358msgid "Google Ads Conversion Adjustments: Feed"
    347359msgstr ""
    348360
    349 #: includes/admin/class-admin.php:1300
     361#: includes/admin/class-admin.php:1332
    350362msgid "Automatic Email Link Tracking"
    351363msgstr ""
    352364
    353 #: includes/admin/class-admin.php:1312
     365#: includes/admin/class-admin.php:1344
    354366msgid "Automatic Phone Link Click Tracking"
    355367msgstr ""
    356368
    357 #: includes/admin/class-admin.php:1334
     369#: includes/admin/class-admin.php:1366
    358370msgid "Meta (Facebook) CAPI: token"
    359371msgstr ""
    360372
    361 #: includes/admin/class-admin.php:1346
     373#: includes/admin/class-admin.php:1378
    362374msgid "Meta (Facebook) CAPI: test event code"
    363375msgstr ""
    364376
    365 #: includes/admin/class-admin.php:1358
    366 msgid "Meta (Facebook) CAPI: process anonymous hits"
    367 msgstr ""
    368 
    369 #: includes/admin/class-admin.php:1370
     377#: includes/admin/class-admin.php:1390
    370378msgid "Meta (Facebook): Advanced Matching"
    371379msgstr ""
    372380
    373 #: includes/admin/class-admin.php:1382
     381#: includes/admin/class-admin.php:1402
    374382msgid "Meta (Facebook): Domain Verification Meta Tag ID"
    375383msgstr ""
    376384
    377 #: includes/admin/class-admin.php:1404
     385#: includes/admin/class-admin.php:1424
    378386msgid "Pinterest Ad Account ID"
    379387msgstr ""
    380388
    381 #: includes/admin/class-admin.php:1416
     389#: includes/admin/class-admin.php:1436
    382390msgid "Pinterest Events API: token"
    383391msgstr ""
    384392
    385 #: includes/admin/class-admin.php:1428
    386 msgid "Pinterest Events API: process anonymous hits"
    387 msgstr ""
    388 
    389 #: includes/admin/class-admin.php:1440
     393#: includes/admin/class-admin.php:1448
    390394#: includes/admin/opportunities/pro/class-pinterest-enhanced-match-opportunity.php:37
    391395msgid "Pinterest Enhanced Match"
    392396msgstr ""
    393397
    394 #: includes/admin/class-admin.php:1452
     398#: includes/admin/class-admin.php:1460
    395399msgid "Pinterest: Advanced Matching"
    396400msgstr ""
    397401
    398 #: includes/admin/class-admin.php:1474
     402#: includes/admin/class-admin.php:1482
    399403msgid "Snapchat CAPI Token"
    400404msgstr ""
    401405
    402 #: includes/admin/class-admin.php:1486
     406#: includes/admin/class-admin.php:1494
    403407#: includes/admin/opportunities/pro/class-snapchat-advanced-matching-opportunity.php:37
    404408msgid "Snapchat Advanced Matching"
    405409msgstr ""
    406410
    407 #: includes/admin/class-admin.php:1508
     411#: includes/admin/class-admin.php:1516
     412msgid "Reddit Conversions API: token"
     413msgstr ""
     414
     415#: includes/admin/class-admin.php:1528
     416msgid "Reddit Conversions API: test event code"
     417msgstr ""
     418
     419#: includes/admin/class-admin.php:1540
    408420msgid "Reddit Advanced Matching"
    409421msgstr ""
    410422
    411 #: includes/admin/class-admin.php:1530
     423#: includes/admin/class-admin.php:1562
    412424msgid "TikTok Events API: token"
    413425msgstr ""
    414426
    415 #: includes/admin/class-admin.php:1542
     427#: includes/admin/class-admin.php:1574
    416428msgid "TikTok EAPI: test event code"
    417429msgstr ""
    418430
    419 #: includes/admin/class-admin.php:1554
    420 msgid "TikTok Events API: process anonymous hits"
    421 msgstr ""
    422 
    423 #: includes/admin/class-admin.php:1566
     431#: includes/admin/class-admin.php:1586
    424432msgid "TikTok: Advanced Matching"
    425433msgstr ""
    426434
    427 #: includes/admin/class-admin.php:1588
     435#: includes/admin/class-admin.php:1608
    428436msgid "Microsoft Enhanced Conversions"
    429437msgstr ""
    430438
    431 #: includes/admin/class-admin.php:1620
     439#: includes/admin/class-admin.php:1640
    432440msgid "Search event ID"
    433441msgstr ""
    434442
    435 #: includes/admin/class-admin.php:1632
     443#: includes/admin/class-admin.php:1652
    436444msgid "View Content event ID"
    437445msgstr ""
    438446
    439 #: includes/admin/class-admin.php:1644
     447#: includes/admin/class-admin.php:1664
    440448msgid "Add To List event ID"
    441449msgstr ""
    442450
    443 #: includes/admin/class-admin.php:1656
     451#: includes/admin/class-admin.php:1676
    444452msgid "Add-to-cart event ID"
    445453msgstr ""
    446454
    447 #: includes/admin/class-admin.php:1668
     455#: includes/admin/class-admin.php:1688
    448456msgid "Start-checkout event ID"
    449457msgstr ""
    450458
    451 #: includes/admin/class-admin.php:1680
     459#: includes/admin/class-admin.php:1700
    452460msgid "Purchase event ID"
    453461msgstr ""
    454462
    455 #: includes/admin/class-admin.php:1703
     463#: includes/admin/class-admin.php:1723
    456464msgid "Add To Cart Event ID"
    457465msgstr ""
    458466
    459 #: includes/admin/class-admin.php:1715
     467#: includes/admin/class-admin.php:1735
    460468msgid "Add To Wishlist Event ID"
    461469msgstr ""
    462470
    463 #: includes/admin/class-admin.php:1727
     471#: includes/admin/class-admin.php:1747
    464472msgid "Content View Event ID"
    465473msgstr ""
    466474
    467 #: includes/admin/class-admin.php:1739
     475#: includes/admin/class-admin.php:1759
    468476msgid "Search Event ID"
    469477msgstr ""
    470478
    471 #: includes/admin/class-admin.php:1751
     479#: includes/admin/class-admin.php:1771
    472480msgid "Checkout Initiated Event ID"
    473481msgstr ""
    474482
    475 #: includes/admin/class-admin.php:1763
     483#: includes/admin/class-admin.php:1783
    476484msgid "Add Payment Info Event ID"
    477485msgstr ""
    478486
    479 #: includes/admin/class-admin.php:1775
     487#: includes/admin/class-admin.php:1795
    480488msgid "Purchase Event ID"
    481489msgstr ""
    482490
    483 #: includes/admin/class-admin.php:1787
    484 #: includes/admin/class-admin.php:1796
     491#: includes/admin/class-admin.php:1807
     492#: includes/admin/class-admin.php:1816
    485493msgid "Consent Management"
    486494msgstr ""
    487495
    488 #: includes/admin/class-admin.php:1804
     496#: includes/admin/class-admin.php:1824
    489497msgid "Google Consent Mode v2"
    490498msgstr ""
    491499
    492 #: includes/admin/class-admin.php:1817
     500#: includes/admin/class-admin.php:1837
    493501msgid "Microsoft Ads Consent Mode"
    494502msgstr ""
    495503
    496 #: includes/admin/class-admin.php:1830
     504#: includes/admin/class-admin.php:1850
    497505msgid "Explicit Consent Mode"
    498506msgstr ""
    499507
    500 #: includes/admin/class-admin.php:1842
     508#: includes/admin/class-admin.php:1862
    501509msgid "Explicit Consent Regions"
    502510msgstr ""
    503511
    504 #: includes/admin/class-admin.php:1855
     512#: includes/admin/class-admin.php:1875
    505513msgid "Google TCF Support"
    506514msgstr ""
    507515
    508 #: includes/admin/class-admin.php:1869
     516#: includes/admin/class-admin.php:1889
    509517msgid "Cookiebot Support"
    510518msgstr ""
    511519
    512 #: includes/admin/class-admin.php:1883
     520#: includes/admin/class-admin.php:1903
    513521msgid "Complianz GDPR Support"
    514522msgstr ""
    515523
    516 #: includes/admin/class-admin.php:1897
     524#: includes/admin/class-admin.php:1917
    517525msgid "Cookie Notice Support"
    518526msgstr ""
    519527
    520 #: includes/admin/class-admin.php:1911
     528#: includes/admin/class-admin.php:1931
    521529msgid "Cookie Script Support"
    522530msgstr ""
    523531
    524 #: includes/admin/class-admin.php:1925
     532#: includes/admin/class-admin.php:1945
    525533msgid "GDPR Cookie Compliance Support"
    526534msgstr ""
    527535
    528 #: includes/admin/class-admin.php:1939
     536#: includes/admin/class-admin.php:1959
    529537msgid "CookieYes Support"
    530538msgstr ""
    531539
    532 #: includes/admin/class-admin.php:1953
     540#: includes/admin/class-admin.php:1973
    533541msgid "Termly CMP Support"
    534542msgstr ""
    535543
    536 #: includes/admin/class-admin.php:1968
    537 #: includes/admin/class-admin.php:1981
     544#: includes/admin/class-admin.php:1988
     545#: includes/admin/class-admin.php:2001
    538546msgid "Logs"
    539547msgstr ""
    540548
    541 #: includes/admin/class-admin.php:1992
     549#: includes/admin/class-admin.php:2012
    542550msgid "Logger"
    543551msgstr ""
    544552
    545 #: includes/admin/class-admin.php:2004
     553#: includes/admin/class-admin.php:2024
    546554msgid "Log Level"
    547555msgstr ""
    548556
    549 #: includes/admin/class-admin.php:2016
     557#: includes/admin/class-admin.php:2036
    550558msgid "Log HTTP Requests"
    551559msgstr ""
    552560
    553 #: includes/admin/class-admin.php:2031
     561#: includes/admin/class-admin.php:2051
    554562msgid "Log Files"
    555563msgstr ""
    556564
    557 #: includes/admin/class-admin.php:2044
    558 #: includes/admin/class-admin.php:2053
    559 #: includes/admin/class-admin.php:2310
     565#: includes/admin/class-admin.php:2064
     566#: includes/admin/class-admin.php:2073
     567#: includes/admin/class-admin.php:2330
    560568msgid "Diagnostics"
    561569msgstr ""
    562570
    563 #: includes/admin/class-admin.php:2061
    564 #: includes/admin/class-admin.php:2070
     571#: includes/admin/class-admin.php:2081
     572#: includes/admin/class-admin.php:2090
    565573msgid "Opportunities"
    566574msgstr ""
    567575
    568 #: includes/admin/class-admin.php:2078
    569 #: includes/admin/class-admin.php:2087
     576#: includes/admin/class-admin.php:2098
     577#: includes/admin/class-admin.php:2107
    570578msgid "Support"
    571579msgstr ""
    572580
    573 #: includes/admin/class-admin.php:2119
     581#: includes/admin/class-admin.php:2139
    574582msgid "Contact"
    575583msgstr ""
    576584
    577 #: includes/admin/class-admin.php:2120
     585#: includes/admin/class-admin.php:2140
    578586msgid "Account"
    579587msgstr ""
    580588
    581 #: includes/admin/class-admin.php:2154
     589#: includes/admin/class-admin.php:2174
    582590msgid ""
    583591"It looks like you are using some sort of ad- or script-blocker in your browser which is blocking the script and CSS files of this plugin.\n"
     
    585593msgstr ""
    586594
    587 #: includes/admin/class-admin.php:2160
     595#: includes/admin/class-admin.php:2180
    588596#: includes/admin/notifications/class-notifications.php:385
    589597#: includes/admin/opportunities/class-opportunities.php:188
     
    591599msgstr ""
    592600
    593 #: includes/admin/class-admin.php:2212
     601#: includes/admin/class-admin.php:2232
    594602msgid "Profit Driven Marketing by SweetCode"
    595603msgstr ""
    596604
    597 #: includes/admin/class-admin.php:2221
     605#: includes/admin/class-admin.php:2241
    598606msgid "Enabling this will show you the pro settings in the user interface. It won't actually enable the pro features. If you want to try out the pro features head over to sweetcode.com and sign up for a trial."
    599607msgstr ""
    600608
    601 #: includes/admin/class-admin.php:2223
     609#: includes/admin/class-admin.php:2243
    602610msgid "Show Pro version settings:"
    603611msgstr ""
    604612
    605 #: includes/admin/class-admin.php:2247
     613#: includes/admin/class-admin.php:2267
    606614msgid "Visit us here:"
    607615msgstr ""
    608616
    609 #: includes/admin/class-admin.php:2313
     617#: includes/admin/class-admin.php:2333
    610618msgid "Transients are disabled on your site. Transients are required for the diagnostics report."
    611619msgstr ""
    612620
    613 #: includes/admin/class-admin.php:2316
     621#: includes/admin/class-admin.php:2336
    614622msgid "Please enable transients on your site."
    615623msgstr ""
    616624
    617 #: includes/admin/class-admin.php:2327
     625#: includes/admin/class-admin.php:2347
    618626msgid "Payment Gateway Tracking Accuracy Report"
    619627msgstr ""
    620628
    621 #: includes/admin/class-admin.php:2328
    622 #: includes/admin/class-admin.php:5953
    623 #: includes/admin/class-admin.php:5963
     629#: includes/admin/class-admin.php:2348
     630#: includes/admin/class-admin.php:5927
     631#: includes/admin/class-admin.php:5937
    624632msgid "beta"
    625633msgstr ""
    626634
    627 #: includes/admin/class-admin.php:2332
     635#: includes/admin/class-admin.php:2352
    628636msgid "What's this? Follow this link to learn more"
    629637msgstr ""
    630638
    631 #: includes/admin/class-admin.php:2340
     639#: includes/admin/class-admin.php:2360
    632640msgid "Available payment gateways"
    633641msgstr ""
    634642
    635 #: includes/admin/class-admin.php:2347
     643#: includes/admin/class-admin.php:2367
    636644msgid "id"
    637645msgstr ""
    638646
    639 #: includes/admin/class-admin.php:2348
     647#: includes/admin/class-admin.php:2368
    640648msgid "method_title"
    641649msgstr ""
    642650
    643 #: includes/admin/class-admin.php:2349
     651#: includes/admin/class-admin.php:2369
    644652msgid "class"
    645653msgstr ""
    646654
    647 #: includes/admin/class-admin.php:2367
     655#: includes/admin/class-admin.php:2387
    648656msgid "Purchase confirmation page reached per gateway (active and inactive)"
    649657msgstr ""
    650658
    651 #: includes/admin/class-admin.php:2416
     659#: includes/admin/class-admin.php:2436
    652660msgid "Purchase confirmation page reached per gateway (only active), weighted by frequency"
    653661msgstr ""
    654662
    655 #: includes/admin/class-admin.php:2484
     663#: includes/admin/class-admin.php:2504
    656664msgid "Automatic Conversion Recovery (ACR)"
    657665msgstr ""
    658666
    659 #: includes/admin/class-admin.php:2548
     667#: includes/admin/class-admin.php:2568
    660668msgid "Unknown gateway"
    661669msgstr ""
    662670
    663671#. translators: The number and percentage of orders that were recovered by the Automatic Conversion Recovery (ACR).
    664 #: includes/admin/class-admin.php:2601
     672#: includes/admin/class-admin.php:2621
    665673#, php-format
    666674msgid "ACR recovered %1$s (%2$s%%) out of %3$s missing conversions."
    667675msgstr ""
    668676
    669 #: includes/admin/class-admin.php:2619
     677#: includes/admin/class-admin.php:2639
    670678msgid "This feature is only available in the pro version of the plugin. Follow the link to learn more about it:"
    671679msgstr ""
    672680
    673 #: includes/admin/class-admin.php:2621
     681#: includes/admin/class-admin.php:2641
    674682msgid "Get the pro version of the Pixel Manager for WooCommerce over here"
    675683msgstr ""
    676684
    677 #: includes/admin/class-admin.php:2623
     685#: includes/admin/class-admin.php:2643
    678686msgid "Go Pro"
    679687msgstr ""
    680688
    681 #: includes/admin/class-admin.php:2661
     689#: includes/admin/class-admin.php:2681
    682690msgid "Contacting Support"
    683691msgstr ""
    684692
    685 #: includes/admin/class-admin.php:2678
     693#: includes/admin/class-admin.php:2698
    686694msgid "Debug Information"
    687695msgstr ""
    688696
    689 #: includes/admin/class-admin.php:2720
    690 #: includes/admin/class-admin.php:2747
     697#: includes/admin/class-admin.php:2740
     698#: includes/admin/class-admin.php:2767
    691699msgid "Copy to Clipboard"
    692700msgstr ""
    693701
    694 #: includes/admin/class-admin.php:2722
    695 #: includes/admin/class-admin.php:2750
     702#: includes/admin/class-admin.php:2742
     703#: includes/admin/class-admin.php:2770
    696704msgid "Copied!"
    697705msgstr ""
    698706
    699 #: includes/admin/class-admin.php:2732
     707#: includes/admin/class-admin.php:2752
    700708msgid "Export settings"
    701709msgstr ""
    702710
    703 #: includes/admin/class-admin.php:2743
     711#: includes/admin/class-admin.php:2763
    704712msgid "Export to disk"
    705713msgstr ""
    706714
    707 #: includes/admin/class-admin.php:2826
     715#: includes/admin/class-admin.php:2846
    708716msgid "Import settings"
    709717msgstr ""
    710718
    711 #: includes/admin/class-admin.php:2830
     719#: includes/admin/class-admin.php:2850
    712720msgid "Choose File"
    713721msgstr ""
    714722
    715 #: includes/admin/class-admin.php:2838
     723#: includes/admin/class-admin.php:2858
     724#: includes/admin/class-admin.php:4583
     725msgid "Settings imported successfully!"
     726msgstr ""
     727
     728#: includes/admin/class-admin.php:2861
     729msgid "Reloading...(in 1 second)!"
     730msgstr ""
     731
     732#: includes/admin/class-admin.php:2867
     733#: includes/admin/class-admin.php:4592
     734msgid "There was an error importing that file! Please try again."
     735msgstr ""
     736
     737#: includes/admin/class-admin.php:2961
     738msgid "Automatic Settings Backup"
     739msgstr ""
     740
     741#: includes/admin/class-admin.php:2962
     742msgid "Manage your settings backups. You can restore previous configurations or download backup files."
     743msgstr ""
     744
     745#: includes/admin/class-admin.php:2968
     746msgid "No automatic settings backups available."
     747msgstr ""
     748
     749#: includes/admin/class-admin.php:2974
     750msgid "ID"
     751msgstr ""
     752
     753#: includes/admin/class-admin.php:2975
     754msgid "Date"
     755msgstr ""
     756
     757#: includes/admin/class-admin.php:2976
     758msgid "DB Version"
     759msgstr ""
     760
     761#: includes/admin/class-admin.php:2977
     762msgid "Status"
     763msgstr ""
     764
     765#: includes/admin/class-admin.php:2978
     766#: includes/admin/class-admin.php:3008
     767msgid "Restore"
     768msgstr ""
     769
     770#: includes/admin/class-admin.php:2979
     771#: includes/admin/class-admin.php:3011
     772msgid "Download"
     773msgstr ""
     774
     775#: includes/admin/class-admin.php:2986
     776msgid "Unknown"
     777msgstr ""
     778
     779#: includes/admin/class-admin.php:2999
     780#: includes/admin/class-admin.php:3006
     781msgid "Active"
     782msgstr ""
     783
     784#: includes/admin/class-admin.php:3001
     785msgid "Backup"
     786msgstr ""
     787
     788#: includes/admin/class-admin.php:3006
     789msgid "Cannot restore the currently active backup"
     790msgstr ""
     791
     792#: includes/admin/class-admin.php:3266
     793msgid "Chat with our fantastic AI bot Pixie (Pixie knows everything we do!):"
     794msgstr ""
     795
     796#: includes/admin/class-admin.php:3270
     797msgid "Chat"
     798msgstr ""
     799
     800#: includes/admin/class-admin.php:3278
     801msgid "Post a support request in the WordPress support forum here: "
     802msgstr ""
     803
     804#: includes/admin/class-admin.php:3281
     805msgid "Support forum"
     806msgstr ""
     807
     808#: includes/admin/class-admin.php:3285
     809msgid "(Never post the debug or other sensitive information to the support forum. Instead send us the information by email.)"
     810msgstr ""
     811
     812#: includes/admin/class-admin.php:3288
     813msgid "Send us an email to the following address:"
     814msgstr ""
     815
     816#: includes/admin/class-admin.php:3302
     817msgid "Send us your support request through the WooCommerce.com dashboard: "
     818msgstr ""
     819
     820#: includes/admin/class-admin.php:3328
     821msgid "The Google Analytics 4 measurement ID looks like this:"
     822msgstr ""
     823
     824#: includes/admin/class-admin.php:3349
     825msgid "The conversion ID looks similar to this:"
     826msgstr ""
     827
     828#: includes/admin/class-admin.php:3370
     829msgid "The purchase conversion label looks similar to this:"
     830msgstr ""
     831
     832#: includes/admin/class-admin.php:3374
     833msgid "Requires an active Google Ads Conversion ID"
     834msgstr ""
     835
     836#: includes/admin/class-admin.php:3395
     837msgid "The VWO account ID looks like this:"
     838msgstr ""
     839
     840#: includes/admin/class-admin.php:3414
     841msgid "The Optimizely project ID looks like this:"
     842msgstr ""
     843
     844#: includes/admin/class-admin.php:3433
     845msgid "The AB Tasty account ID looks like this:"
     846msgstr ""
     847
     848#: includes/admin/class-admin.php:3452
     849msgid "The Meta (Facebook) pixel ID looks similar to this:"
     850msgstr ""
     851
     852#: includes/admin/class-admin.php:3482
     853msgid "Requires an active Adroll pixel ID."
     854msgstr ""
     855
     856#: includes/admin/class-admin.php:3491
     857msgid "The Adroll advertiser ID looks similar to this:"
     858msgstr ""
     859
     860#: includes/admin/class-admin.php:3521
     861msgid "Requires an active Adroll advertiser ID."
     862msgstr ""
     863
     864#: includes/admin/class-admin.php:3530
     865msgid "The Adroll pixel ID looks similar to this:"
     866msgstr ""
     867
     868#: includes/admin/class-admin.php:3548
     869msgid "Enable Microsoft Enhanced Conversions"
     870msgstr ""
     871
     872#: includes/admin/class-admin.php:3576
     873msgid "The LinkedIn partner ID looks similar to this:"
     874msgstr ""
     875
     876#: includes/admin/class-admin.php:3729
     877msgid "The Microsoft Advertising UET tag ID looks similar to this:"
     878msgstr ""
     879
     880#: includes/admin/class-admin.php:3750
     881msgid "The X (Twitter) pixel ID looks similar to this:"
     882msgstr ""
     883
     884#: includes/admin/class-admin.php:3919
     885msgid "The Outbrain advertiser ID looks similar to this:"
     886msgstr ""
     887
     888#: includes/admin/class-admin.php:3941
     889msgid "The Pinterest pixel ID looks similar to this:"
     890msgstr ""
     891
     892#: includes/admin/class-admin.php:3961
     893msgid "Enable Pinterest enhanced match"
     894msgstr ""
     895
     896#: includes/admin/class-admin.php:3990
     897msgid "The Snapchat pixel ID looks similar to this:"
     898msgstr ""
     899
     900#: includes/admin/class-admin.php:4013
     901msgid "The Taboola account ID looks similar to this:"
     902msgstr ""
     903
     904#: includes/admin/class-admin.php:4035
     905msgid "The TikTok pixel ID looks similar to this:"
     906msgstr ""
     907
     908#: includes/admin/class-admin.php:4054
     909msgid "The Hotjar site ID looks similar to this:"
     910msgstr ""
     911
     912#: includes/admin/class-admin.php:4079
     913msgid "The Reddit pixel ID looks similar to this:"
     914msgstr ""
     915
     916#: includes/admin/class-admin.php:4100
     917msgid "You need to activate the Snapchat pixel"
     918msgstr ""
     919
     920#: includes/admin/class-admin.php:4120
     921msgid "Enable Snapchat Advanced Matching"
     922msgstr ""
     923
     924#: includes/admin/class-admin.php:4142
     925msgid "Enable Reddit advanced matching"
     926msgstr ""
     927
     928#: includes/admin/class-admin.php:4165
     929#: includes/admin/class-admin.php:4186
     930msgid "You need to activate the Reddit pixel"
     931msgstr ""
     932
     933#: includes/admin/class-admin.php:4202
     934msgid "Order Subtotal: Doesn't include tax, shipping, and if available, fees like PayPal or Stripe fees (default)"
     935msgstr ""
     936
     937#: includes/admin/class-admin.php:4213
     938msgid "Order Total: Includes tax and shipping"
     939msgstr ""
     940
     941#: includes/admin/class-admin.php:4229
     942msgid "Profit Margin: Only reports the profit margin. Excludes tax, shipping, and where possible, gateway fees."
     943msgstr ""
     944
     945#: includes/admin/class-admin.php:4237
     946msgid "This is the total value reported back to the marketing pixels (such as Google Ads, Meta (Facebook), etc.). It excludes statistics pixels."
     947msgstr ""
     948
     949#: includes/admin/class-admin.php:4242
     950msgid "To use the Profit Margin setting you will need to install one of the following two Cost of Goods plugins:"
     951msgstr ""
     952
     953#: includes/admin/class-admin.php:4245
     954msgid "or"
     955msgstr ""
     956
     957#: includes/admin/class-admin.php:4269
     958#: includes/admin/class-admin.php:4296
     959msgid "open the documentation"
     960msgstr ""
     961
     962#: includes/admin/class-admin.php:4286
     963msgid "advanced settings"
     964msgstr ""
     965
     966#: includes/admin/class-admin.php:4315
     967msgid "Enable Google Consent Mode v2 with standard settings"
     968msgstr ""
     969
     970#: includes/admin/class-admin.php:4336
     971msgid "Enable Microsoft Ads Consent Mode with standard settings"
     972msgstr ""
     973
     974#: includes/admin/class-admin.php:4362
     975msgid "Enable Explicit Consent Mode"
     976msgstr ""
     977
     978#: includes/admin/class-admin.php:4373
     979msgid "While the Explicit Consent Mode is active no pixels will be fired until the visitor gives consent."
     980msgstr ""
     981
     982#: includes/admin/class-admin.php:4378
     983msgid "Only activate the Explicit Consent Mode if you are also using a Consent Management Platform (a cookie banner) that is compatible with the Pixel Manager. Here's a list of compatible plugins:"
     984msgstr ""
     985
     986#: includes/admin/class-admin.php:4381
     987msgid "Compatible Consent Management Platforms (CMPs)"
     988msgstr ""
     989
     990#: includes/admin/class-admin.php:4383
     991msgid "You can also use our Consent API to make your custom cookie banner compatible with the Pixel Manager:"
     992msgstr ""
     993
     994#: includes/admin/class-admin.php:4386
     995msgid "Consent API"
     996msgstr ""
     997
     998#: includes/admin/class-admin.php:4401
     999msgid "Choose countries"
     1000msgstr ""
     1001
     1002#: includes/admin/class-admin.php:4430
     1003msgid "Regions in which tracking with cookies will only be activated after the visitor gives consent."
     1004msgstr ""
     1005
     1006#: includes/admin/class-admin.php:4436
     1007msgid "Requires the Explicit Consent Mode to be active."
     1008msgstr ""
     1009
     1010#: includes/admin/class-admin.php:4441
     1011msgid "If no region is set, then the restrictions are enabled worldwide. If you specify one or more regions, then the restrictions only apply for the specified regions. For countries outside of those regions, tracking will work without restrictions until the visitor removes consent."
     1012msgstr ""
     1013
     1014#: includes/admin/class-admin.php:4462
     1015msgid "Enable Google TCF support"
     1016msgstr ""
     1017
     1018#: includes/admin/class-admin.php:4473
     1019msgid "Google Analytics Enhanced E-Commerce is "
     1020msgstr ""
     1021
     1022#: includes/admin/class-admin.php:4496
     1023msgid "Google Analytics 4 activation required"
     1024msgstr ""
     1025
     1026#: includes/admin/class-admin.php:4499
     1027msgid "If enabled, purchase and refund events will be sent to Google through the measurement protocol for increased accuracy."
     1028msgstr ""
     1029
    7161030#: includes/admin/class-admin.php:4521
    717 msgid "Settings imported successfully!"
    718 msgstr ""
    719 
    720 #: includes/admin/class-admin.php:2841
    721 msgid "Reloading...(in 1 second)!"
    722 msgstr ""
    723 
    724 #: includes/admin/class-admin.php:2847
    725 #: includes/admin/class-admin.php:4530
    726 msgid "There was an error importing that file! Please try again."
    727 msgstr ""
    728 
    729 #: includes/admin/class-admin.php:2941
    730 msgid "Automatic Settings Backup"
    731 msgstr ""
    732 
    733 #: includes/admin/class-admin.php:2942
    734 msgid "Manage your settings backups. You can restore previous configurations or download backup files."
    735 msgstr ""
    736 
    737 #: includes/admin/class-admin.php:2948
    738 msgid "No automatic settings backups available."
    739 msgstr ""
    740 
    741 #: includes/admin/class-admin.php:2954
    742 msgid "ID"
    743 msgstr ""
    744 
    745 #: includes/admin/class-admin.php:2955
    746 msgid "Date"
    747 msgstr ""
    748 
    749 #: includes/admin/class-admin.php:2956
    750 msgid "DB Version"
    751 msgstr ""
    752 
    753 #: includes/admin/class-admin.php:2957
    754 msgid "Status"
    755 msgstr ""
    756 
    757 #: includes/admin/class-admin.php:2958
    758 #: includes/admin/class-admin.php:2988
    759 msgid "Restore"
    760 msgstr ""
    761 
    762 #: includes/admin/class-admin.php:2959
    763 #: includes/admin/class-admin.php:2991
    764 msgid "Download"
    765 msgstr ""
    766 
    767 #: includes/admin/class-admin.php:2966
    768 msgid "Unknown"
    769 msgstr ""
    770 
    771 #: includes/admin/class-admin.php:2979
    772 #: includes/admin/class-admin.php:2986
    773 msgid "Active"
    774 msgstr ""
    775 
    776 #: includes/admin/class-admin.php:2981
    777 msgid "Backup"
    778 msgstr ""
    779 
    780 #: includes/admin/class-admin.php:2986
    781 msgid "Cannot restore the currently active backup"
    782 msgstr ""
    783 
    784 #: includes/admin/class-admin.php:3246
    785 msgid "Chat with our fantastic AI bot Pixie (Pixie knows everything we do!):"
    786 msgstr ""
    787 
    788 #: includes/admin/class-admin.php:3250
    789 msgid "Chat"
    790 msgstr ""
    791 
    792 #: includes/admin/class-admin.php:3258
    793 msgid "Post a support request in the WordPress support forum here: "
    794 msgstr ""
    795 
    796 #: includes/admin/class-admin.php:3261
    797 msgid "Support forum"
    798 msgstr ""
    799 
    800 #: includes/admin/class-admin.php:3265
    801 msgid "(Never post the debug or other sensitive information to the support forum. Instead send us the information by email.)"
    802 msgstr ""
    803 
    804 #: includes/admin/class-admin.php:3268
    805 msgid "Send us an email to the following address:"
    806 msgstr ""
    807 
    808 #: includes/admin/class-admin.php:3282
    809 msgid "Send us your support request through the WooCommerce.com dashboard: "
    810 msgstr ""
    811 
    812 #: includes/admin/class-admin.php:3308
    813 msgid "The Google Analytics 4 measurement ID looks like this:"
    814 msgstr ""
    815 
    816 #: includes/admin/class-admin.php:3329
    817 msgid "The conversion ID looks similar to this:"
    818 msgstr ""
    819 
    820 #: includes/admin/class-admin.php:3350
    821 msgid "The purchase conversion label looks similar to this:"
    822 msgstr ""
    823 
    824 #: includes/admin/class-admin.php:3354
    825 msgid "Requires an active Google Ads Conversion ID"
    826 msgstr ""
    827 
    828 #: includes/admin/class-admin.php:3375
    829 msgid "The VWO account ID looks like this:"
    830 msgstr ""
    831 
    832 #: includes/admin/class-admin.php:3394
    833 msgid "The Optimizely project ID looks like this:"
    834 msgstr ""
    835 
    836 #: includes/admin/class-admin.php:3413
    837 msgid "The AB Tasty account ID looks like this:"
    838 msgstr ""
    839 
    840 #: includes/admin/class-admin.php:3432
    841 msgid "The Meta (Facebook) pixel ID looks similar to this:"
    842 msgstr ""
    843 
    844 #: includes/admin/class-admin.php:3462
    845 msgid "Requires an active Adroll pixel ID."
    846 msgstr ""
    847 
    848 #: includes/admin/class-admin.php:3471
    849 msgid "The Adroll advertiser ID looks similar to this:"
    850 msgstr ""
    851 
    852 #: includes/admin/class-admin.php:3501
    853 msgid "Requires an active Adroll advertiser ID."
    854 msgstr ""
    855 
    856 #: includes/admin/class-admin.php:3510
    857 msgid "The Adroll pixel ID looks similar to this:"
    858 msgstr ""
    859 
    860 #: includes/admin/class-admin.php:3528
    861 msgid "Enable Microsoft Enhanced Conversions"
    862 msgstr ""
    863 
    864 #: includes/admin/class-admin.php:3556
    865 msgid "The LinkedIn partner ID looks similar to this:"
    866 msgstr ""
    867 
    868 #: includes/admin/class-admin.php:3709
    869 msgid "The Microsoft Advertising UET tag ID looks similar to this:"
    870 msgstr ""
    871 
    872 #: includes/admin/class-admin.php:3730
    873 msgid "The X (Twitter) pixel ID looks similar to this:"
    874 msgstr ""
    875 
    876 #: includes/admin/class-admin.php:3899
    877 msgid "The Outbrain advertiser ID looks similar to this:"
    878 msgstr ""
    879 
    880 #: includes/admin/class-admin.php:3921
    881 msgid "The Pinterest pixel ID looks similar to this:"
    882 msgstr ""
    883 
    884 #: includes/admin/class-admin.php:3941
    885 msgid "Enable Pinterest enhanced match"
    886 msgstr ""
    887 
    888 #: includes/admin/class-admin.php:3970
    889 msgid "The Snapchat pixel ID looks similar to this:"
    890 msgstr ""
    891 
    892 #: includes/admin/class-admin.php:3993
    893 msgid "The Taboola account ID looks similar to this:"
    894 msgstr ""
    895 
    896 #: includes/admin/class-admin.php:4015
    897 msgid "The TikTok pixel ID looks similar to this:"
    898 msgstr ""
    899 
    900 #: includes/admin/class-admin.php:4034
    901 msgid "The Hotjar site ID looks similar to this:"
    902 msgstr ""
    903 
    904 #: includes/admin/class-admin.php:4059
    905 msgid "The Reddit pixel ID looks similar to this:"
    906 msgstr ""
    907 
    908 #: includes/admin/class-admin.php:4080
    909 msgid "You need to activate the Snapchat pixel"
    910 msgstr ""
    911 
    912 #: includes/admin/class-admin.php:4100
    913 msgid "Enable Snapchat Advanced Matching"
    914 msgstr ""
    915 
    916 #: includes/admin/class-admin.php:4122
    917 msgid "Enable Reddit advanced matching"
    918 msgstr ""
    919 
    920 #: includes/admin/class-admin.php:4140
    921 msgid "Order Subtotal: Doesn't include tax, shipping, and if available, fees like PayPal or Stripe fees (default)"
    922 msgstr ""
    923 
    924 #: includes/admin/class-admin.php:4151
    925 msgid "Order Total: Includes tax and shipping"
    926 msgstr ""
    927 
    928 #: includes/admin/class-admin.php:4167
    929 msgid "Profit Margin: Only reports the profit margin. Excludes tax, shipping, and where possible, gateway fees."
    930 msgstr ""
    931 
    932 #: includes/admin/class-admin.php:4175
    933 msgid "This is the total value reported back to the marketing pixels (such as Google Ads, Meta (Facebook), etc.). It excludes statistics pixels."
    934 msgstr ""
    935 
    936 #: includes/admin/class-admin.php:4180
    937 msgid "To use the Profit Margin setting you will need to install one of the following two Cost of Goods plugins:"
    938 msgstr ""
    939 
    940 #: includes/admin/class-admin.php:4183
    941 msgid "or"
    942 msgstr ""
    943 
    944 #: includes/admin/class-admin.php:4207
    945 #: includes/admin/class-admin.php:4234
    946 msgid "open the documentation"
    947 msgstr ""
    948 
    949 #: includes/admin/class-admin.php:4224
    950 msgid "advanced settings"
    951 msgstr ""
    952 
    953 #: includes/admin/class-admin.php:4253
    954 msgid "Enable Google Consent Mode v2 with standard settings"
    955 msgstr ""
    956 
    957 #: includes/admin/class-admin.php:4274
    958 msgid "Enable Microsoft Ads Consent Mode with standard settings"
    959 msgstr ""
    960 
    961 #: includes/admin/class-admin.php:4300
    962 msgid "Enable Explicit Consent Mode"
    963 msgstr ""
    964 
    965 #: includes/admin/class-admin.php:4311
    966 msgid "While the Explicit Consent Mode is active no pixels will be fired until the visitor gives consent."
    967 msgstr ""
    968 
    969 #: includes/admin/class-admin.php:4316
    970 msgid "Only activate the Explicit Consent Mode if you are also using a Consent Management Platform (a cookie banner) that is compatible with the Pixel Manager. Here's a list of compatible plugins:"
    971 msgstr ""
    972 
    973 #: includes/admin/class-admin.php:4319
    974 msgid "Compatible Consent Management Platforms (CMPs)"
    975 msgstr ""
    976 
    977 #: includes/admin/class-admin.php:4321
    978 msgid "You can also use our Consent API to make your custom cookie banner compatible with the Pixel Manager:"
    979 msgstr ""
    980 
    981 #: includes/admin/class-admin.php:4324
    982 msgid "Consent API"
    983 msgstr ""
    984 
    985 #: includes/admin/class-admin.php:4339
    986 msgid "Choose countries"
    987 msgstr ""
    988 
    989 #: includes/admin/class-admin.php:4368
    990 msgid "Regions in which tracking with cookies will only be activated after the visitor gives consent."
    991 msgstr ""
    992 
    993 #: includes/admin/class-admin.php:4374
    994 msgid "Requires the Explicit Consent Mode to be active."
    995 msgstr ""
    996 
    997 #: includes/admin/class-admin.php:4379
    998 msgid "If no region is set, then the restrictions are enabled worldwide. If you specify one or more regions, then the restrictions only apply for the specified regions. For countries outside of those regions, tracking will work without restrictions until the visitor removes consent."
    999 msgstr ""
    1000 
    1001 #: includes/admin/class-admin.php:4400
    1002 msgid "Enable Google TCF support"
    1003 msgstr ""
    1004 
    1005 #: includes/admin/class-admin.php:4411
    1006 msgid "Google Analytics Enhanced E-Commerce is "
    1007 msgstr ""
    1008 
    1009 #: includes/admin/class-admin.php:4434
    1010 msgid "Google Analytics 4 activation required"
    1011 msgstr ""
    1012 
    1013 #: includes/admin/class-admin.php:4437
    1014 msgid "If enabled, purchase and refund events will be sent to Google through the measurement protocol for increased accuracy."
    1015 msgstr ""
    1016 
    1017 #: includes/admin/class-admin.php:4459
    10181031msgid "GA4 Data API Credentials need to be set."
    10191032msgstr ""
    10201033
    1021 #: includes/admin/class-admin.php:4499
     1034#: includes/admin/class-admin.php:4561
    10221035msgid "Import credentials"
    10231036msgstr ""
    10241037
    1025 #: includes/admin/class-admin.php:4510
     1038#: includes/admin/class-admin.php:4572
    10261039msgid "Delete credentials"
    10271040msgstr ""
    10281041
    1029 #: includes/admin/class-admin.php:4524
     1042#: includes/admin/class-admin.php:4586
    10301043msgid "Reloading...(in 5 seconds)!"
    10311044msgstr ""
    10321045
    1033 #: includes/admin/class-admin.php:4541
     1046#: includes/admin/class-admin.php:4603
    10341047msgid "The GA4 Property ID needs to be set."
    10351048msgstr ""
    10361049
    1037 #: includes/admin/class-admin.php:4560
     1050#: includes/admin/class-admin.php:4622
    10381051msgid "GA4 page load time tracking."
    10391052msgstr ""
    10401053
    1041 #: includes/admin/class-admin.php:4584
     1054#: includes/admin/class-admin.php:4646
    10421055msgid "Enable Google user ID"
    10431056msgstr ""
    10441057
    1045 #: includes/admin/class-admin.php:4595
     1058#: includes/admin/class-admin.php:4657
    10461059msgid "You need to activate GA4 and/or Google Ads"
    10471060msgstr ""
    10481061
    1049 #: includes/admin/class-admin.php:4615
     1062#: includes/admin/class-admin.php:4677
    10501063msgid "Enable Enhanced Conversions for Google Ads and GA4"
    10511064msgstr ""
    10521065
    1053 #: includes/admin/class-admin.php:4625
     1066#: includes/admin/class-admin.php:4687
    10541067msgid "You need to activate Google Ads and or GA4"
    10551068msgstr ""
    10561069
    1057 #: includes/admin/class-admin.php:4646
     1070#: includes/admin/class-admin.php:4708
    10581071msgid "The Google Ads phone conversion number must be in the same format as on the website."
    10591072msgstr ""
    10601073
    1061 #: includes/admin/class-admin.php:4684
     1074#: includes/admin/class-admin.php:4746
    10621075msgid "The conversion name must match the conversion name in Google Ads exactly."
    10631076msgstr ""
    10641077
    1065 #: includes/admin/class-admin.php:4692
     1078#: includes/admin/class-admin.php:4754
    10661079msgid "Requires an active Google Ads Conversion ID and Conversion Label."
    10671080msgstr ""
    10681081
    1069 #: includes/admin/class-admin.php:4723
     1082#: includes/admin/class-admin.php:4785
    10701083msgid "Copied feed URL to clipboard"
    10711084msgstr ""
    10721085
    1073 #: includes/admin/class-admin.php:4728
    1074 #: includes/admin/class-admin.php:4735
    1075 #: includes/admin/class-admin.php:6136
    1076 #: includes/admin/class-admin.php:6165
     1086#: includes/admin/class-admin.php:4790
     1087#: includes/admin/class-admin.php:4797
     1088#: includes/admin/class-admin.php:6110
     1089#: includes/admin/class-admin.php:6139
    10771090msgid "Copy to clipboard"
    10781091msgstr ""
    10791092
    1080 #: includes/admin/class-admin.php:4743
     1093#: includes/admin/class-admin.php:4805
    10811094msgid "The Conversion Name must be set."
    10821095msgstr ""
    10831096
    1084 #: includes/admin/class-admin.php:4751
     1097#: includes/admin/class-admin.php:4813
    10851098msgid "Automatic email link click tracking is "
    10861099msgstr ""
    10871100
    1088 #: includes/admin/class-admin.php:4757
     1101#: includes/admin/class-admin.php:4819
    10891102msgid "Automatic phone link click tracking is "
    10901103msgstr ""
    10911104
    1092 #: includes/admin/class-admin.php:4763
     1105#: includes/admin/class-admin.php:4825
    10931106msgid "Cookiebot detected. Automatic support is:"
    10941107msgstr ""
    10951108
    1096 #: includes/admin/class-admin.php:4769
     1109#: includes/admin/class-admin.php:4831
    10971110msgid "Complianz GDPR detected. Automatic support is:"
    10981111msgstr ""
    10991112
    1100 #: includes/admin/class-admin.php:4775
     1113#: includes/admin/class-admin.php:4837
    11011114msgid "Cookie Notice (by hu-manity.co) detected. Automatic support is:"
    11021115msgstr ""
    11031116
    1104 #: includes/admin/class-admin.php:4781
     1117#: includes/admin/class-admin.php:4843
    11051118msgid "Cookie Script (by cookie-script.com) detected. Automatic support is:"
    11061119msgstr ""
    11071120
    1108 #: includes/admin/class-admin.php:4787
     1121#: includes/admin/class-admin.php:4849
    11091122msgid "GDPR Cookie Compliance (by Moove Agency) detected. Automatic support is:"
    11101123msgstr ""
    11111124
    1112 #: includes/admin/class-admin.php:4793
     1125#: includes/admin/class-admin.php:4855
    11131126msgid "CookieYes detected. Automatic support is"
    11141127msgstr ""
    11151128
    1116 #: includes/admin/class-admin.php:4799
     1129#: includes/admin/class-admin.php:4861
    11171130msgid "Termly CMP detected. Automatic support is:"
    11181131msgstr ""
    11191132
    1120 #: includes/admin/class-admin.php:4820
    1121 #: includes/admin/class-admin.php:4880
    1122 #: includes/admin/class-admin.php:4910
     1133#: includes/admin/class-admin.php:4882
     1134#: includes/admin/class-admin.php:4942
    11231135msgid "You need to activate the Meta (Facebook) pixel"
    11241136msgstr ""
    11251137
    1126 #: includes/admin/class-admin.php:4850
     1138#: includes/admin/class-admin.php:4912
    11271139msgid "The test event code automatically rotates frequently within Facebook. If you don't see the server events flowing in, first make sure that you've set the latest test event code."
    11281140msgstr ""
    11291141
    1130 #: includes/admin/class-admin.php:4871
    1131 msgid "Send CAPI hits for anonymous visitors who likely have blocked the Meta (Facebook) pixel."
    1132 msgstr ""
    1133 
    1134 #: includes/admin/class-admin.php:4901
    1135 #: includes/admin/class-admin.php:5022
    1136 #: includes/admin/class-admin.php:5136
     1142#: includes/admin/class-admin.php:4933
     1143#: includes/admin/class-admin.php:5025
     1144#: includes/admin/class-admin.php:5110
    11371145msgid "Send events with additional visitor identifiers, such as email and phone number, if available."
    11381146msgstr ""
    11391147
    1140 #: includes/admin/class-admin.php:4930
     1148#: includes/admin/class-admin.php:4962
    11411149msgid "The Meta domain verification ID. It looks like this:"
    11421150msgstr ""
    11431151
    1144 #: includes/admin/class-admin.php:4973
    1145 #: includes/admin/class-admin.php:5002
    1146 #: includes/admin/class-admin.php:5031
     1152#: includes/admin/class-admin.php:5005
     1153#: includes/admin/class-admin.php:5034
    11471154msgid "You need to activate the Pinterest pixel"
    11481155msgstr ""
    11491156
    1150 #: includes/admin/class-admin.php:4993
    1151 msgid "Send Events API hits for anonymous visitors who likely have blocked the Pinterest pixel."
    1152 msgstr ""
    1153 
    1154 #: includes/admin/class-admin.php:5057
    1155 #: includes/admin/class-admin.php:5116
    1156 #: includes/admin/class-admin.php:5145
     1157#: includes/admin/class-admin.php:5060
     1158#: includes/admin/class-admin.php:5119
    11571159msgid "You need to activate the TikTok pixel"
    11581160msgstr ""
    11591161
    1160 #: includes/admin/class-admin.php:5087
     1162#: includes/admin/class-admin.php:5090
    11611163msgid "The test event code automatically rotates frequently within TikTok. If you don't see the server events flowing in, first make sure that you've set the latest test event code."
    11621164msgstr ""
    11631165
    1164 #: includes/admin/class-admin.php:5107
    1165 msgid "Send Events API hits for anonymous visitors who likely have blocked the TikTok pixel."
     1166#: includes/admin/class-admin.php:5148
     1167msgid "Only disable order duplication prevention for testing."
     1168msgstr ""
     1169
     1170#: includes/admin/class-admin.php:5154
     1171msgid "Automatically reactivates 6 hours after disabling duplication prevention."
    11661172msgstr ""
    11671173
    11681174#: includes/admin/class-admin.php:5174
    1169 msgid "Only disable order duplication prevention for testing."
    1170 msgstr ""
    1171 
    1172 #: includes/admin/class-admin.php:5180
    1173 msgid "Automatically reactivates 6 hours after disabling duplication prevention."
    1174 msgstr ""
    1175 
    1176 #: includes/admin/class-admin.php:5200
    11771175msgid "Enable the maximum compatibility mode"
    11781176msgstr ""
    11791177
    1180 #: includes/admin/class-admin.php:5237
     1178#: includes/admin/class-admin.php:5211
    11811179msgid "Automatic Conversion Recovery (ACR) is "
    11821180msgstr ""
    11831181
    1184 #: includes/admin/class-admin.php:5258
     1182#: includes/admin/class-admin.php:5232
    11851183msgid "Display Pixel Manager related information on the order list page"
    11861184msgstr ""
    11871185
    1188 #: includes/admin/class-admin.php:5283
     1186#: includes/admin/class-admin.php:5257
    11891187msgid "The Scroll Tracker thresholds. A comma separated list of scroll tracking thresholds in percent where the scroll tracker triggers its events."
    11901188msgstr ""
    11911189
    1192 #: includes/admin/class-admin.php:5306
     1190#: includes/admin/class-admin.php:5280
    11931191msgid "The multiplier multiplies the conversion value output for initial subscriptions to match the CLV of a subscription more closely."
    11941192msgstr ""
    11951193
    1196 #: includes/admin/class-admin.php:5326
     1194#: includes/admin/class-admin.php:5300
    11971195msgid "Enable the lifetime value calculation on new orders."
    11981196msgstr ""
    11991197
    1200 #: includes/admin/class-admin.php:5351
     1198#: includes/admin/class-admin.php:5325
    12011199msgid "Enable the automatic detection and recalculation of the lifetime value."
    12021200msgstr ""
    12031201
     1202#: includes/admin/class-admin.php:5348
     1203msgid "Enable the output of extra order details on order pages."
     1204msgstr ""
     1205
     1206#: includes/admin/class-admin.php:5367
     1207msgid "Schedule LTV recalculation"
     1208msgstr ""
     1209
    12041210#: includes/admin/class-admin.php:5374
    1205 msgid "Enable the output of extra order details on order pages."
    1206 msgstr ""
    1207 
    1208 #: includes/admin/class-admin.php:5393
    1209 msgid "Schedule LTV recalculation"
    1210 msgstr ""
    1211 
    1212 #: includes/admin/class-admin.php:5400
    12131211msgid "Instant LTV recalculation"
    12141212msgstr ""
    12151213
    1216 #: includes/admin/class-admin.php:5408
     1214#: includes/admin/class-admin.php:5382
    12171215msgid "Stop all LTV calculations"
    12181216msgstr ""
    12191217
    1220 #: includes/admin/class-admin.php:5414
     1218#: includes/admin/class-admin.php:5388
    12211219msgid "Recalculation has been scheduled for a run over night. Click one more time to start the recalculation immediately."
    12221220msgstr ""
    12231221
    1224 #: includes/admin/class-admin.php:5420
     1222#: includes/admin/class-admin.php:5394
    12251223msgid "The recalculation is running."
    12261224msgstr ""
    12271225
    1228 #: includes/admin/class-admin.php:5450
     1226#: includes/admin/class-admin.php:5424
    12291227msgid "Lazy load the Pixel Manager"
    12301228msgstr ""
    12311229
    1232 #: includes/admin/class-admin.php:5458
     1230#: includes/admin/class-admin.php:5432
    12331231msgid "Google Optimize is active, but the Google Optimize anti flicker snippet is not. You need to activate the Google Optimize anti flicker snippet, or deactivate Google Optimize."
    12341232msgstr ""
    12351233
    1236 #: includes/admin/class-admin.php:5464
     1234#: includes/admin/class-admin.php:5438
    12371235msgid "Enabling this feature will give you better page speed scores. Please read the documentation to learn more about the full implications while using this feature."
    12381236msgstr ""
    12391237
    1240 #: includes/admin/class-admin.php:5486
     1238#: includes/admin/class-admin.php:5460
    12411239msgid "Send PageView events through the server-2-server protocol"
    12421240msgstr ""
    12431241
    1244 #: includes/admin/class-admin.php:5495
     1242#: includes/admin/class-admin.php:5469
    12451243msgid "For this feature to be used, at least one server-to-server feature, like Facebook CAPI must be enabled."
    12461244msgstr ""
    12471245
    1248 #: includes/admin/class-admin.php:5500
     1246#: includes/admin/class-admin.php:5474
    12491247msgid "Enabling this feature is encouraged by some platforms like Meta (Facebook). But, it will add a lot of stress to your server, because it will have to run on every PageView."
    12501248msgstr ""
    12511249
    1252 #: includes/admin/class-admin.php:5507
     1250#: includes/admin/class-admin.php:5481
    12531251msgid "Advanced order duplication prevention is "
    12541252msgstr ""
    12551253
    1256 #: includes/admin/class-admin.php:5509
     1254#: includes/admin/class-admin.php:5483
    12571255msgid "Basic order duplication prevention is "
    12581256msgstr ""
    12591257
    1260 #: includes/admin/class-admin.php:5523
     1258#: includes/admin/class-admin.php:5497
    12611259msgid "Dynamic Remarketing is"
    12621260msgstr ""
    12631261
    1264 #: includes/admin/class-admin.php:5542
     1262#: includes/admin/class-admin.php:5516
    12651263msgid "Enable logger"
    12661264msgstr ""
    12671265
    1268 #: includes/admin/class-admin.php:5579
     1266#: includes/admin/class-admin.php:5553
    12691267msgid "Enable HTTP request logging"
    12701268msgstr ""
    12711269
    1272 #: includes/admin/class-admin.php:5588
     1270#: includes/admin/class-admin.php:5562
    12731271msgid "This feature switches web requests from asynchronous (faster, non-blocking) to synchronous (slower, blocking) to record responses. It allows the responses to be analyzed, but also uses more server resources. It's meant for troubleshooting and will turn off automatically after 12 hours. You can extend this time if needed. See the user guide for more details."
    12741272msgstr ""
    12751273
    1276 #: includes/admin/class-admin.php:5607
     1274#: includes/admin/class-admin.php:5581
    12771275msgid "Show recent log file"
    12781276msgstr ""
    12791277
    1280 #: includes/admin/class-admin.php:5609
     1278#: includes/admin/class-admin.php:5583
    12811279msgid "No log file found to view"
    12821280msgstr ""
    12831281
    1284 #: includes/admin/class-admin.php:5626
     1282#: includes/admin/class-admin.php:5600
    12851283msgid "Download all log files"
    12861284msgstr ""
    12871285
     1286#: includes/admin/class-admin.php:5602
     1287msgid "No log files found to download"
     1288msgstr ""
     1289
     1290#: includes/admin/class-admin.php:5622
     1291msgid "Enable variations output"
     1292msgstr ""
     1293
    12881294#: includes/admin/class-admin.php:5628
    1289 msgid "No log files found to download"
    1290 msgstr ""
    1291 
    1292 #: includes/admin/class-admin.php:5648
    1293 msgid "Enable variations output"
    1294 msgstr ""
    1295 
    1296 #: includes/admin/class-admin.php:5654
    12971295msgid "In order for this to work you need to upload your product feed including product variations and the item_group_id. Disable it, if you choose only to upload the parent product for variable products."
    12981296msgstr ""
    12991297
    1300 #: includes/admin/class-admin.php:5671
     1298#: includes/admin/class-admin.php:5645
    13011299msgid "Retail"
    13021300msgstr ""
    13031301
    1304 #: includes/admin/class-admin.php:5682
     1302#: includes/admin/class-admin.php:5656
    13051303msgid "Education"
    13061304msgstr ""
    13071305
    1308 #: includes/admin/class-admin.php:5693
     1306#: includes/admin/class-admin.php:5667
    13091307msgid "Hotels and rentals"
    13101308msgstr ""
    13111309
    1312 #: includes/admin/class-admin.php:5704
     1310#: includes/admin/class-admin.php:5678
    13131311msgid "Jobs"
    13141312msgstr ""
    13151313
    1316 #: includes/admin/class-admin.php:5715
     1314#: includes/admin/class-admin.php:5689
    13171315msgid "Local deals"
    13181316msgstr ""
    13191317
    1320 #: includes/admin/class-admin.php:5726
     1318#: includes/admin/class-admin.php:5700
    13211319msgid "Real estate"
    13221320msgstr ""
    13231321
    1324 #: includes/admin/class-admin.php:5737
     1322#: includes/admin/class-admin.php:5711
    13251323msgid "Custom"
    13261324msgstr ""
    13271325
    1328 #: includes/admin/class-admin.php:5766
     1326#: includes/admin/class-admin.php:5740
    13291327msgid "Your Google tag ID. This field is read-only but you can click to select and copy the text."
    13301328msgstr ""
    13311329
    1332 #: includes/admin/class-admin.php:5788
    1333 #: includes/admin/class-admin.php:5976
     1330#: includes/admin/class-admin.php:5762
     1331#: includes/admin/class-admin.php:5950
    13341332msgid "inactive"
    13351333msgstr ""
    13361334
    1337 #: includes/admin/class-admin.php:5791
    1338 #: includes/admin/class-admin.php:5970
     1335#: includes/admin/class-admin.php:5765
     1336#: includes/admin/class-admin.php:5944
    13391337msgid "active"
    13401338msgstr ""
    13411339
    1342 #: includes/admin/class-admin.php:5794
    1343 #: includes/admin/class-admin.php:5982
     1340#: includes/admin/class-admin.php:5768
     1341#: includes/admin/class-admin.php:5956
    13441342msgid "partially active"
    13451343msgstr ""
    13461344
    1347 #: includes/admin/class-admin.php:5799
     1345#: includes/admin/class-admin.php:5773
     1346#: includes/admin/class-admin.php:5974
     1347msgid "health check passed"
     1348msgstr ""
     1349
     1350#: includes/admin/class-admin.php:5776
     1351#: includes/admin/class-admin.php:5980
     1352msgid "health check failed"
     1353msgstr ""
     1354
     1355#: includes/admin/class-admin.php:5782
     1356msgid "Your Google Gateway Measurement Path. It should look like this:"
     1357msgstr ""
     1358
     1359#: includes/admin/class-admin.php:5866
     1360msgid "ID of your Google Merchant Center account. It looks like this: 12345678"
     1361msgstr ""
     1362
     1363#: includes/admin/class-admin.php:5878
     1364msgid "post ID (default)"
     1365msgstr ""
     1366
     1367#: includes/admin/class-admin.php:5887
     1368msgid "SKU"
     1369msgstr ""
     1370
     1371#: includes/admin/class-admin.php:5897
     1372msgid "ID for the WooCommerce Google Product Feed. Outputs the post ID with woocommerce_gpf_ prefix *"
     1373msgstr ""
     1374
     1375#: includes/admin/class-admin.php:5907
     1376msgid "ID for the WooCommerce Google Listings & Ads Plugin. Outputs the post ID with gla_ prefix **"
     1377msgstr ""
     1378
     1379#: includes/admin/class-admin.php:5911
     1380msgid "Choose a product identifier."
     1381msgstr ""
     1382
     1383#: includes/admin/class-admin.php:5914
     1384msgid "* This is for users of the WooCommerce Google Product Feed Plugin"
     1385msgstr ""
     1386
     1387#: includes/admin/class-admin.php:5918
     1388msgid "** This is for users of the WooCommerce Google Listings & Ads Plugin"
     1389msgstr ""
     1390
     1391#: includes/admin/class-admin.php:5931
     1392msgid "experiment"
     1393msgstr ""
     1394
     1395#: includes/admin/class-admin.php:5962
     1396msgid "override"
     1397msgstr ""
     1398
     1399#: includes/admin/class-admin.php:5968
     1400#: includes/admin/class-admin.php:5985
     1401msgid "deprecated"
     1402msgstr ""
     1403
     1404#: includes/admin/class-admin.php:5997
     1405msgid "Get Pro"
     1406msgstr ""
     1407
    13481408#: includes/admin/class-admin.php:6000
    1349 msgid "health check passed"
    1350 msgstr ""
    1351 
    1352 #: includes/admin/class-admin.php:5802
    1353 #: includes/admin/class-admin.php:6006
    1354 msgid "health check failed"
    1355 msgstr ""
    1356 
    1357 #: includes/admin/class-admin.php:5808
    1358 msgid "Your Google Gateway Measurement Path. It should look like this:"
    1359 msgstr ""
    1360 
    1361 #: includes/admin/class-admin.php:5892
    1362 msgid "ID of your Google Merchant Center account. It looks like this: 12345678"
    1363 msgstr ""
    1364 
    1365 #: includes/admin/class-admin.php:5904
    1366 msgid "post ID (default)"
    1367 msgstr ""
    1368 
    1369 #: includes/admin/class-admin.php:5913
    1370 msgid "SKU"
    1371 msgstr ""
    1372 
    1373 #: includes/admin/class-admin.php:5923
    1374 msgid "ID for the WooCommerce Google Product Feed. Outputs the post ID with woocommerce_gpf_ prefix *"
    1375 msgstr ""
    1376 
    1377 #: includes/admin/class-admin.php:5933
    1378 msgid "ID for the WooCommerce Google Listings & Ads Plugin. Outputs the post ID with gla_ prefix **"
    1379 msgstr ""
    1380 
    1381 #: includes/admin/class-admin.php:5937
    1382 msgid "Choose a product identifier."
    1383 msgstr ""
    1384 
    1385 #: includes/admin/class-admin.php:5940
    1386 msgid "* This is for users of the WooCommerce Google Product Feed Plugin"
    1387 msgstr ""
    1388 
    1389 #: includes/admin/class-admin.php:5944
    1390 msgid "** This is for users of the WooCommerce Google Listings & Ads Plugin"
    1391 msgstr ""
    1392 
    1393 #: includes/admin/class-admin.php:5957
    1394 msgid "experiment"
    1395 msgstr ""
    1396 
    1397 #: includes/admin/class-admin.php:5988
    1398 msgid "override"
    1399 msgstr ""
    1400 
    1401 #: includes/admin/class-admin.php:5994
    1402 #: includes/admin/class-admin.php:6011
    1403 msgid "deprecated"
    1404 msgstr ""
    1405 
    1406 #: includes/admin/class-admin.php:6023
    1407 msgid "Get Pro"
    1408 msgstr ""
    1409 
    1410 #: includes/admin/class-admin.php:6026
    14111409msgid "Start a free trial"
    14121410msgstr ""
    14131411
    1414 #: includes/admin/class-admin.php:6031
     1412#: includes/admin/class-admin.php:6005
    14151413msgid "Pro Feature"
    14161414msgstr ""
    14171415
    1418 #: includes/admin/class-admin.php:6131
     1416#: includes/admin/class-admin.php:6105
    14191417msgid "Copied"
    14201418msgstr ""
     
    15121510msgstr ""
    15131511
     1512#: includes/admin/class-validations.php:217
     1513msgid "You have entered an invalid phone number for Google Ads phone conversion tracking."
     1514msgstr ""
     1515
    15141516#. Translators: %s is the placeholder for the Google tag gateway measurement path.
    1515 #: includes/admin/class-validations.php:227
     1517#: includes/admin/class-validations.php:242
    15161518#, php-format
    15171519msgid "You have entered an invalid Google tag gateway measurement path. It should look like %s"
    15181520msgstr ""
    15191521
    1520 #: includes/admin/class-validations.php:245
     1522#: includes/admin/class-validations.php:260
    15211523msgid "You have entered an invalid merchant ID. It only contains 6 to 12 digits."
    15221524msgstr ""
    15231525
    1524 #: includes/admin/class-validations.php:260
     1526#: includes/admin/class-validations.php:275
    15251527msgid "You have entered an invalid Meta (Facebook) pixel ID. It only contains 12 to 22 digits."
    15261528msgstr ""
    15271529
    1528 #: includes/admin/class-validations.php:275
     1530#: includes/admin/class-validations.php:290
    15291531msgid "You have entered an invalid Meta (Facebook) CAPI token."
    15301532msgstr ""
    15311533
    1532 #: includes/admin/class-validations.php:290
     1534#: includes/admin/class-validations.php:305
    15331535msgid "You have entered an invalid Meta (Facebook) CAPI test_event_code."
    15341536msgstr ""
    15351537
    1536 #: includes/admin/class-validations.php:311
     1538#: includes/admin/class-validations.php:326
    15371539msgid "You have entered an invalid Meta (Facebook) domain verification ID."
    15381540msgstr ""
    15391541
    1540 #: includes/admin/class-validations.php:327
     1542#: includes/admin/class-validations.php:342
    15411543msgid "You have entered an invalid Bing Ads UET tag ID. It only contains 7 to 9 digits."
    15421544msgstr ""
    15431545
    1544 #: includes/admin/class-validations.php:342
     1546#: includes/admin/class-validations.php:357
    15451547msgid "You have entered an invalid LinkedIn partner ID."
    15461548msgstr ""
    15471549
    1548 #: includes/admin/class-validations.php:362
     1550#: includes/admin/class-validations.php:380
    15491551msgid "You have entered an invalid Outbrain advertiser ID."
    15501552msgstr ""
    15511553
    1552 #: includes/admin/class-validations.php:377
     1554#: includes/admin/class-validations.php:395
    15531555msgid "You have entered an invalid Pinterest ad account ID."
    15541556msgstr ""
    15551557
    1556 #: includes/admin/class-validations.php:392
     1558#: includes/admin/class-validations.php:410
    15571559msgid "You have entered an invalid Pinterest API token."
    15581560msgstr ""
    15591561
    1560 #: includes/admin/class-validations.php:407
     1562#: includes/admin/class-validations.php:425
    15611563msgid "You have entered an invalid Twitter pixel ID. It only contains 5 to 7 lowercase letters and numbers."
    15621564msgstr ""
    15631565
    1564 #: includes/admin/class-validations.php:431
     1566#: includes/admin/class-validations.php:449
    15651567msgid "You have entered an invalid Pinterest pixel ID. It only contains 13 digits."
    15661568msgstr ""
    15671569
    1568 #: includes/admin/class-validations.php:446
     1570#: includes/admin/class-validations.php:464
    15691571msgid "You have entered an invalid Snapchat pixel ID."
    15701572msgstr ""
    15711573
    1572 #: includes/admin/class-validations.php:461
     1574#: includes/admin/class-validations.php:479
    15731575msgid "You have entered an invalid Snapchat CAPI token."
    15741576msgstr ""
    15751577
    1576 #: includes/admin/class-validations.php:476
     1578#: includes/admin/class-validations.php:494
    15771579msgid "You have entered an invalid Taboola account ID."
    15781580msgstr ""
    15791581
    1580 #: includes/admin/class-validations.php:491
     1582#: includes/admin/class-validations.php:509
    15811583msgid "You have entered an invalid TikTok pixel ID."
    15821584msgstr ""
    15831585
    1584 #: includes/admin/class-validations.php:506
     1586#: includes/admin/class-validations.php:524
    15851587msgid "You have entered an invalid TikTok Events API access token."
    15861588msgstr ""
    15871589
    1588 #: includes/admin/class-validations.php:521
     1590#: includes/admin/class-validations.php:539
    15891591msgid "You have entered an invalid TikTok EAPI test_event_code."
    15901592msgstr ""
    15911593
    1592 #: includes/admin/class-validations.php:536
     1594#: includes/admin/class-validations.php:554
    15931595msgid "You have entered an invalid Hotjar site ID. It only contains 6 to 9 digits."
    15941596msgstr ""
    15951597
    1596 #: includes/admin/class-validations.php:551
     1598#: includes/admin/class-validations.php:569
    15971599msgid "You have entered an invalid Reddit pixel ID."
    15981600msgstr ""
    15991601
    1600 #: includes/admin/class-validations.php:566
     1602#: includes/admin/class-validations.php:584
     1603msgid "You have entered an invalid Reddit CAPI token."
     1604msgstr ""
     1605
     1606#: includes/admin/class-validations.php:599
     1607msgid "You have entered an invalid Reddit CAPI test event code."
     1608msgstr ""
     1609
     1610#: includes/admin/class-validations.php:614
    16011611msgid "You have entered an invalid VWO account ID."
    16021612msgstr ""
    16031613
    1604 #: includes/admin/class-validations.php:581
     1614#: includes/admin/class-validations.php:629
    16051615msgid "You have entered an invalid Optimizely project ID."
    16061616msgstr ""
    16071617
    1608 #: includes/admin/class-validations.php:596
     1618#: includes/admin/class-validations.php:644
    16091619msgid "You have entered an invalid AB Tasty account ID."
    16101620msgstr ""
    16111621
    1612 #: includes/admin/class-validations.php:627
     1622#: includes/admin/class-validations.php:675
    16131623msgid "You have entered the Scroll Tracker thresholds in the wrong format. It must be a list of comma separated percentages, like this \"25,50,75,100\""
    16141624msgstr ""
    16151625
    1616 #: includes/admin/class-validations.php:651
     1626#: includes/admin/class-validations.php:699
    16171627msgid "You have entered an invalid subscription value multiplier. It must be a number and at least 1.00"
    16181628msgstr ""
    16191629
    1620 #: includes/admin/class-validations.php:673
     1630#: includes/admin/class-validations.php:721
    16211631msgid "You have entered an invalid conversion adjustments conversion name. Special characters, quotes and single quotes are not allowed due to security reasons."
    16221632msgstr ""
    16231633
    1624 #: includes/admin/class-validations.php:716
     1634#: includes/admin/class-validations.php:764
    16251635msgid "You have entered an invalid Twitter event ID."
    16261636msgstr ""
    16271637
    1628 #: includes/admin/class-validations.php:742
     1638#: includes/admin/class-validations.php:790
    16291639msgid "You have entered an invalid LinkedIn conversion ID."
    16301640msgstr ""
     
    17461756#: includes/admin/opportunities/pro/class-google-enhanced-conversions-opportunity.php:51
    17471757#: includes/admin/opportunities/pro/class-meta-capi-opportunity.php:51
     1758#: includes/admin/opportunities/pro/class-reddit-capi-opportunity.php:51
    17481759#: includes/admin/opportunities/pro/class-subscription-multiplier-opportunity.php:56
    17491760msgid "high"
     
    17981809msgstr ""
    17991810
     1811#: includes/admin/opportunities/pro/class-reddit-capi-opportunity.php:37
     1812msgid "Reddit Conversions API"
     1813msgstr ""
     1814
     1815#: includes/admin/opportunities/pro/class-reddit-capi-opportunity.php:42
     1816msgid "The Pixel Manager detected that the Reddit Pixel is enabled, but Reddit Conversions API has yet to be enabled."
     1817msgstr ""
     1818
     1819#: includes/admin/opportunities/pro/class-reddit-capi-opportunity.php:46
     1820msgid "Enabling Reddit Conversions API will improve conversion tracking accuracy and help you track more conversions that otherwise might get lost due to ad blockers or browser restrictions."
     1821msgstr ""
     1822
    18001823#: includes/admin/opportunities/pro/class-snapchat-advanced-matching-opportunity.php:42
    18011824msgid "The Pixel Manager detected that the Snapchat pixel is active on your site, but Advanced Matching is not enabled."
     
    18181841msgstr ""
    18191842
    1820 #: includes/pixels/class-pixel-manager.php:520
     1843#: includes/pixels/class-pixel-manager.php:597
    18211844msgid "You can not view private data."
    18221845msgstr ""
    18231846
    1824 #: includes/pixels/class-pixel-manager.php:600
     1847#: includes/pixels/class-pixel-manager.php:694
    18251848msgid "Try going through the setup process again."
    18261849msgstr ""
  • woocommerce-google-adwords-conversion-tracking-tag/trunk/readme.txt

    r3403843 r3406541  
    33Tags: woocommerce, google analytics, google ads, facebook pixel, conversion tracking
    44Requires at least: 3.7
    5 Tested up to: 6.8
     5Tested up to: 6.9
    66Requires PHP: 7.3
    7 Stable tag: 1.51.1
     7Stable tag: 1.52.0
    88License: GPLv3 or later
    99License URI: http://www.gnu.org/licenses/gpl-3.0.html
     
    302302== Changelog ==
    303303
     304= 1.52.0  =
     305*Release date - 01.12.2025*
     306
     307* Tweak: Bumped up WP version compatibility to 6.9
     308* Tweak: Filter out non-existent or unpublished products from transient data
     309* Tweak: Refactored pixel file structure to unify server-side and browser-side handling, implementing a centralized pixel registry for improved management and automatic detection of active pixels.
     310* Tweak: Added validations for some input data.
     311
    304312= 1.51.1  =
    305313*Release date - 27.11.2025*
  • woocommerce-google-adwords-conversion-tracking-tag/trunk/vendor/composer/installed.php

    r3403843 r3406541  
    44        'pretty_version' => 'dev-master',
    55        'version' => 'dev-master',
    6         'reference' => 'a1facada8c902f15b6ea8c4824567e3790f00693',
     6        'reference' => 'dcabb56a5fc44cd22c4e6537cb80d163e3861f47',
    77        'type' => 'wordpress-plugin',
    88        'install_path' => __DIR__ . '/../../',
     
    5656            'pretty_version' => 'dev-master',
    5757            'version' => 'dev-master',
    58             'reference' => 'a1facada8c902f15b6ea8c4824567e3790f00693',
     58            'reference' => 'dcabb56a5fc44cd22c4e6537cb80d163e3861f47',
    5959            'type' => 'wordpress-plugin',
    6060            'install_path' => __DIR__ . '/../../',
  • woocommerce-google-adwords-conversion-tracking-tag/trunk/wgact.php

    r3403843 r3406541  
    1010 * Text Domain:          woocommerce-google-adwords-conversion-tracking-tag
    1111 * Domain path:          /languages
    12  * Version:              1.51.1
     12 * Version:              1.52.0
    1313 *
    1414 * WC requires at least: 3.7
     
    2222defined('ABSPATH') || exit; // Exit if accessed directly
    2323
    24 $pmw_version     = '1.51.1';
     24$pmw_version     = '1.52.0';
    2525$plugin_basename = plugin_basename(__FILE__);
    2626
Note: See TracChangeset for help on using the changeset viewer.