Changeset 3406541
- Timestamp:
- 12/01/2025 08:03:10 AM (4 months ago)
- Location:
- woocommerce-google-adwords-conversion-tracking-tag
- Files:
-
- 29 added
- 44 deleted
- 16 edited
-
tags/1.13.0 (deleted)
-
tags/1.14.0 (deleted)
-
tags/1.14.1 (deleted)
-
tags/1.14.2 (deleted)
-
tags/1.15.1 (deleted)
-
tags/1.15.2 (deleted)
-
tags/1.15.3 (deleted)
-
tags/1.15.4 (deleted)
-
tags/1.16.0 (deleted)
-
tags/1.16.1 (deleted)
-
tags/1.16.10 (deleted)
-
tags/1.16.11 (deleted)
-
tags/1.16.12 (deleted)
-
tags/1.16.13 (deleted)
-
tags/1.16.2 (deleted)
-
tags/1.16.3 (deleted)
-
tags/1.16.4 (deleted)
-
tags/1.16.5 (deleted)
-
tags/1.16.6 (deleted)
-
tags/1.16.7 (deleted)
-
tags/1.16.8 (deleted)
-
tags/1.16.9 (deleted)
-
tags/1.17.0 (deleted)
-
tags/1.17.1 (deleted)
-
tags/1.17.10 (deleted)
-
tags/1.17.2 (deleted)
-
tags/1.17.3 (deleted)
-
tags/1.17.4 (deleted)
-
tags/1.17.7 (deleted)
-
tags/1.17.8 (deleted)
-
tags/1.17.9 (deleted)
-
tags/1.18.0 (deleted)
-
tags/1.19.0 (deleted)
-
tags/1.19.1 (deleted)
-
tags/1.19.2 (deleted)
-
tags/1.19.3 (deleted)
-
trunk/includes/admin/class-admin.php (modified) (19 diffs)
-
trunk/includes/admin/class-documentation.php (modified) (3 diffs)
-
trunk/includes/admin/class-validations.php (modified) (7 diffs)
-
trunk/includes/class-database.php (modified) (1 diff)
-
trunk/includes/class-options.php (modified) (10 diffs)
-
trunk/includes/class-server-event-processor.php (modified) (1 diff)
-
trunk/includes/class-shop.php (modified) (1 diff)
-
trunk/includes/pixels/abstract-pixel-adapter.php (deleted)
-
trunk/includes/pixels/abtasty (added)
-
trunk/includes/pixels/adapters (deleted)
-
trunk/includes/pixels/class-pixel-adapter-registry.php (deleted)
-
trunk/includes/pixels/class-pixel-manager.php (modified) (3 diffs)
-
trunk/includes/pixels/core (added)
-
trunk/includes/pixels/core/abstract-pixel-adapter.php (added)
-
trunk/includes/pixels/core/abstract-pixel-descriptor.php (added)
-
trunk/includes/pixels/core/class-pixel-adapter-registry.php (added)
-
trunk/includes/pixels/core/class-pixel-registry.php (added)
-
trunk/includes/pixels/core/interface-pixel-adapter.php (added)
-
trunk/includes/pixels/core/interface-pixel-descriptor.php (added)
-
trunk/includes/pixels/descriptors (added)
-
trunk/includes/pixels/descriptors/class-ab-tasty-descriptor.php (added)
-
trunk/includes/pixels/descriptors/class-adroll-descriptor.php (added)
-
trunk/includes/pixels/descriptors/class-bing-descriptor.php (added)
-
trunk/includes/pixels/descriptors/class-hotjar-descriptor.php (added)
-
trunk/includes/pixels/descriptors/class-linkedin-descriptor.php (added)
-
trunk/includes/pixels/descriptors/class-optimizely-descriptor.php (added)
-
trunk/includes/pixels/descriptors/class-outbrain-descriptor.php (added)
-
trunk/includes/pixels/descriptors/class-taboola-descriptor.php (added)
-
trunk/includes/pixels/descriptors/class-twitter-descriptor.php (added)
-
trunk/includes/pixels/descriptors/class-vwo-descriptor.php (added)
-
trunk/includes/pixels/descriptors/google (added)
-
trunk/includes/pixels/descriptors/google/class-ga4-descriptor.php (added)
-
trunk/includes/pixels/descriptors/google/class-google-ads-descriptor.php (added)
-
trunk/includes/pixels/interface-pixel-adapter.php (deleted)
-
trunk/includes/pixels/optimizely (added)
-
trunk/includes/pixels/reddit (added)
-
trunk/includes/pixels/vwo (added)
-
trunk/js/public/free/pixel-google.62e8b182.chunk.min.js (deleted)
-
trunk/js/public/free/pixel-google.62e8b182.chunk.min.js.br (deleted)
-
trunk/js/public/free/pixel-google.62e8b182.chunk.min.js.gz (deleted)
-
trunk/js/public/free/pixel-google.62e8b182.chunk.min.js.map (deleted)
-
trunk/js/public/free/pixel-google.91d8c5a4.chunk.min.js (added)
-
trunk/js/public/free/pixel-google.91d8c5a4.chunk.min.js.br (added)
-
trunk/js/public/free/pixel-google.91d8c5a4.chunk.min.js.gz (added)
-
trunk/js/public/free/pixel-google.91d8c5a4.chunk.min.js.map (added)
-
trunk/js/public/free/wpm-public.p1.min.js (modified) (1 diff)
-
trunk/js/public/free/wpm-public.p1.min.js.br (modified) (previous)
-
trunk/js/public/free/wpm-public.p1.min.js.gz (modified) (previous)
-
trunk/js/public/free/wpm-public.p1.min.js.map (modified) (1 diff)
-
trunk/languages/woocommerce-google-adwords-conversion-tracking-tag.pot (modified) (10 diffs)
-
trunk/readme.txt (modified) (2 diffs)
-
trunk/vendor/composer/installed.php (modified) (2 diffs)
-
trunk/wgact.php (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/admin/class-admin.php
r3390923 r3406541 146 146 */ 147 147 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\t items: [\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}"; 149 149 } 150 150 … … 935 935 $section_ids['settings_name'] 936 936 ); 937 // add field for the Facebook CAPI user transparency process anonymous hits938 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 );945 937 // add field for the Facebook CAPI user transparency send additional client identifiers 946 938 add_settings_field( … … 970 962 add_settings_field( 971 963 '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' ), 973 965 [__CLASS__, 'setting_html_pinterest_ad_account_id'], 974 966 'wpm_plugin_options_page', … … 978 970 add_settings_field( 979 971 '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' ), 981 973 [__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 hits986 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'],990 974 'wpm_plugin_options_page', 991 975 $section_ids['settings_name'] … … 1002 986 add_settings_field( 1003 987 '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' ), 1005 989 [__CLASS__, 'setting_pinterest_advanced_matching'], 1006 990 'wpm_plugin_options_page', … … 1018 1002 add_settings_field( 1019 1003 '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' ), 1021 1005 [__CLASS__, 'option_html_snapchat_capi_token'], 1022 1006 'wpm_plugin_options_page', … … 1039 1023 ]; 1040 1024 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 ); 1041 1041 // Add the field for the Reddit advanced matching 1042 1042 add_settings_field( … … 1068 1068 esc_html__( 'TikTok EAPI: test event code', 'woocommerce-google-adwords-conversion-tracking-tag' ), 1069 1069 [__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 hits1074 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'],1078 1070 'wpm_plugin_options_page', 1079 1071 $section_ids['settings_name'] … … 1180 1172 add_settings_field( 1181 1173 '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' ), 1183 1175 [__CLASS__, 'setting_twitter_add_to_cart'], 1184 1176 'wpm_plugin_options_page', … … 1188 1180 add_settings_field( 1189 1181 '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' ), 1191 1183 [__CLASS__, 'setting_twitter_add_to_wishlist'], 1192 1184 'wpm_plugin_options_page', … … 1196 1188 add_settings_field( 1197 1189 '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' ), 1199 1191 [__CLASS__, 'setting_twitter_view_content'], 1200 1192 'wpm_plugin_options_page', … … 1204 1196 add_settings_field( 1205 1197 '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' ), 1207 1199 [__CLASS__, 'setting_twitter_search'], 1208 1200 'wpm_plugin_options_page', … … 1212 1204 add_settings_field( 1213 1205 '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' ), 1215 1207 [__CLASS__, 'setting_twitter_initiate_checkout'], 1216 1208 'wpm_plugin_options_page', … … 1220 1212 add_settings_field( 1221 1213 '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' ), 1223 1215 [__CLASS__, 'setting_twitter_add_payment_info'], 1224 1216 'wpm_plugin_options_page', … … 1228 1220 add_settings_field( 1229 1221 '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' ), 1231 1223 [__CLASS__, 'setting_twitter_purchase'], 1232 1224 'wpm_plugin_options_page', … … 3655 3647 } 3656 3648 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 3657 3723 public static function html_marketing_value_logic() { 3658 3724 ?> … … 4592 4658 } 4593 4659 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 entirely4597 // https://stackoverflow.com/a/1992745/46886124598 ?>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 <?php4607 checked( Options::is_facebook_capi_user_transparency_process_anonymous_hits_active() );4608 ?>4609 <?php4610 echo esc_html( self::disable_if_demo() );4611 ?>4612 />4613 <?php4614 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 <?php4618 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 4628 4660 public static function setting_facebook_advanced_matching() { 4629 4661 // adding the hidden input is a hack to make WordPress save the option with the value zero, … … 4742 4774 } 4743 4775 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 entirely4747 // https://stackoverflow.com/a/1992745/46886124748 ?>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 <?php4756 checked( Options::is_pinterest_apic_process_anonymous_hits_active() );4757 ?>4758 <?php4759 echo esc_html( self::disable_if_demo() );4760 ?>4761 />4762 <?php4763 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 <?php4767 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 4777 4776 public static function setting_pinterest_advanced_matching() { 4778 4777 // adding the hidden input is a hack to make WordPress save the option with the value zero, … … 4882 4881 </div> 4883 4882 <?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 entirely4889 // https://stackoverflow.com/a/1992745/46886124890 ?>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 <?php4898 checked( Options::is_tiktok_eapi_process_anonymous_hits_active() );4899 ?>4900 <?php4901 echo esc_html( self::disable_if_demo() );4902 ?>4903 />4904 <?php4905 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 <?php4909 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 }4917 4883 } 4918 4884 -
woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/admin/class-documentation.php
r3402314 r3406541 119 119 'wcm' => '/document/pixel-manager-pro-for-woocommerce/pmw-plugin-configuration/tiktok/#access-token', 120 120 ], 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 ],125 121 'vwo_account_id' => [ 126 122 'default' => '/docs/wpm/plugin-configuration/vwo', … … 171 167 'wcm' => '/document/pixel-manager-pro-for-woocommerce/pmw-plugin-configuration/facebook/#section-4', 172 168 ], 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 ],177 169 'facebook_advanced_matching' => [ 178 170 'default' => '/docs/wpm/plugin-configuration/meta#meta-facebook-advanced-matching', … … 314 306 'default' => '/docs/wpm/plugin-configuration/pinterest#api-for-conversions-token', 315 307 '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',320 308 ], 321 309 'pinterest_enhanced_match' => [ -
woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/admin/class-validations.php
r3308972 r3406541 204 204 } 205 205 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 206 221 // validate ['google]['tag_gateway']['measurement_path'] 207 222 if (isset($input['google']['tag_gateway']['measurement_path'])) { … … 344 359 } 345 360 346 // Validate LinkedIn conversion IDs add_to_cart361 // Validate LinkedIn conversion IDs 347 362 $input = self::validate_linkedin_conversion_id($input, 'add_to_cart'); 348 363 $input = self::validate_linkedin_conversion_id($input, 'start_checkout'); 349 364 $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'); 350 368 351 369 // validate Outbrain advertiser ID … … 409 427 } 410 428 411 // Validate Twitter event add_to_cart429 // Validate Twitter event IDs 412 430 $input = self::validate_twitter_event($input, 'add_to_cart'); 413 431 $input = self::validate_twitter_event($input, 'add_to_wishlist'); … … 415 433 $input = self::validate_twitter_event($input, 'search'); 416 434 $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'); 418 436 $input = self::validate_twitter_event($input, 'purchase'); 419 437 … … 550 568 : ''; 551 569 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')); 552 600 } 553 601 } … … 945 993 } 946 994 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 947 1011 public static function is_vwo_account_id( $string ) { 948 1012 … … 1019 1083 1020 1084 $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'; 1021 1096 1022 1097 return self::validate_with_regex($re, $string); -
woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/class-database.php
r3308972 r3406541 5 5 6 6 // 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']8 7 9 8 // TODO Strategy for saving backup versions: -
woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/class-options.php
r3313714 r3406541 104 104 'test_event_code' => '', 105 105 'user_transparency' => [ 106 'process_anonymous_hits' => false,107 106 'send_additional_client_identifiers' => false, 108 107 ], … … 164 163 'advanced_matching' => false, 165 164 'apic' => [ 166 'token' => '', 167 'process_anonymous_hits' => false, 165 'token' => '', 168 166 ], 169 167 ], … … 179 177 'advanced_matching' => false, 180 178 'eapi' => [ 181 'token' => '', 182 'test_event_code' => '', 183 'process_anonymous_hits' => false, 179 'token' => '', 180 'test_event_code' => '', 184 181 ], 185 182 ], … … 224 221 'advertiser_id' => '', 225 222 'advanced_matching' => false, 223 'capi' => [ 224 'token' => '', 225 'test_event_code' => '', 226 ], 226 227 ], 227 228 'taboola' => [ … … 383 384 } 384 385 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 389 386 public static function is_facebook_capi_advanced_matching_enabled() { 390 387 return (bool) self::get_options_obj()->facebook->capi->user_transparency->send_additional_client_identifiers; … … 433 430 public static function is_tiktok_advanced_matching_enabled() { 434 431 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;439 432 } 440 433 … … 526 519 public static function is_pinterest_advanced_matching_active() { 527 520 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;532 521 } 533 522 … … 757 746 public static function is_reddit_advanced_matching_enabled() { 758 747 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(); 759 764 } 760 765 … … 947 952 } 948 953 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 */ 949 964 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 */ 955 978 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 */ 970 998 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; 976 1006 } 977 1007 … … 996 1026 if (self::is_snapchat_active()) { 997 1027 $pixels[] = 'snapchat'; 1028 } 1029 1030 if (self::is_reddit_active()) { 1031 $pixels[] = 'reddit'; 998 1032 } 999 1033 -
woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/class-server-event-processor.php
r3402314 r3406541 3 3 namespace SweetCode\Pixel_Manager; 4 4 5 use SweetCode\Pixel_Manager\Pixels\ Pixel_Adapter_Registry;5 use SweetCode\Pixel_Manager\Pixels\Core\Pixel_Adapter_Registry; 6 6 7 7 defined('ABSPATH') || exit; // Exit if accessed directly -
woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/class-shop.php
r3313714 r3406541 17 17 private static $transient_identifiers; 18 18 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 */ 19 38 public static function track_user( $user_id = null ) { 20 39 $user = null; -
woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/pixels/class-pixel-manager.php
r3403843 r3406541 7 7 use SweetCode\Pixel_Manager\Admin\Validations; 8 8 use SweetCode\Pixel_Manager\Data\GA4_Data_API; 9 use SweetCode\Pixel_Manager\Pixels\ABTasty\AB_Tasty; 10 use SweetCode\Pixel_Manager\Pixels\Core\Pixel_Registry; 9 11 use SweetCode\Pixel_Manager\Pixels\Facebook\Facebook_CAPI; 10 use SweetCode\Pixel_Manager\Pixels\Facebook\Facebook_Adapter;11 12 use SweetCode\Pixel_Manager\Pixels\Google\Google_MP_GA4; 12 13 use SweetCode\Pixel_Manager\Pixels\Google\Google_Helpers; 14 use SweetCode\Pixel_Manager\Pixels\Optimizely\Optimizely; 13 15 use SweetCode\Pixel_Manager\Pixels\TikTok\TikTok_EAPI; 14 use SweetCode\Pixel_Manager\Pixels\TikTok\TikTok_Adapter;15 16 use SweetCode\Pixel_Manager\Pixels\Pinterest\Pinterest_APIC; 16 use SweetCode\Pixel_Manager\Pixels\Pinterest\Pinterest_Adapter;17 17 use SweetCode\Pixel_Manager\Pixels\Snapchat\Snapchat_CAPI; 18 use SweetCode\Pixel_Manager\Pixels\Snapchat\Snapchat_Adapter; 18 use SweetCode\Pixel_Manager\Pixels\Reddit\Reddit_CAPI; 19 use SweetCode\Pixel_Manager\Pixels\VWO\VWO; 19 20 use SweetCode\Pixel_Manager\Geolocation; 20 21 use SweetCode\Pixel_Manager\Helpers; … … 89 90 } 90 91 } ); 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(); 91 137 add_action( 'wp_head', function () { 92 138 $this->inject_pmw_closing(); … … 372 418 if ( get_transient( 'pmw_products_for_datalayer_' . $data['page_id'] ) ) { 373 419 $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 } ); 374 433 // Merge the associative arrays with nested arrays $products and $products_in_transient preserving the keys 375 434 $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()})()})(); 2 2 //# 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":"+DACIA,EADAC,ECAAC,EACAC,E,0ECAG,MAAMC,EAAwB,KAEpC,MA6bMC,EAAWC,KAAKC,iBAAiBC,kBAAkBC,SAEzD,GAAiB,KAAbJ,IAAoBA,EACvB,OAAO,KAGR,IAAIK,EAAc,CACjBC,YApciB,CACjB,iBAAkC,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAC/F,eAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,uBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,sBAAkC,CAAC,KAAM,KAAM,MAC/C,cAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,eAAkC,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MACzF,oBAAkC,CAAC,MACnC,cAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,gBAAkC,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAC7E,gBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,iBAAkC,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MACzF,kBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,iCAAkC,CAAC,MACnC,8BAAkC,CAAC,MACnC,4BAAkC,CAAC,MACnC,0BAAkC,CAAC,MACnC,6BAAkC,CAAC,MACnC,4BAAkC,CAAC,MACnC,iCAAkC,CAAC,MACnC,0BAAkC,CAAC,MACnC,6BAAkC,CAAC,MACnC,6BAAkC,CAAC,MACnC,4BAAkC,CAAC,MACnC,4BAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,yBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,uBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,wBAAkC,CAAC,MACnC,uBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,wBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,uBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,uBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,sBAAkC,CAAC,MACnC,sBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,+BAAkC,CAAC,MACnC,uBAAkC,CAAC,MACnC,0BAAkC,CAAC,MACnC,6BAAkC,CAAC,MACnC,4BAAkC,CAAC,MACnC,wBAAkC,CAAC,MACnC,4BAAkC,CAAC,MACnC,0BAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,8BAAkC,CAAC,MACnC,8BAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,sBAAkC,CAAC,MACnC,wBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,sBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,8BAAkC,CAAC,MACnC,8BAAkC,CAAC,MACnC,iCAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,iBAAkC,CAAC,KAAM,KAAM,MAC/C,sBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,kBAAkC,CAAC,KAAM,MACzC,yBAAkC,CAAC,MACnC,wBAAkC,CAAC,MACnC,sBAAkC,CAAC,MACnC,sBAAkC,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MACrJ,uBAAkC,CAAC,MACnC,sBAAkC,CAAC,MACnC,uBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,wBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,uBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,wBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,wBAAkC,CAAC,MACnC,sBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,sBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,kBAAkC,CAAC,KAAM,MACzC,kBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,sBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,4BAAkC,CAAC,MACnC,uBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,wBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,sBAAkC,CAAC,MACnC,YAAkC,CAAC,MACnC,cAAkC,CAAC,MACnC,aAAkC,CAAC,MACnC,cAAkC,CAAC,MACnC,aAAkC,CAAC,MACnC,cAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,cAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,YAAkC,CAAC,MACnC,eAAkC,CAAC,KAAM,KAAM,KAAM,MACrD,eAAkC,CAAC,MACnC,cAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,cAAkC,CAAC,MACnC,aAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,aAAkC,CAAC,MACnC,YAAkC,CAAC,MACnC,aAAkC,CAAC,KAAM,MACzC,gBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,YAAkC,CAAC,MACnC,cAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,YAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,aAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,cAAkC,CAAC,MACnC,aAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,cAAkC,CAAC,MACnC,cAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,YAAkC,CAAC,MACnC,YAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,aAAkC,CAAC,KAAM,MACzC,gBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,cAAkC,CAAC,KAAM,KAAM,KAAM,MACrD,gBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,aAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,iBAAkC,CAAC,KAAM,MACzC,qBAAkC,CAAC,MACnC,cAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,cAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,aAAkC,CAAC,MACnC,aAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,cAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,cAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,sBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,yBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,wBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,sBAAkC,CAAC,MACnC,sBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,kBAAkC,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,MACjE,gBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,kBAAkC,CAAC,KAAM,MACzC,qBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,cAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,gBAAkC,CAAC,KAAM,KAAM,KAAM,MACrD,oBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,cAAkC,CAAC,KAAM,KAAM,MAC/C,eAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,gBAAkC,CAAC,KAAM,MACzC,cAAkC,CAAC,MACnC,cAAkC,CAAC,KAAM,KAAM,MAC/C,gBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,oBAAkC,CAAC,KAAM,MACzC,gBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,gBAAkC,CAAC,KAAM,KAAM,MAC/C,GAAkC,CAAC,MACnC,UAAkC,CAAC,MACnC,sBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,mBAAkC,CAAC,KAAM,MACzC,cAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,iBAAkC,CAAC,KAAM,MACzC,GAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,mBAAkC,CAAC,KAAM,MACzC,uBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,sBAAkC,CAAC,MACnC,eAAkC,CAAC,KAAM,MACzC,mBAAkC,CAAC,KAAM,MACzC,mBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,oBAAkC,CAAC,KAAM,MACzC,gBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,uBAAkC,CAAC,KAAM,MACzC,oBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,UAAkC,CAAC,MACnC,aAAkC,CAAC,MACnC,YAAkC,CAAC,MACnC,WAAkC,CAAC,OAUZN,GAAU,GAAGO,eAYrC,MARiB,wBAAbP,IACHK,EAAYG,WAAa,SAGT,kBAAbR,IACHK,EAAYG,WAAa,SAGnBH,E,mEC1cD,MAAMI,EAAM,CAACC,KAAYC,KAE1BC,MAEkB,iBAAZF,EACVG,QAAQJ,IAAI,kBAAmBC,KAAYC,GACjCA,EAAQG,OAClBD,QAAQJ,IAAI,kBAAoBC,KAAYC,GAE5CE,QAAQJ,IAAI,kBAAoBC,KAarBK,EAAQ,CAACL,KAAYC,KAKV,iBAAZD,EACVG,QAAQE,MAAM,kBAAmBL,KAAYC,GACnCA,EAAQG,OAClBD,QAAQE,MAAM,kBAAoBL,KAAYC,GAE9CE,QAAQE,MAAM,kBAAoBL,IAS9BE,EAAkB,KAEnBI,QAEAC,QAEAC,OAEKC,cAAcC,SAASC,QAAQC,YAQnCN,EAAe,KAEhBO,IAAIC,gBAAgB,iBACvBD,IAAIE,UAAU,iBAAiB,GAGzBF,IAAIC,gBAAgB,iBAQtBP,EAAuB,IACrBM,IAAIG,aAAa,iBAQnBR,EAAc,KAEfK,IAAIC,gBAAgB,gBACvBD,IAAIE,UAAU,iBAAiB,GAGzBF,IAAIC,gBAAgB,e,gBCxF5BG,EAAQ,KAMRC,OAAOL,IAAIM,kBAAoBC,UAC9B,MAAMC,QAAsB,6BAC5BH,OAAOL,IAAIS,QAAUD,EAErB,MAAME,QAAkB,6BAKxB,OAJAL,OAAOM,IAAMN,OAAOM,KAAO,CAAC,EAC5BN,OAAOM,IAAIF,QAAUJ,OAAOM,IAAIF,SAAW,CAAC,EAC5CJ,OAAOM,IAAIF,QAAQG,IAAMF,EAElBF,GAGRH,OAAOM,IAAMN,OAAOM,KAAO,CAC1BrB,QAASc,EAAQ,MAGlBA,EAAQ,I,WC5BR,MAAMS,EAA8BC,GAGnCA,GADAA,EAASA,EAAOC,QAAQ,aAAc,IAAIA,QAAQ,OAAQ,IAAIA,QAAQ,OAAQ,KAC9DC,OAUjBC,OAAO,6BAA6BC,GAAG,SAAU,mBAAqBC,IAEhEA,EAAMC,QAAQC,OACdF,EAAMC,QAAQE,IAEnBC,EAA4B,CAC3BC,KAAML,EAAMC,OAAOC,MACnBI,KAAMZ,EAA4BI,OAAO,cAAgBE,EAAMC,OAAOE,GAAK,MAAMG,YAKnFR,OAAO,KACN,GAAIA,OAAO,oBAAoB1B,OAAQ,CAGtC,IAAImC,EAAwBT,OAAO,oBAAoBU,KAAK,YAG5D,GAAID,EAAsBnC,OAAQ,CAEjC,IAAKmC,EAAsBE,MAAO,OAClC,IAAKF,EAAsBG,KAAK,MAAO,OAEvCN,EAA4B,CAC3BC,KAAME,EAAsBE,MAC5BH,KAAMZ,EAA4BI,OAAO,cAAgBS,EAAsBG,KAAK,MAAQ,MAAMJ,SAEpG,CACD,IAID,MAAMF,EAA8BO,IACnCb,OAAOc,UAAUC,QAAQ,wBAAyB,CAACF,kBAQpD,IAAIG,GAA4B,EAGhChB,OAAO,6BAA6BC,GAAG,SAAU,+BAAkCC,IAE7EA,EAAMC,OAAOC,OACbF,EAAMC,OAAOE,KAElBY,EAA2B,CAC1BV,KAAML,EAAMC,OAAOC,MACnBI,KAAMZ,EAA4BI,OAAO,cAAgBE,EAAMC,OAAOE,GAAK,MAAMG,UAGlFQ,GAA4B,KAI7BhB,OAAO,KAGN,GAAIgB,EAA2B,OAE/B,IAAIE,EAAuBlB,OAAO,wCAElC,GAAIkB,EAAqB5C,OAAQ,CAEhC,IAAK4C,EAAqBP,MAAO,OACjC,IAAKO,EAAqBN,KAAK,MAAO,OAEtCK,EAA2B,CAC1BV,KAAMW,EAAqBP,MAC3BH,KAAMZ,EAA4BI,OAAO,cAAgBkB,EAAqBN,KAAK,MAAQ,MAAMJ,SAEnG,IAID,MAAMS,EAA6BE,IAClCnB,OAAOc,UAAUC,QAAQ,uBAAwB,CAACI,iBAQnDnB,OAAOc,UAAUb,GAAG,QAAS,oCAAsCC,IAIlE,IAEC,IAAIkB,EAAY,IAAIC,IAAIrB,OAAOE,EAAMoB,eAAeV,KAAK,SACrDW,EAAYxC,IAAIyC,6BAA6BJ,GAEjDrC,IAAI0C,sBAAsBF,EAE3B,CAAE,MAAOG,GACRrD,QAAQE,MAAMmD,EACf,IAoBD,MAAMC,EAA0B5C,IAAI6C,iBAXR,CAE3B,mBACA,wBACA,mBACA,2BACA,8BACA,qBACA,0BAG2E,iBAG5E5B,OAAOc,UAAUb,GAAG,sBAAuB0B,EAAyB,KACnE3B,OAAOc,UAAUC,QAAQ,wBAG1Bf,OAAOc,UAAUb,GAAG,sBAAuB,KAC1CD,OAAOc,UAAUC,QAAQ,mBAS1Bf,OAAOc,UAAUb,GAAG,UAAYC,IAC/BF,OAAOc,UAAUb,GAAG,0BAA2B,MAE1C,IAAUlB,IAAI8C,uBACjB9C,IAAI+C,qBAAqB,GAG1B/C,IAAIgD,mBAAmB,EAAG/B,OAAO,wCAAwCW,OACzE5B,IAAI8C,uBAAwB,MAK9B7B,OAAOc,UAAUb,GAAG,UAAW,KAE9B,IACClB,IAAIiD,UACL,CAAE,MAAON,GACRrD,QAAQE,MAAMmD,EACf,IAID1B,OAAOc,UAAUb,GAAG,UAAW,KAE9BtB,aAAasD,SAAWtD,aAAasD,UAAY,CAAC,EAGlD,IAAIC,EAAanD,IAAIoD,6BAErBpD,IAAIqD,uBAAuBF,KAQ5BlC,OAAOc,UAAUb,GAAG,UAAW,KAG9B,IAAKa,SAASuB,SACb,OAID,GAAItD,IAAIG,aAAa,YACpB,OAGD,IACIoD,EADmB,IAAIjB,IAAIP,SAASuB,UACLE,SAE/BD,IAAqBlD,OAAOoD,SAASC,MACxC1D,IAAIE,UAAU,WAAYqD,KAkB5BtC,OAAOc,UAAUb,GAAG,UAAW,KAE9B,IAAIyC,EAAQ3D,IAAI4D,gBAAgB,SAC5BD,GAAO3D,IAAIE,UAAU,QAASyD,GAElC,IAAIE,EAAS7D,IAAI4D,gBAAgB,UAC7BC,GAAQ7D,IAAIE,UAAU,SAAU2D,GAEpC,IAAIC,EAAS9D,IAAI4D,gBAAgB,UAC7BE,GAAQ9D,IAAIE,UAAU,SAAU4D,GAGpC,IAAIC,EAAS/D,IAAI4D,gBAAgB,UAC7BG,IACHA,EAAS,QAAUC,KAAKC,MAAMC,KAAKC,MAAQ,KAAQ,IAAMJ,EACzD/D,IAAIE,UAAU,SAAU6D,IAGzB,IAAIK,EAASpE,IAAI4D,gBAAgB,UAC7BQ,GAAQpE,IAAIE,UAAU,SAAUkE,GAEpC,IAAIC,EAAOrE,IAAI4D,gBAAgB,SAC3BS,GAAMrE,IAAIE,UAAU,OAAQmE,GAEhC,IAAIC,EAAOtE,IAAI4D,gBAAgB,QAC3BU,GAAMtE,IAAIE,UAAU,OAAQoE,KAMjCrD,OAAOc,UAAUb,GAAG,UAAW,KAE9B,IACC,GAA2B,oBAAhBtB,eAAgCA,cAAc2E,WAAY,CAIpE,GAFAtD,OAAOc,UAAUC,QAAQ,mBAErBpC,cAAc4E,KACjB,GACC,YAAc5E,aAAa4E,KAAKC,WAChC,aAAe7E,aAAa4E,KAAKE,cACjC1E,IAAI2E,kCACH,CACD,IAAIC,EAAU5E,IAAI6E,+BAA+B7E,IAAI2E,mCACtD1D,OAAOc,UAAUC,QAAQ,gBAAiB4C,EAC3C,KAAW,qBAAuBhF,aAAa4E,KAAKC,UACnDxD,OAAOc,UAAUC,QAAQ,qBACf,WAAapC,aAAa4E,KAAKC,UACzCxD,OAAOc,UAAUC,QAAQ,cACf,SAAWpC,aAAa4E,KAAKC,UACvCxD,OAAOc,UAAUC,QAAQ,iBACf,wBAA0BpC,aAAa4E,KAAKC,UAClD7E,cAAckF,QAAU9E,IAAI+E,gBAAgBnF,aAAakF,MAAMxD,MAClEL,OAAOc,UAAUC,QAAQ,gBACzBhC,IAAIgF,sBAAsBpF,aAAakF,MAAMxD,GAAI1B,aAAakF,MAAMG,KACjC,mBAAxBjF,IAAIkF,iBAAgClF,IAAIkF,mBAGpDjE,OAAOc,UAAUC,QAAQ,4BAG1Bf,OAAOc,UAAUC,QAAQ,uBAClBpC,cAAcuF,MAAM7D,KAAOtB,IAAIoF,uBACrCnE,OAAOc,UAAUC,QAAQ,aACzBhC,IAAIqF,sBAGLzF,aAAa2E,YAAa,CAC3B,CAED,CAAE,MAAO5B,GACRrD,QAAQE,MAAMmD,EACf,IASG/C,cAAcC,SAASyF,eAC1BtF,IAAIuF,qCAcLtE,OAAOc,UAAUb,GAAG,UAAW,KAC9B,GAAKtB,cAAcC,SAASyF,cAE5B,IACC,MAAME,EAAiBvE,OAAO,oBAC9B,IAAKuE,EAAejG,OAAQ,OAE5B,MAAMkG,EAAiB,CAAC,EAUxB,IATuBD,EAAe7D,KAAK,UAAU+D,UAAUC,MAAMC,IACpE,MAAMvE,EAAQJ,OAAO2E,GAAQhE,MAC7B,QAAIP,IACHoE,EAAexE,OAAO2E,GAAQ/D,KAAK,SAAWR,GACvC,KAKS,OAElB,MAAMwE,EAAoBL,EAAeM,KAAK,sBAC9C,IAAKD,EAAmB,OAExB,MAAME,EAAoBF,EAAkBlE,KAAKqE,GAChDC,OAAOC,QAAQT,GAAgBE,MAAM,EAAEV,EAAK5D,KAC3C2E,EAAUG,WAAWlB,KAAS5D,IAI5B0E,GACH/F,IAAIoG,yBAAyBL,EAAkBM,aAEjD,CAAE,MAAO1D,GACRhC,IAAIrB,QAAQE,MAAMmD,EACnB,IAID1B,OAAOc,UAAUb,GAAG,UAAWX,WACoB,IAA9CP,IAAIG,aAAa,0BAAoCQ,IAAIrB,QAAQE,MAAM,mEAU5EyB,OAAOc,UAAUb,GAAG,gBAAkBC,IAErCR,IAAIrB,QAAQJ,IAAI,4BAA6B,CAACiC,UAM9C,IAAImF,EAAU,CACbnF,MAAO,YACPoF,OAAQ,CAAC,GAoBV,GAfI3G,cAAc2G,QAAQC,UAAUC,SACnCH,EAAQC,OAAOC,SAAW,CACzBE,WAAkB,WAClBC,SAAkB3G,IAAI4G,qBACtBC,UAAkB7G,IAAI8G,gBACtBC,iBAAkB1G,OAAOoD,SAASuD,MAG/BhH,IAAIG,aAAa,cACpBmG,EAAQC,OAAOC,SAASS,aAAejH,IAAIkH,YAAYlH,IAAIG,aAAa,eAMtEP,cAAc2G,QAAQY,QAAQV,OAAQ,CACzC,MAAMW,EAAgBpH,IAAIqH,uBAE1Bf,EAAQC,OAAOY,OAAS,IACpBC,EACHT,SAAU3G,IAAIsH,mBACdC,WAAY,CACXC,cAAe,aAEhBC,eAAgB,CACfC,cAAe1H,IAAIsH,oBAGtB,CAsDA,GAfI1H,cAAc2G,QAAQoB,UAAUlB,SACnCH,EAAQC,OAAOoB,SAAuB3H,IAAI4H,yBAC1CtB,EAAQC,OAAOoB,SAASjB,WAAc,aAOvCzF,OAAOc,UAAUC,QAAQ,oBAAqBsE,GAM1C1G,cAAcC,SAASgI,iBAAiBC,oBAAoB/H,UAAW,CAE1E,MAAMgI,EAAU/H,IAAIgI,eAAe1B,GAE/BL,OAAOgC,KAAKF,GAASxI,OAAS,GACjCS,IAAIkI,yBAAyBH,EAE/B,IAQD9G,OAAOc,UAAUb,GAAG,kBAAmBX,MAAOY,EAAOyD,KAEpDjE,IAAIrB,QAAQJ,IAAI,8BAA+B,CAACiC,QAAOyD,kBAGjD5E,IAAImI,aAAa,cAAe,CACrCvD,QAASA,MAQX3D,OAAOc,UAAUb,GAAG,uBAAwBX,MAAOY,EAAOyD,KAEzDjE,IAAIrB,QAAQJ,IAAI,mCAAoC,CAACiC,QAAOyD,kBAGtD5E,IAAImI,aAAa,mBAAoB,CAC1CvD,QAASA,MAQX3D,OAAOc,UAAUb,GAAG,kBAAmBX,MAAOY,EAAOyD,KAEpDjE,IAAIrB,QAAQJ,IAAI,8BAA+B,CAACiC,QAAOyD,kBAGjD5E,IAAImI,aAAa,cAAe,CACrCvD,QAASA,MAOX3D,OAAOc,UAAUb,GAAG,qBAAuBC,IAE1CR,IAAIrB,QAAQJ,IAAI,iCAAkC,CAACiC,UAKnDnB,IAAImI,aAAa,iBAAkB,CAAC,KAMrClH,OAAOc,UAAUb,GAAG,uBAAyBC,IAE5CR,IAAIrB,QAAQJ,IAAI,mCAAoC,CAACiC,UAKrDnB,IAAImI,aAAa,mBAAoB,CAAC,KAMvClH,OAAOc,UAAUb,GAAG,sBAAuB,CAACC,EAAOyD,KAElDjE,IAAIrB,QAAQJ,IAAI,kCAAmC,CAACiC,QAAOyD,YAM3D,IAAI0B,EAAU,CACbnF,MAAS,kBACTyD,QAASA,EACT2B,OAAQ,CAAC,GAIN3G,cAAc2G,QAAQC,UAAUC,SACnCH,EAAQC,OAAOC,SAAW,CACzBE,WAAkB,gBAClBC,SAAkB3G,IAAI4G,qBACtBC,UAAkB7G,IAAI8G,gBACtBC,iBAAkB1G,OAAOoD,SAASuD,KAClCoB,YAAkBpI,IAAIqI,6BAA6BzD,IAGhD5E,IAAIG,aAAa,cACpBmG,EAAQC,OAAOC,SAASS,aAAejH,IAAIkH,YAAYlH,IAAIG,aAAa,eAKtEP,cAAc2G,QAAQ+B,QAAQ7B,SACjCH,EAAQC,OAAO+B,OAAS,CACvBnH,MAAY,gBACZwF,SAAY3G,IAAIsH,mBAChBnC,KAAYnF,IAAIuI,yBAChBC,KAAYxI,IAAIyI,yBAChBC,WAAY,CACXrH,MAAcuD,EAAQ+D,MAAQ/D,EAAQgE,SACtCC,SAAcjE,EAAQiE,SACtBC,aAAc,UACdC,SAAc,CAAC,CACdC,WAAchJ,IAAIiJ,6BAA6BrE,EAAS,UACxDsE,aAActE,EAAQuE,KACtBP,SAAchE,EAAQgE,SACtBD,MAAc/D,EAAQ+D,WAStB/I,cAAc2G,QAAQoB,UAAUlB,SACnCH,EAAQC,OAAOoB,SAAuB3H,IAAI4H,yBAC1CtB,EAAQC,OAAOoB,SAASjB,WAAc,kBACtCJ,EAAQC,OAAOoB,SAASS,YAAcpI,IAAIoJ,gCAAgCxE,IAO3E3D,OAAOc,UAAUC,QAAQ,0BAA2BsE,GAMpDtG,IAAIkI,yBAAyB5B,KAM9BrF,OAAOc,UAAUb,GAAG,gBAAiB,CAACC,EAAOyD,EAAU,QAEtDjE,IAAIrB,QAAQJ,IAAI,4BAA6B,CAACiC,QAAOyD,YAKrD5E,IAAImI,aAAa,YAAa,CAC7BvD,QAASA,MAOX3D,OAAOc,UAAUb,GAAG,oBAAqB,CAACC,EAAOyD,EAAU,QAE1DjE,IAAIrB,QAAQJ,IAAI,gCAAiC,CAACiC,QAAOyD,YAMzD,IAAI0B,EAAU,CACbnF,MAAO,gBACPoF,OAAQ,CAAC,GAON3G,cAAc2G,QAAQ8C,WAAW5C,SAEpCH,EAAQC,OAAO8C,UAAYrJ,IAAIsJ,0BAE/BhD,EAAQC,OAAO8C,UAAU3C,WAAa,gBAOvCzF,OAAOc,UAAUC,QAAQ,wBAAyBsE,GAMlDtG,IAAIkI,yBAAyB5B,KAM9BrF,OAAOc,UAAUb,GAAG,aAAeC,IAElCR,IAAIrB,QAAQJ,IAAI,yBAA0B,CAACiC,UAK3CnB,IAAImI,aAAa,SAAU,CAAC,KAM7BlH,OAAOc,UAAUb,GAAG,kBAAoBC,IAEvCR,IAAIrB,QAAQJ,IAAI,8BAA+B,CAACiC,UAMhD,IAAImF,EAAU,CACbnF,MAAO,cACPoF,OAAQ,CAAC,GAIN3G,cAAc2G,QAAQ+B,QAAQ7B,SACjCH,EAAQC,OAAO+B,OAAS,CACvBnH,MAAY,eACZwF,SAAY3G,IAAIsH,mBAChBnC,KAAYnF,IAAIuI,yBAChBC,KAAYxI,IAAIyI,yBAChBC,WAAY1I,IAAIuJ,gCAQlBtI,OAAOc,UAAUC,QAAQ,sBAAuBsE,GAMhDtG,IAAIkI,yBAAyB5B,KAM9BrF,OAAOc,UAAUb,GAAG,eAAgBX,UAEnCI,IAAIrB,QAAQJ,IAAI,2BAA4B,CAACiC,gBAGvCnB,IAAImI,aAAa,WAAY,CAClCrD,MAAOlF,aAAakF,UAOtB7D,OAAOc,UAAUb,GAAG,YAAa,KAEhCP,IAAIrB,QAAQJ,IAAI,yBAMhB,IAAIoH,EAAU,CACbnF,MAAO,QACPoF,OAAQ,CAAC,GAMN3G,cAAc2G,QAAQoB,UAAUlB,SACnCH,EAAQC,OAAOoB,SAAsB3H,IAAI4H,yBACzCtB,EAAQC,OAAOoB,SAASjB,WAAa,SAOtCzF,OAAOc,UAAUC,QAAQ,gBAAiBsE,GAM1CtG,IAAIkI,yBAAyB5B,KAM9BrF,OAAOc,UAAUb,GAAG,YAAaX,UAG3BP,IAAIwJ,wBASTxJ,IAAIyJ,mCAGJzJ,IAAI0J,0CAGLzI,OAAOc,UAAUb,GAAG,kBAAmB,KACtClB,IAAI2J,mC,YCvxBJ,SAAU3J,GAKVA,EAAI4J,cAAgB,CAUnBC,eAAAA,GACC,MAAMC,EAAe,GAErB,IAAK9J,EAAI+J,kBACR,OAAOD,EAIR,IAAK,MAAOE,EAAWC,KAAiBhE,OAAOC,QAAQlG,EAAI+J,mBAC1D,GAAqC,mBAA1BE,EAAaC,SACvB,IACKD,EAAaC,YAChBJ,EAAaK,KAAKH,EAEpB,CAAE,MAAOrH,GACRhC,IAAIrB,QAAQE,MAAM,qBAAqBwK,eAAwBrH,EAChE,CAIF,OAAOmH,CACR,EAOAM,0BAAAA,GACC,MAAMC,EAAgB,GAChBP,EAAgBQ,KAAKT,kBAE3B,IAAK,MAAMG,KAAaF,GAEiC,IAApD9J,EAAI+J,oBAAoBC,IAAYO,aACvCF,EAAcF,KAAKH,GAIrB,OAAOK,CACR,EAWAG,kBAAAA,GACC,MAAMC,EAAe,GACfX,EAAeQ,KAAKT,kBAG1B,IAAK,MAAMG,KAAaF,GAEiC,IAApD9J,EAAI+J,oBAAoBC,IAAYO,aACvCE,EAAUN,KAAKH,GAIjB,OAAOS,CACR,EAQAC,WAAWV,GACLhK,EAAI2K,UAIF3K,EAAI2K,SAASX,IAHZ,KAOV,CAhGA,CAgGC3J,OAAOL,IAAMK,OAAOL,KAAO,CAAC,EAAGiB,O,iBCzGhC,SAAUjB,GAEVA,EAAI4K,aAAerK,SAAY,IAAIsK,QAAQC,KAE1C,SAAUC,IACT,GAAsB,oBAAX9J,OAAwB,OAAO6J,IAC1CE,WAAWD,EAAe,IAC1B,CAHD,KAMD/K,EAAIiL,eAAiB,CAACC,EAASC,EAAU,IAAMC,EAAW,OAEzD,MAAMC,EAAYnH,KAAKC,MACvB,UAAkC,IAApB9D,OAAO6K,MAEhBhH,KAAKC,MAAQkH,EAAYF,IAI7BH,WAAW,OACRI,IAILpL,EAAIsL,wBAA0B/K,UAQ7B,IAAIgL,EAAW,IAAIV,QAASC,KAC3B,SAAUU,IACT,GACyB,oBAAjB5L,mBAC4B,IAAzBA,aAAa6L,QAEvB,OAAOX,IAERE,WAAWQ,EAAY,IACvB,CARD,KAYGE,EAAeV,WAAW,KAC7B1L,QAAQE,MAAM,yOAEZ,KAMH,OAJA+L,EAASI,KAAK,KACbC,aAAaF,KAGPH,GAGRvL,EAAI6L,cAAgBtL,SAAY,IAAIsK,QAAQC,KAC3C,SAAUU,IAGT,GAAkB,oBAAPM,SAA0C,IAAbA,GAAGC,MAAuB,OAAOjB,IACzEE,WAAWQ,EAAY,GACvB,CALD,KAeDxL,EAAIgM,qBAAuBzL,gBAEpBP,EAAI6L,sBACJ,kCAGP,CA/EA,CA+ECxL,OAAOL,IAAMK,OAAOL,KAAO,CAAC,EAAGiB,O,YCtEhC,SAAUjB,GAGVK,OAAOM,IAAMN,OAAOM,KAAO,CAAC,EAK5BA,IAAIoL,MAAQ,CACXE,QAAS,CAAC,EAgBVC,UAAW,SAAUC,EAAUC,EAAWC,EAAUC,EAAW,IACzDH,GAAgC,iBAAbA,EAKnBC,GAAkC,iBAAdA,EAKD,mBAAbC,GAKN/B,KAAK2B,QAAQE,KACjB7B,KAAK2B,QAAQE,GAAY,IAG1B7B,KAAK2B,QAAQE,GAAUhC,KAAK,CAC3BiC,UAAWA,EACXC,SAAWA,EACXC,SAAWA,IAIZhC,KAAK2B,QAAQE,GAAUI,KAAK,CAACC,EAAGC,IAAMD,EAAEF,SAAWG,EAAEH,UAErD3L,IAAIrB,QAAQJ,IAAI,iBAAiBiN,MAAaC,oBAA4BE,MAjBzE3L,IAAIrB,QAAQE,MAAM,0CALlBmB,IAAIrB,QAAQE,MAAM,2CALlBmB,IAAIrB,QAAQE,MAAM,0CA4BpB,EAaAkN,aAAc,SAAUP,EAAU9K,KAAUsL,GAC3C,IAAKrC,KAAK2B,QAAQE,IAA+C,IAAlC7B,KAAK2B,QAAQE,GAAU5M,OACrD,OAAO8B,EAGR,IAAIuL,EAAgBvL,EAEpB,IAAK,MAAMwL,KAAUvC,KAAK2B,QAAQE,GACjC,IACC,MAAMW,EAASD,EAAOR,SAASO,KAAkBD,GA7ErD,YAgFQG,EACHF,EAAgBE,EAEhBnM,IAAIrB,QAAQyN,KAAK,UAAUF,EAAOT,gBAAgBD,+CAEpD,CAAE,MAAOxJ,GACRhC,IAAIrB,QAAQE,MAAM,mBAAmBqN,EAAOT,gBAAgBD,KAAaxJ,EAE1E,CAGD,OAAOiK,CACR,EAWAI,aAAc,SAAUb,EAAUC,GACjC,IAAK9B,KAAK2B,QAAQE,GACjB,OAGD,MAAMc,EAAmB3C,KAAK2B,QAAQE,GAAU5M,OAChD+K,KAAK2B,QAAQE,GAAY7B,KAAK2B,QAAQE,GAAUU,OAAOK,GAAKA,EAAEd,YAAcA,GAExE9B,KAAK2B,QAAQE,GAAU5M,OAAS0N,GACnCtM,IAAIrB,QAAQJ,IAAI,mBAAmBiN,MAAaC,KAElD,EAOAe,iBAAkB,SAAUhB,GACvB7B,KAAK2B,QAAQE,YACT7B,KAAK2B,QAAQE,GACpBxL,IAAIrB,QAAQJ,IAAI,4BAA4BiN,KAE9C,EASAiB,UAAW,SAAUjB,EAAUC,EAAY,MAC1C,SAAK9B,KAAK2B,QAAQE,IAA+C,IAAlC7B,KAAK2B,QAAQE,GAAU5M,WAIlD6M,GACI9B,KAAK2B,QAAQE,GAAUkB,KAAKH,GAAKA,EAAEd,YAAcA,GAI1D,EAQAkB,WAAY,SAAUnB,GACrB,OAAO7B,KAAK2B,QAAQE,IAAa,EAClC,GAIDnM,EAAI+L,MAAQpL,IAAIoL,KAEhB,CAjKA,CAiKC1L,OAAOL,IAAMK,OAAOL,KAAO,CAAC,EAAGiB,O,YC1KhC,SAAUjB,GAIVA,EAAIuN,kBAAoB,IAFI,SAM5BvN,EAAIwN,oBAAsB,KAErBxN,EAAIuN,sBAAwB3N,cAAc6L,SAASgC,QACtDnO,QAAQE,MAAM,sCAAsCQ,EAAIuN,uDAAuD3N,aAAa6L,QAAQgC,oEAItI,CAfA,CAeCpN,OAAOL,IAAMK,OAAOL,KAAO,CAAC,EAAGiB,O,iBCXhC,SAAUjB,EAAK0N,EAAGC,GAElB,MAAM,QAACC,EAAO,KAAEC,EAAI,KAAEC,EAAI,KAAEC,EAAMtC,QAASuC,GAAgB5N,EAAQ,KAE7D6N,EAAa,CAClB,WAAc,CACb,IAAO,4CAMR,UAAgB,CACf,EAAO,6BACP,EAAO,6BACP,IAAO,yBAER,OAAgB,CACf,IAAO,wBAER,aAAgB,CACf,IAAO,gCAGR,MAAgB,CACf,EAAO,yBACP,EAAO,yBACP,IAAO,4BAkBTjO,EAAIkO,WAAa,CAEhBC,WAAY5N,UAEX,MAAM6N,QAAiBC,MAAM,4CAE7B,IAAKD,EAASE,GAAI,MAAM,IAAIC,MAAM,oDAAoDH,EAASI,UAE/F,IAAI1I,QAAasI,EAAS3M,OAE1B,IAAKqE,EAAM,MAAM,IAAIyI,MAAM,wCAY3B,GARAzI,EAAOA,EACL9E,OACAyN,MAAM,MACNC,OAAO,CAACC,EAAKC,KAEND,GADPC,EAAOA,EAAKH,MAAM,MACF,IAAMG,EAAK,GAAID,GAC7B,CAAC,IAEA7I,EAAK+I,KAAO/I,EAAKgJ,IAAK,MAAM,IAAIP,MAAM,8DAQ3C,GAAIQ,EAAcjJ,EAAKgJ,KAAM,MAAM,IAAIP,MAAM,iFAE7C,MAAO,CACNM,GAAa/I,EAAK+I,GAClB9P,YAAa+G,EAAKgJ,IAClBE,QAAa,eAIfC,MAAO1O,UAEN,MAAM6N,QAAiBC,MAAM,uCAE7B,IAAKD,EAASE,GAAI,MAAM,IAAIC,MAAM,+CAA+CH,EAASI,UAE1F,IAAI1I,QAAasI,EAASc,OAE1B,IAAKpJ,EAAM,MAAM,IAAIyI,MAAM,wCAC3B,IAAKzI,EAAK+I,KAAO/I,EAAKqJ,eAAiBrJ,EAAKsJ,OAAQ,MAAM,IAAIb,MAAM,2EAEpE,MAAO,CACNM,GAAa/I,EAAK+I,GAClB9P,YAAa+G,EAAKqJ,aAClBC,OAAatJ,EAAKsJ,OAClBJ,QAAa,UAIfK,OAAQ9O,UAEP,MAAM6N,QAAiBC,MAAM,0BAE7B,IAAKD,EAASE,GAAI,MAAM,IAAIC,MAAM,4DAA4DH,EAASI,UAEvG,IAAI1I,QAAasI,EAASc,OAE1B,IAAKpJ,EAAM,MAAM,IAAIyI,MAAM,yCAC3B,IAAKzI,EAAK+I,KAAO/I,EAAKwJ,UAAYxJ,EAAKsJ,OAAQ,MAAM,IAAIb,MAAM,uEAE/D,MAAO,CACNM,GAAa/I,EAAK+I,GAClB9P,YAAa+G,EAAKwJ,QAClBF,OAAatJ,EAAKsJ,OAClBJ,QAAa,WAIfO,MAAOhP,UAEN,MAAM6N,QAAiBC,MAAM,yBAE7B,IAAKD,EAASE,GAAI,MAAM,IAAIC,MAAM,+CAA+CH,EAASI,UAE1F,IAAI1I,QAAasI,EAASc,OAE1B,IAAKpJ,EAAM,MAAM,IAAIyI,MAAM,wCAC3B,IAAKzI,EAAK+I,KAAO/I,EAAKwJ,UAAYxJ,EAAKsJ,OAAQ,MAAM,IAAIb,MAAM,sEAE/D,MAAO,CACNM,GAAa/I,EAAK+I,GAClB9P,YAAa+G,EAAKwJ,QAClBF,OAAatJ,EAAKsJ,OAClBJ,QAAa,WAmBhB,MAAMD,EAAiBhQ,IAEtB,GAAoB,QAAhBA,EAAuB,OAAO,EAIlC,MAFuB,CAAC,QAAS,SAEXsO,KAAK+B,GAC1BxP,cAAcC,SAAS2P,mBAAmBC,mBAAmBC,SAASN,KAUxEpP,EAAI2P,iBAAmBpP,UAGtB,GAA2C,OAAvCP,EAAIG,aAAa,mBAA8BH,EAAIG,aAAa,oBAAsBwN,EACzF,QAASiC,KAAKC,MAAM7P,EAAIG,aAAa,mBAItC,GAAI2P,IAEH,OADA9P,EAAIE,UAAU,kBAAkB,IACzB,EAIR,GAAI6P,MAAMC,QAAQpQ,cAAcC,SAASgI,iBAAiBoI,kBACtDrQ,aAAaC,QAAQgI,gBAAgBoI,gBAAgB1Q,OAAS,EAAG,CAEpE,MAAMsP,QAAW7O,EAAIkQ,QAErB,GAAIC,EAAoBtB,GAEvB,OADA7O,EAAIE,UAAU,kBAAkB,IACzB,CAET,CAIA,OADAF,EAAIE,UAAU,kBAAkB,IACzB,GAGRF,EAAIkQ,MAAQ3P,MAAO6P,EAAY,MAAOC,EAAqB,KAE1D,MAAMC,EAAgB,CAAC,MAAO,IAAK,KAGnC,IAAKA,EAAcZ,SAASU,GAE3B,OADA9Q,QAAQE,MAAM,sDAAwD8Q,EAAcC,KAAK,OAClF,KAGR,GAAkB,QAAdH,GAAuBpQ,EAAIG,aAAa,MAC3C,OAAOH,EAAIG,aAAa,MAIzB,MAAMqQ,EAAMxQ,EAAIG,aAAa,MAAMiQ,KAMnC,GAAII,IAAQ7C,EAAW,OAAO6C,EAE9B7P,IAAIrB,QAAQJ,IAAI,wPAEhB,IAEC,MAAM2P,QAAW7O,EAAIyQ,oBAAoBL,EAAWC,GAsBpD,MAjBkB,QAAdD,GACHpQ,EAAIE,UAAU,KAAM2O,IAIC,IAArBb,EAAaa,IACK,MAAduB,GAA4B,OAAPvB,IAEzB7O,EAAIE,UAAU,OAAQ2O,IAGE,IAArBb,EAAaa,IACE,MAAduB,GAA4B,OAAPvB,IAEzB7O,EAAIE,UAAU,OAAQ2O,GAGhBA,CACR,CAAE,MAAOrP,GAER,OAAO,IACR,GAGDQ,EAAI0Q,iCAAmCnQ,UAEtC,MAAM8K,EAAYsF,YAAYxM,MAE9B,IAAIyM,EAAW,GAEf3K,OAAOgC,KAAKjI,EAAIkO,YAAY2C,QAAQ7B,IACnC4B,EAASzG,KAAKnK,EAAIkO,WAAWc,QAG9B,IACC,MAAMlJ,QAAa+E,QAAQiG,IAAIF,GAqB/B,OAnBA9K,EAAK/G,YAAc+G,EAAK/G,YAAYC,cAEhC8G,EAAKsJ,QAA0B,eAAhBtJ,EAAKsJ,SACvBtJ,EAAK7G,WAAa,SAGf6G,EAAKsJ,QAA0B,aAAhBtJ,EAAKsJ,SACvBtJ,EAAK7G,WAAa,SAGnB0B,IAAIrB,QAAQJ,IACX,4DACA4G,EACA,gBACC6K,YAAYxM,MAAQkH,GAAW0F,QAAQ,GAAK,OAKvCjL,CACR,CAAE,MAAOtG,GAER,OADAmB,IAAIrB,QAAQE,MAAM,UAAWA,GACtB,IACR,GAeDQ,EAAIgR,cAAgBzQ,UAEnB,IAAI0Q,EAAiB,CAAC,EAMtB,GAJIjR,EAAIG,aAAa,oBAAmB8Q,EAAelS,YAAciB,EAAIG,aAAa,mBAClFH,EAAIG,aAAa,mBAAkB8Q,EAAehS,WAAae,EAAIG,aAAa,kBAChFH,EAAIG,aAAa,eAAc8Q,EAAe7B,OAASpP,EAAIG,aAAa,cAExE8Q,EAAelS,YAElB,OADA4B,IAAIrB,QAAQJ,IAAI,sDAAuD+R,GAChEA,EAGR,IAAIC,QAAgBlR,EAAI0Q,mCAGxB,IAAKQ,EAAS,CAEb,MAAMC,EA9B6BC,MAEpC,MACMtS,EADcsB,EAAQ,KACJ5B,wBAExB,OAAIM,EAAYC,YACRD,EAGD,MAqBwBsS,GAE9BF,EAAU,CAAC,EAEPC,GAAuBxQ,IAAIrB,QAAQJ,IAAI,yDAA0DiS,GACjGA,EAAsBpS,cAAamS,EAAQnS,YAAcoS,EAAsBpS,aAC/EoS,EAAsBlS,aAAYiS,EAAQjS,WAAakS,EAAsBlS,WAClF,CAOA,OALIiS,GAASrC,IAAI7O,EAAIE,UAAU,KAAMgR,EAAQrC,IACzCqC,GAASnS,aAAaiB,EAAIE,UAAU,iBAAkBgR,EAAQnS,aAC9DmS,GAASjS,YAAYe,EAAIE,UAAU,gBAAiBgR,EAAQjS,YAC5DiS,GAAS9B,QAAQpP,EAAIE,UAAU,YAAagR,EAAQ9B,QAEpD8B,GAASnS,YACLmS,EAGD,MASRlR,EAAIyQ,oBAAsBlQ,MAAO6P,EAAY,MAAOC,EAAqB,KAGxE,MAAMhF,EAAYsF,YAAYxM,MAMxBkN,EAAqBpL,OAAOgC,KAAKgG,GACrCpB,OAAOmC,GAAWf,EAAWe,GAASoB,IACtCkB,MAAM,EAAGjB,GACT3B,OAAO,CAACC,EAAK1J,KACZ0J,EAAI1J,GAAOgJ,EAAWhJ,GACf0J,GAEN,CAAC,GAEL,IAAIiC,EAAW,GAYf,GAVA3K,OAAOgC,KAAKoJ,GAAoBR,QAAQ7B,IAEnCqC,EAAmBrC,GAASoB,IAE/BQ,EAASzG,KAAKnK,EAAIuR,iBAAiBvC,EAASoB,QAM1CQ,EAASrR,OAAS,GAoBrB,OADAoB,IAAIrB,QAAQJ,IAAI,0BACT,KAlBP,IACC,MAAM4G,QAAa+E,QAAQiG,IAAIF,GAKzBY,GADYb,YAAYxM,MACDkH,GAAW0F,QAAQ,GAGhD,OADApQ,IAAIrB,QAAQJ,IAAI,4BAA4B4G,EAAK+I,WAAW/I,EAAKkJ,sBAAsBwC,QAChF1L,EAAK+I,EACb,CAAE,MAAOrP,GAGR,OADAmB,IAAIrB,QAAQJ,IAAI,yCAAyCkR,+BAClD,IACR,GAiBFpQ,EAAIuR,iBAAmBhR,MAAOyO,EAASoB,EAAY,SAClD,IAEC,IAAItK,EAAO,CACV+I,GAAW,KACXG,QAAWA,EACXoB,UAAWA,GAIZ,IAAKnC,EAAWe,GAASoB,GAAY,OAAOvF,QAAQ4G,OAAO,IAAIlD,MAAM,kBAAkB6B,sCAA8CpB,MAErIrO,IAAIrB,QAAQJ,IAAI,oBAAoB8P,sBAA4BoB,KAEhE,MAAMhC,QAAiBC,MAAMJ,EAAWe,GAASoB,IAEjD,IAAKhC,EAASE,GACb,OAAOzD,QAAQ4G,OAAO,IAAIlD,MAAM,qBAAqBS,yBAA+BZ,EAASI,WAG9F,IAAIkD,QAA4BtD,EAAS3M,OAiBzC,MAfgB,eAAZuN,GAEH0C,EAAsBA,EACpB1Q,OACAyN,MAAM,MACNC,OAAO,CAACC,EAAKC,KAELD,GADRC,EAAOA,EAAKH,MAAM,MACD,IAAMG,EAAK,GAAKD,GAC/B,CAAC,GAEL7I,EAAK+I,GAAK6C,EAAoB7C,IAE9B/I,EAAK+I,GAAK6C,EAAoB1Q,OAG1B6M,EAAK/H,EAAK+I,IAIR/I,EAHC+E,QAAQ4G,OAAO,IAAIlD,MAAM,2BAA2BS,0BAI7D,CAAE,MAAOxP,GACR,OAAOqL,QAAQ4G,OAAOjS,EACvB,GAqCDQ,EAAI2R,oBAAsBpR,UACe,UAA3BP,EAAI2P,mBAQlB,MAAMG,EAAiBA,KACtB,MAAM8B,EAAYC,UAAUD,WAAa,GAGzC,IAAKA,EACJ,OAAO,EAGR,MAAME,EAAcC,IAGpB,IAAK,MAAMC,KAAWF,EACrB,GAAIF,EAAUK,cAAcvC,SAASsC,EAAQC,eAC5C,OAAO,EAIT,OAAO,GAQFF,EAAiBA,KAEtB,IAAIG,EAAiB,GACjBnC,MAAMC,QAAQpQ,cAAcC,SAASgI,iBAAiBsK,+BACzDD,EAAiBtS,aAAaC,QAAQgI,gBAAgBsK,6BA6DvD,MAzDwB,CAEvB,YACA,wBACA,kBACA,kBACA,UACA,cACA,SACA,QACA,cACA,cACA,YACA,QAGA,sBACA,cACA,cACA,aACA,eACA,YACA,cACA,aACA,eACA,WAGA,YACA,aACA,UACA,SACA,WAGA,cACA,UACA,aACA,WAGA,YACA,SACA,UACA,eACA,QACA,gBAGA,UACA,SACA,UACA,OACA,OACA,QAGsBC,OAAOF,IASzBG,EAAUC,GACRA,EAAO5C,SAAS,KASlBS,EAAuBtB,IAC5B,MAAM0D,EAAgB3S,cAAcC,SAASgI,iBAAiBoI,iBAAmB,GAEjF,IAAK,MAAMqC,KAAUC,EACpB,GAAIF,EAAOC,IAEV,GAAIE,WAAWA,WAAW3D,EAAIyD,GAC7B,OAAO,OAEF,GAAIzD,IAAOyD,EAEjB,OAAO,EAIT,OAAO,EAGR,CA3nBA,CA2nBCjS,OAAOL,IAAMK,OAAOL,KAAO,CAAC,EAAGiB,O,WC/mBjC,MAQMwR,EAAqBzS,IAAI6C,iBARC,CAG/B,kDACA,oBACA,8BAGwE,aAEzE5B,OAAOwR,GAAoBvR,GAAG,uBAAwB,CAACC,EAAO2E,KAU7D,IAIC,IAAI8C,EAAYzH,GAAOC,QAAQsR,SAAS9J,SAAWzH,EAAMC,OAAOsR,QAAQ9J,SAAW,KAC/EpG,EAAYrB,GAAOC,QAAQsR,SAASC,WAAaxR,EAAMC,OAAOsR,QAAQC,WAAaxR,GAAOC,QAAQC,MAAQF,EAAMC,OAAOC,MAAQ,KAMnI,GAAoC,YAAhCzB,aAAa4E,KAAKC,UAAyB,CAG9C,QACqD,IAA7CxD,OAAOE,EAAMoB,eAAeV,KAAK,SACrCZ,OAAOE,EAAMoB,eAAeV,KAAK,QAAQ6N,SAAS,eAQrD,OALKlN,IACJA,EAAYvB,OAAOE,EAAMoB,eAAeuD,KAAK,oBAG9C9F,IAAI4S,iBAAiBpQ,EAAW,GAKjC,GAAuC,WAAnC5C,aAAa4E,KAAKE,aAoBrB,OAlBiB,OAAbkE,IACHA,EAAWiK,OAAO5R,OAAO,mBAAmBW,OAASiR,OAAO5R,OAAO,mBAAmBW,OAAS,GAG3FY,IACJA,EAAYvB,OAAOE,EAAMoB,eAAeX,OAIpCY,IAKJA,EAAYvB,OAAO,YAAYY,KAAK,MAAMd,QAAQ,WAAY,UAG/Df,IAAI4S,iBAAiBpQ,EAAWoG,GAKjC,GAAI,CAAC,WAAY,yBAAyBkK,QAAQlT,aAAa4E,KAAKE,eAAiB,EAWpF,OATiB,OAAbkE,IACHA,EAAWiK,OAAO5R,OAAO,mBAAmBW,OAASiR,OAAO5R,OAAO,mBAAmBW,OAAS,GAG3FY,IACJA,EAAYvB,OAAO,yBAAyBW,YAG7C5B,IAAI4S,iBAAiBpQ,EAAWoG,GAKjC,GAAuC,YAAnChJ,aAAa4E,KAAKE,aAarB,YAXAzD,OAAO,0CAA0C8R,KAAK,CAACC,EAAOC,KAI7DrK,EAAWiK,OAAO5R,OAAOgS,GAAStR,KAAK,mBAAmBC,OAASiR,OAAO5R,OAAOgS,GAAStR,KAAK,mBAAmBC,OAAS,EAE3H,IAAIsR,EAAUjS,OAAOgS,GAASpR,KAAK,SACnCW,EAAcxC,IAAImT,oBAAoBD,GAEtClT,IAAI4S,iBAAiBpQ,EAAWoG,KAMlC,GAAuC,WAAnChJ,aAAa4E,KAAKE,aAWrB,OATiB,OAAbkE,IACHA,EAAWiK,OAAO5R,OAAO,mBAAmBW,OAASiR,OAAO5R,OAAO,mBAAmBW,OAAS,GAG3FY,IACJA,EAAYvB,OAAO,2BAA2BW,YAG/C5B,IAAI4S,iBAAiBpQ,EAAWoG,GAKhB,OAAbA,IACHA,EAAWiK,OAAO5R,OAAO,mBAAmBW,OAASiR,OAAO5R,OAAO,mBAAmBW,OAAS,GAGhG5B,IAAI4S,iBAAiBpQ,EAAWoG,EAEjC,MAEkB,OAAbA,IACHA,EAAW,GAGPpG,IAEJA,EAAYvB,OAAOE,EAAMoB,eAAeuD,KAAK,cAAgB7E,OAAOE,EAAMoB,eAAeuD,KAAK,cAAgB,MAI1GtD,IACJA,EAAYvB,OAAOE,EAAMoB,eAAeX,MAAQX,OAAOE,EAAMoB,eAAeX,MAAQ,MAIpFY,GACGoG,GAEH5I,IAAI4S,iBAAiBpQ,EAAWoG,EAInC,CAAE,MAAOjG,GACRrD,QAAQE,MAAMmD,EACf,IAUD1B,OAAO,6EAA6EmS,IAAI,QAAUjS,IAEjG,IACC,GAAIF,OAAOE,EAAMC,QAAQiS,QAAQ,KAAKxR,KAAK,QAAS,CAEnD,IAAIQ,EAAM,IAAIC,IAAIrB,OAAOE,EAAMoB,eAAeV,KAAK,QAASxB,OAAOoD,SAAS6P,QAE5E,GAAIjR,EAAIkR,aAAaC,IAAI,eAAgB,CAExC,IAAIhR,EAAYH,EAAIkR,aAAaE,IAAI,eACjC7K,EAAYvG,EAAIkR,aAAaC,IAAI,YAAcE,SAASrR,EAAIkR,aAAaE,IAAI,YAAa,IAAM,EACpGzT,IAAI4S,iBAAiBpQ,EAAWoG,EACjC,CACD,CACD,CAAE,MAAOjG,GACRrD,QAAQE,MAAMmD,EACf,IAKD1B,OAAO,mGAAmGC,GAAG,QAAUC,IAEtH,IAaC,IAAIqB,EAAYvB,OAAOE,EAAMoB,eAAeoR,QAAQ,uBAAuB7N,KAAK,MAQhF,GAAItD,EAAW,CAId,GAFAA,EAAYxC,IAAI4T,qCAAqCpR,IAEhDA,EAAW,MAAM+L,MAAM,uCAE5B,GAAI3O,aAAasD,UAAYtD,aAAasD,SAASV,GAAY,CAE9D,IAAIoC,EAAU5E,IAAI6T,mCAAmCrR,GAErDvB,OAAOc,UAAUC,QAAQ,kBAAmB4C,EAC7C,CACD,CACD,CAAE,MAAOjC,GACRrD,QAAQE,MAAMmD,EACf,IAOD1B,OAAO,kBAAkBC,GAAG,QAAUC,IAEjCnB,IAAI8T,QAAQ7S,OAAOE,EAAMoB,eAAeX,SAE3C5B,IAAI+C,qBAAqB,GACzB/C,IAAI+T,eAAgB,KActB9S,OAAO,iBAAiBC,GAAG,+BAAgC,MAKtD,IAAUlB,IAAI+T,eACjB/T,IAAI+C,qBAAqB,IAGtB,IAAU/C,IAAI8C,wBACjB9C,IAAI+C,qBAAqB,GACzB/C,IAAIgD,mBAAmB,EAAG/B,OAAO,wCAAwCW,QAG1E5B,IAAI+C,qBAAqB,GAEzB9B,OAAOc,UAAUC,QAAQ,kBAAmB,CAAC,KAQ9Cf,OAAOc,UAAUb,GAAG,QAAS,uBAAwB,KAEpD,IACCD,OAAO,cAAc8R,KAAK,CAACC,EAAOC,KAEjC,MAAMzQ,EAAYxC,IAAIgU,8BAA8Bf,GAEpD,IAAKzQ,EAEJ,YADAlD,QAAQE,MAAM,sDAIf,MAAMoJ,EAAW5I,IAAIiU,oCAAoChB,GAEpDrK,EAQY,IAAbA,EACH5I,IAAI0C,sBAAsBF,GAChBoG,EAAWhJ,aAAasU,KAAK1R,GAAWoG,SAClD5I,IAAI0C,sBAAsBF,EAAW5C,aAAasU,KAAK1R,GAAWoG,SAAWA,GACnEA,EAAWhJ,aAAasU,KAAK1R,GAAWoG,UAClD5I,IAAI4S,iBAAiBpQ,EAAWoG,EAAWhJ,aAAasU,KAAK1R,GAAWoG,UAZxEtJ,QAAQE,MAAM,sDAejB,CAAE,MAAOmD,GACRrD,QAAQE,MAAMmD,GACd3C,IAAImU,yBACL,IAODlT,OAAO,+BAA+BC,GAAG,QAASC,IAEjD,IAEC,IAAIqB,EAUJ,GARIvB,OAAOE,EAAMoB,eAAeuD,KAAK,aAEpCtD,EAAYvB,OAAOE,EAAMoB,eAAeuD,KAAK,aACnC7E,OAAOE,EAAMoB,eAAeuD,KAAK,gBAE3CtD,EAAYvB,OAAOE,EAAMoB,eAAeuD,KAAK,gBAGzCtD,EAAW,MAAM+L,MAAM,uCAE5B,IAAI3J,EAAU5E,IAAI6T,mCAAmCrR,GAGrDvB,OAAOc,UAAUC,QAAQ,sBAAuB4C,EACjD,CAAE,MAAOjC,GACRrD,QAAQE,MAAMmD,EACf,IAgBI/C,cAAcC,SAASyF,eAC3BtF,IAAIuF,oC,2XC7WL,WACE,IAAI6O,EAAYC,EAAQC,EAAUC,EAAaC,EAAUC,EAAaC,EAAiBC,EAEvFN,EAAS,CAAC,EAIuC,OAA5CO,GAAqDA,EAAOC,QAC/DD,EAAAC,QAAiBR,EAHZ/J,KAKQ,OAAI+J,EAGnBK,EAAY,SAASI,EAAOC,EAAQC,EAAUC,GAC5C,IAAIC,EAAMC,EACV,GAAIL,EAAMvV,SAAWwV,EAAOxV,OAC1B,MAAM,IAAIgP,MAAM,gEAGlB,IADA2G,EAAO,EACAD,EAAW,GAAG,CAKnB,IAJAE,EAAQH,EAAWC,GACP,IACVE,EAAQ,GAENL,EAAMI,IAASC,IAAUJ,EAAOG,IAASC,EAC3C,OAAO,EAETF,GAAYD,EACZE,GAAQ,C,CAEV,OAAO,C,EAGTb,EAAOe,YAAc,SAASC,EAASC,EAAWC,GAChD,IAAIC,EAAGC,EAAKC,EAAWC,EAAcC,EAIrC,IAAKF,KAHc,MAAfH,IACFA,EAAc,WAEED,EAKhB,MAJAK,EAAeL,EAAUI,IACR,IAAQC,EAAa,aAAc5F,QAClD4F,EAAe,CAACA,IAEbH,EAAI,EAAGC,EAAME,EAAapW,OAAQiW,EAAIC,EAAKD,IAE9C,GADAI,EAASD,EAAaH,GAClBH,EAAQQ,SAAWD,EAAO,GAAGC,QAC3BR,EAAQS,MAAMC,MAAMV,EAASO,GAC/B,OAAOF,EAKf,OAAOH,C,EAGTlB,EAAO2B,KAAQ,WACb,SAASA,EAAKC,GACZ,IAAIT,EAAGC,EAAKS,EACZ,GAAsB,IAAlBD,EAAO1W,OACT,MAAM,IAAIgP,MAAM,wCAElB,IAAKiH,EAAI,EAAGC,EAAMQ,EAAO1W,OAAQiW,EAAIC,EAAKD,IAExC,KAAO,IADPU,EAAQD,EAAOT,KACMU,GAAS,KAC5B,MAAM,IAAI3H,MAAM,2CAGpBjE,KAAK2L,OAASA,C,CAkFhB,OA/EAD,EAAKG,UAAUN,KAAO,WACpB,MAAO,M,EAGTG,EAAKG,UAAUC,SAAW,WACxB,OAAO9L,KAAK2L,OAAO1F,KAAK,I,EAG1ByF,EAAKG,UAAUE,mBAAqB,WAClC,OAAO/L,KAAK8L,U,EAGdJ,EAAKG,UAAUG,YAAc,WAC3B,OAAOhM,KAAK2L,OAAO3E,MAAM,E,EAG3B0E,EAAKG,UAAUL,MAAQ,SAASS,EAAOC,GACrC,IAAIC,EAIJ,QAHkB,IAAdD,IACWD,GAAbE,EAAMF,GAAmB,GAAIC,EAAYC,EAAI,IAE1B,SAAjBF,EAAMV,OACR,MAAM,IAAItH,MAAM,uDAElB,OAAOmG,EAAUpK,KAAK2L,OAAQM,EAAMN,OAAQ,EAAGO,E,EAGjDR,EAAKG,UAAUO,cAAgB,CAC7BC,YAAa,CAAC,CAAC,IAAIX,EAAK,CAAC,EAAG,EAAG,EAAG,IAAK,IACvCY,UAAW,CAAC,CAAC,IAAIZ,EAAK,CAAC,IAAK,IAAK,IAAK,MAAO,KAC7Ca,UAAW,CAAC,CAAC,IAAIb,EAAK,CAAC,IAAK,EAAG,EAAG,IAAK,IACvCc,UAAW,CAAC,CAAC,IAAId,EAAK,CAAC,IAAK,IAAK,EAAG,IAAK,KACzCe,SAAU,CAAC,CAAC,IAAIf,EAAK,CAAC,IAAK,EAAG,EAAG,IAAK,IACtCgB,gBAAiB,CAAC,CAAC,IAAIhB,EAAK,CAAC,IAAK,GAAI,EAAG,IAAK,KAC9C,QAAW,CAAC,CAAC,IAAIA,EAAK,CAAC,GAAI,EAAG,EAAG,IAAK,GAAI,CAAC,IAAIA,EAAK,CAAC,IAAK,GAAI,EAAG,IAAK,IAAK,CAAC,IAAIA,EAAK,CAAC,IAAK,IAAK,EAAG,IAAK,KACxGiB,SAAU,CAAC,CAAC,IAAIjB,EAAK,CAAC,IAAK,EAAG,EAAG,IAAK,IAAK,CAAC,IAAIA,EAAK,CAAC,IAAK,EAAG,EAAG,IAAK,IAAK,CAAC,IAAIA,EAAK,CAAC,IAAK,GAAI,GAAI,IAAK,IAAK,CAAC,IAAIA,EAAK,CAAC,IAAK,GAAI,IAAK,IAAK,IAAK,CAAC,IAAIA,EAAK,CAAC,IAAK,EAAG,IAAK,IAAK,IAAK,CAAC,IAAIA,EAAK,CAAC,IAAK,EAAG,EAAG,IAAK,KAG/MA,EAAKG,UAAUe,MAAQ,WACrB,OAAO7C,EAAOe,YAAY9K,KAAMA,KAAKoM,c,EAGvCV,EAAKG,UAAUgB,oBAAsB,WACnC,OAAO9C,EAAO+C,KAAKvH,MAAM,UAAavF,KAAK8L,W,EAG7CJ,EAAKG,UAAUkB,2BAA6B,WAC1C,IAAIC,EAAMC,EAAG/B,EAAGU,EAAOsB,EAAMC,EAAOC,EAcpC,IAbAA,EAAY,CACV,EAAG,EACH,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,GAEPJ,EAAO,EACPE,GAAO,EACFD,EAAI/B,EAAI,EAAGA,GAAK,EAAG+B,EAAI/B,IAAM,EAAG,CAEnC,MADAU,EAAQ5L,KAAK2L,OAAOsB,MACPG,GAUX,OAAO,KARP,GADAD,EAAQC,EAAUxB,GACdsB,GAAkB,IAAVC,EACV,OAAO,KAEK,IAAVA,IACFD,GAAO,GAETF,GAAQG,C,CAKZ,OAAO,GAAKH,C,EAGPtB,C,CA9FM,GAkGf1B,EAAW,uBAEXC,EAAc,CACZoD,UAAW,IAAIC,OAAO,IAAMtD,EAAW,MAAQA,EAAW,MAAQA,EAAW,MAAQA,EAAW,IAAK,KACrGuD,UAAW,IAAID,OAAO,IAAMtD,EAAW,IAAK,MAG9CD,EAAO2B,KAAK8B,OAAS,SAAShX,GAC5B,IAAIgV,EAAOiC,EAAc7C,EAAMC,EAAO9T,EAQtC,GAPA0W,EAAe,SAASjX,GACtB,MAAkB,MAAdA,EAAO,IAA4B,MAAdA,EAAO,GACvB4S,SAAS5S,EAAQ,GAEjB4S,SAAS5S,E,EAGhBgV,EAAQhV,EAAOgV,MAAMvB,EAAYoD,WACnC,OAAQ,WACN,IAAInC,EAAGC,EAAKgB,EAAKuB,EAGjB,IADAA,EAAU,GACLxC,EAAI,EAAGC,GAFZgB,EAAMX,EAAMxE,MAAM,EAAG,IAEC/R,OAAQiW,EAAIC,EAAKD,IACrCN,EAAOuB,EAAIjB,GACXwC,EAAQ7N,KAAK4N,EAAa7C,IAE5B,OAAO8C,C,CARD,GAUH,GAAIlC,EAAQhV,EAAOgV,MAAMvB,EAAYsD,WAAY,CAEtD,IADAxW,EAAQ0W,EAAajC,EAAM,KACf,YAAczU,EAAQ,EAChC,MAAM,IAAIkN,MAAM,yCAElB,OAAS,WACP,IAAIiH,EAAGwC,EAEP,IADAA,EAAU,GACL7C,EAAQK,EAAI,EAAGA,GAAK,GAAIL,EAAQK,GAAK,EACxCwC,EAAQ7N,KAAM9I,GAAS8T,EAAS,KAElC,OAAO6C,C,CANA,GAOHC,S,CAEN,OAAO,I,EAIX5D,EAAO+C,KAAQ,WACb,SAASA,EAAKc,EAAOC,GACnB,IAAIZ,EAAG/B,EAAG4C,EAAG3C,EAAKP,EAAMuB,EACxB,GAAqB,KAAjByB,EAAM3Y,OAER,IADA+K,KAAK4N,MAAQ,GACRX,EAAI/B,EAAI,EAAGA,GAAK,GAAI+B,EAAI/B,GAAK,EAChClL,KAAK4N,MAAM/N,KAAM+N,EAAMX,IAAM,EAAKW,EAAMX,EAAI,QAEzC,IAAqB,IAAjBW,EAAM3Y,OAGf,MAAM,IAAIgP,MAAM,6CAFhBjE,KAAK4N,MAAQA,C,CAKf,IAAKE,EAAI,EAAG3C,GADZgB,EAAMnM,KAAK4N,OACW3Y,OAAQ6Y,EAAI3C,EAAK2C,IAErC,KAAO,IADPlD,EAAOuB,EAAI2B,KACSlD,GAAQ,OAC1B,MAAM,IAAI3G,MAAM,2CAGhB4J,IACF7N,KAAK6N,OAASA,E,CAmKlB,OA/JAf,EAAKjB,UAAUN,KAAO,WACpB,MAAO,M,EAGTuB,EAAKjB,UAAUC,SAAW,WACxB,OAAO9L,KAAK+L,qBAAqBtV,QAAQ,mBAAoB,K,EAG/DqW,EAAKjB,UAAUkC,gBAAkB,WAC/B,IAAIC,EAAgBC,EAAiBzC,EAAO0C,EAAO1X,EAKnD,IAJA0X,EAAQ,uBACR1X,EAASwJ,KAAK+L,qBACdiC,EAAiB,EACjBC,GAAmB,EACXzC,EAAQ0C,EAAMC,KAAK3X,IACrBgV,EAAM,GAAGvW,OAASgZ,IACpBD,EAAiBxC,EAAM9C,MACvBuF,EAAkBzC,EAAM,GAAGvW,QAG/B,OAAIgZ,EAAkB,EACbzX,EAEFA,EAAO4X,UAAU,EAAGJ,GAAkB,KAAOxX,EAAO4X,UAAUJ,EAAiBC,E,EAGxFnB,EAAKjB,UAAUG,YAAc,WAC3B,IAAIqC,EAAOnD,EAAGC,EAAKP,EAAMuB,EAGzB,IAFAkC,EAAQ,GAEHnD,EAAI,EAAGC,GADZgB,EAAMnM,KAAK4N,OACW3Y,OAAQiW,EAAIC,EAAKD,IACrCN,EAAOuB,EAAIjB,GACXmD,EAAMxO,KAAK+K,GAAQ,GACnByD,EAAMxO,KAAY,IAAP+K,GAEb,OAAOyD,C,EAGTvB,EAAKjB,UAAUE,mBAAqB,WAClC,IAAIuC,EAAM1D,EAAM2D,EAehB,OAdAD,EAAS,WACP,IAAIpD,EAAGC,EAAKgB,EAAKuB,EAGjB,IADAA,EAAU,GACLxC,EAAI,EAAGC,GAFZgB,EAAMnM,KAAK4N,OAEW3Y,OAAQiW,EAAIC,EAAKD,IACrCN,EAAOuB,EAAIjB,GACXwC,EAAQ7N,KAAK+K,EAAKkB,SAAS,KAE7B,OAAO4B,C,EACNc,KAAKxO,MAAOiG,KAAK,KACpBsI,EAAS,GACLvO,KAAK6N,SACPU,EAAS,IAAMvO,KAAK6N,QAEfS,EAAOC,C,EAGhBzB,EAAKjB,UAAU4C,oBAAsB,WACnC,IAAIH,EAAM1D,EAAM2D,EAehB,OAdAD,EAAS,WACP,IAAIpD,EAAGC,EAAKgB,EAAKuB,EAGjB,IADAA,EAAU,GACLxC,EAAI,EAAGC,GAFZgB,EAAMnM,KAAK4N,OAEW3Y,OAAQiW,EAAIC,EAAKD,IACrCN,EAAOuB,EAAIjB,GACXwC,EAAQ7N,KAAK+K,EAAKkB,SAAS,IAAI4C,SAAS,EAAG,MAE7C,OAAOhB,C,EACNc,KAAKxO,MAAOiG,KAAK,KACpBsI,EAAS,GACLvO,KAAK6N,SACPU,EAAS,IAAMvO,KAAK6N,QAEfS,EAAOC,C,EAGhBzB,EAAKjB,UAAUL,MAAQ,SAASS,EAAOC,GACrC,IAAIC,EAIJ,QAHkB,IAAdD,IACWD,GAAbE,EAAMF,GAAmB,GAAIC,EAAYC,EAAI,IAE1B,SAAjBF,EAAMV,OACR,MAAM,IAAItH,MAAM,uDAElB,OAAOmG,EAAUpK,KAAK4N,MAAO3B,EAAM2B,MAAO,GAAI1B,E,EAGhDY,EAAKjB,UAAUO,cAAgB,CAC7BC,YAAa,CAAC,IAAIS,EAAK,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,KAClDN,UAAW,CAAC,IAAIM,EAAK,CAAC,MAAQ,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,IACrDP,UAAW,CAAC,IAAIO,EAAK,CAAC,MAAQ,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,GACrDL,SAAU,CAAC,IAAIK,EAAK,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,KAC/C6B,YAAa,CAAC,IAAI7B,EAAK,CAAC,MAAQ,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,GACvD8B,WAAY,CAAC,IAAI9B,EAAK,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,MAAQ,EAAG,IAAK,IACtD+B,QAAS,CAAC,IAAI/B,EAAK,CAAC,EAAG,EAAG,EAAG,EAAG,MAAQ,EAAG,EAAG,IAAK,IACnDgC,QAAS,CAAC,IAAIhC,EAAK,CAAC,IAAM,MAAQ,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,IACtD,OAAQ,CAAC,IAAIA,EAAK,CAAC,KAAQ,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,IAClDiC,OAAQ,CAAC,IAAIjC,EAAK,CAAC,KAAQ,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,IAClDH,SAAU,CAAC,CAAC,IAAIG,EAAK,CAAC,KAAQ,KAAO,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,MAG3DA,EAAKjB,UAAUe,MAAQ,WACrB,OAAO7C,EAAOe,YAAY9K,KAAMA,KAAKoM,c,EAGvCU,EAAKjB,UAAUmD,oBAAsB,WACnC,MAAwB,eAAjBhP,KAAK4M,O,EAGdE,EAAKjB,UAAUoD,cAAgB,WAC7B,IAAIC,EAAMC,EAAKhD,EACf,IAAKnM,KAAKgP,sBACR,MAAM,IAAI/K,MAAM,4DAGlB,OAD4BiL,GAA5B/C,EAAMnM,KAAK4N,MAAM5G,OAAO,IAAe,GAAImI,EAAMhD,EAAI,GAC9C,IAAIpC,EAAO2B,KAAK,CAACwD,GAAQ,EAAU,IAAPA,EAAaC,GAAO,EAAS,IAANA,G,EAG5DrC,EAAKjB,UAAUkB,2BAA6B,WAC1C,IAAIC,EAAMC,EAAG/B,EAAGN,EAAMsC,EAAMC,EAAOC,EAsBnC,IArBAA,EAAY,CACV,EAAG,GACH,MAAO,GACP,MAAO,GACP,MAAO,GACP,MAAO,GACP,MAAO,GACP,MAAO,GACP,MAAO,EACP,MAAO,EACP,MAAO,EACP,MAAO,EACP,MAAO,EACP,MAAO,EACP,MAAO,EACP,MAAO,EACP,MAAO,EACP,MAAO,GAETJ,EAAO,EACPE,GAAO,EACFD,EAAI/B,EAAI,EAAGA,GAAK,EAAG+B,EAAI/B,IAAM,EAAG,CAEnC,MADAN,EAAO5K,KAAK4N,MAAMX,MACNG,GAUV,OAAO,KARP,GADAD,EAAQC,EAAUxC,GACdsC,GAAkB,IAAVC,EACV,OAAO,KAEK,KAAVA,IACFD,GAAO,GAETF,GAAQG,C,CAKZ,OAAO,IAAMH,C,EAGRF,C,CAxLM,GA4Lf5C,EAAW,oBAEXG,EAAY,gBAEZF,EAAc,CACZE,UAAW,IAAIiD,OAAOjD,EAAW,KACjC,OAAU,IAAIiD,OAAO,UAAYpD,EAAW,uBAAyBG,EAAY,MAAO,KACxF+E,aAAc,IAAI9B,OAAQ,QAAUpD,EAAW,cAAgBA,EAAW,MAAUF,EAAW,MAAQA,EAAW,MAAQA,EAAW,MAAQA,EAAa,IAAMK,EAAY,MAAQ,MAGtLP,EAAa,SAAStT,EAAQoX,GAC5B,IAAIyB,EAAYC,EAAW1E,EAAM2E,EAAaC,EAAkB3B,EAChE,GAAIrX,EAAOgS,QAAQ,QAAUhS,EAAOiZ,YAAY,MAC9C,OAAO,KAST,KAPA5B,GAAUrX,EAAOgV,MAAMrB,EAAuB,YAAM,IAAI,MAEtD0D,EAASA,EAAOO,UAAU,GAC1B5X,EAASA,EAAOC,QAAQ,OAAQ,KAElC4Y,EAAa,EACbC,GAAa,GACLA,EAAY9Y,EAAOgS,QAAQ,IAAK8G,EAAY,KAAO,GACzDD,IAQF,GAN4B,OAAxB7Y,EAAOkZ,OAAO,EAAG,IACnBL,IAE2B,OAAzB7Y,EAAOkZ,QAAQ,EAAG,IACpBL,IAEEA,EAAazB,EACf,OAAO,KAIT,IAFA4B,EAAmB5B,EAAQyB,EAC3BE,EAAc,IACPC,KACLD,GAAe,KAmBjB,MAhBkB,OADlB/Y,EAASA,EAAOC,QAAQ,KAAM8Y,IACnB,KACT/Y,EAASA,EAAOwQ,MAAM,IAEU,MAA9BxQ,EAAOA,EAAOvB,OAAS,KACzBuB,EAASA,EAAOwQ,MAAM,GAAI,IAYrB,CACL4G,MAXFA,EAAS,WACP,IAAI1C,EAAGC,EAAKgB,EAAKuB,EAGjB,IADAA,EAAU,GACLxC,EAAI,EAAGC,GAFZgB,EAAM3V,EAAO2N,MAAM,MAEGlP,OAAQiW,EAAIC,EAAKD,IACrCN,EAAOuB,EAAIjB,GACXwC,EAAQ7N,KAAKuJ,SAASwB,EAAM,KAE9B,OAAO8C,C,CARA,GAYPG,OAAQA,E,EAIZ9D,EAAO+C,KAAKU,OAAS,SAAShX,GAC5B,IAAI8X,EAAMpD,EAAGC,EAAKK,EAAOI,EAAOD,EAAQkC,EACxC,GAAI1D,EAAoB,OAAEwF,KAAKnZ,GAC7B,OAAOsT,EAAWtT,EAAQ,GACrB,IAAIgV,EAAQhV,EAAOgV,MAAMrB,EAA0B,iBACxD0D,EAASrC,EAAM,IAAM,IACrB8C,EAAOxE,EAAW0B,EAAM,GAAGxE,MAAM,GAAI,GAAK6G,EAAQ,IACzCD,OAAO,CAEd,IAAK1C,EAAI,EAAGC,GADZQ,EAAS,CAACvC,SAASoC,EAAM,IAAKpC,SAASoC,EAAM,IAAKpC,SAASoC,EAAM,IAAKpC,SAASoC,EAAM,MAC5DvW,OAAQiW,EAAIC,EAAKD,IAExC,KAAO,IADPU,EAAQD,EAAOT,KACMU,GAAS,KAC5B,OAAO,KAKX,OAFA0C,EAAKV,MAAM/N,KAAK8L,EAAO,IAAM,EAAIA,EAAO,IACxC2C,EAAKV,MAAM/N,KAAK8L,EAAO,IAAM,EAAIA,EAAO,IACjC,CACLiC,MAAOU,EAAKV,MACZC,OAAQS,EAAKT,O,CAInB,OAAO,I,EAGT9D,EAAO2B,KAAKkE,OAAS7F,EAAO+C,KAAK+C,OAAS,SAASrZ,GACjD,OAA+B,OAAxBwJ,KAAKwN,OAAOhX,E,EAGrBuT,EAAO2B,KAAKoE,QAAU,SAAStZ,GAE7B,IAEE,OADA,IAAIwJ,KAAKA,KAAKwN,OAAOhX,KACd,C,CACP,MAAOuZ,GAEP,OAAO,C,GAIXhG,EAAO2B,KAAKsE,uBAAyB,SAASxZ,GAC5C,SAAIuT,EAAO2B,KAAKoE,QAAQtZ,KAAWA,EAAOgV,MAAM,qC,EAOlDzB,EAAO+C,KAAKgD,QAAU,SAAStZ,GAC7B,IAAI8X,EACJ,GAAsB,iBAAX9X,IAAgD,IAAzBA,EAAOgS,QAAQ,KAC/C,OAAO,EAET,IAGE,OADA,IAAIxI,MADJsO,EAAOtO,KAAKwN,OAAOhX,IACLoX,MAAOU,EAAKT,SACnB,C,CACP,MAAOkC,GAEP,OAAO,C,GAIXhG,EAAO2B,KAAKnG,MAAQ,SAAS/O,GAC3B,IAAIoX,EAEJ,GAAc,QADdA,EAAQ5N,KAAKwN,OAAOhX,IAElB,MAAM,IAAIyN,MAAM,mDAElB,OAAO,IAAIjE,KAAK4N,E,EAGlB7D,EAAO+C,KAAKvH,MAAQ,SAAS/O,GAC3B,IAAI8X,EAEJ,GAAmB,QADnBA,EAAOtO,KAAKwN,OAAOhX,IACVoX,MACP,MAAM,IAAI3J,MAAM,mDAElB,OAAO,IAAIjE,KAAKsO,EAAKV,MAAOU,EAAKT,O,EAGnC9D,EAAO2B,KAAKuE,UAAY,SAASzZ,GAC/B,IAAI0Z,EAAY1E,EAAO2E,EACvB,IAAI3E,EAAQhV,EAAOgV,MAAM,oBACvB0E,EAAa9G,SAASoC,EAAM,MACV,GAAK0E,GAAc,GAOnC,OANAC,EAAS,CAACnQ,KAAKuF,MAAMiG,EAAM,IAAK0E,GAChCvU,OAAOyU,eAAeD,EAAQ,WAAY,CACxCpZ,MAAO,WACL,OAAOiJ,KAAKiG,KAAK,I,IAGdkK,EAGX,MAAM,IAAIlM,MAAM,0D,EAGlB8F,EAAO2B,KAAK2E,2BAA6B,SAASC,GAChD,IAAIC,EAAkBC,EAAG7E,EAEzB,IADA2E,EAASlH,SAASkH,IACL,GAAKA,EAAS,GACzB,MAAM,IAAIrM,MAAM,sCAKlB,IAHA0H,EAAS,CAAC,EAAG,EAAG,EAAG,GACnB6E,EAAI,EACJD,EAAmB7W,KAAKC,MAAM2W,EAAS,GAChCE,EAAID,GACT5E,EAAO6E,GAAK,IACZA,IAKF,OAHID,EAAmB,IACrB5E,EAAO4E,GAAoB7W,KAAK+W,IAAI,EAAGH,EAAS,GAAK,GAAK,EAAKA,EAAS,GAEnE,IAAItQ,KAAK2L,E,EAGlB5B,EAAO2B,KAAKgF,yBAA2B,SAASla,GAC9C,IAAIwW,EAAMC,EAAU0D,EAAmBhF,EAAQiF,EAC/C,IAME,IAJAD,GADA3D,EAAOhN,KAAKiQ,UAAUzZ,IACG,GAAGwV,cAC5B4E,EAAmB5Q,KAAKqQ,2BAA2BrD,EAAK,IAAIhB,cAC5DL,EAAS,GACTsB,EAAI,EACGA,EAAI,GACTtB,EAAO9L,KAAKuJ,SAASuH,EAAkB1D,GAAI,IAA0C,IAApC7D,SAASwH,EAAiB3D,GAAI,KAC/EA,IAEF,OAAO,IAAIjN,KAAK2L,E,CAChB,MAAOoE,GAEP,MAAM,IAAI9L,MAAM,qD,GAIpB8F,EAAO2B,KAAKmF,uBAAyB,SAASra,GAC5C,IAAIwW,EAAMC,EAAU0D,EAAmBhF,EAAQiF,EAC/C,IAME,IAJAD,GADA3D,EAAOhN,KAAKiQ,UAAUzZ,IACG,GAAGwV,cAC5B4E,EAAmB5Q,KAAKqQ,2BAA2BrD,EAAK,IAAIhB,cAC5DL,EAAS,GACTsB,EAAI,EACGA,EAAI,GACTtB,EAAO9L,KAAKuJ,SAASuH,EAAkB1D,GAAI,IAAM7D,SAASwH,EAAiB3D,GAAI,KAC/EA,IAEF,OAAO,IAAIjN,KAAK2L,E,CAChB,MAAOoE,GAEP,MAAM,IAAI9L,MAAM,qD,GAIpB8F,EAAO+C,KAAKmD,UAAY,SAASzZ,GAC/B,IAAI0Z,EAAY1E,EAAO2E,EACvB,IAAI3E,EAAQhV,EAAOgV,MAAM,oBACvB0E,EAAa9G,SAASoC,EAAM,MACV,GAAK0E,GAAc,IAOnC,OANAC,EAAS,CAACnQ,KAAKuF,MAAMiG,EAAM,IAAK0E,GAChCvU,OAAOyU,eAAeD,EAAQ,WAAY,CACxCpZ,MAAO,WACL,OAAOiJ,KAAKiG,KAAK,I,IAGdkK,EAGX,MAAM,IAAIlM,MAAM,0D,EAGlB8F,EAAO+F,QAAU,SAAStZ,GACxB,OAAOuT,EAAO+C,KAAKgD,QAAQtZ,IAAWuT,EAAO2B,KAAKoE,QAAQtZ,E,EAG5DuT,EAAOxE,MAAQ,SAAS/O,GACtB,GAAIuT,EAAO+C,KAAKgD,QAAQtZ,GACtB,OAAOuT,EAAO+C,KAAKvH,MAAM/O,GACpB,GAAIuT,EAAO2B,KAAKoE,QAAQtZ,GAC7B,OAAOuT,EAAO2B,KAAKnG,MAAM/O,GAEzB,MAAM,IAAIyN,MAAM,uD,EAIpB8F,EAAOkG,UAAY,SAASzZ,GAE1B,IACE,OAAOuT,EAAO+C,KAAKmD,UAAUzZ,E,CAC7B,MAAOuZ,GAEP,IACE,OAAOhG,EAAO2B,KAAKuE,UAAUzZ,E,CAC7B,MAAOuZ,GAEP,MAAM,IAAI9L,MAAM,4D,IAKtB8F,EAAO+G,cAAgB,SAASzC,GAC9B,IAAIpZ,EAEJ,GAAe,KADfA,EAASoZ,EAAMpZ,QAEb,OAAO,IAAI8U,EAAO2B,KAAK2C,GAClB,GAAe,KAAXpZ,EACT,OAAO,IAAI8U,EAAO+C,KAAKuB,GAEvB,MAAM,IAAIpK,MAAM,+D,EAIpB8F,EAAOgH,QAAU,SAASva,GACxB,IAAI8X,EAEJ,MAAoB,UADpBA,EAAOtO,KAAKuF,MAAM/O,IACT+U,QAAqB+C,EAAKU,sBAC1BV,EAAKW,gBAELX,C,CAIZ,GAAEE,KAAKwC,E,qBC7pBR,MAAMC,EAAY,SAAU/O,GACzB,IAAKgP,EAAUhP,GACZ,MAAM,IAAI+B,MAAM,oBAAsB/B,GAIzC,MAAMiP,GAFNjP,EAAIA,EAAEyF,eAEOxD,MAAM,SACnB,GAAIgN,EAAGlc,OAAS,EACb,MAAM,IAAIgP,MAAM,oBAAsB/B,GAGzC,IAAIkP,EAAW,GACf,GAAiB,GAAbD,EAAGlc,QAGJ,GADAmc,EAAWlP,EAAEiC,MAAM,OACK,IAApBiN,EAASnc,OACV,MAAM,IAAIgP,MAAM,oBAAsB/B,QAErC,GAAiB,GAAbiP,EAAGlc,OAAa,CAExB,MAAMoc,EAAIF,EAAG,GACPG,EAAIH,EAAG,GACPI,EAAKF,EAAElN,MAAM,OACbqN,EAAKF,EAAEnN,MAAM,OACnB,IAAK,IAAI8I,KAAKsE,EACXH,EAASnE,GAAKsE,EAAGtE,GAEpB,IAAK,IAAIA,EAAIuE,EAAGvc,OAAQgY,EAAI,IAAKA,EAC9BmE,EAAS,GAAKI,EAAGvc,OAASgY,IAAMuE,EAAGvE,EAAI,E,CAG7C,IAAK,IAAIA,EAAI,EAAGA,EAAI,IAAKA,OACF5J,IAAhB+N,EAASnE,KACVmE,EAASnE,GAAK,QAEjBmE,EAASnE,GAAKwE,EAASL,EAASnE,GAAI,IAAK,GAE5C,OAAOmE,EAASnL,KAAK,I,EAGlByL,EAAa,SAAUxP,GAC1B,IAAKgP,EAAUhP,GACZ,MAAM,IAAI+B,MAAM,oBAAsB/B,GAQzC,MAAMkP,GADNlP,GADAA,GADAA,GADAA,GADAA,GADAA,EAAI+O,EAAU/O,IACRzL,QAAQ,QAAS,MACjBA,QAAQ,SAAU,MAClBA,QAAQ,QAAS,MACjBA,QAAQ,OAAQ,MAChBA,QAAQ,KAAM,MACD0N,MAAM,OACzB,IAAIwN,GAAgB,EAChBC,GAAkB,EAClBC,EAAa,EACbC,GAAe,EACfC,EAAU,EACd,IAAK,IAAI9E,EAAI,EAAGA,EAAI,IAAKA,EAAG,CACzB,MAAM+E,EAAUZ,EAASnE,GACzB,IAAIgF,EAAqB,MAAZD,EACTC,IAAUN,IACXG,EAAc7E,IAEZgF,GAASN,IACXI,EAAU9E,EAAI6E,GAEbC,EAAU,GAAKA,EAAUF,IAC1BD,EAAiBE,EACjBD,EAAaE,GAEhBJ,EAA6B,MAAZK,C,CAsBpB,OApBIL,IACDI,EAAU,EAAID,GAEbC,EAAU,GAAKA,EAAUF,IAC1BD,EAAiBE,EACjBD,EAAaE,GAIZH,GAAkB,GAAKC,EAAa,GACrCT,EAASc,OAAON,EAAgBC,EAAY,KAQ/C3P,GADAA,GADAA,GADAA,GAFAA,EAAIkP,EAASnL,KAAK,MAEZxP,QAAQ,SAAU,OAClBA,QAAQ,OAAQ,OAChBA,QAAQ,OAAQ,OAChBA,QAAQ,KAAM,K,EAMjBya,EAAY,SAAUhP,GACzB,MAAO,mBAAmByN,KAAKzN,E,EAG5BuP,EAAW,SAAUU,EAAGC,EAAGf,GAC9B,MAAMgB,EAAUD,EAAEE,OAAOjB,GAIzB,OAHIc,EAAEld,OAASod,EAAQpd,SACpBkd,EAAIE,EAAQjE,UAAU,EAAGiE,EAAQpd,OAASkd,EAAEld,QAAUkd,GAElDA,C,EAGJI,EAAW,SAAUC,GACxB,OAAOpJ,SAASoJ,EAAK,IAAI1G,SAAS,E,EAE/B2G,EAAW,SAAUC,GACxB,OAAOtJ,SAASsJ,EAAK,GAAG5G,SAAS,G,EAG9B6G,EAAY,SAAUrE,GACzB,MACM8C,EADQH,EAAU3C,GACDnK,MAAM,KAC7B,IAAIyO,EAAU,GACd,IAAK,MAAMZ,KAAWZ,EACnBwB,GAAWnB,EAASc,EAASP,GAAU,IAAK,IAE/C,OAAOY,C,EAGJC,EAAY,SAAUH,GACzB,MAAMpE,EAAO,GACb,IAAK,IAAIrB,EAAI,EAAGA,EAAI,IAAKA,EAAG,CACzB,MAAM6F,EAAUJ,EAAIhD,OAAW,GAAJzC,EAAQ,IAC7B8F,EAAatB,EAASgB,EAASK,GAAU,IAAK,GACpDxE,EAAKzO,KAAKkT,E,CAEb,OAAOzE,EAAKrI,KAAK,I,EAGd+M,EAAe,SAAU1E,EAAM2E,EAAOC,EAAOC,EAAOC,GACvD,IAAKlC,EAAU5C,GACZ,MAAM,IAAIrK,MAAM,oBAAsBqK,GAMzC,GAFA6E,GAAS,EACTD,GAFAA,GAAS,IAEQ,KAHjBD,GAAS,GAIG,GAAKC,EAAQ,GAAKD,EAAQ,KAAOC,EAAQ,KAAOD,EAAQC,EACjE,MAAM,IAAIjP,MAAM,kBAEnB,MAAMoP,EAAM,GAENC,EADUX,EAAUrE,GACCoB,OAAO,EAAGuD,GAC/BM,EAAc,IAAIjB,OAAO,IAAMY,GAC/BM,EAAa9Z,KAAK+W,IAAI,EAAGyC,EAAQD,GACvC,IAAK,IAAIhG,EAAI,EAAGA,EAAIuG,KACXL,GAASlG,GAAKkG,KADWlG,EAAG,CAIlC,MAAMwG,EAAYhC,EAASxE,EAAEnB,SAAS,GAAI,IAAKoH,EAAQD,GAEjDS,EAAUb,EADGS,EAAaG,EAAYF,GAEtCH,EACHC,EAAIxT,KAAK6R,EAAWgC,IAEpBL,EAAIxT,KAAK6T,E,CAQf,OAAOL,C,EAGJzG,EAAQ,SAAU0B,EAAM2E,EAAOC,EAAOE,GACzC,IAAKlC,EAAU5C,GACZ,MAAM,IAAIrK,MAAM,oBAAsBqK,GAKzC,GADA4E,GADAA,GAAS,IACQ,KAFjBD,GAAS,GAGG,GAAKC,EAAQ,GAAKD,EAAQ,KAAOC,EAAQ,KAAOD,EAAQC,EACjE,MAAM,IAAIjP,MAAM,kBAEnB,MACMqP,EADUX,EAAUrE,GACCoB,OAAO,EAAGuD,GAC/BM,EAAc,IAAIjB,OAAO,IAAMY,GAC/BS,EAAeL,EAAa,IAAIhB,OAAOY,EAAQD,GAASM,EACxDK,EAAaN,EAAa,IAAIhB,OAAOY,EAAQD,GAASM,EAC5D,OAAMH,EACI,CACJS,MAAOnC,EAAWmB,EAAUc,IAC5BG,IAAKpC,EAAWmB,EAAUe,IAC1BG,KAAMra,KAAK+W,IAAI,EAAGyC,EAAQD,IAGtB,CACJY,MAAOhB,EAAUc,GACjBG,IAAKjB,EAAUe,GACfG,KAAMra,KAAK+W,IAAI,EAAGyC,EAAQD,G,EAK7Be,EAAe,SAAU1F,EAAM2E,EAAOC,EAAOC,EAAOC,GACvD,IAAKlC,EAAU5C,GACZ,MAAM,IAAIrK,MAAM,oBAAsBqK,GAOzC,GAFA4E,GAFAA,GAAS,IAEQ,IACjBC,GAFAA,GAAS,IAEQ,GAJjBF,GAAS,GAKG,GAAKC,EAAQ,GAAKD,EAAQ,KAAOC,EAAQ,KAAOD,EAAQC,EACjE,MAAM,IAAIjP,MAAM,kBAEnB,MAAMoP,EAAM,GAENC,EADUX,EAAUrE,GACCoB,OAAO,EAAGuD,GAC/BM,EAAc,IAAIjB,OAAO,IAAMY,GAC/BM,EAAa9Z,KAAK+W,IAAI,EAAGyC,EAAQD,GACvC,IAAK,IAAIhG,EAAI,EAAGA,EAAIuG,GAAcvG,EAAIkG,IAASlG,EAAG,CAE/C,IAAIwG,EAAY,GAChB,IAAK,IAAIjD,EAAI,EAAGA,EAAI0C,EAAQD,IAASzC,EAClCiD,GAAa/Z,KAAKC,MAAsB,EAAhBD,KAAKua,UAEhC,MACMP,EAAUb,EADGS,EAAaG,EAAYF,GAEtCH,EACHC,EAAIxT,KAAK6R,EAAWgC,IAEpBL,EAAIxT,KAAK6T,E,CAOf,OAAOL,C,EAGJa,EAAM,SAAU5F,EAAM6F,GACzB,IAAKjD,EAAU5C,GACZ,MAAM,IAAIrK,MAAM,oBAAsBqK,GAGzC,IADA6F,GAAQ,GACG,GAAKA,EAAO,KAAOza,KAAKC,MAAMwa,EAAO,IAAMA,EAAO,EAC1D,MAAM,IAAIlQ,MAAM,kBAInB,OAFiBgN,EAAU3C,GACF7X,QAAQ,KAAM,IAAI0N,MAAM,IAAIwJ,UACtC3G,MAAM,GAAI,IAAMmN,GAAQ,GAAGlO,KAAK,I,EAI/CsE,EAAA0G,UAAoBA,EACpB1G,EAAAmH,WAAqBA,EACrBnH,EAAAyI,aAAuBA,EACvBzI,EAAAqC,MAAgBA,EAChBrC,EAAAyJ,aAAuBA,EACvBzJ,EAAA2J,IAAcA,C,iFCjQD3Q,EAAK+K,GACnB,OAAOvE,EAAO+F,QAAQxB,E,CAGxB,SAAgBnN,EAAQmN,GACtB,IACE,IACM/C,EADaxB,EAAOxE,MAAM+I,GACR/C,OAExB,MAAa,SAATA,EACK,EACW,SAATA,EACF,EAGA,C,CAET,MAAO6I,GACP,OAAO,C,EAIX,SAAgB5Q,EAAK8K,GACnB,OAAyB,IAAlBnN,EAAQmN,E,CAGjB,SAAgB7K,EAAK6K,GACnB,OAAyB,IAAlBnN,EAAQmN,E,CAGjB,SAAgBhL,EAAQsJ,GACtB,IACe7C,EAAOkG,UAAUrD,GAC9B,OAAO,C,CACP,MAAOwH,GACP,OAAO,C,EAIX,SAAgBC,EAAQ/F,EAAc1B,GACpC,GAAqB,iBAAVA,EAmBJ,IAAIA,GAA0B,iBAAVA,EAAoB,CAE7C,IAAK,IAAM0H,KAAe1H,EACxB,IAA0C,IAAtCyH,EAAQ/F,EAAM1B,EAAM0H,IACtB,OAAO,EAGX,OAAO,C,CAEP,OAAO,C,CA3BP,IAA4B,IAAxB1H,EAAMpE,QAAQ,KAgBhB,OAHA8F,EAAO7K,EAAK6K,GAAQiG,EAAItD,UAAU3C,GAAQA,EAGnC/K,EAFPqJ,EAAQnJ,EAAKmJ,GAAS2H,EAAItD,UAAUrE,GAASA,IAEb0B,IAAS1B,EAfzC,IACE,IAAM4H,EAAa5H,EAAMzI,MAAM,KAEzBsQ,EAAa1K,EAAOxE,MAAM+I,GAC1BoG,EAAc3K,EAAOxE,MAAMiP,EAAW,IAG5C,OAAOC,EAAWjJ,MAAMkJ,EAAaF,EAAW,G,CAChD,MAAOJ,GACP,OAAO,C,EAqBf,SAAgBO,EAAQrG,GACtB,IACE,IAAImG,EAAa1K,EAAOxE,MAAM+I,GAC1B/C,EAAOkJ,EAAWlJ,OAEtB,MAAa,SAATA,EAEK+C,EACW,SAAT/C,EAELkJ,EAAWzF,sBAGNyF,EAAWxF,gBAAgBnD,WAG3ByI,EAAI7C,WAAWpD,GAGjB,I,CAET,MAAO8F,GACP,OAAO,I,EAIX,SAGgBQ,EAAUtG,GACxB,IACE,IAAImG,EAAa1K,EAAOxE,MAAM+I,GAC1B/C,EAAOkJ,EAAWlJ,OAEtB,MAAa,SAATA,EAEK+C,EACW,SAAT/C,EAELkJ,EAAWzF,sBAGNyF,EAAWxF,gBAAgBnD,WAG3ByI,EAAItD,UAAU3C,GAGhB,E,CAET,MAAO8F,GACP,MAAO,E,cCzHV,SAAU1e,GAEV,MAKMmf,EAE2B,wBAF3BA,EAG2B,eAH3BA,EAI2B,EAJ3BA,EAK2B,GAGjCnf,EAAI+T,eAAwB,EAC5B/T,EAAI8C,uBAAwB,EAE5B9C,EAAIof,0BAA4B,IAAMpf,EAAIG,aAAagf,IAA8BA,EAErFnf,EAAIqf,wBAA0B9e,SAGzBP,EAAIG,aAAagf,GACbnf,EAAIG,aAAagf,SAGZnf,EAAIsf,eAWlBtf,EAAIsf,aAAe/e,MAClB8B,EAAarC,EAAIuf,KAAOJ,EACxBK,EAAaL,KAGb,IAEC,MAAM/Q,QAAiBC,MAAMhM,EAAK,CACjCod,OAAW,OACXC,KAAW,OACXC,MAAW,WACXC,WAAW,EACXC,SAAW,UAGZ,IAAKzR,EAASE,GAGb,OAFAtO,EAAIE,UAAUsf,GAAY,GAC1B7e,IAAIrB,QAAQE,MAAM,uCAAyC4O,EAASI,OAAS,gBAAiBJ,IACvF,EAGR,MAAM0R,QAAqB1R,EAASc,OAGpC,OAAK4Q,EAAaC,SAMlB/f,EAAIE,UAAUsf,GAAY,IACnB,IANNxf,EAAIE,UAAUsf,GAAY,GAC1B7e,IAAIrB,QAAQE,MAAM,8CAAgDoQ,KAAKoQ,UAAUF,KAC1E,EAMT,CAAE,MAAOnd,GAGR,OAFA3C,EAAIE,UAAUsf,GAAY,GAC1B7e,IAAIrB,QAAQE,MAAM,sCAAwCmD,IACnD,CACR,GAGD3C,EAAIigB,2BAA6B,CAACT,EAAaL,MAAqDnf,EAAIG,aAAaqf,GAarHxf,EAAIgF,sBAAwB,CAACkb,EAASC,EAAUC,EAAS,mBAGxD,IAAIC,EAAWrgB,EAAIG,aAAa,YAAY,IAAS,GAGrDkgB,EAASlW,KAAK+V,GAGdlgB,EAAIE,UAAU,WAAYmgB,GAAU,GAEI,mBAA7BrgB,EAAIsgB,sBACdtgB,EAAIsgB,qBAAqB,CACxBJ,QAAUA,EACVC,SAAUA,EACVC,OAAUA,KAKbpgB,EAAI+E,gBAAkBmb,IAGrB,IAAKtgB,aAAa4E,KAAK+b,6BAEtB,OADA5f,IAAIrB,QAAQJ,IAAI,wCACT,EAIR,OADiBc,EAAIG,aAAa,YAAY,IAAS,IACvCuP,SAASwQ,IAa1BlgB,EAAI8T,QAAU0M,GAOC,IAAI5I,OACjB,6KAMYqC,KAAKuG,GAGnBxgB,EAAI0C,sBAAwBnC,MAAOiC,EAAWie,EAAmB,QAEhE,IAEC,IAAKje,EAAW,MAAM+L,MAAM,uCAI5B,KAFA/L,EAAYxC,EAAI4T,qCAAqCpR,IAErC,MAAM+L,MAAM,uCAE5B,IAAI3F,EAGHA,EADuB,MAApB6X,EACQ7gB,aAAasU,KAAK1R,GAAWoG,SAE7B6X,EAGP7gB,aAAasU,KAAK1R,UAChBxC,EAAIqD,uBAAuB,CAACb,IAGnC,IAAIoC,EAAU5E,EAAI6T,mCAAmCrR,EAAWoG,GAEhE3H,OAAOc,UAAUC,QAAQ,uBAAwB4C,GAEzB,MAApB6b,GAA4B7gB,aAAasU,KAAK1R,GAAWoG,WAAa6X,SAClE7gB,aAAasU,KAAK1R,GAEzB5C,aAAasU,KAAK1R,GAAWoG,SAAWhJ,aAAasU,KAAK1R,GAAWoG,SAAWA,EAGjF5I,EAAI0gB,cAAc9gB,aAAasU,KAEhC,CAAE,MAAOvR,GACRhC,IAAIrB,QAAQE,MAAM,UAAWmD,EAC9B,GAGD3C,EAAI4T,qCAAuCpR,IAE1C,IACC,OAAI5C,cAAc4E,MAAMmc,kBAA0Bne,EAE9C5C,aAAasD,SAASV,GAAWoe,aAAqBhhB,aAAasD,SAASV,GAAWqe,UAEpFre,CAER,CAAE,MAAOG,GACRrD,QAAQE,MAAMmD,EACf,GAGD3C,EAAI6C,iBAAmB,CAACie,EAAWC,KAE9BnhB,cAAc4E,MAAMsc,YAAYC,KAGnCD,EAAYA,EAAU1O,OAAOxS,aAAa4E,KAAKsc,UAAUC,KAGzDD,EAAY,IAAI,IAAIE,IAAIF,KAGVhO,QAAQ,aAAe,GACpCgO,EAAUtE,OAAOsE,EAAUhO,QAAQ,YAAa,GAI7CgO,EAAUhO,QAAQ,SAAW,IAChCgO,EAAY,CAAC,UAIRA,EAAUvQ,KAAK,OAIvBvQ,EAAI4S,iBAAmBrS,MAAOiC,EAAWoG,KAGxCA,EAAWiK,OAAOjK,GAElB,IAEC,IAAKpG,EAAW,MAAM+L,MAAM,uCAI5B,KAFA/L,EAAYxC,EAAI4T,qCAAqCpR,IAErC,MAAM+L,MAAM,uCAEvB3O,cAAcsD,SAASV,UACrBxC,EAAIqD,uBAAuB,CAACb,IAGnC,IAAIoC,EAAU5E,EAAI6T,mCAAmCrR,EAAWoG,GAEhE3H,OAAOc,UAAUC,QAAQ,kBAAmB4C,GAMxChF,cAAcsU,KAAK1R,GAEtB5C,aAAasU,KAAK1R,GAAWoG,SAAWhJ,aAAasU,KAAK1R,GAAWoG,SAAWA,GAG1E,SAAUhJ,eAAeA,aAAasU,KAAO,CAAC,GAEpDtU,aAAasU,KAAK1R,GAAaxC,EAAI6T,mCAAmCrR,EAAWoG,IAGlF5I,EAAI0gB,cAAc9gB,aAAasU,KAEhC,CAAE,MAAOvR,GACRrD,QAAQE,MAAMmD,GAGd3C,EAAImU,yBACL,GAGDnU,EAAIiD,SAAW,KAKZjD,EAAIihB,4BAC6C,IAA/Chb,OAAOgC,KAAKjI,EAAIkhB,oBAAoB3hB,OAOpCS,EAAIkhB,mBACPlhB,EAAImhB,0BAA0BnhB,EAAIkhB,qBAKnClhB,EAAI0gB,cAAc,CAAC,GACnB1gB,EAAImU,2BAZHnU,EAAI0gB,cAAc,CAAC,IAgBrB1gB,EAAImU,wBAA0B,KAC7B,IAcC9F,MAAMrO,EAAIohB,SAAU,CACnB3B,OAAW,OACXE,MAAW,WACX0B,KAAW,IAAIC,gBAAgB,CAACC,OAAQ,uBACxC3B,WAAW,EACXC,SAAW,UAEVlU,KAAKyC,IACL,GAAIA,EAASE,GACZ,OAAOF,EAASc,OAEhB,MAAMX,MAAM,2CAGb5C,KAAK7F,IAEL,IAAIA,EAAKia,QAOR,MAAMxR,MAAM,yCALPzI,EAAKA,KAAW,OAAGA,EAAKA,KAAW,KAAI,CAAC,GAC7C9F,EAAImhB,0BAA0Brb,EAAKA,KAAW,MAC9C9F,EAAI0gB,cAAc5a,EAAKA,KAAW,OAOtC,CAAE,MAAOnD,GACRrD,QAAQE,MAAMmD,EACf,GAID3C,EAAIqD,uBAAyB9C,UAQ5B,GANIX,cAAcsD,WAEjBC,EAAaA,EAAW0J,OAAOrK,KAAeA,KAAa5C,aAAasD,YAIpEC,GAAoC,IAAtBA,EAAW5D,QAGzBK,aAAaC,QAAQ2hB,SAGrBzR,MAAMC,QAAQ7M,IAAqC,IAAtBA,EAAW5D,OAA7C,CAEA,IAEC,IAAIuG,EAAO,CACVyb,OAAa,sBACbC,QAAa5hB,aAAaC,QAAQ2hB,QAClC/c,UAAa7E,aAAa4E,KAAKC,UAC/Bgd,YAAate,GAGd,MAAMkc,QAAgCrf,EAAIqf,0BACpChd,EAA0Bgd,EAA0Brf,EAAIuf,KAAO,mBAAqBvf,EAAIohB,SAExFM,EAAU,CACfjC,OAAQ,OACRE,MAAQ,WACR0B,KAAQhC,EAA0BzP,KAAKoQ,UAAUla,GAAQ,IAAIwb,gBAAgBxb,IAI1EuZ,IACHqC,EAAQC,QAAU,CAAC,eAAgB,qBAGpC,IAAIvT,QAAiBC,MAAMhM,EAAKqf,GAEhC,IAAKtT,EAASE,GACb,MAAM,IAAIC,MAAM,gDAAkDH,EAASI,OAAS,iBAAmBJ,EAASwT,YAGjH,IAAIC,QAAqBzT,EAASc,OAElC,IAAK2S,EAAa9B,QACjB,MAAM,IAAIxR,MAAM,wCAA0CsT,EAAa/b,MAGxElG,aAAasD,SAAW+C,OAAO6b,OAAO,CAAC,EAAGliB,aAAasD,SAAU2e,EAAa/b,KAE/E,CAAE,MAAOnD,GACRrD,QAAQE,MAAMmD,EACf,CAEA,OAAO,CA3C0D,GA8ClE3C,EAAImhB,0BAA4BY,IAE/BniB,aAAasU,KAAW6N,EACxBniB,aAAasD,SAAW+C,OAAO6b,OAAO,CAAC,EAAGliB,aAAasD,SAAU6e,IAGlE/hB,EAAIoG,yBAA2B7F,UAEzBX,cAAcsD,SAASV,UACrBxC,EAAIqD,uBAAuB,CAACb,IAG9B5C,cAAcsD,SAASV,GAI3BxC,EAAIgiB,qBAAqBxf,IAHzBxC,EAAIiiB,gCACJthB,IAAIrB,QAAQJ,IAAI,mBAAmBsD,gIAMrCxC,EAAIgiB,qBAAuBxf,IAE1B,IAAIoC,EAAU5E,EAAI6T,mCAAmCrR,GAEhDoC,GAEL3D,OAAOc,UAAUC,QAAQ,gBAAiB4C,IAG3C5E,EAAIiiB,8BAAgC,KACnChhB,OAAOc,UAAUC,QAAQ,kBAG1BhC,EAAIgD,mBAAqB,CAACkf,EAAMC,EAAkB,KAAM9gB,EAAQ,QAE/D,IAAIyE,EAAO,CACVoc,KAAiBA,EACjBC,gBAAiBA,EACjB9gB,MAAiBA,GAGlBJ,OAAOc,UAAUC,QAAQ,sBAAuB8D,IAGjD9F,EAAI+C,qBAAuBmf,IAE1B,IAAIpc,EAAO,CACVoc,KAAMA,GAGPjhB,OAAOc,UAAUC,QAAQ,wBAAyB8D,IAGnD9F,EAAImT,oBAAsBrS,IAEzB,IACC,OAAOA,EAAOgV,MAAM,gBAAgB,EACrC,CAAE,MAAOnT,GACRrD,QAAQE,MAAMmD,EACf,GAGD3C,EAAIoiB,oBAAsB5f,IAEzB,IAAKA,EAAW,MAAM+L,MAAM,uCAI5B,KAFA/L,EAAYxC,EAAI4T,qCAAqCpR,IAErC,MAAM+L,MAAM,uCAE5BtN,OAAOc,UAAUC,QAAQ,qBAAsBhC,EAAI6E,+BAA+BrC,KAGnFxC,EAAI6E,+BAAiCrC,IAEpC,IAAKA,EAAW,MAAM+L,MAAM,uCAE5B,IACC,GAAI3O,aAAasD,SAASV,GAEzB,OAAOxC,EAAI6T,mCAAmCrR,EAEhD,CAAE,MAAOG,GACRrD,QAAQE,MAAMmD,EACf,GAGD3C,EAAI2E,gCAAkC,KAErC,IACC,MAAI,CAAC,SAAU,WAAY,UAAW,YAAa,UAAUmO,QAAQlT,aAAa4E,KAAKE,eAAiB,GAChGzD,OAAO,uBAAuB6E,KAAK,KAI5C,CAAE,MAAOnD,GACRrD,QAAQE,MAAMmD,EACf,GAGD3C,EAAIqiB,4BAA8BjhB,IAEjCH,OAAOG,GAAQkhB,IAAI,CAAC,SAAY,aAChCrhB,OAAOG,GAAQmhB,OAAO,+CACtBthB,OAAOG,GAAQO,KAAK,+BAA+B2gB,IAAI,CACtD,UAAoB,KACpB,QAAoB,QACpB,SAAoB,WACpB,OAAoB,OACpB,IAAoB,IACpB,KAAoB,IACpB,MAAoB,IACpB,QAAoB1iB,aAAa4E,KAAKge,uBAAuBC,QAC7D,mBAAoB7iB,aAAa4E,KAAKge,uBAAuBE,oBAI/D1iB,EAAI2iB,qBAAuB,KAE1B,IAEC,OADoB,IAAIrB,gBAAgBjhB,OAAOoD,SAASmf,QACnCnP,IAAI,IAC1B,CAAE,MAAO9Q,GACRrD,QAAQE,MAAMmD,EACf,GAID,IA4CIkgB,EA5CAC,EAAa,CAAC,EAElB9iB,EAAI+iB,iBAAmB,CAAC7c,EAAS8c,KAEhC9c,EAAQ2K,QAASoS,IAEhB,IACC,IAAIzgB,EAEA0gB,EAAYjiB,OAAOgiB,EAAM7hB,QAAQ0E,KAAK,QAY1C,GANCtD,EAFGvB,OAAOgiB,EAAM7hB,QAAQ+hB,KAAK,iBAAiB5jB,OAElC0B,OAAOgiB,EAAM7hB,QAAQ+hB,KAAK,iBAAiBrd,KAAK,MAEhD7E,OAAOgiB,EAAM7hB,QAAQO,KAAK,iBAAiBmE,KAAK,OAIxDtD,EAAW,MAAM+L,MAAM,kCAExB0U,EAAMG,eAETN,EAAWI,GAAalY,WAAW,KAElChL,EAAIoiB,oBAAoB5f,GACpB5C,aAAa4E,KAAKge,uBAAuBa,WAAWrjB,EAAIqiB,4BAA4BY,EAAM7hB,SACtC,IAApDxB,aAAa4E,KAAKge,uBAAuB5F,QAAkBoG,EAASM,UAAUL,EAAM7hB,SACtFxB,aAAa4E,KAAKge,uBAAuBrX,UAI5CS,aAAakX,EAAWI,IACpBtjB,aAAa4E,KAAKge,uBAAuBa,WAAWpiB,OAAOgiB,EAAM7hB,QAAQO,KAAK,+BAA+B4hB,SAEnH,CAAE,MAAO5gB,GACRrD,QAAQE,MAAMmD,EACf,KAMF,IAAI6gB,EAAO,EAmHX,IAAIC,EAAiC,CACpCC,OAAQ,GACRC,KAAQ,IAGT,MAAMC,EAAiBC,GACC,CACtB,UACA,eACA,wBACGJ,EAA+BC,QAGXrW,KAAKyW,GAAa7iB,OAAO4iB,GAAMxQ,QAAQ,IAAMyQ,GAAWvkB,QAG3EwkB,EAAeF,GAEC,CACpB,yBACA,UACA,gBACA,kCACGJ,EAA+BE,MAGbtW,KAAKyW,GAAa7iB,OAAO4iB,GAAMG,OAAOC,SAASH,IAGhEI,EAAwBA,KAE7BT,EAhJmCU,MAEnC,IAAIC,EAAmB,CACtBV,OAAQ,GACRC,KAAQ,IAGT,IAEC,MAAMU,EAAuBA,CAACC,EAAUC,IAGhCtjB,OAAOqjB,GAAUE,UAAUjlB,SAAW0B,OAAOsjB,GAAUC,UAAUjlB,OAGnEklB,EAA0BA,CAACH,EAAUC,IAEtCtjB,OAAOqjB,GAAUI,SAASC,GAAG1jB,OAAOsjB,GAAUG,UAC1C,CACNE,KAAM3jB,OAAOqjB,GAAUI,SACvB3D,KAAM,QAID,CACN6D,KAAM3jB,OAAOqjB,GAAUE,UAAUhR,IAAIvS,OAAOsjB,GAAUC,WAAW1P,QACjEiM,KAAM,UAIF8D,EAAmB5R,GAEjBhS,OAAOgS,GAAStR,KAAK,iBAAiBpC,OAGxCulB,EAAiBA,CAACC,EAAUC,IAQ1BD,EAASlY,OAAOxL,GAAS2jB,EAAStV,SAASrO,IAAQ,IAAM,KAG3D4jB,EAAgBljB,SAASmjB,iBAAiB,iBAGhD,GAA6B,IAAzBD,EAAc1lB,OAEjB,OAAO6kB,EAMR,IAAK,IAAI7M,EAAI,EAAGA,EAAI0N,EAAc1lB,OAAS,EAAGgY,IAAK,CAIlD,IAAK8M,EAAqBY,EAAc1N,GAAI0N,EAAc1N,EAAI,IAAK,CAElEA,IACA,QACD,CAEA,IAAI4N,EAAeV,EAAwBQ,EAAc1N,GAAI0N,EAAc1N,EAAI,IAK/E,GAA0B,WAAtB4N,EAAapE,KAAmB,CAEnC,IAAIqE,EAAsBD,EAAaP,KAAKS,WAAWvQ,QAAQjT,KAAK,SAChEyjB,EAAsBF,EAAsBA,EAAoB3W,MAAM,KAAO,GAE7E8W,EAAuBJ,EAAaP,KAAKS,WAAWvQ,QAAQqO,OAAOthB,KAAK,SAG5E,MAAM2jB,EAAcV,EAAeQ,EAFRC,EAAuBA,EAAqB9W,MAAM,KAAO,IAIpF2V,EAAiBV,OAAOvZ,KAAKqb,EAC9B,MAAO,GAA0B,SAAtBL,EAAapE,KAAiB,CAGxC,IAAKoE,EAAaP,KAAKS,WAAWvQ,QAAQjT,KAAK,SAAU,SAGzD,IAAI4jB,EAA8BN,EAAaP,KAAKS,WAAWvQ,QAAQjT,KAAK,SAAS4M,MAAM,KAAK,GAEhG2V,EAAiBT,KAAKxZ,KAAKsb,EAC5B,CAKAlO,EAAIA,EAAIsN,EAAgBM,EAAaP,MAAQ,CAC9C,CAMA,OAHAR,EAAiBV,OAAS,IAAI,IAAI1C,IAAIoD,EAAiBV,SACvDU,EAAiBT,KAAS,IAAI,IAAI3C,IAAIoD,EAAiBT,OAEhDS,CAER,CAAE,MAAOzhB,GAER,OADArD,QAAQE,MAAMmD,GACPyhB,CACR,GAmCiCD,GAE1BljB,OAAO,iBACZykB,IAAI,SAAUnO,EAAGsM,GAEjB,OAAID,EAAcC,GACV5iB,OAAO4iB,GAAMa,SACVX,EAAYF,GACf5iB,OAAOqJ,MAAM0Z,OACV/iB,OAAO4iB,GAAMxQ,QAAQ,YAAY9T,OACpC0B,OAAO4iB,GAAMxQ,QAAQ,iBADtB,CAGR,IAGFrT,EAAIyJ,iCAAmC,KAEtC,IAEKzJ,EAAIC,gBAAgB,iBAAgBL,aAAa4E,KAAKge,uBAAuBa,WAAY,GAI7FR,EAAK,IAAI8C,qBAAqB3lB,EAAI+iB,iBAAkB,CACnDxD,KAAM,KAENqG,UAAWhmB,aAAa4E,KAAKge,uBAAuBoD,YAGrD1B,IAAwBnR,KAAK,CAACwE,EAAGsM,KAEhC5iB,OAAO4iB,EAAK,IAAI/d,KAAK,OAAQ0d,KAE7BX,EAAGgD,QAAQhC,EAAK,KAElB,CAAE,MAAOlhB,GACRrD,QAAQE,MAAMmD,EACf,GAID3C,EAAI0J,qCAAuC,KAE1C,IAKC,IAAIyb,EAAelkB,OAAO,uBAAuBujB,UAAUhR,IAAIvS,OAAO,uBAAuBujB,WAAW1P,QAEpGqQ,EAAa5lB,QAChBumB,EAAyBD,QAAQV,EAAa,GAAI,CACjDhf,YAAe,EACf4f,WAAe,EACfC,eAAe,GAGlB,CAAE,MAAOrjB,GACRrD,QAAQE,MAAMmD,EACf,GAID,MAAMmjB,EAA2B,IAAIG,iBAAiBC,IAErDA,EAAUrV,QAAQsV,IACjB,IAAIC,EAAWD,EAASE,WACxB,GAAiB,OAAbD,EAAmB,CACVnlB,OAAOmlB,GACbrT,KAAK,CAACwE,EAAGqN,MAMbhB,EAAcgB,IAASb,EAAYa,KAI/B0B,EAAuB1B,KAC1B3jB,OAAO2jB,GAAM9e,KAAK,OAAQ0d,KAC1BX,EAAGgD,QAAQjB,KAIf,MAIF,IAAI0B,EAAyBzC,MACzB5iB,OAAO4iB,GAAMliB,KAAK,iBAAiBpC,SACrC0B,OAAO4iB,GAAM0C,SAAS,iBAAiBhnB,QAgBzCS,EAAIwmB,UAAY,CAAChH,EAAYiH,EAAc,GAAIC,EAAa,QAE3D,GAAIA,EAAY,CAEf,IAAIjK,EAAI,IAAIvY,KACZuY,EAAEkK,QAAQlK,EAAEmK,UAA0B,GAAbF,EAAkB,GAAK,GAAK,KACrD,IAAIG,EAAc,WAAapK,EAAEqK,cACjC/kB,SAASglB,OAASvH,EAAa,IAAMiH,EAAc,IAAMI,EAAU,SACpE,MACC9kB,SAASglB,OAASvH,EAAa,IAAMiH,EAAc,WAcrDzmB,EAAIgnB,UAAYxH,IAEf,IAAIrW,EAAgBqW,EAAa,IAE7ByH,EADgBC,mBAAmBnlB,SAASglB,QACdtY,MAAM,KAExC,IAAK,IAAI8I,EAAI,EAAGA,EAAI0P,EAAG1nB,OAAQgY,IAAK,CAEnC,IAAI4P,EAAIF,EAAG1P,GAEX,KAAsB,KAAf4P,EAAEC,OAAO,IACfD,EAAIA,EAAEzO,UAAU,GAGjB,GAAuB,GAAnByO,EAAErU,QAAQ3J,GACb,OAAOge,EAAEzO,UAAUvP,EAAK5J,OAAQ4nB,EAAE5nB,OAEpC,CAEA,MAAO,IAaRS,EAAIqnB,2BAA8B7O,IAEjC,IAAI8O,EAAUvlB,SAASglB,OAAOtY,MAAM,KAEpC,IAAK,IAAI8I,EAAI,EAAGA,EAAI+P,EAAQ/nB,OAAQgY,IAAK,CACxC,IAAIwP,EAASO,EAAQ/P,GAAGvW,OAExB,GAAIwX,EAAMyB,KAAK8M,GACd,OAAOA,CAET,CAEA,OAAO,GAGR/mB,EAAIunB,aAAe/H,IAClBxf,EAAIwmB,UAAUhH,EAAY,IAAK,IAgBhCxf,EAAIE,UAAY,CAAC+E,EAAK5D,EAAOmmB,GAAa,EAAOC,GAAY,KAE5D,MAAM5O,EAAS4O,EAAYxiB,EAAM,GAEjC,IAAIyiB,EAAaF,EAAaxnB,EAAI2nB,kBAAoB3nB,EAAI4nB,eACtDC,EAAaL,EAAaxnB,EAAI8nB,kBAAoB9nB,EAAI+nB,eAEtDjiB,EAAO4hB,EAAW7O,GACtB4O,EAAY3hB,EAAOzE,EAAQyE,EAAKb,GAAO5D,EAEvCwmB,EAAW/hB,EAAM+S,IAGlB7Y,EAAIG,aAAe,CAAC8E,EAAKuiB,GAAa,EAAOC,GAAY,KAExD,MAAM5O,EAAS4O,EAAYxiB,EAAM,GAEjC,IAAIa,EAAO0hB,EAAaxnB,EAAI2nB,kBAAkB9O,GAAU7Y,EAAI4nB,eAAe/O,GAE3E,OAAO4O,EAAY3hB,EAAOA,EAAKb,IAGhCjF,EAAIgoB,cAAgB,CAAC/iB,EAAKuiB,GAAa,EAAOC,GAAY,KAEzD,MAAM5O,EAAS4O,EAAYxiB,EAAM,GAEjC,IAAIyiB,EAAaF,EAAaxnB,EAAI2nB,kBAAoB3nB,EAAI4nB,eACtDC,EAAaL,EAAaxnB,EAAI8nB,kBAAoB9nB,EAAI+nB,eAEtDjiB,EAAO4hB,EAAW7O,GAGtB,GAAI4O,EAEH,IACKD,GAAcnnB,OAAO4nB,cAAc5nB,OAAO4nB,aAAaC,WAAWloB,EAAImoB,qBAAqBtP,KAC1F2O,GAAcnnB,OAAO+nB,gBAAgB/nB,OAAO+nB,eAAeF,WAAWloB,EAAIqoB,kBAAkBxP,GAElG,CAAE,MAAOlW,GACRrD,QAAQE,MAAMmD,EACf,aAKMmD,EAAKb,GAEZ4iB,EAAW/hB,EAAM+S,IAGlB7Y,EAAI0gB,cAAgB5a,IACnB9F,EAAIE,UAAU,OAAQ4F,GAAM,GAAO,IAGpC9F,EAAIkhB,iBAAmB,IACflhB,EAAIG,aAAa,QAAQ,GAAO,GAGxCH,EAAIqoB,kBAAoB,CAACxP,EAAS,MACjC,MAAMyP,EAAoB,oBAE1B,OAAIzP,EACIyP,EAAoB,IAAMzP,EAG3ByP,GAGRtoB,EAAImoB,qBAAwBI,IAE3B,MAAMD,EAAoB,uBAE1B,OAAIC,EACID,EAAoB,IAAMC,EAG3BD,GAGRtoB,EAAI4nB,eAAiB,CAAC/O,EAAS,MAE9B,GAAIxY,OAAO+nB,eAAgB,CAE1B,IAAItiB,EAAOzF,OAAO+nB,eAAeI,QAAQxoB,EAAIqoB,kBAAkBxP,IAE/D,OAAgB,OAAT/S,EAAgB8J,KAAKC,MAAM/J,GAAQ,CAAC,CAC5C,CAAO,CAEN,IAAIA,EAAO9F,EAAIgnB,UAAUhnB,EAAIqoB,kBAAkBxP,IAE/C,MAAgB,KAAT/S,EAAc8J,KAAKC,MAAM/J,GAAQ,CAAC,CAC1C,GAGD9F,EAAI+nB,eAAiB,CAACjiB,EAAMyiB,EAAmB,MAC1CloB,OAAO+nB,eACV/nB,OAAO+nB,eAAeK,QAAQzoB,EAAIqoB,kBAAkBE,GAAmB3Y,KAAKoQ,UAAUla,IAGtF9F,EAAIwmB,UAAUxmB,EAAIqoB,kBAAkBE,GAAmB3Y,KAAKoQ,UAAUla,KAIxE9F,EAAI2nB,kBAAqBY,IAExB,GAAIloB,OAAO4nB,aAAc,CAExB,IAAIniB,EAAOzF,OAAO4nB,aAAaO,QAAQxoB,EAAImoB,qBAAqBI,IAEhE,OAAgB,OAATziB,EAAgB8J,KAAKC,MAAM/J,GAAQ,CAAC,CAC5C,CAAO,CAEN,IAAIA,EAAO9F,EAAIgnB,UAAUhnB,EAAImoB,qBAAqBI,IAElD,MAAgB,KAATziB,EAAc8J,KAAKC,MAAM/J,GAAQ,CAAC,CAC1C,GAGD9F,EAAI8nB,kBAAoB,CAAChiB,EAAMyiB,EAAmB,MAE7CloB,OAAO4nB,aACV5nB,OAAO4nB,aAAaQ,QAAQzoB,EAAImoB,qBAAqBI,GAAmB3Y,KAAKoQ,UAAUla,IAGvF9F,EAAIwmB,UAAUxmB,EAAImoB,qBAAqBI,GAAmB3Y,KAAKoQ,UAAUla,GAAO,MAIlF9F,EAAIsgB,qBAAuB/f,UAE1B,IAEC,IAAI6N,QAEMpO,EAAIqf,0BAEbjR,QAAiBC,MAAMrO,EAAIuf,KAAO,uBAAwB,CACzDE,OAAW,OACXkC,QAAW,CACV,eAAgB,oBAGjBN,KAAWzR,KAAKoQ,UAAU,CACzB0I,SAAWC,EAAazI,QACxB0I,UAAWD,EAAaxI,SACxBC,OAAWuI,EAAavI,SAGzBR,WAAW,EACXD,MAAW,WACXE,SAAW,WAKZlf,IAAIrB,QAAQJ,IAAI,gDAMhBkP,QAAiBC,MAAMrO,EAAIohB,SAAU,CACpC3B,OAAW,OACX4B,KAAW,IAAIC,gBAAgB,CAC9BC,OAAW,4BACXmH,SAAWC,EAAazI,QACxB0I,UAAWD,EAAaxI,SACxBC,OAAWuI,EAAavI,SAGzBR,WAAW,EACXC,SAAW,WAIb,MAAMC,QAAqB1R,EAASc,OAEhC4Q,EAAaC,QAChBpf,IAAIrB,QAAQJ,IAAI,GAAI4gB,EAAaha,MAEjCnF,IAAIrB,QAAQE,MAAM,GAAIsgB,EAAaha,KAGrC,CAAE,MAAOnD,GACRrD,QAAQE,MAAMmD,EACf,GAGD3C,EAAIgU,8BAAgCf,IAEnC,MAAMjM,EAAO/F,OAAOgS,GAAStR,KAAK,mBAAmBA,KAAK,KAAKE,KAAK,QACpE,GAAImF,EAAM,OAAOhH,EAAIyC,6BAA6B,IAAIH,IAAI0E,IAE1D,MAAMxE,EAAYvB,OAAOgS,GAAStR,KAAK,qBAAqBmT,QAAQjT,KAAK,mBACzE,OAAOW,GAAwB,MAGhCxC,EAAIiU,oCAAsChB,GAElChS,OAAOgS,GAAStR,KAAK,QAAQC,OAAS,KAG9C5B,EAAIyC,6BAA+BJ,IAElC,IAGIG,EAFAqmB,EADe,IAAIvH,gBAAgBjf,EAAIugB,QACXnP,IAAI,eAUpC,OALCjR,EADgE,IAA7D5C,aAAakpB,eAAeD,GAA2B,aAC9CjpB,aAAakpB,eAAeD,GAAyB,WAErDjpB,aAAakpB,eAAeD,GAA2B,aAG7DrmB,GAGRxC,EAAIoD,2BAA6B,IAChCnC,OAAO,KAAKykB,IAAI,WACf,IAAI1e,EAAO/F,OAAOqJ,MAAMzI,KAAK,QAE7B,GAAImF,GAAQA,EAAK0I,SAAS,iBAAkB,CAC3C,IAAIqZ,EAAU/hB,EAAK8O,MAAM,uBACzB,GAAIiT,EAAS,OAAOA,EAAQ,EAC7B,CACD,GAAGtV,MAEJzT,EAAI6T,mCAAqC,CAACrR,EAAWoG,EAAW,KAG/D,IAAKhJ,aAAasD,SAASV,GAAY,OAAO,KAE9C,IAAIoC,EAAU,CACbtD,GAAekB,EAAU4T,WACzB4S,UAAeppB,aAAasD,SAASV,GAAWwmB,UAChD7f,KAAevJ,aAAasD,SAASV,GAAW2G,KAChD8f,UAAerpB,aAAa4E,KAAKykB,UACjCC,MAAetpB,aAAasD,SAASV,GAAW0mB,MAChDC,SAAevpB,aAAasD,SAASV,GAAW2mB,SAChDC,QAAexpB,aAAasD,SAASV,GAAW4mB,QAChDC,cAAezpB,aAAasD,SAASV,GAAW8mB,SAChD1gB,SAAeA,EACfD,MAAe/I,aAAasD,SAASV,GAAWmG,MAChDE,SAAejJ,aAAa4E,KAAKqE,SACjC0gB,YAAe3pB,aAAasD,SAASV,GAAW+mB,YAChD3I,aAAehhB,aAAasD,SAASV,GAAWoe,aAChDC,UAAejhB,aAAasD,SAASV,GAAWqe,WAKjD,OAFIjc,EAAQgc,eAAchc,EAA6B,oBAAIhF,aAAasD,SAASV,GAAWgnB,qBAErF5kB,GAGR5E,EAAIypB,mBAAqB,CAACC,EAAS,WAElC,IAAIC,EAOJ,GALAA,EAAe,CACdhmB,MAAO,UACPimB,MAAO,WAGJ5pB,EAAIgnB,UAAU2C,EAAaD,IAAU,CAIxC,OAFiB1pB,EAAIgnB,UAAU2C,EAAaD,IAChB5T,MAAM,oBACnB,EAChB,CACC,MAAO,IAIT9V,EAAI6pB,aAAe,IAAMhY,UAAUD,UAEnC5R,EAAI8pB,YAAc,KAAM,CACvBC,MAAQ/lB,KAAKgmB,IAAIjoB,SAASkoB,gBAAgBC,aAAe,EAAG7pB,OAAO8pB,YAAc,GACjFC,OAAQpmB,KAAKgmB,IAAIjoB,SAASkoB,gBAAgBI,cAAgB,EAAGhqB,OAAOiqB,aAAe,KAIpFtqB,EAAIuqB,kBAAoB,KACvBjrB,QAAQJ,IAAIU,aAAa6L,UAc1BzL,EAAIwqB,qBAAuB,CAACnoB,EAAKooB,KAEhC,IAAI/I,EAAU,CACbgJ,SAAU,SACV/K,OAAU,EACVtd,IAAUA,GAGX,OAAO,IAAIwI,QAAQ,CAACC,EAAS2G,KAC5BxQ,OAAO0pB,KAAKjJ,GACVkJ,KAAK,KACLjqB,IAAIrB,QAAQJ,IAAI,uCAAyCmD,GACzDyI,MAEA+f,KAAK,KACL,GAAIJ,EAAa,CAEhB9pB,IAAIrB,QAAQJ,IAAI,4BAA8BurB,GAE9C,IAAIK,EAAkB,CACrBJ,SAAU,SACV/K,OAAU,EACVtd,IAAUooB,GAGXxpB,OAAO0pB,KAAKG,GACVF,KAAK,KACLjqB,IAAIrB,QAAQJ,IAAI,wCAA0CurB,GAC1D3f,MAEA+f,KAAK,IAAMpZ,EAAO,IAAIlD,MAAM,sDAC/B,MACCkD,EAAO,IAAIlD,MAAM,sEAMtBvO,EAAI+qB,kBAAoBC,IAAcA,EAAUC,MAAQD,EAAUE,WAAaF,EAAUpiB,SAEzF5I,EAAIoF,mBAAqB,KACxB,IAAIU,EAAO9F,EAAI4nB,iBACf,OAAO9hB,GAAMqlB,iBAGdnrB,EAAIqF,mBAAqB,KACxB,IAAIS,EAAsB9F,EAAI4nB,iBAC9B9hB,EAAsB,iBAAI,EAC1B9F,EAAI+nB,eAAejiB,IAGpB9F,EAAIorB,WAAa7qB,SAAY,IAAIsK,QAAQC,KACxC,SAAUU,IACT,GAAI,aAAezJ,SAASspB,WAAY,OAAOvgB,IAC/CE,WAAWQ,EAAY,GACvB,CAHD,KAMDxL,EAAIsrB,UAAY,IACR,IAAIzgB,QAAQC,KAClB,SAAUU,IACT,GAAI,gBAAkBzJ,SAASspB,YAAc,aAAetpB,SAASspB,WAAY,OAAOvgB,IACxFE,WAAWQ,EAAY,GACvB,CAHD,KAOFxL,EAAIurB,iBAAmB,KAClBlrB,OAAO+nB,gBACVniB,OAAOgC,KAAK5H,OAAO+nB,gBAAgBvX,QAAQ5L,IAC1C,GAAIA,EAAIyK,SAAS,gBAChB,OAAO,KAKH,GAGR1P,EAAIihB,yBAA2B,IAAMlf,SAASglB,OAAOrX,SAAS,6BAE9D1P,EAAIC,gBAAkBurB,GACL,IAAIlK,gBAAgBjhB,OAAOoD,SAASmf,QACnCpP,IAAIgY,GAGtBxrB,EAAI4D,gBAAkB4nB,GACL,IAAIlK,gBAAgBjhB,OAAOoD,SAASmf,QACnCnP,IAAI+X,GAItBxrB,EAAIyrB,UAAY,CAACC,EAAMC,IACfC,OAAOC,OAAOC,OAAOJ,EAAM,IAAIK,YAAY,SAASC,OAAOL,IAAMhgB,KAAKsgB,GACrElc,MAAMoG,UAAUuP,IAAI5M,KAAK,IAAIoT,WAAWD,GAAME,IAAO,KAAOA,EAAE/V,SAAS,KAAK9E,OAAO,IAAKf,KAAK,KAItGvQ,EAAIosB,aAAe,KAElB,IAAI/qB,EAAQ,EAEZ,GAAIzB,cAAcsU,KAEjB,IAAK,MAAMjP,KAAOrF,aAAasU,KAAM,CAGpC,IAAItP,EAAUhF,aAAasU,KAAKjP,GAEhC5D,GAASuD,EAAQgE,SAAWhE,EAAQ+D,KACrC,CAGD,OAAOtH,GASRrB,EAAIqsB,uBAAyBC,IAE5B,IAAK,MAAMta,KAAWsa,EACrB,GAAI,IAAI1U,OAAO5F,GAASiI,KAAK5Z,OAAOoD,SAASuD,MAC5C,OAAO,EAIT,OAAO,GAWRhH,EAAIusB,0BAA4B,KAE/B,IAAIC,EAAkB,CACrB,cACA,wBAQD,OALI5sB,cAAcC,SAAS2sB,kBAC1BA,EAAkB,IAAIA,KAAoB5sB,aAAaC,QAAQ2sB,oBAI5DA,EAAgBnf,KAAKof,GAAUpsB,OAAOoD,SAASuD,KAAK0I,SAAS+c,MAChEntB,QAAQotB,MAAM,kDACP,IAYT1sB,EAAIsH,iBAAmB,CAAC/H,EAAS,MAChC,IAAI+B,EAAK,GACT,KAAOA,EAAG/B,OAASA,GAClB+B,IAAO0C,KAAKua,SAAW,GAAGnI,SAAS,IAAIsC,UAAU,GAElD,OAAOpX,EAAGoX,UAAU,EAAGnZ,IAGxBS,EAAI2sB,kBAAoB,KACvB,IAAIxtB,EAAU,kCACdA,GAAWS,aAAa6L,QAAQmhB,IAAM,MAAQ,OAC9CztB,GAAW,cAAgBS,aAAa6L,QAAQohB,OACZ,QAAhCjtB,aAAa6L,QAAQohB,QAAoBjtB,aAAa6L,QAAQmhB,MACjEztB,GAAW,uBAAyBS,aAAa6L,QAAQqhB,qBAAuB,MAAQ,OAEzF3tB,GAAW,eAAiBS,aAAa6L,QAAQgC,QAEf,IAA9B7N,aAAa6L,QAAQshB,KACxBztB,QAAQJ,IAAIC,GAEZwB,IAAIrB,QAAQJ,IAAIC,IAIlBa,EAAIgtB,uBAAyB,IACY,QAAhCptB,aAAa6L,QAAQohB,QAAoBjtB,aAAa6L,QAAQmhB,KAAOhtB,aAAa6L,QAAQqhB,sBAAyD,QAAhCltB,aAAa6L,QAAQohB,OAQjJ,IAAII,GAAmB,EAQvBjtB,EAAIktB,wBAA0B,KAGzBD,IAGwB,aAAxBlrB,SAASspB,YAWbpqB,OAAO,KACNksB,MAIDprB,SAASqrB,iBAAiB,mBAAoB,KAC7CD,MACE,IAjBFA,MAyBF,MAAMA,EAAuBA,KAGxBF,IAGJlrB,SAASsrB,cAAc,IAAIC,MAAM,kBAGjCL,GAAmB,IAGpBjtB,EAAIutB,mBAAqBnsB,IAGxB,GAAIA,EAAO4F,KAAM,CAKhB,IAAIwZ,EAAQpf,EAAO4F,KAAKjG,QAAQ,UAAW,IAW3C,GARIyf,EAAM1N,QAAQ,MAAQ,IACzB0N,EAAQA,EAAM/R,MAAM,KAAK,IAI1B+R,EAAQA,EAAMzf,QAAQ,MAAO,IAGzByf,GAASxgB,EAAI8T,QAAQ0M,GACxB,OAAOA,CAET,CAEA,MAAO,IAGRxgB,EAAIkI,yBAA2B5B,IACqB,mBAAxCtG,EAAIwtB,iCACdxtB,EAAIwtB,gCAAgClnB,IAWtCtG,EAAI2J,gCAAkCpJ,SAE9B,IAAIsK,QAAQC,IAGlB,IAAKlL,cAAc2G,OAIlB,OAHA5F,IAAIrB,QAAQE,MAAM,+FAClBuC,SAASsrB,cAAc,IAAIC,MAAM,uBACjCxiB,IAID,IAAIhB,EAAelK,cAAcC,SAASgI,iBAAiBC,oBAAoBvB,QAAU,GAOzF,GAHAuD,EAAeA,EAAa+C,OAAO7C,GAAapK,aAAa2G,OAAOyD,IAGxC,IAAxBF,EAAavK,OAIhB,OAHAoB,IAAIrB,QAAQJ,IAAI,+DAChB6C,SAASsrB,cAAc,IAAIC,MAAM,uBACjCxiB,IAKD,MAAM2iB,EAAoBA,KACP3jB,EAAanE,MAAMqE,IACnCpK,aAAa2G,OAAOyD,IAAcpK,aAAa2G,OAAOyD,GAAWvD,SAIlE1E,SAASsrB,cAAc,IAAIC,MAAM,kBACjCxiB,KAEAE,WAAWyiB,EAAmB,MAIhCA,MAIFztB,EAAIwJ,oBAAsB,MAChB5J,aAAa4E,KAUvBxE,EAAIiJ,6BAA+B,CAACrE,EAASoF,IACrC0jB,OAAO9oB,EAAQokB,UAAUppB,aAAa2G,OAAOyD,GAAW2jB,oBAAoBC,UAGpF5tB,EAAI6tB,wBAA0B,KAE7B,GAAIjuB,cAAc4E,MAAMspB,eAAgB,OAAO,EAE/C,IAAItV,EAAkB,IAAIZ,OAAO,yBAGjC,QAFsB5X,EAAIqnB,2BAA2B7O,IAOtDxY,EAAI+tB,2BAA6B,KACxB/tB,EAAI6tB,0BAGb7tB,EAAIkH,YAAc7E,IAGjBA,EAAMA,EAAIrB,OAGN,0BAA0BiZ,KAAK5X,GAC3BA,EAOD,YAHPA,EAAMA,EAAItB,QAAQ,OAAQ,MAM3Bf,EAAIuF,mCAAqC,KACxC,IAAIyoB,EAAsB,KAE1B/sB,OAAO,0BAA0BC,GAAG,iBAAkB,CAACC,EAAO6E,KAK7D,IAEC,IAAIxD,EAAYxC,EAAI4T,qCAAqC5N,EAAUK,cAEnE,IAAK7D,EAAW,MAAM+L,MAAM,uCAGxByf,IAAwBhoB,EAAUK,eACrCrG,EAAIoG,yBAAyB5D,GAC7BwrB,EAAsBhoB,EAAUK,aAGlC,CAAE,MAAO1D,GACRrD,QAAQE,MAAMmD,EACf,KAgBF3C,EAAIiuB,uBAAyB,KAE5B,MAAMC,EAAQ7tB,OAAO8tB,MAAQ9tB,OAAO8tB,OAAS,GAE7CD,EAAMrd,QAAQ,SAAUud,GACvB,GAAkB,mBAAPA,EACV,IACCA,GACD,CAAE,MAAOzrB,GACRhC,IAAIrB,QAAQE,MAAM,kCAAmCmD,EACtD,CAEF,GAGAurB,EAAM/jB,KAAO,SAAUikB,GACtB,GAAkB,mBAAPA,EACV,IACCA,GACD,CAAE,MAAOzrB,GACRhC,IAAIrB,QAAQE,MAAM,sCAAuCmD,EAC1D,CAEF,EAGD,CA/nDA,CA+nDCtC,OAAOL,IAAMK,OAAOL,KAAO,CAAC,EAAGiB,O,YCznDhC,SAAUjB,GAOVA,EAAIquB,gBAAkB,WACrB,MAAO,CACNC,UAAYtqB,KAAKC,MAAMC,KAAKC,MAAQ,KACpC9B,IAAYhC,OAAOoD,SAASuD,KAC5B1D,SAAYtD,EAAIG,aAAa,YAAcH,EAAIkH,YAAYlH,EAAIG,aAAa,aAAe4B,SAASuB,SACpGirB,WAAY1c,UAAUD,UACtBnN,UAAY7E,cAAc4E,MAAMC,UAChC+pB,QAAY5uB,cAAcuF,MAAM7D,IAAImtB,KAAO,KAG7C,EAWAzuB,EAAImI,aAAe5H,eAAgBmuB,EAAWC,GAE7ChuB,IAAIrB,QAAQJ,IAAI,qBAAqBwvB,IAAaC,GAElD,IAEC,IAAIroB,EAAU,CACbnF,MAAYutB,EACZE,WAAYD,EACZpoB,OAAY,CAAC,EACbsoB,QAAY7uB,EAAIquB,mBAKjB/nB,EAAU3F,IAAIoL,MAAMW,aAAa,wBAAyBpG,EAASooB,GAGnE,MAAM5kB,EAAe9J,EAAI4J,cAAcC,kBAEvC,IAAK,MAAMG,KAAaF,EAAc,CACrC,MAAMglB,EAAU9uB,EAAI4J,cAAcc,WAAWV,GAE7C,GAAK8kB,GAAoC,mBAAlBA,EAAQC,MAK/B,IAEC,IAAIC,EAAYF,EAAQC,MAAMzoB,EAAQsoB,WAAYF,EAAWpoB,EAAQuoB,SAErE,IAAKG,EAGJ,SAKDA,EAAYruB,IAAIoL,MAAMW,aACrB,kBAAkB1C,IAClBglB,EACAN,EACApoB,EAAQsoB,WACRtoB,EAAQuoB,SAGTvoB,EAAQC,OAAOyD,GAAaglB,CAC7B,CAAE,MAAOrsB,GACRhC,IAAIrB,QAAQE,MAAM,2BAA2BwK,KAAcrH,EAC5D,MA3BChC,IAAIrB,QAAQJ,IAAI,+BAA+B8K,IA4BjD,CAiBA,OAbA1D,EAAU3F,IAAIoL,MAAMW,aACnB,qBAAqBgiB,IACrBpoB,EACAA,EAAQsoB,YAKTtoB,EAAU3F,IAAIoL,MAAMW,aAAa,yBAA0BpG,EAASooB,SAG9D1uB,EAAIivB,iBAAiB3oB,GAEpBA,CAER,CAAE,MAAO3D,GAER,MADAhC,IAAIrB,QAAQE,MAAM,0BAA0BkvB,KAAc/rB,GACpDA,CACP,CACD,EAWA3C,EAAIivB,iBAAmB1uB,eAAgB+F,GAEtC,MAAMooB,EAAYpoB,EAAQnF,MAY1B,GATAnB,EAAIkvB,wBAAwB5oB,GAK5BtG,EAAImvB,oBAAoB7oB,GAIN,aAAdooB,GAMJ,GAAI9uB,cAAcC,SAASgI,iBAAiBunB,OAAQ,CAEnD,MAAMrnB,EAAU/H,EAAIgI,eAAe1B,GAGnC,GAAIL,OAAOgC,KAAKF,GAASxI,OAAS,EAAG,CACpC,MAAMkL,EAAYzK,EAAI4J,cAAcY,qBACpC7J,IAAIrB,QAAQJ,IAAI,0BAA0BwvB,KAAcjkB,SAClDzK,EAAIkI,yBAAyBH,EACpC,CACD,OAfCpH,IAAIrB,QAAQJ,IAAI,sFAgBlB,EAMAc,EAAIkvB,wBAA0B,SAAU5oB,GAEvC,MAAM+D,EAAgBrK,EAAI4J,cAAcQ,6BAExC,GAA6B,IAAzBC,EAAc9K,OACjB,OAGDoB,IAAIrB,QAAQJ,IAAI,0CAA0CoH,EAAQnF,SAAUkJ,GAK5E,MAAMglB,EAAmB/oB,EAAQnF,MAAMJ,QAAQ,KAAM,KACrDE,OAAOc,UAAUC,QAAQ,eAAeqtB,IAAoB/oB,EAC7D,EAWAtG,EAAImvB,oBAAsB,SAAU7oB,GAInC,GAAyB,IAFPtG,EAAI4J,cAAcY,qBAEtBjL,OACb,OAMD,MAAM+vB,EAAehpB,EAAQnF,MAAMJ,QAAQ,KAAM,KACjDE,OAAOc,UAAUC,QAAQ,WAAWstB,IAAgBhpB,EACrD,EAUAtG,EAAIgI,eAAiB,SAAU1B,GAE9B,MAAMyB,EAAU,CACf5G,MAAOmF,EAAQnF,OAGVsJ,EAAYzK,EAAI4J,cAAcY,qBAEpC,IAAK,MAAMR,KAAaS,EACnBnE,EAAQC,OAAOyD,KAClBjC,EAAQiC,GAAa1D,EAAQC,OAAOyD,IAStC,OAJI1D,EAAQsoB,YAAYhqB,UACvBmD,EAAQnD,QAAU0B,EAAQsoB,WAAWhqB,SAG/BmD,CACR,EAKK/H,EAAI2K,WACR3K,EAAI2K,SAAW,CAAC,GAajB3K,EAAIuvB,gBAAkB,SAAUvlB,EAAW8kB,EAASpN,EAAU,CAAC,GACzDoN,GAAoC,mBAAlBA,EAAQC,OAM/B/uB,EAAI2K,SAASX,GAAa8kB,EAGrB9uB,EAAI+J,oBACR/J,EAAI+J,kBAAoB,CAAC,GAG1B/J,EAAI+J,kBAAkBC,GAAa,CAClCO,YAA4BmX,EAAQnX,cAAe,EACnDilB,2BAA4B9N,EAAQ8N,6BAA8B,EAClEtlB,SAA4BwX,EAAQxX,UAAY,OAfhDvJ,IAAIrB,QAAQE,MAAM,uBAAuBwK,iCAmB3C,CAEA,CAtQA,CAsQC3J,OAAOL,IAAMK,OAAOL,KAAO,CAAC,EAAGiB,O,GCjR7BwuB,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBhiB,IAAjBiiB,EACH,OAAOA,EAAa/a,QAGrB,IAAID,EAAS6a,EAAyBE,GAAY,CAGjD9a,QAAS,CAAC,GAOX,OAHAgb,EAAoBF,GAAU/a,EAAQA,EAAOC,QAAS6a,GAG/C9a,EAAOC,OACf,CAGA6a,EAAoBI,EAAID,EjBzBpBxxB,EAAW4H,OAAO8pB,eAAkBphB,GAAS1I,OAAO8pB,eAAephB,GAASA,GAASA,EAAa,UAQtG+gB,EAAoBM,EAAI,SAAS3uB,EAAOqe,GAEvC,GADU,EAAPA,IAAUre,EAAQiJ,KAAKjJ,IAChB,EAAPqe,EAAU,OAAOre,EACpB,GAAoB,iBAAVA,GAAsBA,EAAO,CACtC,GAAW,EAAPqe,GAAare,EAAM4uB,WAAY,OAAO5uB,EAC1C,GAAW,GAAPqe,GAAoC,mBAAfre,EAAMsK,KAAqB,OAAOtK,CAC5D,CACA,IAAIwa,EAAK5V,OAAOiqB,OAAO,MACvBR,EAAoBS,EAAEtU,GACtB,IAAIuU,EAAM,CAAC,EACXhyB,EAAiBA,GAAkB,CAAC,KAAMC,EAAS,CAAC,GAAIA,EAAS,IAAKA,EAASA,IAC/E,IAAI,IAAIgyB,EAAiB,EAAP3Q,GAAYre,GAA0B,iBAAXgvB,GAAyC,mBAAXA,MAA4BjyB,EAAe0U,QAAQud,GAAUA,EAAUhyB,EAASgyB,GAC1JpqB,OAAOqqB,oBAAoBD,GAASxf,QAAS5L,GAASmrB,EAAInrB,GAAO,IAAO5D,EAAM4D,IAI/E,OAFAmrB,EAAa,QAAI,IAAM,EACvBV,EAAoBjT,EAAEZ,EAAIuU,GACnBvU,CACR,EkBxBA6T,EAAoBjT,EAAI,CAAC5H,EAAS0b,KACjC,IAAI,IAAItrB,KAAOsrB,EACXb,EAAoBc,EAAED,EAAYtrB,KAASyqB,EAAoBc,EAAE3b,EAAS5P,IAC5EgB,OAAOyU,eAAe7F,EAAS5P,EAAK,CAAEwrB,YAAY,EAAMhd,IAAK8c,EAAWtrB,MCJ3EyqB,EAAoBxiB,EAAI,CAAC,EAGzBwiB,EAAoB/sB,EAAK+tB,GACjB7lB,QAAQ8lB,IAAI1qB,OAAOgC,KAAKynB,EAAoBxiB,GAAGwB,OAAO,CAACkC,EAAU3L,KACvEyqB,EAAoBxiB,EAAEjI,GAAKyrB,EAAS9f,GAC7BA,GACL,KCNJ8e,EAAoBkB,EAAKF,IAEZ,CAAC,IAAM,WAAW,IAAM,uBAAuB,IAAM,iBAAiB,IAAM,qBAAqB,IAAM,eAAe,IAAM,eAAe,IAAM,cAAc,IAAM,sBAAsBA,GAAW,IAAM,CAAC,IAAM,WAAW,IAAM,WAAW,IAAM,WAAW,IAAM,WAAW,IAAM,WAAW,IAAM,WAAW,IAAM,WAAW,IAAM,YAAYA,GAAW,iBCH9WhB,EAAoBmB,EAAI,WACvB,GAA0B,iBAAfC,WAAyB,OAAOA,WAC3C,IACC,OAAOxmB,MAAQ,IAAIymB,SAAS,cAAb,EAChB,CAAE,MAAOpuB,GACR,GAAsB,iBAAXtC,OAAqB,OAAOA,MACxC,CACA,CAPuB,GCAxBqvB,EAAoBc,EAAI,CAAC7hB,EAAKqiB,IAAU/qB,OAAOkQ,UAAU8a,eAAenY,KAAKnK,EAAKqiB,GrBA9E1yB,EAAa,CAAC,EACdC,EAAoB,iCAExBmxB,EAAoBtX,EAAI,CAAC/V,EAAKuoB,EAAM3lB,EAAKyrB,KACxC,GAAGpyB,EAAW+D,GAAQ/D,EAAW+D,GAAK8H,KAAKygB,OAA3C,CACA,IAAIsG,EAAQC,EACZ,QAAWxjB,IAAR1I,EAEF,IADA,IAAImsB,EAAUrvB,SAASsvB,qBAAqB,UACpC9Z,EAAI,EAAGA,EAAI6Z,EAAQ7xB,OAAQgY,IAAK,CACvC,IAAI+Z,EAAIF,EAAQ7Z,GAChB,GAAG+Z,EAAEC,aAAa,QAAUlvB,GAAOivB,EAAEC,aAAa,iBAAmBhzB,EAAoB0G,EAAK,CAAEisB,EAASI,EAAG,KAAO,CACpH,CAEGJ,IACHC,GAAa,GACbD,EAASnvB,SAASyvB,cAAc,WAEzBC,QAAU,QACb/B,EAAoBgC,IACvBR,EAAOS,aAAa,QAASjC,EAAoBgC,IAElDR,EAAOS,aAAa,eAAgBpzB,EAAoB0G,GAExDisB,EAAOU,IAAMvvB,GAEd/D,EAAW+D,GAAO,CAACuoB,GACnB,IAAIiH,EAAmB,CAAC7N,EAAM7iB,KAE7B+vB,EAAOY,QAAUZ,EAAOa,OAAS,KACjCnmB,aAAaT,GACb,IAAI6mB,EAAU1zB,EAAW+D,GAIzB,UAHO/D,EAAW+D,GAClB6uB,EAAOe,YAAcf,EAAOe,WAAWC,YAAYhB,GACnDc,GAAWA,EAAQnhB,QAASud,GAAQA,EAAGjtB,IACpC6iB,EAAM,OAAOA,EAAK7iB,IAElBgK,EAAUH,WAAW6mB,EAAiBM,KAAK,UAAMxkB,EAAW,CAAEoT,KAAM,UAAW3f,OAAQ8vB,IAAW,MACtGA,EAAOY,QAAUD,EAAiBM,KAAK,KAAMjB,EAAOY,SACpDZ,EAAOa,OAASF,EAAiBM,KAAK,KAAMjB,EAAOa,QACnDZ,GAAcpvB,SAASqwB,KAAKC,YAAYnB,EAnCkB,GsBH3DxB,EAAoBS,EAAKtb,IACH,oBAAXyd,QAA0BA,OAAOC,aAC1CtsB,OAAOyU,eAAe7F,EAASyd,OAAOC,YAAa,CAAElxB,MAAO,WAE7D4E,OAAOyU,eAAe7F,EAAS,aAAc,CAAExT,OAAO,K,MCLvD,IAAImxB,EACA9C,EAAoBmB,EAAE4B,gBAAeD,EAAY9C,EAAoBmB,EAAEptB,SAAW,IACtF,IAAI1B,EAAW2tB,EAAoBmB,EAAE9uB,SACrC,IAAKywB,GAAazwB,IACbA,EAAS2wB,eAAkE,WAAjD3wB,EAAS2wB,cAAcC,QAAQ3zB,gBAC5DwzB,EAAYzwB,EAAS2wB,cAAcd,MAC/BY,GAAW,CACf,IAAIpB,EAAUrvB,EAASsvB,qBAAqB,UAC5C,GAAGD,EAAQ7xB,OAEV,IADA,IAAIgY,EAAI6Z,EAAQ7xB,OAAS,EAClBgY,GAAK,KAAOib,IAAc,aAAavY,KAAKuY,KAAaA,EAAYpB,EAAQ7Z,KAAKqa,GAE3F,CAID,IAAKY,EAAW,MAAM,IAAIjkB,MAAM,yDAChCikB,EAAYA,EAAUzxB,QAAQ,SAAU,IAAIA,QAAQ,OAAQ,IAAIA,QAAQ,QAAS,IAAIA,QAAQ,YAAa,KAC1G2uB,EAAoBhT,EAAI8V,C,WCbxB,IAAII,EAAkB,CACrB,IAAK,GAGNlD,EAAoBxiB,EAAE4N,EAAI,CAAC4V,EAAS9f,KAElC,IAAIiiB,EAAqBnD,EAAoBc,EAAEoC,EAAiBlC,GAAWkC,EAAgBlC,QAAW/iB,EACtG,GAA0B,IAAvBklB,EAGF,GAAGA,EACFjiB,EAASzG,KAAK0oB,EAAmB,QAC3B,CAGL,IAAIC,EAAU,IAAIjoB,QAAQ,CAACC,EAAS2G,IAAYohB,EAAqBD,EAAgBlC,GAAW,CAAC5lB,EAAS2G,IAC1Gb,EAASzG,KAAK0oB,EAAmB,GAAKC,GAGtC,IAAIzwB,EAAMqtB,EAAoBhT,EAAIgT,EAAoBkB,EAAEF,GAEpDlxB,EAAQ,IAAI+O,MAgBhBmhB,EAAoBtX,EAAE/V,EAfFlB,IACnB,GAAGuuB,EAAoBc,EAAEoC,EAAiBlC,KAEf,KAD1BmC,EAAqBD,EAAgBlC,MACRkC,EAAgBlC,QAAW/iB,GACrDklB,GAAoB,CACtB,IAAIE,EAAY5xB,IAAyB,SAAfA,EAAM4f,KAAkB,UAAY5f,EAAM4f,MAChEiS,EAAU7xB,GAASA,EAAMC,QAAUD,EAAMC,OAAOwwB,IACpDpyB,EAAML,QAAU,iBAAmBuxB,EAAU,cAAgBqC,EAAY,KAAOC,EAAU,IAC1FxzB,EAAM2J,KAAO,iBACb3J,EAAMuhB,KAAOgS,EACbvzB,EAAMyzB,QAAUD,EAChBH,EAAmB,GAAGrzB,EACvB,GAGuC,SAAWkxB,EAASA,EAE/D,GAeH,IAAIwC,EAAuB,CAACC,EAA4BrtB,KACvD,IAGI6pB,EAAUe,GAHT0C,EAAUC,EAAaC,GAAWxtB,EAGhByR,EAAI,EAC3B,GAAG6b,EAAS/lB,KAAM/L,GAAgC,IAAxBsxB,EAAgBtxB,IAAa,CACtD,IAAIquB,KAAY0D,EACZ3D,EAAoBc,EAAE6C,EAAa1D,KACrCD,EAAoBI,EAAEH,GAAY0D,EAAY1D,IAGhD,GAAG2D,EAAsBA,EAAQ5D,EAClC,CAEA,IADGyD,GAA4BA,EAA2BrtB,GACrDyR,EAAI6b,EAAS7zB,OAAQgY,IACzBmZ,EAAU0C,EAAS7b,GAChBmY,EAAoBc,EAAEoC,EAAiBlC,IAAYkC,EAAgBlC,IACrEkC,EAAgBlC,GAAS,KAE1BkC,EAAgBlC,GAAW,GAKzB6C,EAAqBC,KAAgD,0CAAIA,KAAgD,2CAAK,GAClID,EAAmB1iB,QAAQqiB,EAAqBf,KAAK,KAAM,IAC3DoB,EAAmBppB,KAAO+oB,EAAqBf,KAAK,KAAMoB,EAAmBppB,KAAKgoB,KAAKoB,G,KCjF1EhzB,WA2DZ,GAzDAH,EAAQ,KACRA,EAAQ,WAGFJ,IAAI4K,qBAGJ5K,IAAIsL,0BAON1L,cAAcC,SAAS4zB,kBAE1BC,EAAAA,EAA0B9zB,aAAaC,QAAQ4zB,iBAOhDrzB,EAAQ,KAGRA,EAAQ,KACRA,EAAQ,KACRA,EAAQ,KAGRJ,IAAIiuB,yBAGJjuB,IAAI2sB,0BAGE3sB,IAAIM,0BACJN,IAAIS,QAAQkzB,OAKlB1yB,OAAO,KACNb,EAAQ,OAITA,EAAQ,KAGR,kCAEAJ,IAAIgM,uBAIAhM,IAAIusB,4BAA6B,OAGrC,MAAMqH,EAAe,GAGjBh0B,cAAc2G,QAAQstB,QACzBD,EAAazpB,KACZ,kCAIEvK,cAAc2G,QAAQC,UACzBotB,EAAazpB,KACZ,mCAIEvK,cAAc2G,QAAQutB,QACzBF,EAAazpB,KACZ,yCAkFIU,QAAQ8lB,IAAIiD,GAGlB,MAAM,wBAACG,SAAiC,6BACxCA,IAGAhyB,SAASsrB,cAAc,IAAIC,MAAM,oBAGjCvrB,SAASsrB,cAAc,IAAIC,MAAM,kBAG3BttB,IAAIorB,aAEVrpB,SAASsrB,cAAc,IAAIC,MAAM,cACjCttB,IAAIktB,0BAGJltB,IAAIwN,uBAGLwmB,E","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 3 3 msgid "" 4 4 msgstr "" 5 "Project-Id-Version: Pixel Manager for WooCommerce 1. 49.2\n"5 "Project-Id-Version: Pixel Manager for WooCommerce 1.52.0\n" 6 6 "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/src\n" 7 7 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" … … 10 10 "Content-Type: text/plain; charset=UTF-8\n" 11 11 "Content-Transfer-Encoding: 8bit\n" 12 "POT-Creation-Date: 2025-1 0-07T10:17:45+00:00\n"12 "POT-Creation-Date: 2025-12-01T06:32:14+00:00\n" 13 13 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 14 14 "X-Generator: WP-CLI 2.12.0\n" … … 43 43 #: class-wgact.php:264 44 44 #: includes/admin/class-admin.php:82 45 #: includes/admin/class-admin.php:4 1246 #: includes/admin/class-admin.php:4 1345 #: includes/admin/class-admin.php:444 46 #: includes/admin/class-admin.php:445 47 47 #: includes/admin/notifications/class-notifications.php:308 48 48 msgid "Pixel Manager" … … 93 93 msgstr "" 94 94 95 #: includes/admin/class-admin.php:149 95 #: includes/admin/class-admin.php:132 96 msgid "Open chat" 97 msgstr "" 98 99 #: includes/admin/class-admin.php:143 100 msgid "Chat with Pixie" 101 msgstr "" 102 103 #: includes/admin/class-admin.php:144 104 msgid "Close chat" 105 msgstr "" 106 107 #: includes/admin/class-admin.php:180 96 108 msgid "GA4 Attribution" 97 109 msgstr "" 98 110 99 #: includes/admin/class-admin.php:1 61111 #: includes/admin/class-admin.php:192 100 112 msgid "Lifetime Value" 101 113 msgstr "" 102 114 103 #: includes/admin/class-admin.php:1 65115 #: includes/admin/class-admin.php:196 104 116 msgid "by total order value" 105 117 msgstr "" 106 118 107 #: includes/admin/class-admin.php:1 67119 #: includes/admin/class-admin.php:198 108 120 msgid "by marketing order value" 109 121 msgstr "" 110 122 111 #: includes/admin/class-admin.php:3 50123 #: includes/admin/class-admin.php:382 112 124 msgid "Pixel Manager Order Details" 113 125 msgstr "" 114 126 115 #: includes/admin/class-admin.php:3 53127 #: includes/admin/class-admin.php:385 116 128 msgid "order URL" 117 129 msgstr "" 118 130 119 #: includes/admin/class-admin.php:4 59131 #: includes/admin/class-admin.php:491 120 132 msgid "Main" 121 133 msgstr "" 122 134 123 #: includes/admin/class-admin.php:5 02135 #: includes/admin/class-admin.php:534 124 136 msgid "Statistics" 125 137 msgstr "" 126 138 127 #: includes/admin/class-admin.php:5 18139 #: includes/admin/class-admin.php:550 128 140 msgid "Google Analytics 4" 129 141 msgstr "" 130 142 131 #: includes/admin/class-admin.php:5 30143 #: includes/admin/class-admin.php:562 132 144 msgid "Hotjar site ID" 133 145 msgstr "" 134 146 135 #: includes/admin/class-admin.php:5 48147 #: includes/admin/class-admin.php:580 136 148 msgid "Marketing" 137 149 msgstr "" 138 150 139 #: includes/admin/class-admin.php:5 65151 #: includes/admin/class-admin.php:597 140 152 msgid "Google Ads Conversion ID" 141 153 msgstr "" 142 154 143 #: includes/admin/class-admin.php: 579155 #: includes/admin/class-admin.php:611 144 156 msgid "Google Ads Purchase Conversion Label" 145 157 msgstr "" 146 158 147 #: includes/admin/class-admin.php: 592159 #: includes/admin/class-admin.php:624 148 160 msgid "Meta (Facebook) pixel ID" 149 161 msgstr "" 150 162 151 #: includes/admin/class-admin.php:6 12163 #: includes/admin/class-admin.php:644 152 164 msgid "Adroll advertiser ID" 153 165 msgstr "" 154 166 155 #: includes/admin/class-admin.php:6 24167 #: includes/admin/class-admin.php:656 156 168 msgid "Adroll pixel ID" 157 169 msgstr "" 158 170 159 #: includes/admin/class-admin.php:6 37171 #: includes/admin/class-admin.php:669 160 172 msgid "LinkedIn partner ID" 161 173 msgstr "" 162 174 163 #: includes/admin/class-admin.php:6 49175 #: includes/admin/class-admin.php:681 164 176 msgid "Microsoft Advertising UET tag ID" 165 177 msgstr "" 166 178 167 #: includes/admin/class-admin.php:6 63179 #: includes/admin/class-admin.php:695 168 180 msgid "Outbrain advertiser ID" 169 181 msgstr "" 170 182 171 #: includes/admin/class-admin.php: 677183 #: includes/admin/class-admin.php:709 172 184 msgid "Pinterest pixel ID" 173 185 msgstr "" 174 186 175 #: includes/admin/class-admin.php: 689187 #: includes/admin/class-admin.php:721 176 188 msgid "Reddit pixel ID" 177 189 msgstr "" 178 190 179 #: includes/admin/class-admin.php:7 01191 #: includes/admin/class-admin.php:733 180 192 msgid "Snapchat pixel ID" 181 193 msgstr "" 182 194 183 #: includes/admin/class-admin.php:7 13195 #: includes/admin/class-admin.php:745 184 196 msgid "Taboola account ID" 185 197 msgstr "" 186 198 187 #: includes/admin/class-admin.php:7 25199 #: includes/admin/class-admin.php:757 188 200 msgid "TikTok pixel ID" 189 201 msgstr "" 190 202 191 #: includes/admin/class-admin.php:7 37203 #: includes/admin/class-admin.php:769 192 204 msgid "X (Twitter) pixel ID" 193 205 msgstr "" 194 206 195 #: includes/admin/class-admin.php:7 56207 #: includes/admin/class-admin.php:788 196 208 msgid "Optimization" 197 209 msgstr "" 198 210 199 #: includes/admin/class-admin.php: 774211 #: includes/admin/class-admin.php:806 200 212 msgid "AB Tasty" 201 213 msgstr "" 202 214 203 #: includes/admin/class-admin.php: 785215 #: includes/admin/class-admin.php:817 204 216 msgid "Optimizely" 205 217 msgstr "" 206 218 207 #: includes/admin/class-admin.php: 797219 #: includes/admin/class-admin.php:829 208 220 msgid "VWO" 209 221 msgstr "" 210 222 211 #: includes/admin/class-admin.php:8 09223 #: includes/admin/class-admin.php:841 212 224 msgid "Advanced" 213 225 msgstr "" 214 226 215 #: includes/admin/class-admin.php:8 58227 #: includes/admin/class-admin.php:890 216 228 msgid "Disable Tracking for User Roles" 217 229 msgstr "" 218 230 219 #: includes/admin/class-admin.php: 869231 #: includes/admin/class-admin.php:901 220 232 msgid "Scroll Tracker" 221 233 msgstr "" 222 234 223 #: includes/admin/class-admin.php: 881235 #: includes/admin/class-admin.php:913 224 236 msgid "Lazy Load PMW" 225 237 msgstr "" 226 238 227 #: includes/admin/class-admin.php: 893239 #: includes/admin/class-admin.php:925 228 240 msgid "Track PageView Events Server-to-Server" 229 241 msgstr "" 230 242 231 #: includes/admin/class-admin.php:9 06243 #: includes/admin/class-admin.php:938 232 244 msgid "Maximum Compatibility Mode" 233 245 msgstr "" 234 246 235 #: includes/admin/class-admin.php:9 20236 #: includes/admin/class-admin.php:9 29247 #: includes/admin/class-admin.php:952 248 #: includes/admin/class-admin.php:961 237 249 msgid "Shop" 238 250 msgstr "" 239 251 240 #: includes/admin/class-admin.php:9 37252 #: includes/admin/class-admin.php:969 241 253 msgid "Marketing Value Logic" 242 254 msgstr "" 243 255 244 #: includes/admin/class-admin.php:9 49256 #: includes/admin/class-admin.php:981 245 257 msgid "Dynamic Remarketing" 246 258 msgstr "" 247 259 248 #: includes/admin/class-admin.php:9 61260 #: includes/admin/class-admin.php:993 249 261 msgid "Product Identifier" 250 262 msgstr "" 251 263 252 #: includes/admin/class-admin.php: 973264 #: includes/admin/class-admin.php:1005 253 265 msgid "Variations output" 254 266 msgstr "" 255 267 256 #: includes/admin/class-admin.php: 986268 #: includes/admin/class-admin.php:1018 257 269 msgid "Google Business Vertical" 258 270 msgstr "" 259 271 260 #: includes/admin/class-admin.php: 999272 #: includes/admin/class-admin.php:1031 261 273 msgid "Order Duplication Prevention" 262 274 msgstr "" 263 275 264 #: includes/admin/class-admin.php:10 13276 #: includes/admin/class-admin.php:1045 265 277 msgid "ACR" 266 278 msgstr "" 267 279 268 #: includes/admin/class-admin.php:10 26280 #: includes/admin/class-admin.php:1058 269 281 msgid "Order List Info" 270 282 msgstr "" 271 283 272 #: includes/admin/class-admin.php:10 40284 #: includes/admin/class-admin.php:1072 273 285 msgid "Subscription Value Multiplier" 274 286 msgstr "" 275 287 276 #: includes/admin/class-admin.php:10 53288 #: includes/admin/class-admin.php:1085 277 289 msgid "Lifetime Value Calculation on Orders" 278 290 msgstr "" 279 291 280 #: includes/admin/class-admin.php:10 66292 #: includes/admin/class-admin.php:1098 281 293 msgid "Automatic Lifetime Value Recalculation" 282 294 msgstr "" 283 295 284 #: includes/admin/class-admin.php:1 079296 #: includes/admin/class-admin.php:1111 285 297 msgid "Manual Lifetime Value Recalculation" 286 298 msgstr "" 287 299 288 #: includes/admin/class-admin.php:1 090300 #: includes/admin/class-admin.php:1122 289 301 msgid "Order Extra Details Output" 290 302 msgstr "" 291 303 292 #: includes/admin/class-admin.php:11 13304 #: includes/admin/class-admin.php:1145 293 305 msgid "Google Tag ID" 294 306 msgstr "" 295 307 296 #: includes/admin/class-admin.php:11 25308 #: includes/admin/class-admin.php:1157 297 309 msgid "Google Tag Gateway Measurement Path" 298 310 msgstr "" 299 311 300 #: includes/admin/class-admin.php:11 37312 #: includes/admin/class-admin.php:1169 301 313 msgid "Conversion Cart Data" 302 314 msgstr "" 303 315 304 #: includes/admin/class-admin.php:11 49316 #: includes/admin/class-admin.php:1181 305 317 msgid "Enhanced E-Commerce" 306 318 msgstr "" 307 319 308 #: includes/admin/class-admin.php:11 64320 #: includes/admin/class-admin.php:1196 309 321 msgid "GA4 API secret" 310 322 msgstr "" 311 323 312 #: includes/admin/class-admin.php:1 176324 #: includes/admin/class-admin.php:1208 313 325 msgid "GA4 Property ID" 314 326 msgstr "" 315 327 316 #: includes/admin/class-admin.php:1 188328 #: includes/admin/class-admin.php:1220 317 329 msgid "GA4 Data API Credentials" 318 330 msgstr "" 319 331 320 #: includes/admin/class-admin.php:12 03332 #: includes/admin/class-admin.php:1235 321 333 msgid "GA4 Page Load Time Tracking" 322 334 msgstr "" 323 335 324 #: includes/admin/class-admin.php:12 17336 #: includes/admin/class-admin.php:1249 325 337 msgid "Google User ID" 326 338 msgstr "" 327 339 328 #: includes/admin/class-admin.php:12 31340 #: includes/admin/class-admin.php:1263 329 341 #: includes/admin/opportunities/pro/class-google-enhanced-conversions-opportunity.php:37 330 342 msgid "Google Enhanced Conversions" 331 343 msgstr "" 332 344 333 #: includes/admin/class-admin.php:12 46345 #: includes/admin/class-admin.php:1278 334 346 msgid "Google Ads Phone Conversion Number" 335 347 msgstr "" 336 348 337 #: includes/admin/class-admin.php:12 58349 #: includes/admin/class-admin.php:1290 338 350 msgid "Google Ads Phone Conversion Label" 339 351 msgstr "" 340 352 341 #: includes/admin/class-admin.php:1 272353 #: includes/admin/class-admin.php:1304 342 354 msgid "Google Ads Conversion Adjustments: Conversion Name" 343 355 msgstr "" 344 356 345 #: includes/admin/class-admin.php:1 284357 #: includes/admin/class-admin.php:1316 346 358 msgid "Google Ads Conversion Adjustments: Feed" 347 359 msgstr "" 348 360 349 #: includes/admin/class-admin.php:13 00361 #: includes/admin/class-admin.php:1332 350 362 msgid "Automatic Email Link Tracking" 351 363 msgstr "" 352 364 353 #: includes/admin/class-admin.php:13 12365 #: includes/admin/class-admin.php:1344 354 366 msgid "Automatic Phone Link Click Tracking" 355 367 msgstr "" 356 368 357 #: includes/admin/class-admin.php:13 34369 #: includes/admin/class-admin.php:1366 358 370 msgid "Meta (Facebook) CAPI: token" 359 371 msgstr "" 360 372 361 #: includes/admin/class-admin.php:13 46373 #: includes/admin/class-admin.php:1378 362 374 msgid "Meta (Facebook) CAPI: test event code" 363 375 msgstr "" 364 376 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 370 378 msgid "Meta (Facebook): Advanced Matching" 371 379 msgstr "" 372 380 373 #: includes/admin/class-admin.php:1 382381 #: includes/admin/class-admin.php:1402 374 382 msgid "Meta (Facebook): Domain Verification Meta Tag ID" 375 383 msgstr "" 376 384 377 #: includes/admin/class-admin.php:14 04385 #: includes/admin/class-admin.php:1424 378 386 msgid "Pinterest Ad Account ID" 379 387 msgstr "" 380 388 381 #: includes/admin/class-admin.php:14 16389 #: includes/admin/class-admin.php:1436 382 390 msgid "Pinterest Events API: token" 383 391 msgstr "" 384 392 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 390 394 #: includes/admin/opportunities/pro/class-pinterest-enhanced-match-opportunity.php:37 391 395 msgid "Pinterest Enhanced Match" 392 396 msgstr "" 393 397 394 #: includes/admin/class-admin.php:14 52398 #: includes/admin/class-admin.php:1460 395 399 msgid "Pinterest: Advanced Matching" 396 400 msgstr "" 397 401 398 #: includes/admin/class-admin.php:14 74402 #: includes/admin/class-admin.php:1482 399 403 msgid "Snapchat CAPI Token" 400 404 msgstr "" 401 405 402 #: includes/admin/class-admin.php:14 86406 #: includes/admin/class-admin.php:1494 403 407 #: includes/admin/opportunities/pro/class-snapchat-advanced-matching-opportunity.php:37 404 408 msgid "Snapchat Advanced Matching" 405 409 msgstr "" 406 410 407 #: includes/admin/class-admin.php:1508 411 #: includes/admin/class-admin.php:1516 412 msgid "Reddit Conversions API: token" 413 msgstr "" 414 415 #: includes/admin/class-admin.php:1528 416 msgid "Reddit Conversions API: test event code" 417 msgstr "" 418 419 #: includes/admin/class-admin.php:1540 408 420 msgid "Reddit Advanced Matching" 409 421 msgstr "" 410 422 411 #: includes/admin/class-admin.php:15 30423 #: includes/admin/class-admin.php:1562 412 424 msgid "TikTok Events API: token" 413 425 msgstr "" 414 426 415 #: includes/admin/class-admin.php:15 42427 #: includes/admin/class-admin.php:1574 416 428 msgid "TikTok EAPI: test event code" 417 429 msgstr "" 418 430 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 424 432 msgid "TikTok: Advanced Matching" 425 433 msgstr "" 426 434 427 #: includes/admin/class-admin.php:1 588435 #: includes/admin/class-admin.php:1608 428 436 msgid "Microsoft Enhanced Conversions" 429 437 msgstr "" 430 438 431 #: includes/admin/class-admin.php:16 20439 #: includes/admin/class-admin.php:1640 432 440 msgid "Search event ID" 433 441 msgstr "" 434 442 435 #: includes/admin/class-admin.php:16 32443 #: includes/admin/class-admin.php:1652 436 444 msgid "View Content event ID" 437 445 msgstr "" 438 446 439 #: includes/admin/class-admin.php:16 44447 #: includes/admin/class-admin.php:1664 440 448 msgid "Add To List event ID" 441 449 msgstr "" 442 450 443 #: includes/admin/class-admin.php:16 56451 #: includes/admin/class-admin.php:1676 444 452 msgid "Add-to-cart event ID" 445 453 msgstr "" 446 454 447 #: includes/admin/class-admin.php:16 68455 #: includes/admin/class-admin.php:1688 448 456 msgid "Start-checkout event ID" 449 457 msgstr "" 450 458 451 #: includes/admin/class-admin.php:1 680459 #: includes/admin/class-admin.php:1700 452 460 msgid "Purchase event ID" 453 461 msgstr "" 454 462 455 #: includes/admin/class-admin.php:17 03463 #: includes/admin/class-admin.php:1723 456 464 msgid "Add To Cart Event ID" 457 465 msgstr "" 458 466 459 #: includes/admin/class-admin.php:17 15467 #: includes/admin/class-admin.php:1735 460 468 msgid "Add To Wishlist Event ID" 461 469 msgstr "" 462 470 463 #: includes/admin/class-admin.php:17 27471 #: includes/admin/class-admin.php:1747 464 472 msgid "Content View Event ID" 465 473 msgstr "" 466 474 467 #: includes/admin/class-admin.php:17 39475 #: includes/admin/class-admin.php:1759 468 476 msgid "Search Event ID" 469 477 msgstr "" 470 478 471 #: includes/admin/class-admin.php:17 51479 #: includes/admin/class-admin.php:1771 472 480 msgid "Checkout Initiated Event ID" 473 481 msgstr "" 474 482 475 #: includes/admin/class-admin.php:17 63483 #: includes/admin/class-admin.php:1783 476 484 msgid "Add Payment Info Event ID" 477 485 msgstr "" 478 486 479 #: includes/admin/class-admin.php:17 75487 #: includes/admin/class-admin.php:1795 480 488 msgid "Purchase Event ID" 481 489 msgstr "" 482 490 483 #: includes/admin/class-admin.php:1 787484 #: includes/admin/class-admin.php:1 796491 #: includes/admin/class-admin.php:1807 492 #: includes/admin/class-admin.php:1816 485 493 msgid "Consent Management" 486 494 msgstr "" 487 495 488 #: includes/admin/class-admin.php:18 04496 #: includes/admin/class-admin.php:1824 489 497 msgid "Google Consent Mode v2" 490 498 msgstr "" 491 499 492 #: includes/admin/class-admin.php:18 17500 #: includes/admin/class-admin.php:1837 493 501 msgid "Microsoft Ads Consent Mode" 494 502 msgstr "" 495 503 496 #: includes/admin/class-admin.php:18 30504 #: includes/admin/class-admin.php:1850 497 505 msgid "Explicit Consent Mode" 498 506 msgstr "" 499 507 500 #: includes/admin/class-admin.php:18 42508 #: includes/admin/class-admin.php:1862 501 509 msgid "Explicit Consent Regions" 502 510 msgstr "" 503 511 504 #: includes/admin/class-admin.php:18 55512 #: includes/admin/class-admin.php:1875 505 513 msgid "Google TCF Support" 506 514 msgstr "" 507 515 508 #: includes/admin/class-admin.php:18 69516 #: includes/admin/class-admin.php:1889 509 517 msgid "Cookiebot Support" 510 518 msgstr "" 511 519 512 #: includes/admin/class-admin.php:1 883520 #: includes/admin/class-admin.php:1903 513 521 msgid "Complianz GDPR Support" 514 522 msgstr "" 515 523 516 #: includes/admin/class-admin.php:1 897524 #: includes/admin/class-admin.php:1917 517 525 msgid "Cookie Notice Support" 518 526 msgstr "" 519 527 520 #: includes/admin/class-admin.php:19 11528 #: includes/admin/class-admin.php:1931 521 529 msgid "Cookie Script Support" 522 530 msgstr "" 523 531 524 #: includes/admin/class-admin.php:19 25532 #: includes/admin/class-admin.php:1945 525 533 msgid "GDPR Cookie Compliance Support" 526 534 msgstr "" 527 535 528 #: includes/admin/class-admin.php:19 39536 #: includes/admin/class-admin.php:1959 529 537 msgid "CookieYes Support" 530 538 msgstr "" 531 539 532 #: includes/admin/class-admin.php:19 53540 #: includes/admin/class-admin.php:1973 533 541 msgid "Termly CMP Support" 534 542 msgstr "" 535 543 536 #: includes/admin/class-admin.php:19 68537 #: includes/admin/class-admin.php: 1981544 #: includes/admin/class-admin.php:1988 545 #: includes/admin/class-admin.php:2001 538 546 msgid "Logs" 539 547 msgstr "" 540 548 541 #: includes/admin/class-admin.php: 1992549 #: includes/admin/class-admin.php:2012 542 550 msgid "Logger" 543 551 msgstr "" 544 552 545 #: includes/admin/class-admin.php:20 04553 #: includes/admin/class-admin.php:2024 546 554 msgid "Log Level" 547 555 msgstr "" 548 556 549 #: includes/admin/class-admin.php:20 16557 #: includes/admin/class-admin.php:2036 550 558 msgid "Log HTTP Requests" 551 559 msgstr "" 552 560 553 #: includes/admin/class-admin.php:20 31561 #: includes/admin/class-admin.php:2051 554 562 msgid "Log Files" 555 563 msgstr "" 556 564 557 #: includes/admin/class-admin.php:20 44558 #: includes/admin/class-admin.php:20 53559 #: includes/admin/class-admin.php:23 10565 #: includes/admin/class-admin.php:2064 566 #: includes/admin/class-admin.php:2073 567 #: includes/admin/class-admin.php:2330 560 568 msgid "Diagnostics" 561 569 msgstr "" 562 570 563 #: includes/admin/class-admin.php:20 61564 #: includes/admin/class-admin.php:20 70571 #: includes/admin/class-admin.php:2081 572 #: includes/admin/class-admin.php:2090 565 573 msgid "Opportunities" 566 574 msgstr "" 567 575 568 #: includes/admin/class-admin.php:20 78569 #: includes/admin/class-admin.php:2 087576 #: includes/admin/class-admin.php:2098 577 #: includes/admin/class-admin.php:2107 570 578 msgid "Support" 571 579 msgstr "" 572 580 573 #: includes/admin/class-admin.php:21 19581 #: includes/admin/class-admin.php:2139 574 582 msgid "Contact" 575 583 msgstr "" 576 584 577 #: includes/admin/class-admin.php:21 20585 #: includes/admin/class-admin.php:2140 578 586 msgid "Account" 579 587 msgstr "" 580 588 581 #: includes/admin/class-admin.php:21 54589 #: includes/admin/class-admin.php:2174 582 590 msgid "" 583 591 "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" … … 585 593 msgstr "" 586 594 587 #: includes/admin/class-admin.php:21 60595 #: includes/admin/class-admin.php:2180 588 596 #: includes/admin/notifications/class-notifications.php:385 589 597 #: includes/admin/opportunities/class-opportunities.php:188 … … 591 599 msgstr "" 592 600 593 #: includes/admin/class-admin.php:22 12601 #: includes/admin/class-admin.php:2232 594 602 msgid "Profit Driven Marketing by SweetCode" 595 603 msgstr "" 596 604 597 #: includes/admin/class-admin.php:22 21605 #: includes/admin/class-admin.php:2241 598 606 msgid "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." 599 607 msgstr "" 600 608 601 #: includes/admin/class-admin.php:22 23609 #: includes/admin/class-admin.php:2243 602 610 msgid "Show Pro version settings:" 603 611 msgstr "" 604 612 605 #: includes/admin/class-admin.php:22 47613 #: includes/admin/class-admin.php:2267 606 614 msgid "Visit us here:" 607 615 msgstr "" 608 616 609 #: includes/admin/class-admin.php:23 13617 #: includes/admin/class-admin.php:2333 610 618 msgid "Transients are disabled on your site. Transients are required for the diagnostics report." 611 619 msgstr "" 612 620 613 #: includes/admin/class-admin.php:23 16621 #: includes/admin/class-admin.php:2336 614 622 msgid "Please enable transients on your site." 615 623 msgstr "" 616 624 617 #: includes/admin/class-admin.php:23 27625 #: includes/admin/class-admin.php:2347 618 626 msgid "Payment Gateway Tracking Accuracy Report" 619 627 msgstr "" 620 628 621 #: includes/admin/class-admin.php:23 28622 #: includes/admin/class-admin.php:59 53623 #: includes/admin/class-admin.php:59 63629 #: includes/admin/class-admin.php:2348 630 #: includes/admin/class-admin.php:5927 631 #: includes/admin/class-admin.php:5937 624 632 msgid "beta" 625 633 msgstr "" 626 634 627 #: includes/admin/class-admin.php:23 32635 #: includes/admin/class-admin.php:2352 628 636 msgid "What's this? Follow this link to learn more" 629 637 msgstr "" 630 638 631 #: includes/admin/class-admin.php:23 40639 #: includes/admin/class-admin.php:2360 632 640 msgid "Available payment gateways" 633 641 msgstr "" 634 642 635 #: includes/admin/class-admin.php:23 47643 #: includes/admin/class-admin.php:2367 636 644 msgid "id" 637 645 msgstr "" 638 646 639 #: includes/admin/class-admin.php:23 48647 #: includes/admin/class-admin.php:2368 640 648 msgid "method_title" 641 649 msgstr "" 642 650 643 #: includes/admin/class-admin.php:23 49651 #: includes/admin/class-admin.php:2369 644 652 msgid "class" 645 653 msgstr "" 646 654 647 #: includes/admin/class-admin.php:23 67655 #: includes/admin/class-admin.php:2387 648 656 msgid "Purchase confirmation page reached per gateway (active and inactive)" 649 657 msgstr "" 650 658 651 #: includes/admin/class-admin.php:24 16659 #: includes/admin/class-admin.php:2436 652 660 msgid "Purchase confirmation page reached per gateway (only active), weighted by frequency" 653 661 msgstr "" 654 662 655 #: includes/admin/class-admin.php:2 484663 #: includes/admin/class-admin.php:2504 656 664 msgid "Automatic Conversion Recovery (ACR)" 657 665 msgstr "" 658 666 659 #: includes/admin/class-admin.php:25 48667 #: includes/admin/class-admin.php:2568 660 668 msgid "Unknown gateway" 661 669 msgstr "" 662 670 663 671 #. translators: The number and percentage of orders that were recovered by the Automatic Conversion Recovery (ACR). 664 #: includes/admin/class-admin.php:26 01672 #: includes/admin/class-admin.php:2621 665 673 #, php-format 666 674 msgid "ACR recovered %1$s (%2$s%%) out of %3$s missing conversions." 667 675 msgstr "" 668 676 669 #: includes/admin/class-admin.php:26 19677 #: includes/admin/class-admin.php:2639 670 678 msgid "This feature is only available in the pro version of the plugin. Follow the link to learn more about it:" 671 679 msgstr "" 672 680 673 #: includes/admin/class-admin.php:26 21681 #: includes/admin/class-admin.php:2641 674 682 msgid "Get the pro version of the Pixel Manager for WooCommerce over here" 675 683 msgstr "" 676 684 677 #: includes/admin/class-admin.php:26 23685 #: includes/admin/class-admin.php:2643 678 686 msgid "Go Pro" 679 687 msgstr "" 680 688 681 #: includes/admin/class-admin.php:26 61689 #: includes/admin/class-admin.php:2681 682 690 msgid "Contacting Support" 683 691 msgstr "" 684 692 685 #: includes/admin/class-admin.php:26 78693 #: includes/admin/class-admin.php:2698 686 694 msgid "Debug Information" 687 695 msgstr "" 688 696 689 #: includes/admin/class-admin.php:27 20690 #: includes/admin/class-admin.php:27 47697 #: includes/admin/class-admin.php:2740 698 #: includes/admin/class-admin.php:2767 691 699 msgid "Copy to Clipboard" 692 700 msgstr "" 693 701 694 #: includes/admin/class-admin.php:27 22695 #: includes/admin/class-admin.php:27 50702 #: includes/admin/class-admin.php:2742 703 #: includes/admin/class-admin.php:2770 696 704 msgid "Copied!" 697 705 msgstr "" 698 706 699 #: includes/admin/class-admin.php:27 32707 #: includes/admin/class-admin.php:2752 700 708 msgid "Export settings" 701 709 msgstr "" 702 710 703 #: includes/admin/class-admin.php:27 43711 #: includes/admin/class-admin.php:2763 704 712 msgid "Export to disk" 705 713 msgstr "" 706 714 707 #: includes/admin/class-admin.php:28 26715 #: includes/admin/class-admin.php:2846 708 716 msgid "Import settings" 709 717 msgstr "" 710 718 711 #: includes/admin/class-admin.php:28 30719 #: includes/admin/class-admin.php:2850 712 720 msgid "Choose File" 713 721 msgstr "" 714 722 715 #: includes/admin/class-admin.php:2838 723 #: includes/admin/class-admin.php:2858 724 #: includes/admin/class-admin.php:4583 725 msgid "Settings imported successfully!" 726 msgstr "" 727 728 #: includes/admin/class-admin.php:2861 729 msgid "Reloading...(in 1 second)!" 730 msgstr "" 731 732 #: includes/admin/class-admin.php:2867 733 #: includes/admin/class-admin.php:4592 734 msgid "There was an error importing that file! Please try again." 735 msgstr "" 736 737 #: includes/admin/class-admin.php:2961 738 msgid "Automatic Settings Backup" 739 msgstr "" 740 741 #: includes/admin/class-admin.php:2962 742 msgid "Manage your settings backups. You can restore previous configurations or download backup files." 743 msgstr "" 744 745 #: includes/admin/class-admin.php:2968 746 msgid "No automatic settings backups available." 747 msgstr "" 748 749 #: includes/admin/class-admin.php:2974 750 msgid "ID" 751 msgstr "" 752 753 #: includes/admin/class-admin.php:2975 754 msgid "Date" 755 msgstr "" 756 757 #: includes/admin/class-admin.php:2976 758 msgid "DB Version" 759 msgstr "" 760 761 #: includes/admin/class-admin.php:2977 762 msgid "Status" 763 msgstr "" 764 765 #: includes/admin/class-admin.php:2978 766 #: includes/admin/class-admin.php:3008 767 msgid "Restore" 768 msgstr "" 769 770 #: includes/admin/class-admin.php:2979 771 #: includes/admin/class-admin.php:3011 772 msgid "Download" 773 msgstr "" 774 775 #: includes/admin/class-admin.php:2986 776 msgid "Unknown" 777 msgstr "" 778 779 #: includes/admin/class-admin.php:2999 780 #: includes/admin/class-admin.php:3006 781 msgid "Active" 782 msgstr "" 783 784 #: includes/admin/class-admin.php:3001 785 msgid "Backup" 786 msgstr "" 787 788 #: includes/admin/class-admin.php:3006 789 msgid "Cannot restore the currently active backup" 790 msgstr "" 791 792 #: includes/admin/class-admin.php:3266 793 msgid "Chat with our fantastic AI bot Pixie (Pixie knows everything we do!):" 794 msgstr "" 795 796 #: includes/admin/class-admin.php:3270 797 msgid "Chat" 798 msgstr "" 799 800 #: includes/admin/class-admin.php:3278 801 msgid "Post a support request in the WordPress support forum here: " 802 msgstr "" 803 804 #: includes/admin/class-admin.php:3281 805 msgid "Support forum" 806 msgstr "" 807 808 #: includes/admin/class-admin.php:3285 809 msgid "(Never post the debug or other sensitive information to the support forum. Instead send us the information by email.)" 810 msgstr "" 811 812 #: includes/admin/class-admin.php:3288 813 msgid "Send us an email to the following address:" 814 msgstr "" 815 816 #: includes/admin/class-admin.php:3302 817 msgid "Send us your support request through the WooCommerce.com dashboard: " 818 msgstr "" 819 820 #: includes/admin/class-admin.php:3328 821 msgid "The Google Analytics 4 measurement ID looks like this:" 822 msgstr "" 823 824 #: includes/admin/class-admin.php:3349 825 msgid "The conversion ID looks similar to this:" 826 msgstr "" 827 828 #: includes/admin/class-admin.php:3370 829 msgid "The purchase conversion label looks similar to this:" 830 msgstr "" 831 832 #: includes/admin/class-admin.php:3374 833 msgid "Requires an active Google Ads Conversion ID" 834 msgstr "" 835 836 #: includes/admin/class-admin.php:3395 837 msgid "The VWO account ID looks like this:" 838 msgstr "" 839 840 #: includes/admin/class-admin.php:3414 841 msgid "The Optimizely project ID looks like this:" 842 msgstr "" 843 844 #: includes/admin/class-admin.php:3433 845 msgid "The AB Tasty account ID looks like this:" 846 msgstr "" 847 848 #: includes/admin/class-admin.php:3452 849 msgid "The Meta (Facebook) pixel ID looks similar to this:" 850 msgstr "" 851 852 #: includes/admin/class-admin.php:3482 853 msgid "Requires an active Adroll pixel ID." 854 msgstr "" 855 856 #: includes/admin/class-admin.php:3491 857 msgid "The Adroll advertiser ID looks similar to this:" 858 msgstr "" 859 860 #: includes/admin/class-admin.php:3521 861 msgid "Requires an active Adroll advertiser ID." 862 msgstr "" 863 864 #: includes/admin/class-admin.php:3530 865 msgid "The Adroll pixel ID looks similar to this:" 866 msgstr "" 867 868 #: includes/admin/class-admin.php:3548 869 msgid "Enable Microsoft Enhanced Conversions" 870 msgstr "" 871 872 #: includes/admin/class-admin.php:3576 873 msgid "The LinkedIn partner ID looks similar to this:" 874 msgstr "" 875 876 #: includes/admin/class-admin.php:3729 877 msgid "The Microsoft Advertising UET tag ID looks similar to this:" 878 msgstr "" 879 880 #: includes/admin/class-admin.php:3750 881 msgid "The X (Twitter) pixel ID looks similar to this:" 882 msgstr "" 883 884 #: includes/admin/class-admin.php:3919 885 msgid "The Outbrain advertiser ID looks similar to this:" 886 msgstr "" 887 888 #: includes/admin/class-admin.php:3941 889 msgid "The Pinterest pixel ID looks similar to this:" 890 msgstr "" 891 892 #: includes/admin/class-admin.php:3961 893 msgid "Enable Pinterest enhanced match" 894 msgstr "" 895 896 #: includes/admin/class-admin.php:3990 897 msgid "The Snapchat pixel ID looks similar to this:" 898 msgstr "" 899 900 #: includes/admin/class-admin.php:4013 901 msgid "The Taboola account ID looks similar to this:" 902 msgstr "" 903 904 #: includes/admin/class-admin.php:4035 905 msgid "The TikTok pixel ID looks similar to this:" 906 msgstr "" 907 908 #: includes/admin/class-admin.php:4054 909 msgid "The Hotjar site ID looks similar to this:" 910 msgstr "" 911 912 #: includes/admin/class-admin.php:4079 913 msgid "The Reddit pixel ID looks similar to this:" 914 msgstr "" 915 916 #: includes/admin/class-admin.php:4100 917 msgid "You need to activate the Snapchat pixel" 918 msgstr "" 919 920 #: includes/admin/class-admin.php:4120 921 msgid "Enable Snapchat Advanced Matching" 922 msgstr "" 923 924 #: includes/admin/class-admin.php:4142 925 msgid "Enable Reddit advanced matching" 926 msgstr "" 927 928 #: includes/admin/class-admin.php:4165 929 #: includes/admin/class-admin.php:4186 930 msgid "You need to activate the Reddit pixel" 931 msgstr "" 932 933 #: includes/admin/class-admin.php:4202 934 msgid "Order Subtotal: Doesn't include tax, shipping, and if available, fees like PayPal or Stripe fees (default)" 935 msgstr "" 936 937 #: includes/admin/class-admin.php:4213 938 msgid "Order Total: Includes tax and shipping" 939 msgstr "" 940 941 #: includes/admin/class-admin.php:4229 942 msgid "Profit Margin: Only reports the profit margin. Excludes tax, shipping, and where possible, gateway fees." 943 msgstr "" 944 945 #: includes/admin/class-admin.php:4237 946 msgid "This is the total value reported back to the marketing pixels (such as Google Ads, Meta (Facebook), etc.). It excludes statistics pixels." 947 msgstr "" 948 949 #: includes/admin/class-admin.php:4242 950 msgid "To use the Profit Margin setting you will need to install one of the following two Cost of Goods plugins:" 951 msgstr "" 952 953 #: includes/admin/class-admin.php:4245 954 msgid "or" 955 msgstr "" 956 957 #: includes/admin/class-admin.php:4269 958 #: includes/admin/class-admin.php:4296 959 msgid "open the documentation" 960 msgstr "" 961 962 #: includes/admin/class-admin.php:4286 963 msgid "advanced settings" 964 msgstr "" 965 966 #: includes/admin/class-admin.php:4315 967 msgid "Enable Google Consent Mode v2 with standard settings" 968 msgstr "" 969 970 #: includes/admin/class-admin.php:4336 971 msgid "Enable Microsoft Ads Consent Mode with standard settings" 972 msgstr "" 973 974 #: includes/admin/class-admin.php:4362 975 msgid "Enable Explicit Consent Mode" 976 msgstr "" 977 978 #: includes/admin/class-admin.php:4373 979 msgid "While the Explicit Consent Mode is active no pixels will be fired until the visitor gives consent." 980 msgstr "" 981 982 #: includes/admin/class-admin.php:4378 983 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:" 984 msgstr "" 985 986 #: includes/admin/class-admin.php:4381 987 msgid "Compatible Consent Management Platforms (CMPs)" 988 msgstr "" 989 990 #: includes/admin/class-admin.php:4383 991 msgid "You can also use our Consent API to make your custom cookie banner compatible with the Pixel Manager:" 992 msgstr "" 993 994 #: includes/admin/class-admin.php:4386 995 msgid "Consent API" 996 msgstr "" 997 998 #: includes/admin/class-admin.php:4401 999 msgid "Choose countries" 1000 msgstr "" 1001 1002 #: includes/admin/class-admin.php:4430 1003 msgid "Regions in which tracking with cookies will only be activated after the visitor gives consent." 1004 msgstr "" 1005 1006 #: includes/admin/class-admin.php:4436 1007 msgid "Requires the Explicit Consent Mode to be active." 1008 msgstr "" 1009 1010 #: includes/admin/class-admin.php:4441 1011 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." 1012 msgstr "" 1013 1014 #: includes/admin/class-admin.php:4462 1015 msgid "Enable Google TCF support" 1016 msgstr "" 1017 1018 #: includes/admin/class-admin.php:4473 1019 msgid "Google Analytics Enhanced E-Commerce is " 1020 msgstr "" 1021 1022 #: includes/admin/class-admin.php:4496 1023 msgid "Google Analytics 4 activation required" 1024 msgstr "" 1025 1026 #: includes/admin/class-admin.php:4499 1027 msgid "If enabled, purchase and refund events will be sent to Google through the measurement protocol for increased accuracy." 1028 msgstr "" 1029 716 1030 #: includes/admin/class-admin.php:4521 717 msgid "Settings imported successfully!"718 msgstr ""719 720 #: includes/admin/class-admin.php:2841721 msgid "Reloading...(in 1 second)!"722 msgstr ""723 724 #: includes/admin/class-admin.php:2847725 #: includes/admin/class-admin.php:4530726 msgid "There was an error importing that file! Please try again."727 msgstr ""728 729 #: includes/admin/class-admin.php:2941730 msgid "Automatic Settings Backup"731 msgstr ""732 733 #: includes/admin/class-admin.php:2942734 msgid "Manage your settings backups. You can restore previous configurations or download backup files."735 msgstr ""736 737 #: includes/admin/class-admin.php:2948738 msgid "No automatic settings backups available."739 msgstr ""740 741 #: includes/admin/class-admin.php:2954742 msgid "ID"743 msgstr ""744 745 #: includes/admin/class-admin.php:2955746 msgid "Date"747 msgstr ""748 749 #: includes/admin/class-admin.php:2956750 msgid "DB Version"751 msgstr ""752 753 #: includes/admin/class-admin.php:2957754 msgid "Status"755 msgstr ""756 757 #: includes/admin/class-admin.php:2958758 #: includes/admin/class-admin.php:2988759 msgid "Restore"760 msgstr ""761 762 #: includes/admin/class-admin.php:2959763 #: includes/admin/class-admin.php:2991764 msgid "Download"765 msgstr ""766 767 #: includes/admin/class-admin.php:2966768 msgid "Unknown"769 msgstr ""770 771 #: includes/admin/class-admin.php:2979772 #: includes/admin/class-admin.php:2986773 msgid "Active"774 msgstr ""775 776 #: includes/admin/class-admin.php:2981777 msgid "Backup"778 msgstr ""779 780 #: includes/admin/class-admin.php:2986781 msgid "Cannot restore the currently active backup"782 msgstr ""783 784 #: includes/admin/class-admin.php:3246785 msgid "Chat with our fantastic AI bot Pixie (Pixie knows everything we do!):"786 msgstr ""787 788 #: includes/admin/class-admin.php:3250789 msgid "Chat"790 msgstr ""791 792 #: includes/admin/class-admin.php:3258793 msgid "Post a support request in the WordPress support forum here: "794 msgstr ""795 796 #: includes/admin/class-admin.php:3261797 msgid "Support forum"798 msgstr ""799 800 #: includes/admin/class-admin.php:3265801 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:3268805 msgid "Send us an email to the following address:"806 msgstr ""807 808 #: includes/admin/class-admin.php:3282809 msgid "Send us your support request through the WooCommerce.com dashboard: "810 msgstr ""811 812 #: includes/admin/class-admin.php:3308813 msgid "The Google Analytics 4 measurement ID looks like this:"814 msgstr ""815 816 #: includes/admin/class-admin.php:3329817 msgid "The conversion ID looks similar to this:"818 msgstr ""819 820 #: includes/admin/class-admin.php:3350821 msgid "The purchase conversion label looks similar to this:"822 msgstr ""823 824 #: includes/admin/class-admin.php:3354825 msgid "Requires an active Google Ads Conversion ID"826 msgstr ""827 828 #: includes/admin/class-admin.php:3375829 msgid "The VWO account ID looks like this:"830 msgstr ""831 832 #: includes/admin/class-admin.php:3394833 msgid "The Optimizely project ID looks like this:"834 msgstr ""835 836 #: includes/admin/class-admin.php:3413837 msgid "The AB Tasty account ID looks like this:"838 msgstr ""839 840 #: includes/admin/class-admin.php:3432841 msgid "The Meta (Facebook) pixel ID looks similar to this:"842 msgstr ""843 844 #: includes/admin/class-admin.php:3462845 msgid "Requires an active Adroll pixel ID."846 msgstr ""847 848 #: includes/admin/class-admin.php:3471849 msgid "The Adroll advertiser ID looks similar to this:"850 msgstr ""851 852 #: includes/admin/class-admin.php:3501853 msgid "Requires an active Adroll advertiser ID."854 msgstr ""855 856 #: includes/admin/class-admin.php:3510857 msgid "The Adroll pixel ID looks similar to this:"858 msgstr ""859 860 #: includes/admin/class-admin.php:3528861 msgid "Enable Microsoft Enhanced Conversions"862 msgstr ""863 864 #: includes/admin/class-admin.php:3556865 msgid "The LinkedIn partner ID looks similar to this:"866 msgstr ""867 868 #: includes/admin/class-admin.php:3709869 msgid "The Microsoft Advertising UET tag ID looks similar to this:"870 msgstr ""871 872 #: includes/admin/class-admin.php:3730873 msgid "The X (Twitter) pixel ID looks similar to this:"874 msgstr ""875 876 #: includes/admin/class-admin.php:3899877 msgid "The Outbrain advertiser ID looks similar to this:"878 msgstr ""879 880 #: includes/admin/class-admin.php:3921881 msgid "The Pinterest pixel ID looks similar to this:"882 msgstr ""883 884 #: includes/admin/class-admin.php:3941885 msgid "Enable Pinterest enhanced match"886 msgstr ""887 888 #: includes/admin/class-admin.php:3970889 msgid "The Snapchat pixel ID looks similar to this:"890 msgstr ""891 892 #: includes/admin/class-admin.php:3993893 msgid "The Taboola account ID looks similar to this:"894 msgstr ""895 896 #: includes/admin/class-admin.php:4015897 msgid "The TikTok pixel ID looks similar to this:"898 msgstr ""899 900 #: includes/admin/class-admin.php:4034901 msgid "The Hotjar site ID looks similar to this:"902 msgstr ""903 904 #: includes/admin/class-admin.php:4059905 msgid "The Reddit pixel ID looks similar to this:"906 msgstr ""907 908 #: includes/admin/class-admin.php:4080909 msgid "You need to activate the Snapchat pixel"910 msgstr ""911 912 #: includes/admin/class-admin.php:4100913 msgid "Enable Snapchat Advanced Matching"914 msgstr ""915 916 #: includes/admin/class-admin.php:4122917 msgid "Enable Reddit advanced matching"918 msgstr ""919 920 #: includes/admin/class-admin.php:4140921 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:4151925 msgid "Order Total: Includes tax and shipping"926 msgstr ""927 928 #: includes/admin/class-admin.php:4167929 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:4175933 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:4180937 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:4183941 msgid "or"942 msgstr ""943 944 #: includes/admin/class-admin.php:4207945 #: includes/admin/class-admin.php:4234946 msgid "open the documentation"947 msgstr ""948 949 #: includes/admin/class-admin.php:4224950 msgid "advanced settings"951 msgstr ""952 953 #: includes/admin/class-admin.php:4253954 msgid "Enable Google Consent Mode v2 with standard settings"955 msgstr ""956 957 #: includes/admin/class-admin.php:4274958 msgid "Enable Microsoft Ads Consent Mode with standard settings"959 msgstr ""960 961 #: includes/admin/class-admin.php:4300962 msgid "Enable Explicit Consent Mode"963 msgstr ""964 965 #: includes/admin/class-admin.php:4311966 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:4316970 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:4319974 msgid "Compatible Consent Management Platforms (CMPs)"975 msgstr ""976 977 #: includes/admin/class-admin.php:4321978 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:4324982 msgid "Consent API"983 msgstr ""984 985 #: includes/admin/class-admin.php:4339986 msgid "Choose countries"987 msgstr ""988 989 #: includes/admin/class-admin.php:4368990 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:4374994 msgid "Requires the Explicit Consent Mode to be active."995 msgstr ""996 997 #: includes/admin/class-admin.php:4379998 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:44001002 msgid "Enable Google TCF support"1003 msgstr ""1004 1005 #: includes/admin/class-admin.php:44111006 msgid "Google Analytics Enhanced E-Commerce is "1007 msgstr ""1008 1009 #: includes/admin/class-admin.php:44341010 msgid "Google Analytics 4 activation required"1011 msgstr ""1012 1013 #: includes/admin/class-admin.php:44371014 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:44591018 1031 msgid "GA4 Data API Credentials need to be set." 1019 1032 msgstr "" 1020 1033 1021 #: includes/admin/class-admin.php:4 4991034 #: includes/admin/class-admin.php:4561 1022 1035 msgid "Import credentials" 1023 1036 msgstr "" 1024 1037 1025 #: includes/admin/class-admin.php:45 101038 #: includes/admin/class-admin.php:4572 1026 1039 msgid "Delete credentials" 1027 1040 msgstr "" 1028 1041 1029 #: includes/admin/class-admin.php:45 241042 #: includes/admin/class-admin.php:4586 1030 1043 msgid "Reloading...(in 5 seconds)!" 1031 1044 msgstr "" 1032 1045 1033 #: includes/admin/class-admin.php:4 5411046 #: includes/admin/class-admin.php:4603 1034 1047 msgid "The GA4 Property ID needs to be set." 1035 1048 msgstr "" 1036 1049 1037 #: includes/admin/class-admin.php:4 5601050 #: includes/admin/class-admin.php:4622 1038 1051 msgid "GA4 page load time tracking." 1039 1052 msgstr "" 1040 1053 1041 #: includes/admin/class-admin.php:4 5841054 #: includes/admin/class-admin.php:4646 1042 1055 msgid "Enable Google user ID" 1043 1056 msgstr "" 1044 1057 1045 #: includes/admin/class-admin.php:4 5951058 #: includes/admin/class-admin.php:4657 1046 1059 msgid "You need to activate GA4 and/or Google Ads" 1047 1060 msgstr "" 1048 1061 1049 #: includes/admin/class-admin.php:46 151062 #: includes/admin/class-admin.php:4677 1050 1063 msgid "Enable Enhanced Conversions for Google Ads and GA4" 1051 1064 msgstr "" 1052 1065 1053 #: includes/admin/class-admin.php:46 251066 #: includes/admin/class-admin.php:4687 1054 1067 msgid "You need to activate Google Ads and or GA4" 1055 1068 msgstr "" 1056 1069 1057 #: includes/admin/class-admin.php:4 6461070 #: includes/admin/class-admin.php:4708 1058 1071 msgid "The Google Ads phone conversion number must be in the same format as on the website." 1059 1072 msgstr "" 1060 1073 1061 #: includes/admin/class-admin.php:4 6841074 #: includes/admin/class-admin.php:4746 1062 1075 msgid "The conversion name must match the conversion name in Google Ads exactly." 1063 1076 msgstr "" 1064 1077 1065 #: includes/admin/class-admin.php:4 6921078 #: includes/admin/class-admin.php:4754 1066 1079 msgid "Requires an active Google Ads Conversion ID and Conversion Label." 1067 1080 msgstr "" 1068 1081 1069 #: includes/admin/class-admin.php:47 231082 #: includes/admin/class-admin.php:4785 1070 1083 msgid "Copied feed URL to clipboard" 1071 1084 msgstr "" 1072 1085 1073 #: includes/admin/class-admin.php:47 281074 #: includes/admin/class-admin.php:47 351075 #: includes/admin/class-admin.php:61 361076 #: includes/admin/class-admin.php:61 651086 #: 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 1077 1090 msgid "Copy to clipboard" 1078 1091 msgstr "" 1079 1092 1080 #: includes/admin/class-admin.php:4 7431093 #: includes/admin/class-admin.php:4805 1081 1094 msgid "The Conversion Name must be set." 1082 1095 msgstr "" 1083 1096 1084 #: includes/admin/class-admin.php:4 7511097 #: includes/admin/class-admin.php:4813 1085 1098 msgid "Automatic email link click tracking is " 1086 1099 msgstr "" 1087 1100 1088 #: includes/admin/class-admin.php:4 7571101 #: includes/admin/class-admin.php:4819 1089 1102 msgid "Automatic phone link click tracking is " 1090 1103 msgstr "" 1091 1104 1092 #: includes/admin/class-admin.php:4 7631105 #: includes/admin/class-admin.php:4825 1093 1106 msgid "Cookiebot detected. Automatic support is:" 1094 1107 msgstr "" 1095 1108 1096 #: includes/admin/class-admin.php:4 7691109 #: includes/admin/class-admin.php:4831 1097 1110 msgid "Complianz GDPR detected. Automatic support is:" 1098 1111 msgstr "" 1099 1112 1100 #: includes/admin/class-admin.php:4 7751113 #: includes/admin/class-admin.php:4837 1101 1114 msgid "Cookie Notice (by hu-manity.co) detected. Automatic support is:" 1102 1115 msgstr "" 1103 1116 1104 #: includes/admin/class-admin.php:4 7811117 #: includes/admin/class-admin.php:4843 1105 1118 msgid "Cookie Script (by cookie-script.com) detected. Automatic support is:" 1106 1119 msgstr "" 1107 1120 1108 #: includes/admin/class-admin.php:4 7871121 #: includes/admin/class-admin.php:4849 1109 1122 msgid "GDPR Cookie Compliance (by Moove Agency) detected. Automatic support is:" 1110 1123 msgstr "" 1111 1124 1112 #: includes/admin/class-admin.php:4 7931125 #: includes/admin/class-admin.php:4855 1113 1126 msgid "CookieYes detected. Automatic support is" 1114 1127 msgstr "" 1115 1128 1116 #: includes/admin/class-admin.php:4 7991129 #: includes/admin/class-admin.php:4861 1117 1130 msgid "Termly CMP detected. Automatic support is:" 1118 1131 msgstr "" 1119 1132 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 1123 1135 msgid "You need to activate the Meta (Facebook) pixel" 1124 1136 msgstr "" 1125 1137 1126 #: includes/admin/class-admin.php:4 8501138 #: includes/admin/class-admin.php:4912 1127 1139 msgid "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." 1128 1140 msgstr "" 1129 1141 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 1137 1145 msgid "Send events with additional visitor identifiers, such as email and phone number, if available." 1138 1146 msgstr "" 1139 1147 1140 #: includes/admin/class-admin.php:49 301148 #: includes/admin/class-admin.php:4962 1141 1149 msgid "The Meta domain verification ID. It looks like this:" 1142 1150 msgstr "" 1143 1151 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 1147 1154 msgid "You need to activate the Pinterest pixel" 1148 1155 msgstr "" 1149 1156 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 1157 1159 msgid "You need to activate the TikTok pixel" 1158 1160 msgstr "" 1159 1161 1160 #: includes/admin/class-admin.php:50 871162 #: includes/admin/class-admin.php:5090 1161 1163 msgid "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." 1162 1164 msgstr "" 1163 1165 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 1167 msgid "Only disable order duplication prevention for testing." 1168 msgstr "" 1169 1170 #: includes/admin/class-admin.php:5154 1171 msgid "Automatically reactivates 6 hours after disabling duplication prevention." 1166 1172 msgstr "" 1167 1173 1168 1174 #: includes/admin/class-admin.php:5174 1169 msgid "Only disable order duplication prevention for testing."1170 msgstr ""1171 1172 #: includes/admin/class-admin.php:51801173 msgid "Automatically reactivates 6 hours after disabling duplication prevention."1174 msgstr ""1175 1176 #: includes/admin/class-admin.php:52001177 1175 msgid "Enable the maximum compatibility mode" 1178 1176 msgstr "" 1179 1177 1180 #: includes/admin/class-admin.php:52 371178 #: includes/admin/class-admin.php:5211 1181 1179 msgid "Automatic Conversion Recovery (ACR) is " 1182 1180 msgstr "" 1183 1181 1184 #: includes/admin/class-admin.php:52 581182 #: includes/admin/class-admin.php:5232 1185 1183 msgid "Display Pixel Manager related information on the order list page" 1186 1184 msgstr "" 1187 1185 1188 #: includes/admin/class-admin.php:52 831186 #: includes/admin/class-admin.php:5257 1189 1187 msgid "The Scroll Tracker thresholds. A comma separated list of scroll tracking thresholds in percent where the scroll tracker triggers its events." 1190 1188 msgstr "" 1191 1189 1192 #: includes/admin/class-admin.php:5 3061190 #: includes/admin/class-admin.php:5280 1193 1191 msgid "The multiplier multiplies the conversion value output for initial subscriptions to match the CLV of a subscription more closely." 1194 1192 msgstr "" 1195 1193 1196 #: includes/admin/class-admin.php:53 261194 #: includes/admin/class-admin.php:5300 1197 1195 msgid "Enable the lifetime value calculation on new orders." 1198 1196 msgstr "" 1199 1197 1200 #: includes/admin/class-admin.php:53 511198 #: includes/admin/class-admin.php:5325 1201 1199 msgid "Enable the automatic detection and recalculation of the lifetime value." 1202 1200 msgstr "" 1203 1201 1202 #: includes/admin/class-admin.php:5348 1203 msgid "Enable the output of extra order details on order pages." 1204 msgstr "" 1205 1206 #: includes/admin/class-admin.php:5367 1207 msgid "Schedule LTV recalculation" 1208 msgstr "" 1209 1204 1210 #: 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:53931209 msgid "Schedule LTV recalculation"1210 msgstr ""1211 1212 #: includes/admin/class-admin.php:54001213 1211 msgid "Instant LTV recalculation" 1214 1212 msgstr "" 1215 1213 1216 #: includes/admin/class-admin.php:5 4081214 #: includes/admin/class-admin.php:5382 1217 1215 msgid "Stop all LTV calculations" 1218 1216 msgstr "" 1219 1217 1220 #: includes/admin/class-admin.php:5 4141218 #: includes/admin/class-admin.php:5388 1221 1219 msgid "Recalculation has been scheduled for a run over night. Click one more time to start the recalculation immediately." 1222 1220 msgstr "" 1223 1221 1224 #: includes/admin/class-admin.php:5 4201222 #: includes/admin/class-admin.php:5394 1225 1223 msgid "The recalculation is running." 1226 1224 msgstr "" 1227 1225 1228 #: includes/admin/class-admin.php:54 501226 #: includes/admin/class-admin.php:5424 1229 1227 msgid "Lazy load the Pixel Manager" 1230 1228 msgstr "" 1231 1229 1232 #: includes/admin/class-admin.php:54 581230 #: includes/admin/class-admin.php:5432 1233 1231 msgid "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." 1234 1232 msgstr "" 1235 1233 1236 #: includes/admin/class-admin.php:54 641234 #: includes/admin/class-admin.php:5438 1237 1235 msgid "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." 1238 1236 msgstr "" 1239 1237 1240 #: includes/admin/class-admin.php:54 861238 #: includes/admin/class-admin.php:5460 1241 1239 msgid "Send PageView events through the server-2-server protocol" 1242 1240 msgstr "" 1243 1241 1244 #: includes/admin/class-admin.php:54 951242 #: includes/admin/class-admin.php:5469 1245 1243 msgid "For this feature to be used, at least one server-to-server feature, like Facebook CAPI must be enabled." 1246 1244 msgstr "" 1247 1245 1248 #: includes/admin/class-admin.php:5 5001246 #: includes/admin/class-admin.php:5474 1249 1247 msgid "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." 1250 1248 msgstr "" 1251 1249 1252 #: includes/admin/class-admin.php:5 5071250 #: includes/admin/class-admin.php:5481 1253 1251 msgid "Advanced order duplication prevention is " 1254 1252 msgstr "" 1255 1253 1256 #: includes/admin/class-admin.php:5 5091254 #: includes/admin/class-admin.php:5483 1257 1255 msgid "Basic order duplication prevention is " 1258 1256 msgstr "" 1259 1257 1260 #: includes/admin/class-admin.php:5 5231258 #: includes/admin/class-admin.php:5497 1261 1259 msgid "Dynamic Remarketing is" 1262 1260 msgstr "" 1263 1261 1264 #: includes/admin/class-admin.php:55 421262 #: includes/admin/class-admin.php:5516 1265 1263 msgid "Enable logger" 1266 1264 msgstr "" 1267 1265 1268 #: includes/admin/class-admin.php:55 791266 #: includes/admin/class-admin.php:5553 1269 1267 msgid "Enable HTTP request logging" 1270 1268 msgstr "" 1271 1269 1272 #: includes/admin/class-admin.php:55 881270 #: includes/admin/class-admin.php:5562 1273 1271 msgid "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." 1274 1272 msgstr "" 1275 1273 1276 #: includes/admin/class-admin.php:5 6071274 #: includes/admin/class-admin.php:5581 1277 1275 msgid "Show recent log file" 1278 1276 msgstr "" 1279 1277 1280 #: includes/admin/class-admin.php:5 6091278 #: includes/admin/class-admin.php:5583 1281 1279 msgid "No log file found to view" 1282 1280 msgstr "" 1283 1281 1284 #: includes/admin/class-admin.php:56 261282 #: includes/admin/class-admin.php:5600 1285 1283 msgid "Download all log files" 1286 1284 msgstr "" 1287 1285 1286 #: includes/admin/class-admin.php:5602 1287 msgid "No log files found to download" 1288 msgstr "" 1289 1290 #: includes/admin/class-admin.php:5622 1291 msgid "Enable variations output" 1292 msgstr "" 1293 1288 1294 #: includes/admin/class-admin.php:5628 1289 msgid "No log files found to download"1290 msgstr ""1291 1292 #: includes/admin/class-admin.php:56481293 msgid "Enable variations output"1294 msgstr ""1295 1296 #: includes/admin/class-admin.php:56541297 1295 msgid "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." 1298 1296 msgstr "" 1299 1297 1300 #: includes/admin/class-admin.php:56 711298 #: includes/admin/class-admin.php:5645 1301 1299 msgid "Retail" 1302 1300 msgstr "" 1303 1301 1304 #: includes/admin/class-admin.php:56 821302 #: includes/admin/class-admin.php:5656 1305 1303 msgid "Education" 1306 1304 msgstr "" 1307 1305 1308 #: includes/admin/class-admin.php:56 931306 #: includes/admin/class-admin.php:5667 1309 1307 msgid "Hotels and rentals" 1310 1308 msgstr "" 1311 1309 1312 #: includes/admin/class-admin.php:5 7041310 #: includes/admin/class-admin.php:5678 1313 1311 msgid "Jobs" 1314 1312 msgstr "" 1315 1313 1316 #: includes/admin/class-admin.php:5 7151314 #: includes/admin/class-admin.php:5689 1317 1315 msgid "Local deals" 1318 1316 msgstr "" 1319 1317 1320 #: includes/admin/class-admin.php:57 261318 #: includes/admin/class-admin.php:5700 1321 1319 msgid "Real estate" 1322 1320 msgstr "" 1323 1321 1324 #: includes/admin/class-admin.php:57 371322 #: includes/admin/class-admin.php:5711 1325 1323 msgid "Custom" 1326 1324 msgstr "" 1327 1325 1328 #: includes/admin/class-admin.php:57 661326 #: includes/admin/class-admin.php:5740 1329 1327 msgid "Your Google tag ID. This field is read-only but you can click to select and copy the text." 1330 1328 msgstr "" 1331 1329 1332 #: includes/admin/class-admin.php:57 881333 #: includes/admin/class-admin.php:59 761330 #: includes/admin/class-admin.php:5762 1331 #: includes/admin/class-admin.php:5950 1334 1332 msgid "inactive" 1335 1333 msgstr "" 1336 1334 1337 #: includes/admin/class-admin.php:57 911338 #: includes/admin/class-admin.php:59 701335 #: includes/admin/class-admin.php:5765 1336 #: includes/admin/class-admin.php:5944 1339 1337 msgid "active" 1340 1338 msgstr "" 1341 1339 1342 #: includes/admin/class-admin.php:57 941343 #: includes/admin/class-admin.php:59 821340 #: includes/admin/class-admin.php:5768 1341 #: includes/admin/class-admin.php:5956 1344 1342 msgid "partially active" 1345 1343 msgstr "" 1346 1344 1347 #: includes/admin/class-admin.php:5799 1345 #: includes/admin/class-admin.php:5773 1346 #: includes/admin/class-admin.php:5974 1347 msgid "health check passed" 1348 msgstr "" 1349 1350 #: includes/admin/class-admin.php:5776 1351 #: includes/admin/class-admin.php:5980 1352 msgid "health check failed" 1353 msgstr "" 1354 1355 #: includes/admin/class-admin.php:5782 1356 msgid "Your Google Gateway Measurement Path. It should look like this:" 1357 msgstr "" 1358 1359 #: includes/admin/class-admin.php:5866 1360 msgid "ID of your Google Merchant Center account. It looks like this: 12345678" 1361 msgstr "" 1362 1363 #: includes/admin/class-admin.php:5878 1364 msgid "post ID (default)" 1365 msgstr "" 1366 1367 #: includes/admin/class-admin.php:5887 1368 msgid "SKU" 1369 msgstr "" 1370 1371 #: includes/admin/class-admin.php:5897 1372 msgid "ID for the WooCommerce Google Product Feed. Outputs the post ID with woocommerce_gpf_ prefix *" 1373 msgstr "" 1374 1375 #: includes/admin/class-admin.php:5907 1376 msgid "ID for the WooCommerce Google Listings & Ads Plugin. Outputs the post ID with gla_ prefix **" 1377 msgstr "" 1378 1379 #: includes/admin/class-admin.php:5911 1380 msgid "Choose a product identifier." 1381 msgstr "" 1382 1383 #: includes/admin/class-admin.php:5914 1384 msgid "* This is for users of the WooCommerce Google Product Feed Plugin" 1385 msgstr "" 1386 1387 #: includes/admin/class-admin.php:5918 1388 msgid "** This is for users of the WooCommerce Google Listings & Ads Plugin" 1389 msgstr "" 1390 1391 #: includes/admin/class-admin.php:5931 1392 msgid "experiment" 1393 msgstr "" 1394 1395 #: includes/admin/class-admin.php:5962 1396 msgid "override" 1397 msgstr "" 1398 1399 #: includes/admin/class-admin.php:5968 1400 #: includes/admin/class-admin.php:5985 1401 msgid "deprecated" 1402 msgstr "" 1403 1404 #: includes/admin/class-admin.php:5997 1405 msgid "Get Pro" 1406 msgstr "" 1407 1348 1408 #: includes/admin/class-admin.php:6000 1349 msgid "health check passed"1350 msgstr ""1351 1352 #: includes/admin/class-admin.php:58021353 #: includes/admin/class-admin.php:60061354 msgid "health check failed"1355 msgstr ""1356 1357 #: includes/admin/class-admin.php:58081358 msgid "Your Google Gateway Measurement Path. It should look like this:"1359 msgstr ""1360 1361 #: includes/admin/class-admin.php:58921362 msgid "ID of your Google Merchant Center account. It looks like this: 12345678"1363 msgstr ""1364 1365 #: includes/admin/class-admin.php:59041366 msgid "post ID (default)"1367 msgstr ""1368 1369 #: includes/admin/class-admin.php:59131370 msgid "SKU"1371 msgstr ""1372 1373 #: includes/admin/class-admin.php:59231374 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:59331378 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:59371382 msgid "Choose a product identifier."1383 msgstr ""1384 1385 #: includes/admin/class-admin.php:59401386 msgid "* This is for users of the WooCommerce Google Product Feed Plugin"1387 msgstr ""1388 1389 #: includes/admin/class-admin.php:59441390 msgid "** This is for users of the WooCommerce Google Listings & Ads Plugin"1391 msgstr ""1392 1393 #: includes/admin/class-admin.php:59571394 msgid "experiment"1395 msgstr ""1396 1397 #: includes/admin/class-admin.php:59881398 msgid "override"1399 msgstr ""1400 1401 #: includes/admin/class-admin.php:59941402 #: includes/admin/class-admin.php:60111403 msgid "deprecated"1404 msgstr ""1405 1406 #: includes/admin/class-admin.php:60231407 msgid "Get Pro"1408 msgstr ""1409 1410 #: includes/admin/class-admin.php:60261411 1409 msgid "Start a free trial" 1412 1410 msgstr "" 1413 1411 1414 #: includes/admin/class-admin.php:60 311412 #: includes/admin/class-admin.php:6005 1415 1413 msgid "Pro Feature" 1416 1414 msgstr "" 1417 1415 1418 #: includes/admin/class-admin.php:61 311416 #: includes/admin/class-admin.php:6105 1419 1417 msgid "Copied" 1420 1418 msgstr "" … … 1512 1510 msgstr "" 1513 1511 1512 #: includes/admin/class-validations.php:217 1513 msgid "You have entered an invalid phone number for Google Ads phone conversion tracking." 1514 msgstr "" 1515 1514 1516 #. Translators: %s is the placeholder for the Google tag gateway measurement path. 1515 #: includes/admin/class-validations.php:2 271517 #: includes/admin/class-validations.php:242 1516 1518 #, php-format 1517 1519 msgid "You have entered an invalid Google tag gateway measurement path. It should look like %s" 1518 1520 msgstr "" 1519 1521 1520 #: includes/admin/class-validations.php:2 451522 #: includes/admin/class-validations.php:260 1521 1523 msgid "You have entered an invalid merchant ID. It only contains 6 to 12 digits." 1522 1524 msgstr "" 1523 1525 1524 #: includes/admin/class-validations.php:2 601526 #: includes/admin/class-validations.php:275 1525 1527 msgid "You have entered an invalid Meta (Facebook) pixel ID. It only contains 12 to 22 digits." 1526 1528 msgstr "" 1527 1529 1528 #: includes/admin/class-validations.php:2 751530 #: includes/admin/class-validations.php:290 1529 1531 msgid "You have entered an invalid Meta (Facebook) CAPI token." 1530 1532 msgstr "" 1531 1533 1532 #: includes/admin/class-validations.php: 2901534 #: includes/admin/class-validations.php:305 1533 1535 msgid "You have entered an invalid Meta (Facebook) CAPI test_event_code." 1534 1536 msgstr "" 1535 1537 1536 #: includes/admin/class-validations.php:3 111538 #: includes/admin/class-validations.php:326 1537 1539 msgid "You have entered an invalid Meta (Facebook) domain verification ID." 1538 1540 msgstr "" 1539 1541 1540 #: includes/admin/class-validations.php:3 271542 #: includes/admin/class-validations.php:342 1541 1543 msgid "You have entered an invalid Bing Ads UET tag ID. It only contains 7 to 9 digits." 1542 1544 msgstr "" 1543 1545 1544 #: includes/admin/class-validations.php:3 421546 #: includes/admin/class-validations.php:357 1545 1547 msgid "You have entered an invalid LinkedIn partner ID." 1546 1548 msgstr "" 1547 1549 1548 #: includes/admin/class-validations.php:3 621550 #: includes/admin/class-validations.php:380 1549 1551 msgid "You have entered an invalid Outbrain advertiser ID." 1550 1552 msgstr "" 1551 1553 1552 #: includes/admin/class-validations.php:3 771554 #: includes/admin/class-validations.php:395 1553 1555 msgid "You have entered an invalid Pinterest ad account ID." 1554 1556 msgstr "" 1555 1557 1556 #: includes/admin/class-validations.php: 3921558 #: includes/admin/class-validations.php:410 1557 1559 msgid "You have entered an invalid Pinterest API token." 1558 1560 msgstr "" 1559 1561 1560 #: includes/admin/class-validations.php:4 071562 #: includes/admin/class-validations.php:425 1561 1563 msgid "You have entered an invalid Twitter pixel ID. It only contains 5 to 7 lowercase letters and numbers." 1562 1564 msgstr "" 1563 1565 1564 #: includes/admin/class-validations.php:4 311566 #: includes/admin/class-validations.php:449 1565 1567 msgid "You have entered an invalid Pinterest pixel ID. It only contains 13 digits." 1566 1568 msgstr "" 1567 1569 1568 #: includes/admin/class-validations.php:4 461570 #: includes/admin/class-validations.php:464 1569 1571 msgid "You have entered an invalid Snapchat pixel ID." 1570 1572 msgstr "" 1571 1573 1572 #: includes/admin/class-validations.php:4 611574 #: includes/admin/class-validations.php:479 1573 1575 msgid "You have entered an invalid Snapchat CAPI token." 1574 1576 msgstr "" 1575 1577 1576 #: includes/admin/class-validations.php:4 761578 #: includes/admin/class-validations.php:494 1577 1579 msgid "You have entered an invalid Taboola account ID." 1578 1580 msgstr "" 1579 1581 1580 #: includes/admin/class-validations.php: 4911582 #: includes/admin/class-validations.php:509 1581 1583 msgid "You have entered an invalid TikTok pixel ID." 1582 1584 msgstr "" 1583 1585 1584 #: includes/admin/class-validations.php:5 061586 #: includes/admin/class-validations.php:524 1585 1587 msgid "You have entered an invalid TikTok Events API access token." 1586 1588 msgstr "" 1587 1589 1588 #: includes/admin/class-validations.php:5 211590 #: includes/admin/class-validations.php:539 1589 1591 msgid "You have entered an invalid TikTok EAPI test_event_code." 1590 1592 msgstr "" 1591 1593 1592 #: includes/admin/class-validations.php:5 361594 #: includes/admin/class-validations.php:554 1593 1595 msgid "You have entered an invalid Hotjar site ID. It only contains 6 to 9 digits." 1594 1596 msgstr "" 1595 1597 1596 #: includes/admin/class-validations.php:5 511598 #: includes/admin/class-validations.php:569 1597 1599 msgid "You have entered an invalid Reddit pixel ID." 1598 1600 msgstr "" 1599 1601 1600 #: includes/admin/class-validations.php:566 1602 #: includes/admin/class-validations.php:584 1603 msgid "You have entered an invalid Reddit CAPI token." 1604 msgstr "" 1605 1606 #: includes/admin/class-validations.php:599 1607 msgid "You have entered an invalid Reddit CAPI test event code." 1608 msgstr "" 1609 1610 #: includes/admin/class-validations.php:614 1601 1611 msgid "You have entered an invalid VWO account ID." 1602 1612 msgstr "" 1603 1613 1604 #: includes/admin/class-validations.php: 5811614 #: includes/admin/class-validations.php:629 1605 1615 msgid "You have entered an invalid Optimizely project ID." 1606 1616 msgstr "" 1607 1617 1608 #: includes/admin/class-validations.php: 5961618 #: includes/admin/class-validations.php:644 1609 1619 msgid "You have entered an invalid AB Tasty account ID." 1610 1620 msgstr "" 1611 1621 1612 #: includes/admin/class-validations.php:6 271622 #: includes/admin/class-validations.php:675 1613 1623 msgid "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\"" 1614 1624 msgstr "" 1615 1625 1616 #: includes/admin/class-validations.php:6 511626 #: includes/admin/class-validations.php:699 1617 1627 msgid "You have entered an invalid subscription value multiplier. It must be a number and at least 1.00" 1618 1628 msgstr "" 1619 1629 1620 #: includes/admin/class-validations.php: 6731630 #: includes/admin/class-validations.php:721 1621 1631 msgid "You have entered an invalid conversion adjustments conversion name. Special characters, quotes and single quotes are not allowed due to security reasons." 1622 1632 msgstr "" 1623 1633 1624 #: includes/admin/class-validations.php:7 161634 #: includes/admin/class-validations.php:764 1625 1635 msgid "You have entered an invalid Twitter event ID." 1626 1636 msgstr "" 1627 1637 1628 #: includes/admin/class-validations.php:7 421638 #: includes/admin/class-validations.php:790 1629 1639 msgid "You have entered an invalid LinkedIn conversion ID." 1630 1640 msgstr "" … … 1746 1756 #: includes/admin/opportunities/pro/class-google-enhanced-conversions-opportunity.php:51 1747 1757 #: includes/admin/opportunities/pro/class-meta-capi-opportunity.php:51 1758 #: includes/admin/opportunities/pro/class-reddit-capi-opportunity.php:51 1748 1759 #: includes/admin/opportunities/pro/class-subscription-multiplier-opportunity.php:56 1749 1760 msgid "high" … … 1798 1809 msgstr "" 1799 1810 1811 #: includes/admin/opportunities/pro/class-reddit-capi-opportunity.php:37 1812 msgid "Reddit Conversions API" 1813 msgstr "" 1814 1815 #: includes/admin/opportunities/pro/class-reddit-capi-opportunity.php:42 1816 msgid "The Pixel Manager detected that the Reddit Pixel is enabled, but Reddit Conversions API has yet to be enabled." 1817 msgstr "" 1818 1819 #: includes/admin/opportunities/pro/class-reddit-capi-opportunity.php:46 1820 msgid "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." 1821 msgstr "" 1822 1800 1823 #: includes/admin/opportunities/pro/class-snapchat-advanced-matching-opportunity.php:42 1801 1824 msgid "The Pixel Manager detected that the Snapchat pixel is active on your site, but Advanced Matching is not enabled." … … 1818 1841 msgstr "" 1819 1842 1820 #: includes/pixels/class-pixel-manager.php:5 201843 #: includes/pixels/class-pixel-manager.php:597 1821 1844 msgid "You can not view private data." 1822 1845 msgstr "" 1823 1846 1824 #: includes/pixels/class-pixel-manager.php:6 001847 #: includes/pixels/class-pixel-manager.php:694 1825 1848 msgid "Try going through the setup process again." 1826 1849 msgstr "" -
woocommerce-google-adwords-conversion-tracking-tag/trunk/readme.txt
r3403843 r3406541 3 3 Tags: woocommerce, google analytics, google ads, facebook pixel, conversion tracking 4 4 Requires at least: 3.7 5 Tested up to: 6. 85 Tested up to: 6.9 6 6 Requires PHP: 7.3 7 Stable tag: 1.5 1.17 Stable tag: 1.52.0 8 8 License: GPLv3 or later 9 9 License URI: http://www.gnu.org/licenses/gpl-3.0.html … … 302 302 == Changelog == 303 303 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 304 312 = 1.51.1 = 305 313 *Release date - 27.11.2025* -
woocommerce-google-adwords-conversion-tracking-tag/trunk/vendor/composer/installed.php
r3403843 r3406541 4 4 'pretty_version' => 'dev-master', 5 5 'version' => 'dev-master', 6 'reference' => ' a1facada8c902f15b6ea8c4824567e3790f00693',6 'reference' => 'dcabb56a5fc44cd22c4e6537cb80d163e3861f47', 7 7 'type' => 'wordpress-plugin', 8 8 'install_path' => __DIR__ . '/../../', … … 56 56 'pretty_version' => 'dev-master', 57 57 'version' => 'dev-master', 58 'reference' => ' a1facada8c902f15b6ea8c4824567e3790f00693',58 'reference' => 'dcabb56a5fc44cd22c4e6537cb80d163e3861f47', 59 59 'type' => 'wordpress-plugin', 60 60 'install_path' => __DIR__ . '/../../', -
woocommerce-google-adwords-conversion-tracking-tag/trunk/wgact.php
r3403843 r3406541 10 10 * Text Domain: woocommerce-google-adwords-conversion-tracking-tag 11 11 * Domain path: /languages 12 * Version: 1.5 1.112 * Version: 1.52.0 13 13 * 14 14 * WC requires at least: 3.7 … … 22 22 defined('ABSPATH') || exit; // Exit if accessed directly 23 23 24 $pmw_version = '1.5 1.1';24 $pmw_version = '1.52.0'; 25 25 $plugin_basename = plugin_basename(__FILE__); 26 26
Note: See TracChangeset
for help on using the changeset viewer.