{
  "exportFormatVersion": 2,
  "exportTime": "2026-05-07 08:50:12",
  "containerVersion": {
    "path": "accounts/6353828409/containers/251606233/versions/0",
    "accountId": "6353828409",
    "containerId": "251606233",
    "containerVersionId": "0",
    "container": {
      "path": "accounts/6353828409/containers/251606233",
      "accountId": "6353828409",
      "containerId": "251606233",
      "name": "www.suhanduman.com",
      "publicId": "GTM-MPB2VGT9",
      "usageContext": [
        "WEB"
      ],
      "fingerprint": "1778088608652",
      "tagManagerUrl": "https://tagmanager.google.com/#/container/accounts/6353828409/containers/251606233/workspaces?apiLink=container",
      "features": {
        "supportUserPermissions": true,
        "supportEnvironments": true,
        "supportWorkspaces": true,
        "supportGtagConfigs": false,
        "supportBuiltInVariables": true,
        "supportClients": false,
        "supportFolders": true,
        "supportTags": true,
        "supportTemplates": true,
        "supportTriggers": true,
        "supportVariables": true,
        "supportVersions": true,
        "supportZones": true,
        "supportTransformations": false
      },
      "tagIds": [
        "GTM-MPB2VGT9"
      ]
    },
    "tag": [
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "20",
        "name": "GA4 - Event - ViewCart",
        "type": "gaawe",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "sendEcommerceData",
            "value": "true"
          },
          {
            "type": "LIST",
            "key": "eventSettingsTable",
            "list": [
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "currency"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.currency}}"
                  }
                ]
              },
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "value"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.value}}"
                  }
                ]
              },
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "items"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.items}}"
                  }
                ]
              }
            ]
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "view_cart"
          },
          {
            "type": "TEMPLATE",
            "key": "measurementIdOverride",
            "value": "{{CONST - GA4 Measurement ID}}"
          }
        ],
        "fingerprint": "1778094521792",
        "firingTriggerId": [
          "17"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "consentSettings": {
          "consentStatus": "NOT_SET"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "23",
        "name": "GA4 - Event - AddPaymentInfo",
        "type": "gaawe",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "sendEcommerceData",
            "value": "true"
          },
          {
            "type": "LIST",
            "key": "eventSettingsTable",
            "list": [
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "payment_type"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.payment_method}}"
                  }
                ]
              }
            ]
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "add_payment_info"
          },
          {
            "type": "TEMPLATE",
            "key": "measurementIdOverride",
            "value": "{{CONST - GA4 Measurement ID}}"
          }
        ],
        "fingerprint": "1778094521793",
        "firingTriggerId": [
          "22"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "consentSettings": {
          "consentStatus": "NOT_SET"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "28",
        "name": "Meta - ViewCategory",
        "type": "cvt_5RM3Q",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "disablePushState",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "pixelId",
            "value": "{{CONST - Meta Pixel ID}}"
          },
          {
            "type": "TEMPLATE",
            "key": "eventId",
            "value": "{{DLV - event_id}}"
          },
          {
            "type": "BOOLEAN",
            "key": "disableAutoConfig",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "useGA4Ecommerce",
            "value": "true"
          },
          {
            "type": "BOOLEAN",
            "key": "enhancedEcommerce",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "dpoLDU",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "custom"
          },
          {
            "type": "BOOLEAN",
            "key": "objectPropertiesFromVariable",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "customEventName",
            "value": "ViewCategory"
          },
          {
            "type": "BOOLEAN",
            "key": "consent",
            "value": "true"
          },
          {
            "type": "BOOLEAN",
            "key": "advancedMatching",
            "value": "false"
          }
        ],
        "fingerprint": "1778094521906",
        "firingTriggerId": [
          "24"
        ],
        "consentSettings": {
          "consentStatus": "NEEDED",
          "consentType": {
            "type": "LIST",
            "list": [
              {
                "type": "TEMPLATE",
                "value": "ad_storage"
              },
              {
                "type": "TEMPLATE",
                "value": "ad_user_data"
              }
            ]
          }
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "35",
        "name": "Meta - Purchase",
        "type": "cvt_5RM3Q",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "disablePushState",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "pixelId",
            "value": "{{CONST - Meta Pixel ID}}"
          },
          {
            "type": "TEMPLATE",
            "key": "eventId",
            "value": "{{DLV - event_id}}"
          },
          {
            "type": "TEMPLATE",
            "key": "standardEventName",
            "value": "Purchase"
          },
          {
            "type": "BOOLEAN",
            "key": "disableAutoConfig",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "useGA4Ecommerce",
            "value": "true"
          },
          {
            "type": "BOOLEAN",
            "key": "enhancedEcommerce",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "dpoLDU",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "variable"
          },
          {
            "type": "BOOLEAN",
            "key": "objectPropertiesFromVariable",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "consent",
            "value": "true"
          },
          {
            "type": "BOOLEAN",
            "key": "advancedMatching",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "variableEventName",
            "value": "{{DLV - mcapi_event_name}}"
          }
        ],
        "fingerprint": "1778094521907",
        "firingTriggerId": [
          "80"
        ],
        "consentSettings": {
          "consentStatus": "NEEDED",
          "consentType": {
            "type": "LIST",
            "list": [
              {
                "type": "TEMPLATE",
                "value": "ad_storage"
              },
              {
                "type": "TEMPLATE",
                "value": "ad_user_data"
              }
            ]
          }
        },
        "notes": "Fires on this plugin's own sale push (mcapi_sale), never on a purchase event pushed by anything else. The event name comes from DLV - mcapi_event_name, which carries the same name the plugin's server side reported for this order: Purchase, Subscribe or SubscriptionRenewal. Meta pairs a browser event with a server event on event name + event ID, so both halves must say the same thing or a subscription sale counts twice."
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "39",
        "name": "GA4 - Event - ViewItem",
        "type": "gaawe",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "sendEcommerceData",
            "value": "true"
          },
          {
            "type": "LIST",
            "key": "eventSettingsTable",
            "list": [
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "currency"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.currency}}"
                  }
                ]
              },
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "value"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.value}}"
                  }
                ]
              },
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "items"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.items}}"
                  }
                ]
              }
            ]
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "view_item"
          },
          {
            "type": "TEMPLATE",
            "key": "measurementIdOverride",
            "value": "{{CONST - GA4 Measurement ID}}"
          }
        ],
        "fingerprint": "1778094521907",
        "firingTriggerId": [
          "38"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "consentSettings": {
          "consentStatus": "NOT_SET"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "41",
        "name": "Meta - ViewContent",
        "type": "cvt_5RM3Q",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "disablePushState",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "pixelId",
            "value": "{{CONST - Meta Pixel ID}}"
          },
          {
            "type": "TEMPLATE",
            "key": "eventId",
            "value": "{{DLV - event_id}}"
          },
          {
            "type": "TEMPLATE",
            "key": "standardEventName",
            "value": "ViewContent"
          },
          {
            "type": "BOOLEAN",
            "key": "disableAutoConfig",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "useGA4Ecommerce",
            "value": "true"
          },
          {
            "type": "BOOLEAN",
            "key": "enhancedEcommerce",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "dpoLDU",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "standard"
          },
          {
            "type": "BOOLEAN",
            "key": "objectPropertiesFromVariable",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "consent",
            "value": "true"
          },
          {
            "type": "BOOLEAN",
            "key": "advancedMatching",
            "value": "false"
          }
        ],
        "fingerprint": "1778094521907",
        "firingTriggerId": [
          "38"
        ],
        "consentSettings": {
          "consentStatus": "NEEDED",
          "consentType": {
            "type": "LIST",
            "list": [
              {
                "type": "TEMPLATE",
                "value": "ad_storage"
              },
              {
                "type": "TEMPLATE",
                "value": "ad_user_data"
              }
            ]
          }
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "42",
        "name": "GA4 - Event - Purchase",
        "type": "gaawe",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "sendEcommerceData",
            "value": "true"
          },
          {
            "type": "LIST",
            "key": "eventSettingsTable",
            "list": [
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "transaction_id"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.transaction_id}}"
                  }
                ]
              },
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "currency"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.currency}}"
                  }
                ]
              },
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "value"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.value}}"
                  }
                ]
              },
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "items"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.items}}"
                  }
                ]
              }
            ]
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "purchase"
          },
          {
            "type": "TEMPLATE",
            "key": "measurementIdOverride",
            "value": "{{CONST - GA4 Measurement ID}}"
          }
        ],
        "fingerprint": "1778094521907",
        "firingTriggerId": [
          "80"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "consentSettings": {
          "consentStatus": "NOT_SET"
        },
        "notes": "Fires on this plugin's own sale push (mcapi_sale). The event name stays purchase for every sale, including subscription ones: purchase is Google Analytics' own name for a completed sale and it has no subscription event."
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "43",
        "name": "GA4 - Event - PageView",
        "type": "gaawe",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "sendEcommerceData",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "page_view"
          },
          {
            "type": "TEMPLATE",
            "key": "measurementIdOverride",
            "value": "{{CONST - GA4 Measurement ID}}"
          }
        ],
        "fingerprint": "1778094521907",
        "firingTriggerId": [
          "40"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "consentSettings": {
          "consentStatus": "NOT_SET"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "45",
        "name": "Meta - AddToCart",
        "type": "cvt_5RM3Q",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "disablePushState",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "pixelId",
            "value": "{{CONST - Meta Pixel ID}}"
          },
          {
            "type": "TEMPLATE",
            "key": "eventId",
            "value": "{{DLV - event_id}}"
          },
          {
            "type": "TEMPLATE",
            "key": "standardEventName",
            "value": "AddToCart"
          },
          {
            "type": "BOOLEAN",
            "key": "disableAutoConfig",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "useGA4Ecommerce",
            "value": "true"
          },
          {
            "type": "BOOLEAN",
            "key": "enhancedEcommerce",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "dpoLDU",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "standard"
          },
          {
            "type": "BOOLEAN",
            "key": "objectPropertiesFromVariable",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "consent",
            "value": "true"
          },
          {
            "type": "BOOLEAN",
            "key": "advancedMatching",
            "value": "false"
          }
        ],
        "fingerprint": "1778094521907",
        "firingTriggerId": [
          "44"
        ],
        "consentSettings": {
          "consentStatus": "NEEDED",
          "consentType": {
            "type": "LIST",
            "list": [
              {
                "type": "TEMPLATE",
                "value": "ad_storage"
              },
              {
                "type": "TEMPLATE",
                "value": "ad_user_data"
              }
            ]
          }
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "46",
        "name": "Meta - InitiateCheckout",
        "type": "cvt_5RM3Q",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "disablePushState",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "pixelId",
            "value": "{{CONST - Meta Pixel ID}}"
          },
          {
            "type": "TEMPLATE",
            "key": "eventId",
            "value": "{{DLV - event_id}}"
          },
          {
            "type": "TEMPLATE",
            "key": "standardEventName",
            "value": "InitiateCheckout"
          },
          {
            "type": "BOOLEAN",
            "key": "disableAutoConfig",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "useGA4Ecommerce",
            "value": "true"
          },
          {
            "type": "BOOLEAN",
            "key": "enhancedEcommerce",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "dpoLDU",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "standard"
          },
          {
            "type": "BOOLEAN",
            "key": "objectPropertiesFromVariable",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "consent",
            "value": "true"
          },
          {
            "type": "BOOLEAN",
            "key": "advancedMatching",
            "value": "false"
          }
        ],
        "fingerprint": "1778094521908",
        "firingTriggerId": [
          "29"
        ],
        "consentSettings": {
          "consentStatus": "NEEDED",
          "consentType": {
            "type": "LIST",
            "list": [
              {
                "type": "TEMPLATE",
                "value": "ad_storage"
              },
              {
                "type": "TEMPLATE",
                "value": "ad_user_data"
              }
            ]
          }
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "47",
        "name": "GA4 - Event - ViewItemList",
        "type": "gaawe",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "sendEcommerceData",
            "value": "true"
          },
          {
            "type": "LIST",
            "key": "eventSettingsTable",
            "list": [
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "item_list_name"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.item_list_name}}"
                  }
                ]
              },
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "items"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.items}}"
                  }
                ]
              }
            ]
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "view_item_list"
          },
          {
            "type": "TEMPLATE",
            "key": "measurementIdOverride",
            "value": "{{CONST - GA4 Measurement ID}}"
          }
        ],
        "fingerprint": "1778094521908",
        "firingTriggerId": [
          "24"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "consentSettings": {
          "consentStatus": "NOT_SET"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "48",
        "name": "GA4 - Event - AddToCart",
        "type": "gaawe",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "sendEcommerceData",
            "value": "true"
          },
          {
            "type": "LIST",
            "key": "eventSettingsTable",
            "list": [
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "currency"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.currency}}"
                  }
                ]
              },
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "value"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.value}}"
                  }
                ]
              },
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "items"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.items}}"
                  }
                ]
              }
            ]
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "add_to_cart"
          },
          {
            "type": "TEMPLATE",
            "key": "measurementIdOverride",
            "value": "{{CONST - GA4 Measurement ID}}"
          }
        ],
        "fingerprint": "1778094521908",
        "firingTriggerId": [
          "44"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "consentSettings": {
          "consentStatus": "NOT_SET"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "49",
        "name": "Meta - PageView",
        "type": "cvt_5RM3Q",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "disablePushState",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "pixelId",
            "value": "{{CONST - Meta Pixel ID}}"
          },
          {
            "type": "TEMPLATE",
            "key": "eventId",
            "value": "{{DLV - event_id}}"
          },
          {
            "type": "TEMPLATE",
            "key": "standardEventName",
            "value": "PageView"
          },
          {
            "type": "BOOLEAN",
            "key": "disableAutoConfig",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "useGA4Ecommerce",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "enhancedEcommerce",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "dpoLDU",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "standard"
          },
          {
            "type": "BOOLEAN",
            "key": "objectPropertiesFromVariable",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "consent",
            "value": "true"
          },
          {
            "type": "BOOLEAN",
            "key": "advancedMatching",
            "value": "false"
          }
        ],
        "fingerprint": "1778094521908",
        "firingTriggerId": [
          "40"
        ],
        "consentSettings": {
          "consentStatus": "NEEDED",
          "consentType": {
            "type": "LIST",
            "list": [
              {
                "type": "TEMPLATE",
                "value": "ad_storage"
              },
              {
                "type": "TEMPLATE",
                "value": "ad_user_data"
              }
            ]
          }
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "50",
        "name": "Consent Defaults (Pre-CMP) \u2014 Disabled, see readme",
        "type": "html",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "html",
            "value": "<script>\n  // Consent Mode v2 defaults \u2014 sets all consent types to 'denied' before any\n  // tracking tag fires. Once your CMP loads, it should call gtag('consent','update',...)\n  // to grant the categories the visitor approved. Cookieless pings flow even when denied.\n  // Only enable this tag if your CMP does NOT call gtag('consent','default',...) on its own.\n  // After enabling, change the firing trigger to the built-in 'Consent Initialization - All Pages'.\n  window.dataLayer = window.dataLayer || [];\n  function gtag(){ dataLayer.push(arguments); }\n  gtag('consent', 'default', {\n    'ad_storage': 'denied',\n    'ad_user_data': 'denied',\n    'ad_personalization': 'denied',\n    'analytics_storage': 'denied',\n    'wait_for_update': 500\n  });\n</script>"
          },
          {
            "type": "BOOLEAN",
            "key": "supportDocumentWrite",
            "value": "false"
          }
        ],
        "fingerprint": "1778094521908",
        "firingTriggerId": [
          "40"
        ],
        "paused": true,
        "consentSettings": {
          "consentStatus": "NOT_SET"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "53",
        "name": "GA4 - Event - BeginCheckout",
        "type": "gaawe",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "sendEcommerceData",
            "value": "true"
          },
          {
            "type": "LIST",
            "key": "eventSettingsTable",
            "list": [
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "currency"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.currency}}"
                  }
                ]
              },
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "value"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.value}}"
                  }
                ]
              },
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "items"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.items}}"
                  }
                ]
              }
            ]
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "begin_checkout"
          },
          {
            "type": "TEMPLATE",
            "key": "measurementIdOverride",
            "value": "{{CONST - GA4 Measurement ID}}"
          }
        ],
        "fingerprint": "1778094521908",
        "firingTriggerId": [
          "29"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "consentSettings": {
          "consentStatus": "NOT_SET"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "54",
        "name": "GA4 - Event - SelectItem",
        "type": "gaawe",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "sendEcommerceData",
            "value": "true"
          },
          {
            "type": "LIST",
            "key": "eventSettingsTable",
            "list": [
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "items"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.items}}"
                  }
                ]
              }
            ]
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "select_item"
          },
          {
            "type": "TEMPLATE",
            "key": "measurementIdOverride",
            "value": "{{CONST - GA4 Measurement ID}}"
          }
        ],
        "fingerprint": "1778094521908",
        "firingTriggerId": [
          "33"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "consentSettings": {
          "consentStatus": "NOT_SET"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "55",
        "name": "GA4 - Event - AddShippingInfo",
        "type": "gaawe",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "sendEcommerceData",
            "value": "true"
          },
          {
            "type": "LIST",
            "key": "eventSettingsTable",
            "list": [
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "shipping_tier"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.shipping_method}}"
                  }
                ]
              }
            ]
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "add_shipping_info"
          },
          {
            "type": "TEMPLATE",
            "key": "measurementIdOverride",
            "value": "{{CONST - GA4 Measurement ID}}"
          }
        ],
        "fingerprint": "1778094521908",
        "firingTriggerId": [
          "51"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "consentSettings": {
          "consentStatus": "NOT_SET"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "56",
        "name": "Meta - AddPaymentInfo",
        "type": "cvt_5RM3Q",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "disablePushState",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "pixelId",
            "value": "{{CONST - Meta Pixel ID}}"
          },
          {
            "type": "TEMPLATE",
            "key": "eventId",
            "value": "{{DLV - event_id}}"
          },
          {
            "type": "TEMPLATE",
            "key": "standardEventName",
            "value": "AddPaymentInfo"
          },
          {
            "type": "BOOLEAN",
            "key": "disableAutoConfig",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "useGA4Ecommerce",
            "value": "true"
          },
          {
            "type": "BOOLEAN",
            "key": "enhancedEcommerce",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "dpoLDU",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "standard"
          },
          {
            "type": "BOOLEAN",
            "key": "objectPropertiesFromVariable",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "consent",
            "value": "true"
          },
          {
            "type": "BOOLEAN",
            "key": "advancedMatching",
            "value": "false"
          }
        ],
        "fingerprint": "1778094521909",
        "firingTriggerId": [
          "22"
        ],
        "consentSettings": {
          "consentStatus": "NEEDED",
          "consentType": {
            "type": "LIST",
            "list": [
              {
                "type": "TEMPLATE",
                "value": "ad_storage"
              },
              {
                "type": "TEMPLATE",
                "value": "ad_user_data"
              }
            ]
          }
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "57",
        "name": "GA4 - Google Tag (Configuration)",
        "type": "googtag",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "tagId",
            "value": "{{CONST - GA4 Measurement ID}}"
          }
        ],
        "fingerprint": "1778094521909",
        "firingTriggerId": [
          "2147479553"
        ],
        "consentSettings": {
          "consentStatus": "NOT_SET"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "58",
        "name": "TikTok - PageView",
        "type": "cvt_MRQN8",
        "firingTriggerId": [
          "40"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "pixel_code",
            "value": "{{CONST - TikTok Pixel Code}}"
          },
          {
            "type": "TEMPLATE",
            "key": "event",
            "value": "Pageview"
          },
          {
            "type": "TEMPLATE",
            "key": "event_id",
            "value": "{{DLV - event_id}}"
          },
          {
            "type": "BOOLEAN",
            "key": "enhance_ecomm",
            "value": "true"
          },
          {
            "type": "TEMPLATE",
            "key": "ga_ecomm",
            "value": "enhance_ecomm"
          },
          {
            "type": "TEMPLATE",
            "key": "content_type",
            "value": "product"
          }
        ],
        "fingerprint": "58",
        "monitoringMetadata": {
          "type": "MAP"
        },
        "consentSettings": {
          "consentStatus": "NEEDED",
          "consentType": {
            "type": "LIST",
            "list": [
              {
                "type": "TEMPLATE",
                "value": "ad_storage"
              },
              {
                "type": "TEMPLATE",
                "value": "ad_user_data"
              }
            ]
          }
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "59",
        "name": "TikTok - ViewContent",
        "type": "cvt_MRQN8",
        "firingTriggerId": [
          "38"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "pixel_code",
            "value": "{{CONST - TikTok Pixel Code}}"
          },
          {
            "type": "TEMPLATE",
            "key": "event",
            "value": "ViewContent"
          },
          {
            "type": "TEMPLATE",
            "key": "event_id",
            "value": "{{DLV - event_id}}"
          },
          {
            "type": "BOOLEAN",
            "key": "enhance_ecomm",
            "value": "true"
          },
          {
            "type": "TEMPLATE",
            "key": "ga_ecomm",
            "value": "enhance_ecomm"
          },
          {
            "type": "TEMPLATE",
            "key": "content_type",
            "value": "product"
          }
        ],
        "fingerprint": "59",
        "monitoringMetadata": {
          "type": "MAP"
        },
        "consentSettings": {
          "consentStatus": "NEEDED",
          "consentType": {
            "type": "LIST",
            "list": [
              {
                "type": "TEMPLATE",
                "value": "ad_storage"
              },
              {
                "type": "TEMPLATE",
                "value": "ad_user_data"
              }
            ]
          }
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "60",
        "name": "TikTok - ViewCategory",
        "type": "cvt_MRQN8",
        "firingTriggerId": [
          "24"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "pixel_code",
            "value": "{{CONST - TikTok Pixel Code}}"
          },
          {
            "type": "TEMPLATE",
            "key": "event",
            "value": "Pageview"
          },
          {
            "type": "TEMPLATE",
            "key": "event_id",
            "value": "{{DLV - event_id}}"
          },
          {
            "type": "BOOLEAN",
            "key": "enhance_ecomm",
            "value": "true"
          },
          {
            "type": "TEMPLATE",
            "key": "ga_ecomm",
            "value": "enhance_ecomm"
          },
          {
            "type": "TEMPLATE",
            "key": "content_type",
            "value": "product"
          }
        ],
        "fingerprint": "60",
        "monitoringMetadata": {
          "type": "MAP"
        },
        "consentSettings": {
          "consentStatus": "NEEDED",
          "consentType": {
            "type": "LIST",
            "list": [
              {
                "type": "TEMPLATE",
                "value": "ad_storage"
              },
              {
                "type": "TEMPLATE",
                "value": "ad_user_data"
              }
            ]
          }
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "61",
        "name": "TikTok - AddToCart",
        "type": "cvt_MRQN8",
        "firingTriggerId": [
          "44"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "pixel_code",
            "value": "{{CONST - TikTok Pixel Code}}"
          },
          {
            "type": "TEMPLATE",
            "key": "event",
            "value": "AddToCart"
          },
          {
            "type": "TEMPLATE",
            "key": "event_id",
            "value": "{{DLV - event_id}}"
          },
          {
            "type": "BOOLEAN",
            "key": "enhance_ecomm",
            "value": "true"
          },
          {
            "type": "TEMPLATE",
            "key": "ga_ecomm",
            "value": "enhance_ecomm"
          },
          {
            "type": "TEMPLATE",
            "key": "content_type",
            "value": "product"
          }
        ],
        "fingerprint": "61",
        "monitoringMetadata": {
          "type": "MAP"
        },
        "consentSettings": {
          "consentStatus": "NEEDED",
          "consentType": {
            "type": "LIST",
            "list": [
              {
                "type": "TEMPLATE",
                "value": "ad_storage"
              },
              {
                "type": "TEMPLATE",
                "value": "ad_user_data"
              }
            ]
          }
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "62",
        "name": "TikTok - InitiateCheckout",
        "type": "cvt_MRQN8",
        "firingTriggerId": [
          "29"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "pixel_code",
            "value": "{{CONST - TikTok Pixel Code}}"
          },
          {
            "type": "TEMPLATE",
            "key": "event",
            "value": "InitiateCheckout"
          },
          {
            "type": "TEMPLATE",
            "key": "event_id",
            "value": "{{DLV - event_id}}"
          },
          {
            "type": "BOOLEAN",
            "key": "enhance_ecomm",
            "value": "true"
          },
          {
            "type": "TEMPLATE",
            "key": "ga_ecomm",
            "value": "enhance_ecomm"
          },
          {
            "type": "TEMPLATE",
            "key": "content_type",
            "value": "product"
          }
        ],
        "fingerprint": "62",
        "monitoringMetadata": {
          "type": "MAP"
        },
        "consentSettings": {
          "consentStatus": "NEEDED",
          "consentType": {
            "type": "LIST",
            "list": [
              {
                "type": "TEMPLATE",
                "value": "ad_storage"
              },
              {
                "type": "TEMPLATE",
                "value": "ad_user_data"
              }
            ]
          }
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "63",
        "name": "TikTok - AddPaymentInfo",
        "type": "cvt_MRQN8",
        "firingTriggerId": [
          "22"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "pixel_code",
            "value": "{{CONST - TikTok Pixel Code}}"
          },
          {
            "type": "TEMPLATE",
            "key": "event",
            "value": "AddPaymentInfo"
          },
          {
            "type": "TEMPLATE",
            "key": "event_id",
            "value": "{{DLV - event_id}}"
          },
          {
            "type": "BOOLEAN",
            "key": "enhance_ecomm",
            "value": "true"
          },
          {
            "type": "TEMPLATE",
            "key": "ga_ecomm",
            "value": "enhance_ecomm"
          },
          {
            "type": "TEMPLATE",
            "key": "content_type",
            "value": "product"
          }
        ],
        "fingerprint": "63",
        "monitoringMetadata": {
          "type": "MAP"
        },
        "consentSettings": {
          "consentStatus": "NEEDED",
          "consentType": {
            "type": "LIST",
            "list": [
              {
                "type": "TEMPLATE",
                "value": "ad_storage"
              },
              {
                "type": "TEMPLATE",
                "value": "ad_user_data"
              }
            ]
          }
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "64",
        "name": "TikTok - Purchase",
        "type": "cvt_MRQN8",
        "firingTriggerId": [
          "80"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "pixel_code",
            "value": "{{CONST - TikTok Pixel Code}}"
          },
          {
            "type": "TEMPLATE",
            "key": "event",
            "value": "{{LT - TikTok Sale Event}}"
          },
          {
            "type": "TEMPLATE",
            "key": "event_id",
            "value": "{{DLV - event_id}}"
          },
          {
            "type": "BOOLEAN",
            "key": "enhance_ecomm",
            "value": "true"
          },
          {
            "type": "TEMPLATE",
            "key": "ga_ecomm",
            "value": "enhance_ecomm"
          },
          {
            "type": "TEMPLATE",
            "key": "content_type",
            "value": "product"
          }
        ],
        "fingerprint": "64",
        "monitoringMetadata": {
          "type": "MAP"
        },
        "consentSettings": {
          "consentStatus": "NEEDED",
          "consentType": {
            "type": "LIST",
            "list": [
              {
                "type": "TEMPLATE",
                "value": "ad_storage"
              },
              {
                "type": "TEMPLATE",
                "value": "ad_user_data"
              }
            ]
          }
        },
        "notes": "Fires on this plugin's own sale push (mcapi_sale). LT - TikTok Sale Event turns the canonical name into TikTok's own: a plain sale becomes CompletePayment and both subscription names become Subscribe, which is exactly what the plugin's server side sends TikTok for them -- the two halves pair on event name + event id or not at all. CompletePayment rather than Purchase because TikTok's own Tag Manager template offers CompletePayment and has no Purchase; see the map in the plugin for the full argument."
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "65",
        "name": "TikTok - Search",
        "type": "cvt_MRQN8",
        "firingTriggerId": [
          "52"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "pixel_code",
            "value": "{{CONST - TikTok Pixel Code}}"
          },
          {
            "type": "TEMPLATE",
            "key": "event",
            "value": "Search"
          },
          {
            "type": "TEMPLATE",
            "key": "event_id",
            "value": "{{DLV - event_id}}"
          },
          {
            "type": "BOOLEAN",
            "key": "enhance_ecomm",
            "value": "true"
          },
          {
            "type": "TEMPLATE",
            "key": "ga_ecomm",
            "value": "enhance_ecomm"
          },
          {
            "type": "TEMPLATE",
            "key": "content_type",
            "value": "product"
          }
        ],
        "fingerprint": "65",
        "monitoringMetadata": {
          "type": "MAP"
        },
        "consentSettings": {
          "consentStatus": "NEEDED",
          "consentType": {
            "type": "LIST",
            "list": [
              {
                "type": "TEMPLATE",
                "value": "ad_storage"
              },
              {
                "type": "TEMPLATE",
                "value": "ad_user_data"
              }
            ]
          }
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "67",
        "name": "Google Ads - Purchase Conversion",
        "type": "awct",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "conversionId",
            "value": "{{CONST - Google Ads Conversion ID}}"
          },
          {
            "type": "TEMPLATE",
            "key": "conversionLabel",
            "value": "{{CONST - Google Ads Purchase Label}}"
          },
          {
            "type": "TEMPLATE",
            "key": "conversionValue",
            "value": "{{DLV - ecommerce.value}}"
          },
          {
            "type": "TEMPLATE",
            "key": "currencyCode",
            "value": "{{DLV - ecommerce.currency}}"
          },
          {
            "type": "TEMPLATE",
            "key": "orderId",
            "value": "{{DLV - ecommerce.transaction_id}}"
          },
          {
            "type": "BOOLEAN",
            "key": "enableConversionLinker",
            "value": "true"
          }
        ],
        "fingerprint": "1778600000000",
        "firingTriggerId": [
          "80"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "consentSettings": {
          "consentStatus": "NOT_SET"
        },
        "notes": "Fires on this plugin's own sale push (mcapi_sale), never on a purchase event pushed by anything else. Sends conversion value + transaction_id to Google Ads. A Google Ads conversion is identified by its Conversion ID and label rather than by an event name, so the same conversion action is used for subscription sales too. This field takes the Conversion ID as a number with no AW- prefix. Edit CONST - Google Ads Conversion ID and CONST - Google Ads Purchase Label to your Google Ads values before publishing. Enhanced conversions are not configured here: they need a User-Provided Data variable, which is a separate setup in your own container."
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "68",
        "name": "Google Ads - Google Tag (Conversion Linker)",
        "type": "googtag",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "tagId",
            "value": "AW-{{CONST - Google Ads Conversion ID}}"
          }
        ],
        "fingerprint": "1778600000001",
        "firingTriggerId": [
          "2147479553"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "consentSettings": {
          "consentStatus": "NOT_SET"
        },
        "notes": "Fires on all pages. Loads gtag.js with the Google Ads Conversion ID, which auto-captures gclid/gbraid/wbraid into the _gcl_aw 1st-party cookie. Replaces the deprecated standalone Conversion Linker tag. The AW- prefix is written into this field, so CONST - Google Ads Conversion ID holds the number on its own."
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "69",
        "name": "Pinterest - PageVisit",
        "type": "cvt_NGMPN",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "tagId",
            "value": "{{CONST - Pinterest Tag ID}}"
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "pagevisit"
          },
          {
            "type": "BOOLEAN",
            "key": "setCustomParams",
            "value": "true"
          },
          {
            "type": "LIST",
            "key": "values",
            "list": [
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "name",
                    "value": "event_id"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "value",
                    "value": "{{DLV - event_id}}"
                  }
                ]
              }
            ]
          }
        ],
        "firingTriggerId": [
          "40"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "consentSettings": {
          "consentStatus": "NEEDED",
          "consentType": {
            "type": "LIST",
            "list": [
              {
                "type": "TEMPLATE",
                "value": "ad_storage"
              },
              {
                "type": "TEMPLATE",
                "value": "ad_user_data"
              }
            ]
          }
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "70",
        "name": "Pinterest - ViewContent",
        "type": "cvt_NGMPN",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "tagId",
            "value": "{{CONST - Pinterest Tag ID}}"
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "viewcontent"
          },
          {
            "type": "BOOLEAN",
            "key": "setCustomParams",
            "value": "true"
          },
          {
            "type": "LIST",
            "key": "values",
            "list": [
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "name",
                    "value": "event_id"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "value",
                    "value": "{{DLV - event_id}}"
                  }
                ]
              }
            ]
          }
        ],
        "firingTriggerId": [
          "38"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "consentSettings": {
          "consentStatus": "NEEDED",
          "consentType": {
            "type": "LIST",
            "list": [
              {
                "type": "TEMPLATE",
                "value": "ad_storage"
              },
              {
                "type": "TEMPLATE",
                "value": "ad_user_data"
              }
            ]
          }
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "71",
        "name": "Pinterest - ViewCategory",
        "type": "cvt_NGMPN",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "tagId",
            "value": "{{CONST - Pinterest Tag ID}}"
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "viewcategory"
          },
          {
            "type": "BOOLEAN",
            "key": "setCustomParams",
            "value": "true"
          },
          {
            "type": "LIST",
            "key": "values",
            "list": [
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "name",
                    "value": "event_id"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "value",
                    "value": "{{DLV - event_id}}"
                  }
                ]
              }
            ]
          }
        ],
        "firingTriggerId": [
          "24"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "consentSettings": {
          "consentStatus": "NEEDED",
          "consentType": {
            "type": "LIST",
            "list": [
              {
                "type": "TEMPLATE",
                "value": "ad_storage"
              },
              {
                "type": "TEMPLATE",
                "value": "ad_user_data"
              }
            ]
          }
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "72",
        "name": "Pinterest - AddToCart",
        "type": "cvt_NGMPN",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "tagId",
            "value": "{{CONST - Pinterest Tag ID}}"
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "addtocart"
          },
          {
            "type": "BOOLEAN",
            "key": "setCustomParams",
            "value": "true"
          },
          {
            "type": "LIST",
            "key": "values",
            "list": [
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "name",
                    "value": "event_id"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "value",
                    "value": "{{DLV - event_id}}"
                  }
                ]
              }
            ]
          },
          {
            "type": "TEMPLATE",
            "key": "value",
            "value": "{{DLV - ecommerce.value}}"
          },
          {
            "type": "TEMPLATE",
            "key": "currency",
            "value": "{{DLV - ecommerce.currency}}"
          },
          {
            "type": "TEMPLATE",
            "key": "order_id",
            "value": "{{DLV - ecommerce.transaction_id}}"
          }
        ],
        "firingTriggerId": [
          "44"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "consentSettings": {
          "consentStatus": "NEEDED",
          "consentType": {
            "type": "LIST",
            "list": [
              {
                "type": "TEMPLATE",
                "value": "ad_storage"
              },
              {
                "type": "TEMPLATE",
                "value": "ad_user_data"
              }
            ]
          }
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "73",
        "name": "Pinterest - InitiateCheckout",
        "type": "cvt_NGMPN",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "tagId",
            "value": "{{CONST - Pinterest Tag ID}}"
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "initiatecheckout"
          },
          {
            "type": "BOOLEAN",
            "key": "setCustomParams",
            "value": "true"
          },
          {
            "type": "LIST",
            "key": "values",
            "list": [
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "name",
                    "value": "event_id"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "value",
                    "value": "{{DLV - event_id}}"
                  }
                ]
              }
            ]
          }
        ],
        "firingTriggerId": [
          "29"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "consentSettings": {
          "consentStatus": "NEEDED",
          "consentType": {
            "type": "LIST",
            "list": [
              {
                "type": "TEMPLATE",
                "value": "ad_storage"
              },
              {
                "type": "TEMPLATE",
                "value": "ad_user_data"
              }
            ]
          }
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "74",
        "name": "Pinterest - AddPaymentInfo",
        "type": "cvt_NGMPN",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "tagId",
            "value": "{{CONST - Pinterest Tag ID}}"
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "addpaymentinfo"
          },
          {
            "type": "BOOLEAN",
            "key": "setCustomParams",
            "value": "true"
          },
          {
            "type": "LIST",
            "key": "values",
            "list": [
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "name",
                    "value": "event_id"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "value",
                    "value": "{{DLV - event_id}}"
                  }
                ]
              }
            ]
          }
        ],
        "firingTriggerId": [
          "22"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "consentSettings": {
          "consentStatus": "NEEDED",
          "consentType": {
            "type": "LIST",
            "list": [
              {
                "type": "TEMPLATE",
                "value": "ad_storage"
              },
              {
                "type": "TEMPLATE",
                "value": "ad_user_data"
              }
            ]
          }
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "75",
        "name": "Pinterest - Search",
        "type": "cvt_NGMPN",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "tagId",
            "value": "{{CONST - Pinterest Tag ID}}"
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "search"
          },
          {
            "type": "BOOLEAN",
            "key": "setCustomParams",
            "value": "true"
          },
          {
            "type": "LIST",
            "key": "values",
            "list": [
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "name",
                    "value": "event_id"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "value",
                    "value": "{{DLV - event_id}}"
                  }
                ]
              }
            ]
          }
        ],
        "firingTriggerId": [
          "52"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "consentSettings": {
          "consentStatus": "NEEDED",
          "consentType": {
            "type": "LIST",
            "list": [
              {
                "type": "TEMPLATE",
                "value": "ad_storage"
              },
              {
                "type": "TEMPLATE",
                "value": "ad_user_data"
              }
            ]
          }
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "76",
        "name": "Pinterest - Checkout \u2014 Paused, see readme before enabling",
        "type": "cvt_NGMPN",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "tagId",
            "value": "{{CONST - Pinterest Tag ID}}"
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "checkout"
          },
          {
            "type": "BOOLEAN",
            "key": "setCustomParams",
            "value": "true"
          },
          {
            "type": "LIST",
            "key": "values",
            "list": [
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "name",
                    "value": "event_id"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "value",
                    "value": "{{DLV - event_id}}"
                  }
                ]
              }
            ]
          },
          {
            "type": "TEMPLATE",
            "key": "value",
            "value": "{{DLV - ecommerce.value}}"
          },
          {
            "type": "TEMPLATE",
            "key": "currency",
            "value": "{{DLV - ecommerce.currency}}"
          },
          {
            "type": "TEMPLATE",
            "key": "order_id",
            "value": "{{DLV - ecommerce.transaction_id}}"
          }
        ],
        "firingTriggerId": [
          "80"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "consentSettings": {
          "consentStatus": "NEEDED",
          "consentType": {
            "type": "LIST",
            "list": [
              {
                "type": "TEMPLATE",
                "value": "ad_storage"
              },
              {
                "type": "TEMPLATE",
                "value": "ad_user_data"
              }
            ]
          }
        },
        "paused": true,
        "notes": "PAUSED ON PURPOSE. Pinterest matches a tag event to a Conversions API event on event_id, and this tag passes it -- but that pairing has not been confirmed on a live Pinterest account. Left paused, your Pinterest sales keep being reported from the server only, which is what this plugin already does and cannot double-count. To check it: enable this tag, publish, make one sale, and open Pinterest Events Manager. ONE checkout event means the pairing works and you can leave it on. TWO means it does not -- pause it again and tell the plugin author.\n\nIF YOU REPORT SUBSCRIPTIONS SEPARATELY, READ THIS BEFORE ENABLING IT. Pinterest's tag takes a fixed event name -- it cannot read the sale's name from the data layer the way the Meta and TikTok tags in this container do. So this tag sends checkout for a subscription RENEWAL as well, while the plugin's server side deliberately reports a renewal as custom, to keep renewals out of the conversion figures your ads optimise on. Those two do not pair, and enabling this tag on such a store puts renewals back into Pinterest's conversion numbers. If that is not what you want, leave it paused, or add a blocking trigger on DLV - mcapi_event_name equals SubscriptionRenewal.\n\nIt fires on this plugin's own sale push (mcapi_sale) rather than on any purchase event, so enabling it cannot turn another plugin's push into a Pinterest conversion."
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "77",
        "name": "Meta - Lead",
        "type": "cvt_5RM3Q",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "disablePushState",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "pixelId",
            "value": "{{CONST - Meta Pixel ID}}"
          },
          {
            "type": "TEMPLATE",
            "key": "eventId",
            "value": "{{DLV - event_id}}"
          },
          {
            "type": "TEMPLATE",
            "key": "standardEventName",
            "value": "Lead"
          },
          {
            "type": "BOOLEAN",
            "key": "disableAutoConfig",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "useGA4Ecommerce",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "enhancedEcommerce",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "dpoLDU",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "standard"
          },
          {
            "type": "BOOLEAN",
            "key": "objectPropertiesFromVariable",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "consent",
            "value": "true"
          },
          {
            "type": "BOOLEAN",
            "key": "advancedMatching",
            "value": "false"
          }
        ],
        "notes": "Fires on CE - CAPI Suite Lead, which this plugin pushes when a Contact Form 7 form is submitted successfully -- not when the notification email is delivered, so a site with broken mail still reports its leads. A store with no Contact Form 7 installed never fires this tag, and that is not a misconfiguration. The event name is namespaced (mcapi_lead, not a plain \"lead\") for the same reason the sale tags moved off a plain \"purchase\": a trigger condition cannot ask who pushed an event, so a generic name would let any other plugin's push become a conversion here.",
        "fingerprint": "77",
        "firingTriggerId": [
          "81"
        ],
        "consentSettings": {
          "consentStatus": "NEEDED",
          "consentType": {
            "type": "LIST",
            "list": [
              {
                "type": "TEMPLATE",
                "value": "ad_storage"
              },
              {
                "type": "TEMPLATE",
                "value": "ad_user_data"
              }
            ]
          }
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "78",
        "name": "TikTok - Lead",
        "type": "cvt_MRQN8",
        "firingTriggerId": [
          "81"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "pixel_code",
            "value": "{{CONST - TikTok Pixel Code}}"
          },
          {
            "type": "TEMPLATE",
            "key": "event",
            "value": "SubmitForm"
          },
          {
            "type": "TEMPLATE",
            "key": "event_id",
            "value": "{{DLV - event_id}}"
          },
          {
            "type": "BOOLEAN",
            "key": "enhance_ecomm",
            "value": "false"
          }
        ],
        "notes": "Fires on CE - CAPI Suite Lead, which this plugin pushes when a Contact Form 7 form is submitted successfully -- not when the notification email is delivered, so a site with broken mail still reports its leads. A store with no Contact Form 7 installed never fires this tag, and that is not a misconfiguration. The event name is namespaced (mcapi_lead, not a plain \"lead\") for the same reason the sale tags moved off a plain \"purchase\": a trigger condition cannot ask who pushed an event, so a generic name would let any other plugin's push become a conversion here.",
        "fingerprint": "78",
        "monitoringMetadata": {
          "type": "MAP"
        },
        "consentSettings": {
          "consentStatus": "NEEDED",
          "consentType": {
            "type": "LIST",
            "list": [
              {
                "type": "TEMPLATE",
                "value": "ad_storage"
              },
              {
                "type": "TEMPLATE",
                "value": "ad_user_data"
              }
            ]
          }
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "79",
        "name": "Pinterest - Lead",
        "type": "cvt_NGMPN",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "tagId",
            "value": "{{CONST - Pinterest Tag ID}}"
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "lead"
          },
          {
            "type": "BOOLEAN",
            "key": "setCustomParams",
            "value": "true"
          },
          {
            "type": "LIST",
            "key": "values",
            "list": [
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "name",
                    "value": "event_id"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "value",
                    "value": "{{DLV - event_id}}"
                  }
                ]
              }
            ]
          }
        ],
        "firingTriggerId": [
          "81"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "notes": "Fires on CE - CAPI Suite Lead, which this plugin pushes when a Contact Form 7 form is submitted successfully -- not when the notification email is delivered, so a site with broken mail still reports its leads. A store with no Contact Form 7 installed never fires this tag, and that is not a misconfiguration. The event name is namespaced (mcapi_lead, not a plain \"lead\") for the same reason the sale tags moved off a plain \"purchase\": a trigger condition cannot ask who pushed an event, so a generic name would let any other plugin's push become a conversion here.",
        "consentSettings": {
          "consentStatus": "NEEDED",
          "consentType": {
            "type": "LIST",
            "list": [
              {
                "type": "TEMPLATE",
                "value": "ad_storage"
              },
              {
                "type": "TEMPLATE",
                "value": "ad_user_data"
              }
            ]
          }
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "84",
        "name": "Meta - CompleteRegistration",
        "type": "cvt_5RM3Q",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "disablePushState",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "pixelId",
            "value": "{{CONST - Meta Pixel ID}}"
          },
          {
            "type": "TEMPLATE",
            "key": "eventId",
            "value": "{{DLV - event_id}}"
          },
          {
            "type": "TEMPLATE",
            "key": "standardEventName",
            "value": "CompleteRegistration"
          },
          {
            "type": "BOOLEAN",
            "key": "disableAutoConfig",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "useGA4Ecommerce",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "enhancedEcommerce",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "dpoLDU",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "standard"
          },
          {
            "type": "BOOLEAN",
            "key": "objectPropertiesFromVariable",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "consent",
            "value": "true"
          },
          {
            "type": "BOOLEAN",
            "key": "advancedMatching",
            "value": "false"
          }
        ],
        "notes": "Fires on CE - CAPI Suite Registration, which this plugin pushes on the first page a new customer loads after WooCommerce created their account -- the registration request itself is a POST followed by a redirect, so there is no page for the push to ride on. The event name is namespaced (mcapi_registration) because this trigger is new in this release: a trigger condition cannot ask who pushed an event, so a generic name would let any other plugin's push become a conversion here.",
        "fingerprint": "84",
        "firingTriggerId": [
          "82"
        ],
        "consentSettings": {
          "consentStatus": "NEEDED",
          "consentType": {
            "type": "LIST",
            "list": [
              {
                "type": "TEMPLATE",
                "value": "ad_storage"
              },
              {
                "type": "TEMPLATE",
                "value": "ad_user_data"
              }
            ]
          }
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "85",
        "name": "TikTok - CompleteRegistration",
        "type": "cvt_MRQN8",
        "firingTriggerId": [
          "82"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "pixel_code",
            "value": "{{CONST - TikTok Pixel Code}}"
          },
          {
            "type": "TEMPLATE",
            "key": "event",
            "value": "CompleteRegistration"
          },
          {
            "type": "TEMPLATE",
            "key": "event_id",
            "value": "{{DLV - event_id}}"
          },
          {
            "type": "BOOLEAN",
            "key": "enhance_ecomm",
            "value": "false"
          }
        ],
        "notes": "Fires on CE - CAPI Suite Registration, which this plugin pushes on the first page a new customer loads after WooCommerce created their account -- the registration request itself is a POST followed by a redirect, so there is no page for the push to ride on. The event name is namespaced (mcapi_registration) because this trigger is new in this release: a trigger condition cannot ask who pushed an event, so a generic name would let any other plugin's push become a conversion here.",
        "fingerprint": "85",
        "monitoringMetadata": {
          "type": "MAP"
        },
        "consentSettings": {
          "consentStatus": "NEEDED",
          "consentType": {
            "type": "LIST",
            "list": [
              {
                "type": "TEMPLATE",
                "value": "ad_storage"
              },
              {
                "type": "TEMPLATE",
                "value": "ad_user_data"
              }
            ]
          }
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "86",
        "name": "Pinterest - CompleteRegistration",
        "type": "cvt_NGMPN",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "tagId",
            "value": "{{CONST - Pinterest Tag ID}}"
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "signup"
          },
          {
            "type": "BOOLEAN",
            "key": "setCustomParams",
            "value": "true"
          },
          {
            "type": "LIST",
            "key": "values",
            "list": [
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "name",
                    "value": "event_id"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "value",
                    "value": "{{DLV - event_id}}"
                  }
                ]
              }
            ]
          }
        ],
        "notes": "Fires on CE - CAPI Suite Registration, which this plugin pushes on the first page a new customer loads after WooCommerce created their account -- the registration request itself is a POST followed by a redirect, so there is no page for the push to ride on. The event name is namespaced (mcapi_registration) because this trigger is new in this release: a trigger condition cannot ask who pushed an event, so a generic name would let any other plugin's push become a conversion here. Pinterest calls it signup; CompleteRegistration is not in its roster, and it is the same name this plugin's server side sends Pinterest for the event, so the two halves pair.",
        "firingTriggerId": [
          "82"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "consentSettings": {
          "consentStatus": "NEEDED",
          "consentType": {
            "type": "LIST",
            "list": [
              {
                "type": "TEMPLATE",
                "value": "ad_storage"
              },
              {
                "type": "TEMPLATE",
                "value": "ad_user_data"
              }
            ]
          }
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "87",
        "name": "Meta - AddToWishlist",
        "type": "cvt_5RM3Q",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "disablePushState",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "pixelId",
            "value": "{{CONST - Meta Pixel ID}}"
          },
          {
            "type": "TEMPLATE",
            "key": "eventId",
            "value": "{{DLV - event_id}}"
          },
          {
            "type": "TEMPLATE",
            "key": "standardEventName",
            "value": "AddToWishlist"
          },
          {
            "type": "BOOLEAN",
            "key": "disableAutoConfig",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "useGA4Ecommerce",
            "value": "true"
          },
          {
            "type": "BOOLEAN",
            "key": "enhancedEcommerce",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "dpoLDU",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "standard"
          },
          {
            "type": "BOOLEAN",
            "key": "objectPropertiesFromVariable",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "consent",
            "value": "true"
          },
          {
            "type": "BOOLEAN",
            "key": "advancedMatching",
            "value": "false"
          }
        ],
        "notes": "Fires on CE - CAPI Suite Wishlist, which this plugin pushes when a product is added to a YITH WooCommerce Wishlist. A store without that plugin never fires this tag, and that is not a misconfiguration. The event name is namespaced (mcapi_wishlist) for the same reason as the other triggers added in this release.",
        "fingerprint": "87",
        "firingTriggerId": [
          "83"
        ],
        "consentSettings": {
          "consentStatus": "NEEDED",
          "consentType": {
            "type": "LIST",
            "list": [
              {
                "type": "TEMPLATE",
                "value": "ad_storage"
              },
              {
                "type": "TEMPLATE",
                "value": "ad_user_data"
              }
            ]
          }
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "88",
        "name": "TikTok - AddToWishlist",
        "type": "cvt_MRQN8",
        "firingTriggerId": [
          "83"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "pixel_code",
            "value": "{{CONST - TikTok Pixel Code}}"
          },
          {
            "type": "TEMPLATE",
            "key": "event",
            "value": "AddToWishlist"
          },
          {
            "type": "TEMPLATE",
            "key": "event_id",
            "value": "{{DLV - event_id}}"
          },
          {
            "type": "BOOLEAN",
            "key": "enhance_ecomm",
            "value": "true"
          },
          {
            "type": "TEMPLATE",
            "key": "ga_ecomm",
            "value": "enhance_ecomm"
          },
          {
            "type": "TEMPLATE",
            "key": "content_type",
            "value": "product"
          }
        ],
        "notes": "Fires on CE - CAPI Suite Wishlist, which this plugin pushes when a product is added to a YITH WooCommerce Wishlist. A store without that plugin never fires this tag, and that is not a misconfiguration. The event name is namespaced (mcapi_wishlist) for the same reason as the other triggers added in this release.",
        "fingerprint": "88",
        "monitoringMetadata": {
          "type": "MAP"
        },
        "consentSettings": {
          "consentStatus": "NEEDED",
          "consentType": {
            "type": "LIST",
            "list": [
              {
                "type": "TEMPLATE",
                "value": "ad_storage"
              },
              {
                "type": "TEMPLATE",
                "value": "ad_user_data"
              }
            ]
          }
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "89",
        "name": "Pinterest - AddToWishlist",
        "type": "cvt_NGMPN",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "tagId",
            "value": "{{CONST - Pinterest Tag ID}}"
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "addtowishlist"
          },
          {
            "type": "BOOLEAN",
            "key": "setCustomParams",
            "value": "true"
          },
          {
            "type": "LIST",
            "key": "values",
            "list": [
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "name",
                    "value": "event_id"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "value",
                    "value": "{{DLV - event_id}}"
                  }
                ]
              }
            ]
          },
          {
            "type": "TEMPLATE",
            "key": "value",
            "value": "{{DLV - ecommerce.value}}"
          },
          {
            "type": "TEMPLATE",
            "key": "currency",
            "value": "{{DLV - ecommerce.currency}}"
          }
        ],
        "notes": "Fires on CE - CAPI Suite Wishlist, which this plugin pushes when a product is added to a YITH WooCommerce Wishlist. A store without that plugin never fires this tag, and that is not a misconfiguration. The event name is namespaced (mcapi_wishlist) for the same reason as the other triggers added in this release. addtowishlist is the Pinterest TAG's own name for it. The Pinterest Conversions API has no equivalent in its nine, so the server half of this event reports custom -- the same asymmetry Pinterest - ViewContent, - InitiateCheckout and - AddPaymentInfo already carry.",
        "firingTriggerId": [
          "83"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "consentSettings": {
          "consentStatus": "NEEDED",
          "consentType": {
            "type": "LIST",
            "list": [
              {
                "type": "TEMPLATE",
                "value": "ad_storage"
              },
              {
                "type": "TEMPLATE",
                "value": "ad_user_data"
              }
            ]
          }
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "90",
        "name": "Meta - Search",
        "type": "cvt_5RM3Q",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "disablePushState",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "pixelId",
            "value": "{{CONST - Meta Pixel ID}}"
          },
          {
            "type": "TEMPLATE",
            "key": "eventId",
            "value": "{{DLV - event_id}}"
          },
          {
            "type": "TEMPLATE",
            "key": "standardEventName",
            "value": "Search"
          },
          {
            "type": "BOOLEAN",
            "key": "disableAutoConfig",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "useGA4Ecommerce",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "enhancedEcommerce",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "dpoLDU",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "standard"
          },
          {
            "type": "BOOLEAN",
            "key": "objectPropertiesFromVariable",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "consent",
            "value": "true"
          },
          {
            "type": "BOOLEAN",
            "key": "advancedMatching",
            "value": "false"
          }
        ],
        "notes": "Fires on CE - Search, the trigger this container has carried since before this release alongside the TikTok and Pinterest Search tags. The plugin only started pushing a `search` event in 3.11.0; before that all three of these tags had nothing to fire on. This one keeps the plain event name rather than a namespaced one precisely because merchants already have the trigger built.",
        "fingerprint": "90",
        "firingTriggerId": [
          "52"
        ],
        "consentSettings": {
          "consentStatus": "NEEDED",
          "consentType": {
            "type": "LIST",
            "list": [
              {
                "type": "TEMPLATE",
                "value": "ad_storage"
              },
              {
                "type": "TEMPLATE",
                "value": "ad_user_data"
              }
            ]
          }
        }
      }
    ],
    "trigger": [
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "triggerId": "17",
        "name": "CE - View Cart",
        "type": "CUSTOM_EVENT",
        "customEventFilter": [
          {
            "type": "EQUALS",
            "parameter": [
              {
                "type": "TEMPLATE",
                "key": "arg0",
                "value": "{{_event}}"
              },
              {
                "type": "TEMPLATE",
                "key": "arg1",
                "value": "view_cart"
              }
            ]
          }
        ],
        "fingerprint": "1778094521792"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "triggerId": "22",
        "name": "CE - Add Payment Info",
        "type": "CUSTOM_EVENT",
        "customEventFilter": [
          {
            "type": "EQUALS",
            "parameter": [
              {
                "type": "TEMPLATE",
                "key": "arg0",
                "value": "{{_event}}"
              },
              {
                "type": "TEMPLATE",
                "key": "arg1",
                "value": "add_payment_info"
              }
            ]
          }
        ],
        "fingerprint": "1778094521793"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "triggerId": "24",
        "name": "CE - View Item List",
        "type": "CUSTOM_EVENT",
        "customEventFilter": [
          {
            "type": "EQUALS",
            "parameter": [
              {
                "type": "TEMPLATE",
                "key": "arg0",
                "value": "{{_event}}"
              },
              {
                "type": "TEMPLATE",
                "key": "arg1",
                "value": "view_item_list"
              }
            ]
          }
        ],
        "fingerprint": "1778094521793"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "triggerId": "29",
        "name": "CE - Begin Checkout",
        "type": "CUSTOM_EVENT",
        "customEventFilter": [
          {
            "type": "EQUALS",
            "parameter": [
              {
                "type": "TEMPLATE",
                "key": "arg0",
                "value": "{{_event}}"
              },
              {
                "type": "TEMPLATE",
                "key": "arg1",
                "value": "begin_checkout"
              }
            ]
          }
        ],
        "fingerprint": "1778094521906"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "triggerId": "33",
        "name": "CE - Select Item",
        "type": "CUSTOM_EVENT",
        "customEventFilter": [
          {
            "type": "EQUALS",
            "parameter": [
              {
                "type": "TEMPLATE",
                "key": "arg0",
                "value": "{{_event}}"
              },
              {
                "type": "TEMPLATE",
                "key": "arg1",
                "value": "select_item"
              }
            ]
          }
        ],
        "fingerprint": "1778094521906"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "triggerId": "34",
        "name": "CE - Purchase",
        "type": "CUSTOM_EVENT",
        "customEventFilter": [
          {
            "type": "EQUALS",
            "parameter": [
              {
                "type": "TEMPLATE",
                "key": "arg0",
                "value": "{{_event}}"
              },
              {
                "type": "TEMPLATE",
                "key": "arg1",
                "value": "purchase"
              }
            ]
          }
        ],
        "fingerprint": "1778094521906"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "triggerId": "38",
        "name": "CE - View Item",
        "type": "CUSTOM_EVENT",
        "customEventFilter": [
          {
            "type": "EQUALS",
            "parameter": [
              {
                "type": "TEMPLATE",
                "key": "arg0",
                "value": "{{_event}}"
              },
              {
                "type": "TEMPLATE",
                "key": "arg1",
                "value": "view_item"
              }
            ]
          }
        ],
        "fingerprint": "1778094521907"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "triggerId": "40",
        "name": "CE - PageView Meta",
        "type": "CUSTOM_EVENT",
        "customEventFilter": [
          {
            "type": "EQUALS",
            "parameter": [
              {
                "type": "TEMPLATE",
                "key": "arg0",
                "value": "{{_event}}"
              },
              {
                "type": "TEMPLATE",
                "key": "arg1",
                "value": "page_view_meta"
              }
            ]
          }
        ],
        "fingerprint": "1778094521907"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "triggerId": "44",
        "name": "CE - Add to Cart",
        "type": "CUSTOM_EVENT",
        "customEventFilter": [
          {
            "type": "EQUALS",
            "parameter": [
              {
                "type": "TEMPLATE",
                "key": "arg0",
                "value": "{{_event}}"
              },
              {
                "type": "TEMPLATE",
                "key": "arg1",
                "value": "add_to_cart"
              }
            ]
          }
        ],
        "fingerprint": "1778094521907"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "triggerId": "51",
        "name": "CE - Add Shipping Info",
        "type": "CUSTOM_EVENT",
        "customEventFilter": [
          {
            "type": "EQUALS",
            "parameter": [
              {
                "type": "TEMPLATE",
                "key": "arg0",
                "value": "{{_event}}"
              },
              {
                "type": "TEMPLATE",
                "key": "arg1",
                "value": "add_shipping_info"
              }
            ]
          }
        ],
        "fingerprint": "1778094521908"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "triggerId": "52",
        "name": "CE - Search",
        "type": "CUSTOM_EVENT",
        "customEventFilter": [
          {
            "type": "EQUALS",
            "parameter": [
              {
                "type": "TEMPLATE",
                "key": "arg0",
                "value": "{{_event}}"
              },
              {
                "type": "TEMPLATE",
                "key": "arg1",
                "value": "search"
              }
            ]
          }
        ],
        "fingerprint": "52",
        "notes": "THE ONE EXCEPTION TO THE NAMESPACING RULE, deliberately. Every other event trigger this plugin adds uses a namespaced name (mcapi_sale, mcapi_lead, mcapi_registration, mcapi_wishlist) so that no other plugin's push can fire our tags -- a trigger condition reads the merged data model and cannot ask who pushed. CE - Search keeps the plain `search` name for two reasons. It already ships in merchants' containers with the TikTok and Pinterest Search tags hanging off it, so renaming it would silence tags rather than protect them -- and until 3.11.0 the plugin pushed no search event at all, so those tags have never fired and start working here with no re-import. And the exposure is different in kind: a foreign `search` push sends noise to three platforms with no money attached, where a foreign `purchase` push became a revenue conversion. The asymmetry is a judgement about cost, not an oversight."
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "triggerId": "80",
        "name": "CE - CAPI Suite Sale",
        "type": "CUSTOM_EVENT",
        "customEventFilter": [
          {
            "type": "EQUALS",
            "parameter": [
              {
                "type": "TEMPLATE",
                "key": "arg0",
                "value": "{{_event}}"
              },
              {
                "type": "TEMPLATE",
                "key": "arg1",
                "value": "mcapi_sale"
              }
            ]
          }
        ],
        "fingerprint": "1778600000001"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "triggerId": "81",
        "name": "CE - CAPI Suite Lead",
        "type": "CUSTOM_EVENT",
        "customEventFilter": [
          {
            "type": "EQUALS",
            "parameter": [
              {
                "type": "TEMPLATE",
                "key": "arg0",
                "value": "{{_event}}"
              },
              {
                "type": "TEMPLATE",
                "key": "arg1",
                "value": "mcapi_lead"
              }
            ]
          }
        ],
        "notes": "Fires on the Lead push this plugin makes when a Contact Form 7 form is submitted successfully -- not when the notification email is delivered, so a site with broken mail still reports its leads. A store with no Contact Form 7 installed never fires this trigger. This is a namespaced event name rather than a generic one, and that is a decision. A Tag Manager trigger condition reads the merged data model, not the individual push, so it cannot ask WHO pushed an event -- which is why the sale tags in this container had to be moved off a trigger whose only condition was `{{_event}} EQUALS purchase`: any other plugin's purchase push became a conversion through it. Every trigger this plugin ADDS therefore takes a name no other plugin emits."
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "triggerId": "82",
        "name": "CE - CAPI Suite Registration",
        "type": "CUSTOM_EVENT",
        "customEventFilter": [
          {
            "type": "EQUALS",
            "parameter": [
              {
                "type": "TEMPLATE",
                "key": "arg0",
                "value": "{{_event}}"
              },
              {
                "type": "TEMPLATE",
                "key": "arg1",
                "value": "mcapi_registration"
              }
            ]
          }
        ],
        "notes": "Fires on the CompleteRegistration push, which this plugin makes on the FIRST PAGE a new customer loads after WooCommerce created their account -- the registration request is a POST followed by a redirect, so there is no page for a push to ride on. This is a namespaced event name rather than a generic one, and that is a decision. A Tag Manager trigger condition reads the merged data model, not the individual push, so it cannot ask WHO pushed an event -- which is why the sale tags in this container had to be moved off a trigger whose only condition was `{{_event}} EQUALS purchase`: any other plugin's purchase push became a conversion through it. Every trigger this plugin ADDS therefore takes a name no other plugin emits."
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "triggerId": "83",
        "name": "CE - CAPI Suite Wishlist",
        "type": "CUSTOM_EVENT",
        "customEventFilter": [
          {
            "type": "EQUALS",
            "parameter": [
              {
                "type": "TEMPLATE",
                "key": "arg0",
                "value": "{{_event}}"
              },
              {
                "type": "TEMPLATE",
                "key": "arg1",
                "value": "mcapi_wishlist"
              }
            ]
          }
        ],
        "notes": "Fires on the AddToWishlist push, when a product is added to a YITH WooCommerce Wishlist. A store without that plugin never fires this trigger. This is a namespaced event name rather than a generic one, and that is a decision. A Tag Manager trigger condition reads the merged data model, not the individual push, so it cannot ask WHO pushed an event -- which is why the sale tags in this container had to be moved off a trigger whose only condition was `{{_event}} EQUALS purchase`: any other plugin's purchase push became a conversion through it. Every trigger this plugin ADDS therefore takes a name no other plugin emits."
      }
    ],
    "variable": [
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "variableId": "15",
        "name": "DLV - ecommerce.items",
        "type": "v",
        "parameter": [
          {
            "type": "INTEGER",
            "key": "dataLayerVersion",
            "value": "2"
          },
          {
            "type": "BOOLEAN",
            "key": "setDefaultValue",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "name",
            "value": "ecommerce.items"
          }
        ],
        "fingerprint": "1778094521791"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "variableId": "16",
        "name": "DLV - ecommerce.currency",
        "type": "v",
        "parameter": [
          {
            "type": "INTEGER",
            "key": "dataLayerVersion",
            "value": "2"
          },
          {
            "type": "BOOLEAN",
            "key": "setDefaultValue",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "name",
            "value": "ecommerce.currency"
          }
        ],
        "fingerprint": "1778094521792"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "variableId": "18",
        "name": "CONST - GA4 Measurement ID",
        "type": "c",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "value",
            "value": "GA4_MEASUREMENT_ID"
          }
        ],
        "fingerprint": "1778094521792"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "variableId": "19",
        "name": "DLV - ecommerce.value",
        "type": "v",
        "parameter": [
          {
            "type": "INTEGER",
            "key": "dataLayerVersion",
            "value": "2"
          },
          {
            "type": "BOOLEAN",
            "key": "setDefaultValue",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "name",
            "value": "ecommerce.value"
          }
        ],
        "fingerprint": "1778094521792"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "variableId": "21",
        "name": "DLV - ecommerce.payment_method",
        "type": "v",
        "parameter": [
          {
            "type": "INTEGER",
            "key": "dataLayerVersion",
            "value": "2"
          },
          {
            "type": "BOOLEAN",
            "key": "setDefaultValue",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "name",
            "value": "ecommerce.payment_method"
          }
        ],
        "fingerprint": "1778094521793"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "variableId": "26",
        "name": "DLV - event_id",
        "type": "v",
        "parameter": [
          {
            "type": "INTEGER",
            "key": "dataLayerVersion",
            "value": "2"
          },
          {
            "type": "BOOLEAN",
            "key": "setDefaultValue",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "name",
            "value": "event_id"
          }
        ],
        "fingerprint": "1778094521906"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "variableId": "27",
        "name": "CONST - Meta Pixel ID",
        "type": "c",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "value",
            "value": "META_PIXEL_ID"
          }
        ],
        "fingerprint": "1778094521906"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "variableId": "32",
        "name": "DLV - Hashed Email",
        "type": "v",
        "parameter": [
          {
            "type": "INTEGER",
            "key": "dataLayerVersion",
            "value": "2"
          },
          {
            "type": "BOOLEAN",
            "key": "setDefaultValue",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "name",
            "value": "user_data.email"
          }
        ],
        "fingerprint": "1778094521906"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "variableId": "36",
        "name": "DLV - ecommerce.transaction_id",
        "type": "v",
        "parameter": [
          {
            "type": "INTEGER",
            "key": "dataLayerVersion",
            "value": "2"
          },
          {
            "type": "BOOLEAN",
            "key": "setDefaultValue",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "name",
            "value": "ecommerce.transaction_id"
          }
        ],
        "fingerprint": "1778094521907"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "variableId": "37",
        "name": "DLV - ecommerce.item_list_name",
        "type": "v",
        "parameter": [
          {
            "type": "INTEGER",
            "key": "dataLayerVersion",
            "value": "2"
          },
          {
            "type": "BOOLEAN",
            "key": "setDefaultValue",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "name",
            "value": "ecommerce.item_list_name"
          }
        ],
        "fingerprint": "1778094521907"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "variableId": "52",
        "name": "DLV - ecommerce.shipping_method",
        "type": "v",
        "parameter": [
          {
            "type": "INTEGER",
            "key": "dataLayerVersion",
            "value": "2"
          },
          {
            "type": "BOOLEAN",
            "key": "setDefaultValue",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "name",
            "value": "ecommerce.shipping_method"
          }
        ],
        "fingerprint": "1778094521908"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "variableId": "53",
        "name": "CONST - TikTok Pixel Code",
        "type": "c",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "value",
            "value": "YOUR_TIKTOK_PIXEL_CODE"
          }
        ],
        "fingerprint": "53",
        "formatValue": {}
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "variableId": "54",
        "name": "CONST - Google Ads Conversion ID",
        "type": "c",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "value",
            "value": "CONVERSION_ID_NUMBER_ONLY"
          }
        ],
        "fingerprint": "1778600000000",
        "notes": "The number part of your Google Ads Conversion ID, with no AW- prefix: if Google Ads shows AW-1234567890, enter 1234567890. Find it in Google Ads \u2192 Goals \u2192 Conversions \u2192 your Purchase conversion action \u2192 Tag setup \u2192 Install the tag yourself."
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "variableId": "55",
        "name": "CONST - Google Ads Purchase Label",
        "type": "c",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "value",
            "value": "PURCHASE_LABEL"
          }
        ],
        "fingerprint": "1778600000000",
        "notes": "Google Ads Conversion Label for your Purchase conversion, e.g. abc123XYZ. Found alongside the Conversion ID in the same Goals \u2192 Conversions screen."
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "variableId": "57",
        "name": "CONST - Pinterest Tag ID",
        "type": "c",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "value",
            "value": "YOUR_PINTEREST_TAG_ID"
          }
        ]
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "variableId": "81",
        "name": "DLV - mcapi_event_name",
        "type": "v",
        "parameter": [
          {
            "type": "INTEGER",
            "key": "dataLayerVersion",
            "value": "2"
          },
          {
            "type": "BOOLEAN",
            "key": "setDefaultValue",
            "value": "true"
          },
          {
            "type": "TEMPLATE",
            "key": "defaultValue",
            "value": "Purchase"
          },
          {
            "type": "TEMPLATE",
            "key": "name",
            "value": "mcapi_event_name"
          }
        ],
        "fingerprint": "1778600000002"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "variableId": "82",
        "name": "LT - TikTok Sale Event",
        "type": "smm",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "setDefaultValue",
            "value": "true"
          },
          {
            "type": "TEMPLATE",
            "key": "input",
            "value": "{{DLV - mcapi_event_name}}"
          },
          {
            "type": "TEMPLATE",
            "key": "defaultValue",
            "value": "CompletePayment"
          },
          {
            "type": "LIST",
            "key": "map",
            "list": [
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "key",
                    "value": "Purchase"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "value",
                    "value": "CompletePayment"
                  }
                ]
              },
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "key",
                    "value": "Subscribe"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "value",
                    "value": "Subscribe"
                  }
                ]
              },
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "key",
                    "value": "SubscriptionRenewal"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "value",
                    "value": "Subscribe"
                  }
                ]
              }
            ]
          }
        ],
        "fingerprint": "1778600000003"
      }
    ],
    "builtInVariable": [
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "type": "PAGE_URL",
        "name": "Page URL"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "type": "PAGE_HOSTNAME",
        "name": "Page Hostname"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "type": "PAGE_PATH",
        "name": "Page Path"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "type": "REFERRER",
        "name": "Referrer"
      }
    ],
    "fingerprint": "1778143811694",
    "tagManagerUrl": "https://tagmanager.google.com/#/versions/accounts/6353828409/containers/251606233/versions/0?apiLink=version",
    "customTemplate": [
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "templateId": "25",
        "name": "Meta Pixel",
        "fingerprint": "1778094521793",
        "templateData": "___TERMS_OF_SERVICE___\n\nBy creating or modifying this file you agree to Google Tag Manager's Community\nTemplate Gallery Developer Terms of Service available at\nhttps://developers.google.com/tag-manager/gallery-tos (or such other URL as\nGoogle may provide), as modified from time to time.\n\n\n___INFO___\n\n{\n  \"displayName\": \"Meta Pixel\",\n  \"__wm\": \"VGVtcGxhdGUtQXV0aG9yX0ZhY2Vib29rLVNpbW8tQWhhdmE\\u003d\",\n  \"description\": \"Integrate your GTM with Meta Pixel for a streamlined way to connect your data to Meta and help maximize your advertising and measurement by understanding the actions people take on your website.\",\n  \"categories\": [\n    \"ADVERTISING\",\n    \"ANALYTICS\"\n  ],\n  \"id\": \"cvt_5RM3Q\",\n  \"type\": \"TAG\",\n  \"version\": 1,\n  \"brand\": {\n    \"displayName\": \"facebook\",\n    \"id\": \"github.com_facebook\",\n    \"thumbnail\": \"data:image/png;base64,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\\u003d\\u003d\"\n  },\n  \"containerContexts\": [\n    \"WEB\"\n  ]\n}\n\n\n___TEMPLATE_PARAMETERS___\n\n[\n  {\n    \"alwaysInSummary\": true,\n    \"valueValidators\": [\n      {\n        \"errorMessage\": \"You must provide a Pixel ID\",\n        \"type\": \"NON_EMPTY\"\n      },\n      {\n        \"args\": [\n          \"^[0-9,]+$\"\n        ],\n        \"errorMessage\": \"Invalid Pixel ID format\",\n        \"type\": \"REGEX\"\n      }\n    ],\n    \"displayName\": \"Facebook Pixel ID(s)\",\n    \"simpleValueType\": true,\n    \"name\": \"pixelId\",\n    \"type\": \"TEXT\",\n    \"valueHint\": \"e.g. 12345678910\"\n  },\n  {\n    \"type\": \"CHECKBOX\",\n    \"name\": \"enhancedEcommerce\",\n    \"checkboxText\": \"Enhanced Ecommerce dataLayer Integration\",\n    \"simpleValueType\": true,\n    \"help\": \"If you check this, then the Facebook pixel will populate \\u003cstrong\\u003eEvent Name\\u003c/strong\\u003e and \\u003cstrong\\u003eObject Properties\\u003c/strong\\u003e automatically from the last \\u003ca href\\u003d\\\"https://developers.google.com/tag-manager/enhanced-ecommerce\\\"\\u003eecommerce\\u003c/a\\u003e object pushed into the dataLayer array.\"\n  },\n  {\n    \"type\": \"CHECKBOX\",\n    \"name\": \"useGA4Ecommerce\",\n    \"checkboxText\": \"Use GA4 dataLayer Integration\",\n    \"simpleValueType\": true,\n    \"help\": \"**Use GA4 Ecommerce:**\\u003cbr/\\u003e\\n\\u003cbr/\\u003e\\nIf this feature is enabled, please push an **eventModel** object containing the required parameters into the dataLayer.\\u003cbr/\\u003e\\n\\u003cbr/\\u003e\\nExample:\\u003cbr/\\u003e\\n\\u003cbr/\\u003e\\nwindow.dataLayer \\u003d window.dataLayer || [];\\u003cbr/\\u003e\\n\\u003cbr/\\u003e\\nwindow.dataLayer.push({\\u003cbr/\\u003e\\n\\u0026nbsp;\\u0026nbsp;\\\"event\\\": \\\"add_to_cart\\\",\\u003cbr/\\u003e\\n\\u0026nbsp;\\u0026nbsp;\\\"eventModel\\\": {\\u003cbr/\\u003e\\n\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\\"currency\\\": \\\"USD\\\",\\u003cbr/\\u003e\\n\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\\"value\\\": 30,\\u003cbr/\\u003e\\n\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\\"items\\\": [\\u003cbr/\\u003e\\n\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;{\\u003cbr/\\u003e\\n\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\\"item_id\\\": \\\"item_id\\\",\\u003cbr/\\u003e\\n\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\\"item_name\\\": \\\"item_name\\\",\\u003cbr/\\u003e\\n\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\\"price\\\": 30\\u003cbr/\\u003e\\n\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;}\\u003cbr/\\u003e\\n\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;]\\u003cbr/\\u003e\\n\\u0026nbsp;\\u0026nbsp;}\\u003cbr/\\u003e\\n});\"\n  },\n  {\n    \"type\": \"RADIO\",\n    \"name\": \"eventName\",\n    \"displayName\": \"Event Name\",\n    \"radioItems\": [\n      {\n        \"value\": \"standard\",\n        \"displayValue\": \"Standard\",\n        \"subParams\": [\n          {\n            \"type\": \"SELECT\",\n            \"name\": \"standardEventName\",\n            \"macrosInSelect\": false,\n            \"selectItems\": [\n              {\n                \"displayValue\": \"PageView\",\n                \"value\": \"PageView\"\n              },\n              {\n                \"displayValue\": \"AddPaymentInfo\",\n                \"value\": \"AddPaymentInfo\"\n              },\n              {\n                \"displayValue\": \"AddToCart\",\n                \"value\": \"AddToCart\"\n              },\n              {\n                \"displayValue\": \"AddToWishlist\",\n                \"value\": \"AddToWishlist\"\n              },\n              {\n                \"displayValue\": \"CompleteRegistration\",\n                \"value\": \"CompleteRegistration\"\n              },\n              {\n                \"displayValue\": \"Contact\",\n                \"value\": \"Contact\"\n              },\n              {\n                \"displayValue\": \"CustomizeProduct\",\n                \"value\": \"CustomizeProduct\"\n              },\n              {\n                \"displayValue\": \"Donate\",\n                \"value\": \"Donate\"\n              },\n              {\n                \"displayValue\": \"FindLocation\",\n                \"value\": \"FindLocation\"\n              },\n              {\n                \"displayValue\": \"InitiateCheckout\",\n                \"value\": \"InitiateCheckout\"\n              },\n              {\n                \"displayValue\": \"Lead\",\n                \"value\": \"Lead\"\n              },\n              {\n                \"displayValue\": \"Purchase\",\n                \"value\": \"Purchase\"\n              },\n              {\n                \"displayValue\": \"Schedule\",\n                \"value\": \"Schedule\"\n              },\n              {\n                \"displayValue\": \"Search\",\n                \"value\": \"Search\"\n              },\n              {\n                \"displayValue\": \"StartTrial\",\n                \"value\": \"StartTrial\"\n              },\n              {\n                \"displayValue\": \"SubmitApplication\",\n                \"value\": \"SubmitApplication\"\n              },\n              {\n                \"displayValue\": \"Subscribe\",\n                \"value\": \"Subscribe\"\n              },\n              {\n                \"displayValue\": \"ViewContent\",\n                \"value\": \"ViewContent\"\n              }\n            ],\n            \"simpleValueType\": true,\n            \"defaultValue\": \"PageView\"\n          }\n        ]\n      },\n      {\n        \"value\": \"custom\",\n        \"displayValue\": \"Custom\",\n        \"subParams\": [\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"customEventName\",\n            \"displayName\": \"\",\n            \"simpleValueType\": true\n          }\n        ]\n      },\n      {\n        \"value\": \"variable\",\n        \"displayValue\": \"Variable\",\n        \"subParams\": [\n          {\n            \"type\": \"SELECT\",\n            \"name\": \"variableEventName\",\n            \"macrosInSelect\": true,\n            \"selectItems\": [],\n            \"simpleValueType\": true\n          }\n        ]\n      }\n    ],\n    \"simpleValueType\": true,\n    \"enablingConditions\": [\n      {\n        \"paramName\": \"enhancedEcommerce\",\n        \"paramValue\": true,\n        \"type\": \"NOT_EQUALS\"\n      }\n    ]\n  },\n  {\n    \"type\": \"RADIO\",\n    \"name\": \"eecEventName\",\n    \"displayName\": \"Event Name\",\n    \"radioItems\": [\n      {\n        \"value\": \"eec\",\n        \"displayValue\": \"Set automatically from dataLayer\"\n      }\n    ],\n    \"simpleValueType\": true,\n    \"help\": \"The Enhanced Ecommerce integration populates the Event Name automatically depending on what type of \\u003cstrong\\u003eecommerce\\u003c/strong\\u003e object was last pushed into dataLayer (\\\"detail\\\" -\\u003e \\\"ViewContent\\\", \\\"add\\\" -\\u003e \\\"AddToCart\\\", \\\"checkout\\\" -\\u003e \\\"InitiateCheckout\\\", \\\"purchase\\\" -\\u003e \\\"Purchase\\\").\",\n    \"enablingConditions\": [\n      {\n        \"paramName\": \"enhancedEcommerce\",\n        \"paramValue\": true,\n        \"type\": \"EQUALS\"\n      }\n    ]\n  },\n  {\n    \"type\": \"SELECT\",\n    \"name\": \"consent\",\n    \"displayName\": \"Consent Granted (GDPR)\",\n    \"macrosInSelect\": true,\n    \"selectItems\": [\n      {\n        \"value\": true,\n        \"displayValue\": \"True\"\n      },\n      {\n        \"value\": false,\n        \"displayValue\": \"False\"\n      }\n    ],\n    \"simpleValueType\": true,\n    \"help\": \"If you set Consent Granted to \\u003cstrong\\u003efalse\\u003c/strong\\u003e, the pixel will not send any hits until a tag is fired where Consent Granted is set to \\u003cstrong\\u003etrue\\u003c/strong\\u003e. See \\u003ca href\\u003d\\\"https://developers.facebook.com/docs/facebook-pixel/implementation/gdpr/\\\"\\u003ethis article\\u003c/a\\u003e for more information.\"\n  },\n  {\n    \"simpleValueType\": true,\n    \"name\": \"advancedMatching\",\n    \"checkboxText\": \"Enable Advanced Matching\",\n    \"type\": \"CHECKBOX\"\n  },\n  {\n    \"type\": \"GROUP\",\n    \"name\": \"dataProcessingOptionsGroup\",\n    \"displayName\": \"Data Processing Options\",\n    \"groupStyle\": \"ZIPPY_CLOSED\",\n    \"subParams\": [\n      {\n        \"type\": \"LABEL\",\n        \"name\": \"dpoInfo\",\n        \"displayName\": \"Data Processing Options force this Facebook event to comply to regional regulations with regard to the processing and selling of user data. Read \\u003ca href\\u003d\\\"https://developers.facebook.com/docs/marketing-apis/data-processing-options\\\"\\u003ethis\\u003c/a\\u003e for more information about how to configure this section.\"\n      },\n      {\n        \"type\": \"CHECKBOX\",\n        \"name\": \"dpoLDU\",\n        \"checkboxText\": \"Limited Data Use (LDU)\",\n        \"simpleValueType\": true\n      },\n      {\n        \"type\": \"TEXT\",\n        \"name\": \"dpoCountry\",\n        \"displayName\": \"Country\",\n        \"simpleValueType\": true,\n        \"defaultValue\": 0,\n        \"enablingConditions\": [\n          {\n            \"paramName\": \"dpoLDU\",\n            \"paramValue\": true,\n            \"type\": \"EQUALS\"\n          }\n        ],\n        \"valueValidators\": [\n          {\n            \"type\": \"NUMBER\"\n          }\n        ]\n      },\n      {\n        \"type\": \"TEXT\",\n        \"name\": \"dpoState\",\n        \"displayName\": \"State\",\n        \"simpleValueType\": true,\n        \"defaultValue\": 0,\n        \"enablingConditions\": [\n          {\n            \"paramName\": \"dpoLDU\",\n            \"paramValue\": true,\n            \"type\": \"EQUALS\"\n          }\n        ],\n        \"valueValidators\": [\n          {\n            \"type\": \"NUMBER\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"enablingConditions\": [\n      {\n        \"paramName\": \"advancedMatching\",\n        \"type\": \"EQUALS\",\n        \"paramValue\": true\n      }\n    ],\n    \"displayName\": \"Customer Information Data Parameters\",\n    \"name\": \"advancedMatchingGroup\",\n    \"groupStyle\": \"ZIPPY_CLOSED\",\n    \"type\": \"GROUP\",\n    \"subParams\": [\n      {\n        \"displayName\": \"\",\n        \"name\": \"advancedMatchingList\",\n        \"simpleTableColumns\": [\n          {\n            \"selectItems\": [\n              {\n                \"displayValue\": \"City\",\n                \"value\": \"ct\"\n              },\n              {\n                \"displayValue\": \"Country\",\n                \"value\": \"cn\"\n              },\n              {\n                \"displayValue\": \"Date of Birth\",\n                \"value\": \"db\"\n              },\n              {\n                \"displayValue\": \"Email\",\n                \"value\": \"em\"\n              },\n              {\n                \"displayValue\": \"External ID\",\n                \"value\": \"external_id\"\n              },\n              {\n                \"displayValue\": \"First Name\",\n                \"value\": \"fn\"\n              },\n              {\n                \"displayValue\": \"Gender\",\n                \"value\": \"ge\"\n              },\n              {\n                \"displayValue\": \"Last Name\",\n                \"value\": \"ln\"\n              },\n              {\n                \"displayValue\": \"Phone\",\n                \"value\": \"ph\"\n              },\n              {\n                \"displayValue\": \"State\",\n                \"value\": \"st\"\n              },\n              {\n                \"displayValue\": \"Zip Code\",\n                \"value\": \"zp\"\n              }\n            ],\n            \"defaultValue\": \"\",\n            \"displayName\": \"Parameter name\",\n            \"name\": \"name\",\n            \"isUnique\": true,\n            \"type\": \"SELECT\"\n          },\n          {\n            \"defaultValue\": \"\",\n            \"displayName\": \"Parameter value\",\n            \"name\": \"value\",\n            \"type\": \"TEXT\"\n          }\n        ],\n        \"type\": \"SIMPLE_TABLE\",\n        \"newRowButtonText\": \"Add parameter\",\n        \"valueValidators\": [\n          {\n            \"type\": \"NON_EMPTY\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"displayName\": \"Object Properties\",\n    \"name\": \"objectPropertiesGroup\",\n    \"groupStyle\": \"ZIPPY_CLOSED\",\n    \"type\": \"GROUP\",\n    \"subParams\": [\n      {\n        \"type\": \"LABEL\",\n        \"name\": \"enhancedEcommerceObject\",\n        \"displayName\": \"\\u003cstrong\\u003eWarning!\\u003c/strong\\u003e Object properties are populated automatically based on the most recent \\u003cstrong\\u003eecommerce\\u003c/strong\\u003e object pushed into dataLayer. If you add properties here that are already set by the integration (content_type, contents, num_items, value, currency), then the properties you add here will override those set automatically by the integration!\",\n        \"enablingConditions\": [\n          {\n            \"paramName\": \"enhancedEcommerce\",\n            \"paramValue\": true,\n            \"type\": \"EQUALS\"\n          }\n        ]\n      },\n      {\n        \"type\": \"SELECT\",\n        \"name\": \"objectPropertiesFromVariable\",\n        \"displayName\": \"Load Properties From Variable\",\n        \"macrosInSelect\": true,\n        \"selectItems\": [\n          {\n            \"value\": false,\n            \"displayValue\": \"False\"\n          }\n        ],\n        \"simpleValueType\": true,\n        \"help\": \"You can use a variable that returns a JavaScript object with the properties you want to use. This object will be merged with any additional properties you add via the table below. Any conflicts will be resolved in favor of the properties you add to the table.\"\n      },\n      {\n        \"name\": \"objectPropertyList\",\n        \"simpleTableColumns\": [\n          {\n            \"valueValidators\": [],\n            \"defaultValue\": \"\",\n            \"displayName\": \"Property Name\",\n            \"name\": \"name\",\n            \"isUnique\": true,\n            \"type\": \"TEXT\"\n          },\n          {\n            \"defaultValue\": \"\",\n            \"displayName\": \"Property Value\",\n            \"name\": \"value\",\n            \"type\": \"TEXT\"\n          }\n        ],\n        \"type\": \"SIMPLE_TABLE\",\n        \"newRowButtonText\": \"Add property\"\n      }\n    ]\n  },\n  {\n    \"displayName\": \"More Settings\",\n    \"name\": \"moreSettingsGroup\",\n    \"groupStyle\": \"ZIPPY_CLOSED\",\n    \"type\": \"GROUP\",\n    \"subParams\": [\n      {\n        \"help\": \"Facebook collects some metadata (e.g. structured data) and user interactions (e.g. clicks) automatically. Check this box to disable this automatic configuration of the pixel.\",\n        \"simpleValueType\": true,\n        \"name\": \"disableAutoConfig\",\n        \"checkboxText\": \"Disable Automatic Configuration\",\n        \"type\": \"CHECKBOX\"\n      },\n      {\n        \"type\": \"CHECKBOX\",\n        \"name\": \"disablePushState\",\n        \"checkboxText\": \"Disable History Event Tracking\",\n        \"simpleValueType\": true,\n        \"help\": \"The Facebook Pixel tracks history events (pushState and replaceState) automatically as PageViews. Check this box to prevent the pixel from tracking such events automatically.\"\n      },\n      {\n        \"type\": \"TEXT\",\n        \"name\": \"eventId\",\n        \"displayName\": \"Event ID\",\n        \"simpleValueType\": true,\n        \"help\": \"Set the Event ID parameter in case you are tracking the same event server-side as well. The Event ID can be used to deduplicate the same event if sent from multiple sources. See more \\u003ca href\\u003d\\\"https://developers.facebook.com/docs/marketing-api/conversions-api/deduplicate-pixel-and-server-events/\\\"\\u003ehere\\u003c/a\\u003e.\"\n      }\n    ]\n  }\n]\n\n\n___SANDBOXED_JS_FOR_WEB_TEMPLATE___\n\nconst createQueue = require('createQueue');\nconst callInWindow = require('callInWindow');\nconst aliasInWindow = require('aliasInWindow');\nconst copyFromWindow = require('copyFromWindow');\nconst setInWindow = require('setInWindow');\nconst injectScript = require('injectScript');\nconst makeTableMap = require('makeTableMap');\nconst makeNumber = require('makeNumber');\nconst getType = require('getType');\nconst copyFromDataLayer = require('copyFromDataLayer');\nconst math = require('Math');\nconst log = require('logToConsole');\nconst getUrl = require('getUrl');\n\nconst PARAM_BUILDER_SCRIPT_URL = 'https://capi-automation.s3.us-east-2.amazonaws.com/public/client_js/capiParamBuilder/clientParamBuilder.bundle.js';\n\nconst initIds = copyFromWindow('_fbq_gtm_ids') || [];\nconst pixelIds = data.pixelId;\nconst standardEventNames = ['AddPaymentInfo', 'AddToCart', 'AddToWishlist', 'CompleteRegistration', 'Contact', 'CustomizeProduct', 'Donate', 'FindLocation', 'InitiateCheckout', 'Lead', 'PageView', 'Purchase', 'Schedule', 'Search', 'StartTrial', 'SubmitApplication', 'Subscribe', 'ViewContent'];\nconst ecommerce = copyFromDataLayer('ecommerce', 1);\nconst eventModel = copyFromDataLayer('eventModel', 1);\n\n// Helper methods\nconst fail = msg => {\n  log(msg);\n  data.gtmOnFailure();\n};\n\nconst mergeObj = (obj, obj2) => {\n  for (let key in obj2) {\n    if (obj2.hasOwnProperty(key)) {\n      obj[key] = obj2[key];\n    }\n  }\n  return obj;\n};\n\nconst parseEecObj = prod => {\n  return {\n    id: prod.id,\n    quantity: prod.quantity\n  };\n};\n\n// Initialize EEC integration\nlet eventName, action, eecObjectProps;\nif (data.enhancedEcommerce) {\n  if (!ecommerce) return fail('Facebook Pixel: No valid \"ecommerce\" object found in dataLayer');\n  if (ecommerce.detail) { eventName = 'ViewContent'; action = 'detail'; }\n  else if (ecommerce.add) { eventName = 'AddToCart'; action = 'add'; }\n  else if (ecommerce.checkout) { eventName = 'InitiateCheckout'; action = 'checkout'; }\n  else if (ecommerce.purchase) { eventName = 'Purchase'; action = 'purchase'; }\n  else return fail('Facebook Pixel: Most recently pushed \"ecommerce\" object must be one of types \"detail\", \"add\", \"checkout\" or \"purchase\".');\n\n  if (!ecommerce[action].products || getType(ecommerce[action].products) !== 'array') return fail('Facebook pixel: Most recently pushed \"ecommerce\" object did not have a valid \"products\" array.');\n  eecObjectProps = {\n    content_type: 'product',\n    contents: ecommerce[action].products.map(parseEecObj),\n    value: ecommerce[action].products.reduce((acc, cur) => {\n      const curVal = math.round(makeNumber(cur.price || 0) * (cur.quantity || 1) * 100) / 100;\n      return acc + curVal;\n    }, 0.0),\n    currency: ecommerce.currencyCode || 'USD'\n  };\n  if (['InitiateCheckout', 'Purchase'].indexOf(eventName) > -1) eecObjectProps.num_items = ecommerce[action].products.reduce((acc,cur) => {\n    return acc + makeNumber(cur.quantity || 1);\n  }, 0);\n}\n\n// Prepare event variables\nconst cidParams = data.advancedMatchingList && data.advancedMatchingList.length ? makeTableMap(data.advancedMatchingList, 'name', 'value') : {};\nconst objectProps = data.objectPropertyList && data.objectPropertyList.length ? makeTableMap(data.objectPropertyList, 'name', 'value') : {};\nconst objectPropsFromVar = getType(data.objectPropertiesFromVariable) === 'object' ? data.objectPropertiesFromVariable : {};\nlet customData = {};\n\neventName = eventName || (data.eventName === 'custom' ? data.customEventName : (data.eventName === 'variable' ? data.variableEventName : data.standardEventName));\n\nconst command = standardEventNames.indexOf(eventName) === -1 ? 'trackSingleCustom' : 'trackSingle';\nconst consent = data.consent === false ? 'revoke' : 'grant';\n\n// Utility function to use either fbq.queue[]\n// (if the FB SDK hasn't loaded yet), or fbq.callMethod()\n// if the SDK has loaded.\nconst getFbq = () => {\n  // Return the existing 'fbq' global method if available\n  let fbq = copyFromWindow('fbq');\n  if (fbq) {\n    return fbq;\n  }\n\n  // Initialize the 'fbq' global method to either use\n  // fbq.callMethod or fbq.queue)\n  setInWindow('fbq', function() {\n    const callMethod = copyFromWindow('fbq.callMethod.apply');\n    if (callMethod) {\n      callInWindow('fbq.callMethod.apply', null, arguments);\n    } else {\n      callInWindow('fbq.queue.push', arguments);\n    }\n  });\n  aliasInWindow('_fbq', 'fbq');\n\n  // Create the fbq.queue\n  createQueue('fbq.queue');\n\n  // Return the global 'fbq' method, created above\n  return copyFromWindow('fbq');\n};\n\n// Get reference to the global method\nconst fbq = getFbq();\n\nfbq('consent', consent);\n\n // Set Data Processing Options\nif (data.dpoLDU) {\n  fbq('dataProcessingOptions', ['LDU'], makeNumber(data.dpoCountry), makeNumber(data.dpoState));\n}\n\n// Monitoring agent string for Tag Setup\nconst agentName = 'tmSimo-GTM-WebTemplate';\nconst version = '2.0.5';\nconst agentSuffix = (data.enhancedEcommerce ? '-EEC' : '') + (data.useGA4Ecommerce ? '-GA4' : '');\n\n// Handle multiple, comma-separated pixel IDs,\n// and initialize each ID if not done already.\npixelIds.split(',').forEach(pixelId => {\n  if (initIds.indexOf(pixelId) === -1) {\n\n    // If the user has chosen to disable automatic configuration\n    if (data.disableAutoConfig) {\n      fbq('set', 'autoConfig', false, pixelId);\n    }\n\n    // If the user has chosen to disable pushState and replaceState tracking\n    if (data.disablePushState) {\n      setInWindow('fbq.disablePushState', true);\n    }\n\n\n    // Initialize pixel and store in global array\n    fbq('init', pixelId, cidParams);\n\n    // Monitoring agent string for Tag Setup\n    const agentString = agentName + '-' + version + agentSuffix;\n    fbq('set','agent', agentString, pixelId);\n\n    initIds.push(pixelId);\n    setInWindow('_fbq_gtm_ids', initIds, true);\n\n    // If this first-time init included cidParams, mark the page as\n    // already-initialized-with-cidParams so we never re-init for it.\n    if (data.advancedMatchingList && data.advancedMatchingList.length) {\n      setInWindow('_fbq_gtm_cidparams_initialized', true, true);\n    }\n  }\n});\n\n// Re-init pixels with cidParams when:\n//   - this tag fire actually has Advanced Matching data, AND\n//   - we have NOT yet initialized any pixel with cidParams on this page.\nif (data.advancedMatchingList && data.advancedMatchingList.length) {\n  const cidParamsInitialized = copyFromWindow('_fbq_gtm_cidparams_initialized') === true;\n  if (!cidParamsInitialized) {\n    setInWindow('_fbq_gtm_cidparams_initialized', true, true);\n\n    const firstPixelId = pixelIds.split(',')[0];\n    callInWindow(\n      'fbq',\n      'gateCheck',\n      'enable_reinit_cidparams2',\n      function(gateName, pixelID) {\n        pixelIds.split(',').forEach(pixelId => {\n          if (initIds.indexOf(pixelId) !== -1) {\n            fbq('init', pixelId, cidParams);\n            const reinitAgentString = agentName + '-' + version + agentSuffix + '-REINIT';\n            fbq('set', 'agent', reinitAgentString, pixelId);\n          }\n        });\n      },\n      function(gateName, pixelID) {},\n      firstPixelId\n    );\n  }\n}\n\nconst fireEvent = (resolvedCustomData) => {\n  const mergedCustom = mergeObj(resolvedCustomData, eecObjectProps || {});\n  const mergedObjectProps = mergeObj(objectPropsFromVar, objectProps);\n  const finalObjectProps = mergeObj(mergedCustom, mergedObjectProps);\n\n  pixelIds.split(',').forEach(pixelId => {\n    if (data.eventId) {\n      fbq(command, pixelId, eventName, finalObjectProps, {eventID: data.eventId});\n    } else {\n      fbq(command, pixelId, eventName, finalObjectProps);\n    }\n  });\n};\n\nif (data.useGA4Ecommerce) {\n  const firstPixelId = pixelIds.split(',')[0];\n  callInWindow(\n    'fbq',\n    'gateCheck',\n    'enable_gtm_ga4_structure',\n    function(gateName, pixelID) {\n      // Set user_data from eventModel into cidParams\n      if (eventModel && eventModel.user_data) {\n        var ud = eventModel.user_data;\n        if (ud.email_address && !cidParams.em) cidParams.em = ud.email_address;\n        if (ud.phone_number && !cidParams.ph) cidParams.ph = ud.phone_number;\n        if (ud.address) {\n          if (ud.address.first_name && !cidParams.fn) cidParams.fn = ud.address.first_name;\n          if (ud.address.last_name && !cidParams.ln) cidParams.ln = ud.address.last_name;\n          if (ud.address.city && !cidParams.ct) cidParams.ct = ud.address.city;\n          if (ud.address.region && !cidParams.st) cidParams.st = ud.address.region;\n          if (ud.address.postal_code && !cidParams.zp) cidParams.zp = ud.address.postal_code;\n          if (ud.address.country && !cidParams.country) cidParams.country = ud.address.country;\n        }\n        if (ud.fb_login_id && !cidParams.fb_login_id) cidParams.fb_login_id = ud.fb_login_id;\n\n        pixelIds.split(',').forEach(function(pixelId) {\n          fbq('init', pixelId, cidParams);\n        });\n      }\n\n      // Set custom_data from eventModel\n      if (eventModel) {\n        if (eventModel.currency) customData.currency = eventModel.currency;\n        if (eventModel.value) customData.value = eventModel.value;\n        if (eventModel.search_term) customData.search_string = eventModel.search_term;\n        if (eventModel.transaction_id) customData.order_id = eventModel.transaction_id;\n        if (eventModel.items && getType(eventModel.items) === 'array') {\n          customData.contents = eventModel.items.map(function(item) {\n            return {\n              id: (item.item_id || item.item_name) || undefined,\n              item_price: item.price || undefined,\n              quantity: item.quantity || undefined\n            };\n          });\n        }\n      }\n\n      fireEvent(customData);\n    },\n    function(gateName, pixelID) {\n      fireEvent(customData);\n    },\n    firstPixelId\n  );\n} else {\n  fireEvent(customData);\n}\n\n// Inject Param Builder script if enabled\nconst onParamBuilderFailure = () => {\n  log('Facebook Pixel: Failed to load clientParamBuilder script');\n};\n\n// Param Builder callback - called after script loads\nconst processAndCollectAllParams = () => {\n  log(\"ParamBuilder script loaded successfully, processing and collecting all params...\");\n  const clientParamBuilder = copyFromWindow('clientParamBuilder');\n  if (!clientParamBuilder) {\n    log(\"ERROR: clientParamBuilder wasn't loaded correctly.\");\n    return;\n  }\n\n  const currentPageUrl = getUrl();\n\n  // Check which method exists and call it via callInWindow\n  const hasProcessAndCollectAllParams = copyFromWindow('clientParamBuilder.processAndCollectAllParams');\n  const hasProcessAndCollectParams = copyFromWindow('clientParamBuilder.processAndCollectParams');\n\n  if (hasProcessAndCollectAllParams) {\n    callInWindow('clientParamBuilder.processAndCollectAllParams', currentPageUrl);\n    log(\"processAndCollectAllParams completed successfully.\");\n    setInWindow('_fbq_param_builder_status', 'complete', true);\n    data.gtmOnSuccess();\n  } else if (hasProcessAndCollectParams) {\n    callInWindow('clientParamBuilder.processAndCollectParams', currentPageUrl);\n    log(\"processAndCollectParams completed successfully.\");\n    setInWindow('_fbq_param_builder_status', 'complete', true);\n    data.gtmOnSuccess();\n  } else {\n    log(\"ERROR: Neither processAndCollectAllParams nor processAndCollectParams methods found.\");\n    data.gtmOnFailure();\n  }\n};\n\n\nfunction gtmSuccess() {\n  const status = copyFromWindow('_fbq_param_builder_status');\n\n  // If it's done OR currently downloading, skip injecting it again!\n  if (status === 'complete' || status === 'loading') {\n    return data.gtmOnSuccess();\n  }\n\n  // Immediately lock the state synchronously so Tag 2 doesn't enter this block\n  setInWindow('_fbq_param_builder_status', 'loading', true);\n\n  var firstPixelId = pixelIds.split(',')[0];\n\n  callInWindow(\n    'fbq',\n    'gateCheck',\n    'enable_gtm_parambuilder',\n    function(gateName, pixelID) {\n      injectScript(PARAM_BUILDER_SCRIPT_URL, processAndCollectAllParams, onParamBuilderFailure, PARAM_BUILDER_SCRIPT_URL);\n    },\n    function(gateName, pixelID) {\n      data.gtmOnSuccess();\n    },\n    firstPixelId\n  );\n}\n\n// Use the URL as the cache token (matches original paramBuilder template)\n\ninjectScript('https://connect.facebook.net/en_US/fbevents.js', gtmSuccess, data.gtmOnFailure, 'fbPixel');\n\n\n___WEB_PERMISSIONS___\n\n[\n  {\n    \"instance\": {\n      \"key\": {\n        \"publicId\": \"access_globals\",\n        \"versionId\": \"1\"\n      },\n      \"param\": [\n        {\n          \"key\": \"keys\",\n          \"value\": {\n            \"type\": 2,\n            \"listItem\": [\n              {\n                \"type\": 3,\n                \"mapKey\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"key\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"read\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"write\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"execute\"\n                  }\n                ],\n                \"mapValue\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"fbq\"\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  }\n                ]\n              },\n              {\n                \"type\": 3,\n                \"mapKey\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"key\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"read\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"write\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"execute\"\n                  }\n                ],\n                \"mapValue\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"_fbq_gtm\"\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": false\n                  }\n                ]\n              },\n              {\n                \"type\": 3,\n                \"mapKey\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"key\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"read\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"write\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"execute\"\n                  }\n                ],\n                \"mapValue\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"_fbq\"\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": false\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": false\n                  }\n                ]\n              },\n              {\n                \"type\": 3,\n                \"mapKey\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"key\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"read\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"write\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"execute\"\n                  }\n                ],\n                \"mapValue\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"_fbq_gtm_ids\"\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": false\n                  }\n                ]\n              },\n              {\n                \"type\": 3,\n                \"mapKey\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"key\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"read\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"write\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"execute\"\n                  }\n                ],\n                \"mapValue\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"_fbq_gtm_cidparams_initialized\"\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": false\n                  }\n                ]\n              },\n              {\n                \"type\": 3,\n                \"mapKey\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"key\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"read\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"write\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"execute\"\n                  }\n                ],\n                \"mapValue\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"fbq.callMethod.apply\"\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": false\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  }\n                ]\n              },\n              {\n                \"type\": 3,\n                \"mapKey\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"key\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"read\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"write\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"execute\"\n                  }\n                ],\n                \"mapValue\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"fbq.queue.push\"\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": false\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": false\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  }\n                ]\n              },\n              {\n                \"type\": 3,\n                \"mapKey\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"key\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"read\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"write\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"execute\"\n                  }\n                ],\n                \"mapValue\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"fbq.queue\"\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": false\n                  }\n                ]\n              },\n              {\n                \"type\": 3,\n                \"mapKey\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"key\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"read\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"write\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"execute\"\n                  }\n                ],\n                \"mapValue\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"fbq.disablePushState\"\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": false\n                  }\n                ]\n              },\n              {\n                \"type\": 3,\n                \"mapKey\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"key\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"read\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"write\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"execute\"\n                  }\n                ],\n                \"mapValue\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"_fbq_param_builder_status\"\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": false\n                  }\n                ]\n              },\n              {\n                \"type\": 3,\n                \"mapKey\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"key\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"read\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"write\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"execute\"\n                  }\n                ],\n                \"mapValue\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"clientParamBuilder\"\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  }\n                ]\n              },\n              {\n                \"type\": 3,\n                \"mapKey\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"key\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"read\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"write\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"execute\"\n                  }\n                ],\n                \"mapValue\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"clientParamBuilder.processAndCollectAllParams\"\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": false\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  }\n                ]\n              },\n              {\n                \"type\": 3,\n                \"mapKey\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"key\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"read\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"write\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"execute\"\n                  }\n                ],\n                \"mapValue\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"clientParamBuilder.processAndCollectParams\"\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": false\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  }\n                ]\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"clientAnnotations\": {\n      \"isEditedByUser\": true\n    },\n    \"isRequired\": true\n  },\n  {\n    \"instance\": {\n      \"key\": {\n        \"publicId\": \"inject_script\",\n        \"versionId\": \"1\"\n      },\n      \"param\": [\n        {\n          \"key\": \"urls\",\n          \"value\": {\n            \"type\": 2,\n            \"listItem\": [\n              {\n                \"type\": 1,\n                \"string\": \"https://connect.facebook.net/en_US/fbevents.js\"\n              },\n              {\n                \"type\": 1,\n                \"string\": \"https://capi-automation.s3.us-east-2.amazonaws.com/public/client_js/capiParamBuilder/clientParamBuilder.bundle.js\"\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"clientAnnotations\": {\n      \"isEditedByUser\": true\n    },\n    \"isRequired\": true\n  },\n  {\n    \"instance\": {\n      \"key\": {\n        \"publicId\": \"logging\",\n        \"versionId\": \"1\"\n      },\n      \"param\": [\n        {\n          \"key\": \"environments\",\n          \"value\": {\n            \"type\": 1,\n            \"string\": \"debug\"\n          }\n        }\n      ]\n    },\n    \"isRequired\": true\n  },\n  {\n    \"instance\": {\n      \"key\": {\n        \"publicId\": \"read_data_layer\",\n        \"versionId\": \"1\"\n      },\n      \"param\": [\n        {\n          \"key\": \"allowedKeys\",\n          \"value\": {\n            \"type\": 1,\n            \"string\": \"specific\"\n          }\n        },\n        {\n          \"key\": \"keyPatterns\",\n          \"value\": {\n            \"type\": 2,\n            \"listItem\": [\n              {\n                \"type\": 1,\n                \"string\": \"ecommerce\"\n              },\n              {\n                \"type\": 1,\n                \"string\": \"eventModel\"\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"clientAnnotations\": {\n      \"isEditedByUser\": true\n    },\n    \"isRequired\": true\n  },\n  {\n    \"instance\": {\n      \"key\": {\n        \"publicId\": \"get_url\",\n        \"versionId\": \"1\"\n      },\n      \"param\": [\n        {\n          \"key\": \"urlParts\",\n          \"value\": {\n            \"type\": 1,\n            \"string\": \"any\"\n          }\n        },\n        {\n          \"key\": \"queriesAllowed\",\n          \"value\": {\n            \"type\": 1,\n            \"string\": \"any\"\n          }\n        }\n      ]\n    },\n    \"isRequired\": true\n  }\n]\n\n\n___TESTS___\n\nscenarios:\n- name: Library is injected\n  code: |+\n    // Call runCode to run the template's code.\n    runCode(mockData);\n\n    // 1. Verify the Facebook Pixel URL was requested\n    assertThat(injectedUrls).contains('https://connect.facebook.net/en_US/fbevents.js');\n\n    // 2. Verify the Param Builder URL was requested\n    assertThat(injectedUrls).contains('https://capi-automation.s3.us-east-2.amazonaws.com/public/client_js/capiParamBuilder/clientParamBuilder.bundle.js');\n\n    // 3. Verify the template finished successfully\n    assertApi('gtmOnSuccess').wasCalled();\n\n- name: fbq does not exist - method created\n  code: |-\n    let fbq;\n\n    mock('copyFromWindow', key => {\n      // 1. The specific logic for this test (mocking fbq absence)\n      if (key === 'fbq') return fbq;\n\n      // 2. The required logic for the template to finish (ParamBuilder mocks)\n      if (key === 'clientParamBuilder') return {};\n      if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\n    });\n\n    mock('createQueue', key => {});\n\n    mock('setInWindow', (key, val) => {\n      if (key === 'fbq') fbq = val;\n    });\n\n    // Call runCode to run the template's code.\n    runCode(mockData);\n\n    // Verify that the tag finished successfully.\n    assertApi('aliasInWindow').wasCalledWith('_fbq', 'fbq');\n    assertApi('setInWindow').wasCalled();\n    assertApi('gtmOnSuccess').wasCalled();\n- name: fbq exists - method copied\n  code: |-\n    mock('setInWindow', key => {\n      if (key === 'fbq') fail('setInWindow called with fbq even though variable exists');\n    });\n\n    mock('createQueue', key => {});\n\n    // Call runCode to run the template's code.\n    runCode(mockData);\n\n    // Verify that the tag finished successfully.\n    assertApi('gtmOnSuccess').wasCalled();\n- name: makeTableMap called\n  code: |-\n    mockData.advancedMatching = true;\n\n    // Call runCode to run the template's code.\n    runCode(mockData);\n\n    // Verify that the tag finished successfully.\n    assertApi('makeTableMap').wasCalledWith(mockData.advancedMatchingList, 'name', 'value');\n    assertApi('makeTableMap').wasCalledWith(mockData.objectPropertyList, 'name', 'value');\n    assertApi('gtmOnSuccess').wasCalled();\n- name: Consent set\n  code: |-\n    mock('copyFromWindow', key => {\n      // 1. The specific logic for this test (checking fbq consent)\n      if (key === 'fbq') return function() {\n        if (arguments[0] === 'consent') {\n          assertThat(arguments[1], 'Consent set incorrectly').isEqualTo('grant');\n        }\n      };\n\n      // 2. The required logic for the template to finish (ParamBuilder mocks)\n      if (key === 'clientParamBuilder') return {};\n      if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\n    });\n\n    // Call runCode to run the template's code.\n    runCode(mockData);\n\n    // Verify that the tag finished successfully.\n    assertApi('gtmOnSuccess').wasCalled();\n- name: DPO LDU set\n  code: |-\n    mockData.dpoLDU = true;\n    mockData.dpoCountry = '0';\n    mockData.dpoState = '0';\n\n    mock('copyFromWindow', key => {\n      // 1. The specific logic for this test (checking fbq DPO options)\n      if (key === 'fbq') return function() {\n        if (arguments[0] === 'consent') {\n          assertThat(arguments[1], 'Consent set incorrectly').isEqualTo('grant');\n        }\n        if (arguments[0] === 'dataProcessingOptions') {\n          assertThat(arguments[1], 'LDU array value not set').isEqualTo(['LDU']);\n          assertThat(arguments[2], 'LDU country not set').isEqualTo(0);\n          assertThat(arguments[3], 'LDU state not set').isEqualTo(0);\n        }\n      };\n\n      // 2. The required logic for the template to finish (ParamBuilder mocks)\n      if (key === 'clientParamBuilder') return {};\n      if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\n    });\n\n    // Call runCode to run the template's code.\n    runCode(mockData);\n\n    // Verify that the tag finished successfully.\n    assertApi('gtmOnSuccess').wasCalled();\n- name: DPO LDU not set\n  code: |-\n    mock('copyFromWindow', key => {\n      // 1. The specific logic for this test (checking fbq consent and ensuring DPO is NOT called)\n      if (key === 'fbq') return function() {\n        if (arguments[0] === 'consent') {\n          assertThat(arguments[1], 'Consent set incorrectly').isEqualTo('grant');\n        }\n        if (arguments[0] === 'dataProcessingOptions') {\n          fail('dataProcessingOptions called even though DPO was not set');\n        }\n      };\n\n      // 2. The required logic for the template to finish (ParamBuilder mocks)\n      if (key === 'clientParamBuilder') return {};\n      if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\n    });\n\n    // Call runCode to run the template's code.\n    runCode(mockData);\n\n    // Verify that the tag finished successfully.\n    assertApi('gtmOnSuccess').wasCalled();\n- name: Pixel IDs set - do not initialize\n  code: |-\n    // Clear advancedMatchingList so the cidParams update block is skipped,\n    // isolating the init guard behavior.\n    mockData.advancedMatchingList = [];\n\n    mock('copyFromWindow', key => {\n      // 1. The specific logic for this test (checking initialized IDs and preventing re-init)\n      if (key === '_fbq_gtm_ids') return ['12345', '23456'];\n      if (key === 'fbq') return function() {\n        if (arguments[0] === 'init') fail('init called even though pixel IDs already initialized');\n      };\n\n      // 2. The required logic for the template to finish (ParamBuilder mocks)\n      if (key === 'clientParamBuilder') return {};\n      if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\n    });\n\n    // Call runCode to run the template's code.\n    runCode(mockData);\n\n    // Verify that the tag finished successfully.\n    assertApi('gtmOnSuccess').wasCalled();\n- name: Pixel IDs not set - run init process\n  code: \"mockData.enhancedEcommerce = true;\\n\\nmockData.objectPropertyList = {};\\n\\\n    \\n\\n\\nmock('copyFromDataLayer', key => {\\n\\n  if (key === 'ecommerce') return\\\n    \\ {\\n\\n    currencyCode: 'EUR',\\n\\n    detail: {\\n\\n      products: mockEec.gtm.products\\n\\\n    \\n    }\\n\\n  };\\n\\n});\\n\\n\\n\\nlet index = 0;\\n\\nmock('copyFromWindow', key =>\\\n    \\ {\\n\\n  // 1. The specific logic for this test (checking fbq trackSingle calls)\\n\\\n    \\n  if (key === 'fbq') return function() {\\n\\n    if (arguments[0] === 'trackSingle')\\\n    \\ {\\n\\n      assertThat(arguments[1], 'trackSingle called with incorrect pixel\\\n    \\ ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\n      assertThat(arguments[2],\\\n    \\ 'trackSingle called with incorrect event name').isEqualTo('ViewContent');\\n\\n\\\n    \\      assertThat(arguments[3], 'trackSingle called with incorrect event parameters').isEqualTo(mockEec.fb);\\n\\\n    \\n      index += 1;\\n\\n    }\\n\\n  };\\n\\n\\n\\n  // 2. The required logic for the\\\n    \\ template to finish (ParamBuilder mocks)\\n\\n  if (key === 'clientParamBuilder')\\\n    \\ return {};\\n\\n  if (key === 'clientParamBuilder.processAndCollectAllParams')\\\n    \\ return () => {};\\n\\n});\\n\\n      \\n\\n// Call runCode to run the template's code.\\n\\\n    \\nrunCode(mockData);\\n\\n\\n\\n// Verify that the tag finished successfully.\\n\\n\\\n    assertThat(index, 'trackSingle called incorrect number of times').isEqualTo(2);\\n\\\n    \\nassertApi('gtmOnSuccess').wasCalled();\"\n- name: cidParams updated on subsequent fire when pixel already initialized\n  code: |-\n    mockData.advancedMatchingList = [\n      {name: 'em', value: 'user@example.com'}\n    ];\n\n    let initCalls = [];\n    mock('copyFromWindow', key => {\n      // Pixels already initialized, but no init-with-cidParams happened yet\n      if (key === '_fbq_gtm_ids') return ['12345', '23456'];\n      if (key === '_fbq_gtm_cidparams_initialized') return false;\n      if (key === 'fbq') return function() {\n        if (arguments[0] === 'init') {\n          initCalls.push({pixelId: arguments[1], cidParams: arguments[2]});\n        }\n      };\n\n      // Required ParamBuilder mocks\n      if (key === 'clientParamBuilder') return {};\n      if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\n    });\n\n    runCode(mockData);\n\n    // Init guard skipped (pixels already initialized).\n    // Re-init block fires init for each already-initialized pixel with cidParams.\n    assertThat(initCalls.length).isEqualTo(2);\n    assertThat(initCalls[0].pixelId).isEqualTo('12345');\n    assertThat(initCalls[0].cidParams.em).isEqualTo('user@example.com');\n    assertThat(initCalls[1].pixelId).isEqualTo('23456');\n    assertThat(initCalls[1].cidParams.em).isEqualTo('user@example.com');\n    assertApi('gtmOnSuccess').wasCalled();\n- name: cidParams not updated on subsequent fire when advancedMatchingList is empty\n  code: |-\n    mockData.advancedMatchingList = [];\n\n    mock('copyFromWindow', key => {\n      // Simulate pixel already initialized\n      if (key === '_fbq_gtm_ids') return ['12345', '23456'];\n      if (key === 'fbq') return function() {\n        if (arguments[0] === 'init') {\n          fail('init called even though advancedMatchingList is empty and pixels are already initialized');\n        }\n      };\n\n      // Required ParamBuilder mocks\n      if (key === 'clientParamBuilder') return {};\n      if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\n    });\n\n    runCode(mockData);\n\n    assertApi('gtmOnSuccess').wasCalled();\n- name: cidParams updated on first fire only initializes once with cidParams\n  code: |-\n    mockData.advancedMatchingList = [\n      {name: 'em', value: 'user@example.com'},\n      {name: 'ph', value: '5551234567'}\n    ];\n\n    let initCalls = [];\n    mock('copyFromWindow', key => {\n      // Pixels not yet initialized\n      if (key === '_fbq_gtm_ids') return [];\n      if (key === '_fbq_gtm_cidparams_initialized') return false;\n      if (key === 'fbq') return function() {\n        if (arguments[0] === 'init') {\n          initCalls.push({pixelId: arguments[1], cidParams: arguments[2]});\n        }\n      };\n\n      // Required ParamBuilder mocks\n      if (key === 'clientParamBuilder') return {};\n      if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\n    });\n\n    runCode(mockData);\n\n    // Init guard runs once per pixel with cidParams.\n    // Re-init block is also entered (cidParamsInitialized was false at read time)\n    // and re-runs init for each pixel that is now in initIds \u2014 that is the\n    // intended idempotent behavior; both pixels end up correctly initialized.\n    assertThat(initCalls.length).isEqualTo(4);\n    assertThat(initCalls[0].cidParams.em).isEqualTo('user@example.com');\n    assertThat(initCalls[0].cidParams.ph).isEqualTo('5551234567');\n    assertApi('gtmOnSuccess').wasCalled();\n- name: cidParams not re-initialized when already initialized with cidParams on a\n    previous fire\n  code: |-\n    mockData.advancedMatchingList = [\n      {name: 'em', value: 'newuser@example.com'}\n    ];\n\n    mock('copyFromWindow', key => {\n      // Pixels already initialized AND a previous fire already pushed cidParams\n      if (key === '_fbq_gtm_ids') return ['12345', '23456'];\n      if (key === '_fbq_gtm_cidparams_initialized') return true;\n      if (key === 'fbq') return function() {\n        if (arguments[0] === 'init') {\n          fail('init called even though cidParams were already initialized on a prior fire');\n        }\n      };\n\n      // Required ParamBuilder mocks\n      if (key === 'clientParamBuilder') return {};\n      if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\n    });\n\n    runCode(mockData);\n\n    assertApi('gtmOnSuccess').wasCalled();\n- name: cidParams re-init skipped when enable_reinit_cidparams2 gate is disabled\n  code: |-\n    mockData.advancedMatchingList = [\n      {name: 'em', value: 'user@example.com'}\n    ];\n\n    // Override the default callInWindow mock so the re-init gateCheck calls\n    // onDisabled, while the param builder gateCheck still calls onEnabled.\n    mock('callInWindow', (propName, arg1, arg2, arg3, arg4, arg5) => {\n      if (propName === 'fbq' && arg1 === 'gateCheck') {\n        if (arg2 === 'enable_reinit_cidparams2') {\n          if (typeof arg4 === 'function') arg4(arg2, arg5);\n        } else {\n          if (typeof arg3 === 'function') arg3(arg2, arg5);\n        }\n      }\n      return true;\n    });\n\n    mock('copyFromWindow', key => {\n      // Pixel previously initialized without cidParams\n      if (key === '_fbq_gtm_ids') return ['12345', '23456'];\n      if (key === '_fbq_gtm_cidparams_initialized') return false;\n      if (key === 'fbq') return function() {\n        if (arguments[0] === 'init') {\n          fail('init called even though enable_reinit_cidparams2 gate is disabled');\n        }\n      };\n\n      // Required ParamBuilder mocks\n      if (key === 'clientParamBuilder') return {};\n      if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\n    });\n\n    runCode(mockData);\n\n    assertApi('gtmOnSuccess').wasCalled();\n- name: Send standard event\n  code: \"const eventParams = {\\n  prop1: 'val1',\\n  prop2: 'val2'\\n};\\n\\nlet index\\\n    \\ = 0;\\nmock('copyFromWindow', key => {\\n  // 1. The specific logic for this test\\\n    \\ (checking fbq trackSingle calls)\\n  if (key === 'fbq') return function() {\\n\\\n    \\    if (arguments[0] === 'trackSingle') {\\n      assertThat(arguments[1], 'trackSingle\\\n    \\ called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n    \\      assertThat(arguments[2], 'trackSingle called with incorrect event name').isEqualTo(mockData.standardEventName);\\n\\\n    \\      assertThat(arguments[3], 'trackSingle called with incorrect event parameters').isEqualTo(eventParams);\\n\\\n    \\      index += 1;\\n    }\\n  };\\n\\n  // 2. The required logic for the template\\\n    \\ to finish (ParamBuilder mocks)\\n  if (key === 'clientParamBuilder') return {};\\n\\\n    \\  if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\\n\\\n    });\\n      \\n// Call runCode to run the template's code.\\nrunCode(mockData);\\n\\\n    \\n// Verify that the tag finished successfully.\\nassertThat(index, 'trackSingle\\\n    \\ called incorrect number of times').isEqualTo(2);\\nassertApi('gtmOnSuccess').wasCalled();\"\n- name: Send custom event\n  code: \"mockData.eventName = 'custom';\\n\\nconst eventParams = {\\n  prop1: 'val1',\\n\\\n    \\  prop2: 'val2'\\n};\\n\\nlet index = 0;\\nmock('copyFromWindow', key => {\\n  //\\\n    \\ 1. The specific logic for this test (checking fbq trackSingleCustom calls)\\n\\\n    \\  if (key === 'fbq') return function() {\\n    if (arguments[0] === 'trackSingleCustom')\\\n    \\ {\\n      assertThat(arguments[1], 'trackSingleCustom called with incorrect pixel\\\n    \\ ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n      assertThat(arguments[2],\\\n    \\ 'trackSingleCustom called with incorrect event name').isEqualTo(mockData.customEventName);\\n\\\n    \\      assertThat(arguments[3], 'trackSingleCustom called with incorrect event\\\n    \\ parameters').isEqualTo(eventParams);\\n      index += 1;\\n    }\\n  };\\n\\n  //\\\n    \\ 2. The required logic for the template to finish (ParamBuilder mocks)\\n  if\\\n    \\ (key === 'clientParamBuilder') return {};\\n  if (key === 'clientParamBuilder.processAndCollectAllParams')\\\n    \\ return () => {};\\n});\\n      \\n// Call runCode to run the template's code.\\n\\\n    runCode(mockData);\\n\\n// Verify that the tag finished successfully.\\nassertThat(index,\\\n    \\ 'trackSingleCustom called incorrect number of times').isEqualTo(2);\\nassertApi('gtmOnSuccess').wasCalled();\"\n- name: Send variable event with standard name\n  code: \"mockData.eventName = 'variable';\\nmockData.variableEventName = 'PageView';\\n\\\n    \\nconst eventParams = {\\n  prop1: 'val1',\\n  prop2: 'val2'\\n};\\n\\nlet index =\\\n    \\ 0;\\nmock('copyFromWindow', key => {\\n  if (key === 'fbq') return function()\\\n    \\ {\\n    if (arguments[0] === 'trackSingle') {\\n      assertThat(arguments[1],\\\n    \\ 'trackSingle called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n    \\      assertThat(arguments[2], 'trackSingle called with incorrect event name').isEqualTo(mockData.variableEventName);\\n\\\n    \\      assertThat(arguments[3], 'trackSingle called with incorrect event parameters').isEqualTo(eventParams);\\n\\\n    \\      index += 1;\\n    }\\n  };\\n  if (key === 'clientParamBuilder') return {};\\n\\\n    \\  if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\\n\\\n    });\\n     \\n// Call runCode to run the template's code.\\nrunCode(mockData);\\n\\n\\\n    // Verify that the tag finished successfully.\\nassertThat(index, 'trackSingle\\\n    \\ called incorrect number of times').isEqualTo(2);\\nassertApi('gtmOnSuccess').wasCalled();\"\n- name: Send variable event with custom name\n  code: \"mockData.eventName = 'variable';\\nmockData.variableEventName = 'custom';\\n\\\n    \\nconst eventParams = {\\n  prop1: 'val1',\\n  prop2: 'val2'\\n};\\n\\nlet index =\\\n    \\ 0;\\nmock('copyFromWindow', key => {\\n  if (key === 'fbq') return function()\\\n    \\ {\\n    if (arguments[0] === 'trackSingleCustom') {\\n      assertThat(arguments[1],\\\n    \\ 'trackSingleCustom called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n    \\      assertThat(arguments[2], 'trackSingleCustom called with incorrect event\\\n    \\ name').isEqualTo(mockData.variableEventName);\\n      assertThat(arguments[3],\\\n    \\ 'trackSingleCustom called with incorrect event parameters').isEqualTo(eventParams);\\n\\\n    \\      index += 1;\\n    }\\n  };\\n  if (key === 'clientParamBuilder') return {};\\n\\\n    \\  if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\\n\\\n    });\\n     \\n// Call runCode to run the template's code.\\nrunCode(mockData);\\n\\n\\\n    // Verify that the tag finished successfully.\\nassertThat(index, 'trackSingleCustom\\\n    \\ called incorrect number of times').isEqualTo(2);\\nassertApi('gtmOnSuccess').wasCalled();\"\n- name: Send event parameters from a variable\n  code: \"mockData.objectPropertiesFromVariable = {\\n  prop1: 'val1',\\n  prop2: 'val2'\\n\\\n    };\\n\\nlet index = 0;\\nmock('copyFromWindow', key => {\\n  if (key === 'fbq') return\\\n    \\ function() {\\n    if (arguments[0] === 'trackSingle') {\\n      assertThat(arguments[1],\\\n    \\ 'trackSingle called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n    \\      assertThat(arguments[2], 'trackSingle called with incorrect event name').isEqualTo(mockData.standardEventName);\\n\\\n    \\      assertThat(arguments[3], 'trackSingle called with incorrect event parameters').isEqualTo(mockData.objectPropertiesFromVariable);\\n\\\n    \\      index += 1;\\n    }\\n  };\\n  if (key === 'clientParamBuilder') return {};\\n\\\n    \\  if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\\n\\\n    });\\n     \\n// Call runCode to run the template's code.\\nrunCode(mockData);\\n\\n\\\n    // Verify that the tag finished successfully.\\nassertThat(index, 'trackSingle\\\n    \\ called incorrect number of times').isEqualTo(2);\\nassertApi('gtmOnSuccess').wasCalled();\"\n- name: Enhanced Ecommerce integration fails with invalid object\n  code: \"mockData.enhancedEcommerce = true;\\n\\n// Override the global setup for this\\\n    \\ specific test so it returns undefined\\nmock('copyFromDataLayer', (key) => {\\n\\\n    \\  return undefined; \\n});\\n\\n// Call runCode to run the template's code.\\nrunCode(mockData);\\n\\\n    \\n// Verify that the tag finished successfully.\\nassertApi('logToConsole').wasCalledWith('Facebook\\\n    \\ Pixel: No valid \\\"ecommerce\\\" object found in dataLayer');\\nassertApi('gtmOnFailure').wasCalled();\\n\\\n    assertApi('gtmOnSuccess').wasNotCalled();\"\n- name: Enhanced Ecommerce integration fails with invalid action\n  code: |-\n    mockData.enhancedEcommerce = true;\n\n    mock('copyFromDataLayer', key => {\n      if (key === 'ecommerce') return {\n        invalid: true\n      };\n    });\n\n    // Call runCode to run the template's code.\n    runCode(mockData);\n\n    // Verify that the tag finished successfully.\n    assertApi('logToConsole').wasCalledWith('Facebook Pixel: Most recently pushed \"ecommerce\" object must be one of types \"detail\", \"add\", \"checkout\" or \"purchase\".');\n    assertApi('gtmOnFailure').wasCalled();\n    assertApi('gtmOnSuccess').wasNotCalled();\n- name: Enhanced Ecommerce ViewContent works\n  code: \"mockData.enhancedEcommerce = true;\\nmockData.objectPropertyList = {};\\n\\n\\\n    mock('copyFromDataLayer', key => {\\n  if (key === 'ecommerce') return {\\n    currencyCode:\\\n    \\ 'EUR',\\n    detail: {\\n      products: mockEec.gtm.products\\n    }\\n  };\\n});\\n\\\n    \\nlet index = 0;\\nmock('copyFromWindow', key => {\\n  // 1. The specific logic\\\n    \\ for this test (checking fbq trackSingle calls)\\n  if (key === 'fbq') return\\\n    \\ function() {\\n    if (arguments[0] === 'trackSingle') {\\n      assertThat(arguments[1],\\\n    \\ 'trackSingle called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n    \\      assertThat(arguments[2], 'trackSingle called with incorrect event name').isEqualTo('ViewContent');\\n\\\n    \\      assertThat(arguments[3], 'trackSingle called with incorrect event parameters').isEqualTo(mockEec.fb);\\n\\\n    \\      index += 1;\\n    }\\n  };\\n\\n  // 2. The required logic for the template\\\n    \\ to finish (ParamBuilder mocks)\\n  if (key === 'clientParamBuilder') return {};\\n\\\n    \\  if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\\n\\\n    });\\n      \\n// Call runCode to run the template's code.\\nrunCode(mockData);\\n\\\n    \\n// Verify that the tag finished successfully.\\nassertThat(index, 'trackSingle\\\n    \\ called incorrect number of times').isEqualTo(2);\\nassertApi('gtmOnSuccess').wasCalled();\"\n- name: Enhanced Ecommerce AddToCart works\n  code: \"mockData.enhancedEcommerce = true;\\nmockData.objectPropertyList = {};\\n\\n\\\n    mock('copyFromDataLayer', key => {\\n  if (key === 'ecommerce') return {\\n    currencyCode:\\\n    \\ 'EUR',\\n    add: {\\n      products: mockEec.gtm.products\\n    }\\n  };\\n});\\n\\\n    \\nlet index = 0;\\nmock('copyFromWindow', key => {\\n  if (key === 'fbq') return\\\n    \\ function() {\\n    if (arguments[0] === 'trackSingle') {\\n      assertThat(arguments[1],\\\n    \\ 'trackSingle called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n    \\      assertThat(arguments[2], 'trackSingle called with incorrect event name').isEqualTo('AddToCart');\\n\\\n    \\      assertThat(arguments[3], 'trackSingle called with incorrect event parameters').isEqualTo(mockEec.fb);\\n\\\n    \\      index += 1;\\n    }\\n  };\\n  if (key === 'clientParamBuilder') return {};\\n\\\n    \\  if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\\n\\\n    });\\n     \\n// Call runCode to run the template's code.\\nrunCode(mockData);\\n\\n\\\n    // Verify that the tag finished successfully.\\nassertThat(index, 'trackSingle\\\n    \\ called incorrect number of times').isEqualTo(2);\\nassertApi('gtmOnSuccess').wasCalled();\"\n- name: Enhanced Ecommerce InitiateCheckout works\n  code: \"mockData.enhancedEcommerce = true;\\nmockEec.fb.num_items = 3;\\nmockData.objectPropertyList\\\n    \\ = {};\\n\\nmock('copyFromDataLayer', key => {\\n  if (key === 'ecommerce') return\\\n    \\ {\\n    currencyCode: 'EUR',\\n    checkout: {\\n      products: mockEec.gtm.products\\n\\\n    \\    }\\n  };\\n});\\n\\nlet index = 0;\\nmock('copyFromWindow', key => {\\n  if (key\\\n    \\ === 'fbq') return function() {\\n    if (arguments[0] === 'trackSingle') {\\n\\\n    \\      assertThat(arguments[1], 'trackSingle called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n    \\      assertThat(arguments[2], 'trackSingle called with incorrect event name').isEqualTo('InitiateCheckout');\\n\\\n    \\      assertThat(arguments[3], 'trackSingle called with incorrect event parameters').isEqualTo(mockEec.fb);\\n\\\n    \\      index += 1;\\n    }\\n  };\\n  if (key === 'clientParamBuilder') return {};\\n\\\n    \\  if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\\n\\\n    });\\n     \\n// Call runCode to run the template's code.\\nrunCode(mockData);\\n\\n\\\n    // Verify that the tag finished successfully.\\nassertThat(index, 'trackSingle\\\n    \\ called incorrect number of times').isEqualTo(2);\\nassertApi('gtmOnSuccess').wasCalled();\"\n- name: Enhanced Ecommerce Purchase works\n  code: \"mockData.enhancedEcommerce = true;\\nmockEec.fb.num_items = 3;\\nmockData.objectPropertyList\\\n    \\ = {};\\n\\nmock('copyFromDataLayer', key => {\\n  if (key === 'ecommerce') return\\\n    \\ {\\n    currencyCode: 'EUR',\\n    purchase: {\\n      products: mockEec.gtm.products\\n\\\n    \\    }\\n  };\\n});\\n\\nlet index = 0;\\nmock('copyFromWindow', key => {\\n  if (key\\\n    \\ === 'fbq') return function() {\\n    if (arguments[0] === 'trackSingle') {\\n\\\n    \\      assertThat(arguments[1], 'trackSingle called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n    \\      assertThat(arguments[2], 'trackSingle called with incorrect event name').isEqualTo('Purchase');\\n\\\n    \\      assertThat(arguments[3], 'trackSingle called with incorrect event parameters').isEqualTo(mockEec.fb);\\n\\\n    \\      index += 1;\\n    }\\n  };\\n  if (key === 'clientParamBuilder') return {};\\n\\\n    \\  if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\\n\\\n    });\\n     \\n// Call runCode to run the template's code.\\nrunCode(mockData);\\n\\n\\\n    // Verify that the tag finished successfully.\\nassertThat(index, 'trackSingle\\\n    \\ called incorrect number of times').isEqualTo(2);\\nassertApi('gtmOnSuccess').wasCalled();\"\n- name: Object merge with variable and list works\n  code: \"mockData.objectPropertiesFromVariable = {\\n  prop1: 'var1',\\n  prop2: 'var2',\\n\\\n    \\  prop3: 'var3'\\n};\\n\\nconst expected = {\\n  prop1: 'val1',\\n  prop2: 'val2',\\n\\\n    \\  prop3: 'var3'\\n};\\n\\nlet index = 0;\\nmock('copyFromWindow', key => {\\n  if\\\n    \\ (key === 'fbq') return function() {\\n    if (arguments[0] === 'trackSingle')\\\n    \\ {\\n      assertThat(arguments[1], 'trackSingle called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n    \\      assertThat(arguments[2], 'trackSingle called with incorrect event name').isEqualTo('PageView');\\n\\\n    \\      assertThat(arguments[3], 'trackSingle called with incorrect event parameters').isEqualTo(expected);\\n\\\n    \\      index += 1;\\n    }\\n  };\\n  if (key === 'clientParamBuilder') return {};\\n\\\n    \\  if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\\n\\\n    });\\n     \\n// Call runCode to run the template's code.\\nrunCode(mockData);\\n\\n\\\n    // Verify that the tag finished successfully.\\nassertThat(index, 'trackSingle\\\n    \\ called incorrect number of times').isEqualTo(2);\\nassertApi('gtmOnSuccess').wasCalled();\"\n- name: Object merge with variable, list and eec works\n  code: \"mockData.enhancedEcommerce = true;\\nmockData.objectPropertiesFromVariable\\\n    \\ = {\\n  content_type: 'product_group'\\n};\\nmockData.objectPropertyList = [{\\n\\\n    \\  name: 'currency',\\n  value: 'USD'\\n}];\\nmockEec.fb.num_items = 3;\\nmockEec.fb.content_type\\\n    \\ = 'product_group';\\nmockEec.fb.currency = 'USD';\\n\\nmock('copyFromDataLayer',\\\n    \\ key => {\\n  if (key === 'ecommerce') return {\\n    currencyCode: 'EUR',\\n  \\\n    \\  purchase: {\\n      products: mockEec.gtm.products\\n    }\\n  };\\n});\\n\\nlet\\\n    \\ index = 0;\\nmock('copyFromWindow', key => {\\n  if (key === 'fbq') return function()\\\n    \\ {\\n    if (arguments[0] === 'trackSingle') {\\n      assertThat(arguments[1],\\\n    \\ 'trackSingle called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n    \\      assertThat(arguments[2], 'trackSingle called with incorrect event name').isEqualTo('Purchase');\\n\\\n    \\      assertThat(arguments[3], 'trackSingle called with incorrect event parameters').isEqualTo(mockEec.fb);\\n\\\n    \\      index += 1;\\n    }\\n  };\\n  if (key === 'clientParamBuilder') return {};\\n\\\n    \\  if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\\n\\\n    });\\n     \\n// Call runCode to run the template's code.\\nrunCode(mockData);\\n\\n\\\n    // Verify that the tag finished successfully.\\nassertThat(index, 'trackSingle\\\n    \\ called incorrect number of times').isEqualTo(2);\\nassertApi('gtmOnSuccess').wasCalled();\"\n- name: Send event ID\n  code: \"mockData.eventId = 'eventId';\\n\\nmock('copyFromWindow', key => {\\n  if (key\\\n    \\ === 'fbq') return function() {\\n    if (arguments[0] === 'trackSingle') {\\n\\\n    \\      assertThat(arguments[4], 'eventID not included in hit').isEqualTo({eventID:\\\n    \\ mockData.eventId});\\n    }\\n  };\\n  if (key === 'clientParamBuilder') return\\\n    \\ {};\\n  if (key === 'clientParamBuilder.processAndCollectAllParams') return ()\\\n    \\ => {};\\n});\\n     \\n// Call runCode to run the template's code.\\nrunCode(mockData);\\n\\\n    \\n// Verify that the tag finished successfully.\\nassertApi('gtmOnSuccess').wasCalled();\"\n- name: ParamBuilder processAndCollectAllParams success\n  code: \"mock('injectScript', (url, onsuccess, onfailure, token) => {\\n  onsuccess();\\n\\\n    });\\n\\n// Replaced the basic mock with the callback-triggering mock\\nmock('callInWindow',\\\n    \\ (propName, arg1, arg2, arg3) => {\\n  if (propName === 'fbq' && arg1 === 'gateCheck')\\\n    \\ {\\n    if (typeof arg3 === 'function') {\\n      arg3(true);\\n    }\\n  }\\n  return\\\n    \\ true; \\n});\\n\\nmock('copyFromWindow', key => {\\n  if (key === 'fbq') return\\\n    \\ () => {};\\n  if (key === 'clientParamBuilder') return {};\\n  if (key === 'clientParamBuilder.processAndCollectAllParams')\\\n    \\ return () => {};\\n  if (key === 'clientParamBuilder.processAndCollectParams')\\\n    \\ return undefined;\\n});\\n\\nrunCode(mockData);\\n\\nassertApi('gtmOnSuccess').wasCalled();\\n\\\n    assertApi('gtmOnFailure').wasNotCalled();\"\n- name: ParamBuilder processAndCollectParams success\n  code: \"mock('injectScript', (url, onsuccess, onfailure, token) => {\\n  onsuccess();\\n\\\n    });\\n\\n// Use the upgraded mock that triggers the callback\\nmock('callInWindow',\\\n    \\ (propName, arg1, arg2, arg3) => {\\n  if (propName === 'fbq' && arg1 === 'gateCheck')\\\n    \\ {\\n    if (typeof arg3 === 'function') {\\n      arg3(true);\\n    }\\n  }\\n  return\\\n    \\ true; \\n});\\n\\nmock('copyFromWindow', key => {\\n  if (key === 'fbq') return\\\n    \\ () => {};\\n  if (key === 'clientParamBuilder') return {};\\n  if (key === 'clientParamBuilder.processAndCollectAllParams')\\\n    \\ return undefined;\\n  if (key === 'clientParamBuilder.processAndCollectParams')\\\n    \\ return () => {};\\n});\\n\\nrunCode(mockData);\\n\\nassertApi('gtmOnSuccess').wasCalled();\\n\\\n    assertApi('gtmOnFailure').wasNotCalled();\"\n- name: ParamBuilder loaded failed\n  code: \"mock('injectScript', (url, onsuccess, onfailure, token) => {\\n  onsuccess();\\n\\\n    });\\n\\n// Use the upgraded mock that triggers the callback\\nmock('callInWindow',\\\n    \\ (propName, arg1, arg2, arg3) => {\\n  if (propName === 'fbq' && arg1 === 'gateCheck')\\\n    \\ {\\n    if (typeof arg3 === 'function') {\\n      arg3(true);\\n    }\\n  }\\n  return\\\n    \\ true; \\n});\\n\\nmock('copyFromWindow', key => {\\n  if (key === 'fbq') return\\\n    \\ () => {};\\n  if (key === 'clientParamBuilder') return {};\\n  // Both methods\\\n    \\ return undefined to trigger the failure block\\n  if (key === 'clientParamBuilder.processAndCollectAllParams')\\\n    \\ return undefined;\\n  if (key === 'clientParamBuilder.processAndCollectParams')\\\n    \\ return undefined;\\n});\\n\\nrunCode(mockData);\\n\\nassertApi('gtmOnSuccess').wasNotCalled();\\n\\\n    assertApi('gtmOnFailure').wasCalled();\"\n- name: GK off pixel load successfully\n  code: \"// Reset the array instead of re-declaring it\\ninjectedUrls = [];\\n\\nmock('injectScript',\\\n    \\ (url, onsuccess, onfailure, token) => {\\n  injectedUrls.push(url);\\n  if (onsuccess)\\\n    \\ {\\n    onsuccess();\\n  }\\n});\\n\\n// Correctly target arg4 (onDisabled) to simulate\\\n    \\ the gateCheck failing\\nmock('callInWindow', (propName, arg1, arg2, arg3, arg4,\\\n    \\ arg5) => {\\n  if (propName === 'fbq' && arg1 === 'gateCheck') {\\n    const onDisabled\\\n    \\ = arg4; // arg4 is the onDisabled callback\\n    if (typeof onDisabled === 'function')\\\n    \\ {\\n      onDisabled(arg2, arg5); // Pass gateName and pixelID back to the callback\\n\\\n    \\    }\\n  }\\n  return true; \\n});\\n\\n// Run the template\\nrunCode(mockData);\\n\\\n    \\n// 1. Verify the template finished successfully\\nassertApi('gtmOnSuccess').wasCalled();\\n\\\n    assertApi('gtmOnFailure').wasNotCalled();\\n\\n// 2. Verify the Param Builder script\\\n    \\ was skipped\\nassertThat(injectedUrls).doesNotContain('https://capi-automation.s3.us-east-2.amazonaws.com/public/client_js/capiParamBuilder/clientParamBuilder.bundle.js');\"\n- name: GA4 gate enabled - eventModel merged into tracking\n  code: |-\n    mockData.useGA4Ecommerce = true;\n    mockData.objectPropertyList = {};\n\n    var mockEventModel = {\n      currency: 'USD',\n      value: '99.99',\n      search_term: 'shoes',\n      transaction_id: 'order_abc',\n      items: [\n        { item_id: 'SKU1', price: 49.99, quantity: 2 },\n        { item_id: 'SKU2', item_name: 'Hat', price: 10.00, quantity: 1 }\n      ]\n    };\n\n    mock('copyFromDataLayer', key => {\n      if (key === 'eventModel') return mockEventModel;\n      return undefined;\n    });\n\n    var trackedProps = null;\n    let index = 0;\n    mock('copyFromWindow', key => {\n      if (key === 'fbq') return function() {\n        if (arguments[0] === 'trackSingle') {\n          trackedProps = arguments[3];\n          index += 1;\n        }\n      };\n      if (key === 'fbq.callMethod.apply') return () => {};\n      if (key === '_fbq_gtm_ids') return [];\n      if (key === 'clientParamBuilder') return { processAndCollectAllParams: () => {} };\n      if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\n      if (key === 'clientParamBuilder.processAndCollectParams') return () => {};\n      return undefined;\n    });\n\n    runCode(mockData);\n\n    assertThat(index).isGreaterThan(0);\n    assertThat(trackedProps.currency).isEqualTo('USD');\n    assertThat(trackedProps.value).isEqualTo('99.99');\n    assertThat(trackedProps.search_string).isEqualTo('shoes');\n    assertThat(trackedProps.order_id).isEqualTo('order_abc');\n    assertThat(trackedProps.contents.length).isEqualTo(2);\n    assertThat(trackedProps.contents[0].id).isEqualTo('SKU1');\n    assertThat(trackedProps.contents[1].id).isEqualTo('SKU2');\n    assertApi('gtmOnSuccess').wasCalled();\n- name: GA4 gate disabled - standard props used\n  code: |-\n    mockData.useGA4Ecommerce = true;\n    mockData.objectPropertyList = {};\n\n    mock('copyFromDataLayer', key => {\n      if (key === 'eventModel') return { currency: 'EUR', value: '50.00' };\n      return undefined;\n    });\n\n    // Mock gateCheck to call onDisabled for enable_gtm_ga4_structure\n    mock('callInWindow', (propName, arg1, arg2, arg3, arg4, arg5) => {\n      if (propName === 'fbq' && arg1 === 'gateCheck') {\n        if (arg2 === 'enable_gtm_ga4_structure') {\n          if (typeof arg4 === 'function') arg4(arg2, arg5);\n        } else {\n          if (typeof arg3 === 'function') arg3(arg2, arg5);\n        }\n      }\n      return true;\n    });\n\n    var trackedProps = null;\n    mock('copyFromWindow', key => {\n      if (key === 'fbq') return function() {\n        if (arguments[0] === 'trackSingle') {\n          trackedProps = arguments[3];\n        }\n      };\n      if (key === 'fbq.callMethod.apply') return () => {};\n      if (key === '_fbq_gtm_ids') return [];\n      if (key === 'clientParamBuilder') return { processAndCollectAllParams: () => {} };\n      if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\n      if (key === 'clientParamBuilder.processAndCollectParams') return () => {};\n      return undefined;\n    });\n\n    runCode(mockData);\n\n    // Should NOT have GA4 fields since gate was disabled\n    assertThat(trackedProps.currency).isUndefined();\n    assertThat(trackedProps.search_string).isUndefined();\n    assertApi('gtmOnSuccess').wasCalled();\n- name: GA4 not enabled - unchanged behavior\n  code: |-\n    mockData.useGA4Ecommerce = false;\n\n    var trackCount = 0;\n    mock('copyFromWindow', key => {\n      if (key === 'fbq') return function() {\n        if (arguments[0] === 'trackSingle') trackCount += 1;\n      };\n      if (key === 'fbq.callMethod.apply') return () => {};\n      if (key === '_fbq_gtm_ids') return [];\n      if (key === 'clientParamBuilder') return { processAndCollectAllParams: () => {} };\n      if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\n      if (key === 'clientParamBuilder.processAndCollectParams') return () => {};\n      return undefined;\n    });\n\n    runCode(mockData);\n\n    assertThat(trackCount).isEqualTo(2);\n    assertApi('gtmOnSuccess').wasCalled();\n- name: GA4 user_data merged into cidParams\n  code: |-\n    mockData.useGA4Ecommerce = true;\n    mockData.advancedMatchingList = [\n      {name: 'em', value: 'override@test.com'}\n    ];\n\n    var mockEventModel = {\n      user_data: {\n        email_address: 'ga4@test.com',\n        phone_number: '5551234567',\n        address: {\n          first_name: 'John',\n          last_name: 'Doe',\n          city: 'Menlo Park',\n          region: 'CA',\n          postal_code: '94025',\n          country: 'US'\n        }\n      }\n    };\n\n    mock('copyFromDataLayer', key => {\n      if (key === 'eventModel') return mockEventModel;\n      return undefined;\n    });\n\n    var initCidParams = null;\n    mock('copyFromWindow', key => {\n      if (key === 'fbq') return function() {\n        if (arguments[0] === 'init') initCidParams = arguments[2];\n      };\n      if (key === 'fbq.callMethod.apply') return () => {};\n      if (key === '_fbq_gtm_ids') return [];\n      if (key === 'clientParamBuilder') return { processAndCollectAllParams: () => {} };\n      if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\n      if (key === 'clientParamBuilder.processAndCollectParams') return () => {};\n      return undefined;\n    });\n\n    runCode(mockData);\n\n    // advancedMatchingList 'em' should override ga4 user_data email_address\n    assertThat(initCidParams.em).isEqualTo('override@test.com');\n    // GA4 user_data fields should be present\n    assertThat(initCidParams.ph).isEqualTo('5551234567');\n    assertThat(initCidParams.fn).isEqualTo('John');\n    assertThat(initCidParams.ln).isEqualTo('Doe');\n    assertThat(initCidParams.ct).isEqualTo('Menlo Park');\n    assertThat(initCidParams.st).isEqualTo('CA');\n    assertThat(initCidParams.zp).isEqualTo('94025');\n    assertThat(initCidParams.country).isEqualTo('US');\n    assertApi('gtmOnSuccess').wasCalled();\n- name: GK off pixel load failed\n  code: \"// Reset the array\\ninjectedUrls = [];\\n\\n// Mock injectScript to simulate\\\n    \\ a network error / loading failure\\nmock('injectScript', (url, onsuccess, onfailure,\\\n    \\ token) => {\\n  injectedUrls.push(url);\\n  \\n  // Notice we are calling onfailure()\\\n    \\ this time instead of onsuccess()\\n  if (onfailure) {\\n    onfailure(); \\n  }\\n\\\n    });\\n\\n// Run the template\\nrunCode(mockData);\\n\\n// 1. Verify failure was called\\\n    \\ and success was not\\nassertApi('gtmOnFailure').wasCalled();\\nassertApi('gtmOnSuccess').wasNotCalled();\\n\\\n    \\n// 2. Verify only the first script was attempted\\nassertThat(injectedUrls).contains('https://connect.facebook.net/en_US/fbevents.js');\\n\\\n    assertThat(injectedUrls).doesNotContain('https://capi-automation.s3.us-east-2.amazonaws.com/public/client_js/capiParamBuilder/clientParamBuilder.bundle.js');\"\n- name: ParamBuilder already called in proc - loading state\n  code: \"// Simulate that the flag is already set from a previous event\\nmock('copyFromWindow',\\\n    \\ key => {\\n  if (key === '_fbq_param_builder_status') return 'loading'; \\n  if\\\n    \\ (key === 'fbq') return () => {};\\n  if (key === '_fbq_gtm_ids') return [];\\n\\\n    \\  return undefined;\\n});\\n\\ninjectedUrls = [];\\nlet processCalled = false;\\n\\n\\\n    // Monitor callInWindow to see if the param builder is executed\\nmock('callInWindow',\\\n    \\ (propName) => {\\n   if (propName === 'clientParamBuilder.processAndCollectAllParams'\\\n    \\ || \\n       propName === 'clientParamBuilder.processAndCollectParams') {\\n \\\n    \\    processCalled = true;\\n   }\\n   return true;\\n});\\n\\n// Run the template\\n\\\n    runCode(mockData);\\n\\n// 1. Verify it did NOT attempt to inject the script\\nassertThat(injectedUrls).doesNotContain('https://capi-automation.s3.us-east-2.amazonaws.com/public/client_js/capiParamBuilder/clientParamBuilder.bundle.js');\\n\\\n    \\n// 2. Verify it did NOT call the function (saving the cookie write)\\nassertThat(processCalled).isFalse();\\n\\\n    \\n// 3. Verify the tag still finished successfully\\nassertApi('gtmOnSuccess').wasCalled();\"\n- name: ParamBuilder already called in proc - complete state\n  code: \"// Simulate that the flag is already set from a previous event\\nmock('copyFromWindow',\\\n    \\ key => {\\n  if (key === '_fbq_param_builder_status') return 'complete'; \\n \\\n    \\ if (key === 'fbq') return () => {};\\n  if (key === '_fbq_gtm_ids') return [];\\n\\\n    \\  return undefined;\\n});\\n\\ninjectedUrls = [];\\nlet processCalled = false;\\n\\n\\\n    // Monitor callInWindow to see if the param builder is executed\\nmock('callInWindow',\\\n    \\ (propName) => {\\n   if (propName === 'clientParamBuilder.processAndCollectAllParams'\\\n    \\ || \\n       propName === 'clientParamBuilder.processAndCollectParams') {\\n \\\n    \\    processCalled = true;\\n   }\\n   return true;\\n});\\n\\n// Run the template\\n\\\n    runCode(mockData);\\n\\n// 1. Verify it did NOT attempt to inject the script\\nassertThat(injectedUrls).doesNotContain('https://capi-automation.s3.us-east-2.amazonaws.com/public/client_js/capiParamBuilder/clientParamBuilder.bundle.js');\\n\\\n    \\n// 2. Verify it did NOT call the function (saving the cookie write)\\nassertThat(processCalled).isFalse();\\n\\\n    \\n// 3. Verify the tag still finished successfully\\nassertApi('gtmOnSuccess').wasCalled();\"\nsetup: \"const mockData = {\\n  pixelId: '12345,23456',\\n  eventName: 'standard',\\n\\\n  \\  standardEventName: 'PageView',\\n  customEventName: 'custom',\\n  variableEventName:\\\n  \\ 'standard',\\n  consent: true,\\n  advancedMatching: false,\\n  advancedMatchingList:\\\n  \\ [\\n    {name: 'ct', value: 'Helsinki'},\\n    {name: 'cn', value: 'Finland'}\\n\\\n  \\  ],\\n  objectPropertiesFromVariable: false,\\n  objectPropertyList: [\\n    {name:\\\n  \\ 'prop1', value: 'val1'},\\n    {name: 'prop2', value: 'val2'}\\n  ],\\n  disableAutoConfig:\\\n  \\ false,\\n  disablePushState: false,\\n  enhancedEcommerce: false,\\n  eventId: '',\\n\\\n  \\  gtmOnSuccess: () => {},\\n  gtmOnFailure: () => {}\\n};\\n\\n// Restored to YOUR\\\n  \\ original structure!\\nconst mockEec = {\\n  gtm: {  \\n    products: [{\\n      id:\\\n  \\ 'i1',\\n      name: 'n1',\\n      category: 'c1',\\n      price: '1.00',\\n      quantity:\\\n  \\ 1\\n    },{\\n      id: 'i2',\\n      name: 'n2',\\n      category: 'c2',\\n      price:\\\n  \\ '2.00',\\n      quantity: 2\\n    }]\\n  },\\n  fb: {\\n    content_type: 'product',\\n\\\n  \\    contents: [{\\n      id: 'i1',\\n      quantity: 1\\n    },{\\n      id: 'i2',\\n\\\n  \\      quantity: 2\\n    }],\\n    currency: 'EUR',\\n    value: 5.00\\n  }\\n};\\n\\n\\\n  let injectedUrls = [];\\n\\nmock('injectScript', (url, onsuccess, onfailure, token)\\\n  \\ => {\\n  injectedUrls.push(url);\\n  if (onsuccess) {\\n    onsuccess();\\n  }\\n});\\n\\\n  \\nmock('callInWindow', (propName, arg1, arg2, arg3, arg4, arg5) => {\\n  if (propName\\\n  \\ === 'fbq' && arg1 === 'gateCheck') {\\n    const gateName = arg2;\\n    const onEnabled\\\n  \\ = arg3;\\n    const onDisabled = arg4;\\n    const pixelID = arg5;\\n    \\n    if\\\n  \\ (typeof onEnabled === 'function') {\\n      onEnabled(gateName, pixelID); \\n  \\\n  \\  }\\n  }\\n  return true; \\n});\\n\\nmock('copyFromWindow', key => {\\n  if (key ===\\\n  \\ 'fbq') return () => {};\\n  if (key === 'fbq.callMethod.apply') return () => {};\\n\\\n  \\  if (key === '_fbq_gtm_ids') return [];\\n  \\n  if (key === 'clientParamBuilder')\\\n  \\ {\\n    return {\\n      processAndCollectAllParams: () => {},\\n      processAndCollectParams:\\\n  \\ () => {}\\n    };\\n  }\\n  if (key === 'clientParamBuilder.processAndCollectAllParams')\\\n  \\ return () => {};\\n  if (key === 'clientParamBuilder.processAndCollectParams')\\\n  \\ return () => {};\\n  \\n  return undefined;\\n});\\n\\n// We return a dummy object\\\n  \\ here, but your tests will override it to use mockEec.gtm\\nmock('copyFromDataLayer',\\\n  \\ (key) => { \\n  return undefined;\\n});\\n\\nmock('getUrl', () => 'https://example.com');\\n\\\n  mock('logToConsole', () => {});\\nmock('createQueue', () => {});\\nmock('setInWindow',\\\n  \\ () => {});\\nmock('aliasInWindow', () => {});\"\n\n\n___NOTES___\n\nCreated on 18/05/2019, 21:57:16\n\n\n",
        "galleryReference": {
          "host": "github.com",
          "owner": "facebook",
          "repository": "GoogleTagManager-WebTemplate-For-FacebookPixel",
          "version": "8c5197c2870088bb9c45ffc76537ee4b24b91014",
          "signature": "794ff643a55f1e2a4f8d965509e7e2a5929fac26ea21bb68cf7cebc4698f3c2a",
          "galleryTemplateId": "5RM3Q"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "templateId": "58",
        "name": "TikTok Pixel",
        "fingerprint": "1778143779445",
        "templateData": "___TERMS_OF_SERVICE___\n\nBy creating or modifying this file you agree to Google Tag Manager's Community\nTemplate Gallery Developer Terms of Service available at\nhttps://developers.google.com/tag-manager/gallery-tos (or such other URL as\nGoogle may provide), as modified from time to time.\n\n\n___INFO___\n\n{\n  \"type\": \"TAG\",\n  \"id\": \"cvt_MRQN8\",\n  \"version\": 1,\n  \"displayName\": \"TikTok Pixel\",\n  \"categories\": [\n    \"ADVERTISING\",\n    \"ANALYTICS\"\n  ],\n  \"brand\": {\n    \"id\": \"github.com_tiktok\",\n    \"displayName\": \"tiktok\",\n    \"thumbnail\": \"data:image/png;base64,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\\u003d\\u003d\"\n  },\n  \"description\": \"Install TikTok Pixel easily to your site without the need to write a line of code.\",\n  \"containerContexts\": [\n    \"WEB\"\n  ]\n}\n\n\n___TEMPLATE_PARAMETERS___\n\n[\n  {\n    \"type\": \"GROUP\",\n    \"name\": \"Section 1 - TikTok Event Configuration\",\n    \"displayName\": \"TikTok Event Configuration\",\n    \"groupStyle\": \"NO_ZIPPY\",\n    \"subParams\": [\n      {\n        \"type\": \"TEXT\",\n        \"name\": \"pixel_code\",\n        \"displayName\": \"Pixel ID\",\n        \"simpleValueType\": true,\n        \"valueValidators\": [],\n        \"help\": \"You can find your Pixel ID in Events Manager\",\n        \"valueHint\": \"CD9079RC77U0N3GBV16Y\"\n      },\n      {\n        \"type\": \"SELECT\",\n        \"name\": \"event\",\n        \"displayName\": \"Event Name\",\n        \"macrosInSelect\": true,\n        \"selectItems\": [\n          {\n            \"value\": \"CompletePayment\",\n            \"displayValue\": \"CompletePayment\"\n          },\n          {\n            \"value\": \"AddToCart\",\n            \"displayValue\": \"AddToCart\"\n          },\n          {\n            \"value\": \"ViewContent\",\n            \"displayValue\": \"ViewContent\"\n          },\n          {\n            \"value\": \"InitiateCheckout\",\n            \"displayValue\": \"InitiateCheckout\"\n          },\n          {\n            \"value\": \"AddToWishlist\",\n            \"displayValue\": \"AddToWishlist\"\n          },\n          {\n            \"value\": \"AddPaymentInfo\",\n            \"displayValue\": \"AddPaymentInfo\"\n          },\n          {\n            \"value\": \"PlaceAnOrder\",\n            \"displayValue\": \"PlaceAnOrder\"\n          },\n          {\n            \"value\": \"Contact\",\n            \"displayValue\": \"Contact\"\n          },\n          {\n            \"value\": \"Download\",\n            \"displayValue\": \"Download\"\n          },\n          {\n            \"value\": \"SubmitForm\",\n            \"displayValue\": \"SubmitForm\"\n          },\n          {\n            \"value\": \"CompleteRegistration\",\n            \"displayValue\": \"CompleteRegistration\"\n          },\n          {\n            \"value\": \"Subscribe\",\n            \"displayValue\": \"Subscribe\"\n          },\n          {\n            \"value\": \"ClickButton\",\n            \"displayValue\": \"ClickButton\"\n          },\n          {\n            \"value\": \"Search\",\n            \"displayValue\": \"Search\"\n          }\n        ],\n        \"simpleValueType\": true,\n        \"help\": \"TikTok supports 14 standard events. You may refer to our \\u003ca href\\u003d\\\"https://ads.tiktok.com/help/article?aid\\u003d10028\\\" target\\u003d\\\"_blank\\\"\\u003edocumentation\\u003c/a\\u003e and choose a suitable event to tag.\",\n        \"defaultValue\": \"{{Event}}\"\n      }\n    ],\n    \"help\": \"\\u003ca href\\u003d\\\"https://business-api.tiktok.com/portal/docs?id\\u003d1799004006287425\\\" target\\u003d\\\"_blank\\\"\\u003eLearn more\\u003c/a\\u003e about using TikTok Pixel with Google Tag Manager.\"\n  },\n  {\n    \"type\": \"GROUP\",\n    \"name\": \"Section 3 - Parameter Override\",\n    \"displayName\": \"Parameter Override\",\n    \"groupStyle\": \"ZIPPY_CLOSED\",\n    \"subParams\": [\n      {\n        \"type\": \"LABEL\",\n        \"name\": \"Parameter Override Description\",\n        \"displayName\": \"\\u003ca target\\u003d\\\"_blank\\\" href\\u003d\\\"https://business-api.tiktok.com/portal/docs?id\\u003d1799004110681154#item-link-How%20to%20set%20up%20deduplication\\\"\\u003eLearn more\\u003c/a\\u003e about how to manually configure event parameters with \\\"Parameter Override\\\".\"\n      },\n      {\n        \"type\": \"GROUP\",\n        \"name\": \"Advanced Matching Configurations\",\n        \"displayName\": \"Advanced Matching Configurations\",\n        \"groupStyle\": \"NO_ZIPPY\",\n        \"subParams\": [\n          {\n            \"type\": \"RADIO\",\n            \"name\": \"hash\",\n            \"displayName\": \"Hashed / Non-Hashed AM Parameters\",\n            \"radioItems\": [\n              {\n                \"value\": \"hashed\",\n                \"displayValue\": \"SHA256 AM Parameters\"\n              },\n              {\n                \"value\": \"non-hashed\",\n                \"displayValue\": \"Plain AM Parameters\",\n                \"help\": \"TikTok Pixel will hash plain email and phone for you\"\n              }\n            ],\n            \"simpleValueType\": true,\n            \"help\": \"Tell us if your AM parameters have been hashed.\"\n          },\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"email\",\n            \"displayName\": \"Email\",\n            \"simpleValueType\": true,\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"hash\",\n                \"paramValue\": \"non-hashed\",\n                \"type\": \"EQUALS\"\n              }\n            ]\n          },\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"phone\",\n            \"displayName\": \"Phone\",\n            \"simpleValueType\": true,\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"hash\",\n                \"paramValue\": \"non-hashed\",\n                \"type\": \"EQUALS\"\n              }\n            ],\n            \"help\": \"If the country code is 86, then do not include country code (example: 13800000000). Otherwise, include country code with + and remove any other characters (spaces, \\u0027-\\u0027) between numbers (example for US: +12133734253).\"\n          },\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"external_id\",\n            \"displayName\": \"External ID\",\n            \"simpleValueType\": true,\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"hash\",\n                \"paramValue\": \"non-hashed\",\n                \"type\": \"EQUALS\"\n              }\n            ],\n            \"help\": \"Any unique identifier on the advertiser\\u0027s side, such as loyalty membership ID, user ID, or external cookie ID.\"\n          },\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"sha256_email\",\n            \"displayName\": \"SHA256 Hashed Email\",\n            \"simpleValueType\": true,\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"hash\",\n                \"paramValue\": \"hashed\",\n                \"type\": \"EQUALS\"\n              }\n            ]\n          },\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"sha256_phone\",\n            \"displayName\": \"SHA256 Hashed Phone\",\n            \"simpleValueType\": true,\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"hash\",\n                \"paramValue\": \"hashed\",\n                \"type\": \"EQUALS\"\n              }\n            ],\n            \"help\": \"If the country code is 86, then do not include country code (example: 13800000000). Otherwise, include country code with + and remove any other characters (spaces, \\u0027-\\u0027) between numbers (example for US: +12133734253).\"\n          },\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"sha256_external_id\",\n            \"displayName\": \"SHA256 Hashed External ID\",\n            \"simpleValueType\": true,\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"hash\",\n                \"paramValue\": \"hashed\",\n                \"type\": \"EQUALS\"\n              }\n            ],\n            \"help\": \"Any unique identifier on the advertiser\\u0027s side, such as loyalty membership ID, user ID, or external cookie ID.\"\n          }\n        ],\n        \"help\": \"Advance matching parameters are hashed and then shared with TikTok to help attribute more conversions to your ads and improve ad retargeting. \\u003cbr\\u003e \\u003ca target\\u003d\\\"_blank\\\" href\\u003d\\\"https://business-api.tiktok.com/portal/docs?id\\u003d1799004110681154#item-link-User%20data\\\"\\u003eLearn more\\u003c/a\\u003e about how to format Advanced Matching parameters.\"\n      },\n      {\n        \"type\": \"GROUP\",\n        \"name\": \"Properties\",\n        \"displayName\": \"Properties (e.g. product data)\",\n        \"groupStyle\": \"NO_ZIPPY\",\n        \"subParams\": [\n          {\n            \"type\": \"CHECKBOX\",\n            \"name\": \"enhance_ecomm\",\n            \"checkboxText\": \"Use Google Analytics E-commerce Data Layers (Recommended)\",\n            \"simpleValueType\": true,\n            \"help\": \"If you have Google\\u0027s \\u003ca href\\u003d\\\"https://developers.google.com/analytics/devguides/collection/ga4/ecommerce?client_type\\u003dgtm#implementation\\\" target\\u003d\\\"_blank\\\"\\u003eEnhanced E-Commerce\\u003c/a\\u003e or \\u003ca href\\u003d\\\"https://support.google.com/tagmanager/answer/6107169?hl\\u003den#standard-ecommerce\\\" target\\u003d\\\"_blank\\\"\\u003e Standard E-Commerce\\u003c/a\\u003e Data Layers set up to collect information about the shopping behavior of your users. TikTok will automatically collect these data as parameters to help you improve your ad performance.\",\n            \"defaultValue\": true\n          },\n          {\n            \"type\": \"RADIO\",\n            \"name\": \"ga_ecomm\",\n            \"displayName\": \"Google Analytics E-commerce Data Layers\",\n            \"radioItems\": [\n              {\n                \"value\": \"ecomm\",\n                \"displayValue\": \"Standard Ecommerce\"\n              },\n              {\n                \"value\": \"enhance_ecomm\",\n                \"displayValue\": \"Enhanced Ecommerce\"\n              }\n            ],\n            \"simpleValueType\": true,\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"enhance_ecomm\",\n                \"paramValue\": true,\n                \"type\": \"EQUALS\"\n              }\n            ],\n            \"defaultValue\": \"ecomm\"\n          },\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"ecomm_currency\",\n            \"displayName\": \"Currency\",\n            \"simpleValueType\": true,\n            \"valueHint\": \"USD\",\n            \"help\": \"If you haven\\u0027t added the currency to the e-commerce data layer, add the current code here. Note: Adding the code will replace the \\u0027currency code\\u0027 or \\u0027currency\\u0027 field from your data layer.\",\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"enhance_ecomm\",\n                \"paramValue\": true,\n                \"type\": \"EQUALS\"\n              }\n            ]\n          },\n          {\n            \"type\": \"RADIO\",\n            \"name\": \"single_multi_product\",\n            \"displayName\": \"Manually Input Single / Multiple Products from Data Layer\",\n            \"radioItems\": [\n              {\n                \"value\": \"single\",\n                \"displayValue\": \"Single Content\"\n              },\n              {\n                \"value\": \"multiple\",\n                \"displayValue\": \"Multiple Contents\",\n                \"help\": \"Send a list of contents as a JSON string. \\u003ca href\\u003d\\\"https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/JSON\\\" target\\u003d\\\"_blank\\\"\\u003eLearn more about JSON\\u003c/a\\u003e\"\n              },\n              {\n                \"value\": \"empty\",\n                \"displayValue\": \"No Contents\"\n              }\n            ],\n            \"simpleValueType\": true,\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"enhance_ecomm\",\n                \"paramValue\": false,\n                \"type\": \"EQUALS\"\n              }\n            ]\n          },\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"contents\",\n            \"displayName\": \"contents\",\n            \"simpleValueType\": true,\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"single_multi_product\",\n                \"paramValue\": \"multiple\",\n                \"type\": \"EQUALS\"\n              }\n            ],\n            \"help\": \"Please make sure \\\"contents\\\" is \\u003ca href\\u003d\\\"https://business-api.tiktok.com/portal/docs?id\\u003d1799004110681154#item-link-contents%20parameters\\\" target\\u003d\\\"_blank\\\"\\u003ea list of valid content objects\\u003c/a\\u003e or encoded as \\u003ca href\\u003d\\\"https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/JSON\\\" target\\u003d\\\"_blank\\\"\\u003ea valid JSON string\\u003c/a\\u003e.\",\n            \"valueHint\": \"[{\\\"content_id\\\": \\\"abc\\\", \\\"price\\\": 10, \\\"quantity\\\": 1}]\"\n          },\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"content_id\",\n            \"displayName\": \"content_id\",\n            \"simpleValueType\": true,\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"single_multi_product\",\n                \"paramValue\": \"single\",\n                \"type\": \"EQUALS\"\n              }\n            ],\n            \"help\": \"Recommended: Unique ID of the item, either SKU ID or item group ID\"\n          },\n          {\n            \"type\": \"SELECT\",\n            \"name\": \"content_type\",\n            \"displayName\": \"content_type\",\n            \"macrosInSelect\": false,\n            \"selectItems\": [\n              {\n                \"value\": \"product\",\n                \"displayValue\": \"product\"\n              },\n              {\n                \"value\": \"product_group\",\n                \"displayValue\": \"product_group\"\n              }\n            ],\n            \"simpleValueType\": true,\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"single_multi_product\",\n                \"paramValue\": \"single\",\n                \"type\": \"EQUALS\"\n              }\n            ],\n            \"help\": \"Recommended: Select \\\"product\\\" if your content_id is SKU ID, or select \\\"product_group\\\" if your content_id is item group ID\",\n            \"notSetText\": \"\"\n          },\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"content_name\",\n            \"displayName\": \"content_name\",\n            \"simpleValueType\": true,\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"single_multi_product\",\n                \"paramValue\": \"single\",\n                \"type\": \"EQUALS\"\n              }\n            ],\n            \"help\": \"Recommended: Title of your product or page\"\n          },\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"content_category\",\n            \"displayName\": \"content_category\",\n            \"simpleValueType\": true,\n            \"help\": \"Recommended: Category of the product or page\",\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"single_multi_product\",\n                \"paramValue\": \"single\",\n                \"type\": \"EQUALS\"\n              }\n            ]\n          },\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"price\",\n            \"displayName\": \"price\",\n            \"simpleValueType\": true,\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"single_multi_product\",\n                \"paramValue\": \"single\",\n                \"type\": \"EQUALS\"\n              }\n            ],\n            \"help\": \"Recommended: Price of this item\"\n          },\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"quantity\",\n            \"displayName\": \"quantity\",\n            \"simpleValueType\": true,\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"single_multi_product\",\n                \"paramValue\": \"single\",\n                \"type\": \"EQUALS\"\n              }\n            ],\n            \"help\": \"Recommended: Quantity of this item\"\n          },\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"value\",\n            \"displayName\": \"value\",\n            \"simpleValueType\": true,\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"enhance_ecomm\",\n                \"paramValue\": false,\n                \"type\": \"EQUALS\"\n              }\n            ],\n            \"help\": \"Recommended: Total value of the order\"\n          },\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"currency\",\n            \"displayName\": \"currency\",\n            \"simpleValueType\": true,\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"enhance_ecomm\",\n                \"paramValue\": false,\n                \"type\": \"EQUALS\"\n              }\n            ],\n            \"help\": \"Recommended: ISO 4217 code. Examples: \\\"EUR\\\", \\\"USD\\\", \\\"JPY\\\". See \\u003ca href\\u003d\\\"https://ads.tiktok.com/help/article/about-parameters?lang\\u003den\\\" target\\u003d\\\"_blank\\\"\\u003ehere\\u003c/a\\u003e for a list of currencies supported.\"\n          },\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"description\",\n            \"displayName\": \"description\",\n            \"simpleValueType\": true,\n            \"help\": \"Recommended: Description of the product or page\",\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"enhance_ecomm\",\n                \"paramValue\": false,\n                \"type\": \"EQUALS\"\n              }\n            ]\n          },\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"brand\",\n            \"displayName\": \"brand\",\n            \"simpleValueType\": true,\n            \"help\": \"Recommended: Brand name of the product\",\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"enhance_ecomm\",\n                \"paramValue\": false,\n                \"type\": \"EQUALS\"\n              }\n            ]\n          },\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"query\",\n            \"displayName\": \"query\",\n            \"simpleValueType\": true,\n            \"help\": \"Recommended for Search events: The text string that was searched for. For instance, a person searches for a product on your website, you can forward the keyword being searched here.\",\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"enhance_ecomm\",\n                \"paramValue\": false,\n                \"type\": \"EQUALS\"\n              }\n            ]\n          },\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"status\",\n            \"displayName\": \"status\",\n            \"simpleValueType\": true,\n            \"help\": \"Optional: Status of an order, item, or service.\",\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"enhance_ecomm\",\n                \"paramValue\": false,\n                \"type\": \"EQUALS\"\n              }\n            ]\n          }\n        ],\n        \"help\": \"Configure and send \\u003ca href\\u003d\\\"https://business-api.tiktok.com/portal/docs?id\\u003d1799004110681154#item-link-Product%20data\\\" target\\u003d\\\"_blank\\\"\\u003eadditional parameters\\u003c/a\\u003e to TikTok for to improve Ad performance and unlock Ad features.\"\n      },\n      {\n        \"type\": \"GROUP\",\n        \"name\": \"De-duplication Configurations\",\n        \"displayName\": \"De-duplication Configurations\",\n        \"groupStyle\": \"NO_ZIPPY\",\n        \"subParams\": [\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"event_id\",\n            \"displayName\": \"Event ID\",\n            \"simpleValueType\": true\n          }\n        ],\n        \"help\": \"If you use both TikTok Pixel template and Events API template to send events, you can set up Event ID to deduplicate the two sources. \\u003ca target\\u003d\\\"_blank\\\" href\\u003d\\\"https://business-api.tiktok.com/portal/docs?id\\u003d1799004097478658#item-link-How%20to%20set%20up%20deduplication\\\"\\u003eLearn more\\u003c/a\\u003e about how to set up deduplication.\"\n      }\n    ]\n  },\n  {\n    \"type\": \"GROUP\",\n    \"name\": \"Section 2 - Additional Properties\",\n    \"displayName\": \"Additional Properties\",\n    \"groupStyle\": \"ZIPPY_CLOSED\",\n    \"subParams\": [\n      {\n        \"type\": \"LABEL\",\n        \"name\": \"Description\",\n        \"displayName\": \"You may configure and send more custom parameters to TikTok to unlock additional Ad features targeted at specific verticals (i.e. Travel)\"\n      },\n      {\n        \"type\": \"PARAM_TABLE\",\n        \"name\": \"custom_properties\",\n        \"displayName\": \"\",\n        \"paramTableColumns\": [\n          {\n            \"param\": {\n              \"type\": \"TEXT\",\n              \"name\": \"key\",\n              \"displayName\": \"Key\",\n              \"simpleValueType\": true,\n              \"canBeEmptyString\": false\n            },\n            \"isUnique\": true\n          },\n          {\n            \"param\": {\n              \"type\": \"TEXT\",\n              \"name\": \"value\",\n              \"displayName\": \"Value\",\n              \"simpleValueType\": true\n            },\n            \"isUnique\": false\n          }\n        ]\n      }\n    ]\n  }\n]\n\n\n___SANDBOXED_JS_FOR_WEB_TEMPLATE___\n\n/*\n * Copyright 2022 ByteDance Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst version = \"0_2_01\";\n\nconst log = require(\"logToConsole\");\nconst copyFromWindow = require(\"copyFromWindow\");\nconst copyFromDataLayer = require(\"copyFromDataLayer\");\nconst makeNumber = require(\"makeNumber\");\nconst callInWindow = require(\"callInWindow\");\nconst Object = require(\"Object\");\nconst JSON = require(\"JSON\");\n\nconst ecommerce = copyFromDataLayer(\"ecommerce\");\nconst eventModel = copyFromDataLayer(\"eventModel\");\nconst userDataFromDataLayer = copyFromDataLayer(\"user_data\");\nconst ttContents = copyFromDataLayer('tt_contents') || (eventModel && eventModel.tt_contents);\nconst ttContentType = copyFromDataLayer('tt_content_type') || (eventModel && eventModel.tt_content_type);\nconst ttExternalId = copyFromDataLayer('tt_external_id') || (eventModel && eventModel.tt_external_id);\n\nconst ValidEvents = {\n  ViewContent: 1,\n  ClickButton: 1,\n  Search: 1,\n  AddToWishlist: 1,\n  AddToCart: 1,\n  InitiateCheckout: 1,\n  AddPaymentInfo: 1,\n  CompletePayment: 1,\n  PlaceAnOrder: 1,\n  Contact: 1,\n  Download: 1,\n  SubmitForm: 1,\n  CompleteRegistration: 1,\n  Subscribe: 1,\n};\n\nconst TTEventMap = {\n  'add_payment_info': 'AddPaymentInfo',\n  'add_to_cart': 'AddToCart',\n  'add_to_wishlist': 'AddToWishlist',\n  'begin_checkout': 'InitiateCheckout',\n  'page_view': 'Pageview',\n  'purchase': 'CompletePayment',\n  'search': 'Search',\n  'sign_up': 'CompleteRegistration',\n  'view_item': 'ViewContent',\n};\n\nconst checkExistence = (key) => {\n  return typeof copyFromWindow(key) !== \"undefined\";\n};\n\nconst looksLikeSHA256 = (s) => {\n  return s && s.length == 64;\n};\n\nconst getConfigHash = (data) => {\n  // What API is used. 0: None, 1: Tag Manager, 2: Google Tag, 3: Both\n  var apiVersion = 0;\n  if (ecommerce || userDataFromDataLayer) apiVersion += 1;\n  if (eventModel && (eventModel.items || eventModel.value || eventModel.currency || eventModel.user_data)) apiVersion += 2;\n\n  var contents = 0;\n  if (data.enhance_ecomm == false && data.single_multi_product == \"empty\") contents = 1;\n  else if (data.enhance_ecomm == false && data.single_multi_product == \"single\") contents = 2;\n  else if (data.enhance_ecomm == false && data.single_multi_product == \"multiple\") contents = 3;\n  else if (data.enhance_ecomm == true && data.ga_ecomm == \"enhance_ecomm\") contents = 4;\n  else if (data.enhance_ecomm == true && data.ga_ecomm == \"ecomm\") contents = 5;\n\n  return '' + apiVersion + contents;\n};\n\nconst getEnhancedEcommerceData = (data, ecommerce) => {\n  if (!ecommerce) {\n    return null;\n  }\n\n  if (data.event == \"ViewContent\" && ecommerce.detail && ecommerce.detail.products) {\n    return ecommerce.detail.products;\n  } else if (data.event == \"AddToCart\" && ecommerce.add && ecommerce.add.products) {\n    return ecommerce.add.products;\n  } else if ((data.event == \"InitiateCheckout\" || data.event == \"AddPaymentInfo\") && ecommerce.checkout && ecommerce.checkout.products) {\n    return ecommerce.checkout.products;\n  } else if ((data.event == \"CompletePayment\" || data.event == \"PlaceAnOrder\" || data.event == \"Subscribe\") && ecommerce.purchase && ecommerce.purchase.products) {\n    return ecommerce.purchase.products;\n  } else {\n    if (ecommerce.detail && ecommerce.detail.products)\n      return ecommerce.detail.products;\n    if (ecommerce.add && ecommerce.add.products)\n      return ecommerce.add.products;\n    if (ecommerce.checkout && ecommerce.checkout.products)\n      return ecommerce.checkout.products;\n    if (ecommerce.purchase && ecommerce.purchase.products)\n      return ecommerce.purchase.products;\n  }\n  return null;\n};\n\nconst getItemCategories = (item) => {\n  var categories = [];\n  if (item.item_category) categories.push(item.item_category);\n  if (item.item_category2) categories.push(item.item_category2);\n  if (item.item_category3) categories.push(item.item_category3);\n  if (item.item_category4) categories.push(item.item_category4);\n  if (item.item_category5) categories.push(item.item_category5);\n\n  if (categories.length > 0) {\n    return categories.join(',');\n  }\n\n  return null;\n};\n\nconst getEcommerceData = (data, ecommerce) => {\n  var value = 0;\n  var currency = \"USD\"; // default value\n  var contents = [];\n\n  /* \n    Standard Ecommerce Support. For more details on Ecommerce Data Structure\n    https://developers.google.com/analytics/devguides/collection/ga4/ecommerce?client_type=gtm\n    We will need to check for standard ecommerce events if Enhanced Ecommerce doesnt work\n  */\n  const secData = (ecommerce && ecommerce.items) || (eventModel && eventModel.items) || ttContents;\n  if (secData) {\n    log(\"1a. Standard Ecommerce - Data layers detected\");\n    secData.map(function (ed) {\n      // Form the TikTok Parameter Object\n      var content = {};\n      if (ed.item_id) content.content_id = ed.item_id;\n      if (!ed.item_id && ed.id) content.content_id = ed.id;\n      if (ed.item_name) content.content_name = ed.item_name;\n      if (ed.item_brand) content.brand = ed.item_brand;\n      var categoryString = getItemCategories(ed);\n      if (categoryString) content.content_category = categoryString;\n      if (ed.price) content.price = makeNumber(ed.price);\n      if (ed.quantity) {\n        content.quantity = makeNumber(ed.quantity);\n      } else {\n        content.quantity = 1;\n      }\n      content.content_type = ttContentType || \"product\";\n      contents.push(content);\n      // Calulate the total value shown\n      if (ed.price) {\n        if (!ed.quantity) ed.quantity = 1;\n        value += ed.price * ed.quantity;\n      }\n    });\n  } else if (data.ga_ecomm == \"ecomm\") {\n    log(\"1a. Standard Ecommerce - Unable to detect any Data Layers\");\n  }\n\n  /* \n    Enhanced Ecommerce Support. Fore more details on Enhanced Ecommerce Data Structure\n    https://developers.google.com/analytics/devguides/collection/ua/gtm/enhanced-ecommerce#details\n    ViewContent = detail\n    AddToCart = add\n    InitiateCheckout, AddPaymentInfo = checkout\n    CompletePayment, PlaceAnOrder, Subscribe = purchase\n  */\n  const eecData = getEnhancedEcommerceData(data, ecommerce);\n  if (eecData !== null && contents.length == 0) {\n    log(\"1b. Enhanced Ecommerce - Data layers detected\");\n    eecData.map(function (ed) {\n      // Form the TikTok Parameter Object\n      var content = {};\n      if (ed.id) content.content_id = ed.id;\n      if (ed.name) content.content_name = ed.name;\n      if (ed.brand) content.brand = ed.brand;\n      if (ed.category) content.content_category = ed.category;\n      if (ed.price) content.price = makeNumber(ed.price);\n      if (ed.quantity) {\n        content.quantity = makeNumber(ed.quantity);\n      } else {\n        content.quantity = 1;\n      }\n      content.content_type = ttContentType || \"product\";\n      contents.push(content);\n      // Calulate the total value shown\n      if (ed.price) {\n        if (!ed.quantity) ed.quantity = 1;\n        value += ed.price * ed.quantity;\n      }\n    });\n  } else if (data.ga_ecomm == \"enhance_ecomm\") {\n    log(\"1b. Enhanced Ecommerce - Unable to detect any ecommerce data layers\");\n  }\n\n  if (data.ecomm_currency)\n    currency = data.ecomm_currency;\n  else if (ecommerce && ecommerce.currencyCode)\n    currency = ecommerce.currencyCode;\n  else if (ecommerce && ecommerce.currency)\n    currency = ecommerce.currency;\n  else if (eventModel && eventModel.currency)\n    currency = eventModel.currency;\n\n  if (ecommerce && ecommerce.value) {\n    value = ecommerce.value;\n  } else if (\n    ecommerce &&\n    ecommerce.purchase &&\n    ecommerce.purchase.actionField &&\n    ecommerce.purchase.actionField.revenue\n  ) {\n    value = ecommerce.purchase.actionField.revenue;\n  } else if (eventModel && eventModel.value) {\n    value = eventModel.value;\n  }\n\n  return {\n    value: value,\n    currency: currency,\n    contents: contents\n  };\n};\n\nconst isHashed = (val) => {\n  return val && val.match(\"^[A-Fa-f0-9]{64}$\") != null;\n};\n\nconst getUserDataFromDataLayer = () => {\n  var userData = {};\n  const email = (userDataFromDataLayer && (userDataFromDataLayer.email_address || userDataFromDataLayer.sha256_email_address)) ||\n    (eventModel && eventModel.user_data && (eventModel.user_data.email_address || eventModel.user_data.sha256_email_address));\n  if (email) {\n    if (isHashed(email)) {\n      userData.sha256_email = email;\n    } else {\n      userData.email = email;\n    }\n  }\n\n  const phone = (userDataFromDataLayer && (userDataFromDataLayer.phone_number || userDataFromDataLayer.sha256_phone_number)) ||\n    (eventModel && eventModel.user_data && (eventModel.user_data.phone_number || eventModel.user_data.sha256_phone_number));\n  if (phone) {\n    if (isHashed(phone)) {\n      userData.sha256_phone_number = phone;\n    } else {\n      userData.phone_number = phone;\n    }\n  }\n\n  if (ttExternalId) {\n    userData.external_id = ttExternalId;\n  }\n\n  return userData;\n};\n\nconst main = () => {\n  // Forming the passed in parameters\n  var parameters = {\n    gtm_version: version + ':' + getConfigHash(data),\n    event_trigger_source: 'GoogleTagManagerClient',\n  };\n  const ttEvent = TTEventMap[data.event] || data.event;\n\n  // Check if enhance ecomm is enabled.\n  if (data.enhance_ecomm == true) {\n    const ecomData = getEcommerceData(data, ecommerce);\n    parameters.currency = ecomData.currency;\n    parameters.value = ecomData.value;\n    if (ecomData.contents && ecomData.contents.length > 0) {\n      parameters.contents = ecomData.contents;\n    }\n  } else {\n    if (data.single_multi_product == \"single\") {\n      // Single Content\n      if (data.content_id) parameters.content_id = data.content_id;\n      if (data.content_type || ttContentType) parameters.content_type = data.content_type || ttContentType;\n      if (data.content_name) parameters.content_name = data.content_name;\n      if (data.price) parameters.price = makeNumber(data.price);\n      if (data.quantity) parameters.quantity = makeNumber(data.quantity);\n      if (data.currency) parameters.currency = data.currency;\n      if (data.value) {\n        parameters.value = makeNumber(data.value);\n      } else {\n        if (data.price && data.quantity) {\n          parameters.value = makeNumber(data.price) * makeNumber(data.quantity);\n        }\n      }\n      if (data.content_category)\n        parameters.content_category = data.content_category;\n      if (data.description) parameters.description = data.description;\n      if (data.query) parameters.query = data.query;\n      if (data.status) parameters.status = data.status;\n    } else if (data.single_multi_product == \"multiple\") {\n      // Multiple Content\n      if (data.contents) {\n        const parsedContents = JSON.parse(data.contents);\n        if (parsedContents !== undefined) {\n          parameters.contents = parsedContents;\n        } else {\n          parameters.contents = data.contents;\n        }\n      }\n      if (data.currency) parameters.currency = data.currency;\n      if (data.value) parameters.value = makeNumber(data.value);\n      if (data.description) parameters.description = data.description;\n      if (data.query) parameters.query = data.query;\n      if (data.status) parameters.status = data.status;\n    } else if (data.single_multi_product == \"empty\") {\n      // No Content\n      if (data.currency) parameters.currency = data.currency;\n      if (data.value) parameters.value = makeNumber(data.value);\n      if (data.description) parameters.description = data.description;\n      if (data.query) parameters.query = data.query;\n      if (data.status) parameters.status = data.status;\n    }\n  }\n\n  // Additional Object Properties\n  if (data.custom_properties && data.custom_properties.length > 0) {\n    for (let i = 0; i < data.custom_properties.length; i++) {\n      let objectParam = data.custom_properties[i];\n      if (objectParam.key) {\n        parameters[objectParam.key] = objectParam.value;\n      }\n    }\n  }\n\n  // Advanced Matching and sending TT events\n  var userData = getUserDataFromDataLayer();\n\n  if (data.hash == \"hashed\") {\n    // Send hashed data\n    if (data.sha256_email) userData.sha256_email = data.sha256_email;\n    if (data.sha256_phone)\n      userData.sha256_phone_number = data.sha256_phone;\n    // Note: The key is still \"external_id\"\n    if (data.sha256_external_id)\n      userData.external_id = data.sha256_external_id;\n    log(\"2a. Advanced matching with hashed PII\");\n  } else if (data.hash == \"non-hashed\") {\n    // Send non-hashed data and TikTok Pixel will hash it for you.\n    if (data.email) userData.email = data.email;\n    if (data.phone) userData.phone_number = data.phone;\n    if (data.external_id) userData.external_id = data.external_id;\n    log(\n      \"2b. Advanced matching without hashed data, TikTok Pixel will hash the data for you.\"\n    );\n  }\n\n  if (Object.keys(userData).length > 0) {\n    callInWindow(\"ttq.identify\", userData);\n  }\n\n  log(\n    \"3. Base code found, sending \",\n    ttEvent,\n    \"event with\",\n    parameters,\n    data.event_id\n  );\n\n  if (data.pixel_code) {\n    callInWindow(\"ttq.track\", ttEvent, parameters, {\n      event_id: data.event_id,\n      pixel_code: data.pixel_code\n    });\n  } else {\n    callInWindow(\"ttq.track\", ttEvent, parameters, {\n      event_id: data.event_id\n    });\n  }\n};\n\nconst validate = (data) => {\n  const errors = [];\n  const warnings = [];\n\n  // errors\n  if (!checkExistence(\"ttq\")) {\n    errors.push(\"ttq not found\");\n  }\n\n  // clean up\n  if (data.external_id) {\n    data.external_id = data.external_id.trim();\n  }\n\n  // warnings\n  // 1. Prevent user from passing in SHA256 hash as \"email\" or \"phone\" to avoid double-hashing.\n  // 2. Prevent user from passing in non-hash as \"sha256_email\" or \"sha256_phone\".\n  if (data.email) {\n    if (data.email.indexOf(\"@\") === -1)\n      warnings.push(\"data.email is not an email\");\n    if (looksLikeSHA256(data.email))\n      warnings.push(\"data.email appears to be a SHA256 hash\");\n  }\n  if (data.phone) {\n    if (looksLikeSHA256(data.phone))\n      warnings.push(\"data.phone appears to be a SHA256 hash\");\n  }\n  if (data.sha256_email) {\n    if (!looksLikeSHA256(data.sha256_email))\n      warnings.push(\"data.sha256_email is not a SHA256 hash\");\n  }\n  if (data.sha256_phone) {\n    if (!looksLikeSHA256(data.sha256_phone))\n      warnings.push(\"data.sha256_phone is not a SHA256 hash\");\n  }\n\n  if (TTEventMap[data.event] == undefined && ValidEvents[data.event] === undefined) {\n    warnings.push('data.event \"' + data.event + '\" is not a valid event');\n  }\n\n  for (const msg of warnings) {\n    log(\"[WARN] \" + msg);\n  }\n  for (const msg of errors) {\n    log(\"[ERROR] \" + msg);\n  }\n  return errors;\n};\n\nconst start = () => {\n  const errors = validate(data);\n  if (errors.length > 0) {\n    data.gtmOnFailure();\n    return;\n  }\n\n  main();\n\n  data.gtmOnSuccess();\n};\n\nstart();\n\n\n___WEB_PERMISSIONS___\n\n[\n  {\n    \"instance\": {\n      \"key\": {\n        \"publicId\": \"logging\",\n        \"versionId\": \"1\"\n      },\n      \"param\": [\n        {\n          \"key\": \"environments\",\n          \"value\": {\n            \"type\": 1,\n            \"string\": \"debug\"\n          }\n        }\n      ]\n    },\n    \"clientAnnotations\": {\n      \"isEditedByUser\": true\n    },\n    \"isRequired\": true\n  },\n  {\n    \"instance\": {\n      \"key\": {\n        \"publicId\": \"access_globals\",\n        \"versionId\": \"1\"\n      },\n      \"param\": [\n        {\n          \"key\": \"keys\",\n          \"value\": {\n            \"type\": 2,\n            \"listItem\": [\n              {\n                \"type\": 3,\n                \"mapKey\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"key\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"read\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"write\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"execute\"\n                  }\n                ],\n                \"mapValue\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"ttq\"\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": false\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": false\n                  }\n                ]\n              },\n              {\n                \"type\": 3,\n                \"mapKey\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"key\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"read\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"write\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"execute\"\n                  }\n                ],\n                \"mapValue\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"ttq.identify\"\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": false\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": false\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  }\n                ]\n              },\n              {\n                \"type\": 3,\n                \"mapKey\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"key\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"read\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"write\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"execute\"\n                  }\n                ],\n                \"mapValue\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"ttq.track\"\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": false\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": false\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  }\n                ]\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"clientAnnotations\": {\n      \"isEditedByUser\": true\n    },\n    \"isRequired\": true\n  },\n  {\n    \"instance\": {\n      \"key\": {\n        \"publicId\": \"read_data_layer\",\n        \"versionId\": \"1\"\n      },\n      \"param\": [\n        {\n          \"key\": \"allowedKeys\",\n          \"value\": {\n            \"type\": 1,\n            \"string\": \"any\"\n          }\n        }\n      ]\n    },\n    \"clientAnnotations\": {\n      \"isEditedByUser\": true\n    },\n    \"isRequired\": true\n  }\n]\n\n\n___TESTS___\n\nscenarios:\n- name: Basic\n  code: \"const mockData = {\\n  event: 'view_item',\\n  pixel_code: 'my_pixel_code',\\n\\\n    \\  \\n  advance_matching: true,\\n  hash: \\\"non-hashed\\\",\\n  external_id: '   abc\\\n    \\   ',\\n  \\n  single_multi_product: 'single',\\n  content_type: 'product',\\n  content_id:\\\n    \\ 'abc123',\\n};\\nrunCode(mockData);\\n\\nassertThat(Calls['ttq.identify'].length).isStrictlyEqualTo(1);\\n\\\n    assertThat(Calls['ttq.identify'][0].params).isEqualTo({\\n  \\\"external_id\\\": \\\"\\\n    abc\\\"\\n});\\n\\nassertThat(Calls['ttq.track'].length).isStrictlyEqualTo(1);\\nassertThat(Calls['ttq.track'][0].params.gtm_version).isEqualTo(\\\"\\\n    0_2_01:00\\\");\\nassertThat(Calls['ttq.track'][0].params.content_type).isEqualTo(\\\"\\\n    product\\\");\\nassertThat(Calls['ttq.track'][0].params.content_id).isEqualTo(\\\"\\\n    abc123\\\");\\nassertThat(Calls['ttq.track'][0].params.event_trigger_source).isEqualTo(\\\"\\\n    GoogleTagManagerClient\\\");\\nassertThat(Calls['ttq.track'][0].pixel.pixel_code).isEqualTo(\\\"\\\n    my_pixel_code\\\");\\nassertThat(Calls['ttq.track'][0].eventName).isEqualTo(\\\"ViewContent\\\"\\\n    );\\n\\nassertApi('gtmOnSuccess').wasCalled();\"\n- name: MissingPixelCode\n  code: |-\n    const mockData = {\n      event: 'ViewContent',\n    };\n    runCode(mockData);\n\n    assertThat(LogsError.length).isStrictlyEqualTo(0);\n    assertThat(Calls['ttq.track'][0].pixel.pixel_code).isEqualTo(undefined);\n- name: InvalidPII\n  code: \"const mockData = {\\n  event: 'CompletePayment',\\n  pixel_code: 'my_pixel_code',\\n\\\n    \\  \\n  email: 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad',\\n\\\n    \\  phone: 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad',\\n\\\n    \\  sha256_email: 'a@a.com',\\n  sha256_phone: '+11231231234',\\n};\\nrunCode(mockData);\\n\\\n    \\n// Check hashed PII not passed into plain PII fields\\nassertThat(LogsWarn).contains(\\\"\\\n    [WARN] data.email is not an email\\\");\\nassertThat(LogsWarn).contains(\\\"[WARN]\\\n    \\ data.email appears to be a SHA256 hash\\\");\\nassertThat(LogsWarn).contains(\\\"\\\n    [WARN] data.phone appears to be a SHA256 hash\\\");\\n\\n// Check plain PII not passed\\\n    \\ into hashed PII fields\\nassertThat(LogsWarn).contains(\\\"[WARN] data.sha256_email\\\n    \\ is not a SHA256 hash\\\");\\nassertThat(LogsWarn).contains(\\\"[WARN] data.sha256_phone\\\n    \\ is not a SHA256 hash\\\");\\n\\n\"\n- name: InvalidEvent\n  code: |\n    const mockData = {\n      event: 'InvalidEvent',\n      pixel_code: 'my_pixel_code',\n    };\n    runCode(mockData);\n\n    // Check we warn about invalid event name\n    assertThat(LogsWarn).contains('[WARN] data.event \"InvalidEvent\" is not a valid event');\n- name: ValidPIIHashed\n  code: \"const mockData = {\\n  event: 'CompletePayment',\\n  pixel_code: 'my_pixel_code',\\n\\\n    \\  \\n  hash: 'hashed',\\n  sha256_email: 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad',\\n\\\n    \\  sha256_phone: 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad',\\n\\\n    };\\nrunCode(mockData);\\n\\nassertThat(Calls['ttq.identify'].length).isStrictlyEqualTo(1);\\n\\\n    assertThat(Calls['ttq.identify'][0].params).isEqualTo({\\n  \\\"sha256_email\\\": 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad',\\n\\\n    \\  \\\"sha256_phone_number\\\": 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad'\\n\\\n    });\\n\"\n- name: ValidPIIPlain\n  code: \"const mockData = {\\n  event: 'CompletePayment',\\n  pixel_code: 'my_pixel_code',\\n\\\n    \\  \\n  hash: 'non-hashed',\\n  email: 'a@a.com',\\n  phone: '+11231231234',\\n};\\n\\\n    runCode(mockData);\\n\\nassertThat(Calls['ttq.identify'].length).isStrictlyEqualTo(1);\\n\\\n    assertThat(Calls['ttq.identify'][0].params).isEqualTo({\\n  \\\"email\\\": 'a@a.com',\\n\\\n    \\  \\\"phone_number\\\": '+11231231234'\\n});\\n\\n\"\n- name: MultipleProducts\n  code: |-\n    const mockData = {\n      event: 'CompletePayment',\n      pixel_code: 'my_pixel_code',\n      single_multi_product: 'multiple',\n      contents: '[{\"content_id\": \"abc123\", \"price\": 1.23}]',\n    };\n    runCode(mockData);\n\n    assertThat(Calls['ttq.track'].length).isStrictlyEqualTo(1);\n    assertThat(Calls['ttq.track'][0].params.contents[0].content_id).isEqualTo(\"abc123\");\n    assertThat(Calls['ttq.track'][0].params.contents[0].price).isEqualTo(1.23);\n\n    // Verify that the tag finished successfully.\n    assertApi('gtmOnSuccess').wasCalled();\n- name: MultipleProductsInvalidContentsJSON\n  code: |-\n    const mockData = {\n      event: 'CompletePayment',\n      event_id: '1234',\n      pixel_code: 'my_pixel_code',\n      single_multi_product: 'multiple',\n      contents: '[{\"content_id\": \"abc123\", \"price\": 1.23}]]]]]',\n    };\n    runCode(mockData);\n\n    assertThat(Calls['ttq.track'].length).isStrictlyEqualTo(1);\n    // Parsing failure should just forward the event to Pixel.\n    assertThat(Calls['ttq.track'][0].params.contents).isEqualTo('[{\"content_id\": \"abc123\", \"price\": 1.23}]]]]]');\n\n    // Verify that the tag finished successfully.\n    assertApi('gtmOnSuccess').wasCalled();\n- name: SingleProduct\n  code: |-\n    const mockData = {\n      event: 'CompletePayment',\n      pixel_code: 'my_pixel_code',\n      single_multi_product: 'single',\n      content_id: 'abc123',\n      content_type: 'product',\n      content_name: 'tee shirt',\n      price: '12.34',\n      quantity: '2',\n      currency: 'USD',\n      value: '24.68',\n      custom_properties: [\n        {\n          key: 'custom_property_1',\n          value: 1,\n        },\n        {\n          key: 'custom_property_2',\n          value: '2',\n        },\n        {\n          key: '',\n          value: '3',\n        },\n      ],\n    };\n    runCode(mockData);\n\n    assertThat(Calls['ttq.track'].length).isStrictlyEqualTo(1);\n    assertThat(Calls['ttq.track'][0].params.content_id).isEqualTo(\"abc123\");\n    assertThat(Calls['ttq.track'][0].params.content_type).isEqualTo(\"product\");\n    assertThat(Calls['ttq.track'][0].params.content_name).isEqualTo(\"tee shirt\");\n    assertThat(Calls['ttq.track'][0].params.price).isEqualTo(12.34);\n    assertThat(Calls['ttq.track'][0].params.quantity).isEqualTo(2);\n    assertThat(Calls['ttq.track'][0].params.currency).isEqualTo(\"USD\");\n    assertThat(Calls['ttq.track'][0].params.value).isEqualTo(24.68);\n    assertThat(Calls['ttq.track'][0].params.custom_property_1).isEqualTo(1);\n    assertThat(Calls['ttq.track'][0].params.custom_property_2).isEqualTo('2');\n    assertThat(Calls['ttq.track'][0].params['']).isUndefined();\n\n    // Verify that the tag finished successfully.\n    assertApi('gtmOnSuccess').wasCalled();\n- name: StandardEcommerce\n  code: |-\n    const mockData = {\n      event: 'CompletePayment',\n      pixel_code: 'my_pixel_code',\n      enhance_ecomm: true,\n      ecommerce: {\n        currency: 'CAD',\n        value: 7.77,\n        items: [\n          {\n              item_id: 'abc123',\n              item_name: 'tee shirt',\n              item_brand: 'mybrand',\n              item_category: \"Apparel\",\n              item_category2: \"Adult\",\n              item_category4: \"Crew\",\n              price: 9.99,\n              discount: 2.22,\n              quantity: 1\n          }\n        ]\n      }\n    };\n\n    runCode(mockData);\n\n    assertThat(Calls['ttq.track'].length).isStrictlyEqualTo(1);\n    assertThat(Calls['ttq.track'][0].params.contents.length).isStrictlyEqualTo(1);\n    assertThat(Calls['ttq.track'][0].params.contents[0].content_id).isEqualTo(\"abc123\");\n    assertThat(Calls['ttq.track'][0].params.contents[0].content_type).isEqualTo(\"product\");\n    assertThat(Calls['ttq.track'][0].params.contents[0].content_name).isEqualTo(\"tee shirt\");\n    assertThat(Calls['ttq.track'][0].params.contents[0].content_category).isEqualTo(\"Apparel,Adult,Crew\");\n    assertThat(Calls['ttq.track'][0].params.contents[0].brand).isEqualTo(\"mybrand\");\n    assertThat(Calls['ttq.track'][0].params.contents[0].price).isEqualTo(9.99);\n    assertThat(Calls['ttq.track'][0].params.contents[0].quantity).isEqualTo(1);\n    assertThat(Calls['ttq.track'][0].params.currency).isEqualTo(\"CAD\");\n    assertThat(Calls['ttq.track'][0].params.value).isEqualTo(7.77);\n\n    assertApi('gtmOnSuccess').wasCalled();\n- name: EnhancedEcommerce\n  code: |-\n    const mockData = {\n      event: 'CompletePayment',\n      pixel_code: 'my_pixel_code',\n      enhance_ecomm: true,\n      ecomm_currency: 'CNY',\n      ecommerce: {\n        detail: {\n          products: [{\n            name: 'tee shirt',\n            id: 'abc123',\n            price: '9.99',\n            brand: 'mybrand',\n            category: 'apparel',\n            variant: 'blue'\n           }]\n         }\n      }\n    };\n\n    runCode(mockData);\n\n    assertThat(Calls['ttq.track'].length).isStrictlyEqualTo(1);\n    assertThat(Calls['ttq.track'][0].params.contents.length).isStrictlyEqualTo(1);\n    assertThat(Calls['ttq.track'][0].params.contents[0].content_id).isEqualTo(\"abc123\");\n    assertThat(Calls['ttq.track'][0].params.contents[0].content_type).isEqualTo(\"product\");\n    assertThat(Calls['ttq.track'][0].params.contents[0].content_name).isEqualTo(\"tee shirt\");\n    assertThat(Calls['ttq.track'][0].params.contents[0].content_category).isEqualTo(\"apparel\");\n    assertThat(Calls['ttq.track'][0].params.contents[0].brand).isEqualTo(\"mybrand\");\n    assertThat(Calls['ttq.track'][0].params.contents[0].price).isEqualTo(9.99);\n    assertThat(Calls['ttq.track'][0].params.contents[0].quantity).isEqualTo(1);\n    assertThat(Calls['ttq.track'][0].params.currency).isEqualTo(\"CNY\");\n    assertThat(Calls['ttq.track'][0].params.value).isEqualTo(9.99);\n\n    assertApi('gtmOnSuccess').wasCalled();\nsetup: \"const log = require('logToConsole');\\n\\nconst LogsError = [];\\nconst LogsWarn\\\n  \\ = []; \\nconst Calls = {};\\n\\nmock('logToConsole', function() {\\n  if (arguments.length\\\n  \\ > 0 && arguments[0].substring(0, 7) == '[ERROR]') {\\n    LogsError.push(arguments[0]);\\n\\\n  \\  }\\n  if (arguments.length > 0 && arguments[0].substring(0, 6) == '[WARN]') {\\n\\\n  \\    LogsWarn.push(arguments[0]);\\n  }\\n  // Print out logs, as normally as possible\\n\\\n  \\  log(arguments); // Note: bind and call not available\\n});\\n\\nmock('callInWindow',\\\n  \\ function() {\\n  const fnName = arguments[0];\\n  Calls[fnName] = Calls[fnName]\\\n  \\ || [];\\n  const call = {};\\n  call.arguments = arguments;\\n  Calls[fnName].push(call);\\n\\\n  \\  \\n  if (fnName === 'ttq.identify') {\\n    call.params = arguments[1];\\n  } else\\\n  \\ if (fnName === 'ttq.track') {\\n    call.eventName = arguments[1];\\n    call.params\\\n  \\ = arguments[2];\\n    call.pixel = arguments[3];\\n  }\\n});\\n\\nmock('copyFromWindow',\\\n  \\ function(name) {\\n  // Assume base code always exists.\\n  return {};\\n});\\n\\n\\\n  mock('copyFromDataLayer', function(name) {\\n  if (name == \\\"ecommerce\\\") {\\n   \\\n  \\ return mockData.ecommerce;\\n  }\\n  \\n  return undefined;\\n});\"\n\n\n___NOTES___\n\nCreated on 19/08/2022, 17:04:57\n\n\n",
        "galleryReference": {
          "host": "github.com",
          "owner": "tiktok",
          "repository": "gtm-template-pixel",
          "version": "cfe618d563a596ca92bc2fe1002332ea8a752064",
          "signature": "dc266f7c7b567a4d00dd3ea4d9742c409816d2be678413fac7d9a4977c55aae1",
          "galleryTemplateId": "MRQN8"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "templateId": "59",
        "name": "Pinterest Pixel Tag",
        "templateData": "___TERMS_OF_SERVICE___\n\nBy creating or modifying this file you agree to Google Tag Manager's Community\nTemplate Gallery Developer Terms of Service available at\nhttps://developers.google.com/tag-manager/gallery-tos (or such other URL as\nGoogle may provide), as modified from time to time.\n\n\n___INFO___\n\n{\n  \"type\": \"TAG\",\n  \"id\": \"cvt_NGMPN\",\n  \"version\": 1.4,\n  \"displayName\": \"Pinterest Pixel Tag\",\n  \"categories\": [\n    \"CONVERSIONS\",\n    \"TAG_MANAGEMENT\"\n  ],\n  \"brand\": {\n    \"thumbnail\": \"data:image/png;base64,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\\u003d\",\n    \"displayName\": \"pinterest\",\n    \"id\": \"github.com_pinterest\"\n  },\n  \"description\": \"Tag to fire Pinterest events.\",\n  \"containerContexts\": [\n    \"WEB\"\n  ]\n}\n\n\n___TEMPLATE_PARAMETERS___\n\n[\n  {\n    \"notSetText\": \"Not set (Required)\",\n    \"help\": \"Enter your tag ID. You can find your tags at https://ads.pinterest.com/conversion_tags/\",\n    \"valueValidators\": [\n      {\n        \"type\": \"NON_EMPTY\"\n      },\n      {\n        \"args\": [\n          \"26\\\\d{11}\"\n        ],\n        \"type\": \"REGEX\"\n      }\n    ],\n    \"displayName\": \"Tag ID\",\n    \"name\": \"tagId\",\n    \"type\": \"TEXT\",\n    \"valueHint\": \"Pinterest Tag ID\"\n  },\n  {\n    \"notSetText\": \"Not set (required for Enhanced Match)\",\n    \"help\": \"Optional, but required for Enhanced Match. This is the user\\u0027s email address, stripped of whitespace, lower-cased, then hashed with MD5, SHA1, or SHA-256. As a fallback, a raw email address can also be used. In this case, we will hash the email address for you, in the browser. (The email address *never* leaves the browser, and Pinterest never sees it.) See https://help.pinterest.com/en/business/article/enhanced-match for more information.\",\n    \"displayName\": \"Hashed Email\",\n    \"name\": \"em\",\n    \"type\": \"TEXT\",\n    \"valueHint\": \"{{email}}\"\n  },\n  {\n    \"macrosInSelect\": false,\n    \"selectItems\": [\n      {\n        \"displayValue\": \"Base Code Only (no event)\",\n        \"value\": \"\"\n      },\n      {\n        \"displayValue\": \"Add Payment Info\",\n        \"value\": \"addpaymentinfo\"\n      },\n      {\n        \"displayValue\": \"Add to Cart\",\n        \"value\": \"addtocart\"\n      },\n      {\n        \"displayValue\": \"Add to Wishlist\",\n        \"value\": \"addtowishlist\"\n      },\n      {\n        \"displayValue\": \"Checkout\",\n        \"value\": \"checkout\"\n      },\n      {\n        \"displayValue\": \"Contact\",\n        \"value\": \"contact\"\n      },\n      {\n        \"displayValue\": \"Custom (legacy)\",\n        \"value\": \"custom\"\n      },\n      {\n        \"displayValue\": \"Customize Product\",\n        \"value\": \"customizeproduct\"\n      },\n      {\n        \"displayValue\": \"Find Location\",\n        \"value\": \"findlocation\"\n      },\n      {\n        \"displayValue\": \"Initiate Checkout\",\n        \"value\": \"initiatecheckout\"\n      },\n      {\n        \"displayValue\": \"Lead\",\n        \"value\": \"lead\"\n      },\n      {\n        \"displayValue\": \"Page Visit\",\n        \"help\": \"Track visits to specific pages on your website.\",\n        \"value\": \"pagevisit\"\n      },\n      {\n        \"displayValue\": \"Schedule\",\n        \"value\": \"schedule\"\n      },\n      {\n        \"displayValue\": \"Search\",\n        \"value\": \"search\"\n      },\n      {\n        \"displayValue\": \"Signup\",\n        \"value\": \"signup\"\n      },\n      {\n        \"displayValue\": \"Start Trial\",\n        \"value\": \"starttrial\"\n      },\n      {\n        \"displayValue\": \"Submit Application\",\n        \"value\": \"submitapplication\"\n      },\n      {\n        \"displayValue\": \"Subscribe\",\n        \"value\": \"subscribe\"\n      },\n      {\n        \"displayValue\": \"View Category\",\n        \"value\": \"viewcategory\"\n      },\n      {\n        \"displayValue\": \"View Content\",\n        \"value\": \"viewcontent\"\n      },\n      {\n        \"displayValue\": \"Watch Video\",\n        \"value\": \"watchvideo\"\n      },\n      {\n        \"displayValue\": \"Custom Event\",\n        \"value\": \"ADE\"\n      }\n    ],\n    \"displayName\": \"Event to Fire\",\n    \"name\": \"eventName\",\n    \"type\": \"SELECT\"\n  },\n  {\n    \"help\": \"This allows you to define your own custom event name.\",\n    \"enablingConditions\": [\n      {\n        \"paramName\": \"eventName\",\n        \"type\": \"EQUALS\",\n        \"paramValue\": \"ADE\"\n      }\n    ],\n    \"valueValidators\": [\n      {\n        \"type\": \"NON_EMPTY\"\n      },\n      {\n        \"args\": [\n          \"^[a-zA-Z_]+$\"\n        ],\n        \"type\": \"REGEX\"\n      }\n    ],\n    \"displayName\": \"Event name:\",\n    \"name\": \"adeEventName\",\n    \"type\": \"TEXT\"\n  },\n  {\n    \"help\": \"Enter optional order information here. Setting these values is highly recommended to improve conversions and reporting.\",\n    \"enablingConditions\": [\n      {\n        \"paramName\": \"eventName\",\n        \"type\": \"EQUALS\",\n        \"paramValue\": \"checkout\"\n      },\n      {\n        \"paramName\": \"eventName\",\n        \"type\": \"EQUALS\",\n        \"paramValue\": \"addtocart\"\n      }\n    ],\n    \"displayName\": \"Cart Parameters\",\n    \"name\": \"checkout\",\n    \"groupStyle\": \"NO_ZIPPY\",\n    \"type\": \"GROUP\",\n    \"subParams\": [\n      {\n        \"help\": \"Make sure to set a currency code to ensure proper currency conversion; otherwise, we\\u0027ll default to USD.\",\n        \"displayName\": \"Order Value\",\n        \"name\": \"value\",\n        \"type\": \"TEXT\"\n      },\n      {\n        \"help\": \"Must be one of USD, GBP, CAD, EUR, AUD or NZD. If you don\\u0027t set a currency code, we\\u0027ll default to USD.\",\n        \"valueValidators\": [\n          {\n            \"args\": [\n              3,\n              3\n            ],\n            \"errorMessage\": \"Please enter a valid currency.\",\n            \"type\": \"STRING_LENGTH\"\n          }\n        ],\n        \"displayName\": \"Currency\",\n        \"name\": \"currency\",\n        \"type\": \"TEXT\"\n      },\n      {\n        \"valueValidators\": [\n          {\n            \"type\": \"NUMBER\"\n          }\n        ],\n        \"displayName\": \"Order Quantity\",\n        \"name\": \"order_quantity\",\n        \"type\": \"TEXT\"\n      },\n      {\n        \"displayName\": \"Order ID\",\n        \"simpleValueType\": true,\n        \"name\": \"order_id\",\n        \"type\": \"TEXT\"\n      }\n    ]\n  },\n  {\n    \"help\": \"These fields are required for dynamic retargeting on Pinterest. Optional otherwise.\",\n    \"enablingConditions\": [\n      {\n        \"paramName\": \"eventName\",\n        \"type\": \"EQUALS\",\n        \"paramValue\": \"pagevisit\"\n      },\n      {\n        \"paramName\": \"eventName\",\n        \"type\": \"EQUALS\",\n        \"paramValue\": \"addtocart\"\n      },\n      {\n        \"paramName\": \"eventName\",\n        \"type\": \"EQUALS\",\n        \"paramValue\": \"checkout\"\n      }\n    ],\n    \"displayName\": \"Line Items\",\n    \"name\": \"line_items\",\n    \"groupStyle\": \"NO_ZIPPY\",\n    \"type\": \"GROUP\",\n    \"subParams\": [\n      {\n        \"displayName\": \"Product ID\",\n        \"simpleValueType\": true,\n        \"name\": \"product_id\",\n        \"type\": \"TEXT\"\n      },\n      {\n        \"displayName\": \"Product Category\",\n        \"simpleValueType\": true,\n        \"name\": \"product_category\",\n        \"type\": \"TEXT\"\n      }\n    ]\n  },\n  {\n    \"help\": \"Optional field to set the lead type.\",\n    \"enablingConditions\": [\n      {\n        \"paramName\": \"eventName\",\n        \"type\": \"EQUALS\",\n        \"paramValue\": \"lead\"\n      },\n      {\n        \"paramName\": \"eventName\",\n        \"type\": \"EQUALS\",\n        \"paramValue\": \"signup\"\n      }\n    ],\n    \"displayName\": \"Lead Type\",\n    \"name\": \"lead_type\",\n    \"type\": \"TEXT\"\n  },\n  {\n    \"help\": \"Search Keywords\",\n    \"enablingConditions\": [\n      {\n        \"paramName\": \"eventName\",\n        \"type\": \"EQUALS\",\n        \"paramValue\": \"search\"\n      }\n    ],\n    \"displayName\": \"Search Query\",\n    \"name\": \"search_query\",\n    \"type\": \"TEXT\"\n  },\n  {\n    \"displayName\": \"\\u003cb\\u003eAdditional Parameters\\u003c/b\\u003e\",\n    \"name\": \"lbl_line\",\n    \"type\": \"LABEL\"\n  },\n  {\n    \"enablingConditions\": [\n      {\n        \"paramName\": \"eventName\",\n        \"type\": \"NOT_EQUALS\",\n        \"paramValue\": \"\"\n      }\n    ],\n    \"name\": \"setCustomParams\",\n    \"checkboxText\": \"Custom Parameters\",\n    \"type\": \"CHECKBOX\",\n    \"subParams\": [\n      {\n        \"enablingConditions\": [\n          {\n            \"paramName\": \"setCustomParams\",\n            \"type\": \"EQUALS\",\n            \"paramValue\": true\n          }\n        ],\n        \"displayName\": \"\",\n        \"name\": \"customParameters\",\n        \"groupStyle\": \"NO_ZIPPY\",\n        \"type\": \"GROUP\",\n        \"subParams\": [\n          {\n            \"name\": \"values\",\n            \"simpleTableColumns\": [\n              {\n                \"selectItems\": [],\n                \"defaultValue\": \"\",\n                \"displayName\": \"Name\",\n                \"name\": \"name\",\n                \"type\": \"TEXT\"\n              },\n              {\n                \"defaultValue\": \"\",\n                \"displayName\": \"Value\",\n                \"name\": \"value\",\n                \"type\": \"TEXT\"\n              }\n            ],\n            \"type\": \"SIMPLE_TABLE\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"help\": \"If checked, you could add \\u0027pd\\u0027 parameters within the request.\",\n    \"enablingConditions\": [\n      {\n        \"paramName\": \"eventName\",\n        \"type\": \"NOT_EQUALS\",\n        \"paramValue\": \"\"\n      }\n    ],\n    \"simpleValueType\": true,\n    \"name\": \"setPdParams\",\n    \"checkboxText\": \"Partner Data Parameters\",\n    \"type\": \"CHECKBOX\",\n    \"subParams\": [\n      {\n        \"enablingConditions\": [\n          {\n            \"paramName\": \"setPdParams\",\n            \"type\": \"EQUALS\",\n            \"paramValue\": true\n          }\n        ],\n        \"displayName\": \"\",\n        \"name\": \"pdParameters\",\n        \"simpleTableColumns\": [\n          {\n            \"valueValidators\": [\n              {\n                \"type\": \"NON_EMPTY\"\n              }\n            ],\n            \"selectItems\": [\n              {\n                \"displayValue\": \"External Id\",\n                \"value\": \"external_id\"\n              },\n              {\n                \"displayValue\": \"Maid\",\n                \"value\": \"maid\"\n              }\n            ],\n            \"defaultValue\": \"external_id\",\n            \"displayName\": \"Name\",\n            \"name\": \"name\",\n            \"isUnique\": true,\n            \"type\": \"SELECT\"\n          },\n          {\n            \"defaultValue\": \"\",\n            \"displayName\": \"Value\",\n            \"name\": \"value\",\n            \"type\": \"TEXT\"\n          }\n        ],\n        \"type\": \"SIMPLE_TABLE\"\n      }\n    ]\n  },\n  {\n    \"help\": \"If checked, you could set the Opt Out Information for Privacy regulations such as CCPA.\",\n    \"simpleValueType\": true,\n    \"name\": \"setOptOut\",\n    \"checkboxText\": \"Opt Out Information\",\n    \"type\": \"CHECKBOX\"\n  },\n  {\n    \"help\": \"\\u0027opt_out_type\\u0027 is the field where we accept opt outs for your users\\u0027 privacy preference. \\u003cbr\\u003e\\u003cbr\\u003e It can handle multiple values with commas separated. Current accepted value is \\u003cb\\u003eLDP\\u003c/b\\u003e for Limited Data Processing.\",\n    \"enablingConditions\": [\n      {\n        \"paramName\": \"setOptOut\",\n        \"type\": \"EQUALS\",\n        \"paramValue\": true\n      }\n    ],\n    \"displayName\": \"Opt Out Type\",\n    \"name\": \"opt_out_type\",\n    \"type\": \"TEXT\"\n  },\n  {\n    \"help\": \"\\u0027st\\u0027 is the field for sharing a user\\u0027s \\u003cb\\u003estate of residency\\u003c/b\\u003e in connection with use of the LDP flag. Please note that the LDP flag does not currently have any effect for users outside of the State of California. \\u003cbr\\u003e\\u003cbr\\u003e The state names we accept are SHA256 hashed, standard USPS state abbreviations with two characters (e.g., \\u0027CA\\u0027).\",\n    \"enablingConditions\": [\n      {\n        \"paramName\": \"setOptOut\",\n        \"type\": \"EQUALS\",\n        \"paramValue\": true\n      }\n    ],\n    \"displayName\": \"State\",\n    \"name\": \"st\",\n    \"type\": \"TEXT\"\n  },\n  {\n    \"help\": \"\\u0027country\\u0027 is the field in which you pass a user\u2019s country of residency in connection with use of the LDP flag. Please note that the LDP flag does not currently have any effect for users outside of the State of California. \\u003cbr\\u003e\\u003cbr\\u003e The country names we accept are SHA256 hashed, standard ISO-3166 country codes with two characters (e.g., \\u0027US\\u0027, \\u0027DE\\u0027).\",\n    \"enablingConditions\": [\n      {\n        \"paramName\": \"setOptOut\",\n        \"type\": \"EQUALS\",\n        \"paramValue\": true\n      }\n    ],\n    \"displayName\": \"Country\",\n    \"name\": \"country\",\n    \"type\": \"TEXT\"\n  },\n  {\n    \"displayName\": \"\\u003cb\\u003eEnable automatic enhanced match? \\u003c/b\\u003eAutomatic enhanced match can help attribute more conversions to your Pinterest ads and increase audience sizes. Navigate to \\u003ca href\\u003d\\\"https://ads.pinterest.com/conversions/tag\\\"\\u003ePinterest Ads Manager\\u003c/a\\u003e to enable. \\u003ca href\\u003d\\\"https://help.pinterest.com/business/article/automatic-enhanced-match\\\"\\u003eLearn more\\u003c/a\\u003e\\u003c/br\\u003e\",\n    \"name\": \"aem_upsell\",\n    \"type\": \"LABEL\"\n  }\n]\n\n\n___SANDBOXED_JS_FOR_WEB_TEMPLATE___\n\nconst copyFromWindow = require('copyFromWindow');\nconst createArgumentsQueue = require('createArgumentsQueue');\nconst injectScript = require('injectScript');\nconst log = require('logToConsole');\nconst makeTableMap = require('makeTableMap');\nconst JSON = require('JSON');\n\n/**\n * This GTM snippet takes care of loading the Pinterest tag and firing events.\n * It is roughly equivalent to installing the Pinterest Tag base code and then\n * using pintrk() to fire events. It will do the base tag functionality only\n * once so you can load and call this multiple times without worrying multiple\n * loads, etc.\n */\nlog('GTM PTag v1.4; tagId: ' + data.tagId);\n\n// Check to see if we've already created the queue.\nconst isFirstLoad = !copyFromWindow('pintrk');\n\n// Set up window.pintrk. Won't re-create if it already exists.\nconst pintrk = createArgumentsQueue('pintrk', 'pintrk.queue');\n\n/**\n * First-time Load/Initialization.\n */\nif (isFirstLoad) {\n  // OK to call 'load' and 'page' events before injecting script,\n  // it will process existing items in the queue on load.\n  const initializationData = {\n    'np': 'gtm',\n    'gtm_version': 'gallery' // To identify the gtm version: legacy vs gallery\n  };\n  if (data.em) {\n    initializationData.em = data.em;\n  }\n  // Set opt_out params\n  setOptOutParams(data, initializationData);\n  // Copy pd parameters, if any, into initializationData.\n  overridePartnerData(data, initializationData);\n  pintrk('load', data.tagId.toString(), initializationData);\n  pintrk('page');\n} else {\n  const partnerDataUpdate = {};\n  if (data.em) {\n    partnerDataUpdate.em = data.em;\n  }\n  // Override opt_out params\n  overrideOptOutParams(data, partnerDataUpdate);\n\n  // Copy pd parameters, if any, into partnerDataUpdate.\n  overridePartnerData(data, partnerDataUpdate);\n\n  pintrk('set', partnerDataUpdate);\n}\n\n// Special case: this if block is written to handle the case where the base\n// code is fired after another event, which would cause isFirstLoad to run\n// but not include config values\nif (data.eventName === \"\") {\n  const partnerDataUpdate = {};\n  setOptOutParams(data, partnerDataUpdate);\n  overridePartnerData(data, partnerDataUpdate);\n  pintrk('set', partnerDataUpdate);\n}\n\n// Set opt_out params\nfunction setOptOutParams(data, pdObject) {\n  if (data.setOptOut) {\n    if (data.opt_out_type) {\n      pdObject.opt_out_type = data.opt_out_type;\n    }\n    if (data.st) {\n      pdObject.st = data.st;\n    }\n    if (data.country) {\n      pdObject.country = data.country;\n    }\n  }\n}\n\n// Override opt_out params\nfunction overrideOptOutParams(data, pdObject) {\n  if (data.setOptOut) {\n    pdObject.opt_out_type = data.opt_out_type ? data.opt_out_type : undefined;\n    pdObject.st = data.st ? data.st : undefined;\n    pdObject.country = data.country ? data.country : undefined;\n  } else {\n    pdObject.opt_out_type = undefined;\n    pdObject.st = undefined;\n    pdObject.country = undefined;\n  }\n}\n\n// Override 'pd'\nfunction overridePartnerData(data, pdObject) {\n  if (data.setPdParams) {\n    data.pdParameters.forEach(d => {\n      if (d.value) {\n        pdObject[d.name] = d.value;\n      }\n    });\n  }\n}\n\n/**\n * Define function to setup event data and call pintrk() as needed.\n * Intentionally verbose for completeness.\n */\nconst onSuccess = function() {\n\n  let eventData = {};\n\n  // Copy custom parameters, if any, into eventData.\n  // This copies the params only from the table 'customParameters' to eventData\n  // We do this first so that in case someone has defined\n  // a custom parameter with the same name as a top-level\n  // field, then the top-level field will take precedence.\n  if (data.setCustomParams) {\n    eventData = makeTableMap(data.values, 'name', 'value');\n  }\n\n  // In the extremely unlikely event that someone has created a 'np'\n  // custom field, we make sure to override that.\n  eventData.np = 'gtm';\n  eventData.gtm_version = 'gallery';\n\n  const safeCopyField = (fieldName) => {\n    if (data[fieldName] !== undefined) {\n      eventData[fieldName] = data[fieldName];\n    }\n  };\n\n  const safeCopyLineItem = (fieldName) => {\n    if (data[fieldName] !== undefined) {\n      if (eventData.line_items === undefined) {\n        eventData.line_items = [{}];\n      }\n      eventData.line_items[0][fieldName] = data[fieldName];\n    }\n  };\n\n  switch (data.eventName) {\n    case 'watchvideo':   // No fields defined.\n    case 'viewcategory': // No fields defined.\n    case 'custom':       // Only custom fields, none preconfigured.\n      break;\n    case 'signup':       // Signup and Lead share the same single field.\n    case 'lead':\n      safeCopyField('lead_type');\n      break;\n    case 'search':\n      safeCopyField('search_query');\n      break;\n    case 'addtocart':    // AddToCart and Checkout share the same fields.\n    case 'checkout':\n      safeCopyField('order_id');\n      safeCopyField('order_quantity');\n      safeCopyField('value');\n      safeCopyField('currency');\n      // Intentional fall-through, page vist has only ID and category.\n    case 'pagevisit':\n      safeCopyLineItem('product_id');\n      safeCopyLineItem('product_category');\n      break;\n    default:\n      // Just fallthrough as server-side code will take care of\n      // emitting an error message to the console.\n      break;\n  }\n\n  if (data.eventName !== '') {\n    let finalEventName = data.eventName;\n\n    // ADE events\n    if (finalEventName === 'ADE') {\n      log('ADE name: ' + data.adeEventName);\n      finalEventName = data.adeEventName;\n    }\n\n    log('Firing Pinterest event: ' + finalEventName);\n    log('Event Data:' + JSON.stringify(eventData));\n    pintrk('track', finalEventName, eventData);\n  }\n  data.gtmOnSuccess();\n};\n\n/**\n * Failure callback; server-size JS didn't load, log error and exit.\n */\nconst onFailure = function() {\n  log('Pinterest Error: Loading JS failed!');\n  data.gtmOnFailure();\n};\n\n// Async load\ninjectScript(\"https://s.pinimg.com/ct/core.js\", onSuccess, onFailure, 'PinterestJS');\n\n\n___WEB_PERMISSIONS___\n\n[\n  {\n    \"instance\": {\n      \"key\": {\n        \"publicId\": \"access_globals\",\n        \"versionId\": \"1\"\n      },\n      \"param\": [\n        {\n          \"key\": \"keys\",\n          \"value\": {\n            \"type\": 2,\n            \"listItem\": [\n              {\n                \"type\": 3,\n                \"mapKey\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"key\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"read\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"write\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"execute\"\n                  }\n                ],\n                \"mapValue\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"pintrk\"\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  }\n                ]\n              },\n              {\n                \"type\": 3,\n                \"mapKey\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"key\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"read\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"write\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"execute\"\n                  }\n                ],\n                \"mapValue\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"pintrk.queue\"\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  }\n                ]\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"clientAnnotations\": {\n      \"isEditedByUser\": true\n    },\n    \"isRequired\": true\n  },\n  {\n    \"instance\": {\n      \"key\": {\n        \"publicId\": \"logging\",\n        \"versionId\": \"1\"\n      },\n      \"param\": [\n        {\n          \"key\": \"environments\",\n          \"value\": {\n            \"type\": 1,\n            \"string\": \"debug\"\n          }\n        }\n      ]\n    },\n    \"clientAnnotations\": {\n      \"isEditedByUser\": true\n    },\n    \"isRequired\": true\n  },\n  {\n    \"instance\": {\n      \"key\": {\n        \"publicId\": \"inject_script\",\n        \"versionId\": \"1\"\n      },\n      \"param\": [\n        {\n          \"key\": \"urls\",\n          \"value\": {\n            \"type\": 2,\n            \"listItem\": [\n              {\n                \"type\": 1,\n                \"string\": \"https://s.pinimg.com/ct/core.js\"\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"clientAnnotations\": {\n      \"isEditedByUser\": true\n    },\n    \"isRequired\": true\n  }\n]\n\n\n___TESTS___\n\nscenarios: []\n\n\n___NOTES___\n\nPoints of Contact:\n\nLijun Yan <lyan@pinterest.com>\nYuchen Mou <ymou@pinterest.com>\nJian Li <jianli@pinterest.com>\nMirko J. Rodriguez Mallma <mrodriguezmallma@pinterest.com>\nJohn Abdou <jabdou@pinterest.com>\n\nCreated on 2/19/2019, 9:22:34 PM\nUpdated on 3/4/2026, 12:00:00 PM\n\n\n",
        "galleryReference": {
          "host": "github.com",
          "owner": "pinterest",
          "repository": "ws-gtm-template",
          "version": "3badb27cff68a322d97aa9d3a121818fdf596e0e",
          "signature": "49dec3368fd437547bb2a26ae3b2cad929f88c3f81e934cb55c425e8a9c1e98e",
          "galleryTemplateId": "NGMPN"
        }
      }
    ],
    "name": "CAPI Suite \u2014 Meta + TikTok + Pinterest + GA4 + Google Ads \u2014 3.11.0",
    "description": "Bundled with CAPI Suite. Browser-side tags for Meta Pixel, TikTok Pixel, Pinterest Tag, Google Analytics 4 and Google Ads. Custom Templates: Meta Pixel, TikTok Pixel, Pinterest Pixel Tag. The sale tags fire on the mcapi_sale event this plugin pushes, not on any purchase event, so another plugin's purchase push cannot become a conversion. Pinterest - Checkout ships paused on purpose -- read its note before enabling it."
  }
}