CINXE.COM
GDPR-Transparency-and-Consent-Framework/TCFv2/IAB Tech Lab - CMP API v2.md at master · InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework · GitHub
<!DOCTYPE html> <html lang="en" data-color-mode="auto" data-light-theme="light" data-dark-theme="dark" data-a11y-animated-images="system" data-a11y-link-underlines="true" > <head> <meta charset="utf-8"> <link rel="dns-prefetch" href="https://github.githubassets.com"> <link rel="dns-prefetch" href="https://avatars.githubusercontent.com"> <link rel="dns-prefetch" href="https://github-cloud.s3.amazonaws.com"> <link rel="dns-prefetch" href="https://user-images.githubusercontent.com/"> <link rel="preconnect" href="https://github.githubassets.com" crossorigin> <link rel="preconnect" href="https://avatars.githubusercontent.com"> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/light-3e154969b9f9.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/dark-9c5b7a476542.css" /><link data-color-theme="dark_dimmed" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_dimmed-afda8eb0fb33.css" /><link data-color-theme="dark_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_high_contrast-2494e44ccdc5.css" /><link data-color-theme="dark_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_colorblind-56fff47acadc.css" /><link data-color-theme="light_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_colorblind-71cd4cc132ec.css" /><link data-color-theme="light_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_high_contrast-fd5499848985.css" /><link data-color-theme="light_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_tritanopia-31d17ba3e139.css" /><link data-color-theme="dark_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_tritanopia-68d6b2c79663.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-primitives-4cf0d59ab51a.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-af846850481e.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/global-e41ff91f8baa.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/github-d3b66f11d613.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/repository-1e3bbbee6b91.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/code-a0610fd00b47.css" /> <script type="application/json" id="client-env">{"locale":"en","featureFlags":["copilot_new_references_ui","copilot_beta_features_opt_in","copilot_chat_static_thread_suggestions","copilot_conversational_ux_history_refs","copilot_implicit_context","copilot_smell_icebreaker_ux","experimentation_azure_variant_endpoint","failbot_handle_non_errors","geojson_azure_maps","ghost_pilot_confidence_truncation_25","ghost_pilot_confidence_truncation_40","hovercard_accessibility","issues_react_new_timeline","issues_react_avatar_refactor","issues_react_remove_placeholders","issues_react_cache_fix_workaround","issues_react_blur_item_picker_on_close","marketing_pages_search_explore_provider","remove_child_patch","sample_network_conn_type","site_metered_billing_update","issues_react_first_time_contribution_banner","jk_navigation_in_list_view","ui_commands_respect_modals","lifecycle_label_name_updates"]}</script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/wp-runtime-118ecaabd77e.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_dompurify_dist_purify_js-b73fdff77a4e.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_oddbird_popover-polyfill_dist_popover_js-aff936e590ed.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_arianotify-polyfill_ariaNotify-polyfill_js-node_modules_github_mi-247092-740e4ddd559d.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_failbot_failbot_ts-a46544e9ee5e.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/environment-cd35650c2e9c.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_primer_behaviors_dist_esm_index_mjs-4aa4b0e95669.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_selector-observer_dist_index_esm_js-f690fd9ae3d5.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_relative-time-element_dist_index_js-6d3967acd51c.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_combobox-nav_dist_index_js-node_modules_github_g-emoji-element_di-6ce195-53781cbc550f.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_auto-complete-element_dist_index_js-node_modules_github_catalyst_-6afc16-3cdfa69a0406.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_text-expander-element_dist_index_js-f5498b8d4e5d.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_filter-input-element_dist_index_js-node_modules_github_remote-inp-b5f1d7-492b5042c841.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_index_js-node_modules_stacktrace-parser_dist_s-1f651a-1e3d784c897c.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_file-attachment-element_dist_index_js-node_modules_primer_view-co-7671f1-dc6cac136d88.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/github-elements-71486356f507.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/element-registry-e3ab8405ef80.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_braintree_browser-detection_dist_browser-detection_js-node_modules_githu-bb80ec-634de60bacfa.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_lit-html_lit-html_js-ce7225a304c5.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_hydro-analytics-client_dist_analytics-client_js-node_modules_gith-f3aee1-e6893db9c19e.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_index_js-node_modules_morphdom_dist_morphdom-e-7c534c-f8a5485c982a.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_turbo_dist_turbo_es2017-esm_js-858e043fcf76.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_remote-form_dist_index_js-node_modules_delegated-events_dist_inde-893f9f-6cf3320416b8.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_scroll-anchoring_dist_scroll-anchoring_esm_js-node_modules_stacktrace-pa-a71630-6f3c4f0189d8.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_color-convert_index_js-0e07cc183eed.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_quote-selection_dist_index_js-node_modules_github_session-resume_-0b5e12-889cec8cf448.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_updatable-content_updatable-content_ts-eae9df0dd562.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_behaviors_task-list_ts-app_assets_modules_github_sso_ts-ui_packages-900dde-18d1c91a7872.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_sticky-scroll-into-view_ts-7cbef09a422c.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_behaviors_ajax-error_ts-app_assets_modules_github_behaviors_include-d0d0a6-0e9fa537dc4f.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_behaviors_commenting_edit_ts-app_assets_modules_github_behaviors_ht-83c235-c89801ebbe15.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/behaviors-93287f4de493.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_delegated-events_dist_index_js-node_modules_github_catalyst_lib_index_js-f6223d90c7ba.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/notifications-global-3366f6b6298e.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_index_js-node_modules_github_catalyst_lib_inde-dbbea9-9b97703a4e6a.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/code-menu-3118a76a2829.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/primer-react-765944243383.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/react-core-cd0a67881543.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/react-lib-7b7b5264f6c1.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/octicons-react-45c3a19dd792.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_emotion_is-prop-valid_dist_emotion-is-prop-valid_esm_js-node_modules_emo-62da9f-54c0c921f04b.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_index_js-node_modules_stacktrace-parser_dist_s-e7dcdd-285fc29e9fa5.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_oddbird_popover-polyfill_dist_popover-fn_js-4896ddd4b7bb.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_lodash-es__Stack_js-node_modules_lodash-es__Uint8Array_js-node_modules_l-4faaa6-13a0602a5edf.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_lodash-es__baseIsEqual_js-8929eb9718d5.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_hydro-analytics-client_dist_analytics-client_js-node_modules_gith-9002b0-8e5e346f0cbe.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_aria-live_aria-live_ts-ui_packages_promise-with-resolvers-polyfill_promise-with-r-014121-e1792bd5a31e.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_paths_index_ts-193243317670.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_ref-selector_RefSelector_tsx-7a75d9f22fe9.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_code-view-shared_utilities_web-worker_ts-ui_packages_code-view-shared_worker-jobs-7fe572-0d8f4a2976ee.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_hydro-analytics_hydro-analytics_ts-ui_packages_verified-fetch_verified-fetch_ts-u-4672d1-0996d093463a.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_code-view-shared_hooks_use-canonical-object_ts-ui_packages_code-view-shared_utili-228da6-37a4eeff405d.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_code-view-shared_hooks_use-file-page-payload_ts-ui_packages_code-view-shared_comp-1beb66-b07e414af699.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_blob-anchor_ts-ui_packages_code-nav_code-nav_ts-ui_packages_filter--8253c1-87c39cb5708f.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/react-code-view-6462e4b9d310.js"></script> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.9fa170e9435ed4b922b9.module.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/react-code-view.6b587a69b593e23c3657.module.css" /> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/primer-react-765944243383.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/react-core-cd0a67881543.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/react-lib-7b7b5264f6c1.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/octicons-react-45c3a19dd792.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_emotion_is-prop-valid_dist_emotion-is-prop-valid_esm_js-node_modules_emo-62da9f-54c0c921f04b.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_index_js-node_modules_stacktrace-parser_dist_s-e7dcdd-285fc29e9fa5.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_oddbird_popover-polyfill_dist_popover-fn_js-4896ddd4b7bb.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/notifications-subscriptions-menu-1490f5bef85d.js"></script> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.9fa170e9435ed4b922b9.module.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/notifications-subscriptions-menu.1bcff9205c241e99cff2.module.css" /> <title>GDPR-Transparency-and-Consent-Framework/TCFv2/IAB Tech Lab - CMP API v2.md at master · InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework · GitHub</title> <meta name="route-pattern" content="/:user_id/:repository/blob/*name(/*path)" data-turbo-transient> <meta name="route-controller" content="blob" data-turbo-transient> <meta name="route-action" content="show" data-turbo-transient> <meta name="current-catalog-service-hash" content="f3abb0cc802f3d7b95fc8762b94bdcb13bf39634c40c357301c4aa1d67a256fb"> <meta name="request-id" content="9FEE:B3FFC:70F27:8329A:6742368B" data-pjax-transient="true"/><meta name="html-safe-nonce" content="c3b160345275feffecb999cd3aac6426e834b46873d46e588f222e4fdbdab13c" data-pjax-transient="true"/><meta name="visitor-payload" content="eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI5RkVFOkIzRkZDOjcwRjI3OjgzMjlBOjY3NDIzNjhCIiwidmlzaXRvcl9pZCI6IjY4MjM0MTAxNTU0MzEwMTYwNzUiLCJyZWdpb25fZWRnZSI6InNvdXRoZWFzdGFzaWEiLCJyZWdpb25fcmVuZGVyIjoic291dGhlYXN0YXNpYSJ9" data-pjax-transient="true"/><meta name="visitor-hmac" content="8b5a78d75de2a32b59179c6f835353a11b24347f0162db553f62873e4450e465" data-pjax-transient="true"/> <meta name="hovercard-subject-tag" content="repository:124251337" data-turbo-transient> <meta name="github-keyboard-shortcuts" content="repository,source-code,file-tree,copilot" data-turbo-transient="true" /> <meta name="selected-link" value="repo_source" data-turbo-transient> <link rel="assets" href="https://github.githubassets.com/"> <meta name="google-site-verification" content="Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I"> <meta name="octolytics-url" content="https://collector.github.com/github/collect" /> <meta name="analytics-location" content="/<user-name>/<repo-name>/blob/show" data-turbo-transient="true" /> <meta name="user-login" content=""> <meta name="viewport" content="width=device-width"> <meta name="description" content="Technical specifications for IAB Europe Transparency and Consent Framework that will help the digital advertising industry interpret and comply with EU rules on data protection and privacy - notably the General Data Protection Regulation (GDPR) that comes into effect on May 25, 2018. - GDPR-Transparency-and-Consent-Framework/TCFv2/IAB Tech Lab - CMP API v2.md at master · InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework"> <link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="GitHub"> <link rel="fluid-icon" href="https://github.com/fluidicon.png" title="GitHub"> <meta property="fb:app_id" content="1401488693436528"> <meta name="apple-itunes-app" content="app-id=1477376905, app-argument=https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md" /> <meta name="twitter:image" content="https://opengraph.githubassets.com/5366f6e83a7bc270bb9a2b0ecb9ea113fb8f4020cc6914de351dd13e1856b1d4/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework" /><meta name="twitter:site" content="@github" /><meta name="twitter:card" content="summary_large_image" /><meta name="twitter:title" content="GDPR-Transparency-and-Consent-Framework/TCFv2/IAB Tech Lab - CMP API v2.md at master · InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework" /><meta name="twitter:description" content="Technical specifications for IAB Europe Transparency and Consent Framework that will help the digital advertising industry interpret and comply with EU rules on data protection and privacy - notabl..." /> <meta property="og:image" content="https://opengraph.githubassets.com/5366f6e83a7bc270bb9a2b0ecb9ea113fb8f4020cc6914de351dd13e1856b1d4/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework" /><meta property="og:image:alt" content="Technical specifications for IAB Europe Transparency and Consent Framework that will help the digital advertising industry interpret and comply with EU rules on data protection and privacy - notabl..." /><meta property="og:image:width" content="1200" /><meta property="og:image:height" content="600" /><meta property="og:site_name" content="GitHub" /><meta property="og:type" content="object" /><meta property="og:title" content="GDPR-Transparency-and-Consent-Framework/TCFv2/IAB Tech Lab - CMP API v2.md at master · InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework" /><meta property="og:url" content="https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md" /><meta property="og:description" content="Technical specifications for IAB Europe Transparency and Consent Framework that will help the digital advertising industry interpret and comply with EU rules on data protection and privacy - notabl..." /> <meta name="hostname" content="github.com"> <meta name="expected-hostname" content="github.com"> <meta http-equiv="x-pjax-version" content="272935131c2027f789efabd5bf30904ffaea35908a22afd03d8f75128cee7e1b" data-turbo-track="reload"> <meta http-equiv="x-pjax-csp-version" content="ace39c3b6632770952207593607e6e0be0db363435a8b877b1f96abe6430f345" data-turbo-track="reload"> <meta http-equiv="x-pjax-css-version" content="8968ee26e93ec8c6d3c4e91c77fb9d206091689d451ebbcddeca3832587a5b30" data-turbo-track="reload"> <meta http-equiv="x-pjax-js-version" content="c4972ae1cf5d4607c47252349fc1b47a24ff0ea303e5a8fbbe18ec27725a87ee" data-turbo-track="reload"> <meta name="turbo-cache-control" content="no-preview" data-turbo-transient=""> <meta name="turbo-cache-control" content="no-cache" data-turbo-transient> <meta data-hydrostats="publish"> <meta name="go-import" content="github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework git https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework.git"> <meta name="octolytics-dimension-user_id" content="8918196" /><meta name="octolytics-dimension-user_login" content="InteractiveAdvertisingBureau" /><meta name="octolytics-dimension-repository_id" content="124251337" /><meta name="octolytics-dimension-repository_nwo" content="InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework" /><meta name="octolytics-dimension-repository_public" content="true" /><meta name="octolytics-dimension-repository_is_fork" content="false" /><meta name="octolytics-dimension-repository_network_root_id" content="124251337" /><meta name="octolytics-dimension-repository_network_root_nwo" content="InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework" /> <meta name="turbo-body-classes" content="logged-out env-production page-responsive"> <meta name="browser-stats-url" content="https://api.github.com/_private/browser/stats"> <meta name="browser-errors-url" content="https://api.github.com/_private/browser/errors"> <link rel="mask-icon" href="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" color="#000000"> <link rel="alternate icon" class="js-site-favicon" type="image/png" href="https://github.githubassets.com/favicons/favicon.png"> <link rel="icon" class="js-site-favicon" type="image/svg+xml" href="https://github.githubassets.com/favicons/favicon.svg" data-base-href="https://github.githubassets.com/favicons/favicon"> <meta name="theme-color" content="#1e2327"> <meta name="color-scheme" content="light dark" /> <link rel="manifest" href="/manifest.json" crossOrigin="use-credentials"> </head> <body class="logged-out env-production page-responsive" style="word-wrap: break-word;"> <div data-turbo-body class="logged-out env-production page-responsive" style="word-wrap: break-word;"> <div class="position-relative header-wrapper js-header-wrapper "> <a href="#start-of-content" data-skip-target-assigned="false" class="px-2 py-4 color-bg-accent-emphasis color-fg-on-emphasis show-on-focus js-skip-to-content">Skip to content</a> <span data-view-component="true" class="progress-pjax-loader Progress position-fixed width-full"> <span style="width: 0%;" data-view-component="true" class="Progress-item progress-pjax-loader-bar left-0 top-0 color-bg-accent-emphasis"></span> </span> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_ui-commands_ui-commands_ts-d25fac54a6bc.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/keyboard-shortcuts-dialog-ed30662f9578.js"></script> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.9fa170e9435ed4b922b9.module.css" /> <react-partial partial-name="keyboard-shortcuts-dialog" data-ssr="false" data-attempted-ssr="false" > <script type="application/json" data-target="react-partial.embeddedData">{"props":{"docsUrl":"https://docs.github.com/get-started/accessibility/keyboard-shortcuts"}}</script> <div data-target="react-partial.reactRoot"></div> </react-partial> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_remote-form_dist_index_js-node_modules_delegated-events_dist_inde-94fd67-cf3dd69d89eb.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/sessions-8fa3b694f335.js"></script> <header class="HeaderMktg header-logged-out js-details-container js-header Details f4 py-3" role="banner" data-is-top="true" data-color-mode=light data-light-theme=light data-dark-theme=dark> <h2 class="sr-only">Navigation Menu</h2> <button type="button" class="HeaderMktg-backdrop d-lg-none border-0 position-fixed top-0 left-0 width-full height-full js-details-target" aria-label="Toggle navigation"> <span class="d-none">Toggle navigation</span> </button> <div class="d-flex flex-column flex-lg-row flex-items-center px-3 px-md-4 px-lg-5 height-full position-relative z-1"> <div class="d-flex flex-justify-between flex-items-center width-full width-lg-auto"> <div class="flex-1"> <button aria-label="Toggle navigation" aria-expanded="false" type="button" data-view-component="true" class="js-details-target js-nav-padding-recalculate js-header-menu-toggle Button--link Button--medium Button d-lg-none color-fg-inherit p-1"> <span class="Button-content"> <span class="Button-label"><div class="HeaderMenu-toggle-bar rounded my-1"></div> <div class="HeaderMenu-toggle-bar rounded my-1"></div> <div class="HeaderMenu-toggle-bar rounded my-1"></div></span> </span> </button> </div> <a class="mr-lg-3 color-fg-inherit flex-order-2 js-prevent-focus-on-mobile-nav" href="/" aria-label="Homepage" data-analytics-event="{"category":"Marketing nav","action":"click to go to homepage","label":"ref_page:Marketing;ref_cta:Logomark;ref_loc:Header"}"> <svg height="32" aria-hidden="true" viewBox="0 0 24 24" version="1.1" width="32" data-view-component="true" class="octicon octicon-mark-github"> <path d="M12.5.75C6.146.75 1 5.896 1 12.25c0 5.089 3.292 9.387 7.863 10.91.575.101.79-.244.79-.546 0-.273-.014-1.178-.014-2.142-2.889.532-3.636-.704-3.866-1.35-.13-.331-.69-1.352-1.18-1.625-.402-.216-.977-.748-.014-.762.906-.014 1.553.834 1.769 1.179 1.035 1.74 2.688 1.25 3.349.948.1-.747.402-1.25.733-1.538-2.559-.287-5.232-1.279-5.232-5.678 0-1.25.445-2.285 1.178-3.09-.115-.288-.517-1.467.115-3.048 0 0 .963-.302 3.163 1.179.92-.259 1.897-.388 2.875-.388.977 0 1.955.13 2.875.388 2.2-1.495 3.162-1.179 3.162-1.179.633 1.581.23 2.76.115 3.048.733.805 1.179 1.825 1.179 3.09 0 4.413-2.688 5.39-5.247 5.678.417.36.776 1.05.776 2.128 0 1.538-.014 2.774-.014 3.162 0 .302.216.662.79.547C20.709 21.637 24 17.324 24 12.25 24 5.896 18.854.75 12.5.75Z"></path> </svg> </a> <div class="flex-1 flex-order-2 text-right"> <a href="/login?return_to=https%3A%2F%2Fgithub.com%2FInteractiveAdvertisingBureau%2FGDPR-Transparency-and-Consent-Framework%2Fblob%2Fmaster%2FTCFv2%2FIAB%2520Tech%2520Lab%2520-%2520CMP%2520API%2520v2.md" class="HeaderMenu-link HeaderMenu-button d-inline-flex d-lg-none flex-order-1 f5 no-underline border color-border-default rounded-2 px-2 py-1 color-fg-inherit js-prevent-focus-on-mobile-nav" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"site header menu","repository_id":null,"auth_type":"SIGN_UP","originating_url":"https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md","user_id":null}}" data-hydro-click-hmac="d57e92b1e96573417bc8f97981cb2f5efaf4385caacf976c0f65732cb501e5ca" data-analytics-event="{"category":"Marketing nav","action":"click to Sign in","label":"ref_page:Marketing;ref_cta:Sign in;ref_loc:Header"}" > Sign in </a> </div> </div> <div class="HeaderMenu js-header-menu height-fit position-lg-relative d-lg-flex flex-column flex-auto top-0"> <div class="HeaderMenu-wrapper d-flex flex-column flex-self-start flex-lg-row flex-auto rounded rounded-lg-0"> <nav class="HeaderMenu-nav" aria-label="Global"> <ul class="d-lg-flex list-style-none"> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Product <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4 d-lg-flex flex-wrap dropdown-menu-wide"> <div class="HeaderMenu-column px-lg-4 border-lg-right mb-4 mb-lg-0 pr-lg-7"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0"> <ul class="list-style-none f5" > <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"github_copilot","context":"product","tag":"link","label":"github_copilot_link_product_navbar"}" href="https://github.com/features/copilot"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-copilot color-fg-subtle mr-3"> <path d="M23.922 16.992c-.861 1.495-5.859 5.023-11.922 5.023-6.063 0-11.061-3.528-11.922-5.023A.641.641 0 0 1 0 16.736v-2.869a.841.841 0 0 1 .053-.22c.372-.935 1.347-2.292 2.605-2.656.167-.429.414-1.055.644-1.517a10.195 10.195 0 0 1-.052-1.086c0-1.331.282-2.499 1.132-3.368.397-.406.89-.717 1.474-.952 1.399-1.136 3.392-2.093 6.122-2.093 2.731 0 4.767.957 6.166 2.093.584.235 1.077.546 1.474.952.85.869 1.132 2.037 1.132 3.368 0 .368-.014.733-.052 1.086.23.462.477 1.088.644 1.517 1.258.364 2.233 1.721 2.605 2.656a.832.832 0 0 1 .053.22v2.869a.641.641 0 0 1-.078.256ZM12.172 11h-.344a4.323 4.323 0 0 1-.355.508C10.703 12.455 9.555 13 7.965 13c-1.725 0-2.989-.359-3.782-1.259a2.005 2.005 0 0 1-.085-.104L4 11.741v6.585c1.435.779 4.514 2.179 8 2.179 3.486 0 6.565-1.4 8-2.179v-6.585l-.098-.104s-.033.045-.085.104c-.793.9-2.057 1.259-3.782 1.259-1.59 0-2.738-.545-3.508-1.492a4.323 4.323 0 0 1-.355-.508h-.016.016Zm.641-2.935c.136 1.057.403 1.913.878 2.497.442.544 1.134.938 2.344.938 1.573 0 2.292-.337 2.657-.751.384-.435.558-1.15.558-2.361 0-1.14-.243-1.847-.705-2.319-.477-.488-1.319-.862-2.824-1.025-1.487-.161-2.192.138-2.533.529-.269.307-.437.808-.438 1.578v.021c0 .265.021.562.063.893Zm-1.626 0c.042-.331.063-.628.063-.894v-.02c-.001-.77-.169-1.271-.438-1.578-.341-.391-1.046-.69-2.533-.529-1.505.163-2.347.537-2.824 1.025-.462.472-.705 1.179-.705 2.319 0 1.211.175 1.926.558 2.361.365.414 1.084.751 2.657.751 1.21 0 1.902-.394 2.344-.938.475-.584.742-1.44.878-2.497Z"></path><path d="M14.5 14.25a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Zm-5 0a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Z"></path> </svg> <div> <div class="color-fg-default h4">GitHub Copilot</div> Write better code with AI </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"security","context":"product","tag":"link","label":"security_link_product_navbar"}" href="https://github.com/features/security"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-shield-check color-fg-subtle mr-3"> <path d="M16.53 9.78a.75.75 0 0 0-1.06-1.06L11 13.19l-1.97-1.97a.75.75 0 0 0-1.06 1.06l2.5 2.5a.75.75 0 0 0 1.06 0l5-5Z"></path><path d="m12.54.637 8.25 2.675A1.75 1.75 0 0 1 22 4.976V10c0 6.19-3.771 10.704-9.401 12.83a1.704 1.704 0 0 1-1.198 0C5.77 20.705 2 16.19 2 10V4.976c0-.758.489-1.43 1.21-1.664L11.46.637a1.748 1.748 0 0 1 1.08 0Zm-.617 1.426-8.25 2.676a.249.249 0 0 0-.173.237V10c0 5.46 3.28 9.483 8.43 11.426a.199.199 0 0 0 .14 0C17.22 19.483 20.5 15.461 20.5 10V4.976a.25.25 0 0 0-.173-.237l-8.25-2.676a.253.253 0 0 0-.154 0Z"></path> </svg> <div> <div class="color-fg-default h4">Security</div> Find and fix vulnerabilities </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"actions","context":"product","tag":"link","label":"actions_link_product_navbar"}" href="https://github.com/features/actions"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-workflow color-fg-subtle mr-3"> <path d="M1 3a2 2 0 0 1 2-2h6.5a2 2 0 0 1 2 2v6.5a2 2 0 0 1-2 2H7v4.063C7 16.355 7.644 17 8.438 17H12.5v-2.5a2 2 0 0 1 2-2H21a2 2 0 0 1 2 2V21a2 2 0 0 1-2 2h-6.5a2 2 0 0 1-2-2v-2.5H8.437A2.939 2.939 0 0 1 5.5 15.562V11.5H3a2 2 0 0 1-2-2Zm2-.5a.5.5 0 0 0-.5.5v6.5a.5.5 0 0 0 .5.5h6.5a.5.5 0 0 0 .5-.5V3a.5.5 0 0 0-.5-.5ZM14.5 14a.5.5 0 0 0-.5.5V21a.5.5 0 0 0 .5.5H21a.5.5 0 0 0 .5-.5v-6.5a.5.5 0 0 0-.5-.5Z"></path> </svg> <div> <div class="color-fg-default h4">Actions</div> Automate any workflow </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"codespaces","context":"product","tag":"link","label":"codespaces_link_product_navbar"}" href="https://github.com/features/codespaces"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-codespaces color-fg-subtle mr-3"> <path d="M3.5 3.75C3.5 2.784 4.284 2 5.25 2h13.5c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 18.75 13H5.25a1.75 1.75 0 0 1-1.75-1.75Zm-2 12c0-.966.784-1.75 1.75-1.75h17.5c.966 0 1.75.784 1.75 1.75v4a1.75 1.75 0 0 1-1.75 1.75H3.25a1.75 1.75 0 0 1-1.75-1.75ZM5.25 3.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h13.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Zm-2 12a.25.25 0 0 0-.25.25v4c0 .138.112.25.25.25h17.5a.25.25 0 0 0 .25-.25v-4a.25.25 0 0 0-.25-.25Z"></path><path d="M10 17.75a.75.75 0 0 1 .75-.75h6.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1-.75-.75Zm-4 0a.75.75 0 0 1 .75-.75h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1-.75-.75Z"></path> </svg> <div> <div class="color-fg-default h4">Codespaces</div> Instant dev environments </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"issues","context":"product","tag":"link","label":"issues_link_product_navbar"}" href="https://github.com/features/issues"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-issue-opened color-fg-subtle mr-3"> <path d="M12 1c6.075 0 11 4.925 11 11s-4.925 11-11 11S1 18.075 1 12 5.925 1 12 1ZM2.5 12a9.5 9.5 0 0 0 9.5 9.5 9.5 9.5 0 0 0 9.5-9.5A9.5 9.5 0 0 0 12 2.5 9.5 9.5 0 0 0 2.5 12Zm9.5 2a2 2 0 1 1-.001-3.999A2 2 0 0 1 12 14Z"></path> </svg> <div> <div class="color-fg-default h4">Issues</div> Plan and track work </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"code_review","context":"product","tag":"link","label":"code_review_link_product_navbar"}" href="https://github.com/features/code-review"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-code-review color-fg-subtle mr-3"> <path d="M10.3 6.74a.75.75 0 0 1-.04 1.06l-2.908 2.7 2.908 2.7a.75.75 0 1 1-1.02 1.1l-3.5-3.25a.75.75 0 0 1 0-1.1l3.5-3.25a.75.75 0 0 1 1.06.04Zm3.44 1.06a.75.75 0 1 1 1.02-1.1l3.5 3.25a.75.75 0 0 1 0 1.1l-3.5 3.25a.75.75 0 1 1-1.02-1.1l2.908-2.7-2.908-2.7Z"></path><path d="M1.5 4.25c0-.966.784-1.75 1.75-1.75h17.5c.966 0 1.75.784 1.75 1.75v12.5a1.75 1.75 0 0 1-1.75 1.75h-9.69l-3.573 3.573A1.458 1.458 0 0 1 5 21.043V18.5H3.25a1.75 1.75 0 0 1-1.75-1.75ZM3.25 4a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h2.5a.75.75 0 0 1 .75.75v3.19l3.72-3.72a.749.749 0 0 1 .53-.22h10a.25.25 0 0 0 .25-.25V4.25a.25.25 0 0 0-.25-.25Z"></path> </svg> <div> <div class="color-fg-default h4">Code Review</div> Manage code changes </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"discussions","context":"product","tag":"link","label":"discussions_link_product_navbar"}" href="https://github.com/features/discussions"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-comment-discussion color-fg-subtle mr-3"> <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 14.25 14H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 15.543V14H1.75A1.75 1.75 0 0 1 0 12.25v-9.5C0 1.784.784 1 1.75 1ZM1.5 2.75v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Z"></path><path d="M22.5 8.75a.25.25 0 0 0-.25-.25h-3.5a.75.75 0 0 1 0-1.5h3.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 22.25 20H21v1.543a1.457 1.457 0 0 1-2.487 1.03L15.939 20H10.75A1.75 1.75 0 0 1 9 18.25v-1.465a.75.75 0 0 1 1.5 0v1.465c0 .138.112.25.25.25h5.5a.75.75 0 0 1 .53.22l2.72 2.72v-2.19a.75.75 0 0 1 .75-.75h2a.25.25 0 0 0 .25-.25v-9.5Z"></path> </svg> <div> <div class="color-fg-default h4">Discussions</div> Collaborate outside of code </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{"location":"navbar","action":"code_search","context":"product","tag":"link","label":"code_search_link_product_navbar"}" href="https://github.com/features/code-search"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-code-square color-fg-subtle mr-3"> <path d="M10.3 8.24a.75.75 0 0 1-.04 1.06L7.352 12l2.908 2.7a.75.75 0 1 1-1.02 1.1l-3.5-3.25a.75.75 0 0 1 0-1.1l3.5-3.25a.75.75 0 0 1 1.06.04Zm3.44 1.06a.75.75 0 1 1 1.02-1.1l3.5 3.25a.75.75 0 0 1 0 1.1l-3.5 3.25a.75.75 0 1 1-1.02-1.1l2.908-2.7-2.908-2.7Z"></path><path d="M2 3.75C2 2.784 2.784 2 3.75 2h16.5c.966 0 1.75.784 1.75 1.75v16.5A1.75 1.75 0 0 1 20.25 22H3.75A1.75 1.75 0 0 1 2 20.25Zm1.75-.25a.25.25 0 0 0-.25.25v16.5c0 .138.112.25.25.25h16.5a.25.25 0 0 0 .25-.25V3.75a.25.25 0 0 0-.25-.25Z"></path> </svg> <div> <div class="color-fg-default h4">Code Search</div> Find more, search less </div> </a></li> </ul> </div> </div> <div class="HeaderMenu-column px-lg-4"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0 border-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="product-explore-heading">Explore</span> <ul class="list-style-none f5" aria-labelledby="product-explore-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"all_features","context":"product","tag":"link","label":"all_features_link_product_navbar"}" href="https://github.com/features"> All features </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"documentation","context":"product","tag":"link","label":"documentation_link_product_navbar"}" href="https://docs.github.com"> Documentation <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"github_skills","context":"product","tag":"link","label":"github_skills_link_product_navbar"}" href="https://skills.github.com"> GitHub Skills <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"blog","context":"product","tag":"link","label":"blog_link_product_navbar"}" href="https://github.blog"> Blog <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> </ul> </div> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Solutions <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 d-lg-flex flex-wrap dropdown-menu-wide"> <div class="HeaderMenu-column px-lg-4 border-lg-right mb-4 mb-lg-0 pr-lg-7"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0 pb-lg-3 mb-3 mb-lg-0"> <span class="d-block h4 color-fg-default my-1" id="solutions-by-company-size-heading">By company size</span> <ul class="list-style-none f5" aria-labelledby="solutions-by-company-size-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"enterprises","context":"solutions","tag":"link","label":"enterprises_link_solutions_navbar"}" href="https://github.com/enterprise"> Enterprises </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"small_and_medium_teams","context":"solutions","tag":"link","label":"small_and_medium_teams_link_solutions_navbar"}" href="https://github.com/team"> Small and medium teams </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"startups","context":"solutions","tag":"link","label":"startups_link_solutions_navbar"}" href="https://github.com/enterprise/startups"> Startups </a></li> </ul> </div> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="solutions-by-use-case-heading">By use case</span> <ul class="list-style-none f5" aria-labelledby="solutions-by-use-case-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"devsecops","context":"solutions","tag":"link","label":"devsecops_link_solutions_navbar"}" href="/solutions/use-case/devsecops"> DevSecOps </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"devops","context":"solutions","tag":"link","label":"devops_link_solutions_navbar"}" href="/solutions/use-case/devops"> DevOps </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"ci_cd","context":"solutions","tag":"link","label":"ci_cd_link_solutions_navbar"}" href="/solutions/use-case/ci-cd"> CI/CD </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"view_all_use_cases","context":"solutions","tag":"link","label":"view_all_use_cases_link_solutions_navbar"}" href="/solutions/use-case"> View all use cases </a></li> </ul> </div> </div> <div class="HeaderMenu-column px-lg-4"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="solutions-by-industry-heading">By industry</span> <ul class="list-style-none f5" aria-labelledby="solutions-by-industry-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"healthcare","context":"solutions","tag":"link","label":"healthcare_link_solutions_navbar"}" href="/solutions/industry/healthcare"> Healthcare </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"financial_services","context":"solutions","tag":"link","label":"financial_services_link_solutions_navbar"}" href="/solutions/industry/financial-services"> Financial services </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"manufacturing","context":"solutions","tag":"link","label":"manufacturing_link_solutions_navbar"}" href="/solutions/industry/manufacturing"> Manufacturing </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"government","context":"solutions","tag":"link","label":"government_link_solutions_navbar"}" href="/solutions/industry/government"> Government </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"view_all_industries","context":"solutions","tag":"link","label":"view_all_industries_link_solutions_navbar"}" href="/solutions/industry"> View all industries </a></li> </ul> </div> </div> <div class="HeaderMenu-trailing-link rounded-bottom-2 flex-shrink-0 mt-lg-4 px-lg-4 py-4 py-lg-3 f5 text-semibold"> <a href="/solutions"> View all solutions <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-right HeaderMenu-trailing-link-icon"> <path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path> </svg> </a> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Resources <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4 d-lg-flex flex-wrap dropdown-menu-wide"> <div class="HeaderMenu-column px-lg-4 border-lg-right mb-4 mb-lg-0 pr-lg-7"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="resources-topics-heading">Topics</span> <ul class="list-style-none f5" aria-labelledby="resources-topics-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"ai","context":"resources","tag":"link","label":"ai_link_resources_navbar"}" href="/resources/articles/ai"> AI </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"devops","context":"resources","tag":"link","label":"devops_link_resources_navbar"}" href="/resources/articles/devops"> DevOps </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"security","context":"resources","tag":"link","label":"security_link_resources_navbar"}" href="/resources/articles/security"> Security </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"software_development","context":"resources","tag":"link","label":"software_development_link_resources_navbar"}" href="/resources/articles/software-development"> Software Development </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"view_all","context":"resources","tag":"link","label":"view_all_link_resources_navbar"}" href="/resources/articles"> View all </a></li> </ul> </div> </div> <div class="HeaderMenu-column px-lg-4"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0 border-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="resources-explore-heading">Explore</span> <ul class="list-style-none f5" aria-labelledby="resources-explore-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"learning_pathways","context":"resources","tag":"link","label":"learning_pathways_link_resources_navbar"}" href="https://resources.github.com/learn/pathways"> Learning Pathways <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"white_papers_ebooks_webinars","context":"resources","tag":"link","label":"white_papers_ebooks_webinars_link_resources_navbar"}" href="https://resources.github.com"> White papers, Ebooks, Webinars <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"customer_stories","context":"resources","tag":"link","label":"customer_stories_link_resources_navbar"}" href="https://github.com/customer-stories"> Customer Stories </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"partners","context":"resources","tag":"link","label":"partners_link_resources_navbar"}" href="https://partner.github.com"> Partners <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> </ul> </div> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Open Source <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4 px-lg-4"> <div class="HeaderMenu-column"> <div class="border-bottom pb-3 pb-lg-0 pb-lg-3 mb-3 mb-lg-0 mb-lg-3"> <ul class="list-style-none f5" > <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{"location":"navbar","action":"github_sponsors","context":"open_source","tag":"link","label":"github_sponsors_link_open_source_navbar"}" href="/sponsors"> <div> <div class="color-fg-default h4">GitHub Sponsors</div> Fund open source developers </div> </a></li> </ul> </div> <div class="border-bottom pb-3 pb-lg-0 pb-lg-3 mb-3 mb-lg-0 mb-lg-3"> <ul class="list-style-none f5" > <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{"location":"navbar","action":"the_readme_project","context":"open_source","tag":"link","label":"the_readme_project_link_open_source_navbar"}" href="https://github.com/readme"> <div> <div class="color-fg-default h4">The ReadME Project</div> GitHub community articles </div> </a></li> </ul> </div> <div class="border-bottom pb-3 pb-lg-0 border-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="open-source-repositories-heading">Repositories</span> <ul class="list-style-none f5" aria-labelledby="open-source-repositories-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"topics","context":"open_source","tag":"link","label":"topics_link_open_source_navbar"}" href="https://github.com/topics"> Topics </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"trending","context":"open_source","tag":"link","label":"trending_link_open_source_navbar"}" href="https://github.com/trending"> Trending </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"collections","context":"open_source","tag":"link","label":"collections_link_open_source_navbar"}" href="https://github.com/collections"> Collections </a></li> </ul> </div> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Enterprise <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4 px-lg-4"> <div class="HeaderMenu-column"> <div class="border-bottom pb-3 pb-lg-0 pb-lg-3 mb-3 mb-lg-0 mb-lg-3"> <ul class="list-style-none f5" > <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{"location":"navbar","action":"enterprise_platform","context":"enterprise","tag":"link","label":"enterprise_platform_link_enterprise_navbar"}" href="/enterprise"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-stack color-fg-subtle mr-3"> <path d="M11.063 1.456a1.749 1.749 0 0 1 1.874 0l8.383 5.316a1.751 1.751 0 0 1 0 2.956l-8.383 5.316a1.749 1.749 0 0 1-1.874 0L2.68 9.728a1.751 1.751 0 0 1 0-2.956Zm1.071 1.267a.25.25 0 0 0-.268 0L3.483 8.039a.25.25 0 0 0 0 .422l8.383 5.316a.25.25 0 0 0 .268 0l8.383-5.316a.25.25 0 0 0 0-.422Z"></path><path d="M1.867 12.324a.75.75 0 0 1 1.035-.232l8.964 5.685a.25.25 0 0 0 .268 0l8.964-5.685a.75.75 0 0 1 .804 1.267l-8.965 5.685a1.749 1.749 0 0 1-1.874 0l-8.965-5.685a.75.75 0 0 1-.231-1.035Z"></path><path d="M1.867 16.324a.75.75 0 0 1 1.035-.232l8.964 5.685a.25.25 0 0 0 .268 0l8.964-5.685a.75.75 0 0 1 .804 1.267l-8.965 5.685a1.749 1.749 0 0 1-1.874 0l-8.965-5.685a.75.75 0 0 1-.231-1.035Z"></path> </svg> <div> <div class="color-fg-default h4">Enterprise platform</div> AI-powered developer platform </div> </a></li> </ul> </div> <div class="border-bottom pb-3 pb-lg-0 border-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="enterprise-available-add-ons-heading">Available add-ons</span> <ul class="list-style-none f5" aria-labelledby="enterprise-available-add-ons-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"advanced_security","context":"enterprise","tag":"link","label":"advanced_security_link_enterprise_navbar"}" href="https://github.com/enterprise/advanced-security"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-shield-check color-fg-subtle mr-3"> <path d="M16.53 9.78a.75.75 0 0 0-1.06-1.06L11 13.19l-1.97-1.97a.75.75 0 0 0-1.06 1.06l2.5 2.5a.75.75 0 0 0 1.06 0l5-5Z"></path><path d="m12.54.637 8.25 2.675A1.75 1.75 0 0 1 22 4.976V10c0 6.19-3.771 10.704-9.401 12.83a1.704 1.704 0 0 1-1.198 0C5.77 20.705 2 16.19 2 10V4.976c0-.758.489-1.43 1.21-1.664L11.46.637a1.748 1.748 0 0 1 1.08 0Zm-.617 1.426-8.25 2.676a.249.249 0 0 0-.173.237V10c0 5.46 3.28 9.483 8.43 11.426a.199.199 0 0 0 .14 0C17.22 19.483 20.5 15.461 20.5 10V4.976a.25.25 0 0 0-.173-.237l-8.25-2.676a.253.253 0 0 0-.154 0Z"></path> </svg> <div> <div class="color-fg-default h4">Advanced Security</div> Enterprise-grade security features </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"github_copilot","context":"enterprise","tag":"link","label":"github_copilot_link_enterprise_navbar"}" href="/features/copilot#enterprise"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-copilot color-fg-subtle mr-3"> <path d="M23.922 16.992c-.861 1.495-5.859 5.023-11.922 5.023-6.063 0-11.061-3.528-11.922-5.023A.641.641 0 0 1 0 16.736v-2.869a.841.841 0 0 1 .053-.22c.372-.935 1.347-2.292 2.605-2.656.167-.429.414-1.055.644-1.517a10.195 10.195 0 0 1-.052-1.086c0-1.331.282-2.499 1.132-3.368.397-.406.89-.717 1.474-.952 1.399-1.136 3.392-2.093 6.122-2.093 2.731 0 4.767.957 6.166 2.093.584.235 1.077.546 1.474.952.85.869 1.132 2.037 1.132 3.368 0 .368-.014.733-.052 1.086.23.462.477 1.088.644 1.517 1.258.364 2.233 1.721 2.605 2.656a.832.832 0 0 1 .053.22v2.869a.641.641 0 0 1-.078.256ZM12.172 11h-.344a4.323 4.323 0 0 1-.355.508C10.703 12.455 9.555 13 7.965 13c-1.725 0-2.989-.359-3.782-1.259a2.005 2.005 0 0 1-.085-.104L4 11.741v6.585c1.435.779 4.514 2.179 8 2.179 3.486 0 6.565-1.4 8-2.179v-6.585l-.098-.104s-.033.045-.085.104c-.793.9-2.057 1.259-3.782 1.259-1.59 0-2.738-.545-3.508-1.492a4.323 4.323 0 0 1-.355-.508h-.016.016Zm.641-2.935c.136 1.057.403 1.913.878 2.497.442.544 1.134.938 2.344.938 1.573 0 2.292-.337 2.657-.751.384-.435.558-1.15.558-2.361 0-1.14-.243-1.847-.705-2.319-.477-.488-1.319-.862-2.824-1.025-1.487-.161-2.192.138-2.533.529-.269.307-.437.808-.438 1.578v.021c0 .265.021.562.063.893Zm-1.626 0c.042-.331.063-.628.063-.894v-.02c-.001-.77-.169-1.271-.438-1.578-.341-.391-1.046-.69-2.533-.529-1.505.163-2.347.537-2.824 1.025-.462.472-.705 1.179-.705 2.319 0 1.211.175 1.926.558 2.361.365.414 1.084.751 2.657.751 1.21 0 1.902-.394 2.344-.938.475-.584.742-1.44.878-2.497Z"></path><path d="M14.5 14.25a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Zm-5 0a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Z"></path> </svg> <div> <div class="color-fg-default h4">GitHub Copilot</div> Enterprise-grade AI features </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{"location":"navbar","action":"premium_support","context":"enterprise","tag":"link","label":"premium_support_link_enterprise_navbar"}" href="/premium-support"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-comment-discussion color-fg-subtle mr-3"> <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 14.25 14H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 15.543V14H1.75A1.75 1.75 0 0 1 0 12.25v-9.5C0 1.784.784 1 1.75 1ZM1.5 2.75v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Z"></path><path d="M22.5 8.75a.25.25 0 0 0-.25-.25h-3.5a.75.75 0 0 1 0-1.5h3.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 22.25 20H21v1.543a1.457 1.457 0 0 1-2.487 1.03L15.939 20H10.75A1.75 1.75 0 0 1 9 18.25v-1.465a.75.75 0 0 1 1.5 0v1.465c0 .138.112.25.25.25h5.5a.75.75 0 0 1 .53.22l2.72 2.72v-2.19a.75.75 0 0 1 .75-.75h2a.25.25 0 0 0 .25-.25v-9.5Z"></path> </svg> <div> <div class="color-fg-default h4">Premium Support</div> Enterprise-grade 24/7 support </div> </a></li> </ul> </div> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <a class="HeaderMenu-link no-underline px-0 px-lg-2 py-3 py-lg-2 d-block d-lg-inline-block" data-analytics-event="{"location":"navbar","action":"pricing","context":"global","tag":"link","label":"pricing_link_global_navbar"}" href="https://github.com/pricing">Pricing</a> </li> </ul> </nav> <div class="d-flex flex-column flex-lg-row width-full flex-justify-end flex-lg-items-center text-center mt-3 mt-lg-0 text-lg-left ml-lg-3"> <qbsearch-input class="search-input" data-scope="repo:InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework" data-custom-scopes-path="/search/custom_scopes" data-delete-custom-scopes-csrf="DbxAydy4y4obA_OkbWK2Q4FRGOnXpqE_YpUgL6gsf-Fi82QlJRuB7vbEoCb9rAyXG2lOrearPwiSElQwsiQnrA" data-max-custom-scopes="10" data-header-redesign-enabled="false" data-initial-value="" data-blackbird-suggestions-path="/search/suggestions" data-jump-to-suggestions-path="/_graphql/GetSuggestedNavigationDestinations" data-current-repository="InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework" data-current-org="InteractiveAdvertisingBureau" data-current-owner="" data-logged-in="false" data-copilot-chat-enabled="false" data-nl-search-enabled="false" data-retain-scroll-position="true"> <div class="search-input-container search-with-dialog position-relative d-flex flex-row flex-items-center mr-4 rounded" data-action="click:qbsearch-input#searchInputContainerClicked" > <button type="button" class="header-search-button placeholder input-button form-control d-flex flex-1 flex-self-stretch flex-items-center no-wrap width-full py-0 pl-2 pr-0 text-left border-0 box-shadow-none" data-target="qbsearch-input.inputButton" aria-label="Search or jump to…" aria-haspopup="dialog" placeholder="Search or jump to..." data-hotkey=s,/ autocapitalize="off" data-analytics-event="{"location":"navbar","action":"searchbar","context":"global","tag":"input","label":"searchbar_input_global_navbar"}" data-action="click:qbsearch-input#handleExpand" > <div class="mr-2 color-fg-muted"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-search"> <path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path> </svg> </div> <span class="flex-1" data-target="qbsearch-input.inputButtonText">Search or jump to...</span> <div class="d-flex" data-target="qbsearch-input.hotkeyIndicator"> <svg xmlns="http://www.w3.org/2000/svg" width="22" height="20" aria-hidden="true" class="mr-1"><path fill="none" stroke="#979A9C" opacity=".4" d="M3.5.5h12c1.7 0 3 1.3 3 3v13c0 1.7-1.3 3-3 3h-12c-1.7 0-3-1.3-3-3v-13c0-1.7 1.3-3 3-3z"></path><path fill="#979A9C" d="M11.8 6L8 15.1h-.9L10.8 6h1z"></path></svg> </div> </button> <input type="hidden" name="type" class="js-site-search-type-field"> <div class="Overlay--hidden " data-modal-dialog-overlay> <modal-dialog data-action="close:qbsearch-input#handleClose cancel:qbsearch-input#handleClose" data-target="qbsearch-input.searchSuggestionsDialog" role="dialog" id="search-suggestions-dialog" aria-modal="true" aria-labelledby="search-suggestions-dialog-header" data-view-component="true" class="Overlay Overlay--width-large Overlay--height-auto"> <h1 id="search-suggestions-dialog-header" class="sr-only">Search code, repositories, users, issues, pull requests...</h1> <div class="Overlay-body Overlay-body--paddingNone"> <div data-view-component="true"> <div class="search-suggestions position-fixed width-full color-shadow-large border color-fg-default color-bg-default overflow-hidden d-flex flex-column query-builder-container" style="border-radius: 12px;" data-target="qbsearch-input.queryBuilderContainer" hidden > <!-- '"` --><!-- </textarea></xmp> --></option></form><form id="query-builder-test-form" action="" accept-charset="UTF-8" method="get"> <query-builder data-target="qbsearch-input.queryBuilder" id="query-builder-query-builder-test" data-filter-key=":" data-view-component="true" class="QueryBuilder search-query-builder"> <div class="FormControl FormControl--fullWidth"> <label id="query-builder-test-label" for="query-builder-test" class="FormControl-label sr-only"> Search </label> <div class="QueryBuilder-StyledInput width-fit " data-target="query-builder.styledInput" > <span id="query-builder-test-leadingvisual-wrap" class="FormControl-input-leadingVisualWrap QueryBuilder-leadingVisualWrap"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-search FormControl-input-leadingVisual"> <path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path> </svg> </span> <div data-target="query-builder.styledInputContainer" class="QueryBuilder-StyledInputContainer"> <div aria-hidden="true" class="QueryBuilder-StyledInputContent" data-target="query-builder.styledInputContent" ></div> <div class="QueryBuilder-InputWrapper"> <div aria-hidden="true" class="QueryBuilder-Sizer" data-target="query-builder.sizer"></div> <input id="query-builder-test" name="query-builder-test" value="" autocomplete="off" type="text" role="combobox" spellcheck="false" aria-expanded="false" aria-describedby="validation-6806d84a-e33d-410c-867b-0cb9728e8d95" data-target="query-builder.input" data-action=" input:query-builder#inputChange blur:query-builder#inputBlur keydown:query-builder#inputKeydown focus:query-builder#inputFocus " data-view-component="true" class="FormControl-input QueryBuilder-Input FormControl-medium" /> </div> </div> <span class="sr-only" id="query-builder-test-clear">Clear</span> <button role="button" id="query-builder-test-clear-button" aria-labelledby="query-builder-test-clear query-builder-test-label" data-target="query-builder.clearButton" data-action=" click:query-builder#clear focus:query-builder#clearButtonFocus blur:query-builder#clearButtonBlur " variant="small" hidden="hidden" type="button" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium mr-1 px-2 py-0 d-flex flex-items-center rounded-1 color-fg-muted"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x-circle-fill Button-visual"> <path d="M2.343 13.657A8 8 0 1 1 13.658 2.343 8 8 0 0 1 2.343 13.657ZM6.03 4.97a.751.751 0 0 0-1.042.018.751.751 0 0 0-.018 1.042L6.94 8 4.97 9.97a.749.749 0 0 0 .326 1.275.749.749 0 0 0 .734-.215L8 9.06l1.97 1.97a.749.749 0 0 0 1.275-.326.749.749 0 0 0-.215-.734L9.06 8l1.97-1.97a.749.749 0 0 0-.326-1.275.749.749 0 0 0-.734.215L8 6.94Z"></path> </svg> </button> </div> <template id="search-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-search"> <path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path> </svg> </template> <template id="code-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code"> <path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path> </svg> </template> <template id="file-code-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-file-code"> <path d="M4 1.75C4 .784 4.784 0 5.75 0h5.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v8.586A1.75 1.75 0 0 1 14.25 15h-9a.75.75 0 0 1 0-1.5h9a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 10 4.25V1.5H5.75a.25.25 0 0 0-.25.25v2.5a.75.75 0 0 1-1.5 0Zm1.72 4.97a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734l1.47-1.47-1.47-1.47a.75.75 0 0 1 0-1.06ZM3.28 7.78 1.81 9.25l1.47 1.47a.751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018l-2-2a.75.75 0 0 1 0-1.06l2-2a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Zm8.22-6.218V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path> </svg> </template> <template id="history-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-history"> <path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path> </svg> </template> <template id="repo-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo"> <path d="M2 2.5A2.5 2.5 0 0 1 4.5 0h8.75a.75.75 0 0 1 .75.75v12.5a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h1.75v-2h-8a1 1 0 0 0-.714 1.7.75.75 0 1 1-1.072 1.05A2.495 2.495 0 0 1 2 11.5Zm10.5-1h-8a1 1 0 0 0-1 1v6.708A2.486 2.486 0 0 1 4.5 9h8ZM5 12.25a.25.25 0 0 1 .25-.25h3.5a.25.25 0 0 1 .25.25v3.25a.25.25 0 0 1-.4.2l-1.45-1.087a.249.249 0 0 0-.3 0L5.4 15.7a.25.25 0 0 1-.4-.2Z"></path> </svg> </template> <template id="bookmark-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-bookmark"> <path d="M3 2.75C3 1.784 3.784 1 4.75 1h6.5c.966 0 1.75.784 1.75 1.75v11.5a.75.75 0 0 1-1.227.579L8 11.722l-3.773 3.107A.751.751 0 0 1 3 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.91l3.023-2.489a.75.75 0 0 1 .954 0l3.023 2.49V2.75a.25.25 0 0 0-.25-.25Z"></path> </svg> </template> <template id="plus-circle-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-plus-circle"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm7.25-3.25v2.5h2.5a.75.75 0 0 1 0 1.5h-2.5v2.5a.75.75 0 0 1-1.5 0v-2.5h-2.5a.75.75 0 0 1 0-1.5h2.5v-2.5a.75.75 0 0 1 1.5 0Z"></path> </svg> </template> <template id="circle-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-dot-fill"> <path d="M8 4a4 4 0 1 1 0 8 4 4 0 0 1 0-8Z"></path> </svg> </template> <template id="trash-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-trash"> <path d="M11 1.75V3h2.25a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1 0-1.5H5V1.75C5 .784 5.784 0 6.75 0h2.5C10.216 0 11 .784 11 1.75ZM4.496 6.675l.66 6.6a.25.25 0 0 0 .249.225h5.19a.25.25 0 0 0 .249-.225l.66-6.6a.75.75 0 0 1 1.492.149l-.66 6.6A1.748 1.748 0 0 1 10.595 15h-5.19a1.75 1.75 0 0 1-1.741-1.575l-.66-6.6a.75.75 0 1 1 1.492-.15ZM6.5 1.75V3h3V1.75a.25.25 0 0 0-.25-.25h-2.5a.25.25 0 0 0-.25.25Z"></path> </svg> </template> <template id="team-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-people"> <path d="M2 5.5a3.5 3.5 0 1 1 5.898 2.549 5.508 5.508 0 0 1 3.034 4.084.75.75 0 1 1-1.482.235 4 4 0 0 0-7.9 0 .75.75 0 0 1-1.482-.236A5.507 5.507 0 0 1 3.102 8.05 3.493 3.493 0 0 1 2 5.5ZM11 4a3.001 3.001 0 0 1 2.22 5.018 5.01 5.01 0 0 1 2.56 3.012.749.749 0 0 1-.885.954.752.752 0 0 1-.549-.514 3.507 3.507 0 0 0-2.522-2.372.75.75 0 0 1-.574-.73v-.352a.75.75 0 0 1 .416-.672A1.5 1.5 0 0 0 11 5.5.75.75 0 0 1 11 4Zm-5.5-.5a2 2 0 1 0-.001 3.999A2 2 0 0 0 5.5 3.5Z"></path> </svg> </template> <template id="project-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-project"> <path d="M1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25V1.75C0 .784.784 0 1.75 0ZM1.5 1.75v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25ZM11.75 3a.75.75 0 0 1 .75.75v7.5a.75.75 0 0 1-1.5 0v-7.5a.75.75 0 0 1 .75-.75Zm-8.25.75a.75.75 0 0 1 1.5 0v5.5a.75.75 0 0 1-1.5 0ZM8 3a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 3Z"></path> </svg> </template> <template id="pencil-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-pencil"> <path d="M11.013 1.427a1.75 1.75 0 0 1 2.474 0l1.086 1.086a1.75 1.75 0 0 1 0 2.474l-8.61 8.61c-.21.21-.47.364-.756.445l-3.251.93a.75.75 0 0 1-.927-.928l.929-3.25c.081-.286.235-.547.445-.758l8.61-8.61Zm.176 4.823L9.75 4.81l-6.286 6.287a.253.253 0 0 0-.064.108l-.558 1.953 1.953-.558a.253.253 0 0 0 .108-.064Zm1.238-3.763a.25.25 0 0 0-.354 0L10.811 3.75l1.439 1.44 1.263-1.263a.25.25 0 0 0 0-.354Z"></path> </svg> </template> <template id="copilot-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copilot"> <path d="M7.998 15.035c-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.201-.508-.254-1.084-.254-1.656 0-.87.128-1.769.693-2.484.579-.733 1.494-1.124 2.724-1.261 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095v1.872c0 .766-3.351 3.795-8.002 3.795Zm0-1.485c2.28 0 4.584-1.11 5.002-1.433V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-1.146 0-2.059-.327-2.71-.991A3.222 3.222 0 0 1 8 6.303a3.24 3.24 0 0 1-.544.743c-.65.664-1.563.991-2.71.991-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433ZM6.762 2.83c-.193-.206-.637-.413-1.682-.297-1.019.113-1.479.404-1.713.7-.247.312-.369.789-.369 1.554 0 .793.129 1.171.308 1.371.162.181.519.379 1.442.379.853 0 1.339-.235 1.638-.54.315-.322.527-.827.617-1.553.117-.935-.037-1.395-.241-1.614Zm4.155-.297c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Z"></path><path d="M6.25 9.037a.75.75 0 0 1 .75.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 .75-.75Zm4.25.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 1.5 0Z"></path> </svg> </template> <template id="copilot-error-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copilot-error"> <path d="M16 11.24c0 .112-.072.274-.21.467L13 9.688V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-.198 0-.388-.009-.571-.029L6.833 5.226a4.01 4.01 0 0 0 .17-.782c.117-.935-.037-1.395-.241-1.614-.193-.206-.637-.413-1.682-.297-.683.076-1.115.231-1.395.415l-1.257-.91c.579-.564 1.413-.877 2.485-.996 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095Zm-5.083-8.707c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Zm2.511 11.074c-1.393.776-3.272 1.428-5.43 1.428-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.18-.455-.241-.963-.252-1.475L.31 4.107A.747.747 0 0 1 0 3.509V3.49a.748.748 0 0 1 .625-.73c.156-.026.306.047.435.139l14.667 10.578a.592.592 0 0 1 .227.264.752.752 0 0 1 .046.249v.022a.75.75 0 0 1-1.19.596Zm-1.367-.991L5.635 7.964a5.128 5.128 0 0 1-.889.073c-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433 1.539 0 3.089-.505 4.063-.934Z"></path> </svg> </template> <template id="workflow-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-workflow"> <path d="M0 1.75C0 .784.784 0 1.75 0h3.5C6.216 0 7 .784 7 1.75v3.5A1.75 1.75 0 0 1 5.25 7H4v4a1 1 0 0 0 1 1h4v-1.25C9 9.784 9.784 9 10.75 9h3.5c.966 0 1.75.784 1.75 1.75v3.5A1.75 1.75 0 0 1 14.25 16h-3.5A1.75 1.75 0 0 1 9 14.25v-.75H5A2.5 2.5 0 0 1 2.5 11V7h-.75A1.75 1.75 0 0 1 0 5.25Zm1.75-.25a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h3.5a.25.25 0 0 0 .25-.25v-3.5a.25.25 0 0 0-.25-.25Zm9 9a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h3.5a.25.25 0 0 0 .25-.25v-3.5a.25.25 0 0 0-.25-.25Z"></path> </svg> </template> <template id="book-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-book"> <path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"></path> </svg> </template> <template id="code-review-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code-review"> <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v8.5A1.75 1.75 0 0 1 14.25 13H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25v-8.5C0 1.784.784 1 1.75 1ZM1.5 2.75v8.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-8.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Zm5.28 1.72a.75.75 0 0 1 0 1.06L5.31 7l1.47 1.47a.751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018l-2-2a.75.75 0 0 1 0-1.06l2-2a.75.75 0 0 1 1.06 0Zm2.44 0a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L10.69 7 9.22 5.53a.75.75 0 0 1 0-1.06Z"></path> </svg> </template> <template id="codespaces-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-codespaces"> <path d="M0 11.25c0-.966.784-1.75 1.75-1.75h12.5c.966 0 1.75.784 1.75 1.75v3A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm2-9.5C2 .784 2.784 0 3.75 0h8.5C13.216 0 14 .784 14 1.75v5a1.75 1.75 0 0 1-1.75 1.75h-8.5A1.75 1.75 0 0 1 2 6.75Zm1.75-.25a.25.25 0 0 0-.25.25v5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-5a.25.25 0 0 0-.25-.25Zm-2 9.5a.25.25 0 0 0-.25.25v3c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-3a.25.25 0 0 0-.25-.25Z"></path><path d="M7 12.75a.75.75 0 0 1 .75-.75h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1-.75-.75Zm-4 0a.75.75 0 0 1 .75-.75h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1-.75-.75Z"></path> </svg> </template> <template id="comment-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-comment"> <path d="M1 2.75C1 1.784 1.784 1 2.75 1h10.5c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 13.25 12H9.06l-2.573 2.573A1.458 1.458 0 0 1 4 13.543V12H2.75A1.75 1.75 0 0 1 1 10.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h4.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path> </svg> </template> <template id="comment-discussion-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-comment-discussion"> <path d="M1.75 1h8.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 10.25 10H7.061l-2.574 2.573A1.458 1.458 0 0 1 2 11.543V10h-.25A1.75 1.75 0 0 1 0 8.25v-5.5C0 1.784.784 1 1.75 1ZM1.5 2.75v5.5c0 .138.112.25.25.25h1a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h3.5a.25.25 0 0 0 .25-.25v-5.5a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25Zm13 2a.25.25 0 0 0-.25-.25h-.5a.75.75 0 0 1 0-1.5h.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 14.25 12H14v1.543a1.458 1.458 0 0 1-2.487 1.03L9.22 12.28a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l2.22 2.22v-2.19a.75.75 0 0 1 .75-.75h1a.25.25 0 0 0 .25-.25Z"></path> </svg> </template> <template id="organization-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-organization"> <path d="M1.75 16A1.75 1.75 0 0 1 0 14.25V1.75C0 .784.784 0 1.75 0h8.5C11.216 0 12 .784 12 1.75v12.5c0 .085-.006.168-.018.25h2.268a.25.25 0 0 0 .25-.25V8.285a.25.25 0 0 0-.111-.208l-1.055-.703a.749.749 0 1 1 .832-1.248l1.055.703c.487.325.779.871.779 1.456v5.965A1.75 1.75 0 0 1 14.25 16h-3.5a.766.766 0 0 1-.197-.026c-.099.017-.2.026-.303.026h-3a.75.75 0 0 1-.75-.75V14h-1v1.25a.75.75 0 0 1-.75.75Zm-.25-1.75c0 .138.112.25.25.25H4v-1.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 .75.75v1.25h2.25a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25ZM3.75 6h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5ZM3 3.75A.75.75 0 0 1 3.75 3h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 3 3.75Zm4 3A.75.75 0 0 1 7.75 6h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 7 6.75ZM7.75 3h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5ZM3 9.75A.75.75 0 0 1 3.75 9h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 3 9.75ZM7.75 9h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5Z"></path> </svg> </template> <template id="rocket-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-rocket"> <path d="M14.064 0h.186C15.216 0 16 .784 16 1.75v.186a8.752 8.752 0 0 1-2.564 6.186l-.458.459c-.314.314-.641.616-.979.904v3.207c0 .608-.315 1.172-.833 1.49l-2.774 1.707a.749.749 0 0 1-1.11-.418l-.954-3.102a1.214 1.214 0 0 1-.145-.125L3.754 9.816a1.218 1.218 0 0 1-.124-.145L.528 8.717a.749.749 0 0 1-.418-1.11l1.71-2.774A1.748 1.748 0 0 1 3.31 4h3.204c.288-.338.59-.665.904-.979l.459-.458A8.749 8.749 0 0 1 14.064 0ZM8.938 3.623h-.002l-.458.458c-.76.76-1.437 1.598-2.02 2.5l-1.5 2.317 2.143 2.143 2.317-1.5c.902-.583 1.74-1.26 2.499-2.02l.459-.458a7.25 7.25 0 0 0 2.123-5.127V1.75a.25.25 0 0 0-.25-.25h-.186a7.249 7.249 0 0 0-5.125 2.123ZM3.56 14.56c-.732.732-2.334 1.045-3.005 1.148a.234.234 0 0 1-.201-.064.234.234 0 0 1-.064-.201c.103-.671.416-2.273 1.15-3.003a1.502 1.502 0 1 1 2.12 2.12Zm6.94-3.935c-.088.06-.177.118-.266.175l-2.35 1.521.548 1.783 1.949-1.2a.25.25 0 0 0 .119-.213ZM3.678 8.116 5.2 5.766c.058-.09.117-.178.176-.266H3.309a.25.25 0 0 0-.213.119l-1.2 1.95ZM12 5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> </template> <template id="shield-check-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-shield-check"> <path d="m8.533.133 5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667l5.25-1.68a1.748 1.748 0 0 1 1.066 0Zm-.61 1.429.001.001-5.25 1.68a.251.251 0 0 0-.174.237V7c0 1.36.275 2.666 1.057 3.859.784 1.194 2.121 2.342 4.366 3.298a.196.196 0 0 0 .154 0c2.245-.957 3.582-2.103 4.366-3.297C13.225 9.666 13.5 8.358 13.5 7V3.48a.25.25 0 0 0-.174-.238l-5.25-1.68a.25.25 0 0 0-.153 0ZM11.28 6.28l-3.5 3.5a.75.75 0 0 1-1.06 0l-1.5-1.5a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l.97.97 2.97-2.97a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path> </svg> </template> <template id="heart-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-heart"> <path d="m8 14.25.345.666a.75.75 0 0 1-.69 0l-.008-.004-.018-.01a7.152 7.152 0 0 1-.31-.17 22.055 22.055 0 0 1-3.434-2.414C2.045 10.731 0 8.35 0 5.5 0 2.836 2.086 1 4.25 1 5.797 1 7.153 1.802 8 3.02 8.847 1.802 10.203 1 11.75 1 13.914 1 16 2.836 16 5.5c0 2.85-2.045 5.231-3.885 6.818a22.066 22.066 0 0 1-3.744 2.584l-.018.01-.006.003h-.002ZM4.25 2.5c-1.336 0-2.75 1.164-2.75 3 0 2.15 1.58 4.144 3.365 5.682A20.58 20.58 0 0 0 8 13.393a20.58 20.58 0 0 0 3.135-2.211C12.92 9.644 14.5 7.65 14.5 5.5c0-1.836-1.414-3-2.75-3-1.373 0-2.609.986-3.029 2.456a.749.749 0 0 1-1.442 0C6.859 3.486 5.623 2.5 4.25 2.5Z"></path> </svg> </template> <template id="server-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-server"> <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v4c0 .372-.116.717-.314 1 .198.283.314.628.314 1v4a1.75 1.75 0 0 1-1.75 1.75H1.75A1.75 1.75 0 0 1 0 12.75v-4c0-.358.109-.707.314-1a1.739 1.739 0 0 1-.314-1v-4C0 1.784.784 1 1.75 1ZM1.5 2.75v4c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-4a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Zm.25 5.75a.25.25 0 0 0-.25.25v4c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-4a.25.25 0 0 0-.25-.25ZM7 4.75A.75.75 0 0 1 7.75 4h4.5a.75.75 0 0 1 0 1.5h-4.5A.75.75 0 0 1 7 4.75ZM7.75 10h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM3 4.75A.75.75 0 0 1 3.75 4h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 3 4.75ZM3.75 10h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5Z"></path> </svg> </template> <template id="globe-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-globe"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM5.78 8.75a9.64 9.64 0 0 0 1.363 4.177c.255.426.542.832.857 1.215.245-.296.551-.705.857-1.215A9.64 9.64 0 0 0 10.22 8.75Zm4.44-1.5a9.64 9.64 0 0 0-1.363-4.177c-.307-.51-.612-.919-.857-1.215a9.927 9.927 0 0 0-.857 1.215A9.64 9.64 0 0 0 5.78 7.25Zm-5.944 1.5H1.543a6.507 6.507 0 0 0 4.666 5.5c-.123-.181-.24-.365-.352-.552-.715-1.192-1.437-2.874-1.581-4.948Zm-2.733-1.5h2.733c.144-2.074.866-3.756 1.58-4.948.12-.197.237-.381.353-.552a6.507 6.507 0 0 0-4.666 5.5Zm10.181 1.5c-.144 2.074-.866 3.756-1.58 4.948-.12.197-.237.381-.353.552a6.507 6.507 0 0 0 4.666-5.5Zm2.733-1.5a6.507 6.507 0 0 0-4.666-5.5c.123.181.24.365.353.552.714 1.192 1.436 2.874 1.58 4.948Z"></path> </svg> </template> <template id="issue-opened-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-issue-opened"> <path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path> </svg> </template> <template id="device-mobile-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-device-mobile"> <path d="M3.75 0h8.5C13.216 0 14 .784 14 1.75v12.5A1.75 1.75 0 0 1 12.25 16h-8.5A1.75 1.75 0 0 1 2 14.25V1.75C2 .784 2.784 0 3.75 0ZM3.5 1.75v12.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25ZM8 13a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path> </svg> </template> <template id="package-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-package"> <path d="m8.878.392 5.25 3.045c.54.314.872.89.872 1.514v6.098a1.75 1.75 0 0 1-.872 1.514l-5.25 3.045a1.75 1.75 0 0 1-1.756 0l-5.25-3.045A1.75 1.75 0 0 1 1 11.049V4.951c0-.624.332-1.201.872-1.514L7.122.392a1.75 1.75 0 0 1 1.756 0ZM7.875 1.69l-4.63 2.685L8 7.133l4.755-2.758-4.63-2.685a.248.248 0 0 0-.25 0ZM2.5 5.677v5.372c0 .09.047.171.125.216l4.625 2.683V8.432Zm6.25 8.271 4.625-2.683a.25.25 0 0 0 .125-.216V5.677L8.75 8.432Z"></path> </svg> </template> <template id="credit-card-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-credit-card"> <path d="M10.75 9a.75.75 0 0 0 0 1.5h1.5a.75.75 0 0 0 0-1.5h-1.5Z"></path><path d="M0 3.75C0 2.784.784 2 1.75 2h12.5c.966 0 1.75.784 1.75 1.75v8.5A1.75 1.75 0 0 1 14.25 14H1.75A1.75 1.75 0 0 1 0 12.25ZM14.5 6.5h-13v5.75c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25Zm0-2.75a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25V5h13Z"></path> </svg> </template> <template id="play-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path> </svg> </template> <template id="gift-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-gift"> <path d="M2 2.75A2.75 2.75 0 0 1 4.75 0c.983 0 1.873.42 2.57 1.232.268.318.497.668.68 1.042.183-.375.411-.725.68-1.044C9.376.42 10.266 0 11.25 0a2.75 2.75 0 0 1 2.45 4h.55c.966 0 1.75.784 1.75 1.75v2c0 .698-.409 1.301-1 1.582v4.918A1.75 1.75 0 0 1 13.25 16H2.75A1.75 1.75 0 0 1 1 14.25V9.332C.409 9.05 0 8.448 0 7.75v-2C0 4.784.784 4 1.75 4h.55c-.192-.375-.3-.8-.3-1.25ZM7.25 9.5H2.5v4.75c0 .138.112.25.25.25h4.5Zm1.5 0v5h4.5a.25.25 0 0 0 .25-.25V9.5Zm0-4V8h5.5a.25.25 0 0 0 .25-.25v-2a.25.25 0 0 0-.25-.25Zm-7 0a.25.25 0 0 0-.25.25v2c0 .138.112.25.25.25h5.5V5.5h-5.5Zm3-4a1.25 1.25 0 0 0 0 2.5h2.309c-.233-.818-.542-1.401-.878-1.793-.43-.502-.915-.707-1.431-.707ZM8.941 4h2.309a1.25 1.25 0 0 0 0-2.5c-.516 0-1 .205-1.43.707-.337.392-.646.975-.879 1.793Z"></path> </svg> </template> <template id="code-square-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code-square"> <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25Zm7.47 3.97a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L10.69 8 9.22 6.53a.75.75 0 0 1 0-1.06ZM6.78 6.53 5.31 8l1.47 1.47a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-2-2a.75.75 0 0 1 0-1.06l2-2a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path> </svg> </template> <template id="device-desktop-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-device-desktop"> <path d="M14.25 1c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 14.25 12h-3.727c.099 1.041.52 1.872 1.292 2.757A.752.752 0 0 1 11.25 16h-6.5a.75.75 0 0 1-.565-1.243c.772-.885 1.192-1.716 1.292-2.757H1.75A1.75 1.75 0 0 1 0 10.25v-7.5C0 1.784.784 1 1.75 1ZM1.75 2.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25ZM9.018 12H6.982a5.72 5.72 0 0 1-.765 2.5h3.566a5.72 5.72 0 0 1-.765-2.5Z"></path> </svg> </template> <div class="position-relative"> <ul role="listbox" class="ActionListWrap QueryBuilder-ListWrap" aria-label="Suggestions" data-action=" combobox-commit:query-builder#comboboxCommit mousedown:query-builder#resultsMousedown " data-target="query-builder.resultsList" data-persist-list=false id="query-builder-test-results" ></ul> </div> <div class="FormControl-inlineValidation" id="validation-6806d84a-e33d-410c-867b-0cb9728e8d95" hidden="hidden"> <span class="FormControl-inlineValidation--visual"> <svg aria-hidden="true" height="12" viewBox="0 0 12 12" version="1.1" width="12" data-view-component="true" class="octicon octicon-alert-fill"> <path d="M4.855.708c.5-.896 1.79-.896 2.29 0l4.675 8.351a1.312 1.312 0 0 1-1.146 1.954H1.33A1.313 1.313 0 0 1 .183 9.058ZM7 7V3H5v4Zm-1 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z"></path> </svg> </span> <span></span> </div> </div> <div data-target="query-builder.screenReaderFeedback" aria-live="polite" aria-atomic="true" class="sr-only"></div> </query-builder></form> <div class="d-flex flex-row color-fg-muted px-3 text-small color-bg-default search-feedback-prompt"> <a target="_blank" href="https://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax" data-view-component="true" class="Link color-fg-accent text-normal ml-2"> Search syntax tips </a> <div class="d-flex flex-1"></div> </div> </div> </div> </div> </modal-dialog></div> </div> <div data-action="click:qbsearch-input#retract" class="dark-backdrop position-fixed" hidden data-target="qbsearch-input.darkBackdrop"></div> <div class="color-fg-default"> <dialog-helper> <dialog data-target="qbsearch-input.feedbackDialog" data-action="close:qbsearch-input#handleDialogClose cancel:qbsearch-input#handleDialogClose" id="feedback-dialog" aria-modal="true" aria-labelledby="feedback-dialog-title" aria-describedby="feedback-dialog-description" data-view-component="true" class="Overlay Overlay-whenNarrow Overlay--size-medium Overlay--motion-scaleFade Overlay--disableScroll"> <div data-view-component="true" class="Overlay-header"> <div class="Overlay-headerContentWrap"> <div class="Overlay-titleWrap"> <h1 class="Overlay-title " id="feedback-dialog-title"> Provide feedback </h1> </div> <div class="Overlay-actionWrap"> <button data-close-dialog-id="feedback-dialog" aria-label="Close" type="button" data-view-component="true" class="close-button Overlay-closeButton"><svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg></button> </div> </div> </div> <scrollable-region data-labelled-by="feedback-dialog-title"> <div data-view-component="true" class="Overlay-body"> <!-- '"` --><!-- </textarea></xmp> --></option></form><form id="code-search-feedback-form" data-turbo="false" action="/search/feedback" accept-charset="UTF-8" method="post"><input type="hidden" data-csrf="true" name="authenticity_token" value="Ggoq5TFnwX1WhfkH5stTpSdQ1FGivMpLYV3/kRHh25HbD12B/U9puvuHkTgt48QAJBbtk9fZDT3nrMl7eafNfQ==" /> <p>We read every piece of feedback, and take your input very seriously.</p> <textarea name="feedback" class="form-control width-full mb-2" style="height: 120px" id="feedback"></textarea> <input name="include_email" id="include_email" aria-label="Include my email address so I can be contacted" class="form-control mr-2" type="checkbox"> <label for="include_email" style="font-weight: normal">Include my email address so I can be contacted</label> </form></div> </scrollable-region> <div data-view-component="true" class="Overlay-footer Overlay-footer--alignEnd"> <button data-close-dialog-id="feedback-dialog" type="button" data-view-component="true" class="btn"> Cancel </button> <button form="code-search-feedback-form" data-action="click:qbsearch-input#submitFeedback" type="submit" data-view-component="true" class="btn-primary btn"> Submit feedback </button> </div> </dialog></dialog-helper> <custom-scopes data-target="qbsearch-input.customScopesManager"> <dialog-helper> <dialog data-target="custom-scopes.customScopesModalDialog" data-action="close:qbsearch-input#handleDialogClose cancel:qbsearch-input#handleDialogClose" id="custom-scopes-dialog" aria-modal="true" aria-labelledby="custom-scopes-dialog-title" aria-describedby="custom-scopes-dialog-description" data-view-component="true" class="Overlay Overlay-whenNarrow Overlay--size-medium Overlay--motion-scaleFade Overlay--disableScroll"> <div data-view-component="true" class="Overlay-header Overlay-header--divided"> <div class="Overlay-headerContentWrap"> <div class="Overlay-titleWrap"> <h1 class="Overlay-title " id="custom-scopes-dialog-title"> Saved searches </h1> <h2 id="custom-scopes-dialog-description" class="Overlay-description">Use saved searches to filter your results more quickly</h2> </div> <div class="Overlay-actionWrap"> <button data-close-dialog-id="custom-scopes-dialog" aria-label="Close" type="button" data-view-component="true" class="close-button Overlay-closeButton"><svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg></button> </div> </div> </div> <scrollable-region data-labelled-by="custom-scopes-dialog-title"> <div data-view-component="true" class="Overlay-body"> <div data-target="custom-scopes.customScopesModalDialogFlash"></div> <div hidden class="create-custom-scope-form" data-target="custom-scopes.createCustomScopeForm"> <!-- '"` --><!-- </textarea></xmp> --></option></form><form id="custom-scopes-dialog-form" data-turbo="false" action="/search/custom_scopes" accept-charset="UTF-8" method="post"><input type="hidden" data-csrf="true" name="authenticity_token" value="lrmdBSbXACRUvASLG5uefxaopWwgRcyvhScw3gdoRM4y656DVbClMBNxtQyjxMv20VDnAtpmDavaJSOdaTS96g==" /> <div data-target="custom-scopes.customScopesModalDialogFlash"></div> <input type="hidden" id="custom_scope_id" name="custom_scope_id" data-target="custom-scopes.customScopesIdField"> <div class="form-group"> <label for="custom_scope_name">Name</label> <auto-check src="/search/custom_scopes/check_name" required> <input type="text" name="custom_scope_name" id="custom_scope_name" data-target="custom-scopes.customScopesNameField" class="form-control" autocomplete="off" placeholder="github-ruby" required maxlength="50"> <input type="hidden" data-csrf="true" value="MgRVA2hbZV4YlqQCUvMrlAnF5Xayn5N3KruvYXeOl2NbXyUDZ1MRsxQOpTGIMzZZmsDc7KSi6APzLX1NVssg/g==" /> </auto-check> </div> <div class="form-group"> <label for="custom_scope_query">Query</label> <input type="text" name="custom_scope_query" id="custom_scope_query" data-target="custom-scopes.customScopesQueryField" class="form-control" autocomplete="off" placeholder="(repo:mona/a OR repo:mona/b) AND lang:python" required maxlength="500"> </div> <p class="text-small color-fg-muted"> To see all available qualifiers, see our <a class="Link--inTextBlock" href="https://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax">documentation</a>. </p> </form> </div> <div data-target="custom-scopes.manageCustomScopesForm"> <div data-target="custom-scopes.list"></div> </div> </div> </scrollable-region> <div data-view-component="true" class="Overlay-footer Overlay-footer--alignEnd Overlay-footer--divided"> <button data-action="click:custom-scopes#customScopesCancel" type="button" data-view-component="true" class="btn"> Cancel </button> <button form="custom-scopes-dialog-form" data-action="click:custom-scopes#customScopesSubmit" data-target="custom-scopes.customScopesSubmitButton" type="submit" data-view-component="true" class="btn-primary btn"> Create saved search </button> </div> </dialog></dialog-helper> </custom-scopes> </div> </qbsearch-input> <div class="position-relative HeaderMenu-link-wrap d-lg-inline-block"> <a href="/login?return_to=https%3A%2F%2Fgithub.com%2FInteractiveAdvertisingBureau%2FGDPR-Transparency-and-Consent-Framework%2Fblob%2Fmaster%2FTCFv2%2FIAB%2520Tech%2520Lab%2520-%2520CMP%2520API%2520v2.md" class="HeaderMenu-link HeaderMenu-link--sign-in HeaderMenu-button flex-shrink-0 no-underline d-none d-lg-inline-flex border border-lg-0 rounded rounded-lg-0 px-2 py-1" style="margin-left: 12px;" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"site header menu","repository_id":null,"auth_type":"SIGN_UP","originating_url":"https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md","user_id":null}}" data-hydro-click-hmac="d57e92b1e96573417bc8f97981cb2f5efaf4385caacf976c0f65732cb501e5ca" data-analytics-event="{"category":"Marketing nav","action":"click to go to homepage","label":"ref_page:Marketing;ref_cta:Sign in;ref_loc:Header"}" > Sign in </a> </div> <a href="/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fblob%2Fshow&source=header-repo&source_repo=InteractiveAdvertisingBureau%2FGDPR-Transparency-and-Consent-Framework" class="HeaderMenu-link HeaderMenu-link--sign-up HeaderMenu-button flex-shrink-0 d-flex d-lg-inline-flex no-underline border color-border-default rounded px-2 py-1" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"site header menu","repository_id":null,"auth_type":"SIGN_UP","originating_url":"https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md","user_id":null}}" data-hydro-click-hmac="d57e92b1e96573417bc8f97981cb2f5efaf4385caacf976c0f65732cb501e5ca" data-analytics-event="{"category":"Sign up","action":"click to sign up for account","label":"ref_page:/<user-name>/<repo-name>/blob/show;ref_cta:Sign up;ref_loc:header logged out"}" > Sign up </a> <button type="button" class="sr-only js-header-menu-focus-trap d-block d-lg-none">Reseting focus</button> </div> </div> </div> </div> </header> <div hidden="hidden" data-view-component="true" class="js-stale-session-flash stale-session-flash flash flash-warn flash-full"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert"> <path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> <span class="js-stale-session-flash-signed-in" hidden>You signed in with another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span> <span class="js-stale-session-flash-signed-out" hidden>You signed out in another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span> <span class="js-stale-session-flash-switched" hidden>You switched accounts on another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span> <button id="icon-button-18d9381a-8b57-4034-bd88-4618df06aeae" aria-labelledby="tooltip-fb671d3f-635c-451c-b040-af899500f0c6" type="button" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium flash-close js-flash-close"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x Button-visual"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg> </button><tool-tip id="tooltip-fb671d3f-635c-451c-b040-af899500f0c6" for="icon-button-18d9381a-8b57-4034-bd88-4618df06aeae" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Dismiss alert</tool-tip> </div> </div> <div id="start-of-content" class="show-on-focus"></div> <div id="js-flash-container" class="flash-container" data-turbo-replace> <template class="js-flash-template"> <div class="flash flash-full {{ className }}"> <div > <button autofocus class="flash-close js-flash-close" type="button" aria-label="Dismiss this message"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg> </button> <div aria-atomic="true" role="alert" class="js-flash-alert"> <div>{{ message }}</div> </div> </div> </div> </template> </div> <div class="application-main " data-commit-hovercards-enabled data-discussion-hovercards-enabled data-issue-and-pr-hovercards-enabled > <div itemscope itemtype="http://schema.org/SoftwareSourceCode" class=""> <main id="js-repo-pjax-container" > <div id="repository-container-header" class="pt-3 hide-full-screen" style="background-color: var(--page-header-bgColor, var(--color-page-header-bg));" data-turbo-replace> <div class="d-flex flex-nowrap flex-justify-end mb-3 px-3 px-lg-5" style="gap: 1rem;"> <div class="flex-auto min-width-0 width-fit"> <div class=" d-flex flex-wrap flex-items-center wb-break-word f3 text-normal"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo color-fg-muted mr-2"> <path d="M2 2.5A2.5 2.5 0 0 1 4.5 0h8.75a.75.75 0 0 1 .75.75v12.5a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h1.75v-2h-8a1 1 0 0 0-.714 1.7.75.75 0 1 1-1.072 1.05A2.495 2.495 0 0 1 2 11.5Zm10.5-1h-8a1 1 0 0 0-1 1v6.708A2.486 2.486 0 0 1 4.5 9h8ZM5 12.25a.25.25 0 0 1 .25-.25h3.5a.25.25 0 0 1 .25.25v3.25a.25.25 0 0 1-.4.2l-1.45-1.087a.249.249 0 0 0-.3 0L5.4 15.7a.25.25 0 0 1-.4-.2Z"></path> </svg> <span class="author flex-self-stretch" itemprop="author"> <a class="url fn" rel="author" data-hovercard-type="organization" data-hovercard-url="/orgs/InteractiveAdvertisingBureau/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="/InteractiveAdvertisingBureau"> InteractiveAdvertisingBureau </a> </span> <span class="mx-1 flex-self-stretch color-fg-muted">/</span> <strong itemprop="name" class="mr-2 flex-self-stretch"> <a data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" href="/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework">GDPR-Transparency-and-Consent-Framework</a> </strong> <span></span><span class="Label Label--secondary v-align-middle mr-1">Public</span> </div> </div> <div id="repository-details-container" class="flex-shrink-0" data-turbo-replace style="max-width: 70%;"> <ul class="pagehead-actions flex-shrink-0 d-none d-md-inline" style="padding: 2px 0;"> <li> <a href="/login?return_to=%2FInteractiveAdvertisingBureau%2FGDPR-Transparency-and-Consent-Framework" rel="nofollow" id="repository-details-watch-button" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"notification subscription menu watch","repository_id":null,"auth_type":"LOG_IN","originating_url":"https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md","user_id":null}}" data-hydro-click-hmac="5ca76a5bdedae9d453fa286f54e0da6eab5d874b5167ca6fbd4c3076e0a1610e" aria-label="You must be signed in to change notification settings" data-view-component="true" class="btn-sm btn"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-bell mr-2"> <path d="M8 16a2 2 0 0 0 1.985-1.75c.017-.137-.097-.25-.235-.25h-3.5c-.138 0-.252.113-.235.25A2 2 0 0 0 8 16ZM3 5a5 5 0 0 1 10 0v2.947c0 .05.015.098.042.139l1.703 2.555A1.519 1.519 0 0 1 13.482 13H2.518a1.516 1.516 0 0 1-1.263-2.36l1.703-2.554A.255.255 0 0 0 3 7.947Zm5-3.5A3.5 3.5 0 0 0 4.5 5v2.947c0 .346-.102.683-.294.97l-1.703 2.556a.017.017 0 0 0-.003.01l.001.006c0 .002.002.004.004.006l.006.004.007.001h10.964l.007-.001.006-.004.004-.006.001-.007a.017.017 0 0 0-.003-.01l-1.703-2.554a1.745 1.745 0 0 1-.294-.97V5A3.5 3.5 0 0 0 8 1.5Z"></path> </svg>Notifications </a> <tool-tip id="tooltip-debe5bca-d9e6-453c-8127-b66797a8f4af" for="repository-details-watch-button" popover="manual" data-direction="s" data-type="description" data-view-component="true" class="sr-only position-absolute">You must be signed in to change notification settings</tool-tip> </li> <li> <a icon="repo-forked" id="fork-button" href="/login?return_to=%2FInteractiveAdvertisingBureau%2FGDPR-Transparency-and-Consent-Framework" rel="nofollow" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"repo details fork button","repository_id":124251337,"auth_type":"LOG_IN","originating_url":"https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md","user_id":null}}" data-hydro-click-hmac="8199109c5b3543aee2935998116a928bab2fb397721e1411365b1eec4fd6c7be" data-view-component="true" class="btn-sm btn"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo-forked mr-2"> <path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"></path> </svg>Fork <span id="repo-network-counter" data-pjax-replace="true" data-turbo-replace="true" title="359" data-view-component="true" class="Counter">359</span> </a> </li> <li> <div data-view-component="true" class="BtnGroup d-flex"> <a href="/login?return_to=%2FInteractiveAdvertisingBureau%2FGDPR-Transparency-and-Consent-Framework" rel="nofollow" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"star button","repository_id":124251337,"auth_type":"LOG_IN","originating_url":"https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md","user_id":null}}" data-hydro-click-hmac="170b2794376cb94db0b1d2b3e0149bf8fae3d09a81736c3a9701d7e6e9947586" aria-label="You must be signed in to star a repository" data-view-component="true" class="tooltipped tooltipped-sw btn-sm btn"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-star v-align-text-bottom d-inline-block mr-2"> <path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"></path> </svg><span data-view-component="true" class="d-inline"> Star </span> <span id="repo-stars-counter-star" aria-label="872 users starred this repository" data-singular-suffix="user starred this repository" data-plural-suffix="users starred this repository" data-turbo-replace="true" title="872" data-view-component="true" class="Counter js-social-count">872</span> </a></div> </li> </ul> </div> </div> <div id="responsive-meta-container" data-turbo-replace> </div> <nav data-pjax="#js-repo-pjax-container" aria-label="Repository" data-view-component="true" class="js-repo-nav js-sidenav-container-pjax js-responsive-underlinenav overflow-hidden UnderlineNav px-3 px-md-4 px-lg-5"> <ul data-view-component="true" class="UnderlineNav-body list-style-none"> <li data-view-component="true" class="d-inline-flex"> <a id="code-tab" href="/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework" data-tab-item="i0code-tab" data-selected-links="repo_source repo_downloads repo_commits repo_releases repo_tags repo_branches repo_packages repo_deployments repo_attestations /InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g c" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Code","target":"UNDERLINE_NAV.TAB"}" aria-current="page" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item selected"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code UnderlineNav-octicon d-none d-sm-inline"> <path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path> </svg> <span data-content="Code">Code</span> <span id="code-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="issues-tab" href="/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/issues" data-tab-item="i1issues-tab" data-selected-links="repo_issues repo_labels repo_milestones /InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/issues" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g i" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Issues","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-issue-opened UnderlineNav-octicon d-none d-sm-inline"> <path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path> </svg> <span data-content="Issues">Issues</span> <span id="issues-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="13" data-view-component="true" class="Counter">13</span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="pull-requests-tab" href="/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/pulls" data-tab-item="i2pull-requests-tab" data-selected-links="repo_pulls checks /InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/pulls" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g p" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Pull requests","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-git-pull-request UnderlineNav-octicon d-none d-sm-inline"> <path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z"></path> </svg> <span data-content="Pull requests">Pull requests</span> <span id="pull-requests-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="2" data-view-component="true" class="Counter">2</span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="actions-tab" href="/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/actions" data-tab-item="i3actions-tab" data-selected-links="repo_actions /InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/actions" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g a" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Actions","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play UnderlineNav-octicon d-none d-sm-inline"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path> </svg> <span data-content="Actions">Actions</span> <span id="actions-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="projects-tab" href="/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/projects" data-tab-item="i4projects-tab" data-selected-links="repo_projects new_repo_project repo_project /InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/projects" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g b" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Projects","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-table UnderlineNav-octicon d-none d-sm-inline"> <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25ZM6.5 6.5v8h7.75a.25.25 0 0 0 .25-.25V6.5Zm8-1.5V1.75a.25.25 0 0 0-.25-.25H6.5V5Zm-13 1.5v7.75c0 .138.112.25.25.25H5v-8ZM5 5V1.5H1.75a.25.25 0 0 0-.25.25V5Z"></path> </svg> <span data-content="Projects">Projects</span> <span id="projects-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="0" hidden="hidden" data-view-component="true" class="Counter">0</span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="wiki-tab" href="/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/wiki" data-tab-item="i5wiki-tab" data-selected-links="repo_wiki /InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/wiki" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g w" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Wiki","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-book UnderlineNav-octicon d-none d-sm-inline"> <path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"></path> </svg> <span data-content="Wiki">Wiki</span> <span id="wiki-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="security-tab" href="/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/security" data-tab-item="i6security-tab" data-selected-links="security overview alerts policy token_scanning code_scanning /InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/security" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g s" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Security","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-shield UnderlineNav-octicon d-none d-sm-inline"> <path d="M7.467.133a1.748 1.748 0 0 1 1.066 0l5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667Zm.61 1.429a.25.25 0 0 0-.153 0l-5.25 1.68a.25.25 0 0 0-.174.238V7c0 1.358.275 2.666 1.057 3.86.784 1.194 2.121 2.34 4.366 3.297a.196.196 0 0 0 .154 0c2.245-.956 3.582-2.104 4.366-3.298C13.225 9.666 13.5 8.36 13.5 7V3.48a.251.251 0 0 0-.174-.237l-5.25-1.68ZM8.75 4.75v3a.75.75 0 0 1-1.5 0v-3a.75.75 0 0 1 1.5 0ZM9 10.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> <span data-content="Security">Security</span> <include-fragment src="/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/security/overall-count" accept="text/fragment+html"></include-fragment> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="insights-tab" href="/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/pulse" data-tab-item="i7insights-tab" data-selected-links="repo_graphs repo_contributors dependency_graph dependabot_updates pulse people community /InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/pulse" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Insights","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-graph UnderlineNav-octicon d-none d-sm-inline"> <path d="M1.5 1.75V13.5h13.75a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1-.75-.75V1.75a.75.75 0 0 1 1.5 0Zm14.28 2.53-5.25 5.25a.75.75 0 0 1-1.06 0L7 7.06 4.28 9.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.25-3.25a.75.75 0 0 1 1.06 0L10 7.94l4.72-4.72a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path> </svg> <span data-content="Insights">Insights</span> <span id="insights-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span> </a></li> </ul> <div style="visibility:hidden;" data-view-component="true" class="UnderlineNav-actions js-responsive-underlinenav-overflow position-absolute pr-3 pr-md-4 pr-lg-5 right-0"> <action-menu data-select-variant="none" data-view-component="true"> <focus-group direction="vertical" mnemonics retain> <button id="action-menu-8e162f03-999e-4396-b527-3687c61a1247-button" popovertarget="action-menu-8e162f03-999e-4396-b527-3687c61a1247-overlay" aria-controls="action-menu-8e162f03-999e-4396-b527-3687c61a1247-list" aria-haspopup="true" aria-labelledby="tooltip-342eb4c8-f014-4a9a-9e58-72881694669f" type="button" data-view-component="true" class="Button Button--iconOnly Button--secondary Button--medium UnderlineNav-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-kebab-horizontal Button-visual"> <path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path> </svg> </button><tool-tip id="tooltip-342eb4c8-f014-4a9a-9e58-72881694669f" for="action-menu-8e162f03-999e-4396-b527-3687c61a1247-button" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Additional navigation options</tool-tip> <anchored-position id="action-menu-8e162f03-999e-4396-b527-3687c61a1247-overlay" anchor="action-menu-8e162f03-999e-4396-b527-3687c61a1247-button" align="start" side="outside-bottom" anchor-offset="normal" popover="auto" data-view-component="true"> <div data-view-component="true" class="Overlay Overlay--size-auto"> <div data-view-component="true" class="Overlay-body Overlay-body--paddingNone"> <action-list> <div data-view-component="true"> <ul aria-labelledby="action-menu-8e162f03-999e-4396-b527-3687c61a1247-button" id="action-menu-8e162f03-999e-4396-b527-3687c61a1247-list" role="menu" data-view-component="true" class="ActionListWrap--inset ActionListWrap"> <li hidden="hidden" data-menu-item="i0code-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-ebfd08a5-6034-4ff4-b9b9-7489556e0f29" href="/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code"> <path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Code </span> </a> </li> <li hidden="hidden" data-menu-item="i1issues-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-bf2f73ac-de0a-4759-ab16-ac243c1582a7" href="/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/issues" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-issue-opened"> <path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Issues </span> </a> </li> <li hidden="hidden" data-menu-item="i2pull-requests-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-2e0db554-6867-4e9c-b4c4-88fe6f555583" href="/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/pulls" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-git-pull-request"> <path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Pull requests </span> </a> </li> <li hidden="hidden" data-menu-item="i3actions-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-3ae16411-5904-4b67-915a-9dced3bfc9fc" href="/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/actions" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Actions </span> </a> </li> <li hidden="hidden" data-menu-item="i4projects-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-e0c5d882-aae9-483c-ac07-187220ca90a2" href="/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/projects" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-table"> <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25ZM6.5 6.5v8h7.75a.25.25 0 0 0 .25-.25V6.5Zm8-1.5V1.75a.25.25 0 0 0-.25-.25H6.5V5Zm-13 1.5v7.75c0 .138.112.25.25.25H5v-8ZM5 5V1.5H1.75a.25.25 0 0 0-.25.25V5Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Projects </span> </a> </li> <li hidden="hidden" data-menu-item="i5wiki-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-19faaea9-8d31-4647-b650-530a398214b7" href="/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/wiki" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-book"> <path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Wiki </span> </a> </li> <li hidden="hidden" data-menu-item="i6security-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-65cf194d-1fa8-487d-923c-2af3bb9b56ce" href="/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/security" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-shield"> <path d="M7.467.133a1.748 1.748 0 0 1 1.066 0l5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667Zm.61 1.429a.25.25 0 0 0-.153 0l-5.25 1.68a.25.25 0 0 0-.174.238V7c0 1.358.275 2.666 1.057 3.86.784 1.194 2.121 2.34 4.366 3.297a.196.196 0 0 0 .154 0c2.245-.956 3.582-2.104 4.366-3.298C13.225 9.666 13.5 8.36 13.5 7V3.48a.251.251 0 0 0-.174-.237l-5.25-1.68ZM8.75 4.75v3a.75.75 0 0 1-1.5 0v-3a.75.75 0 0 1 1.5 0ZM9 10.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Security </span> </a> </li> <li hidden="hidden" data-menu-item="i7insights-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-20e873d7-53fb-49d6-8729-5df1efda40e2" href="/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/pulse" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-graph"> <path d="M1.5 1.75V13.5h13.75a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1-.75-.75V1.75a.75.75 0 0 1 1.5 0Zm14.28 2.53-5.25 5.25a.75.75 0 0 1-1.06 0L7 7.06 4.28 9.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.25-3.25a.75.75 0 0 1 1.06 0L10 7.94l4.72-4.72a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Insights </span> </a> </li> </ul> </div></action-list> </div> </div></anchored-position> </focus-group> </action-menu></div> </nav> </div> <turbo-frame id="repo-content-turbo-frame" target="_top" data-turbo-action="advance" class=""> <div id="repo-content-pjax-container" class="repository-content " > <react-app app-name="react-code-view" initial-path="/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md" style="display: block; min-height: calc(100vh - 64px);" data-attempted-ssr="true" data-ssr="true" data-lazy="false" data-alternate="false" > <script type="application/json" data-target="react-app.embeddedData">{"payload":{"allShortcutsEnabled":false,"fileTree":{"TCFv2":{"items":[{"name":"Additional Vendor Information List Specification.md","path":"TCFv2/Additional Vendor Information List Specification.md","contentType":"file"},{"name":"IAB Tech Lab - CMP API v2.md","path":"TCFv2/IAB Tech Lab - CMP API v2.md","contentType":"file"},{"name":"IAB Tech Lab - Consent string and vendor list formats v2.md","path":"TCFv2/IAB Tech Lab - Consent string and vendor list formats v2.md","contentType":"file"},{"name":"IAB Tech Lab - Device storage duration and access disclosure.md","path":"TCFv2/IAB Tech Lab - Device storage duration and access disclosure.md","contentType":"file"},{"name":"TCF-Implementation-Guidelines.md","path":"TCFv2/TCF-Implementation-Guidelines.md","contentType":"file"},{"name":"Vendor Device Storage \u0026 Operational Disclosures.md","path":"TCFv2/Vendor Device Storage \u0026 Operational Disclosures.md","contentType":"file"}],"totalCount":6},"":{"items":[{"name":"Consent String SDK","path":"Consent String SDK","contentType":"directory"},{"name":"TCFv2","path":"TCFv2","contentType":"directory"},{"name":".DS_Store","path":".DS_Store","contentType":"file"},{"name":"CMP JS API v1.1 Final.md","path":"CMP JS API v1.1 Final.md","contentType":"file"},{"name":"Consent string and vendor list formats v1.1 Final.md","path":"Consent string and vendor list formats v1.1 Final.md","contentType":"file"},{"name":"Mobile In-App Consent APIs v1.0 Final.md","path":"Mobile In-App Consent APIs v1.0 Final.md","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"},{"name":"URL-based Consent Passing_ Framework Guidance.md","path":"URL-based Consent Passing_ Framework Guidance.md","contentType":"file"},{"name":"pubvendors.json v1.0 Draft for Public Comment.md","path":"pubvendors.json v1.0 Draft for Public Comment.md","contentType":"file"},{"name":"v1.1 Implementation Guidelines.md","path":"v1.1 Implementation Guidelines.md","contentType":"file"}],"totalCount":10}},"fileTreeProcessingTime":6.262402,"foldersToFetch":[],"repo":{"id":124251337,"defaultBranch":"master","name":"GDPR-Transparency-and-Consent-Framework","ownerLogin":"InteractiveAdvertisingBureau","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2018-03-07T14:55:20.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/8918196?v=4","public":true,"private":false,"isOrgOwned":true},"codeLineWrapEnabled":false,"symbolsExpanded":false,"treeExpanded":true,"refInfo":{"name":"master","listCacheKey":"v0:1731365706.0","canEdit":false,"refType":"branch","currentOid":"a4b5d101fe3dffcf98d4cb2d0aa8e378c4a76016"},"path":"TCFv2/IAB Tech Lab - CMP API v2.md","currentUser":null,"blob":{"rawLines":null,"stylingDirectives":null,"colorizedLines":null,"csv":null,"csvError":null,"dependabotInfo":{"showConfigurationBanner":false,"configFilePath":null,"networkDependabotPath":"/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/network/updates","dismissConfigurationNoticePath":"/settings/dismiss-notice/dependabot_configuration_notice","configurationNoticeDismissed":null},"displayName":"IAB Tech Lab - CMP API v2.md","displayUrl":"https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md?raw=true","headerInfo":{"blobSize":"61.7 KB","deleteTooltip":"You must be signed in to make or propose changes","editTooltip":"You must be signed in to make or propose changes","ghDesktopPath":"https://desktop.github.com","isGitLfs":false,"onBranch":true,"shortPath":"cbe891d","siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2FInteractiveAdvertisingBureau%2FGDPR-Transparency-and-Consent-Framework%2Fblob%2Fmaster%2FTCFv2%2FIAB%2520Tech%2520Lab%2520-%2520CMP%2520API%2520v2.md","isCSV":false,"isRichtext":true,"toc":[{"level":1,"text":"Consent Management Platform API","anchor":"consent-management-platform-api","htmlText":"Consent Management Platform API"},{"level":2,"text":"Version History","anchor":"version-history","htmlText":"Version History"},{"level":2,"text":"Introduction","anchor":"introduction","htmlText":"Introduction"},{"level":3,"text":"About the Transparency \u0026 Consent Framework","anchor":"about-the-transparency--consent-framework","htmlText":"About the Transparency \u0026amp; Consent Framework"},{"level":3,"text":"License","anchor":"license","htmlText":"License"},{"level":3,"text":"Disclaimer","anchor":"disclaimer","htmlText":"Disclaimer"},{"level":3,"text":"About IAB Tech Lab","anchor":"about-iab-tech-lab","htmlText":"About IAB Tech Lab"},{"level":3,"text":"About IAB Europe","anchor":"about-iab-europe","htmlText":"About IAB Europe"},{"level":2,"text":"CMP API v2.0","anchor":"cmp-api-v20","htmlText":"CMP API v2.0"},{"level":3,"text":"What does the CMP API support?","anchor":"what-does-the-cmp-api-support","htmlText":"What does the CMP API support?"},{"level":3,"text":"What is the Global Vendor List?","anchor":"what-is-the-global-vendor-list","htmlText":"What is the Global Vendor List?"},{"level":3,"text":"How does the CMP provide the API?","anchor":"how-does-the-cmp-provide-the-api","htmlText":"How does the CMP provide the API?"},{"level":3,"text":"What required API commands must a CMP support?","anchor":"what-required-api-commands-must-a-cmp-support","htmlText":"What required API commands must a CMP support?"},{"level":4,"text":"getTCData","anchor":"gettcdata","htmlText":"getTCData"},{"level":4,"text":"ping","anchor":"ping","htmlText":"ping"},{"level":4,"text":"addEventListener","anchor":"addeventlistener","htmlText":"addEventListener"},{"level":4,"text":"removeEventListener","anchor":"removeeventlistener","htmlText":"removeEventListener"},{"level":3,"text":"What optional API commands might a CMP support?","anchor":"what-optional-api-commands-might-a-cmp-support","htmlText":"What optional API commands might a CMP support?"},{"level":4,"text":"getInAppTCData","anchor":"getinapptcdata","htmlText":"getInAppTCData"},{"level":4,"text":"getVendorList","anchor":"getvendorlist","htmlText":"getVendorList"},{"level":3,"text":"What objects are returned from the API?","anchor":"what-objects-are-returned-from-the-api","htmlText":"What objects are returned from the API?"},{"level":4,"text":"TCData","anchor":"tcdata","htmlText":"TCData"},{"level":4,"text":"PingReturn","anchor":"pingreturn","htmlText":"PingReturn"},{"level":4,"text":"Ping Status Codes","anchor":"ping-status-codes","htmlText":"Ping Status Codes"},{"level":4,"text":"InAppTCData","anchor":"inapptcdata","htmlText":"InAppTCData"},{"level":3,"text":"In-App Details","anchor":"in-app-details","htmlText":"In-App Details"},{"level":4,"text":"How is a CMP used in-app?","anchor":"how-is-a-cmp-used-in-app","htmlText":"How is a CMP used in-app?"},{"level":4,"text":"What is the CMP in-app internal structure for the defined API?","anchor":"what-is-the-cmp-in-app-internal-structure-for-the-defined-api","htmlText":"What is the CMP in-app internal structure for the defined API?"},{"level":4,"text":"How do third-party SDKs (vendors) access the consent information in-app?","anchor":"how-do-third-party-sdks-vendors-access-the-consent-information-in-app","htmlText":"How do third-party SDKs (vendors) access the consent information in-app?"},{"level":4,"text":"How does ad mediation work in-app?","anchor":"how-does-ad-mediation-work-in-app","htmlText":"How does ad mediation work in-app?"},{"level":5,"text":"Mediation SDK","anchor":"mediation-sdk","htmlText":"Mediation SDK"},{"level":5,"text":"Vendor","anchor":"vendor","htmlText":"Vendor"},{"level":3,"text":"CTV Details","anchor":"ctv-details","htmlText":"CTV Details"},{"level":4,"text":"How is a CMP used in the CTV context?","anchor":"how-is-a-cmp-used-in-the-ctv-context","htmlText":"How is a CMP used in the CTV context?"},{"level":4,"text":"Web Runtime","anchor":"web-runtime","htmlText":"Web Runtime"},{"level":4,"text":"Native","anchor":"native","htmlText":"Native"},{"level":4,"text":"CTV Examples","anchor":"ctv-examples","htmlText":"CTV Examples"},{"level":2,"text":"Using the CMP API","anchor":"using-the-cmp-api","htmlText":"Using the CMP API"},{"level":3,"text":"How do ad tags work?","anchor":"how-do-ad-tags-work","htmlText":"How do ad tags work?"},{"level":3,"text":"How does the \"version\" parameter work?","anchor":"how-does-the-version-parameter-work","htmlText":"How does the \"version\" parameter work?"},{"level":3,"text":"What does the gdprApplies value mean?","anchor":"what-does-the-gdprapplies-value-mean","htmlText":"What does the gdprApplies value mean?"},{"level":3,"text":"Details for vendors","anchor":"details-for-vendors","htmlText":"Details for vendors"},{"level":4,"text":"How can scripts on a page determine if there is a CMP present?","anchor":"how-can-scripts-on-a-page-determine-if-there-is-a-cmp-present","htmlText":"How can scripts on a page determine if there is a CMP present?"},{"level":4,"text":"How can scripts determine if the CMP script is loaded yet?","anchor":"how-can-scripts-determine-if-the-cmp-script-is-loaded-yet","htmlText":"How can scripts determine if the CMP script is loaded yet?"},{"level":4,"text":"How does the CMP \"stub\" API work?","anchor":"how-does-the-cmp-stub-api-work","htmlText":"How does the CMP \"stub\" API work?"},{"level":4,"text":"Requirements for the CMP \"stub\" API script","anchor":"requirements-for-the-cmp-stub-api-script","htmlText":"Requirements for the CMP \"stub\" API script"},{"level":4,"text":"Is there a sample CMP “stub” API script?","anchor":"is-there-a-sample-cmp-stub-api-script","htmlText":"Is there a sample CMP “stub” API script?"},{"level":3,"text":"How can vendors that use iframes call the CMP API from an iframe?","anchor":"how-can-vendors-that-use-iframes-call-the-cmp-api-from-an-iframe","htmlText":"How can vendors that use iframes call the CMP API from an iframe?"},{"level":4,"text":"Using postmessage","anchor":"using-postmessage","htmlText":"Using postmessage"},{"level":4,"text":"Is there a sample iframe script call to the CMP API?","anchor":"is-there-a-sample-iframe-script-call-to-the-cmp-api","htmlText":"Is there a sample iframe script call to the CMP API?"},{"level":3,"text":"From where will the API retrieve the TC string?","anchor":"from-where-will-the-api-retrieve-the-tc-string","htmlText":"From where will the API retrieve the TC string?"},{"level":2,"text":"Major Changes from 2.0","anchor":"major-changes-from-20","htmlText":"Major Changes from 2.0"},{"level":2,"text":"Major Changes from 1.1","anchor":"major-changes-from-11","htmlText":"Major Changes from 1.1"}],"lineInfo":{"truncatedLoc":"1148","truncatedSloc":"840"},"mode":"file"},"image":false,"isCodeownersFile":null,"isPlain":false,"isValidLegacyIssueTemplate":false,"issueTemplate":null,"discussionTemplate":null,"language":"Markdown","languageID":222,"large":false,"planSupportInfo":{"repoIsFork":null,"repoOwnedByCurrentUser":null,"requestFullPath":"/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md","showFreeOrgGatedFeatureMessage":null,"showPlanSupportBanner":null,"upgradeDataAttributes":null,"upgradePath":null},"publishBannersInfo":{"dismissActionNoticePath":"/settings/dismiss-notice/publish_action_from_dockerfile","releasePath":"/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/releases/new?marketplace=true","showPublishActionBanner":false},"rawBlobUrl":"https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/raw/refs/heads/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md","renderImageOrRaw":false,"richText":"\u003carticle class=\"markdown-body entry-content container-lg\" itemprop=\"text\"\u003e\u003cp dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://user-images.githubusercontent.com/19175352/38649177-0d37d17c-3daa-11e8-8934-f0fb47919716.png\"\u003e\u003cimg src=\"https://user-images.githubusercontent.com/19175352/38649177-0d37d17c-3daa-11e8-8934-f0fb47919716.png\" alt=\"iab tech lab\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eConsent Management Platform API\u003c/h1\u003e\u003ca id=\"user-content-consent-management-platform-api\" class=\"anchor\" aria-label=\"Permalink: Consent Management Platform API\" href=\"#consent-management-platform-api\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eIAB Europe Transparency \u0026amp; Consent Framework\u003c/strong\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eFinal v.2.2 May 2023\u003c/strong\u003e\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"#version-history\"\u003eVersion History\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#introduction\"\u003eIntroduction\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"#about-the-transparency--consent-framework\"\u003eAbout the Transparency \u0026amp; Consent Framework\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#license\"\u003eLicense\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#disclaimer\"\u003eDisclaimer\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#about-iab-tech-lab\"\u003eAbout IAB Tech Lab\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#about-iab-europe\"\u003eAbout IAB Europe\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#cmp-api-v20\"\u003eCMP API v2.0\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"#what-does-the-cmp-api-support\"\u003eWhat does the CMP API support?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#what-is-the-global-vendor-list\"\u003eWhat is the Global Vendor List?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#how-does-the-cmp-provide-the-api\"\u003eHow does the CMP provide the API?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#what-required-api-commands-must-a-cmp-support\"\u003eWhat required API commands must a CMP support?\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"#gettcdata\"\u003e\u003ccode\u003egetTCData\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#ping\"\u003e\u003ccode\u003eping\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#addeventlistener\"\u003e\u003ccode\u003eaddEventListener\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#removeeventlistener\"\u003e\u003ccode\u003eremoveEventListener\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#what-optional-api-commands-might-a-cmp-support\"\u003eWhat optional API commands might a CMP support?\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"#getinapptcdata\"\u003e\u003ccode\u003egetInAppTCData\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#getvendorlist\"\u003e\u003ccode\u003egetVendorList\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#what-objects-are-returned-from-the-api\"\u003eWhat objects are returned from the API?\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"#tcdata\"\u003e\u003ccode\u003eTCData\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#pingreturn\"\u003e\u003ccode\u003ePingReturn\u003c/code\u003e\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"#ping-status-codes\"\u003ePing Status Codes\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#inapptcdata\"\u003e\u003ccode\u003eInAppTCData\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#in-app-details\"\u003eIn-App Details\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"#how-is-a-cmp-used-in-app\"\u003eHow is a CMP used in-app?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#what-is-the-cmp-in-app-internal-structure-for-the-defined-api\"\u003eWhat is the CMP in-app internal structure for the defined API?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#how-do-third-party-sdks-vendors-access-the-consent-information-in-app\"\u003eHow do third-party SDKs (vendors) access the consent information in-app?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#how-does-ad-mediation-work-in-app\"\u003eHow does ad mediation work in-app?\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"#mediation-sdk\"\u003eMediation SDK\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#vendor\"\u003eVendor\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#ctv-details\"\u003eCTV Details\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"#how-is-a-cmp-used-in-the-ctv-context\"\u003eHow is a CMP used in the CTV context?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#web-runtime\"\u003eWeb Runtime\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#native\"\u003eNative\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#using-the-cmp-api\"\u003eUsing the CMP API\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"#how-do-ad-tags-work\"\u003eHow do ad tags work?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#how-does-the-version-parameter-work\"\u003eHow does the \"version\" parameter work?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#what-does-the-gdprapplies-value-mean\"\u003eWhat does the gdprApplies value mean?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#details-for-vendors\"\u003eDetails for vendors\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"#how-can-scripts-on-a-page-determine-if-there-is-a-cmp-present\"\u003eHow can scripts on a page determine if there is a CMP present?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#how-can-scripts-determine-if-the-cmp-script-is-loaded-yet\"\u003eHow can scripts determine if the CMP script is loaded yet?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#how-does-the-cmp-stub-api-work\"\u003eHow does the CMP “stub” API work?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#requirements-for-the-cmp-stub-api-script\"\u003eRequirements for the CMP “stub” API script\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#is-there-a-sample-cmp-stub-api-script\"\u003eIs there a sample CMP “stub” API script?\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#how-can-vendors-that-use-iframes-call-the-cmp-api-from-an-iframe\"\u003eHow can vendors that use iframes call the CMP API from an iframe?\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"#using-postmessage\"\u003eUsing postmessage\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#is-there-a-sample-iframe-script-call-to-the-cmp-api\"\u003eIs there a sample iframe script call to the CMP API?\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#from-where-will-the-api-retrieve-the-tc-string\"\u003eFrom where will the API retrieve the TC string?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#major-changes-from-20\"\u003eMajor Changes from 2.0\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#major-changes-from-11\"\u003eMajor Changes from 1.1\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eVersion History\u003c/h2\u003e\u003ca id=\"user-content-version-history\" class=\"anchor\" aria-label=\"Permalink: Version History\" href=\"#version-history\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"left\"\u003eDate\u003c/th\u003e\n\u003cth align=\"left\"\u003eVersion\u003c/th\u003e\n\u003cth align=\"left\"\u003eComments\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003eJanuary 2024\u003c/td\u003e\n\u003ctd align=\"left\"\u003e2.2\u003c/td\u003e\n\u003ctd align=\"left\"\u003eAdded details for CTV support\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003eMay 2023\u003c/td\u003e\n\u003ctd align=\"left\"\u003e2.2\u003c/td\u003e\n\u003ctd align=\"left\"\u003eUpdate to further strengthen the TCF as a standard in the industry: Deprecated API command \"getTCData\".\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003eSeptember 2021\u003c/td\u003e\n\u003ctd align=\"left\"\u003e2.0\u003c/td\u003e\n\u003ctd align=\"left\"\u003eDeprecation of Global Scope and OOB \u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003eFebruary 2020\u003c/td\u003e\n\u003ctd align=\"left\"\u003e2.0\u003c/td\u003e\n\u003ctd align=\"left\"\u003eRemoved CMP List; added included in the Consent String and Vendor List Specification \u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003eFebruary 2020\u003c/td\u003e\n\u003ctd align=\"left\"\u003e2.0\u003c/td\u003e\n\u003ctd align=\"left\"\u003eUpdated stub example to reference open-source library, change addEventListener/removeEventListener interface, clarify addEventListener callback invocation time, and remove SafeFrame proxy communications \u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003eDecember 2019\u003c/td\u003e\n\u003ctd align=\"left\"\u003e2.0\u003c/td\u003e\n\u003ctd align=\"left\"\u003eUpdated with reference to CMP List, Updated macros to be upper case, Added cmpStatus to be surfaced in both the API calls and the TCData object, and fixed case in a reference to IABTCF_CmpSdkID \u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003eAugust 2019\u003c/td\u003e\n\u003ctd align=\"left\"\u003e2.0\u003c/td\u003e\n\u003ctd align=\"left\"\u003eFinal version released for adoption\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003eApril 2019\u003c/td\u003e\n\u003ctd align=\"left\"\u003e2.0\u003c/td\u003e\n\u003ctd align=\"left\"\u003eReleased for public comment\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003eApril 2018\u003c/td\u003e\n\u003ctd align=\"left\"\u003e1.1\u003c/td\u003e\n\u003ctd align=\"left\"\u003eFirst version released to the public\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eIntroduction\u003c/h2\u003e\u003ca id=\"user-content-introduction\" class=\"anchor\" aria-label=\"Permalink: Introduction\" href=\"#introduction\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis document is one of the IAB Europe Transparency and Consent Framework (TCF) Specifications. It defines the API for Consent Management Providers (CMPs). The CMP API v2 is the interface a CMP provides for callers (web and in-app) to access information regarding the transparency and consent disclosed and obtained from the end user by the CMP. Both required functionality that the CMP must provide and optional features are described.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe General Data Protection Regulation (GDPR) requires a high level of accountability for how personal data is processed for users consuming content online or in-app. Specifically, GDPR requires a legal basis for such processing. Two of the legal bases described in the GDPR are the most relevant to organizations that operate in the digital advertising ecosystem. Such organizations need to either obtain consent from the user to process their personal data, or establish legitimate interests for processing data such that the interests and fundamental rights of the user are not overriding.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUnder the GDPR, controllers are required to create and maintain records of compliance. While compliance is important, implementation came with heavy technical challenges. Clear standards for a common technical solution would be needed.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIAB Europe established the TCF to support compliance with the GDPR in the context of digital advertising. This framework is built on four components: a Global Vendor List (GVL), a Transparency and Consent String (TC String) to store data, an API for CMPs to create and process the TC String, and the Policies that govern how the TCF is used.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003ePrescribed use of the TCF establishes an audit trail to help maintain compliance with the GDPR, but the real benefit to the digital advertising ecosystem is a safer Internet for consumers, and more reliable data for brands and publishers. As adoption of the TCF increases, compliance becomes more scalable and data becomes more meaningful.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eTo participate in the use of the TCF, become familiar with the Policies for using it. To have transparency and consent established and signaled for your online services, apply to be added to the GVL. To play a role in creating a TC String for signaling status on transparency and user consent, sign up with IAB Europe to become a CMP. CMPs must follow technical standards provided in this document for creating TC Strings in compliance with \u003ca href=\"https://iabeurope.eu/iab-europe-transparency-consent-framework-policies/\" rel=\"nofollow\"\u003eTCF Policy\u003c/a\u003e. They must also follow technical standards for using the CMP API specified in this document to receive and process information provided in the TC String.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eAbout the Transparency \u0026amp; Consent Framework\u003c/h3\u003e\u003ca id=\"user-content-about-the-transparency--consent-framework\" class=\"anchor\" aria-label=\"Permalink: About the Transparency \u0026amp; Consent Framework\" href=\"#about-the-transparency--consent-framework\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIAB Europe Transparency \u0026amp; Consent Framework (TCF) has a simple objective to help all parties in the digital advertising chain ensure that they comply with the EU’s General Data Protection Regulation and ePrivacy Directive when processing personal data or accessing and/or storing information on a user’s device, such as cookies, advertising identifiers, device identifiers and other tracking technologies. IAB Tech Lab stewards the development of these technical specifications.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eResources including policy FAQ, Global Vendor List, and CMP List can be found at \u003ca href=\"http://iabeurope.eu/tcf\" rel=\"nofollow\"\u003eiabeurope.eu/tcf\u003c/a\u003e.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eLicense\u003c/h3\u003e\u003ca id=\"user-content-license\" class=\"anchor\" aria-label=\"Permalink: License\" href=\"#license\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIAB Europe Transparency and Consent Framework technical specifications governed by the IAB Tech Lab is licensed under a Creative Commons Attribution 3.0 License. To view a copy of this license, visit\u003ca href=\"http://creativecommons.org/licenses/by/3.0/\" rel=\"nofollow\"\u003e creativecommons.org/licenses/by/3.0/\u003c/a\u003e or write to Creative Commons, 171 Second Street, Suite 300, San Francisco, CA 94105, USA.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/44b025552896b2fa5e45d88fcd1f22d4c658367aedbef82820acc3e57a6cfb10/68747470733a2f2f64726976652e676f6f676c652e636f6d2f75633f69643d3163627745476c6238533639536e6449446f486e7663355f3354666d6b474d3752\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/44b025552896b2fa5e45d88fcd1f22d4c658367aedbef82820acc3e57a6cfb10/68747470733a2f2f64726976652e676f6f676c652e636f6d2f75633f69643d3163627745476c6238533639536e6449446f486e7663355f3354666d6b474d3752\" alt=\"\" data-canonical-src=\"https://drive.google.com/uc?id=1cbwEGlb8S69SndIDoHnvc5_3TfmkGM7R\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDisclaimer\u003c/h3\u003e\u003ca id=\"user-content-disclaimer\" class=\"anchor\" aria-label=\"Permalink: Disclaimer\" href=\"#disclaimer\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eTHE STANDARDS, THE SPECIFICATIONS, THE MEASUREMENT GUIDELINES, AND ANY OTHER MATERIALS OR SERVICES PROVIDED TO OR USED BY YOU HEREUNDER (THE “PRODUCTS AND SERVICES”) ARE PROVIDED “AS IS” AND “AS AVAILABLE,” AND IAB TECHNOLOGY LABORATORY, INC. (“TECH LAB”) MAKES NO WARRANTY WITH RESPECT TO THE SAME AND HEREBY DISCLAIMS ANY AND ALL EXPRESS, IMPLIED, OR STATUTORY WARRANTIES, INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AVAILABILITY, ERROR-FREE OR UNINTERRUPTED OPERATION, AND ANY WARRANTIES ARISING FROM A COURSE OF DEALING, COURSE OF PERFORMANCE, OR USAGE OF TRADE. TO THE EXTENT THAT TECH LAB MAY NOT AS A MATTER OF APPLICABLE LAW DISCLAIM ANY IMPLIED WARRANTY, THE SCOPE AND DURATION OF SUCH WARRANTY WILL BE THE MINIMUM PERMITTED UNDER SUCH LAW. THE PRODUCTS AND SERVICES DO NOT CONSTITUTE BUSINESS OR LEGAL ADVICE. TECH LAB DOES NOT WARRANT THAT THE PRODUCTS AND SERVICES PROVIDED TO OR USED BY YOU HEREUNDER SHALL CAUSE YOU AND/OR YOUR PRODUCTS OR SERVICES TO BE IN COMPLIANCE WITH ANY APPLICABLE LAWS, REGULATIONS, OR SELF-REGULATORY FRAMEWORKS, AND YOU ARE SOLELY RESPONSIBLE FOR COMPLIANCE WITH THE SAME.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eAbout IAB Tech Lab\u003c/h3\u003e\u003ca id=\"user-content-about-iab-tech-lab\" class=\"anchor\" aria-label=\"Permalink: About IAB Tech Lab\" href=\"#about-iab-tech-lab\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe IAB Technology Laboratory (Tech Lab) is a non-profit consortium that engages a member community globally to develop foundational technology and standards that enable growth and trust in the digital media ecosystem.. Comprised of digital publishers, ad technology firms, agencies, marketers, and other member companies, IAB Tech Lab focuses on improving the digital advertising supply chain, measurement, and consumer experiences, while promoting responsible use of data. Its work includes the OpenRTB real-time bidding protocol, ads.txt anti-fraud specification, Open Measurement SDK for viewability and verification, VAST video specification, and DigiTrust identity service. Board members include ExtremeReach, Facebook, Google, GroupM, Hearst Digital Media, Index Exchange, Integral Ad Science, LinkedIn, LiveRamp, MediaMath, Microsoft, Oracle Data Cloud, Pandora, PubMatic, Quantcast, Rakuten Marketing, Telaria, The Trade Desk, Verizon Media Group, Xandr, and Yahoo! Japan. Established in 2014, the IAB Tech Lab is headquartered in New York City with staff in San Francisco, Seattle, and London. Learn more at \u003ca href=\"https://www.iabtechlab.com\" rel=\"nofollow\"\u003eiabtechlab.com\u003c/a\u003e.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eAbout IAB Europe\u003c/h3\u003e\u003ca id=\"user-content-about-iab-europe\" class=\"anchor\" aria-label=\"Permalink: About IAB Europe\" href=\"#about-iab-europe\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIAB Europe is the European-level association for the digital marketing and advertising ecosystem. Through its membership of National IABs and media, technology and marketing companies, its mission is to lead political representation and promote industry collaboration to deliver frameworks, standards and industry programmes that enable business to thrive in the European market.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eLearn more about IAB Europe here: \u003ca href=\"https://www.iabeurope.eu/\" rel=\"nofollow\"\u003eiabeurope.eu/\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCMP API v2.0\u003c/h2\u003e\u003ca id=\"user-content-cmp-api-v20\" class=\"anchor\" aria-label=\"Permalink: CMP API v2.0\" href=\"#cmp-api-v20\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eWhat does the CMP API support?\u003c/h3\u003e\u003ca id=\"user-content-what-does-the-cmp-api-support\" class=\"anchor\" aria-label=\"Permalink: What does the CMP API support?\" href=\"#what-does-the-cmp-api-support\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eConsent Management Providers (CMPs) provide a user interface to establish transparency to users, and obtain consent or register objections from end users, and capture their preferences in Signals. These Signals are packaged in a standardized, easily-communicated payload called a TC String. The CMP API provides a standardized means for parties, such as the hosting publisher or an advertising vendor, to access these preferences managed by the CMP.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUsing the API, scripts may obtain the TC String payload as well as the information it contains, which is ready to use without having to understand how to \"unpack\" the payload format. This makes it easy to make immediate data processing decisions based on the returned information.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eCMPs may provide proprietary interfaces for specialised features or capabilities. The design and operation of a proprietary interface is documented in the IAB Europe Transparency and Consent Framework Policies.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThis document specifies required functionality that the CMP must provide in accordance with the TCF. Any CMP functionality, including a publisher CMP or any UI and configuration, are provided by a designated CMP and using this CMP API. Other standardized APIs fall outside the TCF and may not be aligned to TCF policies.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eWhat is the Global Vendor List?\u003c/h3\u003e\u003ca id=\"user-content-what-is-the-global-vendor-list\" class=\"anchor\" aria-label=\"Permalink: What is the Global Vendor List?\" href=\"#what-is-the-global-vendor-list\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe Global Vendor List (GVL) is a technical document that CMPs download from a domain managed by IAB Europe. It lists all registered and approved Vendors, as well as standard Purposes, Features, Special Purposes, Special Features, Stacks and Data Categories used in conjunction with purposes. The information stored in the GVL is used for determining what legal disclosures must be made to the user. IAB Europe manages and publishes the GVL.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eSee the ‘The Global Vendor List’ section in the ‘Consent string and vendor list formats v2’ spec which describes the content and the use of the global vendor list in detail.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eHow does the CMP provide the API?\u003c/h3\u003e\u003ca id=\"user-content-how-does-the-cmp-provide-the-api\" class=\"anchor\" aria-label=\"Permalink: How does the CMP provide the API?\" href=\"#how-does-the-cmp-provide-the-api\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eEvery consent manager MUST provide the following API function:\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003e\u003ccode\u003e__tcfapi(command, version, callback, parameter)\u003c/code\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe function \u003ccode\u003e__tcfapi\u003c/code\u003e \u003cstrong\u003emust always be a function\u003c/strong\u003e and cannot be any other type, even if only temporarily on initialization – the API must be able to handle calls at all times.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eSecondarily, CMPs must provide a proxy for postMessage events targeted to the \u003ccode\u003e__tcfapi\u003c/code\u003e interface sent from within nested iframes. See \u003ca href=\"#how-can-vendors-that-use-iframes-call-the-cmp-api-from-an-iframe\"\u003ethe section on iframes\u003c/a\u003e for information.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eWhat required API commands must a CMP support?\u003c/h3\u003e\u003ca id=\"user-content-what-required-api-commands-must-a-cmp-support\" class=\"anchor\" aria-label=\"Permalink: What required API commands must a CMP support?\" href=\"#what-required-api-commands-must-a-cmp-support\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAll CMPs must support three required API commands: \u003ca href=\"#ping\"\u003e\u003ccode\u003e'ping'\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"#addeventlistener\"\u003e\u003ccode\u003e'addEventListener'\u003c/code\u003e\u003c/a\u003e and \u003ca href=\"#removeeventlistener\"\u003e\u003ccode\u003e'removeEventListener'\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e\u003ccode\u003egetTCData\u003c/code\u003e\u003c/h4\u003e\u003ca id=\"user-content-gettcdata\" class=\"anchor\" aria-label=\"Permalink: getTCData\" href=\"#gettcdata\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eDeprecated in TCF v2.2. Add an \u003ca href=\"#addeventlistener\"\u003e\u003ccode\u003e'addEventListener'\u003c/code\u003e\u003c/a\u003e and use its callback function to access the tcData object.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e\u003ccode\u003eping\u003c/code\u003e\u003c/h4\u003e\u003ca id=\"user-content-ping\" class=\"anchor\" aria-label=\"Permalink: ping\" href=\"#ping\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"right\"\u003eargument name\u003c/th\u003e\n\u003cth align=\"center\"\u003etype\u003c/th\u003e\n\u003cth align=\"left\"\u003evalue\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"right\"\u003ecommand\u003c/td\u003e\n\u003ctd align=\"center\"\u003estring\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e'ping'\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"right\"\u003e\u003ca href=\"#how-does-the-version-parameter-work\"\u003eversion\u003c/a\u003e\u003c/td\u003e\n\u003ctd align=\"center\"\u003enumber\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e2\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"right\"\u003ecallback\u003c/td\u003e\n\u003ctd align=\"center\"\u003efunction\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003efunction(pingReturn: PingReturn)\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eExample:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"__tcfapi('ping', 2, (pingReturn) =\u0026gt; {\n\n // do something with pingReturn\n\n});\"\u003e\u003cpre\u003e\u003cspan class=\"pl-en\"\u003e__tcfapi\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e'ping'\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e2\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003epingReturn\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e// do something with pingReturn\u003c/span\u003e\n\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe ping command invokes the callback immediately without any asynchronous logic and returns a \u003ca href=\"#pingreturn\"\u003e\u003ccode\u003ePingReturn\u003c/code\u003e\u003c/a\u003e object for determining whether or not the main CMP script has loaded yet and whether GDPR applies; therefore, the only command required to be on the page in a stub before the rest of the commands are implemented. See the section \u003ca href=\"#what-does-the-gdprapplies-value-mean\"\u003e\"What does the gdprApplies value mean?\"\u003c/a\u003e for more.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe \u003ccode\u003ecallback\u003c/code\u003e shall be invoked only once per api call with this command.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e\u003ccode\u003eaddEventListener\u003c/code\u003e\u003c/h4\u003e\u003ca id=\"user-content-addeventlistener\" class=\"anchor\" aria-label=\"Permalink: addEventListener\" href=\"#addeventlistener\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"right\"\u003eargument name\u003c/th\u003e\n\u003cth align=\"center\"\u003etype\u003c/th\u003e\n\u003cth align=\"left\"\u003evalue\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"right\"\u003ecommand\u003c/td\u003e\n\u003ctd align=\"center\"\u003estring\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e'addEventListener'\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"right\"\u003e\u003ca href=\"#how-does-the-version-parameter-work\"\u003eversion\u003c/a\u003e\u003c/td\u003e\n\u003ctd align=\"center\"\u003enumber\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e2\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"right\"\u003ecallback\u003c/td\u003e\n\u003ctd align=\"center\"\u003efunction\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003efunction(tcData: TCData, success: boolean)\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eExample:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"const callback = (tcData, success) =\u0026gt; {\n\n if(success \u0026amp;\u0026amp; tcData.eventStatus === 'tcloaded') {\n\n // do something with tcData.tcString\n\n } else {\n\n // do something else\n\n }\n\n}\n\n__tcfapi('addEventListener', 2, callback);\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-en\"\u003ecallback\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003etcData\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003esuccess\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003esuccess\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003etcData\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eeventStatus\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e===\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e'tcloaded'\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e// do something with tcData.tcString\u003c/span\u003e\n\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eelse\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e// do something else\u003c/span\u003e\n\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\n\u003cspan class=\"pl-en\"\u003e__tcfapi\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e'addEventListener'\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e2\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-en\"\u003ecallback\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eRegisters a callback function with a CMP (or a postmessage to respond to for cross-domain case). The callback will be invoked with the \u003ca href=\"#tcdata\"\u003e\u003ccode\u003eTCData\u003c/code\u003e\u003c/a\u003e object as an argument whenever the TC String is changed and a new one is available. The \u003ca href=\"#tcdata\"\u003e\u003ccode\u003eTCData\u003c/code\u003e\u003c/a\u003e object will contain CMP-assigned \u003ccode\u003elistenerId\u003c/code\u003e for the registered listener. The \u003ca href=\"#addeventlistener\"\u003e\u003ccode\u003eeventStatus\u003c/code\u003e\u003c/a\u003e property of the \u003ca href=\"#tcdata\"\u003e\u003ccode\u003eTCData\u003c/code\u003e\u003c/a\u003e object shall be one of the following:\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"left\"\u003eeventStatus\u003c/th\u003e\n\u003cth align=\"left\"\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e'tcloaded'\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eThis shall be the value for the \u003ccode\u003eeventStatus\u003c/code\u003e property of the \u003ca href=\"#tcdata\"\u003e\u003ccode\u003eTCData\u003c/code\u003e\u003c/a\u003e object when a CMP is loaded and is prepared to surface a TC String to any calling scripts on the page. A CMP is only prepared to surface a TC String for this \u003ccode\u003eeventStatus\u003c/code\u003e if an existing, \u003cspan\u003evalid\u003c/span\u003e TC String is available to the CMP and it is not intending to surface the UI. If, however, the CMP will surface the UI because of an invalid TC String (e.g. it is too old, incorrect or does not reflect all the information the CMP needs to gather from the user) then an event with this \u003ccode\u003eeventStatus\u003c/code\u003e must not be triggered.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e'cmpuishown'\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eThis shall be the value for the \u003ccode\u003eeventStatus\u003c/code\u003e property of the \u003ca href=\"#tcdata\"\u003e\u003ccode\u003eTCData\u003c/code\u003e\u003c/a\u003e object any time the UI is surfaced or re-surfaced, a TC String is available and has rendered \"Transparency\" in accordance with the \u003ca href=\"https://iabeurope.eu/iab-europe-transparency-consent-framework-policies/\" rel=\"nofollow\"\u003eTCF Policy\u003c/a\u003e. The CMP shall create a TC string with all the surfaced vendors’ legitimate interest signals set to true and all the consent signals set to false. If previous TC signals are present a CMP may also merge those into the now-available TC String in accordance with the policy.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e'useractioncomplete'\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eThis shall be the value for the \u003ccode\u003eeventStatus\u003c/code\u003e property of the \u003ca href=\"#tcdata\"\u003e\u003ccode\u003eTCData\u003c/code\u003e\u003c/a\u003e object whenever a user has confirmed or re-confirmed their choices in accordance with \u003ca href=\"https://iabeurope.eu/iab-europe-transparency-consent-framework-policies/\" rel=\"nofollow\"\u003eTCF Policy\u003c/a\u003e and a CMP is prepared to respond to any calling scripts with the corresponding TC String.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eThe CMP will, in most cases, invoke the callback when either the \u003ccode\u003e'tcloaded'\u003c/code\u003e OR \u003ccode\u003e'cmpuishown'\u003c/code\u003e + \u003ccode\u003e'useractioncomplete'\u003c/code\u003e \u003ccode\u003eeventStatus\u003c/code\u003e(s) occur, but never for all three \u003ccode\u003eeventStatuses\u003c/code\u003e within the same page view. However, if an existing and valid TC string is available and the CMP does not intend to to surface a UI automatically (\u003ccode\u003e'tcloaded'\u003c/code\u003e) but the user manually surfaces the UI and changes their selected choices (\u003ccode\u003e'cmpuishown'\u003c/code\u003e + \u003ccode\u003e'useractioncomplete'\u003c/code\u003e) all three \u003ccode\u003eeventStatuses\u003c/code\u003e would appear within the same page view.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe callback shall be invoked with \u003ccode\u003efalse\u003c/code\u003e as the argument for the \u003ccode\u003esuccess\u003c/code\u003e parameter if the callback could not be registered as a listener for any reason.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eNote\u003c/strong\u003e: The \u003ccode\u003eaddEventListener\u003c/code\u003e callback shall be immediately called upon registration with the current TC data, even if the CMP status is \u003ccode\u003eloading\u003c/code\u003e and the CMP has incomplete TC Data, so that the calling script may have access to its registered \u003ccode\u003elistenerId\u003c/code\u003e. Furthermore, on every TC String change the callback shall be called unless it is removed via \u003ccode\u003eremoveEventListener\u003c/code\u003e.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e\u003ccode\u003eremoveEventListener\u003c/code\u003e\u003c/h4\u003e\u003ca id=\"user-content-removeeventlistener\" class=\"anchor\" aria-label=\"Permalink: removeEventListener\" href=\"#removeeventlistener\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"right\"\u003eargument name\u003c/th\u003e\n\u003cth align=\"center\"\u003etype\u003c/th\u003e\n\u003cth align=\"left\"\u003evalue\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"right\"\u003ecommand\u003c/td\u003e\n\u003ctd align=\"center\"\u003estring\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e'removeEventListener'\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"right\"\u003e\u003ca href=\"#how-does-the-version-parameter-work\"\u003eversion\u003c/a\u003e\u003c/td\u003e\n\u003ctd align=\"center\"\u003enumber\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e2\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"right\"\u003ecallback\u003c/td\u003e\n\u003ctd align=\"center\"\u003efunction\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003efunction(success: boolean)\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"right\"\u003eparameter\u003c/td\u003e\n\u003ctd align=\"center\"\u003enumber\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003elistenerId\u003c/code\u003e, the unique ID assigned by the CMP to the registered callback (via \u003ccode\u003eaddEventListener\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eExample:\u003c/strong\u003e see \u003ca href=\"#addeventlistener\"\u003e\u003ccode\u003e'addEventListener'\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe callback shall be called with \u003ccode\u003efalse\u003c/code\u003e as the argument for the \u003ccode\u003esuccess\u003c/code\u003e parameter if the listener could not be removed (e.g. the CMP cannot find a registered listener corresponding to \u003ccode\u003elistenerId\u003c/code\u003e).\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eWhat optional API commands might a CMP support?\u003c/h3\u003e\u003ca id=\"user-content-what-optional-api-commands-might-a-cmp-support\" class=\"anchor\" aria-label=\"Permalink: What optional API commands might a CMP support?\" href=\"#what-optional-api-commands-might-a-cmp-support\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eA CMP may choose to support two optional API commands: \u003ca href=\"#getinapptcdata\"\u003e\u003ccode\u003e'getInAppTCData'\u003c/code\u003e\u003c/a\u003e and \u003ca href=\"#getvendorlist\"\u003e\u003ccode\u003e'getVendorList'\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e\u003ccode\u003egetInAppTCData\u003c/code\u003e\u003c/h4\u003e\u003ca id=\"user-content-getinapptcdata\" class=\"anchor\" aria-label=\"Permalink: getInAppTCData\" href=\"#getinapptcdata\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"right\"\u003eargument name\u003c/th\u003e\n\u003cth align=\"center\"\u003etype\u003c/th\u003e\n\u003cth align=\"left\"\u003evalue\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"right\"\u003ecommand\u003c/td\u003e\n\u003ctd align=\"center\"\u003estring\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e'getInAppTCData'\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"right\"\u003e\u003ca href=\"#how-does-the-version-parameter-work\"\u003eversion\u003c/a\u003e\u003c/td\u003e\n\u003ctd align=\"center\"\u003enumber\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e2\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"right\"\u003ecallback\u003c/td\u003e\n\u003ctd align=\"center\"\u003efunction\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003efunction(inAppTCData: InAppTCData, success: boolean)\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eExample:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"__tcfapi('getInAppTCData', 2, (inAppTCData, success) =\u0026gt; {\n\n if(success) {\n\n // do something with inAppTCData\n\n } else {\n\n // do something else\n\n }\n\n});\"\u003e\u003cpre\u003e\u003cspan class=\"pl-en\"\u003e__tcfapi\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e'getInAppTCData'\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e2\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003einAppTCData\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003esuccess\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003esuccess\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e// do something with inAppTCData\u003c/span\u003e\n\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eelse\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e// do something else\u003c/span\u003e\n\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eA mobile in-app CMP that uses a web-based UI in a mobile web view may choose to implement API calls with this command for the purpose of retrieving the TC String and pre-parsed TC signals from that web-based UI for the purpose of storing them in the \u003ca href=\"https://developer.apple.com/documentation/foundation/nsuserdefaults#1664798?language=objc\" rel=\"nofollow\"\u003e\u003ccode\u003eNSUserDefaults\u003c/code\u003e\u003c/a\u003e(iOS) or \u003ca href=\"https://developer.android.com/training/data-storage/shared-preferences.html\" rel=\"nofollow\"\u003e\u003ccode\u003eSharedPreferences\u003c/code\u003e\u003c/a\u003e(Android). (see \u003ca href=\"#what-is-the-cmp-in-app-internal-structure-for-the-defined-api\"\u003eWhat is the CMP in-app internal structure for the defined API?\u003c/a\u003e)\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe callback shall be invoked only once per api call with this command.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e\u003ccode\u003egetVendorList\u003c/code\u003e\u003c/h4\u003e\u003ca id=\"user-content-getvendorlist\" class=\"anchor\" aria-label=\"Permalink: getVendorList\" href=\"#getvendorlist\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"right\"\u003eargument name\u003c/th\u003e\n\u003cth align=\"center\"\u003etype\u003c/th\u003e\n\u003cth align=\"center\"\u003eoptional\u003c/th\u003e\n\u003cth align=\"left\"\u003evalue\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"right\"\u003ecommand\u003c/td\u003e\n\u003ctd align=\"center\"\u003estring\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e'getVendorList'\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"right\"\u003e\u003ca href=\"#how-does-the-version-parameter-work\"\u003eversion\u003c/a\u003e\u003c/td\u003e\n\u003ctd align=\"center\"\u003enumber\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e2\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"right\"\u003ecallback\u003c/td\u003e\n\u003ctd align=\"center\"\u003efunction\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003efunction(gvl: GlobalVendorList, success: boolean)\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"right\"\u003eparameter\u003c/td\u003e\n\u003ctd align=\"center\"\u003eint or string\u003c/td\u003e\n\u003ctd align=\"center\"\u003e✔️\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003evendorListVersion\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eExample:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"__tcfapi('getVendorList', 2, (gvl, success) =\u0026gt; {\n\n if(success) {\n\n // do something with gvl\n\n } else {\n\n // do something else\n\n }\n\n}, 'LATEST');\"\u003e\u003cpre\u003e\u003cspan class=\"pl-en\"\u003e__tcfapi\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e'getVendorList'\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e2\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003egvl\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003esuccess\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003esuccess\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e// do something with gvl\u003c/span\u003e\n\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eelse\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e// do something else\u003c/span\u003e\n\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e'LATEST'\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eCalling with this command and a valid \u003ccode\u003evendorListVersion\u003c/code\u003e parameter shall return a \u003ccode\u003eGlobalVendorList\u003c/code\u003e object to the \u003ccode\u003ecallback\u003c/code\u003e function. The caller may specify a \u003ca href=\"#what-is-the-global-vendor-list\"\u003eGlobal Vendor List\u003c/a\u003e version number with the \u003ccode\u003evendorListVersion\u003c/code\u003e parameter. If no version is specified, the \u003ca href=\"#what-is-the-global-vendor-list\"\u003eGlobal Vendor List\u003c/a\u003e version returned shall be the same as that which is encoded in the current TC String – If no TC String exists the latest version of the \u003ca href=\"#what-is-the-global-vendor-list\"\u003eGlobal Vendor List\u003c/a\u003e shall be returned. The calling function may also pass \u003ccode\u003e'LATEST'\u003c/code\u003e as the argument to the \u003ccode\u003evendorListVersion\u003c/code\u003e parameter to explicitly receive the latest \u003ca href=\"#what-is-the-global-vendor-list\"\u003eGlobal Vendor List\u003c/a\u003e version as the \u003ccode\u003eGlobalVendorList\u003c/code\u003e object.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIf an invalid \u003ccode\u003evendorListVersion\u003c/code\u003e argument is passed with the \u003ccode\u003egetVendorList\u003c/code\u003e command the callback function shall receive a \u003ccode\u003enull\u003c/code\u003e argument for the \u003ccode\u003eGlobalVendorList\u003c/code\u003e parameter and the \u003ccode\u003esuccess\u003c/code\u003e parameter shall receive a \u003ccode\u003efalse\u003c/code\u003e argument. Valid \u003ccode\u003evendorListVersion\u003c/code\u003es are integers (or integer strings) greater than \u003ccode\u003e1\u003c/code\u003e. The \u003ccode\u003esuccess\u003c/code\u003e parameter shall receive a \u003ccode\u003efalse\u003c/code\u003e argument for any unsuccessful call with the \u003ccode\u003egetVendorList\u003c/code\u003e command. (eg. invalid \u003ccode\u003evendorListVersion\u003c/code\u003e argument, network error, etc…)\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe callback shall be invoked only once per api call with this command.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eWhat objects are returned from the API?\u003c/h3\u003e\u003ca id=\"user-content-what-objects-are-returned-from-the-api\" class=\"anchor\" aria-label=\"Permalink: What objects are returned from the API?\" href=\"#what-objects-are-returned-from-the-api\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e\u003ccode\u003eTCData\u003c/code\u003e\u003c/h4\u003e\u003ca id=\"user-content-tcdata\" class=\"anchor\" aria-label=\"Permalink: TCData\" href=\"#tcdata\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis object contains both the encoded and unencoded values of the TC String as well as information about the CMP \u003ccode\u003eeventStatus\u003c/code\u003e and whether or not GDPR applies to this user in this context (see the section \u003ca href=\"#what-does-the-gdprapplies-value-mean\"\u003e\"What does the gdprApplies value mean?\"\u003c/a\u003e for more). If GDPR does not apply to this user in this context then only \u003ccode\u003egdprApplies\u003c/code\u003e, \u003ccode\u003etcfPolicyVersion\u003c/code\u003e, \u003ccode\u003ecmpId\u003c/code\u003e and \u003ccode\u003ecmpVersion\u003c/code\u003e shall exist in the object. If it is unknown just yet whether GDPR Applies to this user in this context or if this is CMP Stub code then the \u003ccode\u003ecallback\u003c/code\u003e shall not be invoked until that \u003ccode\u003egdprApplies\u003c/code\u003e is known.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"TCData = {\n tcString: 'base64url-encoded TC string with segments',\n tcfPolicyVersion: 4,\n cmpId:1000,\n cmpVersion: 1000,\n\n /**\n * true - GDPR Applies\n * false - GDPR Does not apply\n * undefined - unknown whether GDPR Applies\n * see the section: \u0026quot;What does the gdprApplies value mean?\u0026quot;\n */\n gdprApplies: Boolean | undefined,\n\n /*\n * see addEventListener command\n */\n eventStatus: String,\n\n /**\n * see Ping Status Codes in following table\n */\n cmpStatus: 'string',\n\n /**\n * If this TCData is sent to the callback of addEventListener: number,\n * the unique ID assigned by the CMP to the listener function registered\n * via addEventListener.\n * Others: undefined.\n */\n listenerId: Number | undefined,\n\n /*\n * true - Default value\n * false - TC String is invalid.\n * since Sept 1st 2021, TC strings established with global-scope are considered invalid.\n * see the section: [\u0026quot;What happened to Global Scope and Out of Band?\u0026quot;](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/TCF-Implementation-Guidelines.md#gsoob) in \u0026quot;IAB Europe Transparency and Consent Framework Implementation Guidelines\u0026quot;\n */\n isServiceSpecific: Boolean,\n\n /**\n * true - CMP is using publisher-customized stack descriptions and/or modified or supplemented standard Illustrations\n * false - CMP is NOT using publisher-customized stack descriptions and or modified or supplemented standard Illustrations\n */\n useNonStandardTexts: Boolean,\n\n /**\n * Country code of the country that determines the legislation of\n * reference. Normally corresponds to the country code of the country\n * in which the publisher's business entity is established.\n */\n publisherCC: 'Two-letter ISO 3166-1 alpha-2 code',\n\n /**\n *\n * true - Purpose 1 not disclosed at all. CMPs use PublisherCC to\n * indicate the publisher's country of establishment to help Vendors\n * determine whether the vendor requires Purpose 1 consent.\n *\n * false - There is no special Purpose 1 treatment status. Purpose 1 was\n * disclosed normally (consent) as expected by TCF Policy\n */\n purposeOneTreatment: Boolean,\n\n purpose: {\n consents: {\n\n /**\n * true - Consent\n * false | undefined - No Consent.\n */\n '[purpose id]': Boolean\n },\n legitimateInterests: {\n\n /**\n * true - Legitimate Interest Established\n * false | undefined - No Legitimate Interest Established\n */\n '[purpose id]': Boolean\n }\n },\n vendor: {\n\n consents: {\n\n /**\n * true - Consent\n * false | undefined - No Consent\n */\n '[vendor id]': Boolean\n\n },\n legitimateInterests: {\n\n /**\n * true - Legitimate Interest Established\n * false | undefined - No Legitimate Interest Established\n */\n '[vendor id]': Boolean\n\n }\n },\n specialFeatureOptins: {\n\n /**\n * true - Special Feature Opted Into\n * false | undefined - Special Feature NOT Opted Into\n */\n '[special feature id]': Boolean\n },\n publisher: {\n consents: {\n\n /**\n * true - Consent\n * false | undefined - No Consent\n */\n '[purpose id]': Boolean\n },\n legitimateInterests: {\n\n /**\n * true - Legitimate Interest Established\n * false | undefined - No Legitimate Interest Established\n */\n '[purpose id]': Boolean\n },\n customPurpose: {\n consents: {\n\n /**\n * true - Consent\n * false | undefined - No Consent\n */\n '[purpose id]': Boolean\n },\n legitimateInterests: {\n\n /**\n * true - Legitimate Interest Established\n * false | undefined - No Legitimate Interest Established\n */\n '[purpose id]': Boolean\n },\n },\n restrictions: {\n\n '[purpose id]': {\n\n /**\n * 0 - Not Allowed\n * 1 - Require Consent\n * 2 - Require Legitimate Interest\n */\n '[vendor id]': 1\n }\n }\n }\n}\"\u003e\u003cpre\u003e\u003cspan class=\"pl-v\"\u003eTCData\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003etcString\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e'base64url-encoded TC string with segments'\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003etcfPolicyVersion\u003c/span\u003e: \u003cspan class=\"pl-c1\"\u003e4\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003ecmpId\u003c/span\u003e:\u003cspan class=\"pl-c1\"\u003e1000\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003ecmpVersion\u003c/span\u003e: \u003cspan class=\"pl-c1\"\u003e1000\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * true - GDPR Applies\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * false - GDPR Does not apply\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * undefined - unknown whether GDPR Applies\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * see the section: \"What does the gdprApplies value mean?\"\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003egdprApplies\u003c/span\u003e: \u003cspan class=\"pl-v\"\u003eBoolean\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e|\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003eundefined\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/*\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * see addEventListener command\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003eeventStatus\u003c/span\u003e: \u003cspan class=\"pl-v\"\u003eString\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * see Ping Status Codes in following table\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003ecmpStatus\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e'string'\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * If this TCData is sent to the callback of addEventListener: number,\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * the unique ID assigned by the CMP to the listener function registered\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * via addEventListener.\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * Others: undefined.\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003elistenerId\u003c/span\u003e: \u003cspan class=\"pl-v\"\u003eNumber\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e|\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003eundefined\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/*\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * true - Default value\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * false - TC String is invalid.\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * since Sept 1st 2021, TC strings established with global-scope are considered invalid.\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * see the section: [\"What happened to Global Scope and Out of Band?\"](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/TCF-Implementation-Guidelines.md#gsoob) in \"IAB Europe Transparency and Consent Framework Implementation Guidelines\"\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003eisServiceSpecific\u003c/span\u003e: \u003cspan class=\"pl-v\"\u003eBoolean\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * true - CMP is using publisher-customized stack descriptions and/or modified or supplemented standard Illustrations\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * false - CMP is NOT using publisher-customized stack descriptions and or modified or supplemented standard Illustrations\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003euseNonStandardTexts\u003c/span\u003e: \u003cspan class=\"pl-v\"\u003eBoolean\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * Country code of the country that determines the legislation of\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * reference. Normally corresponds to the country code of the country\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * in which the publisher's business entity is established.\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003epublisherCC\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e'Two-letter ISO 3166-1 alpha-2 code'\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e *\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * true - Purpose 1 not disclosed at all. CMPs use PublisherCC to\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * indicate the publisher's country of establishment to help Vendors\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * determine whether the vendor requires Purpose 1 consent.\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e *\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * false - There is no special Purpose 1 treatment status. Purpose 1 was\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * disclosed normally (consent) as expected by TCF Policy\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003epurposeOneTreatment\u003c/span\u003e: \u003cspan class=\"pl-v\"\u003eBoolean\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\n \u003cspan class=\"pl-c1\"\u003epurpose\u003c/span\u003e: \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003econsents\u003c/span\u003e: \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * true - Consent\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * false | undefined - No Consent.\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-s\"\u003e'[purpose id]'\u003c/span\u003e: \u003cspan class=\"pl-v\"\u003eBoolean\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003elegitimateInterests\u003c/span\u003e: \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * true - Legitimate Interest Established\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * false | undefined - No Legitimate Interest Established\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-s\"\u003e'[purpose id]'\u003c/span\u003e: \u003cspan class=\"pl-v\"\u003eBoolean\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003evendor\u003c/span\u003e: \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-c1\"\u003econsents\u003c/span\u003e: \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * true - Consent\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * false | undefined - No Consent\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-s\"\u003e'[vendor id]'\u003c/span\u003e: \u003cspan class=\"pl-v\"\u003eBoolean\u003c/span\u003e\n\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003elegitimateInterests\u003c/span\u003e: \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * true - Legitimate Interest Established\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * false | undefined - No Legitimate Interest Established\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-s\"\u003e'[vendor id]'\u003c/span\u003e: \u003cspan class=\"pl-v\"\u003eBoolean\u003c/span\u003e\n\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003especialFeatureOptins\u003c/span\u003e: \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * true - Special Feature Opted Into\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * false | undefined - Special Feature NOT Opted Into\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-s\"\u003e'[special feature id]'\u003c/span\u003e: \u003cspan class=\"pl-v\"\u003eBoolean\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003epublisher\u003c/span\u003e: \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003econsents\u003c/span\u003e: \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * true - Consent\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * false | undefined - No Consent\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-s\"\u003e'[purpose id]'\u003c/span\u003e: \u003cspan class=\"pl-v\"\u003eBoolean\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003elegitimateInterests\u003c/span\u003e: \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * true - Legitimate Interest Established\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * false | undefined - No Legitimate Interest Established\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-s\"\u003e'[purpose id]'\u003c/span\u003e: \u003cspan class=\"pl-v\"\u003eBoolean\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003ecustomPurpose\u003c/span\u003e: \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003econsents\u003c/span\u003e: \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * true - Consent\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * false | undefined - No Consent\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-s\"\u003e'[purpose id]'\u003c/span\u003e: \u003cspan class=\"pl-v\"\u003eBoolean\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003elegitimateInterests\u003c/span\u003e: \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * true - Legitimate Interest Established\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * false | undefined - No Legitimate Interest Established\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-s\"\u003e'[purpose id]'\u003c/span\u003e: \u003cspan class=\"pl-v\"\u003eBoolean\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003erestrictions\u003c/span\u003e: \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-s\"\u003e'[purpose id]'\u003c/span\u003e: \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * 0 - Not Allowed\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * 1 - Require Consent\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * 2 - Require Legitimate Interest\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-s\"\u003e'[vendor id]'\u003c/span\u003e: \u003cspan class=\"pl-c1\"\u003e1\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e\u003ccode\u003ePingReturn\u003c/code\u003e\u003c/h4\u003e\u003ca id=\"user-content-pingreturn\" class=\"anchor\" aria-label=\"Permalink: PingReturn\" href=\"#pingreturn\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis object contains information about the loading status and configuration of the CMP.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"PingReturn = {\n\n /**\n * true - GDPR Applies\n * false - GDPR Does not apply\n * undefined - unknown whether GDPR Applies\n * see the section: \u0026quot;What does the gdprApplies value mean?\u0026quot;\n */\n gdprApplies: Boolean | undefined,\n\n /**\n * true - CMP main script is loaded\n * false - still running stub\n */\n cmpLoaded: Boolean,\n\n /**\n * see Ping Status Codes in following table\n */\n cmpStatus: String,\n\n /**\n * see Ping Status Codes in following table\n */\n displayStatus: String,\n\n /**\n * version of the CMP API that is supported, e.g. \u0026quot;2.0\u0026quot;\n */\n apiVersion: String,\n\n /**\n * CMPs own/internal version that is currently running\n * undefined if still the stub\n */\n cmpVersion: Number | undefined,\n\n /**\n * IAB Assigned CMP ID\n * undefined if still the stub\n */\n cmpId: Number | undefined,\n\n /**\n * Version of the GVL currently loaded by the CMP\n * undefined if still the stub\n */\n gvlVersion: Number | undefined,\n\n /**\n * Number of the supported TCF version\n * undefined if still the stub\n */\n tcfPolicyVersion: Number | undefined,\n};\"\u003e\u003cpre\u003e\u003cspan class=\"pl-v\"\u003ePingReturn\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * true - GDPR Applies\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * false - GDPR Does not apply\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * undefined - unknown whether GDPR Applies\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * see the section: \"What does the gdprApplies value mean?\"\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003egdprApplies\u003c/span\u003e: \u003cspan class=\"pl-v\"\u003eBoolean\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e|\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003eundefined\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * true - CMP main script is loaded\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * false - still running stub\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003ecmpLoaded\u003c/span\u003e: \u003cspan class=\"pl-v\"\u003eBoolean\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * see Ping Status Codes in following table\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003ecmpStatus\u003c/span\u003e: \u003cspan class=\"pl-v\"\u003eString\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * see Ping Status Codes in following table\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003edisplayStatus\u003c/span\u003e: \u003cspan class=\"pl-v\"\u003eString\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * version of the CMP API that is supported, e.g. \"2.0\"\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003eapiVersion\u003c/span\u003e: \u003cspan class=\"pl-v\"\u003eString\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * CMPs own/internal version that is currently running\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * undefined if still the stub\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003ecmpVersion\u003c/span\u003e: \u003cspan class=\"pl-v\"\u003eNumber\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e|\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003eundefined\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * IAB Assigned CMP ID\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * undefined if still the stub\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003ecmpId\u003c/span\u003e: \u003cspan class=\"pl-v\"\u003eNumber\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e|\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003eundefined\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * Version of the GVL currently loaded by the CMP\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * undefined if still the stub\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003egvlVersion\u003c/span\u003e: \u003cspan class=\"pl-v\"\u003eNumber\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e|\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003eundefined\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * Number of the supported TCF version\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * undefined if still the stub\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003etcfPolicyVersion\u003c/span\u003e: \u003cspan class=\"pl-v\"\u003eNumber\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e|\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003eundefined\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eNote:\u003c/strong\u003e \u003ccode\u003ecmpLoaded\u003c/code\u003e must be set to \u003ccode\u003etrue\u003c/code\u003e if the main script is loaded and the stub interface is replaced, regardless of whether or not the user will see the UI or interact with it.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ePing Status Codes\u003c/h4\u003e\u003ca id=\"user-content-ping-status-codes\" class=\"anchor\" aria-label=\"Permalink: Ping Status Codes\" href=\"#ping-status-codes\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"left\"\u003eStatus Code\u003c/th\u003e\n\u003cth align=\"left\"\u003eApplicable for\u003c/th\u003e\n\u003cth align=\"left\"\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e'stub'\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ecmpStatus\u003c/td\u003e\n\u003ctd align=\"left\"\u003eCMP not yet loaded – stub still in place\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e'loading'\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ecmpStatus\u003c/td\u003e\n\u003ctd align=\"left\"\u003eDEPRECATED (this status is not distinct and will be removed in a future version)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e'loaded'\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ecmpStatus\u003c/td\u003e\n\u003ctd align=\"left\"\u003eCMP is finished loading\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e'error'\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ecmpStatus\u003c/td\u003e\n\u003ctd align=\"left\"\u003eCMP is in an error state. A CMP shall not respond to any other API requests if this cmpStatus is present. A CMP may set this status if, for any reason, it is unable to perform the operations in compliance with the TCF.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e'visible'\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003edisplayStatus\u003c/td\u003e\n\u003ctd align=\"left\"\u003eUser interface is currently displayed\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e'hidden'\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003edisplayStatus\u003c/td\u003e\n\u003ctd align=\"left\"\u003eUser interface is not yet or no longer displayed\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e'disabled'\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003edisplayStatus\u003c/td\u003e\n\u003ctd align=\"left\"\u003eUser interface will not show (e.g. GDPR does not apply or TC data is current and does not need renewal)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e\u003ccode\u003eInAppTCData\u003c/code\u003e\u003c/h4\u003e\u003ca id=\"user-content-inapptcdata\" class=\"anchor\" aria-label=\"Permalink: InAppTCData\" href=\"#inapptcdata\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"InAppTCData = {\n tcString: 'base64url-encoded TC string with segments',\n tcfPolicyVersion: 2,\n cmpId:1000,\n cmpVersion: 1000,\n\n /**\n * 1 - GDPR Applies\n * 0 - GDPR Does not apply\n * undefined - unknown whether GDPR applies\n * see the section: \u0026quot;What does the gdprApplies value mean?\u0026quot;\n */\n gdprApplies: 1,\n\n /*\n * see addEventListener command\n */\n eventStatus: 'string',\n\n /*\n * 1 - Default value\n * 0 - TC String is invalid.\n * since Sept 1st 2021, TC strings established with global-scope are considered invalid.\n * see the section: [\u0026quot;What happened to Global Scope and Out of Band?\u0026quot;](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/TCF-Implementation-Guidelines.md#gsoob) in \u0026quot;IAB Europe Transparency and Consent Framework Implementation Guidelines\u0026quot;\n */\n isServiceSpecific: 1,\n\n /**\n * 1 - CMP is using publisher-customized stack descriptions and/or modified or supplemented standard Illustrations\n * 0 - CMP is NOT using publisher-customized stack descriptions and/or modified or supplemented standard Illustrations\n */\n useNonStandardTexts: 1,\n\n /**\n * Country code of the country that determines the legislation of\n * reference. Normally corresponds to the country code of the country\n * in which the publisher's business entity is established.\n */\n publisherCC: 'Two-letter ISO 3166-1 alpha-2 code',\n\n /**\n * 1 - Purpose 1 not disclosed at all. CMPs use PublisherCC to indicate\n * the publisher's country of establishment to help vVendors determine\n * whether the vendor requires Purpose 1 consent.\n *\n * 0 - There is no special Purpose 1 treatment status. Purpose 1 was\n * disclosed normally (consent) as expected by TCF Policy.\n */\n purposeOneTreatment: 1,\n\n purpose: {\n\n /**\n * 1 - Consent\n * 0 | undefined - No Consent\n */\n consents: '01010 -- Purpose bitfield',\n\n /**\n * 1 - Legitimate Interest Established\n * 0 | undefined - No Legitimate Interest Established\n */\n legitimateInterests: '01010 -- Purpose bitfield'\n },\n vendor: {\n\n /**\n * 1 - Consent\n * 0 | undefined - No Consent\n */\n consents: '01010 -- Vendor bitfield',\n\n /**\n * 1 - Legitimate Interest Established\n * 0 | undefined - No Legitimate Interest Established\n */\n legitimateInterests: '01010 -- Vendor bitfield'\n },\n\n /**\n * 1 - Special Feature Opted Into\n * 0 | undefined - Special Feature NOT Opted Into\n */\n specialFeatureOptins: '01010 -- Special Feature bitfield',\n\n publisher: {\n\n /**\n * 1 - Consent\n * 0 | undefined - No Consent\n */\n consents: '01010 -- Purpose bitfield',\n\n /**\n * 1 - Legitimate Interest Established\n * 0 | undefined - No Legitimate Interest Established\n */\n legitimateInterests: '01010 -- Purpose bitfield',\n\n customPurpose: {\n\n /**\n * 1 - Consent\n * 0 | undefined - No Consent\n */\n consents: '01010 -- Purpose bitfield',\n\n /**\n * 1 - Legitimate Interest Established\n * 0 | undefined - No Legitimate Interest Established\n */\n legitimateInterests: '01010 -- Purpose bitfield'\n },\n restrictions: {\n\n /**\n * 0 - Not Allowed\n * 1 - Require Consent\n * 2 - Require Legitimate Interest\n * _ - No Restriction (maintains indexing)\n *\n * each position represents vendor id and number represents restriction\n * type 0-2\n */\n '[purpose id]': '01201221'\n }\n }\n}\"\u003e\u003cpre\u003e\u003cspan class=\"pl-v\"\u003eInAppTCData\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003etcString\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e'base64url-encoded TC string with segments'\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003etcfPolicyVersion\u003c/span\u003e: \u003cspan class=\"pl-c1\"\u003e2\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003ecmpId\u003c/span\u003e:\u003cspan class=\"pl-c1\"\u003e1000\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003ecmpVersion\u003c/span\u003e: \u003cspan class=\"pl-c1\"\u003e1000\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * 1 - GDPR Applies\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * 0 - GDPR Does not apply\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * undefined - unknown whether GDPR applies\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * see the section: \"What does the gdprApplies value mean?\"\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003egdprApplies\u003c/span\u003e: \u003cspan class=\"pl-c1\"\u003e1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/*\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * see addEventListener command\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003eeventStatus\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e'string'\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/*\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * 1 - Default value\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * 0 - TC String is invalid.\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * since Sept 1st 2021, TC strings established with global-scope are considered invalid.\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * see the section: [\"What happened to Global Scope and Out of Band?\"](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/TCF-Implementation-Guidelines.md#gsoob) in \"IAB Europe Transparency and Consent Framework Implementation Guidelines\"\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003eisServiceSpecific\u003c/span\u003e: \u003cspan class=\"pl-c1\"\u003e1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * 1 - CMP is using publisher-customized stack descriptions and/or modified or supplemented standard Illustrations\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * 0 - CMP is NOT using publisher-customized stack descriptions and/or modified or supplemented standard Illustrations\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003euseNonStandardTexts\u003c/span\u003e: \u003cspan class=\"pl-c1\"\u003e1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * Country code of the country that determines the legislation of\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * reference. Normally corresponds to the country code of the country\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * in which the publisher's business entity is established.\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003epublisherCC\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e'Two-letter ISO 3166-1 alpha-2 code'\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * 1 - Purpose 1 not disclosed at all. CMPs use PublisherCC to indicate\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * the publisher's country of establishment to help vVendors determine\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * whether the vendor requires Purpose 1 consent.\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e *\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * 0 - There is no special Purpose 1 treatment status. Purpose 1 was\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * disclosed normally (consent) as expected by TCF Policy.\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003epurposeOneTreatment\u003c/span\u003e: \u003cspan class=\"pl-c1\"\u003e1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\n \u003cspan class=\"pl-c1\"\u003epurpose\u003c/span\u003e: \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * 1 - Consent\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * 0 | undefined - No Consent\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003econsents\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e'01010 -- Purpose bitfield'\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * 1 - Legitimate Interest Established\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * 0 | undefined - No Legitimate Interest Established\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003elegitimateInterests\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e'01010 -- Purpose bitfield'\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003evendor\u003c/span\u003e: \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * 1 - Consent\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * 0 | undefined - No Consent\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003econsents\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e'01010 -- Vendor bitfield'\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * 1 - Legitimate Interest Established\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * 0 | undefined - No Legitimate Interest Established\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003elegitimateInterests\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e'01010 -- Vendor bitfield'\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * 1 - Special Feature Opted Into\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * 0 | undefined - Special Feature NOT Opted Into\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003especialFeatureOptins\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e'01010 -- Special Feature bitfield'\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\n \u003cspan class=\"pl-c1\"\u003epublisher\u003c/span\u003e: \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * 1 - Consent\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * 0 | undefined - No Consent\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003econsents\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e'01010 -- Purpose bitfield'\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * 1 - Legitimate Interest Established\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * 0 | undefined - No Legitimate Interest Established\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003elegitimateInterests\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e'01010 -- Purpose bitfield'\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\n \u003cspan class=\"pl-c1\"\u003ecustomPurpose\u003c/span\u003e: \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * 1 - Consent\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * 0 | undefined - No Consent\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003econsents\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e'01010 -- Purpose bitfield'\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * 1 - Legitimate Interest Established\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * 0 | undefined - No Legitimate Interest Established\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003elegitimateInterests\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e'01010 -- Purpose bitfield'\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003erestrictions\u003c/span\u003e: \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * 0 - Not Allowed\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * 1 - Require Consent\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * 2 - Require Legitimate Interest\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * _ - No Restriction (maintains indexing)\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e *\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * each position represents vendor id and number represents restriction\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * type 0-2\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n \u003cspan class=\"pl-s\"\u003e'[purpose id]'\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e'01201221'\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eIn-App Details\u003c/h3\u003e\u003ca id=\"user-content-in-app-details\" class=\"anchor\" aria-label=\"Permalink: In-App Details\" href=\"#in-app-details\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eHow is a CMP used in-app?\u003c/h4\u003e\u003ca id=\"user-content-how-is-a-cmp-used-in-app\" class=\"anchor\" aria-label=\"Permalink: How is a CMP used in-app?\" href=\"#how-is-a-cmp-used-in-app\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe steps for integrating a CMP SDK into an app are the following:\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003eAn app publisher should embed a CMP SDK – The setup and configuration as well as the protocol for how to initialize the CMP SDK are all proprietary to each CMP SDK.\u003c/li\u003e\n\u003cli\u003eSince more than one CMP SDK may be included in publishers' linked SDKs, the publisher must initialize only one of them. The initialized CMP shall set \u003ccode\u003eIABTCF_CmpSdkID\u003c/code\u003e with its ID as soon as it is initialized in the app to signal to vendors that a CMP is present.\u003c/li\u003e\n\u003cli\u003eThe CMP SDK will determine if GDPR applies (see the section \u003ca href=\"#what-does-the-gdprapplies-value-mean\"\u003e\"What does the gdprApplies value mean?\"\u003c/a\u003e) to this user in this context. But, a publisher may choose to initialize a CMP dialogue UI manually.\u003c/li\u003e\n\u003cli\u003eThe CMP shall set the \u003ca href=\"https://developer.apple.com/documentation/foundation/nsuserdefaults#1664798?language=objc\" rel=\"nofollow\"\u003e\u003ccode\u003eNSUserDefaults\u003c/code\u003e\u003c/a\u003e(iOS) or \u003ca href=\"https://developer.android.com/training/data-storage/shared-preferences.html\" rel=\"nofollow\"\u003e\u003ccode\u003eSharedPreferences\u003c/code\u003e\u003c/a\u003e(Android) variables and vendors will then be able to read from them directly.\u003c/li\u003e\n\u003cli\u003eVendors should listen to \u003ccode\u003eIABTCF_* \u003c/code\u003ekey updates to retrieve new TC data from \u003ca href=\"https://developer.apple.com/documentation/foundation/nsuserdefaults#1664798?language=objc\" rel=\"nofollow\"\u003e\u003ccode\u003eNSUserDefaults\u003c/code\u003e\u003c/a\u003e(iOS) or \u003ca href=\"https://developer.android.com/training/data-storage/shared-preferences.html\" rel=\"nofollow\"\u003e\u003ccode\u003eSharedPreferences\u003c/code\u003e\u003c/a\u003e(Android).\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eWhat is the CMP in-app internal structure for the defined API?\u003c/h4\u003e\u003ca id=\"user-content-what-is-the-cmp-in-app-internal-structure-for-the-defined-api\" class=\"anchor\" aria-label=\"Permalink: What is the CMP in-app internal structure for the defined API?\" href=\"#what-is-the-cmp-in-app-internal-structure-for-the-defined-api\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://developer.apple.com/documentation/foundation/nsuserdefaults#1664798?language=objc\" rel=\"nofollow\"\u003e\u003ccode\u003eNSUserDefaults\u003c/code\u003e\u003c/a\u003e(iOS) or \u003ca href=\"https://developer.android.com/training/data-storage/shared-preferences.html\" rel=\"nofollow\"\u003e\u003ccode\u003eSharedPreferences\u003c/code\u003e\u003c/a\u003e(Android) shall be used to store pre-parsed TC data as well as the TC string by a CMP SDK. It allows:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eVendors to easily access TC data\u003c/li\u003e\n\u003cli\u003eTC data to persist across app sessions\u003c/li\u003e\n\u003cli\u003eTC data to be portable between CMPs to provide flexibility for a publisher to exchange one CMP SDK for another\u003c/li\u003e\n\u003cli\u003eVendors within an app to avoid code duplication by not being required to include a TC string decoder while still enabling all typical use cases\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eNote:\u003c/strong\u003e If a publisher chooses to remove a CMP SDK from their app they are responsible for clearing all \u003ccode\u003eIABTCF_*\u003c/code\u003e vestigial values for users so that vendors do not continue to use the TC data therein.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://developer.apple.com/documentation/foundation/nsuserdefaults#1664798?language=objc\" rel=\"nofollow\"\u003e\u003ccode\u003eNSUserDefaults\u003c/code\u003e\u003c/a\u003e(iOS) or \u003ca href=\"https://developer.android.com/training/data-storage/shared-preferences.html\" rel=\"nofollow\"\u003e\u003ccode\u003eSharedPreferences\u003c/code\u003e\u003c/a\u003e(Android) values\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"left\"\u003eKey\u003c/th\u003e\n\u003cth align=\"left\"\u003eValue(s)\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eIABTCF_CmpSdkID\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eNumber\u003c/code\u003e: The unsigned integer ID of CMP SDK\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eIABTCF_CmpSdkVersion\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eNumber\u003c/code\u003e: The unsigned integer version number of CMP SDK\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eIABTCF_PolicyVersion\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eNumber\u003c/code\u003e: The unsigned integer representing the version of the TCF that these consents adhere to.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eIABTCF_gdprApplies\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eNumber\u003c/code\u003e: \u003cp dir=\"auto\"\u003e\u003ccode\u003e1\u003c/code\u003e GDPR applies in current context\u003c/p\u003e\u003cp dir=\"auto\"\u003e\u003ccode\u003e0\u003c/code\u003e - GDPR does \u003cem\u003e\u003cstrong\u003enot\u003c/strong\u003e\u003c/em\u003e apply in current context\u003c/p\u003e\u003cp dir=\"auto\"\u003e\u003cstrong\u003eUnset\u003c/strong\u003e - undetermined (default before initialization)\u003c/p\u003e\u003cp dir=\"auto\"\u003esee the section \u003ca href=\"#what-does-the-gdprapplies-value-mean\"\u003e\"What does the gdprApplies value mean?\"\u003c/a\u003e for more\u003c/p\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eIABTCF_PublisherCC\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eString\u003c/code\u003e: \u003ca href=\"https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2\" rel=\"nofollow\"\u003eTwo-letter ISO 3166-1 alpha-2 code\u003c/a\u003e – Default: \u003ccode\u003eAA\u003c/code\u003e (unknown)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eIABTCF_PurposeOneTreatment\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eNumber\u003c/code\u003e: \u003cp dir=\"auto\"\u003e\u003ccode\u003e0\u003c/code\u003e - no special treatment of purpose one\u003c/p\u003e\u003cp dir=\"auto\"\u003e\u003ccode\u003e1\u003c/code\u003e - purpose one not disclosed\u003c/p\u003e\u003cp dir=\"auto\"\u003e\u003cstrong\u003eUnset default\u003c/strong\u003e - \u003ccode\u003e0\u003c/code\u003e\u003c/p\u003e\u003cp dir=\"auto\"\u003eVendors can use this value to determine whether consent for purpose one is required.\u003c/p\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eIABTCF_UseNonStandardTexts\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eNumber\u003c/code\u003e: \u003cp dir=\"auto\"\u003e\u003ccode\u003e1\u003c/code\u003e - CMP uses customized stack descriptions and/or modified or supplemented standard Illustrations\u003c/p\u003e\u003cp dir=\"auto\"\u003e\u003ccode\u003e0\u003c/code\u003e - CMP did not use a non-standard stack desc. and/or modified or supplemented Illustrations\u003c/p\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eIABTCF_TCString\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eString\u003c/code\u003e: Full encoded TC string\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eIABTCF_VendorConsents\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eBinary String\u003c/code\u003e: The \u003ccode\u003e'0'\u003c/code\u003e or \u003ccode\u003e'1'\u003c/code\u003e at position \u003cstrong\u003en\u003c/strong\u003e – where \u003cstrong\u003en\u003c/strong\u003e's indexing begins at \u003ccode\u003e0\u003c/code\u003e – indicates the consent status for Vendor ID \u003cstrong\u003en+1\u003c/strong\u003e; \u003ccode\u003efalse\u003c/code\u003e and \u003ccode\u003etrue\u003c/code\u003e respectively. eg. \u003ccode\u003e'1'\u003c/code\u003e at index \u003ccode\u003e0\u003c/code\u003e is consent \u003ccode\u003etrue\u003c/code\u003e for vendor ID \u003ccode\u003e1\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eIABTCF_VendorLegitimateInterests\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eBinary String\u003c/code\u003e: The \u003ccode\u003e'0'\u003c/code\u003e or \u003ccode\u003e'1'\u003c/code\u003e at position \u003cstrong\u003en\u003c/strong\u003e – where \u003cstrong\u003en\u003c/strong\u003e's indexing begins at \u003ccode\u003e0\u003c/code\u003e – indicates the legitimate interest status for Vendor ID \u003cstrong\u003en+1\u003c/strong\u003e; \u003ccode\u003efalse\u003c/code\u003e and \u003ccode\u003etrue\u003c/code\u003e respectively. eg. \u003ccode\u003e'1'\u003c/code\u003e at index \u003ccode\u003e0\u003c/code\u003e is legitimate interest established \u003ccode\u003etrue\u003c/code\u003e for vendor ID \u003ccode\u003e1\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eIABTCF_PurposeConsents\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eBinary String\u003c/code\u003e: The \u003ccode\u003e'0'\u003c/code\u003e or \u003ccode\u003e'1'\u003c/code\u003e at position \u003cstrong\u003en\u003c/strong\u003e – where \u003cstrong\u003en\u003c/strong\u003e's indexing begins at \u003ccode\u003e0\u003c/code\u003e – indicates the consent status for purpose ID \u003cstrong\u003en+1\u003c/strong\u003e; \u003ccode\u003efalse\u003c/code\u003e and \u003ccode\u003etrue\u003c/code\u003e respectively. eg. \u003ccode\u003e'1'\u003c/code\u003e at index \u003ccode\u003e0\u003c/code\u003e is consent \u003ccode\u003etrue\u003c/code\u003e for purpose ID \u003ccode\u003e1\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eIABTCF_PurposeLegitimateInterests\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eBinary String\u003c/code\u003e: The \u003ccode\u003e'0'\u003c/code\u003e or \u003ccode\u003e'1'\u003c/code\u003e at position \u003cstrong\u003en\u003c/strong\u003e – where \u003cstrong\u003en\u003c/strong\u003e's indexing begins at \u003ccode\u003e0\u003c/code\u003e – indicates the legitimate interest status for purpose ID \u003cstrong\u003en+1\u003c/strong\u003e; \u003ccode\u003efalse\u003c/code\u003e and \u003ccode\u003etrue\u003c/code\u003e respectively. eg. \u003ccode\u003e'1'\u003c/code\u003e at index \u003ccode\u003e0\u003c/code\u003e is legitimate interest established \u003ccode\u003etrue\u003c/code\u003e for purpose ID \u003ccode\u003e1\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eIABTCF_SpecialFeaturesOptIns\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eBinary String\u003c/code\u003e: The \u003ccode\u003e'0'\u003c/code\u003e or \u003ccode\u003e'1'\u003c/code\u003e at position \u003cstrong\u003en\u003c/strong\u003e – where \u003cstrong\u003en\u003c/strong\u003e's indexing begins at \u003ccode\u003e0\u003c/code\u003e – indicates the opt-in status for special feature ID \u003cstrong\u003en+1\u003c/strong\u003e; \u003ccode\u003efalse\u003c/code\u003e and \u003ccode\u003etrue\u003c/code\u003e respectively. eg. \u003ccode\u003e'1'\u003c/code\u003e at index \u003ccode\u003e0\u003c/code\u003e is opt-in \u003ccode\u003etrue\u003c/code\u003e for special feature ID \u003ccode\u003e1\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eIABTCF_PublisherRestrictions{ID}\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eString ['0','1', or '2']\u003c/code\u003e: The value at position \u003cstrong\u003en\u003c/strong\u003e – where \u003cstrong\u003en\u003c/strong\u003e's indexing begins at \u003ccode\u003e0\u003c/code\u003e – indicates the publisher restriction type (0-2) for vendor \u003cstrong\u003en+1\u003c/strong\u003e; (see Publisher Restrictions Types). eg. \u003ccode\u003e'2'\u003c/code\u003e at index \u003ccode\u003e0\u003c/code\u003e is restrictionType \u003ccode\u003e2\u003c/code\u003e for vendor ID \u003ccode\u003e1\u003c/code\u003e. \u003ccode\u003e{ID}\u003c/code\u003e refers to the purpose ID.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eIABTCF_PublisherConsent\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eBinary String\u003c/code\u003e: The \u003ccode\u003e'0'\u003c/code\u003e or \u003ccode\u003e'1'\u003c/code\u003e at position \u003cstrong\u003en\u003c/strong\u003e – where \u003cstrong\u003en\u003c/strong\u003e's indexing begins at \u003ccode\u003e0\u003c/code\u003e – indicates the purpose consent status for purpose ID \u003cstrong\u003en+1\u003c/strong\u003e for the publisher as they correspond to the \u003ca href=\"#what-is-the-global-vendor-list\"\u003eGlobal Vendor List\u003c/a\u003e Purposes; \u003ccode\u003efalse\u003c/code\u003e and \u003ccode\u003etrue\u003c/code\u003e respectively. eg. \u003ccode\u003e'1'\u003c/code\u003e at index \u003ccode\u003e0\u003c/code\u003e is consent \u003ccode\u003etrue\u003c/code\u003e for purpose ID \u003ccode\u003e1\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eIABTCF_PublisherLegitimateInterests\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eBinary String\u003c/code\u003e: The \u003ccode\u003e'0'\u003c/code\u003e or \u003ccode\u003e'1'\u003c/code\u003e at position \u003cstrong\u003en\u003c/strong\u003e – where \u003cstrong\u003en\u003c/strong\u003e's indexing begins at \u003ccode\u003e0\u003c/code\u003e – indicates the purpose legitimate interest status for purpose ID \u003cstrong\u003en+1\u003c/strong\u003e for the publisher as they correspond to the \u003ca href=\"#what-is-the-global-vendor-list\"\u003eGlobal Vendor List\u003c/a\u003e Purposes; \u003ccode\u003efalse\u003c/code\u003e and \u003ccode\u003etrue\u003c/code\u003e respectively. eg. \u003ccode\u003e'1'\u003c/code\u003e at index \u003ccode\u003e0\u003c/code\u003e is legitimate interest established \u003ccode\u003etrue\u003c/code\u003e for purpose ID \u003ccode\u003e1\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eIABTCF_PublisherCustomPurposesConsents\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eBinary String\u003c/code\u003e: The \u003ccode\u003e'0'\u003c/code\u003e or \u003ccode\u003e'1'\u003c/code\u003e at position \u003cstrong\u003en\u003c/strong\u003e – where \u003cstrong\u003en\u003c/strong\u003e's indexing begins at \u003ccode\u003e0\u003c/code\u003e – indicates the purpose consent status for the publisher's custom purpose ID \u003cstrong\u003en+1\u003c/strong\u003e for the publisher; \u003ccode\u003efalse\u003c/code\u003e and \u003ccode\u003etrue\u003c/code\u003e respectively. eg. \u003ccode\u003e'1'\u003c/code\u003e at index \u003ccode\u003e0\u003c/code\u003e is consent \u003ccode\u003etrue\u003c/code\u003e for custom purpose ID \u003ccode\u003e1\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eIABTCF_PublisherCustomPurposesLegitimateInterests\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eBinary String\u003c/code\u003e: The \u003ccode\u003e'0'\u003c/code\u003e or \u003ccode\u003e'1'\u003c/code\u003e at position \u003cstrong\u003en\u003c/strong\u003e – where \u003cstrong\u003en\u003c/strong\u003e's indexing begins at \u003ccode\u003e0\u003c/code\u003e – indicates the purpose legitimate interest status for the publisher's custom purpose ID \u003cstrong\u003en+1\u003c/strong\u003e for the publisher; \u003ccode\u003efalse\u003c/code\u003e and \u003ccode\u003etrue\u003c/code\u003e respectively. eg. \u003ccode\u003e'1'\u003c/code\u003e at index \u003ccode\u003e0\u003c/code\u003e is legitimate interest established \u003ccode\u003etrue\u003c/code\u003e for custom purpose ID \u003ccode\u003e1\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eHow do third-party SDKs (vendors) access the consent information in-app?\u003c/h4\u003e\u003ca id=\"user-content-how-do-third-party-sdks-vendors-access-the-consent-information-in-app\" class=\"anchor\" aria-label=\"Permalink: How do third-party SDKs (vendors) access the consent information in-app?\" href=\"#how-do-third-party-sdks-vendors-access-the-consent-information-in-app\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eOn both Android OS and iOS, the vendor can get notified when the values of the shared keys change. See \u003ca href=\"https://developer.apple.com/documentation/foundation/nsuserdefaultsdidchangenotification?language=objc\" rel=\"nofollow\"\u003eNSUserDefaultsDidChangeNotification\u003c/a\u003e and \u003ca href=\"https://developer.android.com/reference/android/content/SharedPreferences.OnSharedPreferenceChangeListener.html\" rel=\"nofollow\"\u003eSharedPreferences.OnSharedPreferenceChangeListener\u003c/a\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eOn Android OS, the TC data and TC string shall be stored in the default Shared Preferences for the application context. This can be accessed using the \u003ccode\u003egetDefaultSharedPreferences\u003c/code\u003e method from the \u003ccode\u003eandroid.preference.PreferenceManager\u003c/code\u003e class using the application context.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eExample\u003c/strong\u003e:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-java notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"Context mContext = getApplicationContext();\nSharedPreferences mPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);\"\u003e\u003cpre\u003e\u003cspan class=\"pl-smi\"\u003eContext\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003emContext\u003c/span\u003e = \u003cspan class=\"pl-en\"\u003egetApplicationContext\u003c/span\u003e();\n\u003cspan class=\"pl-smi\"\u003eSharedPreferences\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003emPreferences\u003c/span\u003e = \u003cspan class=\"pl-smi\"\u003ePreferenceManager\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003egetDefaultSharedPreferences\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003emContext\u003c/span\u003e);\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe TC data values can be retrieved from the application Shared Preferences by key name using the \u003ccode\u003eget\u003c/code\u003e methods on the \u003ccode\u003eandroid.content.SharedPreferences\u003c/code\u003e class. For the purposes of accessing TC data, only two methods should be necessary: \u003ccode\u003egetString(String key, String defValue)\u003c/code\u003e for \u003ccode\u003eString\u003c/code\u003e values and \u003ccode\u003egetInt(String key, int defValue)\u003c/code\u003e for \u003ccode\u003einteger\u003c/code\u003es and \u003ccode\u003einteger\u003c/code\u003e representations of \u003ccode\u003eBoolean\u003c/code\u003e values.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eExample\u003c/strong\u003e:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-java notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"Context mContext = getApplicationContext();\nSharedPreferences mPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);\nString consentString = mPreferences.getString(\u0026quot;IABTCF_TCString\u0026quot;, \u0026quot;\u0026quot;);\nint gdprApplies = mPreferences.getInt(\u0026quot;IABTCF_gdprApplies\u0026quot;, 0);\"\u003e\u003cpre\u003e\u003cspan class=\"pl-smi\"\u003eContext\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003emContext\u003c/span\u003e = \u003cspan class=\"pl-en\"\u003egetApplicationContext\u003c/span\u003e();\n\u003cspan class=\"pl-smi\"\u003eSharedPreferences\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003emPreferences\u003c/span\u003e = \u003cspan class=\"pl-smi\"\u003ePreferenceManager\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003egetDefaultSharedPreferences\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003emContext\u003c/span\u003e);\n\u003cspan class=\"pl-smi\"\u003eString\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003econsentString\u003c/span\u003e = \u003cspan class=\"pl-s1\"\u003emPreferences\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003egetString\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"IABTCF_TCString\"\u003c/span\u003e, \u003cspan class=\"pl-s\"\u003e\"\"\u003c/span\u003e);\n\u003cspan class=\"pl-smi\"\u003eint\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003egdprApplies\u003c/span\u003e = \u003cspan class=\"pl-s1\"\u003emPreferences\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003egetInt\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"IABTCF_gdprApplies\"\u003c/span\u003e, \u003cspan class=\"pl-c1\"\u003e0\u003c/span\u003e);\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eA callback can be registered to update settings when a preference is changed using the \u003ccode\u003eregisterOnSharedPreferenceChangeListener\u003c/code\u003e method for the \u003ccode\u003eandroid.content.SharedPreferences\u003c/code\u003e class.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eNote\u003c/strong\u003e: The preference manager does not currently store a strong reference to the listener. If you do not store a strong reference, the listener will be susceptible to garbage collection. External guidance such as this \u003ca href=\"https://developer.android.com/guide/topics/ui/settings#Listening\" rel=\"nofollow\"\u003edocumentation on setting listeners\u003c/a\u003e may provide more information on listening for preference changes.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eExample\u003c/strong\u003e:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-java notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"Context mContext = getApplicationContext();\nSharedPreferences mPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);\nSharedPreferences.OnSharedPreferenceChangeListener mListener;\nmListener = new SharedPreferences.OnSharedPreferenceChangeListener() {\n public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {\n if (key.equals([Specific Consent Key])) {\n // Update Consent settings\n }\n }\n };\n\n\nmPreferences.registerOnSharedPreferenceChangeListener(mListener);\"\u003e\u003cpre\u003e\u003cspan class=\"pl-smi\"\u003eContext\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003emContext\u003c/span\u003e = \u003cspan class=\"pl-en\"\u003egetApplicationContext\u003c/span\u003e();\n\u003cspan class=\"pl-smi\"\u003eSharedPreferences\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003emPreferences\u003c/span\u003e = \u003cspan class=\"pl-smi\"\u003ePreferenceManager\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003egetDefaultSharedPreferences\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003emContext\u003c/span\u003e);\n\u003cspan class=\"pl-smi\"\u003eSharedPreferences\u003c/span\u003e.\u003cspan class=\"pl-smi\"\u003eOnSharedPreferenceChangeListener\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003emListener\u003c/span\u003e;\n\u003cspan class=\"pl-s1\"\u003emListener\u003c/span\u003e = \u003cspan class=\"pl-k\"\u003enew\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eSharedPreferences\u003c/span\u003e.\u003cspan class=\"pl-smi\"\u003eOnSharedPreferenceChangeListener\u003c/span\u003e() {\n \u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eonSharedPreferenceChanged\u003c/span\u003e(\u003cspan class=\"pl-smi\"\u003eSharedPreferences\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003epreferences\u003c/span\u003e, \u003cspan class=\"pl-smi\"\u003eString\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ekey\u003c/span\u003e) {\n \u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e (\u003cspan class=\"pl-s1\"\u003ekey\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003eequals\u003c/span\u003e([\u003cspan class=\"pl-smi\"\u003eSpecific\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eConsent\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eKey\u003c/span\u003e])) {\n \u003cspan class=\"pl-c\"\u003e// Update Consent settings\u003c/span\u003e\n }\n }\n };\n\n\n\u003cspan class=\"pl-s1\"\u003emPreferences\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003eregisterOnSharedPreferenceChangeListener\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003emListener\u003c/span\u003e);\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eHow does ad mediation work in-app?\u003c/h4\u003e\u003ca id=\"user-content-how-does-ad-mediation-work-in-app\" class=\"anchor\" aria-label=\"Permalink: How does ad mediation work in-app?\" href=\"#how-does-ad-mediation-work-in-app\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eMediation SDK allows app developers to monetize from multiple vendors.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eMediation SDK\u003c/h5\u003e\u003ca id=\"user-content-mediation-sdk\" class=\"anchor\" aria-label=\"Permalink: Mediation SDK\" href=\"#mediation-sdk\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eMediation SDK retrieves \u003ccode\u003eIABTCF_gdprApplies\u003c/code\u003e and \u003ccode\u003eIABTCF_TCString\u003c/code\u003e from \u003ca href=\"https://developer.apple.com/documentation/foundation/nsuserdefaults#1664798?language=objc\" rel=\"nofollow\"\u003e\u003ccode\u003eNSUserDefaults\u003c/code\u003e\u003c/a\u003e(iOS) or \u003ca href=\"https://developer.android.com/training/data-storage/shared-preferences.html\" rel=\"nofollow\"\u003e\u003ccode\u003eSharedPreferences\u003c/code\u003e\u003c/a\u003e(Android).\u003c/li\u003e\n\u003cli\u003eIf \u003ccode\u003eIABTCF_gdprApplies == 0\u003c/code\u003e, Mediation SDK can run mediation across all ad network SDKs.\u003c/li\u003e\n\u003cli\u003eIf \u003ccode\u003eIABTCF_gdprApplies == 1\u003c/code\u003e, Mediation SDK will run mediation only among the ad network SDKs that are GDPR ready.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e'GDPR ready' means that the vendor retrieves \u003ccode\u003eIABTCF_gdprApplies\u003c/code\u003e and \u003ccode\u003eIABTCF_TCString\u003c/code\u003e from \u003ca href=\"https://developer.apple.com/documentation/foundation/nsuserdefaults#1664798?language=objc\" rel=\"nofollow\"\u003e\u003ccode\u003eNSUserDefaults\u003c/code\u003e\u003c/a\u003e(iOS) or \u003ca href=\"https://developer.android.com/training/data-storage/shared-preferences.html\" rel=\"nofollow\"\u003e\u003ccode\u003eSharedPreferences\u003c/code\u003e\u003c/a\u003e(Android), and passes on these GDPR values downstream.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eVendor\u003c/h5\u003e\u003ca id=\"user-content-vendor\" class=\"anchor\" aria-label=\"Permalink: Vendor\" href=\"#vendor\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eVendor retrieves \u003ccode\u003eIABTCF_gdprApplies\u003c/code\u003e and \u003ccode\u003eIABTCF_TCString\u003c/code\u003e from \u003ca href=\"https://developer.apple.com/documentation/foundation/nsuserdefaults#1664798?language=objc\" rel=\"nofollow\"\u003e\u003ccode\u003eNSUserDefaults\u003c/code\u003e\u003c/a\u003e(iOS) or \u003ca href=\"https://developer.android.com/training/data-storage/shared-preferences.html\" rel=\"nofollow\"\u003e\u003ccode\u003eSharedPreferences\u003c/code\u003e\u003c/a\u003e(Android), and passes on these GDPR values downstream.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCTV Details\u003c/h3\u003e\u003ca id=\"user-content-ctv-details\" class=\"anchor\" aria-label=\"Permalink: CTV Details\" href=\"#ctv-details\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eHow is a CMP used in the CTV context?\u003c/h4\u003e\u003ca id=\"user-content-how-is-a-cmp-used-in-the-ctv-context\" class=\"anchor\" aria-label=\"Permalink: How is a CMP used in the CTV context?\" href=\"#how-is-a-cmp-used-in-the-ctv-context\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe context of the CTV application will determine the storage locations and naming of the TCF data.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eWeb Runtime\u003c/h4\u003e\u003ca id=\"user-content-web-runtime\" class=\"anchor\" aria-label=\"Permalink: Web Runtime\" href=\"#web-runtime\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eApplications running in a web runtime environment that supports, at minimum, the Web Storage (Second Edition) specification shall follow all storage and naming conventions detailed in the \u003ca href=\"https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md#what-required-api-commands-must-a-cmp-support\"\u003eJavascript\u003c/a\u003e section of this spec. Data is to be retrieved using the commands, offering a consistent interface for Vendors to access TC string information.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eShould data not persist in Web Storage beyond the lifecycle of the application (application close, standby, or device shutdown), all data storage and naming conventions are to follow the specifications outlined in the CTV Native Private Storage section of this spec.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eNative\u003c/h4\u003e\u003ca id=\"user-content-native\" class=\"anchor\" aria-label=\"Permalink: Native\" href=\"#native\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eNative CTV applications should support both Global Privacy Platform (GPP) section key names as well as TCF key names by following the naming conventions of Global Privacy Platform (GPP) data and string outlined in the \u003ca href=\"https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/main/Sections/EEA/GPPExtension%3A%20IAB%20Europe%20TCF.md#key-names\"\u003eTCF EU Section spec\u003c/a\u003e and the TCF naming conventions outlined for in-app usage \u003ca href=\"#what-is-the-cmp-in-app-internal-structure-for-the-defined-api\"\u003eabove\u003c/a\u003e. Data is to be limited to the context of the Application and inaccessible to external applications.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ci\u003eApplication Preferences (Registry)\u003c/i\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eApplication Preferences, also referred to as a Registry in certain CTV environments, shall be used in a Native CTV Application environment under the condition that the TC data and TC String fit within the device constraints. Private Storage is to be used if the TC data and TC String do not fit within the device constraints\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ci\u003ePrivate Storage\u003c/i\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003ePrivate Storage shall be used under the condition that the CTV environment does not offer a Web Runtime that supports the Web Storage (Second Edition) specification, data does not persist beyond the lifecycle of the Application, or offer an Application Preferences (Registry) interface. The TC data and TC String are to be saved in a standardized and private storage space. Files are to follow the same naming convention as the key names detailed in the \u003ca href=\"https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/main/Sections/EEA/GPPExtension%3A%20IAB%20Europe%20TCF.md#key-names\"\u003eTCF EU Section spec\u003c/a\u003e and the key names outlined for in-app usage \u003ca href=\"#what-is-the-cmp-in-app-internal-structure-for-the-defined-api\"\u003eabove\u003c/a\u003e with the contents being the value of the corresponding key.\nNote: CTV Applications require proper permission scopes to be configured to read and write to the virtual Application file system.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCTV Examples\u003c/h4\u003e\u003ca id=\"user-content-ctv-examples\" class=\"anchor\" aria-label=\"Permalink: CTV Examples\" href=\"#ctv-examples\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eAndroid TV\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-java notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// Option 1\npublic void setTCString(String tcString) {\n SharedPreferences.Editor editor = sharedPrefs.edit();\n // TCF spec\n editor.putString(\u0026quot;IABTCF_TCString\u0026quot;, tcString);\n // GPP spec\n editor.putString(\u0026quot;IABGPP_2_TCString\u0026quot;, tcString);\n editor.commit();\n}\n\n// Option 2\npublic void setTCString(String tcString) {\n SharedPreferences.Editor editor = sharedPrefs.edit();\n editor.putString(\u0026quot;IABTCF_TCString\u0026quot;, tcString);\n editor.commit();\n}\npublic void setTCStringForGpp(String tcString) {\n SharedPreferences.Editor editor = sharedPrefs.edit();\n editor.putString(\u0026quot;IABGPP_2_TCString\u0026quot;, tcString);\n editor.commit();\n}\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e// Option 1\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003esetTCString\u003c/span\u003e(\u003cspan class=\"pl-smi\"\u003eString\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003etcString\u003c/span\u003e) {\n \u003cspan class=\"pl-smi\"\u003eSharedPreferences\u003c/span\u003e.\u003cspan class=\"pl-smi\"\u003eEditor\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eeditor\u003c/span\u003e = \u003cspan class=\"pl-s1\"\u003esharedPrefs\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003eedit\u003c/span\u003e();\n \u003cspan class=\"pl-c\"\u003e// TCF spec\u003c/span\u003e\n \u003cspan class=\"pl-s1\"\u003eeditor\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003eputString\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"IABTCF_TCString\"\u003c/span\u003e, \u003cspan class=\"pl-s1\"\u003etcString\u003c/span\u003e);\n \u003cspan class=\"pl-c\"\u003e// GPP spec\u003c/span\u003e\n \u003cspan class=\"pl-s1\"\u003eeditor\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003eputString\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"IABGPP_2_TCString\"\u003c/span\u003e, \u003cspan class=\"pl-s1\"\u003etcString\u003c/span\u003e);\n \u003cspan class=\"pl-s1\"\u003eeditor\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003ecommit\u003c/span\u003e();\n}\n\n\u003cspan class=\"pl-c\"\u003e// Option 2\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003esetTCString\u003c/span\u003e(\u003cspan class=\"pl-smi\"\u003eString\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003etcString\u003c/span\u003e) {\n \u003cspan class=\"pl-smi\"\u003eSharedPreferences\u003c/span\u003e.\u003cspan class=\"pl-smi\"\u003eEditor\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eeditor\u003c/span\u003e = \u003cspan class=\"pl-s1\"\u003esharedPrefs\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003eedit\u003c/span\u003e();\n \u003cspan class=\"pl-s1\"\u003eeditor\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003eputString\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"IABTCF_TCString\"\u003c/span\u003e, \u003cspan class=\"pl-s1\"\u003etcString\u003c/span\u003e);\n \u003cspan class=\"pl-s1\"\u003eeditor\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003ecommit\u003c/span\u003e();\n}\n\u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003esetTCStringForGpp\u003c/span\u003e(\u003cspan class=\"pl-smi\"\u003eString\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003etcString\u003c/span\u003e) {\n \u003cspan class=\"pl-smi\"\u003eSharedPreferences\u003c/span\u003e.\u003cspan class=\"pl-smi\"\u003eEditor\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eeditor\u003c/span\u003e = \u003cspan class=\"pl-s1\"\u003esharedPrefs\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003eedit\u003c/span\u003e();\n \u003cspan class=\"pl-s1\"\u003eeditor\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003eputString\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"IABGPP_2_TCString\"\u003c/span\u003e, \u003cspan class=\"pl-s1\"\u003etcString\u003c/span\u003e);\n \u003cspan class=\"pl-s1\"\u003eeditor\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003ecommit\u003c/span\u003e();\n}\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eApple TV\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-java notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// Option 1\n- (void)setTcString:(NSString *)tcString {\n NSUserDefaults *userDefaults = NSUserDefaults.standardUserDefaults;\n // TCF spec\n [userDefaults setObject:tcString forKey:@\u0026quot;IABTCF_TCString\u0026quot;];\n // GPP spec\n [userDefaults setObject:tcString forKey:@\u0026quot;IABGPP_2_TCString\u0026quot;];\n}\n\n// Option 2\n- (void)setTcString:(NSString *)tcString[INSERT] {\n NSUserDefaults *userDefaults = NSUserDefaults.standardUserDefaults;\n [userDefaults setObject:tcString forKey:@\u0026quot;IABTCF_TCString\u0026quot;];\n}\n- (void)setTcStringForGpp:(NSString *)tcString[INSERT] {\n NSUserDefaults *userDefaults = NSUserDefaults.standardUserDefaults;\n [userDefaults setObject:tcString forKey:@\u0026quot;IABGPP_2_TCString\u0026quot;];\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e// Option 1\u003c/span\u003e\n- (\u003cspan class=\"pl-smi\"\u003evoid\u003c/span\u003e)\u003cspan class=\"pl-s1\"\u003esetTcString\u003c/span\u003e:(\u003cspan class=\"pl-s1\"\u003eNSString\u003c/span\u003e *)\u003cspan class=\"pl-s1\"\u003etcString\u003c/span\u003e {\n \u003cspan class=\"pl-s1\"\u003eNSUserDefaults\u003c/span\u003e *\u003cspan class=\"pl-s1\"\u003euserDefaults\u003c/span\u003e = \u003cspan class=\"pl-smi\"\u003eNSUserDefaults\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003estandardUserDefaults\u003c/span\u003e;\n \u003cspan class=\"pl-c\"\u003e// TCF spec\u003c/span\u003e\n [\u003cspan class=\"pl-smi\"\u003euserDefaults\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003esetObject\u003c/span\u003e:\u003cspan class=\"pl-s1\"\u003etcString\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eforKey\u003c/span\u003e:\u003cspan class=\"pl-c1\"\u003e@\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"IABTCF_TCString\"\u003c/span\u003e];\n \u003cspan class=\"pl-c\"\u003e// GPP spec\u003c/span\u003e\n [\u003cspan class=\"pl-smi\"\u003euserDefaults\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003esetObject\u003c/span\u003e:\u003cspan class=\"pl-s1\"\u003etcString\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eforKey\u003c/span\u003e:\u003cspan class=\"pl-c1\"\u003e@\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"IABGPP_2_TCString\"\u003c/span\u003e];\n}\n\n\u003cspan class=\"pl-c\"\u003e// Option 2\u003c/span\u003e\n- (\u003cspan class=\"pl-smi\"\u003evoid\u003c/span\u003e)\u003cspan class=\"pl-s1\"\u003esetTcString\u003c/span\u003e:(\u003cspan class=\"pl-s1\"\u003eNSString\u003c/span\u003e *)\u003cspan class=\"pl-s1\"\u003etcString\u003c/span\u003e[\u003cspan class=\"pl-c1\"\u003eINSERT\u003c/span\u003e] {\n \u003cspan class=\"pl-s1\"\u003eNSUserDefaults\u003c/span\u003e *\u003cspan class=\"pl-s1\"\u003euserDefaults\u003c/span\u003e = \u003cspan class=\"pl-smi\"\u003eNSUserDefaults\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003estandardUserDefaults\u003c/span\u003e;\n [\u003cspan class=\"pl-smi\"\u003euserDefaults\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003esetObject\u003c/span\u003e:\u003cspan class=\"pl-s1\"\u003etcString\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eforKey\u003c/span\u003e:\u003cspan class=\"pl-c1\"\u003e@\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"IABTCF_TCString\"\u003c/span\u003e];\n}\n- (\u003cspan class=\"pl-smi\"\u003evoid\u003c/span\u003e)\u003cspan class=\"pl-s1\"\u003esetTcStringForGpp\u003c/span\u003e:(\u003cspan class=\"pl-s1\"\u003eNSString\u003c/span\u003e *)\u003cspan class=\"pl-s1\"\u003etcString\u003c/span\u003e[\u003cspan class=\"pl-c1\"\u003eINSERT\u003c/span\u003e] {\n \u003cspan class=\"pl-s1\"\u003eNSUserDefaults\u003c/span\u003e *\u003cspan class=\"pl-s1\"\u003euserDefaults\u003c/span\u003e = \u003cspan class=\"pl-smi\"\u003eNSUserDefaults\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003estandardUserDefaults\u003c/span\u003e;\n [\u003cspan class=\"pl-smi\"\u003euserDefaults\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003esetObject\u003c/span\u003e:\u003cspan class=\"pl-s1\"\u003etcString\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eforKey\u003c/span\u003e:\u003cspan class=\"pl-c1\"\u003e@\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"IABGPP_2_TCString\"\u003c/span\u003e];\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eRoku \u003ca href=\"https://developer.roku.com/docs/references/brightscript/components/roregistrysection.md\" rel=\"nofollow\"\u003eReference\u003c/a\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-java notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"Function SetTcfData(tcString As String) As Void\n sec = CreateObject(\u0026quot;roRegistrySection\u0026quot;, \u0026quot;TCF\u0026quot;)\n sec.Write(\u0026quot;IABTCF_TCString\u0026quot;, tcString)\n sec.Flush()\nEnd Function\n\nFunction SetGppData(tcString As String) As Void\n sec = CreateObject(\u0026quot;roRegistrySection\u0026quot;, \u0026quot;GPP\u0026quot;)\n sec.Write(\u0026quot;IABGPP_2_TCString\u0026quot;, tcString)\n sec.Flush()\nEnd Function\"\u003e\u003cpre\u003e\u003cspan class=\"pl-smi\"\u003eFunction\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eSetTcfData\u003c/span\u003e(\u003cspan class=\"pl-smi\"\u003etcString\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eAs\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eString\u003c/span\u003e) \u003cspan class=\"pl-s1\"\u003eAs\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eVoid\u003c/span\u003e\n \u003cspan class=\"pl-s1\"\u003esec\u003c/span\u003e = \u003cspan class=\"pl-en\"\u003eCreateObject\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"roRegistrySection\"\u003c/span\u003e, \u003cspan class=\"pl-s\"\u003e\"TCF\"\u003c/span\u003e)\n \u003cspan class=\"pl-s1\"\u003esec\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003eWrite\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"IABTCF_TCString\"\u003c/span\u003e, \u003cspan class=\"pl-s1\"\u003etcString\u003c/span\u003e)\n \u003cspan class=\"pl-s1\"\u003esec\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003eFlush\u003c/span\u003e()\n\u003cspan class=\"pl-smi\"\u003eEnd\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eFunction\u003c/span\u003e\n\n\u003cspan class=\"pl-smi\"\u003eFunction\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eSetGppData\u003c/span\u003e(\u003cspan class=\"pl-smi\"\u003etcString\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eAs\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eString\u003c/span\u003e) \u003cspan class=\"pl-s1\"\u003eAs\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eVoid\u003c/span\u003e\n \u003cspan class=\"pl-s1\"\u003esec\u003c/span\u003e = \u003cspan class=\"pl-en\"\u003eCreateObject\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"roRegistrySection\"\u003c/span\u003e, \u003cspan class=\"pl-s\"\u003e\"GPP\"\u003c/span\u003e)\n \u003cspan class=\"pl-s1\"\u003esec\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003eWrite\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"IABGPP_2_TCString\"\u003c/span\u003e, \u003cspan class=\"pl-s1\"\u003etcString\u003c/span\u003e)\n \u003cspan class=\"pl-s1\"\u003esec\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003eFlush\u003c/span\u003e()\n\u003cspan class=\"pl-smi\"\u003eEnd\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eFunction\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eUsing the CMP API\u003c/h2\u003e\u003ca id=\"user-content-using-the-cmp-api\" class=\"anchor\" aria-label=\"Permalink: Using the CMP API\" href=\"#using-the-cmp-api\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe following details provide information about how ad tags work, using the version parameter in the \u003ccode\u003e__tcfapi()\u003c/code\u003e function, and how vendors can interact with the API.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eHow do ad tags work?\u003c/h3\u003e\u003ca id=\"user-content-how-do-ad-tags-work\" class=\"anchor\" aria-label=\"Permalink: How do ad tags work?\" href=\"#how-do-ad-tags-work\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eTag-based demand, especially ad tags, are basically creative files, that are not an advertisement themselves, but are loaded to access additional sources to provide ad creative.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor performance reasons, the preferred way to make this happen in current ad servers are macros. The following two macros are recommended for ad server implementation:\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"left\"\u003eMacro\u003c/th\u003e\n\u003cth align=\"left\"\u003eValues\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e${GDPR}\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003cp dir=\"auto\"\u003e\u003cstrong\u003e1\u003c/strong\u003e - GDPR Applies\u003c/p\u003e\u003cp dir=\"auto\"\u003e\u003cstrong\u003e0\u003c/strong\u003e - GDPR does not apply\u003c/p\u003e\u003cp dir=\"auto\"\u003e\u003cstrong\u003eunset\u003c/strong\u003e - unknown\u003c/p\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e${GDPR_CONSENT_XXXX}\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eEncoded TC String where XXXX is the numeric Vendor ID of the vendor receiving the TC string.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eNote\u003c/strong\u003e: Values align with IAB OpenRTB GDPR Advisory\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eNote\u003c/strong\u003e: For more information on GDPR Applies see the section \u003ca href=\"#what-does-the-gdprapplies-value-mean\"\u003e\"What does the gdprApplies value mean?\"\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eHow does the \"version\" parameter work?\u003c/h3\u003e\u003ca id=\"user-content-how-does-the-version-parameter-work\" class=\"anchor\" aria-label=\"Permalink: How does the \u0026quot;version\u0026quot; parameter work?\" href=\"#how-does-the-version-parameter-work\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe \u003ccode\u003eVersion\u003c/code\u003e parameter of the API is used to enable scripts to specify what version of the API they are prepared to handle. The CMP shall respond in kind with the appropriately versioned information, if available.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIf the argument is \u003ccode\u003e0\u003c/code\u003e (Zero), \u003ccode\u003enull\u003c/code\u003e or \u003ccode\u003eundefined\u003c/code\u003e, the CMP shall return the information for the latest (highest) version available. For example, when a user has a v2 TC string and a v3 TC string, the CMP should return the v3 TC string and TC data.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIf the argument is invalid (i.e. not a positive integer greater than \u003ccode\u003e1\u003c/code\u003e or higher than the highest supported version for this CMP) the CMP shall invoke the callback with an argument of \u003ccode\u003efalse\u003c/code\u003e for the success parameter and a \u003ccode\u003enull\u003c/code\u003e argument for any expected TC data parameter.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIf the argument is \u003ccode\u003e1\u003c/code\u003e, the CMP shall invoke the callback with an argument of \u003ccode\u003efalse\u003c/code\u003e for the success parameter and a \u003ccode\u003enull\u003c/code\u003e argument for any expected TC data parameter, as this TCF version is no longer supported by this API.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIf the argument is an integer higher than \u003ccode\u003e1\u003c/code\u003e, the CMP shall invoke the callback with defined data according to the specified version if it exists in that version. For obvious reasons, if new properties of the version-specific outlined TC data objects are added in v3, a v2 TC data object shall not contain these new properties because they may either not exist or may have different meaning from version to version.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eWhat does the gdprApplies value mean?\u003c/h3\u003e\u003ca id=\"user-content-what-does-the-gdprapplies-value-mean\" class=\"anchor\" aria-label=\"Permalink: What does the gdprApplies value mean?\" href=\"#what-does-the-gdprapplies-value-mean\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003egdprApplies\u003c/code\u003e is a \u003ccode\u003eboolean\u003c/code\u003e value that may be \u003ccode\u003eundefined\u003c/code\u003e. A CMP shall determine whether or not GDPR applies in its current context and set the \u003ccode\u003egdprApplies\u003c/code\u003e value. A publisher may determine that GDPR applies to all traffic on their site and signal their CMP to always return \u003ccode\u003etrue\u003c/code\u003e for \u003ccode\u003egdprApplies\u003c/code\u003e, a CMP may invoke a geo-tagging service call to make a determination on a specific user or may have some other proprietary solution for determining whether or not GDPR applies in accordance with \u003ca href=\"https://iabeurope.eu/iab-europe-transparency-consent-framework-policies/\" rel=\"nofollow\"\u003eTCF Policy\u003c/a\u003e. In any case, vendors shall respect the value of \u003ccode\u003egdprApplies\u003c/code\u003e put forth by the CMP. If \u003ccode\u003egdprApplies\u003c/code\u003e value is \u003ccode\u003eundefined\u003c/code\u003e but exists in the schema outlined in the response object in this document, then calling scripts shall assume that the CMP is still pending a determination on whether or not GDPR applies in this context. Note: For mobile all booleans are written as \u003ccode\u003eNumber\u003c/code\u003e (integer).\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDetails for vendors\u003c/h3\u003e\u003ca id=\"user-content-details-for-vendors\" class=\"anchor\" aria-label=\"Permalink: Details for vendors\" href=\"#details-for-vendors\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eHow can scripts on a page determine if there is a CMP present?\u003c/h4\u003e\u003ca id=\"user-content-how-can-scripts-on-a-page-determine-if-there-is-a-cmp-present\" class=\"anchor\" aria-label=\"Permalink: How can scripts on a page determine if there is a CMP present?\" href=\"#how-can-scripts-on-a-page-determine-if-there-is-a-cmp-present\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eScripts can check for the presence of a function named \u003ccode\u003e__tcfapi\u003c/code\u003e – if it exists then a CMP can be assumed to be present for scripts. In iframes, the presence of a CMP can be determined by the existence of a specially-named iframe named \u003ccode\u003e\"__tcfapiLocator\"\u003c/code\u003e in the parent (or above) frame. The CMP shall create an iframe as a signal to scripts nested in other iframes that a CMP exists in a higher frame and name it \u003ccode\u003e\"__tcfapiLocator\"\u003c/code\u003e on the current \u003ccode\u003eDOM\u003c/code\u003e to indicate its own presence; since iframe properties can be accessed from other iframes. Publishers must load the CMP in a parent (or ancestor) of all iframes that may need to establish a GDPR legal basis.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIf a CMP is not present, or if the CMP fails to respond, vendors should assume \"no consent\" and “no legitimate interest transparency established” in contexts where GDPR applies (see the section \u003ca href=\"#what-does-the-gdprapplies-value-mean\"\u003e\"What does the gdprApplies value mean?\"\u003c/a\u003e for more).\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eHow can scripts determine if the CMP script is loaded yet?\u003c/h4\u003e\u003ca id=\"user-content-how-can-scripts-determine-if-the-cmp-script-is-loaded-yet\" class=\"anchor\" aria-label=\"Permalink: How can scripts determine if the CMP script is loaded yet?\" href=\"#how-can-scripts-determine-if-the-cmp-script-is-loaded-yet\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eTypically, scripts will not need to check if the CMP script is loaded. Scripts can simply call the \u003ccode\u003e__tcfapi\u003c/code\u003e function as it will queue the calls for execution when the full CMP script is loaded. If the full CMP has been loaded, its \u003ccode\u003e__tcfapi\u003c/code\u003e implementation will handle the call normally. If necessary, the \u003ca href=\"#ping\"\u003e\u003ccode\u003e'ping'\u003c/code\u003e\u003c/a\u003e command will return a \u003ca href=\"#pingreturn\"\u003e\u003ccode\u003ePingReturn\u003c/code\u003e\u003c/a\u003e object that contains the \u003ccode\u003eboolean\u003c/code\u003e property \u003ccode\u003ecmpLoaded\u003c/code\u003e to indicate whether the cmp is loaded.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eHow does the CMP \"stub\" API work?\u003c/h4\u003e\u003ca id=\"user-content-how-does-the-cmp-stub-api-work\" class=\"anchor\" aria-label=\"Permalink: How does the CMP \u0026quot;stub\u0026quot; API work?\" href=\"#how-does-the-cmp-stub-api-work\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003eA CMP-provided synchronous \"stub\" script must be added by the publisher to their page before any other scripts that rely on \u003ccode\u003e__tcfapi\u003c/code\u003e (this usually means between the \u003ccode\u003e\u0026lt;head\u0026gt;\u0026lt;/head\u0026gt;\u003c/code\u003e tags of the HTML document).\u003c/li\u003e\n\u003cli\u003eThis \"stub\" will:\n\u003col dir=\"auto\"\u003e\n\u003cli\u003eDefine a queuing function named \u003ccode\u003e__tcfapi\u003c/code\u003e at the \u003ccode\u003eWindow\u003c/code\u003e scope.\u003c/li\u003e\n\u003cli\u003eAll arguments for a given call to the stubbed \u003ccode\u003e__tcfapi\u003c/code\u003e method will be enqueued as a set.\u003c/li\u003e\n\u003cli\u003eDefine the postMessage handler function for cross-origin iframe requests.\u003c/li\u003e\n\u003cli\u003eAdd the newly-created \u003ccode\u003epostMessage\u003c/code\u003e handler function as an event listener on the \u003ccode\u003eWindow\u003c/code\u003e object listening for the \u003ccode\u003e‘message’\u003c/code\u003e event.\u003c/li\u003e\n\u003cli\u003eCreate an iframe named \u003ccode\u003e'__tcfapiLocator'\u003c/code\u003e in the current DOM.\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003cli\u003eWhen the main CMP implementation script loads and executes, it will:\n\u003col dir=\"auto\"\u003e\n\u003cli\u003eCreate an internal reference to the queued argument sets of the \"stub\".\u003c/li\u003e\n\u003cli\u003eRedefine the \u003ccode\u003e__tcfapi\u003c/code\u003e function to the CMP’s full API implementation.\u003c/li\u003e\n\u003cli\u003eIterate and dequeue the queued argument sets in a first-in-first-out (FIFO) order and \u003ccode\u003eapply\u003c/code\u003e each set of arguments to the fully-implemented \u003ccode\u003e__tcfapi\u003c/code\u003e function.\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eRequirements for the CMP \"stub\" API script\u003c/h4\u003e\u003ca id=\"user-content-requirements-for-the-cmp-stub-api-script\" class=\"anchor\" aria-label=\"Permalink: Requirements for the CMP \u0026quot;stub\u0026quot; API script\" href=\"#requirements-for-the-cmp-stub-api-script\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eA CMP must provide stub script to its clients that at least supports the following features/logic:\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003e__tcfapi\u003c/code\u003e function that supports the ping command, with the minimum properties of \u003ccode\u003ecmpLoaded\u003c/code\u003e and \u003ccode\u003eapiVersion\u003c/code\u003e. \u003cstrong\u003eNote\u003c/strong\u003e: \u003ccode\u003egdprApplies\u003c/code\u003e may also be set in the \u003ca href=\"#pingreturn\"\u003e\u003ccode\u003ePingReturn\u003c/code\u003e\u003c/a\u003e object if the \"stub\" is set by the publisher to apply GDPR to all traffic. However, \u003ccode\u003egdprApplies\u003c/code\u003e may not be available until the CMP is finished loading and the value will, therefore, be \u003ccode\u003eundefined\u003c/code\u003e. See the section \u003ca href=\"#what-does-the-gdprapplies-value-mean\"\u003e\"What does the gdprApplies value mean?\"\u003c/a\u003e for more.\u003c/li\u003e\n\u003cli\u003eCollect all calls to \u003ccode\u003e__tcfapi\u003c/code\u003e that cannot (yet) be handled by the “stub” in a queue\u003c/li\u003e\n\u003cli\u003eCheck if \u003ccode\u003ewindow.frames['__tcfapiLocator']\u003c/code\u003e exists, indicating that a CMP is already present, otherwise create an empty iframe named \u003ccode\u003e'__tcfapiLocator'\u003c/code\u003e in the current DOM.\u003c/li\u003e\n\u003cli\u003eCreate an event listener for \u003ccode\u003epostMessage\u003c/code\u003e events on the \u003ccode\u003eWindow\u003c/code\u003e object. When the event handler function receives a postMessage (\u003ccode\u003e‘message’\u003c/code\u003e) event it shall proxy the \u003ccode\u003e__tcfapi\u003c/code\u003e function requests to send the response back through the \u003ccode\u003epostMessage\u003c/code\u003e event channel\u003c/li\u003e\n\u003cli\u003eThe stub code must be loaded and executed synchronously before any other scripts that depend on the \u003ccode\u003e__tcfapi\u003c/code\u003e function to be there – this usually means between the \u003ccode\u003e\u0026lt;head\u0026gt;\u0026lt;/head\u0026gt;\u003c/code\u003e tags of the HTML document – in order to ensure that it can be executed before all calls from third parties.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eIs there a sample CMP “stub” API script?\u003c/h4\u003e\u003ca id=\"user-content-is-there-a-sample-cmp-stub-api-script\" class=\"anchor\" aria-label=\"Permalink: Is there a sample CMP “stub” API script?\" href=\"#is-there-a-sample-cmp-stub-api-script\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eYou can find an iab-supported open-source implementation of the stub API here: \u003ca href=\"https://github.com/InteractiveAdvertisingBureau/iabtcf-es/blob/master/modules/stub/\"\u003ehttps://github.com/InteractiveAdvertisingBureau/iabtcf-es/blob/master/modules/stub/\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThis code should be executed on the page before any other scripts that require the \u003ccode\u003e__tcfapi\u003c/code\u003e function – this usually means between the \u003ccode\u003e\u0026lt;head\u0026gt;\u0026lt;/head\u0026gt;\u003c/code\u003e tags of the HTML document. The sample script also includes the \u003ccode\u003epostMessage\u003c/code\u003e handler.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eHow can vendors that use iframes call the CMP API from an iframe?\u003c/h3\u003e\u003ca id=\"user-content-how-can-vendors-that-use-iframes-call-the-cmp-api-from-an-iframe\" class=\"anchor\" aria-label=\"Permalink: How can vendors that use iframes call the CMP API from an iframe?\" href=\"#how-can-vendors-that-use-iframes-call-the-cmp-api-from-an-iframe\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe only way to request TC Data from a parent or ancestor’s frame is \u003ca href=\"#using-postmessage\"\u003eusing postmessage\u003c/a\u003e.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eUsing postmessage\u003c/h4\u003e\u003ca id=\"user-content-using-postmessage\" class=\"anchor\" aria-label=\"Permalink: Using postmessage\" href=\"#using-postmessage\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe \u003ca href=\"https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage\" rel=\"nofollow\"\u003e\u003ccode\u003ewindow.postMessage()\u003c/code\u003e\u003c/a\u003e method may be used from a child iframe to make requests from a parent or any ancestor frame's CMP API. To locate an ancestor frame capable of responding to \u003ccode\u003epostMessage()\u003c/code\u003e CMP API calls, search for an ancestor frame that has a child frame named \u003ccode\u003e'__tcfapiLocator'\u003c/code\u003e (see \u003ca href=\"#is-there-a-sample-iframe-script-call-to-the-cmp-api\"\u003esample code\u003c/a\u003e).\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eCMPs shall create an event listener to handle \u003ccode\u003epostMessage\u003c/code\u003e requests via the \u003ca href=\"#how-does-the-cmp-stub-api-work\"\u003eCMP “stub” API script\u003c/a\u003e so that \u003ccode\u003epostMessage\u003c/code\u003e events can be queued and processed by the full-implementation of the CMP API as soon as it is initialized.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eSent Message\u003c/strong\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe sent message shall follow the form outlined below. The command, parameter and version object properties correspond to their namesake parameters defined as method argument parameters for \u003ccode\u003e__tcfapi()\u003c/code\u003e method. The “sent message” also requires a unique callId property to help match the request with a response. The \u003ccode\u003ecallId\u003c/code\u003e property shall be either a string or a number, but the calling script shall not use the two types interchangeably.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"{\n __tcfapiCall: {\n command: \u0026quot;command\u0026quot;,\n parameter: parameter,\n version: version\n }\n}\"\u003e\u003cpre\u003e\u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003e__tcfapiCall\u003c/span\u003e: \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003ecommand\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e\"command\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003eparameter\u003c/span\u003e: \u003cspan class=\"pl-s1\"\u003eparameter\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003eversion\u003c/span\u003e: \u003cspan class=\"pl-s1\"\u003eversion\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe \u003ccode\u003eevent.data\u003c/code\u003e object payload shall follow the form outlined below. The \u003ccode\u003ereturnValue\u003c/code\u003e object property shall be the corresponding TC data object for the \u003ccode\u003ecommand\u003c/code\u003e used upon sending the “sent message”. The \u003ccode\u003esuccess\u003c/code\u003e object property shall reflect the \u003ccode\u003e__tcfapi()\u003c/code\u003e \u003ccode\u003esuccess\u003c/code\u003e callback argument and the \u003ccode\u003ecallId\u003c/code\u003e will correspond to the “sent message” unique id passed in the \u003ccode\u003ecallId\u003c/code\u003e property.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"{\n __tcfapiReturn: {\n returnValue: returnValue,\n success: boolean,\n callId: uniqueId\n }\n}\"\u003e\u003cpre\u003e\u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003e__tcfapiReturn\u003c/span\u003e: \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003ereturnValue\u003c/span\u003e: \u003cspan class=\"pl-s1\"\u003ereturnValue\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003esuccess\u003c/span\u003e: \u003cspan class=\"pl-s1\"\u003eboolean\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003ecallId\u003c/span\u003e: \u003cspan class=\"pl-s1\"\u003euniqueId\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eIs there a sample iframe script call to the CMP API?\u003c/h4\u003e\u003ca id=\"user-content-is-there-a-sample-iframe-script-call-to-the-cmp-api\" class=\"anchor\" aria-label=\"Permalink: Is there a sample iframe script call to the CMP API?\" href=\"#is-there-a-sample-iframe-script-call-to-the-cmp-api\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eBelow is an example script that emulates the in-frame \u003ccode\u003e__tcfapi()\u003c/code\u003e call. It locates the ancestor frame running the CMP, performs the \u003ccode\u003epostMessage\u003c/code\u003e and listens for the return message and passes its values to the callback:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"(function() {\n\n //start here at our window\n let frame = window;\n\n // if we locate the CMP iframe we will reference it with this\n let cmpFrame;\n\n // map of calls\n const cmpCallbacks = {};\n\n while(frame) {\n\n try {\n\n /**\n * throws a reference error if no frames exist\n */\n\n if (frame.frames['__tcfapiLocator']) {\n\n cmpFrame = frame;\n break;\n\n }\n\n } catch(ignore) {}\n\n if(frame === window.top) {\n\n break;\n\n }\n\n frame = frame.parent;\n\n }\n\n /**\n * Set up a __tcfapi proxy method to do the postMessage and map the callback.\n * From the caller's perspective, this function behaves identically to the\n * CMP API's __tcfapi call\n */\n\n window.__tcfapi = function(cmd, version, callback, arg) {\n\n if (!cmpFrame) {\n\n callback({msg: 'CMP not found'}, false);\n\n } else {\n\n const callId = Math.random() + '';\n const msg = {\n __tcfapiCall: {\n command: cmd,\n parameter: arg,\n version: version,\n callId: callId,\n },\n };\n\n /**\n * map the callback for lookup on response\n */\n\n cmpCallbacks[callId] = callback;\n cmpFrame.postMessage(msg, '*');\n\n }\n\n };\n\n function postMessageHandler(event) {\n\n /**\n * when we get the return message, call the mapped callback\n */\n\n let json = {};\n\n try {\n\n /**\n * if this isn't valid JSON then this will throw an error\n */\n\n json = typeof event.data === 'string' ? JSON.parse(event.data) : event.data;\n\n } catch (ignore) {}\n\n const payload = json.__tcfapiReturn;\n\n if (payload) {\n\n /**\n * messages we care about will have a payload\n */\n\n if (typeof cmpCallbacks[payload.callId] === 'function') {\n\n /**\n * call the mapped callback and then remove the reference\n */\n\n cmpCallbacks[payload.callId](payload.returnValue, payload.success);\n cmpCallbacks[payload.callId] = null;\n\n }\n\n }\n\n }\n\n window.addEventListener('message', postMessageHandler, false);\n\n}());\n\n__tcfapi('ping', 2, (pingReturn, success) =\u0026gt; {\n\n // should get response from window.top's CMP\n\n});\"\u003e\u003cpre\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-k\"\u003efunction\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e//start here at our window\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003elet\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eframe\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003ewindow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e// if we locate the CMP iframe we will reference it with this\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003elet\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ecmpFrame\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e// map of calls\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ecmpCallbacks\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n \u003cspan class=\"pl-k\"\u003ewhile\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eframe\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-k\"\u003etry\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * throws a reference error if no frames exist\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n\n \u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eframe\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eframes\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e'__tcfapiLocator'\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-s1\"\u003ecmpFrame\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eframe\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e \u003cspan class=\"pl-k\"\u003ecatch\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eignore\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\n \u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eframe\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e===\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003ewindow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003etop\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\n \u003cspan class=\"pl-s1\"\u003eframe\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eframe\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eparent\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * Set up a __tcfapi proxy method to do the postMessage and map the callback.\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * From the caller's perspective, this function behaves identically to the\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * CMP API's __tcfapi call\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n\n \u003cspan class=\"pl-smi\"\u003ewindow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003e__tcfapi\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-k\"\u003efunction\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003ecmd\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eversion\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ecallback\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003earg\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e!\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003ecmpFrame\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-s1\"\u003ecallback\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003emsg\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e'CMP not found'\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003efalse\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eelse\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ecallId\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-v\"\u003eMath\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003erandom\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e+\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e''\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003emsg\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003e__tcfapiCall\u003c/span\u003e: \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003ecommand\u003c/span\u003e: \u003cspan class=\"pl-s1\"\u003ecmd\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003eparameter\u003c/span\u003e: \u003cspan class=\"pl-s1\"\u003earg\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003eversion\u003c/span\u003e: \u003cspan class=\"pl-s1\"\u003eversion\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003ecallId\u003c/span\u003e: \u003cspan class=\"pl-s1\"\u003ecallId\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * map the callback for lookup on response\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n\n \u003cspan class=\"pl-s1\"\u003ecmpCallbacks\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003ecallId\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ecallback\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n \u003cspan class=\"pl-s1\"\u003ecmpFrame\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003epostMessage\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003emsg\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e'*'\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n \u003cspan class=\"pl-k\"\u003efunction\u003c/span\u003e \u003cspan class=\"pl-en\"\u003epostMessageHandler\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eevent\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * when we get the return message, call the mapped callback\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n\n \u003cspan class=\"pl-k\"\u003elet\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ejson\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n \u003cspan class=\"pl-k\"\u003etry\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * if this isn't valid JSON then this will throw an error\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n\n \u003cspan class=\"pl-s1\"\u003ejson\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-k\"\u003etypeof\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eevent\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003edata\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e===\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e'string'\u003c/span\u003e ? \u003cspan class=\"pl-c1\"\u003eJSON\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eparse\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eevent\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003edata\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e : \u003cspan class=\"pl-s1\"\u003eevent\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003edata\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e \u003cspan class=\"pl-k\"\u003ecatch\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eignore\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\n \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003epayload\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ejson\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e__tcfapiReturn\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n \u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003epayload\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * messages we care about will have a payload\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n\n \u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-k\"\u003etypeof\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ecmpCallbacks\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003epayload\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003ecallId\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e===\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e'function'\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e/**\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e * call the mapped callback and then remove the reference\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e */\u003c/span\u003e\n\n \u003cspan class=\"pl-s1\"\u003ecmpCallbacks\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003epayload\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003ecallId\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003epayload\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003ereturnValue\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003epayload\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003esuccess\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n \u003cspan class=\"pl-s1\"\u003ecmpCallbacks\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003epayload\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003ecallId\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003enull\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\n \u003cspan class=\"pl-smi\"\u003ewindow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eaddEventListener\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e'message'\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003epostMessageHandler\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003efalse\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"pl-en\"\u003e__tcfapi\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e'ping'\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e2\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003epingReturn\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003esuccess\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-c\"\u003e// should get response from window.top's CMP\u003c/span\u003e\n\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eFrom where will the API retrieve the TC string?\u003c/h3\u003e\u003ca id=\"user-content-from-where-will-the-api-retrieve-the-tc-string\" class=\"anchor\" aria-label=\"Permalink: From where will the API retrieve the TC string?\" href=\"#from-where-will-the-api-retrieve-the-tc-string\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eSee the ‘How should the transparency \u0026amp; consent string be stored?’ section in the ‘Transparency \u0026amp; Consent String and Global Vendor List Format’ spec which describes where CMPs must store the transparency \u0026amp; consent string.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eMajor Changes from 2.0\u003c/h2\u003e\u003ca id=\"user-content-major-changes-from-20\" class=\"anchor\" aria-label=\"Permalink: Major Changes from 2.0\" href=\"#major-changes-from-20\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003eDeprecated command \u003ccode\u003egetTCData\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eMajor Changes from 1.1\u003c/h2\u003e\u003ca id=\"user-content-major-changes-from-11\" class=\"anchor\" aria-label=\"Permalink: Major Changes from 1.1\" href=\"#major-changes-from-11\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003eAdded \u003ccode\u003egetInAppTCData\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eAdded properties to \u003ccode\u003ePingReturn\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eAdded \u003ccode\u003eaddEventListener\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eAdded \u003ccode\u003eTCData\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eRemoved \u003ccode\u003eVendorConsents\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eRemoved \u003ccode\u003eVendorConsentData\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eChanged \u003ccode\u003egetVendorConsents\u003c/code\u003e to \u003ccode\u003egetTCData\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eRenamed \u003ccode\u003e__cmp\u003c/code\u003e to \u003ccode\u003e__tcfapi\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eRenamed all \u003ccode\u003e__cmp*\u003c/code\u003e to \u003ccode\u003e__tcfapi*\u003c/code\u003e (e.g. \u003ccode\u003e__cmpLocator\u003c/code\u003e is now \u003ccode\u003e__tcfapiLocator\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eRemoved \u003ccode\u003egetConsentData\u003c/code\u003e and \u003ccode\u003egetPublisherConsents\u003c/code\u003e commands (data moved to \u003ccode\u003egetTCData\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eAdded in-app API details throughout where applicable\u003c/li\u003e\n\u003cli\u003eRemoved SafeFrame proxy communication\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/article\u003e","renderedFileInfo":null,"shortPath":null,"symbolsEnabled":true,"tabSize":8,"topBannersInfo":{"overridingGlobalFundingFile":false,"globalPreferredFundingPath":null,"showInvalidCitationWarning":false,"citationHelpUrl":"https://docs.github.com/github/creating-cloning-and-archiving-repositories/creating-a-repository-on-github/about-citation-files","actionsOnboardingTip":null},"truncated":false,"viewable":true,"workflowRedirectUrl":null,"symbols":{"timed_out":false,"not_analyzed":false,"symbols":[{"name":"Consent Management Platform API","kind":"section_1","ident_start":120,"ident_end":151,"extent_start":118,"extent_end":63201,"fully_qualified_name":"Consent Management Platform API","ident_utf16":{"start":{"line_number":1,"utf16_col":2},"end":{"line_number":1,"utf16_col":33}},"extent_utf16":{"start":{"line_number":1,"utf16_col":0},"end":{"line_number":1148,"utf16_col":0}}},{"name":"Version History","kind":"section_2","ident_start":3510,"ident_end":3525,"extent_start":3507,"extent_end":4552,"fully_qualified_name":"Version History","ident_utf16":{"start":{"line_number":58,"utf16_col":3},"end":{"line_number":58,"utf16_col":18}},"extent_utf16":{"start":{"line_number":58,"utf16_col":0},"end":{"line_number":73,"utf16_col":0}}},{"name":"Introduction","kind":"section_2","ident_start":4555,"ident_end":4567,"extent_start":4552,"extent_end":11201,"fully_qualified_name":"Introduction","ident_utf16":{"start":{"line_number":73,"utf16_col":3},"end":{"line_number":73,"utf16_col":15}},"extent_utf16":{"start":{"line_number":73,"utf16_col":0},"end":{"line_number":113,"utf16_col":0}}},{"name":"About the Transparency \u0026 Consent Framework","kind":"section_3","ident_start":7209,"ident_end":7251,"extent_start":7205,"extent_end":7864,"fully_qualified_name":"About the Transparency \u0026 Consent Framework","ident_utf16":{"start":{"line_number":87,"utf16_col":4},"end":{"line_number":87,"utf16_col":46}},"extent_utf16":{"start":{"line_number":87,"utf16_col":0},"end":{"line_number":93,"utf16_col":0}}},{"name":"License","kind":"section_3","ident_start":7868,"ident_end":7875,"extent_start":7864,"extent_end":8325,"fully_qualified_name":"License","ident_utf16":{"start":{"line_number":93,"utf16_col":4},"end":{"line_number":93,"utf16_col":11}},"extent_utf16":{"start":{"line_number":93,"utf16_col":0},"end":{"line_number":99,"utf16_col":0}}},{"name":"Disclaimer","kind":"section_3","ident_start":8329,"ident_end":8339,"extent_start":8325,"extent_end":9531,"fully_qualified_name":"Disclaimer","ident_utf16":{"start":{"line_number":99,"utf16_col":4},"end":{"line_number":99,"utf16_col":14}},"extent_utf16":{"start":{"line_number":99,"utf16_col":0},"end":{"line_number":103,"utf16_col":0}}},{"name":"About IAB Tech Lab","kind":"section_3","ident_start":9535,"ident_end":9553,"extent_start":9531,"extent_end":10720,"fully_qualified_name":"About IAB Tech Lab","ident_utf16":{"start":{"line_number":103,"utf16_col":4},"end":{"line_number":103,"utf16_col":22}},"extent_utf16":{"start":{"line_number":103,"utf16_col":0},"end":{"line_number":107,"utf16_col":0}}},{"name":"About IAB Europe","kind":"section_3","ident_start":10724,"ident_end":10740,"extent_start":10720,"extent_end":11201,"fully_qualified_name":"About IAB Europe","ident_utf16":{"start":{"line_number":107,"utf16_col":4},"end":{"line_number":107,"utf16_col":20}},"extent_utf16":{"start":{"line_number":107,"utf16_col":0},"end":{"line_number":113,"utf16_col":0}}},{"name":"CMP API v2.0","kind":"section_2","ident_start":11204,"ident_end":11216,"extent_start":11201,"extent_end":49676,"fully_qualified_name":"CMP API v2.0","ident_utf16":{"start":{"line_number":113,"utf16_col":3},"end":{"line_number":113,"utf16_col":15}},"extent_utf16":{"start":{"line_number":113,"utf16_col":0},"end":{"line_number":884,"utf16_col":0}}},{"name":"What does the CMP API support?","kind":"section_3","ident_start":11222,"ident_end":11252,"extent_start":11218,"extent_end":12521,"fully_qualified_name":"What does the CMP API support?","ident_utf16":{"start":{"line_number":115,"utf16_col":4},"end":{"line_number":115,"utf16_col":34}},"extent_utf16":{"start":{"line_number":115,"utf16_col":0},"end":{"line_number":125,"utf16_col":0}}},{"name":"What is the Global Vendor List?","kind":"section_3","ident_start":12525,"ident_end":12556,"extent_start":12521,"extent_end":13184,"fully_qualified_name":"What is the Global Vendor List?","ident_utf16":{"start":{"line_number":125,"utf16_col":4},"end":{"line_number":125,"utf16_col":35}},"extent_utf16":{"start":{"line_number":125,"utf16_col":0},"end":{"line_number":131,"utf16_col":0}}},{"name":"How does the CMP provide the API?","kind":"section_3","ident_start":13188,"ident_end":13221,"extent_start":13184,"extent_end":13771,"fully_qualified_name":"How does the CMP provide the API?","ident_utf16":{"start":{"line_number":131,"utf16_col":4},"end":{"line_number":131,"utf16_col":37}},"extent_utf16":{"start":{"line_number":131,"utf16_col":0},"end":{"line_number":141,"utf16_col":0}}},{"name":"What required API commands must a CMP support?","kind":"section_3","ident_start":13775,"ident_end":13821,"extent_start":13771,"extent_end":19381,"fully_qualified_name":"What required API commands must a CMP support?","ident_utf16":{"start":{"line_number":141,"utf16_col":4},"end":{"line_number":141,"utf16_col":50}},"extent_utf16":{"start":{"line_number":141,"utf16_col":0},"end":{"line_number":235,"utf16_col":0}}},{"name":"`getTCData`","kind":"section_4","ident_start":14002,"ident_end":14013,"extent_start":13997,"extent_end":14156,"fully_qualified_name":"`getTCData`","ident_utf16":{"start":{"line_number":147,"utf16_col":5},"end":{"line_number":147,"utf16_col":16}},"extent_utf16":{"start":{"line_number":147,"utf16_col":0},"end":{"line_number":153,"utf16_col":0}}},{"name":"`ping`","kind":"section_4","ident_start":14161,"ident_end":14167,"extent_start":14156,"extent_end":15016,"fully_qualified_name":"`ping`","ident_utf16":{"start":{"line_number":153,"utf16_col":5},"end":{"line_number":153,"utf16_col":11}},"extent_utf16":{"start":{"line_number":153,"utf16_col":0},"end":{"line_number":177,"utf16_col":0}}},{"name":"`addEventListener`","kind":"section_4","ident_start":15021,"ident_end":15039,"extent_start":15016,"extent_end":18738,"fully_qualified_name":"`addEventListener`","ident_utf16":{"start":{"line_number":177,"utf16_col":5},"end":{"line_number":177,"utf16_col":23}},"extent_utf16":{"start":{"line_number":177,"utf16_col":0},"end":{"line_number":220,"utf16_col":0}}},{"name":"`removeEventListener`","kind":"section_4","ident_start":18743,"ident_end":18764,"extent_start":18738,"extent_end":19381,"fully_qualified_name":"`removeEventListener`","ident_utf16":{"start":{"line_number":220,"utf16_col":5},"end":{"line_number":220,"utf16_col":26}},"extent_utf16":{"start":{"line_number":220,"utf16_col":0},"end":{"line_number":235,"utf16_col":0}}},{"name":"What optional API commands might a CMP support?","kind":"section_3","ident_start":19385,"ident_end":19432,"extent_start":19381,"extent_end":22640,"fully_qualified_name":"What optional API commands might a CMP support?","ident_utf16":{"start":{"line_number":235,"utf16_col":4},"end":{"line_number":235,"utf16_col":51}},"extent_utf16":{"start":{"line_number":235,"utf16_col":0},"end":{"line_number":308,"utf16_col":0}}},{"name":"`getInAppTCData`","kind":"section_4","ident_start":19582,"ident_end":19598,"extent_start":19577,"extent_end":20727,"fully_qualified_name":"`getInAppTCData`","ident_utf16":{"start":{"line_number":241,"utf16_col":5},"end":{"line_number":241,"utf16_col":21}},"extent_utf16":{"start":{"line_number":241,"utf16_col":0},"end":{"line_number":273,"utf16_col":0}}},{"name":"`getVendorList`","kind":"section_4","ident_start":20732,"ident_end":20747,"extent_start":20727,"extent_end":22640,"fully_qualified_name":"`getVendorList`","ident_utf16":{"start":{"line_number":273,"utf16_col":5},"end":{"line_number":273,"utf16_col":20}},"extent_utf16":{"start":{"line_number":273,"utf16_col":0},"end":{"line_number":308,"utf16_col":0}}},{"name":"What objects are returned from the API?","kind":"section_3","ident_start":22644,"ident_end":22683,"extent_start":22640,"extent_end":33269,"fully_qualified_name":"What objects are returned from the API?","ident_utf16":{"start":{"line_number":308,"utf16_col":4},"end":{"line_number":308,"utf16_col":43}},"extent_utf16":{"start":{"line_number":308,"utf16_col":0},"end":{"line_number":692,"utf16_col":0}}},{"name":"`TCData`","kind":"section_4","ident_start":22698,"ident_end":22706,"extent_start":22693,"extent_end":27396,"fully_qualified_name":"`TCData`","ident_utf16":{"start":{"line_number":312,"utf16_col":5},"end":{"line_number":312,"utf16_col":13}},"extent_utf16":{"start":{"line_number":312,"utf16_col":0},"end":{"line_number":481,"utf16_col":0}}},{"name":"`PingReturn`","kind":"section_4","ident_start":27401,"ident_end":27413,"extent_start":27396,"extent_end":28799,"fully_qualified_name":"`PingReturn`","ident_utf16":{"start":{"line_number":481,"utf16_col":5},"end":{"line_number":481,"utf16_col":17}},"extent_utf16":{"start":{"line_number":481,"utf16_col":0},"end":{"line_number":544,"utf16_col":0}}},{"name":"Ping Status Codes","kind":"section_4","ident_start":28804,"ident_end":28821,"extent_start":28799,"extent_end":29701,"fully_qualified_name":"Ping Status Codes","ident_utf16":{"start":{"line_number":544,"utf16_col":5},"end":{"line_number":544,"utf16_col":22}},"extent_utf16":{"start":{"line_number":544,"utf16_col":0},"end":{"line_number":558,"utf16_col":0}}},{"name":"`InAppTCData`","kind":"section_4","ident_start":29706,"ident_end":29719,"extent_start":29701,"extent_end":33269,"fully_qualified_name":"`InAppTCData`","ident_utf16":{"start":{"line_number":558,"utf16_col":5},"end":{"line_number":558,"utf16_col":18}},"extent_utf16":{"start":{"line_number":558,"utf16_col":0},"end":{"line_number":692,"utf16_col":0}}},{"name":"In-App Details","kind":"section_3","ident_start":33273,"ident_end":33287,"extent_start":33269,"extent_end":44888,"fully_qualified_name":"In-App Details","ident_utf16":{"start":{"line_number":692,"utf16_col":4},"end":{"line_number":692,"utf16_col":18}},"extent_utf16":{"start":{"line_number":692,"utf16_col":0},"end":{"line_number":798,"utf16_col":0}}},{"name":"How is a CMP used in-app?","kind":"section_4","ident_start":33294,"ident_end":33319,"extent_start":33289,"extent_end":34700,"fully_qualified_name":"How is a CMP used in-app?","ident_utf16":{"start":{"line_number":694,"utf16_col":5},"end":{"line_number":694,"utf16_col":30}},"extent_utf16":{"start":{"line_number":694,"utf16_col":0},"end":{"line_number":704,"utf16_col":0}}},{"name":"What is the CMP in-app internal structure for the defined API?","kind":"section_4","ident_start":34705,"ident_end":34767,"extent_start":34700,"extent_end":40638,"fully_qualified_name":"What is the CMP in-app internal structure for the defined API?","ident_utf16":{"start":{"line_number":704,"utf16_col":5},"end":{"line_number":704,"utf16_col":67}},"extent_utf16":{"start":{"line_number":704,"utf16_col":0},"end":{"line_number":738,"utf16_col":0}}},{"name":"How do third-party SDKs (vendors) access the consent information in-app?","kind":"section_4","ident_start":40643,"ident_end":40715,"extent_start":40638,"extent_end":43510,"fully_qualified_name":"How do third-party SDKs (vendors) access the consent information in-app?","ident_utf16":{"start":{"line_number":738,"utf16_col":5},"end":{"line_number":738,"utf16_col":77}},"extent_utf16":{"start":{"line_number":738,"utf16_col":0},"end":{"line_number":781,"utf16_col":0}}},{"name":"How does ad mediation work in-app?","kind":"section_4","ident_start":43515,"ident_end":43549,"extent_start":43510,"extent_end":44888,"fully_qualified_name":"How does ad mediation work in-app?","ident_utf16":{"start":{"line_number":781,"utf16_col":5},"end":{"line_number":781,"utf16_col":39}},"extent_utf16":{"start":{"line_number":781,"utf16_col":0},"end":{"line_number":798,"utf16_col":0}}},{"name":"Mediation SDK","kind":"section_5","ident_start":43629,"ident_end":43642,"extent_start":43623,"extent_end":44526,"fully_qualified_name":"Mediation SDK","ident_utf16":{"start":{"line_number":785,"utf16_col":6},"end":{"line_number":785,"utf16_col":19}},"extent_utf16":{"start":{"line_number":785,"utf16_col":0},"end":{"line_number":793,"utf16_col":0}}},{"name":"Vendor","kind":"section_5","ident_start":44532,"ident_end":44538,"extent_start":44526,"extent_end":44888,"fully_qualified_name":"Vendor","ident_utf16":{"start":{"line_number":793,"utf16_col":6},"end":{"line_number":793,"utf16_col":12}},"extent_utf16":{"start":{"line_number":793,"utf16_col":0},"end":{"line_number":798,"utf16_col":0}}},{"name":"CTV Details","kind":"section_3","ident_start":44892,"ident_end":44903,"extent_start":44888,"extent_end":49676,"fully_qualified_name":"CTV Details","ident_utf16":{"start":{"line_number":798,"utf16_col":4},"end":{"line_number":798,"utf16_col":15}},"extent_utf16":{"start":{"line_number":798,"utf16_col":0},"end":{"line_number":884,"utf16_col":0}}},{"name":"How is a CMP used in the CTV context?","kind":"section_4","ident_start":44909,"ident_end":44946,"extent_start":44904,"extent_end":45048,"fully_qualified_name":"How is a CMP used in the CTV context?","ident_utf16":{"start":{"line_number":799,"utf16_col":5},"end":{"line_number":799,"utf16_col":42}},"extent_utf16":{"start":{"line_number":799,"utf16_col":0},"end":{"line_number":802,"utf16_col":0}}},{"name":"Web Runtime","kind":"section_4","ident_start":45053,"ident_end":45064,"extent_start":45048,"extent_end":45872,"fully_qualified_name":"Web Runtime","ident_utf16":{"start":{"line_number":802,"utf16_col":5},"end":{"line_number":802,"utf16_col":16}},"extent_utf16":{"start":{"line_number":802,"utf16_col":0},"end":{"line_number":807,"utf16_col":0}}},{"name":"Native","kind":"section_4","ident_start":45877,"ident_end":45883,"extent_start":45872,"extent_end":47825,"fully_qualified_name":"Native","ident_utf16":{"start":{"line_number":807,"utf16_col":5},"end":{"line_number":807,"utf16_col":11}},"extent_utf16":{"start":{"line_number":807,"utf16_col":0},"end":{"line_number":819,"utf16_col":0}}},{"name":"CTV Examples","kind":"section_4","ident_start":47830,"ident_end":47842,"extent_start":47825,"extent_end":49676,"fully_qualified_name":"CTV Examples","ident_utf16":{"start":{"line_number":819,"utf16_col":5},"end":{"line_number":819,"utf16_col":17}},"extent_utf16":{"start":{"line_number":819,"utf16_col":0},"end":{"line_number":884,"utf16_col":0}}},{"name":"Using the CMP API","kind":"section_2","ident_start":49679,"ident_end":49696,"extent_start":49676,"extent_end":62589,"fully_qualified_name":"Using the CMP API","ident_utf16":{"start":{"line_number":884,"utf16_col":3},"end":{"line_number":884,"utf16_col":20}},"extent_utf16":{"start":{"line_number":884,"utf16_col":0},"end":{"line_number":1131,"utf16_col":0}}},{"name":"How do ad tags work?","kind":"section_3","ident_start":49870,"ident_end":49890,"extent_start":49866,"extent_end":50698,"fully_qualified_name":"How do ad tags work?","ident_utf16":{"start":{"line_number":888,"utf16_col":4},"end":{"line_number":888,"utf16_col":24}},"extent_utf16":{"start":{"line_number":888,"utf16_col":0},"end":{"line_number":903,"utf16_col":0}}},{"name":"How does the \"version\" parameter work?","kind":"section_3","ident_start":50702,"ident_end":50740,"extent_start":50698,"extent_end":52135,"fully_qualified_name":"How does the \"version\" parameter work?","ident_utf16":{"start":{"line_number":903,"utf16_col":4},"end":{"line_number":903,"utf16_col":42}},"extent_utf16":{"start":{"line_number":903,"utf16_col":0},"end":{"line_number":915,"utf16_col":0}}},{"name":"What does the gdprApplies value mean?","kind":"section_3","ident_start":52139,"ident_end":52176,"extent_start":52135,"extent_end":53158,"fully_qualified_name":"What does the gdprApplies value mean?","ident_utf16":{"start":{"line_number":915,"utf16_col":4},"end":{"line_number":915,"utf16_col":41}},"extent_utf16":{"start":{"line_number":915,"utf16_col":0},"end":{"line_number":919,"utf16_col":0}}},{"name":"Details for vendors","kind":"section_3","ident_start":53162,"ident_end":53181,"extent_start":53158,"extent_end":57832,"fully_qualified_name":"Details for vendors","ident_utf16":{"start":{"line_number":919,"utf16_col":4},"end":{"line_number":919,"utf16_col":23}},"extent_utf16":{"start":{"line_number":919,"utf16_col":0},"end":{"line_number":962,"utf16_col":0}}},{"name":"How can scripts on a page determine if there is a CMP present?","kind":"section_4","ident_start":53188,"ident_end":53250,"extent_start":53183,"extent_end":54210,"fully_qualified_name":"How can scripts on a page determine if there is a CMP present?","ident_utf16":{"start":{"line_number":921,"utf16_col":5},"end":{"line_number":921,"utf16_col":67}},"extent_utf16":{"start":{"line_number":921,"utf16_col":0},"end":{"line_number":927,"utf16_col":0}}},{"name":"How can scripts determine if the CMP script is loaded yet?","kind":"section_4","ident_start":54215,"ident_end":54273,"extent_start":54210,"extent_end":54748,"fully_qualified_name":"How can scripts determine if the CMP script is loaded yet?","ident_utf16":{"start":{"line_number":927,"utf16_col":5},"end":{"line_number":927,"utf16_col":63}},"extent_utf16":{"start":{"line_number":927,"utf16_col":0},"end":{"line_number":931,"utf16_col":0}}},{"name":"How does the CMP \"stub\" API work?","kind":"section_4","ident_start":54753,"ident_end":54786,"extent_start":54748,"extent_end":55891,"fully_qualified_name":"How does the CMP \"stub\" API work?","ident_utf16":{"start":{"line_number":931,"utf16_col":5},"end":{"line_number":931,"utf16_col":38}},"extent_utf16":{"start":{"line_number":931,"utf16_col":0},"end":{"line_number":945,"utf16_col":0}}},{"name":"Requirements for the CMP \"stub\" API script","kind":"section_4","ident_start":55896,"ident_end":55938,"extent_start":55891,"extent_end":57375,"fully_qualified_name":"Requirements for the CMP \"stub\" API script","ident_utf16":{"start":{"line_number":945,"utf16_col":5},"end":{"line_number":945,"utf16_col":47}},"extent_utf16":{"start":{"line_number":945,"utf16_col":0},"end":{"line_number":955,"utf16_col":0}}},{"name":"Is there a sample CMP “stub” API script?","kind":"section_4","ident_start":57380,"ident_end":57424,"extent_start":57375,"extent_end":57832,"fully_qualified_name":"Is there a sample CMP “stub” API script?","ident_utf16":{"start":{"line_number":955,"utf16_col":5},"end":{"line_number":955,"utf16_col":45}},"extent_utf16":{"start":{"line_number":955,"utf16_col":0},"end":{"line_number":962,"utf16_col":0}}},{"name":"How can vendors that use iframes call the CMP API from an iframe?","kind":"section_3","ident_start":57836,"ident_end":57901,"extent_start":57832,"extent_end":62306,"fully_qualified_name":"How can vendors that use iframes call the CMP API from an iframe?","ident_utf16":{"start":{"line_number":962,"utf16_col":4},"end":{"line_number":962,"utf16_col":69}},"extent_utf16":{"start":{"line_number":962,"utf16_col":0},"end":{"line_number":1127,"utf16_col":0}}},{"name":"Using postmessage","kind":"section_4","ident_start":58021,"ident_end":58038,"extent_start":58016,"extent_end":59841,"fully_qualified_name":"Using postmessage","ident_utf16":{"start":{"line_number":966,"utf16_col":5},"end":{"line_number":966,"utf16_col":22}},"extent_utf16":{"start":{"line_number":966,"utf16_col":0},"end":{"line_number":998,"utf16_col":0}}},{"name":"Is there a sample iframe script call to the CMP API?","kind":"section_4","ident_start":59846,"ident_end":59898,"extent_start":59841,"extent_end":62306,"fully_qualified_name":"Is there a sample iframe script call to the CMP API?","ident_utf16":{"start":{"line_number":998,"utf16_col":5},"end":{"line_number":998,"utf16_col":57}},"extent_utf16":{"start":{"line_number":998,"utf16_col":0},"end":{"line_number":1127,"utf16_col":0}}},{"name":"From where will the API retrieve the TC string?","kind":"section_3","ident_start":62310,"ident_end":62357,"extent_start":62306,"extent_end":62589,"fully_qualified_name":"From where will the API retrieve the TC string?","ident_utf16":{"start":{"line_number":1127,"utf16_col":4},"end":{"line_number":1127,"utf16_col":51}},"extent_utf16":{"start":{"line_number":1127,"utf16_col":0},"end":{"line_number":1131,"utf16_col":0}}},{"name":"Major Changes from 2.0","kind":"section_2","ident_start":62592,"ident_end":62614,"extent_start":62589,"extent_end":62650,"fully_qualified_name":"Major Changes from 2.0","ident_utf16":{"start":{"line_number":1131,"utf16_col":3},"end":{"line_number":1131,"utf16_col":25}},"extent_utf16":{"start":{"line_number":1131,"utf16_col":0},"end":{"line_number":1134,"utf16_col":0}}},{"name":"Major Changes from 1.1","kind":"section_2","ident_start":62653,"ident_end":62675,"extent_start":62650,"extent_end":63201,"fully_qualified_name":"Major Changes from 1.1","ident_utf16":{"start":{"line_number":1134,"utf16_col":3},"end":{"line_number":1134,"utf16_col":25}},"extent_utf16":{"start":{"line_number":1134,"utf16_col":0},"end":{"line_number":1148,"utf16_col":0}}}]}},"copilotInfo":null,"copilotAccessAllowed":false,"csrf_tokens":{"/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/branches":{"post":"xBzsp4IlaKLygmrZFtmVZNmuYV1XGRKxO3qXv9bnOQtC4OvYpu4MJ6_01S1p5-cqYgcV7CtKJUWvbDFE_g_HkQ"},"/repos/preferences":{"post":"rdCSY4347GqE1_lmlDvxeea5O8tM2X91cz9sEz_tVjN46njdLmF1cVlE56N2YSbOoD_QmQNtOuJY6Hs3x7CiTw"}}},"title":"GDPR-Transparency-and-Consent-Framework/TCFv2/IAB Tech Lab - CMP API v2.md at master · InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework","appPayload":{"helpUrl":"https://docs.github.com","findFileWorkerPath":"/assets-cdn/worker/find-file-worker-1583894afd38.js","findInFileWorkerPath":"/assets-cdn/worker/find-in-file-worker-67668e8c2caa.js","githubDevUrl":null,"enabled_features":{"code_nav_ui_events":false,"overview_shared_code_dropdown_button":false,"react_blob_overlay":false,"copilot_conversational_ux_embedding_update":false,"copilot_smell_icebreaker_ux":true,"copilot_workspace":false,"blob_edit_unsaved_changes_storage":true,"accessible_code_button":true}}}</script> <div data-target="react-app.reactRoot"><style data-styled="true" data-styled-version="5.3.11">.hOfjFo{padding:0;}/*!sc*/ .oDGAe{max-width:100%;margin-left:auto;margin-right:auto;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;}/*!sc*/ .kowOcT{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1 1 100%;-ms-flex:1 1 100%;flex:1 1 100%;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:100%;}/*!sc*/ .gISSDQ{width:100%;}/*!sc*/ @media screen and (min-width:544px){.gISSDQ{width:100%;}}/*!sc*/ @media screen and (min-width:768px){.gISSDQ{width:auto;}}/*!sc*/ .fLEPlD{display:none;-webkit-order:1;-ms-flex-order:1;order:1;width:100%;margin-left:0;margin-right:0;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;margin-bottom:0;min-width:0;}/*!sc*/ @media screen and (min-width:544px){.fLEPlD{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}}/*!sc*/ @media screen and (min-width:768px){.fLEPlD{width:auto;margin-top:0 !important;margin-bottom:0 !important;position:-webkit-sticky;position:sticky;top:0px;max-height:100vh !important;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;margin-right:0;height:100vh;}}/*!sc*/ @media print,screen and (max-width:1011px) and (min-width:768px){.fLEPlD{display:none;}}/*!sc*/ .hPvFuC{margin-left:0;margin-right:0;display:none;margin-top:0;}/*!sc*/ @media screen and (min-width:768px){.hPvFuC{margin-left:0 !important;margin-right:0 !important;}}/*!sc*/ .fFSoPl{--pane-min-width:256px;--pane-max-width-diff:511px;--pane-max-width:calc(100vw - var(--pane-max-width-diff));width:100%;padding:0;}/*!sc*/ @media screen and (min-width:544px){}/*!sc*/ @media screen and (min-width:768px){.fFSoPl{width:clamp(var(--pane-min-width),var(--pane-width),var(--pane-max-width));overflow:auto;}}/*!sc*/ @media screen and (min-width:1280px){.fFSoPl{--pane-max-width-diff:959px;}}/*!sc*/ .bTBnTW{height:100%;position:relative;display:none;margin-left:0;}/*!sc*/ .bHLmSv{position:absolute;inset:0 -2px;cursor:col-resize;background-color:transparent;-webkit-transition-delay:0.1s;transition-delay:0.1s;}/*!sc*/ .bHLmSv:hover{background-color:var(--bgColor-neutral-muted,var(--color-neutral-muted,rgba(175,184,193,0.2)));}/*!sc*/ .iKqMNA{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-order:2;-ms-flex-order:2;order:2;-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:1;-ms-flex-negative:1;flex-shrink:1;min-width:1px;margin-right:auto;}/*!sc*/ @media print{.iKqMNA{display:-webkit-box !important;display:-webkit-flex !important;display:-ms-flexbox !important;display:flex !important;}}/*!sc*/ .FxAyp{width:100%;max-width:100%;margin-left:auto;margin-right:auto;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0;}/*!sc*/ .leYMvG{margin-left:auto;margin-right:auto;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding-bottom:40px;max-width:100%;margin-top:0;}/*!sc*/ .KMPzq{display:inherit;}/*!sc*/ .hfKjHv{width:100%;}/*!sc*/ .gZWyZE{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:8px;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%;}/*!sc*/ .dwYKDk{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:start;-webkit-box-align:start;-ms-flex-align:start;align-items:start;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;gap:8px;}/*!sc*/ .ibcGmb{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:start;-webkit-box-align:start;-ms-flex-align:start;align-items:start;min-width:0;}/*!sc*/ .hKaEJF{display:block;margin-right:8px;}/*!sc*/ @media screen and (min-width:1360px){.hKaEJF{display:block;}}/*!sc*/ .XosP{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;font-size:14px;}/*!sc*/ .gUkoLg{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;}/*!sc*/ .hzSPyu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;pointer-events:none;}/*!sc*/ .bZBlpz{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;}/*!sc*/ .lhTYNA{margin-right:4px;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .dbrgmi{font-size:14px;min-width:0;max-width:125px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}/*!sc*/ .dHJiml{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-left:8px;padding-right:8px;min-width:0;}/*!sc*/ .cEytCf{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;font-size:16px;min-width:0;-webkit-flex-shrink:1;-ms-flex-negative:1;flex-shrink:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:100%;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/ .fzFXnm{max-width:100%;}/*!sc*/ .iMnkmv{max-width:100%;list-style:none;display:inline-block;}/*!sc*/ .ghzDag{display:inline-block;max-width:100%;}/*!sc*/ .kHuKdh{font-weight:600;}/*!sc*/ .kgiVEz{font-weight:400;}/*!sc*/ .jGhzSQ{font-weight:600;display:inline-block;max-width:100%;font-size:16px;}/*!sc*/ .faNtbn{min-height:32px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:start;-webkit-box-align:start;-ms-flex-align:start;align-items:start;}/*!sc*/ .fmQaBv{margin-left:4px;margin-right:4px;}/*!sc*/ .dJxjrT{margin-left:16px;margin-right:16px;}/*!sc*/ .eFxKDQ{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}/*!sc*/ .dzCJzi{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;min-width:273px;padding:8px;}/*!sc*/ @media screen and (min-width:544px){.dzCJzi{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;}}/*!sc*/ .ldRxiI{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;}/*!sc*/ .fVkfyA{width:100%;height:-webkit-fit-content;height:-moz-fit-content;height:fit-content;min-width:0;margin-right:0;}/*!sc*/ .gNAmSV{height:40px;padding-left:4px;padding-bottom:16px;}/*!sc*/ .jNEwzY{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/ .bsDwxw{font-size:12px;-webkit-flex:auto;-ms-flex:auto;flex:auto;padding-right:16px;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));min-width:0;}/*!sc*/ .jdLMhu{top:0px;z-index:4;background:var(--bgColor-default,var(--color-canvas-default));position:-webkit-sticky;position:sticky;}/*!sc*/ .tOISc{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%;position:absolute;}/*!sc*/ .hqwSEx{display:none;min-width:0;padding-top:8px;padding-bottom:8px;}/*!sc*/ .bDVoEr{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;overflow:hidden;margin-left:8px;margin-right:8px;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;width:100%;}/*!sc*/ .kYLlPM{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/ .gYjEmn{margin-left:4px;margin-right:8px;}/*!sc*/ .kGqOLL{text-overflow:ellipsis;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ .fHind{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;font-size:14px;min-width:0;-webkit-flex-shrink:1;-ms-flex-negative:1;flex-shrink:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:100%;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/ .dnZoUW{font-weight:600;display:inline-block;max-width:100%;font-size:14px;}/*!sc*/ .kTvpNk{padding-left:8px;padding-top:8px;padding-bottom:8px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;background-color:var(--bgColor-muted,var(--color-canvas-subtle,#f6f8fa));border:1px solid var(--borderColor-default,var(--color-border-default));border-radius:6px 6px 0px 0px;}/*!sc*/ .iNMjfP{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;min-width:0;}/*!sc*/ .fefCSX{display:block;position:relative;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-top:-1px;margin-bottom:-1px;--separator-color:transparent;}/*!sc*/ .fefCSX:not(:last-child){margin-right:1px;}/*!sc*/ .fefCSX:not(:last-child):after{background-color:var(--separator-color);content:"";position:absolute;right:-2px;top:8px;bottom:8px;width:1px;}/*!sc*/ .fefCSX:focus-within:has(:focus-visible){--separator-color:transparent;}/*!sc*/ .fefCSX:first-child{margin-left:-1px;}/*!sc*/ .fefCSX:last-child{margin-right:-1px;}/*!sc*/ .idgUkN{display:block;position:relative;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-top:-1px;margin-bottom:-1px;--separator-color:var(--borderColor-default,var(--color-border-default,#d0d7de));}/*!sc*/ .idgUkN:not(:last-child){margin-right:1px;}/*!sc*/ .idgUkN:not(:last-child):after{background-color:var(--separator-color);content:"";position:absolute;right:-2px;top:8px;bottom:8px;width:1px;}/*!sc*/ .idgUkN:focus-within:has(:focus-visible){--separator-color:transparent;}/*!sc*/ .idgUkN:first-child{margin-left:-1px;}/*!sc*/ .idgUkN:last-child{margin-right:-1px;}/*!sc*/ .kcLCKF{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;margin-right:8px;}/*!sc*/ .kVWtTz{gap:8px;}/*!sc*/ .hGyMdv{border:1px solid;border-top:none;border-color:var(--borderColor-default,var(--color-border-default,#d0d7de));border-radius:0px 0px 6px 6px;min-width:273px;}/*!sc*/ .fGqKFv{background-color:var(--bgColor-default,var(--color-canvas-default));border:0px;border-width:0;border-radius:0px 0px 6px 6px;padding:0;min-width:0;margin-top:46px;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;}/*!sc*/ .eoaCFS{border-bottom-left-radius:6px;border-bottom-right-radius:6px;padding:32px;min-width:0;}/*!sc*/ .cCoXib{position:fixed;top:0;right:0;height:100%;width:15px;-webkit-transition:-webkit-transform 0.3s;-webkit-transition:transform 0.3s;transition:transform 0.3s;z-index:1;}/*!sc*/ .cCoXib:hover{-webkit-transform:scaleX(1.5);-ms-transform:scaleX(1.5);transform:scaleX(1.5);}/*!sc*/ data-styled.g1[id="Box-sc-g0xbh4-0"]{content:"hOfjFo,oDGAe,kowOcT,gISSDQ,fLEPlD,hPvFuC,fFSoPl,bTBnTW,bHLmSv,iKqMNA,FxAyp,leYMvG,KMPzq,hfKjHv,gZWyZE,dwYKDk,ibcGmb,hKaEJF,XosP,gUkoLg,hzSPyu,bZBlpz,lhTYNA,dbrgmi,dHJiml,cEytCf,fzFXnm,iMnkmv,ghzDag,kHuKdh,kgiVEz,jGhzSQ,faNtbn,fmQaBv,dJxjrT,eFxKDQ,dzCJzi,ldRxiI,fVkfyA,gNAmSV,jNEwzY,bsDwxw,jdLMhu,tOISc,hqwSEx,bDVoEr,kYLlPM,gYjEmn,kGqOLL,fHind,dnZoUW,kTvpNk,iNMjfP,fefCSX,idgUkN,kcLCKF,kVWtTz,hGyMdv,fGqKFv,eoaCFS,cCoXib,"}/*!sc*/ .eMMFM{min-width:0;}/*!sc*/ .eMMFM:where([data-size='small']){font-size:var(--text-body-size-small,0.75rem);line-height:var(--text-body-lineHeight-small,1.6666);}/*!sc*/ .eMMFM:where([data-size='medium']){font-size:var(--text-body-size-medium,0.875rem);line-height:var(--text-body-lineHeight-medium,1.4285);}/*!sc*/ .eMMFM:where([data-size='large']){font-size:var(--text-body-size-large,1rem);line-height:var(--text-body-lineHeight-large,1.5);}/*!sc*/ .eMMFM:where([data-weight='light']){font-weight:var(--base-text-weight-light,300);}/*!sc*/ .eMMFM:where([data-weight='normal']){font-weight:var(--base-text-weight-normal,400);}/*!sc*/ .eMMFM:where([data-weight='medium']){font-weight:var(--base-text-weight-medium,500);}/*!sc*/ .eMMFM:where([data-weight='semibold']){font-weight:var(--base-text-weight-semibold,600);}/*!sc*/ .HlHVj{padding-left:4px;padding-right:4px;font-weight:400;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));font-size:16px;}/*!sc*/ .HlHVj:where([data-size='small']){font-size:var(--text-body-size-small,0.75rem);line-height:var(--text-body-lineHeight-small,1.6666);}/*!sc*/ .HlHVj:where([data-size='medium']){font-size:var(--text-body-size-medium,0.875rem);line-height:var(--text-body-lineHeight-medium,1.4285);}/*!sc*/ .HlHVj:where([data-size='large']){font-size:var(--text-body-size-large,1rem);line-height:var(--text-body-lineHeight-large,1.5);}/*!sc*/ .HlHVj:where([data-weight='light']){font-weight:var(--base-text-weight-light,300);}/*!sc*/ .HlHVj:where([data-weight='normal']){font-weight:var(--base-text-weight-normal,400);}/*!sc*/ .HlHVj:where([data-weight='medium']){font-weight:var(--base-text-weight-medium,500);}/*!sc*/ .HlHVj:where([data-weight='semibold']){font-weight:var(--base-text-weight-semibold,600);}/*!sc*/ .lauzFl{padding-left:4px;padding-right:4px;font-weight:400;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));font-size:14px;}/*!sc*/ .lauzFl:where([data-size='small']){font-size:var(--text-body-size-small,0.75rem);line-height:var(--text-body-lineHeight-small,1.6666);}/*!sc*/ .lauzFl:where([data-size='medium']){font-size:var(--text-body-size-medium,0.875rem);line-height:var(--text-body-lineHeight-medium,1.4285);}/*!sc*/ .lauzFl:where([data-size='large']){font-size:var(--text-body-size-large,1rem);line-height:var(--text-body-lineHeight-large,1.5);}/*!sc*/ .lauzFl:where([data-weight='light']){font-weight:var(--base-text-weight-light,300);}/*!sc*/ .lauzFl:where([data-weight='normal']){font-weight:var(--base-text-weight-normal,400);}/*!sc*/ .lauzFl:where([data-weight='medium']){font-weight:var(--base-text-weight-medium,500);}/*!sc*/ .lauzFl:where([data-weight='semibold']){font-weight:var(--base-text-weight-semibold,600);}/*!sc*/ data-styled.g3[id="Text__StyledText-sc-17v1xeu-0"]{content:"eMMFM,HlHVj,lauzFl,"}/*!sc*/ .gwqFqs{font-size:14px;line-height:20px;color:var(--fgColor-default,var(--color-fg-default,#1F2328));vertical-align:middle;background-color:var(--bgColor-default,var(--color-canvas-default,#ffffff));border:1px solid var(--control-borderColor-rest,var(--borderColor-default,var(--color-border-default,#d0d7de)));border-radius:6px;outline:none;box-shadow:var(--shadow-inset,var(--color-primer-shadow-inset,inset 0 1px 0 rgba(208,215,222,0.2)));display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:stretch;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;min-height:32px;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-width:160px;}/*!sc*/ .gwqFqs input,.gwqFqs textarea{cursor:text;}/*!sc*/ .gwqFqs select{cursor:pointer;}/*!sc*/ .gwqFqs input::-webkit-input-placeholder,.gwqFqs textarea::-webkit-input-placeholder,.gwqFqs select::-webkit-input-placeholder{color:var(---control-fgColor-placeholder,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .gwqFqs input::-moz-placeholder,.gwqFqs textarea::-moz-placeholder,.gwqFqs select::-moz-placeholder{color:var(---control-fgColor-placeholder,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .gwqFqs input:-ms-input-placeholder,.gwqFqs textarea:-ms-input-placeholder,.gwqFqs select:-ms-input-placeholder{color:var(---control-fgColor-placeholder,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .gwqFqs input::placeholder,.gwqFqs textarea::placeholder,.gwqFqs select::placeholder{color:var(---control-fgColor-placeholder,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .gwqFqs:focus-within{border-color:var(--fgColor-accent,var(--color-accent-fg,#0969da));outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-1px;}/*!sc*/ .gwqFqs > textarea{padding:12px;}/*!sc*/ @media (min-width:768px){.gwqFqs{font-size:14px;}}/*!sc*/ data-styled.g9[id="TextInputWrapper__TextInputBaseWrapper-sc-1mqhpbi-0"]{content:"gwqFqs,"}/*!sc*/ .decvaq{background-repeat:no-repeat;background-position:right 8px center;padding-left:12px;padding-right:12px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-width:160px;}/*!sc*/ .decvaq > :not(:last-child){margin-right:8px;}/*!sc*/ .decvaq .TextInput-icon,.decvaq .TextInput-action{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;}/*!sc*/ .decvaq > input,.decvaq > select{padding-left:0;padding-right:0;}/*!sc*/ data-styled.g10[id="TextInputWrapper-sc-1mqhpbi-1"]{content:"decvaq,"}/*!sc*/ .kBQCgV{border-radius:6px;border:1px solid;border-color:transparent;font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));background-color:transparent;box-shadow:none;}/*!sc*/ .kBQCgV:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .kBQCgV:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .kBQCgV:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .kBQCgV[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .kBQCgV[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .kBQCgV:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .kBQCgV:active{-webkit-transition:none;transition:none;}/*!sc*/ .kBQCgV[data-inactive]{cursor:auto;}/*!sc*/ .kBQCgV:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));background-color:var(--button-invisible-bgColor-disabled,transparent);}/*!sc*/ .kBQCgV:disabled [data-component=ButtonCounter],.kBQCgV:disabled [data-component="leadingVisual"],.kBQCgV:disabled [data-component="trailingAction"]{color:inherit;}/*!sc*/ @media (forced-colors:active){.kBQCgV:focus{outline:solid 1px transparent;}}/*!sc*/ .kBQCgV [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .kBQCgV[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .kBQCgV[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .kBQCgV[data-size="small"] [data-component="text"]{line-height:1.6666667;}/*!sc*/ .kBQCgV[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .kBQCgV[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .kBQCgV[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .kBQCgV[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .kBQCgV[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .kBQCgV[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .kBQCgV[data-block="block"]{width:100%;}/*!sc*/ .kBQCgV[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .kBQCgV[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .kBQCgV[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .kBQCgV[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .kBQCgV[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .kBQCgV[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .kBQCgV[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .kBQCgV[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .kBQCgV[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .kBQCgV [data-component="leadingVisual"]{grid-area:leadingVisual;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .kBQCgV [data-component="text"]{grid-area:text;line-height:1.4285714;white-space:nowrap;}/*!sc*/ .kBQCgV [data-component="trailingVisual"]{grid-area:trailingVisual;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .kBQCgV [data-component="trailingAction"]{margin-right:-4px;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .kBQCgV [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .kBQCgV [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .kBQCgV [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .kBQCgV [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .kBQCgV:hover:not([disabled]){background-color:var(--control-transparent-bgColor-hover,var(--color-action-list-item-default-hover-bg,rgba(208,215,222,0.32)));}/*!sc*/ .kBQCgV:active:not([disabled]){background-color:var(--control-transparent-bgColor-active,var(--color-action-list-item-default-active-bg,rgba(208,215,222,0.48)));}/*!sc*/ .kBQCgV[aria-expanded=true]{background-color:var(--control-transparent-bgColor-selected,var(--color-action-list-item-default-selected-bg,rgba(208,215,222,0.24)));}/*!sc*/ .kBQCgV[data-component="IconButton"][data-no-visuals]{color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .kBQCgV[data-no-visuals]{color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));}/*!sc*/ .kBQCgV:has([data-component="ButtonCounter"]){color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));}/*!sc*/ .kBQCgV:disabled[data-no-visuals]{color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));}/*!sc*/ .kBQCgV:disabled[data-no-visuals] [data-component=ButtonCounter]{color:inherit;}/*!sc*/ .kBQCgV[data-size="medium"]{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));padding-left:8px;padding-right:8px;display:none;}/*!sc*/ @media screen and (max-width:768px){.kBQCgV[data-size="medium"]{display:block;}}/*!sc*/ .dPmZyJ{border-radius:6px;border:1px solid;border-color:transparent;font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));background-color:transparent;box-shadow:none;}/*!sc*/ .dPmZyJ:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .dPmZyJ:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .dPmZyJ:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .dPmZyJ[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .dPmZyJ[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .dPmZyJ:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .dPmZyJ:active{-webkit-transition:none;transition:none;}/*!sc*/ .dPmZyJ[data-inactive]{cursor:auto;}/*!sc*/ .dPmZyJ:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));background-color:var(--button-invisible-bgColor-disabled,transparent);}/*!sc*/ .dPmZyJ:disabled [data-component=ButtonCounter],.dPmZyJ:disabled [data-component="leadingVisual"],.dPmZyJ:disabled [data-component="trailingAction"]{color:inherit;}/*!sc*/ @media (forced-colors:active){.dPmZyJ:focus{outline:solid 1px transparent;}}/*!sc*/ .dPmZyJ [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .dPmZyJ[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .dPmZyJ[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .dPmZyJ[data-size="small"] [data-component="text"]{line-height:1.6666667;}/*!sc*/ .dPmZyJ[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .dPmZyJ[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .dPmZyJ[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .dPmZyJ[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .dPmZyJ[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .dPmZyJ[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .dPmZyJ[data-block="block"]{width:100%;}/*!sc*/ .dPmZyJ[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .dPmZyJ[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .dPmZyJ[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .dPmZyJ[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .dPmZyJ[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .dPmZyJ[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .dPmZyJ[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .dPmZyJ[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .dPmZyJ[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .dPmZyJ [data-component="leadingVisual"]{grid-area:leadingVisual;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .dPmZyJ [data-component="text"]{grid-area:text;line-height:1.4285714;white-space:nowrap;}/*!sc*/ .dPmZyJ [data-component="trailingVisual"]{grid-area:trailingVisual;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .dPmZyJ [data-component="trailingAction"]{margin-right:-4px;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .dPmZyJ [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .dPmZyJ [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .dPmZyJ [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .dPmZyJ [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .dPmZyJ:hover:not([disabled]){background-color:var(--control-transparent-bgColor-hover,var(--color-action-list-item-default-hover-bg,rgba(208,215,222,0.32)));}/*!sc*/ .dPmZyJ:active:not([disabled]){background-color:var(--control-transparent-bgColor-active,var(--color-action-list-item-default-active-bg,rgba(208,215,222,0.48)));}/*!sc*/ .dPmZyJ[aria-expanded=true]{background-color:var(--control-transparent-bgColor-selected,var(--color-action-list-item-default-selected-bg,rgba(208,215,222,0.24)));}/*!sc*/ .dPmZyJ[data-component="IconButton"][data-no-visuals]{color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .dPmZyJ[data-no-visuals]{color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));}/*!sc*/ .dPmZyJ:has([data-component="ButtonCounter"]){color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));}/*!sc*/ .dPmZyJ:disabled[data-no-visuals]{color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));}/*!sc*/ .dPmZyJ:disabled[data-no-visuals] [data-component=ButtonCounter]{color:inherit;}/*!sc*/ .iQGjqs{border-radius:6px;border:1px solid;border-color:var(--button-default-borderColor-rest,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-default-fgColor-rest,var(--color-btn-text,#24292f));background-color:var(--button-default-bgColor-rest,var(--color-btn-bg,#f6f8fa));box-shadow:var(--button-default-shadow-resting,var(--color-btn-shadow,0 1px 0 rgba(31,35,40,0.04))),var(--button-default-shadow-inset,var(--color-btn-inset-shadow,inset 0 1px 0 rgba(255,255,255,0.25)));}/*!sc*/ .iQGjqs:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .iQGjqs:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .iQGjqs:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .iQGjqs[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .iQGjqs[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .iQGjqs:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .iQGjqs:active{-webkit-transition:none;transition:none;}/*!sc*/ .iQGjqs[data-inactive]{cursor:auto;}/*!sc*/ .iQGjqs:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));border-color:var(--button-default-borderColor-disabled,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));background-color:var(--button-default-bgColor-disabled,var(--control-bgColor-disabled,var(--color-input-disabled-bg,rgba(175,184,193,0.2))));}/*!sc*/ .iQGjqs:disabled [data-component=ButtonCounter]{color:inherit;}/*!sc*/ @media (forced-colors:active){.iQGjqs:focus{outline:solid 1px transparent;}}/*!sc*/ .iQGjqs [data-component=ButtonCounter]{font-size:12px;background-color:var(--buttonCounter-default-bgColor-rest,var(--color-btn-counter-bg,rgba(31,35,40,0.08)));}/*!sc*/ .iQGjqs[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .iQGjqs[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .iQGjqs[data-size="small"] [data-component="text"]{line-height:1.6666667;}/*!sc*/ .iQGjqs[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .iQGjqs[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .iQGjqs[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .iQGjqs[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .iQGjqs[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .iQGjqs[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .iQGjqs[data-block="block"]{width:100%;}/*!sc*/ .iQGjqs[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .iQGjqs[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .iQGjqs[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .iQGjqs[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .iQGjqs[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .iQGjqs[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .iQGjqs[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .iQGjqs[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .iQGjqs[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .iQGjqs [data-component="leadingVisual"]{grid-area:leadingVisual;}/*!sc*/ .iQGjqs [data-component="text"]{grid-area:text;line-height:1.4285714;white-space:nowrap;}/*!sc*/ .iQGjqs [data-component="trailingVisual"]{grid-area:trailingVisual;}/*!sc*/ .iQGjqs [data-component="trailingAction"]{margin-right:-4px;}/*!sc*/ .iQGjqs [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .iQGjqs [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .iQGjqs [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .iQGjqs [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .iQGjqs:hover:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-hover,var(--color-btn-hover-bg,#f3f4f6));border-color:var(--button-default-borderColor-hover,var(--button-default-borderColor-hover,var(--color-btn-hover-border,rgba(31,35,40,0.15))));}/*!sc*/ .iQGjqs:active:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .iQGjqs[aria-expanded=true]{background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .iQGjqs [data-component="leadingVisual"],.iQGjqs [data-component="trailingVisual"],.iQGjqs [data-component="trailingAction"]{color:var(--button-color,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .iQGjqs[data-component="IconButton"][data-no-visuals]:not(:disabled){color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .iQGjqs[data-size="medium"]{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ .iQGjqs[data-size="medium"] svg{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .iQGjqs[data-size="medium"] > span{width:inherit;}/*!sc*/ .iLfocZ{border-radius:6px;border:1px solid;border-color:var(--button-default-borderColor-rest,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-default-fgColor-rest,var(--color-btn-text,#24292f));background-color:var(--button-default-bgColor-rest,var(--color-btn-bg,#f6f8fa));box-shadow:var(--button-default-shadow-resting,var(--color-btn-shadow,0 1px 0 rgba(31,35,40,0.04))),var(--button-default-shadow-inset,var(--color-btn-inset-shadow,inset 0 1px 0 rgba(255,255,255,0.25)));}/*!sc*/ .iLfocZ:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .iLfocZ:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .iLfocZ:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .iLfocZ[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .iLfocZ[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .iLfocZ:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .iLfocZ:active{-webkit-transition:none;transition:none;}/*!sc*/ .iLfocZ[data-inactive]{cursor:auto;}/*!sc*/ .iLfocZ:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));border-color:var(--button-default-borderColor-disabled,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));background-color:var(--button-default-bgColor-disabled,var(--control-bgColor-disabled,var(--color-input-disabled-bg,rgba(175,184,193,0.2))));}/*!sc*/ .iLfocZ:disabled [data-component=ButtonCounter]{color:inherit;}/*!sc*/ @media (forced-colors:active){.iLfocZ:focus{outline:solid 1px transparent;}}/*!sc*/ .iLfocZ [data-component=ButtonCounter]{font-size:12px;background-color:var(--buttonCounter-default-bgColor-rest,var(--color-btn-counter-bg,rgba(31,35,40,0.08)));}/*!sc*/ .iLfocZ[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .iLfocZ[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .iLfocZ[data-size="small"] [data-component="text"]{line-height:1.6666667;}/*!sc*/ .iLfocZ[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .iLfocZ[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .iLfocZ[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .iLfocZ[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .iLfocZ[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .iLfocZ[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .iLfocZ[data-block="block"]{width:100%;}/*!sc*/ .iLfocZ[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .iLfocZ[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .iLfocZ[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .iLfocZ[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .iLfocZ[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .iLfocZ[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .iLfocZ[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .iLfocZ[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .iLfocZ[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .iLfocZ [data-component="leadingVisual"]{grid-area:leadingVisual;}/*!sc*/ .iLfocZ [data-component="text"]{grid-area:text;line-height:1.4285714;white-space:nowrap;}/*!sc*/ .iLfocZ [data-component="trailingVisual"]{grid-area:trailingVisual;}/*!sc*/ .iLfocZ [data-component="trailingAction"]{margin-right:-4px;}/*!sc*/ .iLfocZ [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .iLfocZ [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .iLfocZ [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .iLfocZ [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .iLfocZ:hover:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-hover,var(--color-btn-hover-bg,#f3f4f6));border-color:var(--button-default-borderColor-hover,var(--button-default-borderColor-hover,var(--color-btn-hover-border,rgba(31,35,40,0.15))));}/*!sc*/ .iLfocZ:active:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .iLfocZ[aria-expanded=true]{background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .iLfocZ [data-component="leadingVisual"],.iLfocZ [data-component="trailingVisual"],.iLfocZ [data-component="trailingAction"]{color:var(--button-color,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .iLfocZ[data-component="IconButton"][data-no-visuals]:not(:disabled){color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .iLfocZ[data-size="medium"][data-no-visuals]{border-top-left-radius:0;border-bottom-left-radius:0;display:none;}/*!sc*/ .JVsBq{border-radius:6px;border:1px solid;border-color:var(--button-default-borderColor-rest,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-default-fgColor-rest,var(--color-btn-text,#24292f));background-color:var(--button-default-bgColor-rest,var(--color-btn-bg,#f6f8fa));box-shadow:var(--button-default-shadow-resting,var(--color-btn-shadow,0 1px 0 rgba(31,35,40,0.04))),var(--button-default-shadow-inset,var(--color-btn-inset-shadow,inset 0 1px 0 rgba(255,255,255,0.25)));}/*!sc*/ .JVsBq:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .JVsBq:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .JVsBq:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .JVsBq[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .JVsBq[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .JVsBq:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .JVsBq:active{-webkit-transition:none;transition:none;}/*!sc*/ .JVsBq[data-inactive]{cursor:auto;}/*!sc*/ .JVsBq:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));border-color:var(--button-default-borderColor-disabled,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));background-color:var(--button-default-bgColor-disabled,var(--control-bgColor-disabled,var(--color-input-disabled-bg,rgba(175,184,193,0.2))));}/*!sc*/ .JVsBq:disabled [data-component=ButtonCounter]{color:inherit;}/*!sc*/ @media (forced-colors:active){.JVsBq:focus{outline:solid 1px transparent;}}/*!sc*/ .JVsBq [data-component=ButtonCounter]{font-size:12px;background-color:var(--buttonCounter-default-bgColor-rest,var(--color-btn-counter-bg,rgba(31,35,40,0.08)));}/*!sc*/ .JVsBq[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .JVsBq[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .JVsBq[data-size="small"] [data-component="text"]{line-height:1.6666667;}/*!sc*/ .JVsBq[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .JVsBq[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .JVsBq[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .JVsBq[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .JVsBq[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .JVsBq[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .JVsBq[data-block="block"]{width:100%;}/*!sc*/ .JVsBq[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .JVsBq[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .JVsBq[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .JVsBq[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .JVsBq[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .JVsBq[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .JVsBq[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .JVsBq[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .JVsBq[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .JVsBq [data-component="leadingVisual"]{grid-area:leadingVisual;}/*!sc*/ .JVsBq [data-component="text"]{grid-area:text;line-height:1.4285714;white-space:nowrap;}/*!sc*/ .JVsBq [data-component="trailingVisual"]{grid-area:trailingVisual;}/*!sc*/ .JVsBq [data-component="trailingAction"]{margin-right:-4px;}/*!sc*/ .JVsBq [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .JVsBq [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .JVsBq [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .JVsBq [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .JVsBq:hover:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-hover,var(--color-btn-hover-bg,#f3f4f6));border-color:var(--button-default-borderColor-hover,var(--button-default-borderColor-hover,var(--color-btn-hover-border,rgba(31,35,40,0.15))));}/*!sc*/ .JVsBq:active:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .JVsBq[aria-expanded=true]{background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .JVsBq [data-component="leadingVisual"],.JVsBq [data-component="trailingVisual"],.JVsBq [data-component="trailingAction"]{color:var(--button-color,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .JVsBq[data-component="IconButton"][data-no-visuals]:not(:disabled){color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .JVsBq[data-size="medium"][data-no-visuals]{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .fwExmK{border-radius:6px;border:1px solid;border-color:transparent;font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));background-color:transparent;box-shadow:none;}/*!sc*/ .fwExmK:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .fwExmK:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .fwExmK:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .fwExmK[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .fwExmK[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .fwExmK:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .fwExmK:active{-webkit-transition:none;transition:none;}/*!sc*/ .fwExmK[data-inactive]{cursor:auto;}/*!sc*/ .fwExmK:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));background-color:var(--button-invisible-bgColor-disabled,transparent);}/*!sc*/ .fwExmK:disabled [data-component=ButtonCounter],.fwExmK:disabled [data-component="leadingVisual"],.fwExmK:disabled [data-component="trailingAction"]{color:inherit;}/*!sc*/ @media (forced-colors:active){.fwExmK:focus{outline:solid 1px transparent;}}/*!sc*/ .fwExmK [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .fwExmK[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .fwExmK[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;color:var(--fgColor-default,var(--color-fg-default,#1F2328));margin-left:8px;}/*!sc*/ .fwExmK[data-size="small"] [data-component="text"]{line-height:1.6666667;}/*!sc*/ .fwExmK[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .fwExmK[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .fwExmK[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .fwExmK[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .fwExmK[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .fwExmK[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .fwExmK[data-block="block"]{width:100%;}/*!sc*/ .fwExmK[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .fwExmK[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .fwExmK[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .fwExmK[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .fwExmK[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .fwExmK[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .fwExmK[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .fwExmK[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .fwExmK[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .fwExmK [data-component="leadingVisual"]{grid-area:leadingVisual;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .fwExmK [data-component="text"]{grid-area:text;line-height:1.4285714;white-space:nowrap;}/*!sc*/ .fwExmK [data-component="trailingVisual"]{grid-area:trailingVisual;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .fwExmK [data-component="trailingAction"]{margin-right:-4px;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .fwExmK [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .fwExmK [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .fwExmK [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .fwExmK [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .fwExmK:hover:not([disabled]){background-color:var(--control-transparent-bgColor-hover,var(--color-action-list-item-default-hover-bg,rgba(208,215,222,0.32)));}/*!sc*/ .fwExmK:active:not([disabled]){background-color:var(--control-transparent-bgColor-active,var(--color-action-list-item-default-active-bg,rgba(208,215,222,0.48)));}/*!sc*/ .fwExmK[aria-expanded=true]{background-color:var(--control-transparent-bgColor-selected,var(--color-action-list-item-default-selected-bg,rgba(208,215,222,0.24)));}/*!sc*/ .fwExmK[data-component="IconButton"][data-no-visuals]{color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .fwExmK[data-no-visuals]{color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));}/*!sc*/ .fwExmK:has([data-component="ButtonCounter"]){color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));}/*!sc*/ .fwExmK:disabled[data-no-visuals]{color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));}/*!sc*/ .fwExmK:disabled[data-no-visuals] [data-component=ButtonCounter]{color:inherit;}/*!sc*/ .ifVXZX{border-radius:6px;border:1px solid;border-color:var(--button-default-borderColor-rest,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-default-fgColor-rest,var(--color-btn-text,#24292f));background-color:var(--button-default-bgColor-rest,var(--color-btn-bg,#f6f8fa));box-shadow:var(--button-default-shadow-resting,var(--color-btn-shadow,0 1px 0 rgba(31,35,40,0.04))),var(--button-default-shadow-inset,var(--color-btn-inset-shadow,inset 0 1px 0 rgba(255,255,255,0.25)));padding-left:8px;padding-right:8px;}/*!sc*/ .ifVXZX:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .ifVXZX:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .ifVXZX:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .ifVXZX[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .ifVXZX[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .ifVXZX:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .ifVXZX:active{-webkit-transition:none;transition:none;}/*!sc*/ .ifVXZX[data-inactive]{cursor:auto;}/*!sc*/ .ifVXZX:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));border-color:var(--button-default-borderColor-disabled,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));background-color:var(--button-default-bgColor-disabled,var(--control-bgColor-disabled,var(--color-input-disabled-bg,rgba(175,184,193,0.2))));}/*!sc*/ .ifVXZX:disabled [data-component=ButtonCounter]{color:inherit;}/*!sc*/ @media (forced-colors:active){.ifVXZX:focus{outline:solid 1px transparent;}}/*!sc*/ .ifVXZX [data-component=ButtonCounter]{font-size:12px;background-color:var(--buttonCounter-default-bgColor-rest,var(--color-btn-counter-bg,rgba(31,35,40,0.08)));}/*!sc*/ .ifVXZX[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .ifVXZX[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .ifVXZX[data-size="small"] [data-component="text"]{line-height:1.6666667;}/*!sc*/ .ifVXZX[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .ifVXZX[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .ifVXZX[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .ifVXZX[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .ifVXZX[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .ifVXZX[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .ifVXZX[data-block="block"]{width:100%;}/*!sc*/ .ifVXZX[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .ifVXZX[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .ifVXZX[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .ifVXZX[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .ifVXZX[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .ifVXZX[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .ifVXZX[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .ifVXZX[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .ifVXZX[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .ifVXZX [data-component="leadingVisual"]{grid-area:leadingVisual;}/*!sc*/ .ifVXZX [data-component="text"]{grid-area:text;line-height:1.4285714;white-space:nowrap;}/*!sc*/ .ifVXZX [data-component="trailingVisual"]{grid-area:trailingVisual;}/*!sc*/ .ifVXZX [data-component="trailingAction"]{margin-right:-4px;}/*!sc*/ .ifVXZX [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .ifVXZX [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .ifVXZX [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .ifVXZX [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .ifVXZX:hover:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-hover,var(--color-btn-hover-bg,#f3f4f6));border-color:var(--button-default-borderColor-hover,var(--button-default-borderColor-hover,var(--color-btn-hover-border,rgba(31,35,40,0.15))));}/*!sc*/ .ifVXZX:active:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .ifVXZX[aria-expanded=true]{background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .ifVXZX [data-component="leadingVisual"],.ifVXZX [data-component="trailingVisual"],.ifVXZX [data-component="trailingAction"]{color:var(--button-color,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .ifVXZX[data-component="IconButton"][data-no-visuals]:not(:disabled){color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .ifVXZX linkButtonSx:hover:not([disabled]){-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .ifVXZX linkButtonSx:focus:not([disabled]){-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .ifVXZX linkButtonSx:active:not([disabled]){-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .gGdPyq{border-radius:6px;border:1px solid;border-color:var(--button-default-borderColor-rest,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-default-fgColor-rest,var(--color-btn-text,#24292f));background-color:var(--button-default-bgColor-rest,var(--color-btn-bg,#f6f8fa));box-shadow:var(--button-default-shadow-resting,var(--color-btn-shadow,0 1px 0 rgba(31,35,40,0.04))),var(--button-default-shadow-inset,var(--color-btn-inset-shadow,inset 0 1px 0 rgba(255,255,255,0.25)));}/*!sc*/ .gGdPyq:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .gGdPyq:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .gGdPyq:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .gGdPyq[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .gGdPyq[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .gGdPyq:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .gGdPyq:active{-webkit-transition:none;transition:none;}/*!sc*/ .gGdPyq[data-inactive]{cursor:auto;}/*!sc*/ .gGdPyq:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));border-color:var(--button-default-borderColor-disabled,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));background-color:var(--button-default-bgColor-disabled,var(--control-bgColor-disabled,var(--color-input-disabled-bg,rgba(175,184,193,0.2))));}/*!sc*/ .gGdPyq:disabled [data-component=ButtonCounter]{color:inherit;}/*!sc*/ @media (forced-colors:active){.gGdPyq:focus{outline:solid 1px transparent;}}/*!sc*/ .gGdPyq [data-component=ButtonCounter]{font-size:12px;background-color:var(--buttonCounter-default-bgColor-rest,var(--color-btn-counter-bg,rgba(31,35,40,0.08)));}/*!sc*/ .gGdPyq[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .gGdPyq[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .gGdPyq[data-size="small"] [data-component="text"]{line-height:1.6666667;}/*!sc*/ .gGdPyq[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .gGdPyq[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .gGdPyq[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .gGdPyq[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .gGdPyq[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .gGdPyq[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .gGdPyq[data-block="block"]{width:100%;}/*!sc*/ .gGdPyq[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .gGdPyq[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .gGdPyq[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .gGdPyq[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .gGdPyq[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .gGdPyq[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .gGdPyq[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .gGdPyq[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .gGdPyq[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .gGdPyq [data-component="leadingVisual"]{grid-area:leadingVisual;}/*!sc*/ .gGdPyq [data-component="text"]{grid-area:text;line-height:1.4285714;white-space:nowrap;}/*!sc*/ .gGdPyq [data-component="trailingVisual"]{grid-area:trailingVisual;}/*!sc*/ .gGdPyq [data-component="trailingAction"]{margin-right:-4px;}/*!sc*/ .gGdPyq [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .gGdPyq [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .gGdPyq [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .gGdPyq [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .gGdPyq:hover:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-hover,var(--color-btn-hover-bg,#f3f4f6));border-color:var(--button-default-borderColor-hover,var(--button-default-borderColor-hover,var(--color-btn-hover-border,rgba(31,35,40,0.15))));}/*!sc*/ .gGdPyq:active:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .gGdPyq[aria-expanded=true]{background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .gGdPyq [data-component="leadingVisual"],.gGdPyq [data-component="trailingVisual"],.gGdPyq [data-component="trailingAction"]{color:var(--button-color,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .gGdPyq[data-component="IconButton"][data-no-visuals]:not(:disabled){color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .dOuZvu{border-radius:6px;border:1px solid;border-color:var(--button-default-borderColor-rest,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-default-fgColor-rest,var(--color-btn-text,#24292f));background-color:var(--button-default-bgColor-rest,var(--color-btn-bg,#f6f8fa));box-shadow:var(--button-default-shadow-resting,var(--color-btn-shadow,0 1px 0 rgba(31,35,40,0.04))),var(--button-default-shadow-inset,var(--color-btn-inset-shadow,inset 0 1px 0 rgba(255,255,255,0.25)));}/*!sc*/ .dOuZvu:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .dOuZvu:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .dOuZvu:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .dOuZvu[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .dOuZvu[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .dOuZvu:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .dOuZvu:active{-webkit-transition:none;transition:none;}/*!sc*/ .dOuZvu[data-inactive]{cursor:auto;}/*!sc*/ .dOuZvu:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));border-color:var(--button-default-borderColor-disabled,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));background-color:var(--button-default-bgColor-disabled,var(--control-bgColor-disabled,var(--color-input-disabled-bg,rgba(175,184,193,0.2))));}/*!sc*/ .dOuZvu:disabled [data-component=ButtonCounter]{color:inherit;}/*!sc*/ @media (forced-colors:active){.dOuZvu:focus{outline:solid 1px transparent;}}/*!sc*/ .dOuZvu [data-component=ButtonCounter]{font-size:12px;background-color:var(--buttonCounter-default-bgColor-rest,var(--color-btn-counter-bg,rgba(31,35,40,0.08)));}/*!sc*/ .dOuZvu[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .dOuZvu[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .dOuZvu[data-size="small"] [data-component="text"]{line-height:1.6666667;}/*!sc*/ .dOuZvu[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .dOuZvu[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .dOuZvu[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .dOuZvu[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .dOuZvu[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .dOuZvu[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .dOuZvu[data-block="block"]{width:100%;}/*!sc*/ .dOuZvu[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .dOuZvu[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .dOuZvu[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .dOuZvu[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .dOuZvu[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .dOuZvu[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .dOuZvu[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .dOuZvu[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .dOuZvu[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .dOuZvu [data-component="leadingVisual"]{grid-area:leadingVisual;}/*!sc*/ .dOuZvu [data-component="text"]{grid-area:text;line-height:1.4285714;white-space:nowrap;}/*!sc*/ .dOuZvu [data-component="trailingVisual"]{grid-area:trailingVisual;}/*!sc*/ .dOuZvu [data-component="trailingAction"]{margin-right:-4px;}/*!sc*/ .dOuZvu [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .dOuZvu [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .dOuZvu [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .dOuZvu [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .dOuZvu:hover:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-hover,var(--color-btn-hover-bg,#f3f4f6));border-color:var(--button-default-borderColor-hover,var(--button-default-borderColor-hover,var(--color-btn-hover-border,rgba(31,35,40,0.15))));}/*!sc*/ .dOuZvu:active:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .dOuZvu[aria-expanded=true]{background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .dOuZvu [data-component="leadingVisual"],.dOuZvu [data-component="trailingVisual"],.dOuZvu [data-component="trailingAction"]{color:var(--button-color,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .dOuZvu[data-component="IconButton"][data-no-visuals]:not(:disabled){color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .dOuZvu[data-size="small"][data-no-visuals]{border-top-left-radius:0;border-bottom-left-radius:0;}/*!sc*/ .kOvYzm{border-radius:6px;border:1px solid;border-color:transparent;font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));background-color:transparent;box-shadow:none;}/*!sc*/ .kOvYzm:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .kOvYzm:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .kOvYzm:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .kOvYzm[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .kOvYzm[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .kOvYzm:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .kOvYzm:active{-webkit-transition:none;transition:none;}/*!sc*/ .kOvYzm[data-inactive]{cursor:auto;}/*!sc*/ .kOvYzm:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));background-color:var(--button-invisible-bgColor-disabled,transparent);}/*!sc*/ .kOvYzm:disabled [data-component=ButtonCounter],.kOvYzm:disabled [data-component="leadingVisual"],.kOvYzm:disabled [data-component="trailingAction"]{color:inherit;}/*!sc*/ @media (forced-colors:active){.kOvYzm:focus{outline:solid 1px transparent;}}/*!sc*/ .kOvYzm [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .kOvYzm[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .kOvYzm[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .kOvYzm[data-size="small"] [data-component="text"]{line-height:1.6666667;}/*!sc*/ .kOvYzm[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .kOvYzm[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .kOvYzm[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .kOvYzm[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .kOvYzm[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .kOvYzm[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .kOvYzm[data-block="block"]{width:100%;}/*!sc*/ .kOvYzm[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .kOvYzm[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .kOvYzm[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .kOvYzm[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .kOvYzm[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .kOvYzm[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .kOvYzm[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .kOvYzm[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .kOvYzm[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .kOvYzm [data-component="leadingVisual"]{grid-area:leadingVisual;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .kOvYzm [data-component="text"]{grid-area:text;line-height:1.4285714;white-space:nowrap;}/*!sc*/ .kOvYzm [data-component="trailingVisual"]{grid-area:trailingVisual;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .kOvYzm [data-component="trailingAction"]{margin-right:-4px;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .kOvYzm [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .kOvYzm [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .kOvYzm [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .kOvYzm [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .kOvYzm:hover:not([disabled]){background-color:var(--control-transparent-bgColor-hover,var(--color-action-list-item-default-hover-bg,rgba(208,215,222,0.32)));}/*!sc*/ .kOvYzm:active:not([disabled]){background-color:var(--control-transparent-bgColor-active,var(--color-action-list-item-default-active-bg,rgba(208,215,222,0.48)));}/*!sc*/ .kOvYzm[aria-expanded=true]{background-color:var(--control-transparent-bgColor-selected,var(--color-action-list-item-default-selected-bg,rgba(208,215,222,0.24)));}/*!sc*/ .kOvYzm[data-component="IconButton"][data-no-visuals]{color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .kOvYzm[data-no-visuals]{color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));}/*!sc*/ .kOvYzm:has([data-component="ButtonCounter"]){color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));}/*!sc*/ .kOvYzm:disabled[data-no-visuals]{color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));}/*!sc*/ .kOvYzm:disabled[data-no-visuals] [data-component=ButtonCounter]{color:inherit;}/*!sc*/ .kOvYzm[data-size="small"][data-no-visuals]{color:var(--fgColor-muted,var(--color-fg-muted));margin-right:8px;}/*!sc*/ .ggSvLP{border-radius:6px;border:1px solid;border-color:transparent;font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));background-color:transparent;box-shadow:none;}/*!sc*/ .ggSvLP:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .ggSvLP:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .ggSvLP:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .ggSvLP[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .ggSvLP[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .ggSvLP:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .ggSvLP:active{-webkit-transition:none;transition:none;}/*!sc*/ .ggSvLP[data-inactive]{cursor:auto;}/*!sc*/ .ggSvLP:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));background-color:var(--button-invisible-bgColor-disabled,transparent);}/*!sc*/ .ggSvLP:disabled [data-component=ButtonCounter],.ggSvLP:disabled [data-component="leadingVisual"],.ggSvLP:disabled [data-component="trailingAction"]{color:inherit;}/*!sc*/ @media (forced-colors:active){.ggSvLP:focus{outline:solid 1px transparent;}}/*!sc*/ .ggSvLP [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .ggSvLP[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .ggSvLP[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .ggSvLP[data-size="small"] [data-component="text"]{line-height:1.6666667;}/*!sc*/ .ggSvLP[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .ggSvLP[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .ggSvLP[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .ggSvLP[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .ggSvLP[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .ggSvLP[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .ggSvLP[data-block="block"]{width:100%;}/*!sc*/ .ggSvLP[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .ggSvLP[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .ggSvLP[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .ggSvLP[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .ggSvLP[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .ggSvLP[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .ggSvLP[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .ggSvLP[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .ggSvLP[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .ggSvLP [data-component="leadingVisual"]{grid-area:leadingVisual;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .ggSvLP [data-component="text"]{grid-area:text;line-height:1.4285714;white-space:nowrap;}/*!sc*/ .ggSvLP [data-component="trailingVisual"]{grid-area:trailingVisual;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .ggSvLP [data-component="trailingAction"]{margin-right:-4px;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .ggSvLP [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .ggSvLP [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .ggSvLP [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .ggSvLP [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .ggSvLP:hover:not([disabled]){background-color:var(--control-transparent-bgColor-hover,var(--color-action-list-item-default-hover-bg,rgba(208,215,222,0.32)));}/*!sc*/ .ggSvLP:active:not([disabled]){background-color:var(--control-transparent-bgColor-active,var(--color-action-list-item-default-active-bg,rgba(208,215,222,0.48)));}/*!sc*/ .ggSvLP[aria-expanded=true]{background-color:var(--control-transparent-bgColor-selected,var(--color-action-list-item-default-selected-bg,rgba(208,215,222,0.24)));}/*!sc*/ .ggSvLP[data-component="IconButton"][data-no-visuals]{color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .ggSvLP[data-no-visuals]{color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));}/*!sc*/ .ggSvLP:has([data-component="ButtonCounter"]){color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));}/*!sc*/ .ggSvLP:disabled[data-no-visuals]{color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));}/*!sc*/ .ggSvLP:disabled[data-no-visuals] [data-component=ButtonCounter]{color:inherit;}/*!sc*/ .ggSvLP[data-size="small"][data-no-visuals]{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ data-styled.g11[id="types__StyledButton-sc-ws60qy-0"]{content:"kBQCgV,dPmZyJ,iQGjqs,iLfocZ,JVsBq,fwExmK,ifVXZX,gGdPyq,dOuZvu,kOvYzm,ggSvLP,"}/*!sc*/ .hWlpPn{position:relative;display:inline-block;}/*!sc*/ .hWlpPn::after{position:absolute;z-index:1000000;display:none;padding:0.5em 0.75em;font:normal normal 11px/1.5 -apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";-webkit-font-smoothing:subpixel-antialiased;color:var(--tooltip-fgColor,var(--fgColor-onEmphasis,var(--color-fg-on-emphasis,#ffffff)));text-align:center;-webkit-text-decoration:none;text-decoration:none;text-shadow:none;text-transform:none;-webkit-letter-spacing:normal;-moz-letter-spacing:normal;-ms-letter-spacing:normal;letter-spacing:normal;word-wrap:break-word;white-space:pre;pointer-events:none;content:attr(aria-label);background:var(--tooltip-bgColor,var(--bgColor-emphasis,var(--color-neutral-emphasis-plus,#24292f)));border-radius:6px;opacity:0;}/*!sc*/ @-webkit-keyframes tooltip-appear{from{opacity:0;}to{opacity:1;}}/*!sc*/ @keyframes tooltip-appear{from{opacity:0;}to{opacity:1;}}/*!sc*/ .hWlpPn:hover::after,.hWlpPn:active::after,.hWlpPn:focus::after,.hWlpPn:focus-within::after{display:inline-block;-webkit-text-decoration:none;text-decoration:none;-webkit-animation-name:tooltip-appear;animation-name:tooltip-appear;-webkit-animation-duration:0.1s;animation-duration:0.1s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;-webkit-animation-delay:0s;animation-delay:0s;}/*!sc*/ .hWlpPn.tooltipped-no-delay:hover::after,.hWlpPn.tooltipped-no-delay:active::after,.hWlpPn.tooltipped-no-delay:focus::after,.hWlpPn.tooltipped-no-delay:focus-within::after{-webkit-animation-delay:0s;animation-delay:0s;}/*!sc*/ .hWlpPn.tooltipped-multiline:hover::after,.hWlpPn.tooltipped-multiline:active::after,.hWlpPn.tooltipped-multiline:focus::after,.hWlpPn.tooltipped-multiline:focus-within::after{display:table-cell;}/*!sc*/ .hWlpPn.tooltipped-s::after,.hWlpPn.tooltipped-se::after,.hWlpPn.tooltipped-sw::after{top:100%;right:50%;margin-top:6px;}/*!sc*/ .hWlpPn.tooltipped-se::after{right:auto;left:50%;margin-left:-16px;}/*!sc*/ .hWlpPn.tooltipped-sw::after{margin-right:-16px;}/*!sc*/ .hWlpPn.tooltipped-n::after,.hWlpPn.tooltipped-ne::after,.hWlpPn.tooltipped-nw::after{right:50%;bottom:100%;margin-bottom:6px;}/*!sc*/ .hWlpPn.tooltipped-ne::after{right:auto;left:50%;margin-left:-16px;}/*!sc*/ .hWlpPn.tooltipped-nw::after{margin-right:-16px;}/*!sc*/ .hWlpPn.tooltipped-s::after,.hWlpPn.tooltipped-n::after{-webkit-transform:translateX(50%);-ms-transform:translateX(50%);transform:translateX(50%);}/*!sc*/ .hWlpPn.tooltipped-w::after{right:100%;bottom:50%;margin-right:6px;-webkit-transform:translateY(50%);-ms-transform:translateY(50%);transform:translateY(50%);}/*!sc*/ .hWlpPn.tooltipped-e::after{bottom:50%;left:100%;margin-left:6px;-webkit-transform:translateY(50%);-ms-transform:translateY(50%);transform:translateY(50%);}/*!sc*/ .hWlpPn.tooltipped-multiline::after{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:250px;word-wrap:break-word;white-space:pre-line;border-collapse:separate;}/*!sc*/ .hWlpPn.tooltipped-multiline.tooltipped-s::after,.hWlpPn.tooltipped-multiline.tooltipped-n::after{right:auto;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);}/*!sc*/ .hWlpPn.tooltipped-multiline.tooltipped-w::after,.hWlpPn.tooltipped-multiline.tooltipped-e::after{right:100%;}/*!sc*/ .hWlpPn.tooltipped-align-right-2::after{right:0;margin-right:0;}/*!sc*/ .hWlpPn.tooltipped-align-left-2::after{left:0;margin-left:0;}/*!sc*/ data-styled.g14[id="Tooltip__TooltipBase-sc-17tf59c-0"]{content:"hWlpPn,"}/*!sc*/ .kbCLEG{border:0;font-size:inherit;font-family:inherit;background-color:transparent;-webkit-appearance:none;color:inherit;width:100%;}/*!sc*/ .kbCLEG:focus{outline:0;}/*!sc*/ data-styled.g15[id="UnstyledTextInput-sc-14ypya-0"]{content:"kbCLEG,"}/*!sc*/ .eAtkQz{display:inline-block;overflow:hidden;text-overflow:ellipsis;vertical-align:top;white-space:nowrap;max-width:125px;max-width:100%;}/*!sc*/ data-styled.g17[id="Truncate__StyledTruncate-sc-23o1d2-0"]{content:"eAtkQz,"}/*!sc*/ body[data-page-layout-dragging="true"]{cursor:col-resize;}/*!sc*/ body[data-page-layout-dragging="true"] *{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;}/*!sc*/ data-styled.g99[id="sc-global-gbKrvU1"]{content:"sc-global-gbKrvU1,"}/*!sc*/ .lirRhW{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle;isolation:isolate;}/*!sc*/ .lirRhW.lirRhW > *:not([data-loading-wrapper]){margin-inline-end:-1px;position:relative;border-radius:0;}/*!sc*/ .lirRhW.lirRhW > *:not([data-loading-wrapper]):first-child{border-top-left-radius:6px;border-bottom-left-radius:6px;}/*!sc*/ .lirRhW.lirRhW > *:not([data-loading-wrapper]):last-child{border-top-right-radius:6px;border-bottom-right-radius:6px;}/*!sc*/ .lirRhW.lirRhW > *:not([data-loading-wrapper]):focus,.lirRhW.lirRhW > *:not([data-loading-wrapper]):active,.lirRhW.lirRhW > *:not([data-loading-wrapper]):hover{z-index:1;}/*!sc*/ .lirRhW [data-loading-wrapper]:first-child button,.lirRhW [data-loading-wrapper]:first-child a{border-top-left-radius:6px;border-bottom-left-radius:6px;}/*!sc*/ .lirRhW [data-loading-wrapper]:last-child button,.lirRhW [data-loading-wrapper]:last-child a{border-top-right-radius:6px;border-bottom-right-radius:6px;}/*!sc*/ .lirRhW [data-loading-wrapper] > *{margin-inline-end:-1px;position:relative;border-radius:0;}/*!sc*/ .lirRhW [data-loading-wrapper] > *:focus,.lirRhW [data-loading-wrapper] > *:active,.lirRhW [data-loading-wrapper] > *:hover{z-index:1;}/*!sc*/ data-styled.g104[id="ButtonGroup__StyledButtonGroup-sc-1gxhls1-0"]{content:"lirRhW,"}/*!sc*/ .dwImxt{--segmented-control-button-inner-padding:12px;--segmented-control-button-bg-inset:4px;--segmented-control-outer-radius:6px;background-color:transparent;border-color:transparent;border-radius:var(--segmented-control-outer-radius);border-width:0;color:currentColor;cursor:pointer;font-family:inherit;font-size:inherit;font-weight:600;padding:0;height:100%;width:100%;}/*!sc*/ .dwImxt:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-1px;}/*!sc*/ .dwImxt:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .dwImxt:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-1px;}/*!sc*/ .dwImxt .segmentedControl-content{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:var(--controlKnob-bgColor-rest,var(--color-segmented-control-button-bg,#ffffff));border-color:var(--controlKnob-borderColor-rest,var(--color-segmented-control-button-hover-active-selected-border,#8c959f));border-style:solid;border-width:1px;border-radius:var(--segmented-control-outer-radius);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:100%;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding-left:var(--segmented-control-button-inner-padding);padding-right:var(--segmented-control-button-inner-padding);}/*!sc*/ .dwImxt svg{fill:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .dwImxt:focus:focus-visible:not(:last-child):after{width:0;}/*!sc*/ .dwImxt .segmentedControl-text:after{content:"Preview";display:block;font-weight:600;height:0;overflow:hidden;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;visibility:hidden;}/*!sc*/ @media (pointer:coarse){.dwImxt:before{content:"";position:absolute;left:0;right:0;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);top:50%;min-height:44px;}}/*!sc*/ .iFTkun{--segmented-control-button-inner-padding:12px;--segmented-control-button-bg-inset:4px;--segmented-control-outer-radius:6px;background-color:transparent;border-color:transparent;border-radius:var(--segmented-control-outer-radius);border-width:0;color:currentColor;cursor:pointer;font-family:inherit;font-size:inherit;font-weight:400;padding:var(--segmented-control-button-bg-inset);height:100%;width:100%;}/*!sc*/ .iFTkun:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-1px;}/*!sc*/ .iFTkun:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .iFTkun:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-1px;}/*!sc*/ .iFTkun .segmentedControl-content{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:transparent;border-color:transparent;border-style:solid;border-width:1px;border-radius:calc(var(--segmented-control-outer-radius) - var(--segmented-control-button-bg-inset) / 2);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:100%;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding-left:calc(var(--segmented-control-button-inner-padding) - var(--segmented-control-button-bg-inset));padding-right:calc(var(--segmented-control-button-inner-padding) - var(--segmented-control-button-bg-inset));}/*!sc*/ .iFTkun svg{fill:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .iFTkun:hover .segmentedControl-content{background-color:var(--controlTrack-bgColor-hover,var(--color-segmented-control-button-hover-bg,rgba(175,184,193,0.2)));}/*!sc*/ .iFTkun:active .segmentedControl-content{background-color:var(--controlTrack-bgColor-active,var(--color-segmented-control-button-hover-active-bg,rgba(175,184,193,0.4)));}/*!sc*/ .iFTkun:focus:focus-visible:not(:last-child):after{width:0;}/*!sc*/ .iFTkun .segmentedControl-text:after{content:"Code";display:block;font-weight:600;height:0;overflow:hidden;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;visibility:hidden;}/*!sc*/ @media (pointer:coarse){.iFTkun:before{content:"";position:absolute;left:0;right:0;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);top:50%;min-height:44px;}}/*!sc*/ .bHmvop{--segmented-control-button-inner-padding:12px;--segmented-control-button-bg-inset:4px;--segmented-control-outer-radius:6px;background-color:transparent;border-color:transparent;border-radius:var(--segmented-control-outer-radius);border-width:0;color:currentColor;cursor:pointer;font-family:inherit;font-size:inherit;font-weight:400;padding:var(--segmented-control-button-bg-inset);height:100%;width:100%;}/*!sc*/ .bHmvop:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-1px;}/*!sc*/ .bHmvop:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .bHmvop:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-1px;}/*!sc*/ .bHmvop .segmentedControl-content{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:transparent;border-color:transparent;border-style:solid;border-width:1px;border-radius:calc(var(--segmented-control-outer-radius) - var(--segmented-control-button-bg-inset) / 2);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:100%;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding-left:calc(var(--segmented-control-button-inner-padding) - var(--segmented-control-button-bg-inset));padding-right:calc(var(--segmented-control-button-inner-padding) - var(--segmented-control-button-bg-inset));}/*!sc*/ .bHmvop svg{fill:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .bHmvop:hover .segmentedControl-content{background-color:var(--controlTrack-bgColor-hover,var(--color-segmented-control-button-hover-bg,rgba(175,184,193,0.2)));}/*!sc*/ .bHmvop:active .segmentedControl-content{background-color:var(--controlTrack-bgColor-active,var(--color-segmented-control-button-hover-active-bg,rgba(175,184,193,0.4)));}/*!sc*/ .bHmvop:focus:focus-visible:not(:last-child):after{width:0;}/*!sc*/ .bHmvop .segmentedControl-text:after{content:"Blame";display:block;font-weight:600;height:0;overflow:hidden;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;visibility:hidden;}/*!sc*/ @media (pointer:coarse){.bHmvop:before{content:"";position:absolute;left:0;right:0;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);top:50%;min-height:44px;}}/*!sc*/ data-styled.g106[id="SegmentedControlButton__SegmentedControlButtonStyled-sc-8lkgxl-0"]{content:"dwImxt,iFTkun,bHmvop,"}/*!sc*/ .lawgDG{background-color:var(--controlTrack-bgColor-rest,var(--color-segmented-control-bg,#eaeef2));border-radius:6px;border:1px solid;border-color:var(--controlTrack-borderColor-rest,transparent);display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;font-size:14px;height:28px;margin:0;padding:0;}/*!sc*/ data-styled.g108[id="SegmentedControl__SegmentedControlList-sc-1rzig82-0"]{content:"lawgDG,"}/*!sc*/ </style><meta data-hydrostats="publish"/> <!-- --> <!-- --> <button hidden="" data-testid="header-permalink-button" data-hotkey-scope="read-only-cursor-text-area"></button><button hidden=""></button><div><div style="--sticky-pane-height:100vh" class="Box-sc-g0xbh4-0 hOfjFo"><div class="Box-sc-g0xbh4-0 oDGAe"><div class="Box-sc-g0xbh4-0 kowOcT"><div tabindex="0" class="Box-sc-g0xbh4-0 gISSDQ"><div class="Box-sc-g0xbh4-0 fLEPlD"><div class="Box-sc-g0xbh4-0 hPvFuC"></div><div style="--pane-width:320px" class="Box-sc-g0xbh4-0 fFSoPl"></div><div class="Box-sc-g0xbh4-0 bTBnTW"><div role="slider" aria-label="Draggable pane splitter" aria-valuemin="0" aria-valuemax="0" aria-valuenow="0" aria-valuetext="Pane width 0 pixels" tabindex="0" class="Box-sc-g0xbh4-0 bHLmSv"></div></div></div></div><div class="Box-sc-g0xbh4-0 iKqMNA"><div class="Box-sc-g0xbh4-0"></div><div class="Box-sc-g0xbh4-0 FxAyp"><div data-selector="repos-split-pane-content" tabindex="0" class="Box-sc-g0xbh4-0 leYMvG"><div class="Box-sc-g0xbh4-0 KMPzq"><div class="Box-sc-g0xbh4-0 hfKjHv container"><div class="px-3 pt-3 pb-0" id="StickyHeader"><div class="Box-sc-g0xbh4-0 gZWyZE"><div class="Box-sc-g0xbh4-0 dwYKDk"><div class="Box-sc-g0xbh4-0 ibcGmb react-code-view-header-wrap--narrow"><div class="Box-sc-g0xbh4-0 hKaEJF"><h2 class="Box-sc-g0xbh4-0 XosP prc-Heading-Heading-6CmGO"><button style="--button-color:fg.muted" type="button" aria-label="Expand file tree" data-testid="expand-file-tree-button-mobile" class="types__StyledButton-sc-ws60qy-0 kBQCgV" data-loading="false" data-size="medium" aria-describedby=":Rld9lab:-loading-announcement"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg"><span data-component="leadingVisual" class="Box-sc-g0xbh4-0 hzSPyu"><svg aria-hidden="true" focusable="false" class="octicon octicon-arrow-left" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M7.78 12.53a.75.75 0 0 1-1.06 0L2.47 8.28a.75.75 0 0 1 0-1.06l4.25-4.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L4.81 7h7.44a.75.75 0 0 1 0 1.5H4.81l2.97 2.97a.75.75 0 0 1 0 1.06Z"></path></svg></span><span data-component="text">Files</span></span></button><span role="tooltip" aria-label="Expand file tree" id="expand-button-file-tree-button" class="Tooltip__TooltipBase-sc-17tf59c-0 hWlpPn tooltipped-se"><button data-component="IconButton" type="button" data-testid="expand-file-tree-button" aria-controls="repos-file-tree" class="types__StyledButton-sc-ws60qy-0 dPmZyJ position-relative ExpandFileTreeButton-module__expandButton--gL4is ExpandFileTreeButton-module__filesButtonBreakpoint--WfX9t fgColor-muted prc-Button-IconButton-szpyj" data-loading="false" data-no-visuals="true" data-size="medium" aria-describedby=":R35d9lab:-loading-announcement" aria-labelledby="expand-button-file-tree-button"><svg aria-hidden="true" focusable="false" class="octicon octicon-sidebar-collapse" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M6.823 7.823a.25.25 0 0 1 0 .354l-2.396 2.396A.25.25 0 0 1 4 10.396V5.604a.25.25 0 0 1 .427-.177Z"></path><path d="M1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25V1.75C0 .784.784 0 1.75 0ZM1.5 1.75v12.5c0 .138.112.25.25.25H9.5v-13H1.75a.25.25 0 0 0-.25.25ZM11 14.5h3.25a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25H11Z"></path></svg></button></span><button hidden="" data-testid="" data-hotkey-scope="read-only-cursor-text-area"></button></h2></div><div class="react-code-view-header-mb--narrow mr-2"><button type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" aria-label="master branch" data-testid="anchor-button" class="types__StyledButton-sc-ws60qy-0 iQGjqs ref-selector-class" data-loading="false" data-size="medium" aria-describedby="branch-picker-repos-header-ref-selector-wide-loading-announcement" id="branch-picker-repos-header-ref-selector-wide"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg"><span data-component="text"><div class="Box-sc-g0xbh4-0 bZBlpz"><div class="Box-sc-g0xbh4-0 lhTYNA"><svg aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></div><div class="Box-sc-g0xbh4-0 dbrgmi ref-selector-button-text-container"><span class="Text__StyledText-sc-17v1xeu-0 eMMFM"> <!-- -->master</span></div></div></span><span data-component="trailingVisual" class="Box-sc-g0xbh4-0 hzSPyu"><svg aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></span></button><button hidden="" data-hotkey-scope="read-only-cursor-text-area"></button></div><div class="Box-sc-g0xbh4-0 dHJiml react-code-view-header-mb--narrow"><div class="Box-sc-g0xbh4-0 cEytCf"><nav data-testid="breadcrumbs" aria-labelledby="repos-header-breadcrumb-heading" id="repos-header-breadcrumb" class="Box-sc-g0xbh4-0 fzFXnm"><h2 class="sr-only prc-Heading-Heading-6CmGO" data-testid="screen-reader-heading" id="repos-header-breadcrumb-heading">Breadcrumbs</h2><ol class="Box-sc-g0xbh4-0 iMnkmv"><li class="Box-sc-g0xbh4-0 ghzDag"><a class="Box-sc-g0xbh4-0 kHuKdh prc-Link-Link-85e08" sx="[object Object]" data-testid="breadcrumbs-repo-link" href="/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/tree/master">GDPR-Transparency-and-Consent-Framework</a></li><li class="Box-sc-g0xbh4-0 ghzDag"><span class="Text__StyledText-sc-17v1xeu-0 HlHVj" aria-hidden="true">/</span><a class="Box-sc-g0xbh4-0 kgiVEz prc-Link-Link-85e08" sx="[object Object]" href="/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/tree/master/TCFv2">TCFv2</a></li></ol></nav><div data-testid="breadcrumbs-filename" class="Box-sc-g0xbh4-0 ghzDag"><span class="Text__StyledText-sc-17v1xeu-0 HlHVj" aria-hidden="true">/</span><h1 class="Box-sc-g0xbh4-0 jGhzSQ prc-Heading-Heading-6CmGO" tabindex="-1" id="file-name-id">IAB Tech Lab - CMP API v2.md</h1></div><div aria-describedby=":R1td9lab:"><button data-component="IconButton" type="button" aria-label="Copy path" tabindex="0" class="types__StyledButton-sc-ws60qy-0 dPmZyJ prc-Button-IconButton-szpyj" data-loading="false" data-no-visuals="true" data-size="small" aria-describedby=":R7td9lab:-loading-announcement"><svg aria-hidden="true" focusable="false" class="octicon octicon-copy" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg></button></div></div></div></div><div class="react-code-view-header-element--wide"><div class="Box-sc-g0xbh4-0 faNtbn"><div class="d-flex gap-2"> <div><div class="Box-sc-g0xbh4-0 fmQaBv"><span class="TextInputWrapper__TextInputBaseWrapper-sc-1mqhpbi-0 TextInputWrapper-sc-1mqhpbi-1 gwqFqs decvaq TextInput-wrapper" aria-busy="false"><span class="TextInput-icon" id=":R5j6d9lab:" aria-hidden="true"><svg aria-hidden="true" focusable="false" class="octicon octicon-search" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path></svg></span><input type="text" aria-label="Go to file" role="combobox" aria-controls="file-results-list" aria-expanded="false" aria-haspopup="dialog" autoCorrect="off" spellcheck="false" placeholder="Go to file" aria-describedby=":R5j6d9lab: :R5j6d9labH1:" data-component="input" class="UnstyledTextInput-sc-14ypya-0 kbCLEG" value=""/><span class="TextInput-icon" id=":R5j6d9labH1:" aria-hidden="true"></span></span></div><button hidden="" data-testid="" data-hotkey-scope="read-only-cursor-text-area"></button><button hidden=""></button></div><button type="button" class="types__StyledButton-sc-ws60qy-0 iLfocZ" data-loading="false" data-no-visuals="true" data-size="medium" aria-describedby=":R2l6d9lab:-loading-announcement"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg"><span data-component="text">Blame</span></span></button><button hidden="" data-testid="" data-hotkey-scope="read-only-cursor-text-area"></button><button data-component="IconButton" type="button" aria-label="More file actions" title="More file actions" data-testid="more-file-actions-button-nav-menu-wide" aria-haspopup="true" aria-expanded="false" tabindex="0" class="types__StyledButton-sc-ws60qy-0 JVsBq js-blob-dropdown-click prc-Button-IconButton-szpyj" data-loading="false" data-no-visuals="true" data-size="medium" aria-describedby=":R156d9lab:-loading-announcement" id=":R156d9lab:"><svg aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button> </div></div></div><div class="react-code-view-header-element--narrow"><div class="Box-sc-g0xbh4-0 faNtbn"><div class="d-flex gap-2"> <button type="button" class="types__StyledButton-sc-ws60qy-0 iLfocZ" data-loading="false" data-no-visuals="true" data-size="medium" aria-describedby=":R2l7d9lab:-loading-announcement"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg"><span data-component="text">Blame</span></span></button><button hidden="" data-testid="" data-hotkey-scope="read-only-cursor-text-area"></button><button data-component="IconButton" type="button" aria-label="More file actions" title="More file actions" data-testid="more-file-actions-button-nav-menu-narrow" aria-haspopup="true" aria-expanded="false" tabindex="0" class="types__StyledButton-sc-ws60qy-0 JVsBq js-blob-dropdown-click prc-Button-IconButton-szpyj" data-loading="false" data-no-visuals="true" data-size="medium" aria-describedby=":R157d9lab:-loading-announcement" id=":R157d9lab:"><svg aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button> </div></div></div></div></div></div></div></div><div class="Box-sc-g0xbh4-0 dJxjrT react-code-view-bottom-padding"> <div class="Box-sc-g0xbh4-0 eFxKDQ"></div> <!-- --> <!-- --> </div><div class="Box-sc-g0xbh4-0 dJxjrT"> <!-- --> <!-- --> <button hidden="" data-testid="" data-hotkey-scope="read-only-cursor-text-area"></button><button hidden=""></button><div class="d-flex flex-column border rounded-2 mb-3 pl-1"><div class="Box-sc-g0xbh4-0 dzCJzi"><h2 class="sr-only prc-Heading-Heading-6CmGO" data-testid="screen-reader-heading">Latest commit</h2><div style="width:120px" class="Skeleton Skeleton--text" data-testid="loading"> </div><div class="d-flex flex-shrink-0 gap-2"><div data-testid="latest-commit-details" class="d-none d-sm-flex flex-items-center"></div><div class="d-flex gap-2"><h2 class="sr-only prc-Heading-Heading-6CmGO" data-testid="screen-reader-heading">History</h2><a href="/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/commits/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md" class="types__StyledButton-sc-ws60qy-0 dPmZyJ d-none d-lg-flex LinkButton-module__code-view-link-button--xvCGA flex-items-center fgColor-default" data-loading="false" data-size="small" aria-describedby=":R5dlal9lab:-loading-announcement"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg"><span data-component="leadingVisual" class="Box-sc-g0xbh4-0 hzSPyu"><svg aria-hidden="true" focusable="false" class="octicon octicon-history" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path></svg></span><span data-component="text"><span class="fgColor-default">History</span></span></span></a><div class="d-sm-none"></div><div class="d-flex d-lg-none"><span role="tooltip" aria-label="History" id="history-icon-button-tooltip" class="Tooltip__TooltipBase-sc-17tf59c-0 hWlpPn tooltipped-n"><a href="/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/commits/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md" class="types__StyledButton-sc-ws60qy-0 dPmZyJ LinkButton-module__code-view-link-button--xvCGA flex-items-center fgColor-default" data-loading="false" data-size="small" aria-describedby=":Rpdlal9lab:-loading-announcement history-icon-button-tooltip"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg"><span data-component="leadingVisual" class="Box-sc-g0xbh4-0 hzSPyu"><svg aria-hidden="true" focusable="false" class="octicon octicon-history" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path></svg></span></span></a></span></div></div></div></div></div><div class="Box-sc-g0xbh4-0 ldRxiI"><div class="Box-sc-g0xbh4-0 fVkfyA container"><div class="Box-sc-g0xbh4-0 gNAmSV react-code-size-details-banner"><div class="Box-sc-g0xbh4-0 jNEwzY react-code-size-details-banner"><div class="Box-sc-g0xbh4-0 bsDwxw text-mono"><div title="61.7 KB" data-testid="blob-size" class="Truncate__StyledTruncate-sc-23o1d2-0 eAtkQz"><span>1148 lines (840 loc) · 61.7 KB</span></div></div></div></div><div class="Box-sc-g0xbh4-0 jdLMhu react-blob-view-header-sticky" id="repos-sticky-header"><div class="Box-sc-g0xbh4-0 tOISc"><div class="react-blob-sticky-header"><div class="Box-sc-g0xbh4-0 hqwSEx"><div class="Box-sc-g0xbh4-0 bDVoEr"><div class="Box-sc-g0xbh4-0 kYLlPM"><div class="Box-sc-g0xbh4-0 gYjEmn"><button type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" aria-label="master branch" data-testid="anchor-button" class="types__StyledButton-sc-ws60qy-0 iQGjqs ref-selector-class" data-loading="false" data-size="medium" aria-describedby="branch-picker-repos-header-ref-selector-loading-announcement" id="branch-picker-repos-header-ref-selector"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg"><span data-component="text"><div class="Box-sc-g0xbh4-0 bZBlpz"><div class="Box-sc-g0xbh4-0 lhTYNA"><svg aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></div><div class="Box-sc-g0xbh4-0 dbrgmi ref-selector-button-text-container"><span class="Text__StyledText-sc-17v1xeu-0 eMMFM"> <!-- -->master</span></div></div></span><span data-component="trailingVisual" class="Box-sc-g0xbh4-0 hzSPyu"><svg aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></span></button><button hidden="" data-hotkey-scope="read-only-cursor-text-area"></button></div><div class="Box-sc-g0xbh4-0 kGqOLL"><div class="Box-sc-g0xbh4-0 fHind"><nav data-testid="breadcrumbs" aria-labelledby="sticky-breadcrumb-heading" id="sticky-breadcrumb" class="Box-sc-g0xbh4-0 fzFXnm"><h2 class="sr-only prc-Heading-Heading-6CmGO" data-testid="screen-reader-heading" id="sticky-breadcrumb-heading">Breadcrumbs</h2><ol class="Box-sc-g0xbh4-0 iMnkmv"><li class="Box-sc-g0xbh4-0 ghzDag"><a class="Box-sc-g0xbh4-0 kHuKdh prc-Link-Link-85e08" sx="[object Object]" data-testid="breadcrumbs-repo-link" href="/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/tree/master">GDPR-Transparency-and-Consent-Framework</a></li><li class="Box-sc-g0xbh4-0 ghzDag"><span class="Text__StyledText-sc-17v1xeu-0 lauzFl" aria-hidden="true">/</span><a class="Box-sc-g0xbh4-0 kgiVEz prc-Link-Link-85e08" sx="[object Object]" href="/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/tree/master/TCFv2">TCFv2</a></li></ol></nav><div data-testid="breadcrumbs-filename" class="Box-sc-g0xbh4-0 ghzDag"><span class="Text__StyledText-sc-17v1xeu-0 lauzFl" aria-hidden="true">/</span><h1 class="Box-sc-g0xbh4-0 dnZoUW prc-Heading-Heading-6CmGO" tabindex="-1" id="sticky-file-name-id">IAB Tech Lab - CMP API v2.md</h1></div></div></div></div><button style="--button-color:fg.default" type="button" class="types__StyledButton-sc-ws60qy-0 fwExmK" data-loading="false" data-size="small" aria-describedby=":Riptal9lab:-loading-announcement"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg"><span data-component="leadingVisual" class="Box-sc-g0xbh4-0 hzSPyu"><svg aria-hidden="true" focusable="false" class="octicon octicon-arrow-up" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M3.47 7.78a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0l4.25 4.25a.751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018L9 4.81v7.44a.75.75 0 0 1-1.5 0V4.81L4.53 7.78a.75.75 0 0 1-1.06 0Z"></path></svg></span><span data-component="text">Top</span></span></button></div></div></div><div class="Box-sc-g0xbh4-0 kTvpNk"><h2 class="sr-only prc-Heading-Heading-6CmGO" data-testid="screen-reader-heading">File metadata and controls</h2><div class="Box-sc-g0xbh4-0 iNMjfP"><ul aria-label="File view" class="SegmentedControl__SegmentedControlList-sc-1rzig82-0 lawgDG"><li class="Box-sc-g0xbh4-0 fefCSX"><button aria-current="true" type="button" class="SegmentedControlButton__SegmentedControlButtonStyled-sc-8lkgxl-0 dwImxt"><span class="segmentedControl-content"><div class="Box-sc-g0xbh4-0 segmentedControl-text">Preview</div></span></button></li><li class="Box-sc-g0xbh4-0 idgUkN"><button aria-current="false" type="button" class="SegmentedControlButton__SegmentedControlButtonStyled-sc-8lkgxl-0 iFTkun"><span class="segmentedControl-content"><div class="Box-sc-g0xbh4-0 segmentedControl-text">Code</div></span></button></li><li class="Box-sc-g0xbh4-0 idgUkN"><button aria-current="false" type="button" class="SegmentedControlButton__SegmentedControlButtonStyled-sc-8lkgxl-0 bHmvop"><span class="segmentedControl-content"><div class="Box-sc-g0xbh4-0 segmentedControl-text">Blame</div></span></button></li></ul><button hidden="" data-testid="" data-hotkey-scope="read-only-cursor-text-area"></button><button hidden="" data-testid="" data-hotkey-scope="read-only-cursor-text-area"></button><button hidden="" data-testid="" data-hotkey-scope="read-only-cursor-text-area"></button><div class="Box-sc-g0xbh4-0 jNEwzY react-code-size-details-in-header"><div class="Box-sc-g0xbh4-0 bsDwxw text-mono"><div title="61.7 KB" data-testid="blob-size" class="Truncate__StyledTruncate-sc-23o1d2-0 eAtkQz"><span>1148 lines (840 loc) · 61.7 KB</span></div></div></div></div><div class="Box-sc-g0xbh4-0 kcLCKF"><div class="Box-sc-g0xbh4-0 kVWtTz react-blob-header-edit-and-raw-actions"><div class="ButtonGroup__StyledButtonGroup-sc-1gxhls1-0 lirRhW"><a href="https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/raw/refs/heads/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md" data-testid="raw-button" class="types__StyledButton-sc-ws60qy-0 ifVXZX" data-loading="false" data-no-visuals="true" data-size="small" aria-describedby=":R5csptal9lab:-loading-announcement"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg"><span data-component="text">Raw</span></span></a><button data-component="IconButton" type="button" aria-label="Copy raw content" data-testid="copy-raw-button" class="types__StyledButton-sc-ws60qy-0 gGdPyq prc-Button-IconButton-szpyj" data-loading="false" data-no-visuals="true" data-size="small" aria-describedby=":Rpcsptal9lab:-loading-announcement"><svg aria-hidden="true" focusable="false" class="octicon octicon-copy" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg></button><span role="tooltip" aria-label="Download raw file" id=":Rdcsptal9lab:" class="Tooltip__TooltipBase-sc-17tf59c-0 hWlpPn tooltipped-n"><button data-component="IconButton" type="button" aria-label="Download raw content" data-testid="download-raw-button" class="types__StyledButton-sc-ws60qy-0 dOuZvu prc-Button-IconButton-szpyj" data-loading="false" data-no-visuals="true" data-size="small" aria-describedby=":Rtcsptal9lab:-loading-announcement"><svg aria-hidden="true" focusable="false" class="octicon octicon-download" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2.75 14A1.75 1.75 0 0 1 1 12.25v-2.5a.75.75 0 0 1 1.5 0v2.5c0 .138.112.25.25.25h10.5a.25.25 0 0 0 .25-.25v-2.5a.75.75 0 0 1 1.5 0v2.5A1.75 1.75 0 0 1 13.25 14Z"></path><path d="M7.25 7.689V2a.75.75 0 0 1 1.5 0v5.689l1.97-1.969a.749.749 0 1 1 1.06 1.06l-3.25 3.25a.749.749 0 0 1-1.06 0L4.22 6.78a.749.749 0 1 1 1.06-1.06l1.97 1.969Z"></path></svg></button></span></div><button hidden="" data-testid="raw-button-shortcut" data-hotkey-scope="read-only-cursor-text-area"></button><button hidden="" data-testid="copy-raw-button-shortcut" data-hotkey-scope="read-only-cursor-text-area"></button><button hidden="" data-testid="download-raw-button-shortcut" data-hotkey-scope="read-only-cursor-text-area"></button></div><button data-component="IconButton" type="button" aria-label="Outline" aria-pressed="false" class="types__StyledButton-sc-ws60qy-0 kOvYzm prc-Button-IconButton-szpyj" data-loading="false" data-no-visuals="true" data-size="small" aria-describedby=":R6sptal9lab:-loading-announcement"><svg aria-hidden="true" focusable="false" class="octicon octicon-list-unordered" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M5.75 2.5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5Zm0 5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5Zm0 5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5ZM2 14a1 1 0 1 1 0-2 1 1 0 0 1 0 2Zm1-6a1 1 0 1 1-2 0 1 1 0 0 1 2 0ZM2 4a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path></svg></button><div class="react-blob-header-edit-and-raw-actions-combined"><button data-component="IconButton" type="button" aria-label="Edit and raw actions" title="More file actions" data-testid="more-file-actions-button" aria-haspopup="true" aria-expanded="false" tabindex="0" class="types__StyledButton-sc-ws60qy-0 ggSvLP js-blob-dropdown-click prc-Button-IconButton-szpyj" data-loading="false" data-no-visuals="true" data-size="small" aria-describedby=":Rnsptal9lab:-loading-announcement" id=":Rnsptal9lab:"><svg aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button></div></div></div></div><div></div></div><div class="Box-sc-g0xbh4-0 hGyMdv"><section aria-labelledby="file-name-id-wide file-name-id-mobile" class="Box-sc-g0xbh4-0 fGqKFv"><div class="Box-sc-g0xbh4-0 eoaCFS js-snippet-clipboard-copy-unpositioned" data-hpc="true"><article class="markdown-body entry-content container-lg" itemprop="text"><p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="https://user-images.githubusercontent.com/19175352/38649177-0d37d17c-3daa-11e8-8934-f0fb47919716.png"><img src="https://user-images.githubusercontent.com/19175352/38649177-0d37d17c-3daa-11e8-8934-f0fb47919716.png" alt="iab tech lab" style="max-width: 100%;"></a></p> <div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">Consent Management Platform API</h1><a id="user-content-consent-management-platform-api" class="anchor" aria-label="Permalink: Consent Management Platform API" href="#consent-management-platform-api"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"><strong>IAB Europe Transparency & Consent Framework</strong></p> <p dir="auto"><strong>Final v.2.2 May 2023</strong></p> <ul dir="auto"> <li><a href="#version-history">Version History</a></li> <li><a href="#introduction">Introduction</a> <ul dir="auto"> <li><a href="#about-the-transparency--consent-framework">About the Transparency & Consent Framework</a></li> <li><a href="#license">License</a></li> <li><a href="#disclaimer">Disclaimer</a></li> <li><a href="#about-iab-tech-lab">About IAB Tech Lab</a></li> <li><a href="#about-iab-europe">About IAB Europe</a></li> </ul> </li> <li><a href="#cmp-api-v20">CMP API v2.0</a> <ul dir="auto"> <li><a href="#what-does-the-cmp-api-support">What does the CMP API support?</a></li> <li><a href="#what-is-the-global-vendor-list">What is the Global Vendor List?</a></li> <li><a href="#how-does-the-cmp-provide-the-api">How does the CMP provide the API?</a></li> <li><a href="#what-required-api-commands-must-a-cmp-support">What required API commands must a CMP support?</a> <ul dir="auto"> <li><a href="#gettcdata"><code>getTCData</code></a></li> <li><a href="#ping"><code>ping</code></a></li> <li><a href="#addeventlistener"><code>addEventListener</code></a></li> <li><a href="#removeeventlistener"><code>removeEventListener</code></a></li> </ul> </li> <li><a href="#what-optional-api-commands-might-a-cmp-support">What optional API commands might a CMP support?</a> <ul dir="auto"> <li><a href="#getinapptcdata"><code>getInAppTCData</code></a></li> <li><a href="#getvendorlist"><code>getVendorList</code></a></li> </ul> </li> <li><a href="#what-objects-are-returned-from-the-api">What objects are returned from the API?</a> <ul dir="auto"> <li><a href="#tcdata"><code>TCData</code></a></li> <li><a href="#pingreturn"><code>PingReturn</code></a> <ul dir="auto"> <li><a href="#ping-status-codes">Ping Status Codes</a></li> </ul> </li> <li><a href="#inapptcdata"><code>InAppTCData</code></a></li> </ul> </li> <li><a href="#in-app-details">In-App Details</a> <ul dir="auto"> <li><a href="#how-is-a-cmp-used-in-app">How is a CMP used in-app?</a></li> <li><a href="#what-is-the-cmp-in-app-internal-structure-for-the-defined-api">What is the CMP in-app internal structure for the defined API?</a></li> <li><a href="#how-do-third-party-sdks-vendors-access-the-consent-information-in-app">How do third-party SDKs (vendors) access the consent information in-app?</a></li> <li><a href="#how-does-ad-mediation-work-in-app">How does ad mediation work in-app?</a> <ul dir="auto"> <li><a href="#mediation-sdk">Mediation SDK</a></li> <li><a href="#vendor">Vendor</a></li> </ul> </li> </ul> </li> <li><a href="#ctv-details">CTV Details</a> <ul dir="auto"> <li><a href="#how-is-a-cmp-used-in-the-ctv-context">How is a CMP used in the CTV context?</a></li> <li><a href="#web-runtime">Web Runtime</a></li> <li><a href="#native">Native</a></li> </ul> </li> </ul> </li> <li><a href="#using-the-cmp-api">Using the CMP API</a> <ul dir="auto"> <li><a href="#how-do-ad-tags-work">How do ad tags work?</a></li> <li><a href="#how-does-the-version-parameter-work">How does the "version" parameter work?</a></li> <li><a href="#what-does-the-gdprapplies-value-mean">What does the gdprApplies value mean?</a></li> <li><a href="#details-for-vendors">Details for vendors</a> <ul dir="auto"> <li><a href="#how-can-scripts-on-a-page-determine-if-there-is-a-cmp-present">How can scripts on a page determine if there is a CMP present?</a></li> <li><a href="#how-can-scripts-determine-if-the-cmp-script-is-loaded-yet">How can scripts determine if the CMP script is loaded yet?</a></li> <li><a href="#how-does-the-cmp-stub-api-work">How does the CMP “stub” API work?</a></li> <li><a href="#requirements-for-the-cmp-stub-api-script">Requirements for the CMP “stub” API script</a></li> <li><a href="#is-there-a-sample-cmp-stub-api-script">Is there a sample CMP “stub” API script?</a></li> </ul> </li> <li><a href="#how-can-vendors-that-use-iframes-call-the-cmp-api-from-an-iframe">How can vendors that use iframes call the CMP API from an iframe?</a> <ul dir="auto"> <li><a href="#using-postmessage">Using postmessage</a></li> <li><a href="#is-there-a-sample-iframe-script-call-to-the-cmp-api">Is there a sample iframe script call to the CMP API?</a></li> </ul> </li> <li><a href="#from-where-will-the-api-retrieve-the-tc-string">From where will the API retrieve the TC string?</a></li> <li><a href="#major-changes-from-20">Major Changes from 2.0</a></li> <li><a href="#major-changes-from-11">Major Changes from 1.1</a></li> </ul> </li> </ul> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Version History</h2><a id="user-content-version-history" class="anchor" aria-label="Permalink: Version History" href="#version-history"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <markdown-accessiblity-table><table> <thead> <tr> <th align="left">Date</th> <th align="left">Version</th> <th align="left">Comments</th> </tr> </thead> <tbody> <tr> <td align="left">January 2024</td> <td align="left">2.2</td> <td align="left">Added details for CTV support</td> </tr> <tr> <td align="left">May 2023</td> <td align="left">2.2</td> <td align="left">Update to further strengthen the TCF as a standard in the industry: Deprecated API command "getTCData".</td> </tr> <tr> <td align="left">September 2021</td> <td align="left">2.0</td> <td align="left">Deprecation of Global Scope and OOB </td> </tr> <tr> <td align="left">February 2020</td> <td align="left">2.0</td> <td align="left">Removed CMP List; added included in the Consent String and Vendor List Specification </td> </tr> <tr> <td align="left">February 2020</td> <td align="left">2.0</td> <td align="left">Updated stub example to reference open-source library, change addEventListener/removeEventListener interface, clarify addEventListener callback invocation time, and remove SafeFrame proxy communications </td> </tr> <tr> <td align="left">December 2019</td> <td align="left">2.0</td> <td align="left">Updated with reference to CMP List, Updated macros to be upper case, Added cmpStatus to be surfaced in both the API calls and the TCData object, and fixed case in a reference to IABTCF_CmpSdkID </td> </tr> <tr> <td align="left">August 2019</td> <td align="left">2.0</td> <td align="left">Final version released for adoption</td> </tr> <tr> <td align="left">April 2019</td> <td align="left">2.0</td> <td align="left">Released for public comment</td> </tr> <tr> <td align="left">April 2018</td> <td align="left">1.1</td> <td align="left">First version released to the public</td> </tr> </tbody> </table></markdown-accessiblity-table> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Introduction</h2><a id="user-content-introduction" class="anchor" aria-label="Permalink: Introduction" href="#introduction"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">This document is one of the IAB Europe Transparency and Consent Framework (TCF) Specifications. It defines the API for Consent Management Providers (CMPs). The CMP API v2 is the interface a CMP provides for callers (web and in-app) to access information regarding the transparency and consent disclosed and obtained from the end user by the CMP. Both required functionality that the CMP must provide and optional features are described.</p> <p dir="auto">The General Data Protection Regulation (GDPR) requires a high level of accountability for how personal data is processed for users consuming content online or in-app. Specifically, GDPR requires a legal basis for such processing. Two of the legal bases described in the GDPR are the most relevant to organizations that operate in the digital advertising ecosystem. Such organizations need to either obtain consent from the user to process their personal data, or establish legitimate interests for processing data such that the interests and fundamental rights of the user are not overriding.</p> <p dir="auto">Under the GDPR, controllers are required to create and maintain records of compliance. While compliance is important, implementation came with heavy technical challenges. Clear standards for a common technical solution would be needed.</p> <p dir="auto">IAB Europe established the TCF to support compliance with the GDPR in the context of digital advertising. This framework is built on four components: a Global Vendor List (GVL), a Transparency and Consent String (TC String) to store data, an API for CMPs to create and process the TC String, and the Policies that govern how the TCF is used.</p> <p dir="auto">Prescribed use of the TCF establishes an audit trail to help maintain compliance with the GDPR, but the real benefit to the digital advertising ecosystem is a safer Internet for consumers, and more reliable data for brands and publishers. As adoption of the TCF increases, compliance becomes more scalable and data becomes more meaningful.</p> <p dir="auto">To participate in the use of the TCF, become familiar with the Policies for using it. To have transparency and consent established and signaled for your online services, apply to be added to the GVL. To play a role in creating a TC String for signaling status on transparency and user consent, sign up with IAB Europe to become a CMP. CMPs must follow technical standards provided in this document for creating TC Strings in compliance with <a href="https://iabeurope.eu/iab-europe-transparency-consent-framework-policies/" rel="nofollow">TCF Policy</a>. They must also follow technical standards for using the CMP API specified in this document to receive and process information provided in the TC String.</p> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">About the Transparency & Consent Framework</h3><a id="user-content-about-the-transparency--consent-framework" class="anchor" aria-label="Permalink: About the Transparency & Consent Framework" href="#about-the-transparency--consent-framework"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">IAB Europe Transparency & Consent Framework (TCF) has a simple objective to help all parties in the digital advertising chain ensure that they comply with the EU’s General Data Protection Regulation and ePrivacy Directive when processing personal data or accessing and/or storing information on a user’s device, such as cookies, advertising identifiers, device identifiers and other tracking technologies. IAB Tech Lab stewards the development of these technical specifications.</p> <p dir="auto">Resources including policy FAQ, Global Vendor List, and CMP List can be found at <a href="http://iabeurope.eu/tcf" rel="nofollow">iabeurope.eu/tcf</a>.</p> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">License</h3><a id="user-content-license" class="anchor" aria-label="Permalink: License" href="#license"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">IAB Europe Transparency and Consent Framework technical specifications governed by the IAB Tech Lab is licensed under a Creative Commons Attribution 3.0 License. To view a copy of this license, visit<a href="http://creativecommons.org/licenses/by/3.0/" rel="nofollow"> creativecommons.org/licenses/by/3.0/</a> or write to Creative Commons, 171 Second Street, Suite 300, San Francisco, CA 94105, USA.</p> <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/44b025552896b2fa5e45d88fcd1f22d4c658367aedbef82820acc3e57a6cfb10/68747470733a2f2f64726976652e676f6f676c652e636f6d2f75633f69643d3163627745476c6238533639536e6449446f486e7663355f3354666d6b474d3752"><img src="https://camo.githubusercontent.com/44b025552896b2fa5e45d88fcd1f22d4c658367aedbef82820acc3e57a6cfb10/68747470733a2f2f64726976652e676f6f676c652e636f6d2f75633f69643d3163627745476c6238533639536e6449446f486e7663355f3354666d6b474d3752" alt="" data-canonical-src="https://drive.google.com/uc?id=1cbwEGlb8S69SndIDoHnvc5_3TfmkGM7R" style="max-width: 100%;"></a></p> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Disclaimer</h3><a id="user-content-disclaimer" class="anchor" aria-label="Permalink: Disclaimer" href="#disclaimer"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">THE STANDARDS, THE SPECIFICATIONS, THE MEASUREMENT GUIDELINES, AND ANY OTHER MATERIALS OR SERVICES PROVIDED TO OR USED BY YOU HEREUNDER (THE “PRODUCTS AND SERVICES”) ARE PROVIDED “AS IS” AND “AS AVAILABLE,” AND IAB TECHNOLOGY LABORATORY, INC. (“TECH LAB”) MAKES NO WARRANTY WITH RESPECT TO THE SAME AND HEREBY DISCLAIMS ANY AND ALL EXPRESS, IMPLIED, OR STATUTORY WARRANTIES, INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AVAILABILITY, ERROR-FREE OR UNINTERRUPTED OPERATION, AND ANY WARRANTIES ARISING FROM A COURSE OF DEALING, COURSE OF PERFORMANCE, OR USAGE OF TRADE. TO THE EXTENT THAT TECH LAB MAY NOT AS A MATTER OF APPLICABLE LAW DISCLAIM ANY IMPLIED WARRANTY, THE SCOPE AND DURATION OF SUCH WARRANTY WILL BE THE MINIMUM PERMITTED UNDER SUCH LAW. THE PRODUCTS AND SERVICES DO NOT CONSTITUTE BUSINESS OR LEGAL ADVICE. TECH LAB DOES NOT WARRANT THAT THE PRODUCTS AND SERVICES PROVIDED TO OR USED BY YOU HEREUNDER SHALL CAUSE YOU AND/OR YOUR PRODUCTS OR SERVICES TO BE IN COMPLIANCE WITH ANY APPLICABLE LAWS, REGULATIONS, OR SELF-REGULATORY FRAMEWORKS, AND YOU ARE SOLELY RESPONSIBLE FOR COMPLIANCE WITH THE SAME.</p> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">About IAB Tech Lab</h3><a id="user-content-about-iab-tech-lab" class="anchor" aria-label="Permalink: About IAB Tech Lab" href="#about-iab-tech-lab"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">The IAB Technology Laboratory (Tech Lab) is a non-profit consortium that engages a member community globally to develop foundational technology and standards that enable growth and trust in the digital media ecosystem.. Comprised of digital publishers, ad technology firms, agencies, marketers, and other member companies, IAB Tech Lab focuses on improving the digital advertising supply chain, measurement, and consumer experiences, while promoting responsible use of data. Its work includes the OpenRTB real-time bidding protocol, ads.txt anti-fraud specification, Open Measurement SDK for viewability and verification, VAST video specification, and DigiTrust identity service. Board members include ExtremeReach, Facebook, Google, GroupM, Hearst Digital Media, Index Exchange, Integral Ad Science, LinkedIn, LiveRamp, MediaMath, Microsoft, Oracle Data Cloud, Pandora, PubMatic, Quantcast, Rakuten Marketing, Telaria, The Trade Desk, Verizon Media Group, Xandr, and Yahoo! Japan. Established in 2014, the IAB Tech Lab is headquartered in New York City with staff in San Francisco, Seattle, and London. Learn more at <a href="https://www.iabtechlab.com" rel="nofollow">iabtechlab.com</a>.</p> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">About IAB Europe</h3><a id="user-content-about-iab-europe" class="anchor" aria-label="Permalink: About IAB Europe" href="#about-iab-europe"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">IAB Europe is the European-level association for the digital marketing and advertising ecosystem. Through its membership of National IABs and media, technology and marketing companies, its mission is to lead political representation and promote industry collaboration to deliver frameworks, standards and industry programmes that enable business to thrive in the European market.</p> <p dir="auto">Learn more about IAB Europe here: <a href="https://www.iabeurope.eu/" rel="nofollow">iabeurope.eu/</a></p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">CMP API v2.0</h2><a id="user-content-cmp-api-v20" class="anchor" aria-label="Permalink: CMP API v2.0" href="#cmp-api-v20"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">What does the CMP API support?</h3><a id="user-content-what-does-the-cmp-api-support" class="anchor" aria-label="Permalink: What does the CMP API support?" href="#what-does-the-cmp-api-support"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Consent Management Providers (CMPs) provide a user interface to establish transparency to users, and obtain consent or register objections from end users, and capture their preferences in Signals. These Signals are packaged in a standardized, easily-communicated payload called a TC String. The CMP API provides a standardized means for parties, such as the hosting publisher or an advertising vendor, to access these preferences managed by the CMP.</p> <p dir="auto">Using the API, scripts may obtain the TC String payload as well as the information it contains, which is ready to use without having to understand how to "unpack" the payload format. This makes it easy to make immediate data processing decisions based on the returned information.</p> <p dir="auto">CMPs may provide proprietary interfaces for specialised features or capabilities. The design and operation of a proprietary interface is documented in the IAB Europe Transparency and Consent Framework Policies.</p> <p dir="auto">This document specifies required functionality that the CMP must provide in accordance with the TCF. Any CMP functionality, including a publisher CMP or any UI and configuration, are provided by a designated CMP and using this CMP API. Other standardized APIs fall outside the TCF and may not be aligned to TCF policies.</p> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">What is the Global Vendor List?</h3><a id="user-content-what-is-the-global-vendor-list" class="anchor" aria-label="Permalink: What is the Global Vendor List?" href="#what-is-the-global-vendor-list"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">The Global Vendor List (GVL) is a technical document that CMPs download from a domain managed by IAB Europe. It lists all registered and approved Vendors, as well as standard Purposes, Features, Special Purposes, Special Features, Stacks and Data Categories used in conjunction with purposes. The information stored in the GVL is used for determining what legal disclosures must be made to the user. IAB Europe manages and publishes the GVL.</p> <p dir="auto">See the ‘The Global Vendor List’ section in the ‘Consent string and vendor list formats v2’ spec which describes the content and the use of the global vendor list in detail.</p> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">How does the CMP provide the API?</h3><a id="user-content-how-does-the-cmp-provide-the-api" class="anchor" aria-label="Permalink: How does the CMP provide the API?" href="#how-does-the-cmp-provide-the-api"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Every consent manager MUST provide the following API function:</p> <p dir="auto"><strong><code>__tcfapi(command, version, callback, parameter)</code></strong></p> <p dir="auto">The function <code>__tcfapi</code> <strong>must always be a function</strong> and cannot be any other type, even if only temporarily on initialization – the API must be able to handle calls at all times.</p> <p dir="auto">Secondarily, CMPs must provide a proxy for postMessage events targeted to the <code>__tcfapi</code> interface sent from within nested iframes. See <a href="#how-can-vendors-that-use-iframes-call-the-cmp-api-from-an-iframe">the section on iframes</a> for information.</p> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">What required API commands must a CMP support?</h3><a id="user-content-what-required-api-commands-must-a-cmp-support" class="anchor" aria-label="Permalink: What required API commands must a CMP support?" href="#what-required-api-commands-must-a-cmp-support"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">All CMPs must support three required API commands: <a href="#ping"><code>'ping'</code></a>, <a href="#addeventlistener"><code>'addEventListener'</code></a> and <a href="#removeeventlistener"><code>'removeEventListener'</code></a>.</p> <hr> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto"><code>getTCData</code></h4><a id="user-content-gettcdata" class="anchor" aria-label="Permalink: getTCData" href="#gettcdata"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Deprecated in TCF v2.2. Add an <a href="#addeventlistener"><code>'addEventListener'</code></a> and use its callback function to access the tcData object.</p> <hr> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto"><code>ping</code></h4><a id="user-content-ping" class="anchor" aria-label="Permalink: ping" href="#ping"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <markdown-accessiblity-table><table> <thead> <tr> <th align="right">argument name</th> <th align="center">type</th> <th align="left">value</th> </tr> </thead> <tbody> <tr> <td align="right">command</td> <td align="center">string</td> <td align="left"><code>'ping'</code></td> </tr> <tr> <td align="right"><a href="#how-does-the-version-parameter-work">version</a></td> <td align="center">number</td> <td align="left"><code>2</code></td> </tr> <tr> <td align="right">callback</td> <td align="center">function</td> <td align="left"><code>function(pingReturn: PingReturn)</code></td> </tr> </tbody> </table></markdown-accessiblity-table> <p dir="auto"><strong>Example:</strong></p> <div class="highlight highlight-source-js notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="__tcfapi('ping', 2, (pingReturn) => { // do something with pingReturn });"><pre><span class="pl-en">__tcfapi</span><span class="pl-kos">(</span><span class="pl-s">'ping'</span><span class="pl-kos">,</span> <span class="pl-c1">2</span><span class="pl-kos">,</span> <span class="pl-kos">(</span><span class="pl-s1">pingReturn</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-kos">{</span> <span class="pl-c">// do something with pingReturn</span> <span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">;</span></pre></div> <p dir="auto">The ping command invokes the callback immediately without any asynchronous logic and returns a <a href="#pingreturn"><code>PingReturn</code></a> object for determining whether or not the main CMP script has loaded yet and whether GDPR applies; therefore, the only command required to be on the page in a stub before the rest of the commands are implemented. See the section <a href="#what-does-the-gdprapplies-value-mean">"What does the gdprApplies value mean?"</a> for more.</p> <p dir="auto">The <code>callback</code> shall be invoked only once per api call with this command.</p> <hr> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto"><code>addEventListener</code></h4><a id="user-content-addeventlistener" class="anchor" aria-label="Permalink: addEventListener" href="#addeventlistener"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <markdown-accessiblity-table><table> <thead> <tr> <th align="right">argument name</th> <th align="center">type</th> <th align="left">value</th> </tr> </thead> <tbody> <tr> <td align="right">command</td> <td align="center">string</td> <td align="left"><code>'addEventListener'</code></td> </tr> <tr> <td align="right"><a href="#how-does-the-version-parameter-work">version</a></td> <td align="center">number</td> <td align="left"><code>2</code></td> </tr> <tr> <td align="right">callback</td> <td align="center">function</td> <td align="left"><code>function(tcData: TCData, success: boolean)</code></td> </tr> </tbody> </table></markdown-accessiblity-table> <p dir="auto"><strong>Example:</strong></p> <div class="highlight highlight-source-js notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="const callback = (tcData, success) => { if(success && tcData.eventStatus === 'tcloaded') { // do something with tcData.tcString } else { // do something else } } __tcfapi('addEventListener', 2, callback);"><pre><span class="pl-k">const</span> <span class="pl-en">callback</span> <span class="pl-c1">=</span> <span class="pl-kos">(</span><span class="pl-s1">tcData</span><span class="pl-kos">,</span> <span class="pl-s1">success</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-kos">{</span> <span class="pl-k">if</span><span class="pl-kos">(</span><span class="pl-s1">success</span> <span class="pl-c1">&&</span> <span class="pl-s1">tcData</span><span class="pl-kos">.</span><span class="pl-c1">eventStatus</span> <span class="pl-c1">===</span> <span class="pl-s">'tcloaded'</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> <span class="pl-c">// do something with tcData.tcString</span> <span class="pl-kos">}</span> <span class="pl-k">else</span> <span class="pl-kos">{</span> <span class="pl-c">// do something else</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span> <span class="pl-en">__tcfapi</span><span class="pl-kos">(</span><span class="pl-s">'addEventListener'</span><span class="pl-kos">,</span> <span class="pl-c1">2</span><span class="pl-kos">,</span> <span class="pl-en">callback</span><span class="pl-kos">)</span><span class="pl-kos">;</span></pre></div> <p dir="auto">Registers a callback function with a CMP (or a postmessage to respond to for cross-domain case). The callback will be invoked with the <a href="#tcdata"><code>TCData</code></a> object as an argument whenever the TC String is changed and a new one is available. The <a href="#tcdata"><code>TCData</code></a> object will contain CMP-assigned <code>listenerId</code> for the registered listener. The <a href="#addeventlistener"><code>eventStatus</code></a> property of the <a href="#tcdata"><code>TCData</code></a> object shall be one of the following:</p> <markdown-accessiblity-table><table> <thead> <tr> <th align="left">eventStatus</th> <th align="left">Description</th> </tr> </thead> <tbody> <tr> <td align="left"><code>'tcloaded'</code></td> <td align="left">This shall be the value for the <code>eventStatus</code> property of the <a href="#tcdata"><code>TCData</code></a> object when a CMP is loaded and is prepared to surface a TC String to any calling scripts on the page. A CMP is only prepared to surface a TC String for this <code>eventStatus</code> if an existing, <span>valid</span> TC String is available to the CMP and it is not intending to surface the UI. If, however, the CMP will surface the UI because of an invalid TC String (e.g. it is too old, incorrect or does not reflect all the information the CMP needs to gather from the user) then an event with this <code>eventStatus</code> must not be triggered.</td> </tr> <tr> <td align="left"><code>'cmpuishown'</code></td> <td align="left">This shall be the value for the <code>eventStatus</code> property of the <a href="#tcdata"><code>TCData</code></a> object any time the UI is surfaced or re-surfaced, a TC String is available and has rendered "Transparency" in accordance with the <a href="https://iabeurope.eu/iab-europe-transparency-consent-framework-policies/" rel="nofollow">TCF Policy</a>. The CMP shall create a TC string with all the surfaced vendors’ legitimate interest signals set to true and all the consent signals set to false. If previous TC signals are present a CMP may also merge those into the now-available TC String in accordance with the policy.</td> </tr> <tr> <td align="left"><code>'useractioncomplete'</code></td> <td align="left">This shall be the value for the <code>eventStatus</code> property of the <a href="#tcdata"><code>TCData</code></a> object whenever a user has confirmed or re-confirmed their choices in accordance with <a href="https://iabeurope.eu/iab-europe-transparency-consent-framework-policies/" rel="nofollow">TCF Policy</a> and a CMP is prepared to respond to any calling scripts with the corresponding TC String.</td> </tr> </tbody> </table></markdown-accessiblity-table> <p dir="auto">The CMP will, in most cases, invoke the callback when either the <code>'tcloaded'</code> OR <code>'cmpuishown'</code> + <code>'useractioncomplete'</code> <code>eventStatus</code>(s) occur, but never for all three <code>eventStatuses</code> within the same page view. However, if an existing and valid TC string is available and the CMP does not intend to to surface a UI automatically (<code>'tcloaded'</code>) but the user manually surfaces the UI and changes their selected choices (<code>'cmpuishown'</code> + <code>'useractioncomplete'</code>) all three <code>eventStatuses</code> would appear within the same page view.</p> <p dir="auto">The callback shall be invoked with <code>false</code> as the argument for the <code>success</code> parameter if the callback could not be registered as a listener for any reason.</p> <blockquote> <p dir="auto"><strong>Note</strong>: The <code>addEventListener</code> callback shall be immediately called upon registration with the current TC data, even if the CMP status is <code>loading</code> and the CMP has incomplete TC Data, so that the calling script may have access to its registered <code>listenerId</code>. Furthermore, on every TC String change the callback shall be called unless it is removed via <code>removeEventListener</code>.</p> </blockquote> <hr> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto"><code>removeEventListener</code></h4><a id="user-content-removeeventlistener" class="anchor" aria-label="Permalink: removeEventListener" href="#removeeventlistener"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <markdown-accessiblity-table><table> <thead> <tr> <th align="right">argument name</th> <th align="center">type</th> <th align="left">value</th> </tr> </thead> <tbody> <tr> <td align="right">command</td> <td align="center">string</td> <td align="left"><code>'removeEventListener'</code></td> </tr> <tr> <td align="right"><a href="#how-does-the-version-parameter-work">version</a></td> <td align="center">number</td> <td align="left"><code>2</code></td> </tr> <tr> <td align="right">callback</td> <td align="center">function</td> <td align="left"><code>function(success: boolean)</code></td> </tr> <tr> <td align="right">parameter</td> <td align="center">number</td> <td align="left"><code>listenerId</code>, the unique ID assigned by the CMP to the registered callback (via <code>addEventListener</code>)</td> </tr> </tbody> </table></markdown-accessiblity-table> <p dir="auto"><strong>Example:</strong> see <a href="#addeventlistener"><code>'addEventListener'</code></a></p> <p dir="auto">The callback shall be called with <code>false</code> as the argument for the <code>success</code> parameter if the listener could not be removed (e.g. the CMP cannot find a registered listener corresponding to <code>listenerId</code>).</p> <hr> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">What optional API commands might a CMP support?</h3><a id="user-content-what-optional-api-commands-might-a-cmp-support" class="anchor" aria-label="Permalink: What optional API commands might a CMP support?" href="#what-optional-api-commands-might-a-cmp-support"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">A CMP may choose to support two optional API commands: <a href="#getinapptcdata"><code>'getInAppTCData'</code></a> and <a href="#getvendorlist"><code>'getVendorList'</code></a>.</p> <hr> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto"><code>getInAppTCData</code></h4><a id="user-content-getinapptcdata" class="anchor" aria-label="Permalink: getInAppTCData" href="#getinapptcdata"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <markdown-accessiblity-table><table> <thead> <tr> <th align="right">argument name</th> <th align="center">type</th> <th align="left">value</th> </tr> </thead> <tbody> <tr> <td align="right">command</td> <td align="center">string</td> <td align="left"><code>'getInAppTCData'</code></td> </tr> <tr> <td align="right"><a href="#how-does-the-version-parameter-work">version</a></td> <td align="center">number</td> <td align="left"><code>2</code></td> </tr> <tr> <td align="right">callback</td> <td align="center">function</td> <td align="left"><code>function(inAppTCData: InAppTCData, success: boolean)</code></td> </tr> </tbody> </table></markdown-accessiblity-table> <p dir="auto"><strong>Example:</strong></p> <div class="highlight highlight-source-js notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="__tcfapi('getInAppTCData', 2, (inAppTCData, success) => { if(success) { // do something with inAppTCData } else { // do something else } });"><pre><span class="pl-en">__tcfapi</span><span class="pl-kos">(</span><span class="pl-s">'getInAppTCData'</span><span class="pl-kos">,</span> <span class="pl-c1">2</span><span class="pl-kos">,</span> <span class="pl-kos">(</span><span class="pl-s1">inAppTCData</span><span class="pl-kos">,</span> <span class="pl-s1">success</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-kos">{</span> <span class="pl-k">if</span><span class="pl-kos">(</span><span class="pl-s1">success</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> <span class="pl-c">// do something with inAppTCData</span> <span class="pl-kos">}</span> <span class="pl-k">else</span> <span class="pl-kos">{</span> <span class="pl-c">// do something else</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">;</span></pre></div> <p dir="auto">A mobile in-app CMP that uses a web-based UI in a mobile web view may choose to implement API calls with this command for the purpose of retrieving the TC String and pre-parsed TC signals from that web-based UI for the purpose of storing them in the <a href="https://developer.apple.com/documentation/foundation/nsuserdefaults#1664798?language=objc" rel="nofollow"><code>NSUserDefaults</code></a>(iOS) or <a href="https://developer.android.com/training/data-storage/shared-preferences.html" rel="nofollow"><code>SharedPreferences</code></a>(Android). (see <a href="#what-is-the-cmp-in-app-internal-structure-for-the-defined-api">What is the CMP in-app internal structure for the defined API?</a>)</p> <p dir="auto">The callback shall be invoked only once per api call with this command.</p> <hr> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto"><code>getVendorList</code></h4><a id="user-content-getvendorlist" class="anchor" aria-label="Permalink: getVendorList" href="#getvendorlist"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <markdown-accessiblity-table><table> <thead> <tr> <th align="right">argument name</th> <th align="center">type</th> <th align="center">optional</th> <th align="left">value</th> </tr> </thead> <tbody> <tr> <td align="right">command</td> <td align="center">string</td> <td align="center"></td> <td align="left"><code>'getVendorList'</code></td> </tr> <tr> <td align="right"><a href="#how-does-the-version-parameter-work">version</a></td> <td align="center">number</td> <td align="center"></td> <td align="left"><code>2</code></td> </tr> <tr> <td align="right">callback</td> <td align="center">function</td> <td align="center"></td> <td align="left"><code>function(gvl: GlobalVendorList, success: boolean)</code></td> </tr> <tr> <td align="right">parameter</td> <td align="center">int or string</td> <td align="center">✔️</td> <td align="left"><code>vendorListVersion</code></td> </tr> </tbody> </table></markdown-accessiblity-table> <p dir="auto"><strong>Example:</strong></p> <div class="highlight highlight-source-js notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="__tcfapi('getVendorList', 2, (gvl, success) => { if(success) { // do something with gvl } else { // do something else } }, 'LATEST');"><pre><span class="pl-en">__tcfapi</span><span class="pl-kos">(</span><span class="pl-s">'getVendorList'</span><span class="pl-kos">,</span> <span class="pl-c1">2</span><span class="pl-kos">,</span> <span class="pl-kos">(</span><span class="pl-s1">gvl</span><span class="pl-kos">,</span> <span class="pl-s1">success</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-kos">{</span> <span class="pl-k">if</span><span class="pl-kos">(</span><span class="pl-s1">success</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> <span class="pl-c">// do something with gvl</span> <span class="pl-kos">}</span> <span class="pl-k">else</span> <span class="pl-kos">{</span> <span class="pl-c">// do something else</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span><span class="pl-kos">,</span> <span class="pl-s">'LATEST'</span><span class="pl-kos">)</span><span class="pl-kos">;</span></pre></div> <p dir="auto">Calling with this command and a valid <code>vendorListVersion</code> parameter shall return a <code>GlobalVendorList</code> object to the <code>callback</code> function. The caller may specify a <a href="#what-is-the-global-vendor-list">Global Vendor List</a> version number with the <code>vendorListVersion</code> parameter. If no version is specified, the <a href="#what-is-the-global-vendor-list">Global Vendor List</a> version returned shall be the same as that which is encoded in the current TC String – If no TC String exists the latest version of the <a href="#what-is-the-global-vendor-list">Global Vendor List</a> shall be returned. The calling function may also pass <code>'LATEST'</code> as the argument to the <code>vendorListVersion</code> parameter to explicitly receive the latest <a href="#what-is-the-global-vendor-list">Global Vendor List</a> version as the <code>GlobalVendorList</code> object.</p> <p dir="auto">If an invalid <code>vendorListVersion</code> argument is passed with the <code>getVendorList</code> command the callback function shall receive a <code>null</code> argument for the <code>GlobalVendorList</code> parameter and the <code>success</code> parameter shall receive a <code>false</code> argument. Valid <code>vendorListVersion</code>s are integers (or integer strings) greater than <code>1</code>. The <code>success</code> parameter shall receive a <code>false</code> argument for any unsuccessful call with the <code>getVendorList</code> command. (eg. invalid <code>vendorListVersion</code> argument, network error, etc…)</p> <p dir="auto">The callback shall be invoked only once per api call with this command.</p> <hr> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">What objects are returned from the API?</h3><a id="user-content-what-objects-are-returned-from-the-api" class="anchor" aria-label="Permalink: What objects are returned from the API?" href="#what-objects-are-returned-from-the-api"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <hr> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto"><code>TCData</code></h4><a id="user-content-tcdata" class="anchor" aria-label="Permalink: TCData" href="#tcdata"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">This object contains both the encoded and unencoded values of the TC String as well as information about the CMP <code>eventStatus</code> and whether or not GDPR applies to this user in this context (see the section <a href="#what-does-the-gdprapplies-value-mean">"What does the gdprApplies value mean?"</a> for more). If GDPR does not apply to this user in this context then only <code>gdprApplies</code>, <code>tcfPolicyVersion</code>, <code>cmpId</code> and <code>cmpVersion</code> shall exist in the object. If it is unknown just yet whether GDPR Applies to this user in this context or if this is CMP Stub code then the <code>callback</code> shall not be invoked until that <code>gdprApplies</code> is known.</p> <div class="highlight highlight-source-js notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="TCData = { tcString: 'base64url-encoded TC string with segments', tcfPolicyVersion: 4, cmpId:1000, cmpVersion: 1000, /** * true - GDPR Applies * false - GDPR Does not apply * undefined - unknown whether GDPR Applies * see the section: "What does the gdprApplies value mean?" */ gdprApplies: Boolean | undefined, /* * see addEventListener command */ eventStatus: String, /** * see Ping Status Codes in following table */ cmpStatus: 'string', /** * If this TCData is sent to the callback of addEventListener: number, * the unique ID assigned by the CMP to the listener function registered * via addEventListener. * Others: undefined. */ listenerId: Number | undefined, /* * true - Default value * false - TC String is invalid. * since Sept 1st 2021, TC strings established with global-scope are considered invalid. * see the section: ["What happened to Global Scope and Out of Band?"](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/TCF-Implementation-Guidelines.md#gsoob) in "IAB Europe Transparency and Consent Framework Implementation Guidelines" */ isServiceSpecific: Boolean, /** * true - CMP is using publisher-customized stack descriptions and/or modified or supplemented standard Illustrations * false - CMP is NOT using publisher-customized stack descriptions and or modified or supplemented standard Illustrations */ useNonStandardTexts: Boolean, /** * Country code of the country that determines the legislation of * reference. Normally corresponds to the country code of the country * in which the publisher's business entity is established. */ publisherCC: 'Two-letter ISO 3166-1 alpha-2 code', /** * * true - Purpose 1 not disclosed at all. CMPs use PublisherCC to * indicate the publisher's country of establishment to help Vendors * determine whether the vendor requires Purpose 1 consent. * * false - There is no special Purpose 1 treatment status. Purpose 1 was * disclosed normally (consent) as expected by TCF Policy */ purposeOneTreatment: Boolean, purpose: { consents: { /** * true - Consent * false | undefined - No Consent. */ '[purpose id]': Boolean }, legitimateInterests: { /** * true - Legitimate Interest Established * false | undefined - No Legitimate Interest Established */ '[purpose id]': Boolean } }, vendor: { consents: { /** * true - Consent * false | undefined - No Consent */ '[vendor id]': Boolean }, legitimateInterests: { /** * true - Legitimate Interest Established * false | undefined - No Legitimate Interest Established */ '[vendor id]': Boolean } }, specialFeatureOptins: { /** * true - Special Feature Opted Into * false | undefined - Special Feature NOT Opted Into */ '[special feature id]': Boolean }, publisher: { consents: { /** * true - Consent * false | undefined - No Consent */ '[purpose id]': Boolean }, legitimateInterests: { /** * true - Legitimate Interest Established * false | undefined - No Legitimate Interest Established */ '[purpose id]': Boolean }, customPurpose: { consents: { /** * true - Consent * false | undefined - No Consent */ '[purpose id]': Boolean }, legitimateInterests: { /** * true - Legitimate Interest Established * false | undefined - No Legitimate Interest Established */ '[purpose id]': Boolean }, }, restrictions: { '[purpose id]': { /** * 0 - Not Allowed * 1 - Require Consent * 2 - Require Legitimate Interest */ '[vendor id]': 1 } } } }"><pre><span class="pl-v">TCData</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span> <span class="pl-c1">tcString</span>: <span class="pl-s">'base64url-encoded TC string with segments'</span><span class="pl-kos">,</span> <span class="pl-c1">tcfPolicyVersion</span>: <span class="pl-c1">4</span><span class="pl-kos">,</span> <span class="pl-c1">cmpId</span>:<span class="pl-c1">1000</span><span class="pl-kos">,</span> <span class="pl-c1">cmpVersion</span>: <span class="pl-c1">1000</span><span class="pl-kos">,</span> <span class="pl-c">/**</span> <span class="pl-c"> * true - GDPR Applies</span> <span class="pl-c"> * false - GDPR Does not apply</span> <span class="pl-c"> * undefined - unknown whether GDPR Applies</span> <span class="pl-c"> * see the section: "What does the gdprApplies value mean?"</span> <span class="pl-c"> */</span> <span class="pl-c1">gdprApplies</span>: <span class="pl-v">Boolean</span> <span class="pl-c1">|</span> <span class="pl-c1">undefined</span><span class="pl-kos">,</span> <span class="pl-c">/*</span> <span class="pl-c"> * see addEventListener command</span> <span class="pl-c"> */</span> <span class="pl-c1">eventStatus</span>: <span class="pl-v">String</span><span class="pl-kos">,</span> <span class="pl-c">/**</span> <span class="pl-c"> * see Ping Status Codes in following table</span> <span class="pl-c"> */</span> <span class="pl-c1">cmpStatus</span>: <span class="pl-s">'string'</span><span class="pl-kos">,</span> <span class="pl-c">/**</span> <span class="pl-c"> * If this TCData is sent to the callback of addEventListener: number,</span> <span class="pl-c"> * the unique ID assigned by the CMP to the listener function registered</span> <span class="pl-c"> * via addEventListener.</span> <span class="pl-c"> * Others: undefined.</span> <span class="pl-c"> */</span> <span class="pl-c1">listenerId</span>: <span class="pl-v">Number</span> <span class="pl-c1">|</span> <span class="pl-c1">undefined</span><span class="pl-kos">,</span> <span class="pl-c">/*</span> <span class="pl-c"> * true - Default value</span> <span class="pl-c"> * false - TC String is invalid.</span> <span class="pl-c"> * since Sept 1st 2021, TC strings established with global-scope are considered invalid.</span> <span class="pl-c"> * see the section: ["What happened to Global Scope and Out of Band?"](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/TCF-Implementation-Guidelines.md#gsoob) in "IAB Europe Transparency and Consent Framework Implementation Guidelines"</span> <span class="pl-c"> */</span> <span class="pl-c1">isServiceSpecific</span>: <span class="pl-v">Boolean</span><span class="pl-kos">,</span> <span class="pl-c">/**</span> <span class="pl-c"> * true - CMP is using publisher-customized stack descriptions and/or modified or supplemented standard Illustrations</span> <span class="pl-c"> * false - CMP is NOT using publisher-customized stack descriptions and or modified or supplemented standard Illustrations</span> <span class="pl-c"> */</span> <span class="pl-c1">useNonStandardTexts</span>: <span class="pl-v">Boolean</span><span class="pl-kos">,</span> <span class="pl-c">/**</span> <span class="pl-c"> * Country code of the country that determines the legislation of</span> <span class="pl-c"> * reference. Normally corresponds to the country code of the country</span> <span class="pl-c"> * in which the publisher's business entity is established.</span> <span class="pl-c"> */</span> <span class="pl-c1">publisherCC</span>: <span class="pl-s">'Two-letter ISO 3166-1 alpha-2 code'</span><span class="pl-kos">,</span> <span class="pl-c">/**</span> <span class="pl-c"> *</span> <span class="pl-c"> * true - Purpose 1 not disclosed at all. CMPs use PublisherCC to</span> <span class="pl-c"> * indicate the publisher's country of establishment to help Vendors</span> <span class="pl-c"> * determine whether the vendor requires Purpose 1 consent.</span> <span class="pl-c"> *</span> <span class="pl-c"> * false - There is no special Purpose 1 treatment status. Purpose 1 was</span> <span class="pl-c"> * disclosed normally (consent) as expected by TCF Policy</span> <span class="pl-c"> */</span> <span class="pl-c1">purposeOneTreatment</span>: <span class="pl-v">Boolean</span><span class="pl-kos">,</span> <span class="pl-c1">purpose</span>: <span class="pl-kos">{</span> <span class="pl-c1">consents</span>: <span class="pl-kos">{</span> <span class="pl-c">/**</span> <span class="pl-c"> * true - Consent</span> <span class="pl-c"> * false | undefined - No Consent.</span> <span class="pl-c"> */</span> <span class="pl-s">'[purpose id]'</span>: <span class="pl-v">Boolean</span> <span class="pl-kos">}</span><span class="pl-kos">,</span> <span class="pl-c1">legitimateInterests</span>: <span class="pl-kos">{</span> <span class="pl-c">/**</span> <span class="pl-c"> * true - Legitimate Interest Established</span> <span class="pl-c"> * false | undefined - No Legitimate Interest Established</span> <span class="pl-c"> */</span> <span class="pl-s">'[purpose id]'</span>: <span class="pl-v">Boolean</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span><span class="pl-kos">,</span> <span class="pl-c1">vendor</span>: <span class="pl-kos">{</span> <span class="pl-c1">consents</span>: <span class="pl-kos">{</span> <span class="pl-c">/**</span> <span class="pl-c"> * true - Consent</span> <span class="pl-c"> * false | undefined - No Consent</span> <span class="pl-c"> */</span> <span class="pl-s">'[vendor id]'</span>: <span class="pl-v">Boolean</span> <span class="pl-kos">}</span><span class="pl-kos">,</span> <span class="pl-c1">legitimateInterests</span>: <span class="pl-kos">{</span> <span class="pl-c">/**</span> <span class="pl-c"> * true - Legitimate Interest Established</span> <span class="pl-c"> * false | undefined - No Legitimate Interest Established</span> <span class="pl-c"> */</span> <span class="pl-s">'[vendor id]'</span>: <span class="pl-v">Boolean</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span><span class="pl-kos">,</span> <span class="pl-c1">specialFeatureOptins</span>: <span class="pl-kos">{</span> <span class="pl-c">/**</span> <span class="pl-c"> * true - Special Feature Opted Into</span> <span class="pl-c"> * false | undefined - Special Feature NOT Opted Into</span> <span class="pl-c"> */</span> <span class="pl-s">'[special feature id]'</span>: <span class="pl-v">Boolean</span> <span class="pl-kos">}</span><span class="pl-kos">,</span> <span class="pl-c1">publisher</span>: <span class="pl-kos">{</span> <span class="pl-c1">consents</span>: <span class="pl-kos">{</span> <span class="pl-c">/**</span> <span class="pl-c"> * true - Consent</span> <span class="pl-c"> * false | undefined - No Consent</span> <span class="pl-c"> */</span> <span class="pl-s">'[purpose id]'</span>: <span class="pl-v">Boolean</span> <span class="pl-kos">}</span><span class="pl-kos">,</span> <span class="pl-c1">legitimateInterests</span>: <span class="pl-kos">{</span> <span class="pl-c">/**</span> <span class="pl-c"> * true - Legitimate Interest Established</span> <span class="pl-c"> * false | undefined - No Legitimate Interest Established</span> <span class="pl-c"> */</span> <span class="pl-s">'[purpose id]'</span>: <span class="pl-v">Boolean</span> <span class="pl-kos">}</span><span class="pl-kos">,</span> <span class="pl-c1">customPurpose</span>: <span class="pl-kos">{</span> <span class="pl-c1">consents</span>: <span class="pl-kos">{</span> <span class="pl-c">/**</span> <span class="pl-c"> * true - Consent</span> <span class="pl-c"> * false | undefined - No Consent</span> <span class="pl-c"> */</span> <span class="pl-s">'[purpose id]'</span>: <span class="pl-v">Boolean</span> <span class="pl-kos">}</span><span class="pl-kos">,</span> <span class="pl-c1">legitimateInterests</span>: <span class="pl-kos">{</span> <span class="pl-c">/**</span> <span class="pl-c"> * true - Legitimate Interest Established</span> <span class="pl-c"> * false | undefined - No Legitimate Interest Established</span> <span class="pl-c"> */</span> <span class="pl-s">'[purpose id]'</span>: <span class="pl-v">Boolean</span> <span class="pl-kos">}</span><span class="pl-kos">,</span> <span class="pl-kos">}</span><span class="pl-kos">,</span> <span class="pl-c1">restrictions</span>: <span class="pl-kos">{</span> <span class="pl-s">'[purpose id]'</span>: <span class="pl-kos">{</span> <span class="pl-c">/**</span> <span class="pl-c"> * 0 - Not Allowed</span> <span class="pl-c"> * 1 - Require Consent</span> <span class="pl-c"> * 2 - Require Legitimate Interest</span> <span class="pl-c"> */</span> <span class="pl-s">'[vendor id]'</span>: <span class="pl-c1">1</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span></pre></div> <hr> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto"><code>PingReturn</code></h4><a id="user-content-pingreturn" class="anchor" aria-label="Permalink: PingReturn" href="#pingreturn"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">This object contains information about the loading status and configuration of the CMP.</p> <div class="highlight highlight-source-js notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="PingReturn = { /** * true - GDPR Applies * false - GDPR Does not apply * undefined - unknown whether GDPR Applies * see the section: "What does the gdprApplies value mean?" */ gdprApplies: Boolean | undefined, /** * true - CMP main script is loaded * false - still running stub */ cmpLoaded: Boolean, /** * see Ping Status Codes in following table */ cmpStatus: String, /** * see Ping Status Codes in following table */ displayStatus: String, /** * version of the CMP API that is supported, e.g. "2.0" */ apiVersion: String, /** * CMPs own/internal version that is currently running * undefined if still the stub */ cmpVersion: Number | undefined, /** * IAB Assigned CMP ID * undefined if still the stub */ cmpId: Number | undefined, /** * Version of the GVL currently loaded by the CMP * undefined if still the stub */ gvlVersion: Number | undefined, /** * Number of the supported TCF version * undefined if still the stub */ tcfPolicyVersion: Number | undefined, };"><pre><span class="pl-v">PingReturn</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span> <span class="pl-c">/**</span> <span class="pl-c"> * true - GDPR Applies</span> <span class="pl-c"> * false - GDPR Does not apply</span> <span class="pl-c"> * undefined - unknown whether GDPR Applies</span> <span class="pl-c"> * see the section: "What does the gdprApplies value mean?"</span> <span class="pl-c"> */</span> <span class="pl-c1">gdprApplies</span>: <span class="pl-v">Boolean</span> <span class="pl-c1">|</span> <span class="pl-c1">undefined</span><span class="pl-kos">,</span> <span class="pl-c">/**</span> <span class="pl-c"> * true - CMP main script is loaded</span> <span class="pl-c"> * false - still running stub</span> <span class="pl-c"> */</span> <span class="pl-c1">cmpLoaded</span>: <span class="pl-v">Boolean</span><span class="pl-kos">,</span> <span class="pl-c">/**</span> <span class="pl-c"> * see Ping Status Codes in following table</span> <span class="pl-c"> */</span> <span class="pl-c1">cmpStatus</span>: <span class="pl-v">String</span><span class="pl-kos">,</span> <span class="pl-c">/**</span> <span class="pl-c"> * see Ping Status Codes in following table</span> <span class="pl-c"> */</span> <span class="pl-c1">displayStatus</span>: <span class="pl-v">String</span><span class="pl-kos">,</span> <span class="pl-c">/**</span> <span class="pl-c"> * version of the CMP API that is supported, e.g. "2.0"</span> <span class="pl-c"> */</span> <span class="pl-c1">apiVersion</span>: <span class="pl-v">String</span><span class="pl-kos">,</span> <span class="pl-c">/**</span> <span class="pl-c"> * CMPs own/internal version that is currently running</span> <span class="pl-c"> * undefined if still the stub</span> <span class="pl-c"> */</span> <span class="pl-c1">cmpVersion</span>: <span class="pl-v">Number</span> <span class="pl-c1">|</span> <span class="pl-c1">undefined</span><span class="pl-kos">,</span> <span class="pl-c">/**</span> <span class="pl-c"> * IAB Assigned CMP ID</span> <span class="pl-c"> * undefined if still the stub</span> <span class="pl-c"> */</span> <span class="pl-c1">cmpId</span>: <span class="pl-v">Number</span> <span class="pl-c1">|</span> <span class="pl-c1">undefined</span><span class="pl-kos">,</span> <span class="pl-c">/**</span> <span class="pl-c"> * Version of the GVL currently loaded by the CMP</span> <span class="pl-c"> * undefined if still the stub</span> <span class="pl-c"> */</span> <span class="pl-c1">gvlVersion</span>: <span class="pl-v">Number</span> <span class="pl-c1">|</span> <span class="pl-c1">undefined</span><span class="pl-kos">,</span> <span class="pl-c">/**</span> <span class="pl-c"> * Number of the supported TCF version</span> <span class="pl-c"> * undefined if still the stub</span> <span class="pl-c"> */</span> <span class="pl-c1">tcfPolicyVersion</span>: <span class="pl-v">Number</span> <span class="pl-c1">|</span> <span class="pl-c1">undefined</span><span class="pl-kos">,</span> <span class="pl-kos">}</span><span class="pl-kos">;</span></pre></div> <p dir="auto"><strong>Note:</strong> <code>cmpLoaded</code> must be set to <code>true</code> if the main script is loaded and the stub interface is replaced, regardless of whether or not the user will see the UI or interact with it.</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Ping Status Codes</h4><a id="user-content-ping-status-codes" class="anchor" aria-label="Permalink: Ping Status Codes" href="#ping-status-codes"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <markdown-accessiblity-table><table> <thead> <tr> <th align="left">Status Code</th> <th align="left">Applicable for</th> <th align="left">Description</th> </tr> </thead> <tbody> <tr> <td align="left"><code>'stub'</code></td> <td align="left">cmpStatus</td> <td align="left">CMP not yet loaded – stub still in place</td> </tr> <tr> <td align="left"><code>'loading'</code></td> <td align="left">cmpStatus</td> <td align="left">DEPRECATED (this status is not distinct and will be removed in a future version)</td> </tr> <tr> <td align="left"><code>'loaded'</code></td> <td align="left">cmpStatus</td> <td align="left">CMP is finished loading</td> </tr> <tr> <td align="left"><code>'error'</code></td> <td align="left">cmpStatus</td> <td align="left">CMP is in an error state. A CMP shall not respond to any other API requests if this cmpStatus is present. A CMP may set this status if, for any reason, it is unable to perform the operations in compliance with the TCF.</td> </tr> <tr> <td align="left"><code>'visible'</code></td> <td align="left">displayStatus</td> <td align="left">User interface is currently displayed</td> </tr> <tr> <td align="left"><code>'hidden'</code></td> <td align="left">displayStatus</td> <td align="left">User interface is not yet or no longer displayed</td> </tr> <tr> <td align="left"><code>'disabled'</code></td> <td align="left">displayStatus</td> <td align="left">User interface will not show (e.g. GDPR does not apply or TC data is current and does not need renewal)</td> </tr> </tbody> </table></markdown-accessiblity-table> <hr> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto"><code>InAppTCData</code></h4><a id="user-content-inapptcdata" class="anchor" aria-label="Permalink: InAppTCData" href="#inapptcdata"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <div class="highlight highlight-source-js notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="InAppTCData = { tcString: 'base64url-encoded TC string with segments', tcfPolicyVersion: 2, cmpId:1000, cmpVersion: 1000, /** * 1 - GDPR Applies * 0 - GDPR Does not apply * undefined - unknown whether GDPR applies * see the section: "What does the gdprApplies value mean?" */ gdprApplies: 1, /* * see addEventListener command */ eventStatus: 'string', /* * 1 - Default value * 0 - TC String is invalid. * since Sept 1st 2021, TC strings established with global-scope are considered invalid. * see the section: ["What happened to Global Scope and Out of Band?"](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/TCF-Implementation-Guidelines.md#gsoob) in "IAB Europe Transparency and Consent Framework Implementation Guidelines" */ isServiceSpecific: 1, /** * 1 - CMP is using publisher-customized stack descriptions and/or modified or supplemented standard Illustrations * 0 - CMP is NOT using publisher-customized stack descriptions and/or modified or supplemented standard Illustrations */ useNonStandardTexts: 1, /** * Country code of the country that determines the legislation of * reference. Normally corresponds to the country code of the country * in which the publisher's business entity is established. */ publisherCC: 'Two-letter ISO 3166-1 alpha-2 code', /** * 1 - Purpose 1 not disclosed at all. CMPs use PublisherCC to indicate * the publisher's country of establishment to help vVendors determine * whether the vendor requires Purpose 1 consent. * * 0 - There is no special Purpose 1 treatment status. Purpose 1 was * disclosed normally (consent) as expected by TCF Policy. */ purposeOneTreatment: 1, purpose: { /** * 1 - Consent * 0 | undefined - No Consent */ consents: '01010 -- Purpose bitfield', /** * 1 - Legitimate Interest Established * 0 | undefined - No Legitimate Interest Established */ legitimateInterests: '01010 -- Purpose bitfield' }, vendor: { /** * 1 - Consent * 0 | undefined - No Consent */ consents: '01010 -- Vendor bitfield', /** * 1 - Legitimate Interest Established * 0 | undefined - No Legitimate Interest Established */ legitimateInterests: '01010 -- Vendor bitfield' }, /** * 1 - Special Feature Opted Into * 0 | undefined - Special Feature NOT Opted Into */ specialFeatureOptins: '01010 -- Special Feature bitfield', publisher: { /** * 1 - Consent * 0 | undefined - No Consent */ consents: '01010 -- Purpose bitfield', /** * 1 - Legitimate Interest Established * 0 | undefined - No Legitimate Interest Established */ legitimateInterests: '01010 -- Purpose bitfield', customPurpose: { /** * 1 - Consent * 0 | undefined - No Consent */ consents: '01010 -- Purpose bitfield', /** * 1 - Legitimate Interest Established * 0 | undefined - No Legitimate Interest Established */ legitimateInterests: '01010 -- Purpose bitfield' }, restrictions: { /** * 0 - Not Allowed * 1 - Require Consent * 2 - Require Legitimate Interest * _ - No Restriction (maintains indexing) * * each position represents vendor id and number represents restriction * type 0-2 */ '[purpose id]': '01201221' } } }"><pre><span class="pl-v">InAppTCData</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span> <span class="pl-c1">tcString</span>: <span class="pl-s">'base64url-encoded TC string with segments'</span><span class="pl-kos">,</span> <span class="pl-c1">tcfPolicyVersion</span>: <span class="pl-c1">2</span><span class="pl-kos">,</span> <span class="pl-c1">cmpId</span>:<span class="pl-c1">1000</span><span class="pl-kos">,</span> <span class="pl-c1">cmpVersion</span>: <span class="pl-c1">1000</span><span class="pl-kos">,</span> <span class="pl-c">/**</span> <span class="pl-c"> * 1 - GDPR Applies</span> <span class="pl-c"> * 0 - GDPR Does not apply</span> <span class="pl-c"> * undefined - unknown whether GDPR applies</span> <span class="pl-c"> * see the section: "What does the gdprApplies value mean?"</span> <span class="pl-c"> */</span> <span class="pl-c1">gdprApplies</span>: <span class="pl-c1">1</span><span class="pl-kos">,</span> <span class="pl-c">/*</span> <span class="pl-c"> * see addEventListener command</span> <span class="pl-c"> */</span> <span class="pl-c1">eventStatus</span>: <span class="pl-s">'string'</span><span class="pl-kos">,</span> <span class="pl-c">/*</span> <span class="pl-c"> * 1 - Default value</span> <span class="pl-c"> * 0 - TC String is invalid.</span> <span class="pl-c"> * since Sept 1st 2021, TC strings established with global-scope are considered invalid.</span> <span class="pl-c"> * see the section: ["What happened to Global Scope and Out of Band?"](https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/TCF-Implementation-Guidelines.md#gsoob) in "IAB Europe Transparency and Consent Framework Implementation Guidelines"</span> <span class="pl-c"> */</span> <span class="pl-c1">isServiceSpecific</span>: <span class="pl-c1">1</span><span class="pl-kos">,</span> <span class="pl-c">/**</span> <span class="pl-c"> * 1 - CMP is using publisher-customized stack descriptions and/or modified or supplemented standard Illustrations</span> <span class="pl-c"> * 0 - CMP is NOT using publisher-customized stack descriptions and/or modified or supplemented standard Illustrations</span> <span class="pl-c"> */</span> <span class="pl-c1">useNonStandardTexts</span>: <span class="pl-c1">1</span><span class="pl-kos">,</span> <span class="pl-c">/**</span> <span class="pl-c"> * Country code of the country that determines the legislation of</span> <span class="pl-c"> * reference. Normally corresponds to the country code of the country</span> <span class="pl-c"> * in which the publisher's business entity is established.</span> <span class="pl-c"> */</span> <span class="pl-c1">publisherCC</span>: <span class="pl-s">'Two-letter ISO 3166-1 alpha-2 code'</span><span class="pl-kos">,</span> <span class="pl-c">/**</span> <span class="pl-c"> * 1 - Purpose 1 not disclosed at all. CMPs use PublisherCC to indicate</span> <span class="pl-c"> * the publisher's country of establishment to help vVendors determine</span> <span class="pl-c"> * whether the vendor requires Purpose 1 consent.</span> <span class="pl-c"> *</span> <span class="pl-c"> * 0 - There is no special Purpose 1 treatment status. Purpose 1 was</span> <span class="pl-c"> * disclosed normally (consent) as expected by TCF Policy.</span> <span class="pl-c"> */</span> <span class="pl-c1">purposeOneTreatment</span>: <span class="pl-c1">1</span><span class="pl-kos">,</span> <span class="pl-c1">purpose</span>: <span class="pl-kos">{</span> <span class="pl-c">/**</span> <span class="pl-c"> * 1 - Consent</span> <span class="pl-c"> * 0 | undefined - No Consent</span> <span class="pl-c"> */</span> <span class="pl-c1">consents</span>: <span class="pl-s">'01010 -- Purpose bitfield'</span><span class="pl-kos">,</span> <span class="pl-c">/**</span> <span class="pl-c"> * 1 - Legitimate Interest Established</span> <span class="pl-c"> * 0 | undefined - No Legitimate Interest Established</span> <span class="pl-c"> */</span> <span class="pl-c1">legitimateInterests</span>: <span class="pl-s">'01010 -- Purpose bitfield'</span> <span class="pl-kos">}</span><span class="pl-kos">,</span> <span class="pl-c1">vendor</span>: <span class="pl-kos">{</span> <span class="pl-c">/**</span> <span class="pl-c"> * 1 - Consent</span> <span class="pl-c"> * 0 | undefined - No Consent</span> <span class="pl-c"> */</span> <span class="pl-c1">consents</span>: <span class="pl-s">'01010 -- Vendor bitfield'</span><span class="pl-kos">,</span> <span class="pl-c">/**</span> <span class="pl-c"> * 1 - Legitimate Interest Established</span> <span class="pl-c"> * 0 | undefined - No Legitimate Interest Established</span> <span class="pl-c"> */</span> <span class="pl-c1">legitimateInterests</span>: <span class="pl-s">'01010 -- Vendor bitfield'</span> <span class="pl-kos">}</span><span class="pl-kos">,</span> <span class="pl-c">/**</span> <span class="pl-c"> * 1 - Special Feature Opted Into</span> <span class="pl-c"> * 0 | undefined - Special Feature NOT Opted Into</span> <span class="pl-c"> */</span> <span class="pl-c1">specialFeatureOptins</span>: <span class="pl-s">'01010 -- Special Feature bitfield'</span><span class="pl-kos">,</span> <span class="pl-c1">publisher</span>: <span class="pl-kos">{</span> <span class="pl-c">/**</span> <span class="pl-c"> * 1 - Consent</span> <span class="pl-c"> * 0 | undefined - No Consent</span> <span class="pl-c"> */</span> <span class="pl-c1">consents</span>: <span class="pl-s">'01010 -- Purpose bitfield'</span><span class="pl-kos">,</span> <span class="pl-c">/**</span> <span class="pl-c"> * 1 - Legitimate Interest Established</span> <span class="pl-c"> * 0 | undefined - No Legitimate Interest Established</span> <span class="pl-c"> */</span> <span class="pl-c1">legitimateInterests</span>: <span class="pl-s">'01010 -- Purpose bitfield'</span><span class="pl-kos">,</span> <span class="pl-c1">customPurpose</span>: <span class="pl-kos">{</span> <span class="pl-c">/**</span> <span class="pl-c"> * 1 - Consent</span> <span class="pl-c"> * 0 | undefined - No Consent</span> <span class="pl-c"> */</span> <span class="pl-c1">consents</span>: <span class="pl-s">'01010 -- Purpose bitfield'</span><span class="pl-kos">,</span> <span class="pl-c">/**</span> <span class="pl-c"> * 1 - Legitimate Interest Established</span> <span class="pl-c"> * 0 | undefined - No Legitimate Interest Established</span> <span class="pl-c"> */</span> <span class="pl-c1">legitimateInterests</span>: <span class="pl-s">'01010 -- Purpose bitfield'</span> <span class="pl-kos">}</span><span class="pl-kos">,</span> <span class="pl-c1">restrictions</span>: <span class="pl-kos">{</span> <span class="pl-c">/**</span> <span class="pl-c"> * 0 - Not Allowed</span> <span class="pl-c"> * 1 - Require Consent</span> <span class="pl-c"> * 2 - Require Legitimate Interest</span> <span class="pl-c"> * _ - No Restriction (maintains indexing)</span> <span class="pl-c"> *</span> <span class="pl-c"> * each position represents vendor id and number represents restriction</span> <span class="pl-c"> * type 0-2</span> <span class="pl-c"> */</span> <span class="pl-s">'[purpose id]'</span>: <span class="pl-s">'01201221'</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span></pre></div> <hr> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">In-App Details</h3><a id="user-content-in-app-details" class="anchor" aria-label="Permalink: In-App Details" href="#in-app-details"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">How is a CMP used in-app?</h4><a id="user-content-how-is-a-cmp-used-in-app" class="anchor" aria-label="Permalink: How is a CMP used in-app?" href="#how-is-a-cmp-used-in-app"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">The steps for integrating a CMP SDK into an app are the following:</p> <ol dir="auto"> <li>An app publisher should embed a CMP SDK – The setup and configuration as well as the protocol for how to initialize the CMP SDK are all proprietary to each CMP SDK.</li> <li>Since more than one CMP SDK may be included in publishers' linked SDKs, the publisher must initialize only one of them. The initialized CMP shall set <code>IABTCF_CmpSdkID</code> with its ID as soon as it is initialized in the app to signal to vendors that a CMP is present.</li> <li>The CMP SDK will determine if GDPR applies (see the section <a href="#what-does-the-gdprapplies-value-mean">"What does the gdprApplies value mean?"</a>) to this user in this context. But, a publisher may choose to initialize a CMP dialogue UI manually.</li> <li>The CMP shall set the <a href="https://developer.apple.com/documentation/foundation/nsuserdefaults#1664798?language=objc" rel="nofollow"><code>NSUserDefaults</code></a>(iOS) or <a href="https://developer.android.com/training/data-storage/shared-preferences.html" rel="nofollow"><code>SharedPreferences</code></a>(Android) variables and vendors will then be able to read from them directly.</li> <li>Vendors should listen to <code>IABTCF_* </code>key updates to retrieve new TC data from <a href="https://developer.apple.com/documentation/foundation/nsuserdefaults#1664798?language=objc" rel="nofollow"><code>NSUserDefaults</code></a>(iOS) or <a href="https://developer.android.com/training/data-storage/shared-preferences.html" rel="nofollow"><code>SharedPreferences</code></a>(Android).</li> </ol> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">What is the CMP in-app internal structure for the defined API?</h4><a id="user-content-what-is-the-cmp-in-app-internal-structure-for-the-defined-api" class="anchor" aria-label="Permalink: What is the CMP in-app internal structure for the defined API?" href="#what-is-the-cmp-in-app-internal-structure-for-the-defined-api"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"><a href="https://developer.apple.com/documentation/foundation/nsuserdefaults#1664798?language=objc" rel="nofollow"><code>NSUserDefaults</code></a>(iOS) or <a href="https://developer.android.com/training/data-storage/shared-preferences.html" rel="nofollow"><code>SharedPreferences</code></a>(Android) shall be used to store pre-parsed TC data as well as the TC string by a CMP SDK. It allows:</p> <ul dir="auto"> <li>Vendors to easily access TC data</li> <li>TC data to persist across app sessions</li> <li>TC data to be portable between CMPs to provide flexibility for a publisher to exchange one CMP SDK for another</li> <li>Vendors within an app to avoid code duplication by not being required to include a TC string decoder while still enabling all typical use cases</li> </ul> <p dir="auto"><strong>Note:</strong> If a publisher chooses to remove a CMP SDK from their app they are responsible for clearing all <code>IABTCF_*</code> vestigial values for users so that vendors do not continue to use the TC data therein.</p> <p dir="auto"><a href="https://developer.apple.com/documentation/foundation/nsuserdefaults#1664798?language=objc" rel="nofollow"><code>NSUserDefaults</code></a>(iOS) or <a href="https://developer.android.com/training/data-storage/shared-preferences.html" rel="nofollow"><code>SharedPreferences</code></a>(Android) values</p> <markdown-accessiblity-table><table> <thead> <tr> <th align="left">Key</th> <th align="left">Value(s)</th> </tr> </thead> <tbody> <tr> <td align="left"><code>IABTCF_CmpSdkID</code></td> <td align="left"><code>Number</code>: The unsigned integer ID of CMP SDK</td> </tr> <tr> <td align="left"><code>IABTCF_CmpSdkVersion</code></td> <td align="left"><code>Number</code>: The unsigned integer version number of CMP SDK</td> </tr> <tr> <td align="left"><code>IABTCF_PolicyVersion</code></td> <td align="left"><code>Number</code>: The unsigned integer representing the version of the TCF that these consents adhere to.</td> </tr> <tr> <td align="left"><code>IABTCF_gdprApplies</code></td> <td align="left"><code>Number</code>: <p dir="auto"><code>1</code> GDPR applies in current context</p><p dir="auto"><code>0</code> - GDPR does <em><strong>not</strong></em> apply in current context</p><p dir="auto"><strong>Unset</strong> - undetermined (default before initialization)</p><p dir="auto">see the section <a href="#what-does-the-gdprapplies-value-mean">"What does the gdprApplies value mean?"</a> for more</p></td> </tr> <tr> <td align="left"><code>IABTCF_PublisherCC</code></td> <td align="left"><code>String</code>: <a href="https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2" rel="nofollow">Two-letter ISO 3166-1 alpha-2 code</a> – Default: <code>AA</code> (unknown)</td> </tr> <tr> <td align="left"><code>IABTCF_PurposeOneTreatment</code></td> <td align="left"><code>Number</code>: <p dir="auto"><code>0</code> - no special treatment of purpose one</p><p dir="auto"><code>1</code> - purpose one not disclosed</p><p dir="auto"><strong>Unset default</strong> - <code>0</code></p><p dir="auto">Vendors can use this value to determine whether consent for purpose one is required.</p></td> </tr> <tr> <td align="left"><code>IABTCF_UseNonStandardTexts</code></td> <td align="left"><code>Number</code>: <p dir="auto"><code>1</code> - CMP uses customized stack descriptions and/or modified or supplemented standard Illustrations</p><p dir="auto"><code>0</code> - CMP did not use a non-standard stack desc. and/or modified or supplemented Illustrations</p></td> </tr> <tr> <td align="left"><code>IABTCF_TCString</code></td> <td align="left"><code>String</code>: Full encoded TC string</td> </tr> <tr> <td align="left"><code>IABTCF_VendorConsents</code></td> <td align="left"><code>Binary String</code>: The <code>'0'</code> or <code>'1'</code> at position <strong>n</strong> – where <strong>n</strong>'s indexing begins at <code>0</code> – indicates the consent status for Vendor ID <strong>n+1</strong>; <code>false</code> and <code>true</code> respectively. eg. <code>'1'</code> at index <code>0</code> is consent <code>true</code> for vendor ID <code>1</code></td> </tr> <tr> <td align="left"><code>IABTCF_VendorLegitimateInterests</code></td> <td align="left"><code>Binary String</code>: The <code>'0'</code> or <code>'1'</code> at position <strong>n</strong> – where <strong>n</strong>'s indexing begins at <code>0</code> – indicates the legitimate interest status for Vendor ID <strong>n+1</strong>; <code>false</code> and <code>true</code> respectively. eg. <code>'1'</code> at index <code>0</code> is legitimate interest established <code>true</code> for vendor ID <code>1</code></td> </tr> <tr> <td align="left"><code>IABTCF_PurposeConsents</code></td> <td align="left"><code>Binary String</code>: The <code>'0'</code> or <code>'1'</code> at position <strong>n</strong> – where <strong>n</strong>'s indexing begins at <code>0</code> – indicates the consent status for purpose ID <strong>n+1</strong>; <code>false</code> and <code>true</code> respectively. eg. <code>'1'</code> at index <code>0</code> is consent <code>true</code> for purpose ID <code>1</code></td> </tr> <tr> <td align="left"><code>IABTCF_PurposeLegitimateInterests</code></td> <td align="left"><code>Binary String</code>: The <code>'0'</code> or <code>'1'</code> at position <strong>n</strong> – where <strong>n</strong>'s indexing begins at <code>0</code> – indicates the legitimate interest status for purpose ID <strong>n+1</strong>; <code>false</code> and <code>true</code> respectively. eg. <code>'1'</code> at index <code>0</code> is legitimate interest established <code>true</code> for purpose ID <code>1</code></td> </tr> <tr> <td align="left"><code>IABTCF_SpecialFeaturesOptIns</code></td> <td align="left"><code>Binary String</code>: The <code>'0'</code> or <code>'1'</code> at position <strong>n</strong> – where <strong>n</strong>'s indexing begins at <code>0</code> – indicates the opt-in status for special feature ID <strong>n+1</strong>; <code>false</code> and <code>true</code> respectively. eg. <code>'1'</code> at index <code>0</code> is opt-in <code>true</code> for special feature ID <code>1</code></td> </tr> <tr> <td align="left"><code>IABTCF_PublisherRestrictions{ID}</code></td> <td align="left"><code>String ['0','1', or '2']</code>: The value at position <strong>n</strong> – where <strong>n</strong>'s indexing begins at <code>0</code> – indicates the publisher restriction type (0-2) for vendor <strong>n+1</strong>; (see Publisher Restrictions Types). eg. <code>'2'</code> at index <code>0</code> is restrictionType <code>2</code> for vendor ID <code>1</code>. <code>{ID}</code> refers to the purpose ID.</td> </tr> <tr> <td align="left"><code>IABTCF_PublisherConsent</code></td> <td align="left"><code>Binary String</code>: The <code>'0'</code> or <code>'1'</code> at position <strong>n</strong> – where <strong>n</strong>'s indexing begins at <code>0</code> – indicates the purpose consent status for purpose ID <strong>n+1</strong> for the publisher as they correspond to the <a href="#what-is-the-global-vendor-list">Global Vendor List</a> Purposes; <code>false</code> and <code>true</code> respectively. eg. <code>'1'</code> at index <code>0</code> is consent <code>true</code> for purpose ID <code>1</code></td> </tr> <tr> <td align="left"><code>IABTCF_PublisherLegitimateInterests</code></td> <td align="left"><code>Binary String</code>: The <code>'0'</code> or <code>'1'</code> at position <strong>n</strong> – where <strong>n</strong>'s indexing begins at <code>0</code> – indicates the purpose legitimate interest status for purpose ID <strong>n+1</strong> for the publisher as they correspond to the <a href="#what-is-the-global-vendor-list">Global Vendor List</a> Purposes; <code>false</code> and <code>true</code> respectively. eg. <code>'1'</code> at index <code>0</code> is legitimate interest established <code>true</code> for purpose ID <code>1</code></td> </tr> <tr> <td align="left"><code>IABTCF_PublisherCustomPurposesConsents</code></td> <td align="left"><code>Binary String</code>: The <code>'0'</code> or <code>'1'</code> at position <strong>n</strong> – where <strong>n</strong>'s indexing begins at <code>0</code> – indicates the purpose consent status for the publisher's custom purpose ID <strong>n+1</strong> for the publisher; <code>false</code> and <code>true</code> respectively. eg. <code>'1'</code> at index <code>0</code> is consent <code>true</code> for custom purpose ID <code>1</code></td> </tr> <tr> <td align="left"><code>IABTCF_PublisherCustomPurposesLegitimateInterests</code></td> <td align="left"><code>Binary String</code>: The <code>'0'</code> or <code>'1'</code> at position <strong>n</strong> – where <strong>n</strong>'s indexing begins at <code>0</code> – indicates the purpose legitimate interest status for the publisher's custom purpose ID <strong>n+1</strong> for the publisher; <code>false</code> and <code>true</code> respectively. eg. <code>'1'</code> at index <code>0</code> is legitimate interest established <code>true</code> for custom purpose ID <code>1</code></td> </tr> </tbody> </table></markdown-accessiblity-table> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">How do third-party SDKs (vendors) access the consent information in-app?</h4><a id="user-content-how-do-third-party-sdks-vendors-access-the-consent-information-in-app" class="anchor" aria-label="Permalink: How do third-party SDKs (vendors) access the consent information in-app?" href="#how-do-third-party-sdks-vendors-access-the-consent-information-in-app"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">On both Android OS and iOS, the vendor can get notified when the values of the shared keys change. See <a href="https://developer.apple.com/documentation/foundation/nsuserdefaultsdidchangenotification?language=objc" rel="nofollow">NSUserDefaultsDidChangeNotification</a> and <a href="https://developer.android.com/reference/android/content/SharedPreferences.OnSharedPreferenceChangeListener.html" rel="nofollow">SharedPreferences.OnSharedPreferenceChangeListener</a>.</p> <p dir="auto">On Android OS, the TC data and TC string shall be stored in the default Shared Preferences for the application context. This can be accessed using the <code>getDefaultSharedPreferences</code> method from the <code>android.preference.PreferenceManager</code> class using the application context.</p> <p dir="auto"><strong>Example</strong>:</p> <div class="highlight highlight-source-java notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="Context mContext = getApplicationContext(); SharedPreferences mPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);"><pre><span class="pl-smi">Context</span> <span class="pl-s1">mContext</span> = <span class="pl-en">getApplicationContext</span>(); <span class="pl-smi">SharedPreferences</span> <span class="pl-s1">mPreferences</span> = <span class="pl-smi">PreferenceManager</span>.<span class="pl-en">getDefaultSharedPreferences</span>(<span class="pl-s1">mContext</span>);</pre></div> <p dir="auto">The TC data values can be retrieved from the application Shared Preferences by key name using the <code>get</code> methods on the <code>android.content.SharedPreferences</code> class. For the purposes of accessing TC data, only two methods should be necessary: <code>getString(String key, String defValue)</code> for <code>String</code> values and <code>getInt(String key, int defValue)</code> for <code>integer</code>s and <code>integer</code> representations of <code>Boolean</code> values.</p> <p dir="auto"><strong>Example</strong>:</p> <div class="highlight highlight-source-java notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="Context mContext = getApplicationContext(); SharedPreferences mPreferences = PreferenceManager.getDefaultSharedPreferences(mContext); String consentString = mPreferences.getString("IABTCF_TCString", ""); int gdprApplies = mPreferences.getInt("IABTCF_gdprApplies", 0);"><pre><span class="pl-smi">Context</span> <span class="pl-s1">mContext</span> = <span class="pl-en">getApplicationContext</span>(); <span class="pl-smi">SharedPreferences</span> <span class="pl-s1">mPreferences</span> = <span class="pl-smi">PreferenceManager</span>.<span class="pl-en">getDefaultSharedPreferences</span>(<span class="pl-s1">mContext</span>); <span class="pl-smi">String</span> <span class="pl-s1">consentString</span> = <span class="pl-s1">mPreferences</span>.<span class="pl-en">getString</span>(<span class="pl-s">"IABTCF_TCString"</span>, <span class="pl-s">""</span>); <span class="pl-smi">int</span> <span class="pl-s1">gdprApplies</span> = <span class="pl-s1">mPreferences</span>.<span class="pl-en">getInt</span>(<span class="pl-s">"IABTCF_gdprApplies"</span>, <span class="pl-c1">0</span>);</pre></div> <p dir="auto">A callback can be registered to update settings when a preference is changed using the <code>registerOnSharedPreferenceChangeListener</code> method for the <code>android.content.SharedPreferences</code> class.</p> <p dir="auto"><strong>Note</strong>: The preference manager does not currently store a strong reference to the listener. If you do not store a strong reference, the listener will be susceptible to garbage collection. External guidance such as this <a href="https://developer.android.com/guide/topics/ui/settings#Listening" rel="nofollow">documentation on setting listeners</a> may provide more information on listening for preference changes.</p> <p dir="auto"><strong>Example</strong>:</p> <div class="highlight highlight-source-java notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="Context mContext = getApplicationContext(); SharedPreferences mPreferences = PreferenceManager.getDefaultSharedPreferences(mContext); SharedPreferences.OnSharedPreferenceChangeListener mListener; mListener = new SharedPreferences.OnSharedPreferenceChangeListener() { public void onSharedPreferenceChanged(SharedPreferences preferences, String key) { if (key.equals([Specific Consent Key])) { // Update Consent settings } } }; mPreferences.registerOnSharedPreferenceChangeListener(mListener);"><pre><span class="pl-smi">Context</span> <span class="pl-s1">mContext</span> = <span class="pl-en">getApplicationContext</span>(); <span class="pl-smi">SharedPreferences</span> <span class="pl-s1">mPreferences</span> = <span class="pl-smi">PreferenceManager</span>.<span class="pl-en">getDefaultSharedPreferences</span>(<span class="pl-s1">mContext</span>); <span class="pl-smi">SharedPreferences</span>.<span class="pl-smi">OnSharedPreferenceChangeListener</span> <span class="pl-s1">mListener</span>; <span class="pl-s1">mListener</span> = <span class="pl-k">new</span> <span class="pl-smi">SharedPreferences</span>.<span class="pl-smi">OnSharedPreferenceChangeListener</span>() { <span class="pl-k">public</span> <span class="pl-smi">void</span> <span class="pl-en">onSharedPreferenceChanged</span>(<span class="pl-smi">SharedPreferences</span> <span class="pl-s1">preferences</span>, <span class="pl-smi">String</span> <span class="pl-s1">key</span>) { <span class="pl-k">if</span> (<span class="pl-s1">key</span>.<span class="pl-s1">equals</span>([<span class="pl-smi">Specific</span> <span class="pl-s1">Consent</span> <span class="pl-s1">Key</span>])) { <span class="pl-c">// Update Consent settings</span> } } }; <span class="pl-s1">mPreferences</span>.<span class="pl-en">registerOnSharedPreferenceChangeListener</span>(<span class="pl-s1">mListener</span>);</pre></div> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">How does ad mediation work in-app?</h4><a id="user-content-how-does-ad-mediation-work-in-app" class="anchor" aria-label="Permalink: How does ad mediation work in-app?" href="#how-does-ad-mediation-work-in-app"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Mediation SDK allows app developers to monetize from multiple vendors.</p> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">Mediation SDK</h5><a id="user-content-mediation-sdk" class="anchor" aria-label="Permalink: Mediation SDK" href="#mediation-sdk"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li>Mediation SDK retrieves <code>IABTCF_gdprApplies</code> and <code>IABTCF_TCString</code> from <a href="https://developer.apple.com/documentation/foundation/nsuserdefaults#1664798?language=objc" rel="nofollow"><code>NSUserDefaults</code></a>(iOS) or <a href="https://developer.android.com/training/data-storage/shared-preferences.html" rel="nofollow"><code>SharedPreferences</code></a>(Android).</li> <li>If <code>IABTCF_gdprApplies == 0</code>, Mediation SDK can run mediation across all ad network SDKs.</li> <li>If <code>IABTCF_gdprApplies == 1</code>, Mediation SDK will run mediation only among the ad network SDKs that are GDPR ready.</li> </ul> <p dir="auto">'GDPR ready' means that the vendor retrieves <code>IABTCF_gdprApplies</code> and <code>IABTCF_TCString</code> from <a href="https://developer.apple.com/documentation/foundation/nsuserdefaults#1664798?language=objc" rel="nofollow"><code>NSUserDefaults</code></a>(iOS) or <a href="https://developer.android.com/training/data-storage/shared-preferences.html" rel="nofollow"><code>SharedPreferences</code></a>(Android), and passes on these GDPR values downstream.</p> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">Vendor</h5><a id="user-content-vendor" class="anchor" aria-label="Permalink: Vendor" href="#vendor"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li>Vendor retrieves <code>IABTCF_gdprApplies</code> and <code>IABTCF_TCString</code> from <a href="https://developer.apple.com/documentation/foundation/nsuserdefaults#1664798?language=objc" rel="nofollow"><code>NSUserDefaults</code></a>(iOS) or <a href="https://developer.android.com/training/data-storage/shared-preferences.html" rel="nofollow"><code>SharedPreferences</code></a>(Android), and passes on these GDPR values downstream.</li> </ul> <hr> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">CTV Details</h3><a id="user-content-ctv-details" class="anchor" aria-label="Permalink: CTV Details" href="#ctv-details"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">How is a CMP used in the CTV context?</h4><a id="user-content-how-is-a-cmp-used-in-the-ctv-context" class="anchor" aria-label="Permalink: How is a CMP used in the CTV context?" href="#how-is-a-cmp-used-in-the-ctv-context"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">The context of the CTV application will determine the storage locations and naming of the TCF data.</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Web Runtime</h4><a id="user-content-web-runtime" class="anchor" aria-label="Permalink: Web Runtime" href="#web-runtime"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Applications running in a web runtime environment that supports, at minimum, the Web Storage (Second Edition) specification shall follow all storage and naming conventions detailed in the <a href="https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md#what-required-api-commands-must-a-cmp-support">Javascript</a> section of this spec. Data is to be retrieved using the commands, offering a consistent interface for Vendors to access TC string information.</p> <p dir="auto">Should data not persist in Web Storage beyond the lifecycle of the application (application close, standby, or device shutdown), all data storage and naming conventions are to follow the specifications outlined in the CTV Native Private Storage section of this spec.</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Native</h4><a id="user-content-native" class="anchor" aria-label="Permalink: Native" href="#native"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Native CTV applications should support both Global Privacy Platform (GPP) section key names as well as TCF key names by following the naming conventions of Global Privacy Platform (GPP) data and string outlined in the <a href="https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/main/Sections/EEA/GPPExtension%3A%20IAB%20Europe%20TCF.md#key-names">TCF EU Section spec</a> and the TCF naming conventions outlined for in-app usage <a href="#what-is-the-cmp-in-app-internal-structure-for-the-defined-api">above</a>. Data is to be limited to the context of the Application and inaccessible to external applications.</p> <p dir="auto"><i>Application Preferences (Registry)</i></p> <p dir="auto">Application Preferences, also referred to as a Registry in certain CTV environments, shall be used in a Native CTV Application environment under the condition that the TC data and TC String fit within the device constraints. Private Storage is to be used if the TC data and TC String do not fit within the device constraints</p> <p dir="auto"><i>Private Storage</i></p> <p dir="auto">Private Storage shall be used under the condition that the CTV environment does not offer a Web Runtime that supports the Web Storage (Second Edition) specification, data does not persist beyond the lifecycle of the Application, or offer an Application Preferences (Registry) interface. The TC data and TC String are to be saved in a standardized and private storage space. Files are to follow the same naming convention as the key names detailed in the <a href="https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/main/Sections/EEA/GPPExtension%3A%20IAB%20Europe%20TCF.md#key-names">TCF EU Section spec</a> and the key names outlined for in-app usage <a href="#what-is-the-cmp-in-app-internal-structure-for-the-defined-api">above</a> with the contents being the value of the corresponding key. Note: CTV Applications require proper permission scopes to be configured to read and write to the virtual Application file system.</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">CTV Examples</h4><a id="user-content-ctv-examples" class="anchor" aria-label="Permalink: CTV Examples" href="#ctv-examples"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"><strong>Android TV</strong></p> <div class="highlight highlight-source-java notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="// Option 1 public void setTCString(String tcString) { SharedPreferences.Editor editor = sharedPrefs.edit(); // TCF spec editor.putString("IABTCF_TCString", tcString); // GPP spec editor.putString("IABGPP_2_TCString", tcString); editor.commit(); } // Option 2 public void setTCString(String tcString) { SharedPreferences.Editor editor = sharedPrefs.edit(); editor.putString("IABTCF_TCString", tcString); editor.commit(); } public void setTCStringForGpp(String tcString) { SharedPreferences.Editor editor = sharedPrefs.edit(); editor.putString("IABGPP_2_TCString", tcString); editor.commit(); }"><pre><span class="pl-c">// Option 1</span> <span class="pl-k">public</span> <span class="pl-smi">void</span> <span class="pl-s1">setTCString</span>(<span class="pl-smi">String</span> <span class="pl-s1">tcString</span>) { <span class="pl-smi">SharedPreferences</span>.<span class="pl-smi">Editor</span> <span class="pl-s1">editor</span> = <span class="pl-s1">sharedPrefs</span>.<span class="pl-en">edit</span>(); <span class="pl-c">// TCF spec</span> <span class="pl-s1">editor</span>.<span class="pl-en">putString</span>(<span class="pl-s">"IABTCF_TCString"</span>, <span class="pl-s1">tcString</span>); <span class="pl-c">// GPP spec</span> <span class="pl-s1">editor</span>.<span class="pl-en">putString</span>(<span class="pl-s">"IABGPP_2_TCString"</span>, <span class="pl-s1">tcString</span>); <span class="pl-s1">editor</span>.<span class="pl-en">commit</span>(); } <span class="pl-c">// Option 2</span> <span class="pl-k">public</span> <span class="pl-smi">void</span> <span class="pl-s1">setTCString</span>(<span class="pl-smi">String</span> <span class="pl-s1">tcString</span>) { <span class="pl-smi">SharedPreferences</span>.<span class="pl-smi">Editor</span> <span class="pl-s1">editor</span> = <span class="pl-s1">sharedPrefs</span>.<span class="pl-en">edit</span>(); <span class="pl-s1">editor</span>.<span class="pl-en">putString</span>(<span class="pl-s">"IABTCF_TCString"</span>, <span class="pl-s1">tcString</span>); <span class="pl-s1">editor</span>.<span class="pl-en">commit</span>(); } <span class="pl-k">public</span> <span class="pl-smi">void</span> <span class="pl-s1">setTCStringForGpp</span>(<span class="pl-smi">String</span> <span class="pl-s1">tcString</span>) { <span class="pl-smi">SharedPreferences</span>.<span class="pl-smi">Editor</span> <span class="pl-s1">editor</span> = <span class="pl-s1">sharedPrefs</span>.<span class="pl-en">edit</span>(); <span class="pl-s1">editor</span>.<span class="pl-en">putString</span>(<span class="pl-s">"IABGPP_2_TCString"</span>, <span class="pl-s1">tcString</span>); <span class="pl-s1">editor</span>.<span class="pl-en">commit</span>(); }</pre></div> <p dir="auto"><strong>Apple TV</strong></p> <div class="highlight highlight-source-java notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="// Option 1 - (void)setTcString:(NSString *)tcString { NSUserDefaults *userDefaults = NSUserDefaults.standardUserDefaults; // TCF spec [userDefaults setObject:tcString forKey:@"IABTCF_TCString"]; // GPP spec [userDefaults setObject:tcString forKey:@"IABGPP_2_TCString"]; } // Option 2 - (void)setTcString:(NSString *)tcString[INSERT] { NSUserDefaults *userDefaults = NSUserDefaults.standardUserDefaults; [userDefaults setObject:tcString forKey:@"IABTCF_TCString"]; } - (void)setTcStringForGpp:(NSString *)tcString[INSERT] { NSUserDefaults *userDefaults = NSUserDefaults.standardUserDefaults; [userDefaults setObject:tcString forKey:@"IABGPP_2_TCString"];"><pre><span class="pl-c">// Option 1</span> - (<span class="pl-smi">void</span>)<span class="pl-s1">setTcString</span>:(<span class="pl-s1">NSString</span> *)<span class="pl-s1">tcString</span> { <span class="pl-s1">NSUserDefaults</span> *<span class="pl-s1">userDefaults</span> = <span class="pl-smi">NSUserDefaults</span>.<span class="pl-s1">standardUserDefaults</span>; <span class="pl-c">// TCF spec</span> [<span class="pl-smi">userDefaults</span> <span class="pl-s1">setObject</span>:<span class="pl-s1">tcString</span> <span class="pl-s1">forKey</span>:<span class="pl-c1">@</span><span class="pl-s">"IABTCF_TCString"</span>]; <span class="pl-c">// GPP spec</span> [<span class="pl-smi">userDefaults</span> <span class="pl-s1">setObject</span>:<span class="pl-s1">tcString</span> <span class="pl-s1">forKey</span>:<span class="pl-c1">@</span><span class="pl-s">"IABGPP_2_TCString"</span>]; } <span class="pl-c">// Option 2</span> - (<span class="pl-smi">void</span>)<span class="pl-s1">setTcString</span>:(<span class="pl-s1">NSString</span> *)<span class="pl-s1">tcString</span>[<span class="pl-c1">INSERT</span>] { <span class="pl-s1">NSUserDefaults</span> *<span class="pl-s1">userDefaults</span> = <span class="pl-smi">NSUserDefaults</span>.<span class="pl-s1">standardUserDefaults</span>; [<span class="pl-smi">userDefaults</span> <span class="pl-s1">setObject</span>:<span class="pl-s1">tcString</span> <span class="pl-s1">forKey</span>:<span class="pl-c1">@</span><span class="pl-s">"IABTCF_TCString"</span>]; } - (<span class="pl-smi">void</span>)<span class="pl-s1">setTcStringForGpp</span>:(<span class="pl-s1">NSString</span> *)<span class="pl-s1">tcString</span>[<span class="pl-c1">INSERT</span>] { <span class="pl-s1">NSUserDefaults</span> *<span class="pl-s1">userDefaults</span> = <span class="pl-smi">NSUserDefaults</span>.<span class="pl-s1">standardUserDefaults</span>; [<span class="pl-smi">userDefaults</span> <span class="pl-s1">setObject</span>:<span class="pl-s1">tcString</span> <span class="pl-s1">forKey</span>:<span class="pl-c1">@</span><span class="pl-s">"IABGPP_2_TCString"</span>];</pre></div> <p dir="auto"><strong>Roku <a href="https://developer.roku.com/docs/references/brightscript/components/roregistrysection.md" rel="nofollow">Reference</a></strong></p> <div class="highlight highlight-source-java notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="Function SetTcfData(tcString As String) As Void sec = CreateObject("roRegistrySection", "TCF") sec.Write("IABTCF_TCString", tcString) sec.Flush() End Function Function SetGppData(tcString As String) As Void sec = CreateObject("roRegistrySection", "GPP") sec.Write("IABGPP_2_TCString", tcString) sec.Flush() End Function"><pre><span class="pl-smi">Function</span> <span class="pl-s1">SetTcfData</span>(<span class="pl-smi">tcString</span> <span class="pl-s1">As</span> <span class="pl-s1">String</span>) <span class="pl-s1">As</span> <span class="pl-smi">Void</span> <span class="pl-s1">sec</span> = <span class="pl-en">CreateObject</span>(<span class="pl-s">"roRegistrySection"</span>, <span class="pl-s">"TCF"</span>) <span class="pl-s1">sec</span>.<span class="pl-en">Write</span>(<span class="pl-s">"IABTCF_TCString"</span>, <span class="pl-s1">tcString</span>) <span class="pl-s1">sec</span>.<span class="pl-en">Flush</span>() <span class="pl-smi">End</span> <span class="pl-s1">Function</span> <span class="pl-smi">Function</span> <span class="pl-s1">SetGppData</span>(<span class="pl-smi">tcString</span> <span class="pl-s1">As</span> <span class="pl-s1">String</span>) <span class="pl-s1">As</span> <span class="pl-smi">Void</span> <span class="pl-s1">sec</span> = <span class="pl-en">CreateObject</span>(<span class="pl-s">"roRegistrySection"</span>, <span class="pl-s">"GPP"</span>) <span class="pl-s1">sec</span>.<span class="pl-en">Write</span>(<span class="pl-s">"IABGPP_2_TCString"</span>, <span class="pl-s1">tcString</span>) <span class="pl-s1">sec</span>.<span class="pl-en">Flush</span>() <span class="pl-smi">End</span> <span class="pl-s1">Function</span></pre></div> <hr> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Using the CMP API</h2><a id="user-content-using-the-cmp-api" class="anchor" aria-label="Permalink: Using the CMP API" href="#using-the-cmp-api"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">The following details provide information about how ad tags work, using the version parameter in the <code>__tcfapi()</code> function, and how vendors can interact with the API.</p> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">How do ad tags work?</h3><a id="user-content-how-do-ad-tags-work" class="anchor" aria-label="Permalink: How do ad tags work?" href="#how-do-ad-tags-work"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Tag-based demand, especially ad tags, are basically creative files, that are not an advertisement themselves, but are loaded to access additional sources to provide ad creative.</p> <p dir="auto">For performance reasons, the preferred way to make this happen in current ad servers are macros. The following two macros are recommended for ad server implementation:</p> <markdown-accessiblity-table><table> <thead> <tr> <th align="left">Macro</th> <th align="left">Values</th> </tr> </thead> <tbody> <tr> <td align="left"><code>${GDPR}</code></td> <td align="left"><p dir="auto"><strong>1</strong> - GDPR Applies</p><p dir="auto"><strong>0</strong> - GDPR does not apply</p><p dir="auto"><strong>unset</strong> - unknown</p></td> </tr> <tr> <td align="left"><code>${GDPR_CONSENT_XXXX}</code></td> <td align="left">Encoded TC String where XXXX is the numeric Vendor ID of the vendor receiving the TC string.</td> </tr> </tbody> </table></markdown-accessiblity-table> <p dir="auto"><strong>Note</strong>: Values align with IAB OpenRTB GDPR Advisory</p> <p dir="auto"><strong>Note</strong>: For more information on GDPR Applies see the section <a href="#what-does-the-gdprapplies-value-mean">"What does the gdprApplies value mean?"</a></p> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">How does the "version" parameter work?</h3><a id="user-content-how-does-the-version-parameter-work" class="anchor" aria-label="Permalink: How does the "version" parameter work?" href="#how-does-the-version-parameter-work"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">The <code>Version</code> parameter of the API is used to enable scripts to specify what version of the API they are prepared to handle. The CMP shall respond in kind with the appropriately versioned information, if available.</p> <p dir="auto">If the argument is <code>0</code> (Zero), <code>null</code> or <code>undefined</code>, the CMP shall return the information for the latest (highest) version available. For example, when a user has a v2 TC string and a v3 TC string, the CMP should return the v3 TC string and TC data.</p> <p dir="auto">If the argument is invalid (i.e. not a positive integer greater than <code>1</code> or higher than the highest supported version for this CMP) the CMP shall invoke the callback with an argument of <code>false</code> for the success parameter and a <code>null</code> argument for any expected TC data parameter.</p> <p dir="auto">If the argument is <code>1</code>, the CMP shall invoke the callback with an argument of <code>false</code> for the success parameter and a <code>null</code> argument for any expected TC data parameter, as this TCF version is no longer supported by this API.</p> <p dir="auto">If the argument is an integer higher than <code>1</code>, the CMP shall invoke the callback with defined data according to the specified version if it exists in that version. For obvious reasons, if new properties of the version-specific outlined TC data objects are added in v3, a v2 TC data object shall not contain these new properties because they may either not exist or may have different meaning from version to version.</p> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">What does the gdprApplies value mean?</h3><a id="user-content-what-does-the-gdprapplies-value-mean" class="anchor" aria-label="Permalink: What does the gdprApplies value mean?" href="#what-does-the-gdprapplies-value-mean"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"><code>gdprApplies</code> is a <code>boolean</code> value that may be <code>undefined</code>. A CMP shall determine whether or not GDPR applies in its current context and set the <code>gdprApplies</code> value. A publisher may determine that GDPR applies to all traffic on their site and signal their CMP to always return <code>true</code> for <code>gdprApplies</code>, a CMP may invoke a geo-tagging service call to make a determination on a specific user or may have some other proprietary solution for determining whether or not GDPR applies in accordance with <a href="https://iabeurope.eu/iab-europe-transparency-consent-framework-policies/" rel="nofollow">TCF Policy</a>. In any case, vendors shall respect the value of <code>gdprApplies</code> put forth by the CMP. If <code>gdprApplies</code> value is <code>undefined</code> but exists in the schema outlined in the response object in this document, then calling scripts shall assume that the CMP is still pending a determination on whether or not GDPR applies in this context. Note: For mobile all booleans are written as <code>Number</code> (integer).</p> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Details for vendors</h3><a id="user-content-details-for-vendors" class="anchor" aria-label="Permalink: Details for vendors" href="#details-for-vendors"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">How can scripts on a page determine if there is a CMP present?</h4><a id="user-content-how-can-scripts-on-a-page-determine-if-there-is-a-cmp-present" class="anchor" aria-label="Permalink: How can scripts on a page determine if there is a CMP present?" href="#how-can-scripts-on-a-page-determine-if-there-is-a-cmp-present"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Scripts can check for the presence of a function named <code>__tcfapi</code> – if it exists then a CMP can be assumed to be present for scripts. In iframes, the presence of a CMP can be determined by the existence of a specially-named iframe named <code>"__tcfapiLocator"</code> in the parent (or above) frame. The CMP shall create an iframe as a signal to scripts nested in other iframes that a CMP exists in a higher frame and name it <code>"__tcfapiLocator"</code> on the current <code>DOM</code> to indicate its own presence; since iframe properties can be accessed from other iframes. Publishers must load the CMP in a parent (or ancestor) of all iframes that may need to establish a GDPR legal basis.</p> <p dir="auto">If a CMP is not present, or if the CMP fails to respond, vendors should assume "no consent" and “no legitimate interest transparency established” in contexts where GDPR applies (see the section <a href="#what-does-the-gdprapplies-value-mean">"What does the gdprApplies value mean?"</a> for more).</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">How can scripts determine if the CMP script is loaded yet?</h4><a id="user-content-how-can-scripts-determine-if-the-cmp-script-is-loaded-yet" class="anchor" aria-label="Permalink: How can scripts determine if the CMP script is loaded yet?" href="#how-can-scripts-determine-if-the-cmp-script-is-loaded-yet"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Typically, scripts will not need to check if the CMP script is loaded. Scripts can simply call the <code>__tcfapi</code> function as it will queue the calls for execution when the full CMP script is loaded. If the full CMP has been loaded, its <code>__tcfapi</code> implementation will handle the call normally. If necessary, the <a href="#ping"><code>'ping'</code></a> command will return a <a href="#pingreturn"><code>PingReturn</code></a> object that contains the <code>boolean</code> property <code>cmpLoaded</code> to indicate whether the cmp is loaded.</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">How does the CMP "stub" API work?</h4><a id="user-content-how-does-the-cmp-stub-api-work" class="anchor" aria-label="Permalink: How does the CMP "stub" API work?" href="#how-does-the-cmp-stub-api-work"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ol dir="auto"> <li>A CMP-provided synchronous "stub" script must be added by the publisher to their page before any other scripts that rely on <code>__tcfapi</code> (this usually means between the <code><head></head></code> tags of the HTML document).</li> <li>This "stub" will: <ol dir="auto"> <li>Define a queuing function named <code>__tcfapi</code> at the <code>Window</code> scope.</li> <li>All arguments for a given call to the stubbed <code>__tcfapi</code> method will be enqueued as a set.</li> <li>Define the postMessage handler function for cross-origin iframe requests.</li> <li>Add the newly-created <code>postMessage</code> handler function as an event listener on the <code>Window</code> object listening for the <code>‘message’</code> event.</li> <li>Create an iframe named <code>'__tcfapiLocator'</code> in the current DOM.</li> </ol> </li> <li>When the main CMP implementation script loads and executes, it will: <ol dir="auto"> <li>Create an internal reference to the queued argument sets of the "stub".</li> <li>Redefine the <code>__tcfapi</code> function to the CMP’s full API implementation.</li> <li>Iterate and dequeue the queued argument sets in a first-in-first-out (FIFO) order and <code>apply</code> each set of arguments to the fully-implemented <code>__tcfapi</code> function.</li> </ol> </li> </ol> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Requirements for the CMP "stub" API script</h4><a id="user-content-requirements-for-the-cmp-stub-api-script" class="anchor" aria-label="Permalink: Requirements for the CMP "stub" API script" href="#requirements-for-the-cmp-stub-api-script"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">A CMP must provide stub script to its clients that at least supports the following features/logic:</p> <ol dir="auto"> <li><code>__tcfapi</code> function that supports the ping command, with the minimum properties of <code>cmpLoaded</code> and <code>apiVersion</code>. <strong>Note</strong>: <code>gdprApplies</code> may also be set in the <a href="#pingreturn"><code>PingReturn</code></a> object if the "stub" is set by the publisher to apply GDPR to all traffic. However, <code>gdprApplies</code> may not be available until the CMP is finished loading and the value will, therefore, be <code>undefined</code>. See the section <a href="#what-does-the-gdprapplies-value-mean">"What does the gdprApplies value mean?"</a> for more.</li> <li>Collect all calls to <code>__tcfapi</code> that cannot (yet) be handled by the “stub” in a queue</li> <li>Check if <code>window.frames['__tcfapiLocator']</code> exists, indicating that a CMP is already present, otherwise create an empty iframe named <code>'__tcfapiLocator'</code> in the current DOM.</li> <li>Create an event listener for <code>postMessage</code> events on the <code>Window</code> object. When the event handler function receives a postMessage (<code>‘message’</code>) event it shall proxy the <code>__tcfapi</code> function requests to send the response back through the <code>postMessage</code> event channel</li> <li>The stub code must be loaded and executed synchronously before any other scripts that depend on the <code>__tcfapi</code> function to be there – this usually means between the <code><head></head></code> tags of the HTML document – in order to ensure that it can be executed before all calls from third parties.</li> </ol> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Is there a sample CMP “stub” API script?</h4><a id="user-content-is-there-a-sample-cmp-stub-api-script" class="anchor" aria-label="Permalink: Is there a sample CMP “stub” API script?" href="#is-there-a-sample-cmp-stub-api-script"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">You can find an iab-supported open-source implementation of the stub API here: <a href="https://github.com/InteractiveAdvertisingBureau/iabtcf-es/blob/master/modules/stub/">https://github.com/InteractiveAdvertisingBureau/iabtcf-es/blob/master/modules/stub/</a></p> <p dir="auto">This code should be executed on the page before any other scripts that require the <code>__tcfapi</code> function – this usually means between the <code><head></head></code> tags of the HTML document. The sample script also includes the <code>postMessage</code> handler.</p> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">How can vendors that use iframes call the CMP API from an iframe?</h3><a id="user-content-how-can-vendors-that-use-iframes-call-the-cmp-api-from-an-iframe" class="anchor" aria-label="Permalink: How can vendors that use iframes call the CMP API from an iframe?" href="#how-can-vendors-that-use-iframes-call-the-cmp-api-from-an-iframe"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">The only way to request TC Data from a parent or ancestor’s frame is <a href="#using-postmessage">using postmessage</a>.</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Using postmessage</h4><a id="user-content-using-postmessage" class="anchor" aria-label="Permalink: Using postmessage" href="#using-postmessage"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">The <a href="https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage" rel="nofollow"><code>window.postMessage()</code></a> method may be used from a child iframe to make requests from a parent or any ancestor frame's CMP API. To locate an ancestor frame capable of responding to <code>postMessage()</code> CMP API calls, search for an ancestor frame that has a child frame named <code>'__tcfapiLocator'</code> (see <a href="#is-there-a-sample-iframe-script-call-to-the-cmp-api">sample code</a>).</p> <p dir="auto">CMPs shall create an event listener to handle <code>postMessage</code> requests via the <a href="#how-does-the-cmp-stub-api-work">CMP “stub” API script</a> so that <code>postMessage</code> events can be queued and processed by the full-implementation of the CMP API as soon as it is initialized.</p> <p dir="auto"><strong>Sent Message</strong></p> <p dir="auto">The sent message shall follow the form outlined below. The command, parameter and version object properties correspond to their namesake parameters defined as method argument parameters for <code>__tcfapi()</code> method. The “sent message” also requires a unique callId property to help match the request with a response. The <code>callId</code> property shall be either a string or a number, but the calling script shall not use the two types interchangeably.</p> <div class="highlight highlight-source-js notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="{ __tcfapiCall: { command: "command", parameter: parameter, version: version } }"><pre><span class="pl-kos">{</span> <span class="pl-c1">__tcfapiCall</span>: <span class="pl-kos">{</span> <span class="pl-c1">command</span>: <span class="pl-s">"command"</span><span class="pl-kos">,</span> <span class="pl-c1">parameter</span>: <span class="pl-s1">parameter</span><span class="pl-kos">,</span> <span class="pl-c1">version</span>: <span class="pl-s1">version</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span></pre></div> <p dir="auto">The <code>event.data</code> object payload shall follow the form outlined below. The <code>returnValue</code> object property shall be the corresponding TC data object for the <code>command</code> used upon sending the “sent message”. The <code>success</code> object property shall reflect the <code>__tcfapi()</code> <code>success</code> callback argument and the <code>callId</code> will correspond to the “sent message” unique id passed in the <code>callId</code> property.</p> <div class="highlight highlight-source-js notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="{ __tcfapiReturn: { returnValue: returnValue, success: boolean, callId: uniqueId } }"><pre><span class="pl-kos">{</span> <span class="pl-c1">__tcfapiReturn</span>: <span class="pl-kos">{</span> <span class="pl-c1">returnValue</span>: <span class="pl-s1">returnValue</span><span class="pl-kos">,</span> <span class="pl-c1">success</span>: <span class="pl-s1">boolean</span><span class="pl-kos">,</span> <span class="pl-c1">callId</span>: <span class="pl-s1">uniqueId</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span></pre></div> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Is there a sample iframe script call to the CMP API?</h4><a id="user-content-is-there-a-sample-iframe-script-call-to-the-cmp-api" class="anchor" aria-label="Permalink: Is there a sample iframe script call to the CMP API?" href="#is-there-a-sample-iframe-script-call-to-the-cmp-api"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Below is an example script that emulates the in-frame <code>__tcfapi()</code> call. It locates the ancestor frame running the CMP, performs the <code>postMessage</code> and listens for the return message and passes its values to the callback:</p> <div class="highlight highlight-source-js notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="(function() { //start here at our window let frame = window; // if we locate the CMP iframe we will reference it with this let cmpFrame; // map of calls const cmpCallbacks = {}; while(frame) { try { /** * throws a reference error if no frames exist */ if (frame.frames['__tcfapiLocator']) { cmpFrame = frame; break; } } catch(ignore) {} if(frame === window.top) { break; } frame = frame.parent; } /** * Set up a __tcfapi proxy method to do the postMessage and map the callback. * From the caller's perspective, this function behaves identically to the * CMP API's __tcfapi call */ window.__tcfapi = function(cmd, version, callback, arg) { if (!cmpFrame) { callback({msg: 'CMP not found'}, false); } else { const callId = Math.random() + ''; const msg = { __tcfapiCall: { command: cmd, parameter: arg, version: version, callId: callId, }, }; /** * map the callback for lookup on response */ cmpCallbacks[callId] = callback; cmpFrame.postMessage(msg, '*'); } }; function postMessageHandler(event) { /** * when we get the return message, call the mapped callback */ let json = {}; try { /** * if this isn't valid JSON then this will throw an error */ json = typeof event.data === 'string' ? JSON.parse(event.data) : event.data; } catch (ignore) {} const payload = json.__tcfapiReturn; if (payload) { /** * messages we care about will have a payload */ if (typeof cmpCallbacks[payload.callId] === 'function') { /** * call the mapped callback and then remove the reference */ cmpCallbacks[payload.callId](payload.returnValue, payload.success); cmpCallbacks[payload.callId] = null; } } } window.addEventListener('message', postMessageHandler, false); }()); __tcfapi('ping', 2, (pingReturn, success) => { // should get response from window.top's CMP });"><pre><span class="pl-kos">(</span><span class="pl-k">function</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> <span class="pl-c">//start here at our window</span> <span class="pl-k">let</span> <span class="pl-s1">frame</span> <span class="pl-c1">=</span> <span class="pl-smi">window</span><span class="pl-kos">;</span> <span class="pl-c">// if we locate the CMP iframe we will reference it with this</span> <span class="pl-k">let</span> <span class="pl-s1">cmpFrame</span><span class="pl-kos">;</span> <span class="pl-c">// map of calls</span> <span class="pl-k">const</span> <span class="pl-s1">cmpCallbacks</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span><span class="pl-kos">}</span><span class="pl-kos">;</span> <span class="pl-k">while</span><span class="pl-kos">(</span><span class="pl-s1">frame</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> <span class="pl-k">try</span> <span class="pl-kos">{</span> <span class="pl-c">/**</span> <span class="pl-c"> * throws a reference error if no frames exist</span> <span class="pl-c"> */</span> <span class="pl-k">if</span> <span class="pl-kos">(</span><span class="pl-s1">frame</span><span class="pl-kos">.</span><span class="pl-c1">frames</span><span class="pl-kos">[</span><span class="pl-s">'__tcfapiLocator'</span><span class="pl-kos">]</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> <span class="pl-s1">cmpFrame</span> <span class="pl-c1">=</span> <span class="pl-s1">frame</span><span class="pl-kos">;</span> <span class="pl-k">break</span><span class="pl-kos">;</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span> <span class="pl-k">catch</span><span class="pl-kos">(</span><span class="pl-s1">ignore</span><span class="pl-kos">)</span> <span class="pl-kos">{</span><span class="pl-kos">}</span> <span class="pl-k">if</span><span class="pl-kos">(</span><span class="pl-s1">frame</span> <span class="pl-c1">===</span> <span class="pl-smi">window</span><span class="pl-kos">.</span><span class="pl-c1">top</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> <span class="pl-k">break</span><span class="pl-kos">;</span> <span class="pl-kos">}</span> <span class="pl-s1">frame</span> <span class="pl-c1">=</span> <span class="pl-s1">frame</span><span class="pl-kos">.</span><span class="pl-c1">parent</span><span class="pl-kos">;</span> <span class="pl-kos">}</span> <span class="pl-c">/**</span> <span class="pl-c"> * Set up a __tcfapi proxy method to do the postMessage and map the callback.</span> <span class="pl-c"> * From the caller's perspective, this function behaves identically to the</span> <span class="pl-c"> * CMP API's __tcfapi call</span> <span class="pl-c"> */</span> <span class="pl-smi">window</span><span class="pl-kos">.</span><span class="pl-en">__tcfapi</span> <span class="pl-c1">=</span> <span class="pl-k">function</span><span class="pl-kos">(</span><span class="pl-s1">cmd</span><span class="pl-kos">,</span> <span class="pl-s1">version</span><span class="pl-kos">,</span> <span class="pl-s1">callback</span><span class="pl-kos">,</span> <span class="pl-s1">arg</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> <span class="pl-k">if</span> <span class="pl-kos">(</span><span class="pl-c1">!</span><span class="pl-s1">cmpFrame</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> <span class="pl-s1">callback</span><span class="pl-kos">(</span><span class="pl-kos">{</span><span class="pl-c1">msg</span>: <span class="pl-s">'CMP not found'</span><span class="pl-kos">}</span><span class="pl-kos">,</span> <span class="pl-c1">false</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-kos">}</span> <span class="pl-k">else</span> <span class="pl-kos">{</span> <span class="pl-k">const</span> <span class="pl-s1">callId</span> <span class="pl-c1">=</span> <span class="pl-v">Math</span><span class="pl-kos">.</span><span class="pl-en">random</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">+</span> <span class="pl-s">''</span><span class="pl-kos">;</span> <span class="pl-k">const</span> <span class="pl-s1">msg</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span> <span class="pl-c1">__tcfapiCall</span>: <span class="pl-kos">{</span> <span class="pl-c1">command</span>: <span class="pl-s1">cmd</span><span class="pl-kos">,</span> <span class="pl-c1">parameter</span>: <span class="pl-s1">arg</span><span class="pl-kos">,</span> <span class="pl-c1">version</span>: <span class="pl-s1">version</span><span class="pl-kos">,</span> <span class="pl-c1">callId</span>: <span class="pl-s1">callId</span><span class="pl-kos">,</span> <span class="pl-kos">}</span><span class="pl-kos">,</span> <span class="pl-kos">}</span><span class="pl-kos">;</span> <span class="pl-c">/**</span> <span class="pl-c"> * map the callback for lookup on response</span> <span class="pl-c"> */</span> <span class="pl-s1">cmpCallbacks</span><span class="pl-kos">[</span><span class="pl-s1">callId</span><span class="pl-kos">]</span> <span class="pl-c1">=</span> <span class="pl-s1">callback</span><span class="pl-kos">;</span> <span class="pl-s1">cmpFrame</span><span class="pl-kos">.</span><span class="pl-en">postMessage</span><span class="pl-kos">(</span><span class="pl-s1">msg</span><span class="pl-kos">,</span> <span class="pl-s">'*'</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span><span class="pl-kos">;</span> <span class="pl-k">function</span> <span class="pl-en">postMessageHandler</span><span class="pl-kos">(</span><span class="pl-s1">event</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> <span class="pl-c">/**</span> <span class="pl-c"> * when we get the return message, call the mapped callback</span> <span class="pl-c"> */</span> <span class="pl-k">let</span> <span class="pl-s1">json</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span><span class="pl-kos">}</span><span class="pl-kos">;</span> <span class="pl-k">try</span> <span class="pl-kos">{</span> <span class="pl-c">/**</span> <span class="pl-c"> * if this isn't valid JSON then this will throw an error</span> <span class="pl-c"> */</span> <span class="pl-s1">json</span> <span class="pl-c1">=</span> <span class="pl-k">typeof</span> <span class="pl-s1">event</span><span class="pl-kos">.</span><span class="pl-c1">data</span> <span class="pl-c1">===</span> <span class="pl-s">'string'</span> ? <span class="pl-c1">JSON</span><span class="pl-kos">.</span><span class="pl-en">parse</span><span class="pl-kos">(</span><span class="pl-s1">event</span><span class="pl-kos">.</span><span class="pl-c1">data</span><span class="pl-kos">)</span> : <span class="pl-s1">event</span><span class="pl-kos">.</span><span class="pl-c1">data</span><span class="pl-kos">;</span> <span class="pl-kos">}</span> <span class="pl-k">catch</span> <span class="pl-kos">(</span><span class="pl-s1">ignore</span><span class="pl-kos">)</span> <span class="pl-kos">{</span><span class="pl-kos">}</span> <span class="pl-k">const</span> <span class="pl-s1">payload</span> <span class="pl-c1">=</span> <span class="pl-s1">json</span><span class="pl-kos">.</span><span class="pl-c1">__tcfapiReturn</span><span class="pl-kos">;</span> <span class="pl-k">if</span> <span class="pl-kos">(</span><span class="pl-s1">payload</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> <span class="pl-c">/**</span> <span class="pl-c"> * messages we care about will have a payload</span> <span class="pl-c"> */</span> <span class="pl-k">if</span> <span class="pl-kos">(</span><span class="pl-k">typeof</span> <span class="pl-s1">cmpCallbacks</span><span class="pl-kos">[</span><span class="pl-s1">payload</span><span class="pl-kos">.</span><span class="pl-c1">callId</span><span class="pl-kos">]</span> <span class="pl-c1">===</span> <span class="pl-s">'function'</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> <span class="pl-c">/**</span> <span class="pl-c"> * call the mapped callback and then remove the reference</span> <span class="pl-c"> */</span> <span class="pl-s1">cmpCallbacks</span><span class="pl-kos">[</span><span class="pl-s1">payload</span><span class="pl-kos">.</span><span class="pl-c1">callId</span><span class="pl-kos">]</span><span class="pl-kos">(</span><span class="pl-s1">payload</span><span class="pl-kos">.</span><span class="pl-c1">returnValue</span><span class="pl-kos">,</span> <span class="pl-s1">payload</span><span class="pl-kos">.</span><span class="pl-c1">success</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-s1">cmpCallbacks</span><span class="pl-kos">[</span><span class="pl-s1">payload</span><span class="pl-kos">.</span><span class="pl-c1">callId</span><span class="pl-kos">]</span> <span class="pl-c1">=</span> <span class="pl-c1">null</span><span class="pl-kos">;</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span> <span class="pl-smi">window</span><span class="pl-kos">.</span><span class="pl-en">addEventListener</span><span class="pl-kos">(</span><span class="pl-s">'message'</span><span class="pl-kos">,</span> <span class="pl-s1">postMessageHandler</span><span class="pl-kos">,</span> <span class="pl-c1">false</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-kos">}</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-en">__tcfapi</span><span class="pl-kos">(</span><span class="pl-s">'ping'</span><span class="pl-kos">,</span> <span class="pl-c1">2</span><span class="pl-kos">,</span> <span class="pl-kos">(</span><span class="pl-s1">pingReturn</span><span class="pl-kos">,</span> <span class="pl-s1">success</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-kos">{</span> <span class="pl-c">// should get response from window.top's CMP</span> <span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">;</span></pre></div> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">From where will the API retrieve the TC string?</h3><a id="user-content-from-where-will-the-api-retrieve-the-tc-string" class="anchor" aria-label="Permalink: From where will the API retrieve the TC string?" href="#from-where-will-the-api-retrieve-the-tc-string"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">See the ‘How should the transparency & consent string be stored?’ section in the ‘Transparency & Consent String and Global Vendor List Format’ spec which describes where CMPs must store the transparency & consent string.</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Major Changes from 2.0</h2><a id="user-content-major-changes-from-20" class="anchor" aria-label="Permalink: Major Changes from 2.0" href="#major-changes-from-20"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ol dir="auto"> <li>Deprecated command <code>getTCData</code></li> </ol> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Major Changes from 1.1</h2><a id="user-content-major-changes-from-11" class="anchor" aria-label="Permalink: Major Changes from 1.1" href="#major-changes-from-11"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ol dir="auto"> <li>Added <code>getInAppTCData</code></li> <li>Added properties to <code>PingReturn</code></li> <li>Added <code>addEventListener</code></li> <li>Added <code>TCData</code></li> <li>Removed <code>VendorConsents</code></li> <li>Removed <code>VendorConsentData</code></li> <li>Changed <code>getVendorConsents</code> to <code>getTCData</code></li> <li>Renamed <code>__cmp</code> to <code>__tcfapi</code></li> <li>Renamed all <code>__cmp*</code> to <code>__tcfapi*</code> (e.g. <code>__cmpLocator</code> is now <code>__tcfapiLocator</code>)</li> <li>Removed <code>getConsentData</code> and <code>getPublisherConsents</code> commands (data moved to <code>getTCData</code>)</li> <li>Added in-app API details throughout where applicable</li> <li>Removed SafeFrame proxy communication</li> </ol> </article></div><button hidden=""></button></section></div></div></div> <!-- --> <!-- --> </div></div></div><div class="Box-sc-g0xbh4-0"></div></div></div></div></div><div id="find-result-marks-container" class="Box-sc-g0xbh4-0 cCoXib"></div><button hidden="" data-testid="" data-hotkey-scope="read-only-cursor-text-area"></button><button hidden=""></button></div> <!-- --> <!-- --> <script type="application/json" id="__PRIMER_DATA_:R0:__">{"resolvedServerColorMode":"day"}</script></div> </react-app> </turbo-frame> </div> </turbo-frame> </main> </div> </div> <footer class="footer pt-8 pb-6 f6 color-fg-muted p-responsive" role="contentinfo" > <h2 class='sr-only'>Footer</h2> <div class="d-flex flex-justify-center flex-items-center flex-column-reverse flex-lg-row flex-wrap flex-lg-nowrap"> <div class="d-flex flex-items-center flex-shrink-0 mx-2"> <a aria-label="Homepage" title="GitHub" class="footer-octicon mr-2" href="https://github.com"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-mark-github"> <path d="M12.5.75C6.146.75 1 5.896 1 12.25c0 5.089 3.292 9.387 7.863 10.91.575.101.79-.244.79-.546 0-.273-.014-1.178-.014-2.142-2.889.532-3.636-.704-3.866-1.35-.13-.331-.69-1.352-1.18-1.625-.402-.216-.977-.748-.014-.762.906-.014 1.553.834 1.769 1.179 1.035 1.74 2.688 1.25 3.349.948.1-.747.402-1.25.733-1.538-2.559-.287-5.232-1.279-5.232-5.678 0-1.25.445-2.285 1.178-3.09-.115-.288-.517-1.467.115-3.048 0 0 .963-.302 3.163 1.179.92-.259 1.897-.388 2.875-.388.977 0 1.955.13 2.875.388 2.2-1.495 3.162-1.179 3.162-1.179.633 1.581.23 2.76.115 3.048.733.805 1.179 1.825 1.179 3.09 0 4.413-2.688 5.39-5.247 5.678.417.36.776 1.05.776 2.128 0 1.538-.014 2.774-.014 3.162 0 .302.216.662.79.547C20.709 21.637 24 17.324 24 12.25 24 5.896 18.854.75 12.5.75Z"></path> </svg> </a> <span> © 2024 GitHub, Inc. </span> </div> <nav aria-label="Footer"> <h3 class="sr-only" id="sr-footer-heading">Footer navigation</h3> <ul class="list-style-none d-flex flex-justify-center flex-wrap mb-2 mb-lg-0" aria-labelledby="sr-footer-heading"> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to Terms","label":"text:terms"}" href="https://docs.github.com/site-policy/github-terms/github-terms-of-service" data-view-component="true" class="Link--secondary Link">Terms</a> </li> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to privacy","label":"text:privacy"}" href="https://docs.github.com/site-policy/privacy-policies/github-privacy-statement" data-view-component="true" class="Link--secondary Link">Privacy</a> </li> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to security","label":"text:security"}" href="https://github.com/security" data-view-component="true" class="Link--secondary Link">Security</a> </li> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to status","label":"text:status"}" href="https://www.githubstatus.com/" data-view-component="true" class="Link--secondary Link">Status</a> </li> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to docs","label":"text:docs"}" href="https://docs.github.com/" data-view-component="true" class="Link--secondary Link">Docs</a> </li> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to contact","label":"text:contact"}" href="https://support.github.com?tags=dotcom-footer" data-view-component="true" class="Link--secondary Link">Contact</a> </li> <li class="mx-2" > <cookie-consent-link> <button type="button" class="Link--secondary underline-on-hover border-0 p-0 color-bg-transparent" data-action="click:cookie-consent-link#showConsentManagement" data-analytics-event="{"location":"footer","action":"cookies","context":"subfooter","tag":"link","label":"cookies_link_subfooter_footer"}" > Manage cookies </button> </cookie-consent-link> </li> <li class="mx-2"> <cookie-consent-link> <button type="button" class="Link--secondary underline-on-hover border-0 p-0 color-bg-transparent" data-action="click:cookie-consent-link#showConsentManagement" data-analytics-event="{"location":"footer","action":"dont_share_info","context":"subfooter","tag":"link","label":"dont_share_info_link_subfooter_footer"}" > Do not share my personal information </button> </cookie-consent-link> </li> </ul> </nav> </div> </footer> <ghcc-consent id="ghcc" class="position-fixed bottom-0 left-0" style="z-index: 999999" data-initial-cookie-consent-allowed="" data-cookie-consent-required="false"></ghcc-consent> <div id="ajax-error-message" class="ajax-error-message flash flash-error" hidden> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert"> <path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> <button type="button" class="flash-close js-ajax-error-dismiss" aria-label="Dismiss error"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg> </button> You can’t perform that action at this time. </div> <template id="site-details-dialog"> <details class="details-reset details-overlay details-overlay-dark lh-default color-fg-default hx_rsm" open> <summary role="button" aria-label="Close dialog"></summary> <details-dialog class="Box Box--overlay d-flex flex-column anim-fade-in fast hx_rsm-dialog hx_rsm-modal"> <button class="Box-btn-octicon m-0 btn-octicon position-absolute right-0 top-0" type="button" aria-label="Close dialog" data-close-dialog> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg> </button> <div class="octocat-spinner my-6 js-details-dialog-spinner"></div> </details-dialog> </details> </template> <div class="Popover js-hovercard-content position-absolute" style="display: none; outline: none;"> <div class="Popover-message Popover-message--bottom-left Popover-message--large Box color-shadow-large" style="width:360px;"> </div> </div> <template id="snippet-clipboard-copy-button"> <div class="zeroclipboard-container position-absolute right-0 top-0"> <clipboard-copy aria-label="Copy" class="ClipboardButton btn js-clipboard-copy m-2 p-0" data-copy-feedback="Copied!" data-tooltip-direction="w"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon m-2"> <path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path> </svg> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check js-clipboard-check-icon color-fg-success d-none m-2"> <path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path> </svg> </clipboard-copy> </div> </template> <template id="snippet-clipboard-copy-button-unpositioned"> <div class="zeroclipboard-container"> <clipboard-copy aria-label="Copy" class="ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 d-flex flex-justify-center flex-items-center" data-copy-feedback="Copied!" data-tooltip-direction="w"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon"> <path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path> </svg> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check js-clipboard-check-icon color-fg-success d-none"> <path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path> </svg> </clipboard-copy> </div> </template> </div> <div id="js-global-screen-reader-notice" class="sr-only mt-n1" aria-live="polite" aria-atomic="true" ></div> <div id="js-global-screen-reader-notice-assertive" class="sr-only mt-n1" aria-live="assertive" aria-atomic="true"></div> </body> </html>