https://www.nearform.com/insights/adding-a-permission-system-to-node-js/

Submitted URL:
https://www.nearform.com/blog/adding-a-permission-system-to-node-js/Redirected
Report Finished:

The outgoing links identified from the page

LinkText
https://nodejs.org/en/Node.js
https://deno.land/deno
https://reactjs.org/React
https://eslint.org/eslint
https://www.typescriptlang.org/typescript
https://learn.microsoft.com/en-us/windows/security/threat-protection/windows-sandbox/windows-sandbox-overviewSandbox feature
https://developer.apple.com/library/archive/documentation/Security/Conceptual/AppSandboxDesignGuide/AboutAppSandbox/AboutAppSandbox.htmlAbout App Sandbox
https://github.com/nodejs/node/pull/33504this pull request
https://commerce.nearform.com/Nearform_Commerce
https://www.linkedin.com/company/nearformLinkedIn

JavaScript Variables · 65 found

Global JavaScript variables loaded on the window object of a page, are variables declared outside of functions and accessible from anywhere in the code within the current scope

NameType
0object
onbeforetoggleobject
documentPictureInPictureobject
onscrollendobject
OptanonWrapperfunction
gtagfunction
dataLayerobject
_linkedin_partner_idstring
_linkedin_data_partner_idsobject
lintrkfunction

Console log messages · 8 found

Messages logged to the web console

TypeCategoryLog
logother
URL
https://www.nearform.com/assets/js/main.min.js?v=05:18-01.10
Text
Missing elements.
logother
URL
https://www.nearform.com/assets/js/main.min.js?v=05:18-01.10
Text
👍
logother
URL
https://www.nearform.com/assets/js/main.min.js?v=05:18-01.10
Text
Deprecated as of 10.7.0. highlightBlock will be removed entirely in v12.0
logother
URL
https://www.nearform.com/assets/js/main.min.js?v=05:18-01.10
Text
Deprecated as of 10.7.0. Please use highlightElement now.
logother
URL
https://www.nearform.com/assets/js/main.min.js?v=05:18-01.10
Text
Missing elements.
logother
URL
https://www.nearform.com/assets/js/main.min.js?v=05:18-01.10
Text
Swiper library not loaded or necessary elements are missing.
logother
URL
https://www.nearform.com/assets/js/main.min.js?v=05:18-01.10
Text
page changed
errornetwork
URL
https://www.nearform.com/assets/images/favicon/favicon_light.png
Text
Failed to load resource: the server responded with a status of 404 ()

HTML

The raw HTML body of the page

<!DOCTYPE html><html lang="en" class="js swup-enabled"><head>    <script type="text/javascript" async="" src="https://snap.licdn.com/li.lms-analytics/insight.min.js"></script><script type="text/javascript" async="" src="https://www.googletagmanager.com/gtag/js?id=AW-867804553&amp;l=dataLayer&amp;cx=c"></script><script src="https://js.hs-analytics.net/analytics/1727756100000/1964953.js" type="text/javascript" id="hs-analytics"></script><script src="https://js.hs-banner.com/v2/1964953/banner.js" type="text/javascript" id="cookieBanner-1964953" data-cookieconsent="ignore" data-hs-ignore="true" data-loader="hs-scriptloader" data-hsjs-portal="1964953" data-hsjs-env="prod" data-hsjs-hublet="na1"></script><script src="https://js.hsleadflows.net/leadflows.js" type="text/javascript" id="LeadFlows-1964953" crossorigin="anonymous" data-leadin-portal-id="1964953" data-leadin-env="prod" data-loader="hs-scriptloader" data-hsjs-portal="1964953" data-hsjs-env="prod" data-hsjs-hublet="na1"></script><script src="https://js.hubspot.com/web-interactives-embed.js" type="text/javascript" id="hubspot-web-interactives-loader" crossorigin="anonymous" data-loader="hs-scriptloader" data-hsjs-portal="1964953" data-hsjs-env="prod" data-hsjs-hublet="na1"></script><script src="https://js.hsadspixel.net/fb.js" type="text/javascript" id="hs-ads-pixel-1964953" data-ads-portal-id="1964953" data-ads-env="prod" data-loader="hs-scriptloader" data-hsjs-portal="1964953" data-hsjs-env="prod" data-hsjs-hublet="na1"></script><script type="text/javascript" async="" src="https://snap.licdn.com/li.lms-analytics/insight.min.js"></script><script async="" src="https://www.googletagmanager.com/gtm.js?id=AW-867804553"></script><script>
        document.documentElement.classList.replace('no-js', 'js');
    </script>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
                    <link rel="icon" type="image/svg" href="https://www.nearform.com/media/site/da28bd2d39-1722603196/logo_n_dark.svg">

        <link rel="icon" href="https://www.nearform.com/assets/images/favicon/favicon.ico" type="image/x-icon">
        <link rel="icon" href="https://www.nearform.com/assets/images/favicon/favicon.png" type="image/png">
        <link rel="icon" href="https://www.nearform.com/assets/images/favicon/favicon.svg" type="image/svg+xml">
        <link rel="icon" href="https://www.nearform.com/assets/images/favicon/favicon_light.png" media="(prefers-color-scheme: light)" type="image/png">
        <link rel="icon" href="https://www.nearform.com/assets/images/favicon/favicon.svg" media="(prefers-color-scheme: dark)" type="image/svg+xml">

        <title>Adding a permission system to Node.js | Nearform</title>

    <meta name="description" content="Nearform">

<meta name="robots" content="all">

    <link rel="canonical" href="https://www.nearform.com/insights/adding-a-permission-system-to-node-js">
<meta content="Nearform" property="og:site_name">
<meta content="https://www.nearform.com/insights/adding-a-permission-system-to-node-js" property="og:url">
<meta content="website" property="og:type">
<meta content="Adding a permission system to Node.js | Nearform" property="og:title">
<meta content="Nearform" property="og:description">
<meta content="https://www.nearform.com/media/site/0d205ee9ff-1722603190/default_preview_thumbnail_4-1200x630-crop.png" property="og:image">
<meta content="1200" property="og:image:width">
<meta content="630" property="og:image:height">
<script type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":"WebSite","@id":"https://www.nearform.com/#website","url":"https://www.nearform.com","name":"Nearform","description":"Nearform"},{"@type":"Organization","@id":"https://www.nearform.com/#owner","name":"Nearform","url":"https://www.nearform.com","logo":"https://www.nearform.com/media/site/6506067fe7-1722603195/logo_dark.svg"}]}</script>
    <style type="text/css">
:root {
  --max-width: 1600px;
  /* Colours */
  --primary: #00E5A4;
  --secondary: #5630FF;
  --background: #FFFFFF;
  --darkbackground: #000E38;
  --purple: #8950ff;
  --lightpurple: #DDCAFF;
  --blue: #166bff;
  --lightblue: #D6E6FF;
  --grey: #D9D9D9;
  --darkgrey: #514B45;
  --lightgrey: #EAEBED;
  --navy: #0C3D60;
  --lightnavy: #526288;
  --base-weight: 400;
  --base-typeface: 'Bitter', sans-serif;
  --secondary-font: 'Inter', sans-serif;

}
</style>    <link href="https://www.nearform.com/assets/css/style.css?v=05:18-01.10" rel="stylesheet">

<script defer="" src="https://www.nearform.com/assets/js/main.min.js?v=05:18-01.10"></script>
    <script defer="" src="https://www.nearform.com/assets/js/lottie.min.js?v=05:18-01.10"></script>
    <link rel="alternate" type="application/rss+xml" title="Nearform – Latest from our Insights &amp; Digital Community" href="https://www.nearform.com/feed">
    <link rel="alternate" type="application/rss+xml" title="Nearform – Latest from our News &amp; Updates" href="https://www.nearform.com/news/feed">

    <meta name="twitter:card" content="summary_large_image">

    <meta name="google-site-verification" content="cgK3vWYNLJZLdfM4Z9jAQ3w-oxIYBsConQqWG8B6OAE">

<!-- GA Cookies for www.nearform.com -->
<script>
// Define dataLayer and the gtag function.
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}

 // Set default consent for specific regions according to your requirements
gtag('consent', 'default', {
  'ad_storage': 'denied',
  'ad_user_data': 'denied',
  'ad_personalization': 'denied',
  'analytics_storage': 'denied',
 'regions':[<list of ISO 3166-2 region codes>]
});

// Set default consent for all other regions according to your requirements
gtag('consent', 'default', {
  'ad_storage': 'denied',
  'ad_user_data': 'denied',
  'ad_personalization': 'denied',
  'analytics_storage': 'denied'
});
</script>
<script src="https://cdn.cookielaw.org/scripttemplates/otSDKStub.js" type="text/javascript" charset="UTF-8" data-domain-script="69f82433-fa75-420b-a39c-43c4a9289e9f" async=""></script>
<script type="text/javascript">
function OptanonWrapper() { }
</script>

<!-- OneTrust Cookies Consent Notice end for www.nearform.com -->

            <link rel="dns-prefetch" href="https://www.googletagmanager.com/">
        <link href="https://www.googletagmanager.com/gtag/js?id=AW-867804553" rel="preload" as="script">
    
            <link rel="dns-prefetch" href="https://www.google-analytics.com">
        <link rel="preconnect" href="https://www.google-analytics.com">
        <script async="" src="https://www.googletagmanager.com/gtag/js?id=G-HHYVT8R73J"></script>
          <!-- Google Analytics Tag -->
        <script>
          window.dataLayer = window.dataLayer || [];
          function gtag(){dataLayer.push(arguments);}
          gtag('js', new Date());
          gtag('config', 'G-HHYVT8R73J');
      </script>
  
  <!-- Google Tag Manager -->
        <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
      new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
      j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
      'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
      })(window,document,'script','dataLayer','AW-867804553');</script>
      <script src="https://cdn.cookielaw.org/scripttemplates/6.38.0/otBannerSdk.js" async="" type="text/javascript"></script><style id="_goober"> .go2933276541{position:fixed;display:block;width:100%;height:0px;margin:0px;padding:0px;overflow:visible;transform-style:preserve-3d;background:transparent;backface-visibility:hidden;pointer-events:none;left:0px;z-index:9998;}.go2369186930{top:0px;z-index:9999;height:100%;width:100%;}.go1348078617{bottom:0px;}.go2417249464{position:fixed;z-index:9989;}.go3921366393{left:0;bottom:0;}.go3967842156{right:0;bottom:0;}.go613305155{left:0;top:0;}.go471583506{right:0;top:0;}.go3670563033{position:relative;overflow:hidden;display:none;}.go1041095097{display:block;}.go1632949049{position:absolute;pointer-events:none;width:101vw;height:101vh;background:rgba(0,0,0,0.7);opacity:0;z-index:-1;}.go2512015367{z-index:99998;opacity:0.8;visibility:visible;pointer-events:all;cursor:pointer;}.go1432718904{overflow:hidden;}.go812842568{display:block !important;position:static !important;box-sizing:border-box !important;background:transparent !important;border:none;min-height:0px !important;max-height:none !important;margin:0px;padding:0px !important;height:100% !important;width:1px !important;max-width:100% !important;min-width:100% !important;}.go2729809544{z-index:99999;visibility:hidden;position:absolute;inset:50vh auto auto 50%;transform:translate(-50%,-50%);left:50%;top:50%;opacity:0;pointer-events:none;max-height:95%;max-width:95%;}.go1011812720{pointer-events:auto !important;visibility:visible;opacity:1;transition:opacity 1s ease-in;}.go456419034{transition:opacity 0.3s ease-in;}.go3128134379{pointer-events:auto !important;visibility:visible !important;max-height:95vh !important;transition:max-height 1s ease-in;}.go494047706{z-index:9999;width:100%;max-height:95%;position:fixed;visibility:hidden;}.go2481764524{z-index:9999;width:100%;max-height:95%;position:fixed;visibility:hidden;bottom:0px;}.go2685733372{visibility:hidden;}.go2985984737{visibility:visible !important;}.go3281949485{pointer-events:auto !important;visibility:visible !important;max-height:95vh !important;transform:none !important;}.go3539422596{z-index:9999;width:100%;max-height:95%;position:fixed;visibility:hidden;transition:transform 0.5s cubic-bezier(0.31,-0.2,0.04,1.47);}.go988075951{z-index:9999;position:fixed;left:10px;top:10px;max-height:95vh !important;max-width:95%;visibility:hidden;}.go2699082514{z-index:9999;position:fixed;right:10px;top:10px;max-height:95vh !important;max-width:95%;visibility:hidden;}.go1595992025{z-index:9999;position:fixed;left:10px;bottom:10px;max-height:95vh !important;max-width:95%;visibility:hidden;}.go1222083472{z-index:9999;position:fixed;right:10px;bottom:10px;max-height:95vh !important;max-width:95%;visibility:hidden;}.go722322694{transition:none !important;}.go26732895{cursor:pointer;}.go2083580917{display:flex;justify-content:center;align-items:center;}</style><style id="onetrust-style">#onetrust-banner-sdk{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}#onetrust-banner-sdk .onetrust-vendors-list-handler{cursor:pointer;color:#1f96db;font-size:inherit;font-weight:bold;text-decoration:none;margin-left:5px}#onetrust-banner-sdk .onetrust-vendors-list-handler:hover{color:#1f96db}#onetrust-banner-sdk:focus{outline:2px solid #000;outline-offset:-2px}#onetrust-banner-sdk a:focus{outline:2px solid #000}#onetrust-banner-sdk #onetrust-accept-btn-handler,#onetrust-banner-sdk #onetrust-reject-all-handler,#onetrust-banner-sdk #onetrust-pc-btn-handler{outline-offset:1px}#onetrust-banner-sdk.ot-bnr-w-logo .ot-bnr-logo{height:64px;width:64px}#onetrust-banner-sdk .ot-close-icon,#onetrust-pc-sdk .ot-close-icon,#ot-sync-ntfy .ot-close-icon{background-image:url("data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMzQ4LjMzM3B4IiBoZWlnaHQ9IjM0OC4zMzNweCIgdmlld0JveD0iMCAwIDM0OC4zMzMgMzQ4LjMzNCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMzQ4LjMzMyAzNDguMzM0OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PGc+PHBhdGggZmlsbD0iIzU2NTY1NiIgZD0iTTMzNi41NTksNjguNjExTDIzMS4wMTYsMTc0LjE2NWwxMDUuNTQzLDEwNS41NDljMTUuNjk5LDE1LjcwNSwxNS42OTksNDEuMTQ1LDAsNTYuODVjLTcuODQ0LDcuODQ0LTE4LjEyOCwxMS43NjktMjguNDA3LDExLjc2OWMtMTAuMjk2LDAtMjAuNTgxLTMuOTE5LTI4LjQxOS0xMS43NjlMMTc0LjE2NywyMzEuMDAzTDY4LjYwOSwzMzYuNTYzYy03Ljg0Myw3Ljg0NC0xOC4xMjgsMTEuNzY5LTI4LjQxNiwxMS43NjljLTEwLjI4NSwwLTIwLjU2My0zLjkxOS0yOC40MTMtMTEuNzY5Yy0xNS42OTktMTUuNjk4LTE1LjY5OS00MS4xMzksMC01Ni44NWwxMDUuNTQtMTA1LjU0OUwxMS43NzQsNjguNjExYy0xNS42OTktMTUuNjk5LTE1LjY5OS00MS4xNDUsMC01Ni44NDRjMTUuNjk2LTE1LjY4Nyw0MS4xMjctMTUuNjg3LDU2LjgyOSwwbDEwNS41NjMsMTA1LjU1NEwyNzkuNzIxLDExLjc2N2MxNS43MDUtMTUuNjg3LDQxLjEzOS0xNS42ODcsNTYuODMyLDBDMzUyLjI1OCwyNy40NjYsMzUyLjI1OCw1Mi45MTIsMzM2LjU1OSw2OC42MTF6Ii8+PC9nPjwvc3ZnPg==");background-size:contain;background-repeat:no-repeat;background-position:center;height:12px;width:12px}#onetrust-banner-sdk .powered-by-logo,#onetrust-banner-sdk .ot-pc-footer-logo a,#onetrust-pc-sdk .powered-by-logo,#onetrust-pc-sdk .ot-pc-footer-logo a,#ot-sync-ntfy .powered-by-logo,#ot-sync-ntfy .ot-pc-footer-logo a{background-size:contain;background-repeat:no-repeat;background-position:center;height:25px;width:152px;display:block;text-decoration:none;font-size:0.75em}#onetrust-banner-sdk .powered-by-logo:hover,#onetrust-banner-sdk .ot-pc-footer-logo a:hover,#onetrust-pc-sdk .powered-by-logo:hover,#onetrust-pc-sdk .ot-pc-footer-logo a:hover,#ot-sync-ntfy .powered-by-logo:hover,#ot-sync-ntfy .ot-pc-footer-logo a:hover{color:#565656}#onetrust-banner-sdk h3 *,#onetrust-banner-sdk h4 *,#onetrust-banner-sdk h6 *,#onetrust-banner-sdk button *,#onetrust-banner-sdk a[data-parent-id] *,#onetrust-pc-sdk h3 *,#onetrust-pc-sdk h4 *,#onetrust-pc-sdk h6 *,#onetrust-pc-sdk button *,#onetrust-pc-sdk a[data-parent-id] *,#ot-sync-ntfy h3 *,#ot-sync-ntfy h4 *,#ot-sync-ntfy h6 *,#ot-sync-ntfy button *,#ot-sync-ntfy a[data-parent-id] *{font-size:inherit;font-weight:inherit;color:inherit}#onetrust-banner-sdk .ot-hide,#onetrust-pc-sdk .ot-hide,#ot-sync-ntfy .ot-hide{display:none !important}#onetrust-banner-sdk button.ot-link-btn:hover,#onetrust-pc-sdk button.ot-link-btn:hover,#ot-sync-ntfy button.ot-link-btn:hover{text-decoration:underline;opacity:1}#onetrust-pc-sdk .ot-sdk-row .ot-sdk-column{padding:0}#onetrust-pc-sdk .ot-sdk-container{padding-right:0}#onetrust-pc-sdk .ot-sdk-row{flex-direction:initial;width:100%}#onetrust-pc-sdk [type="checkbox"]:checked,#onetrust-pc-sdk [type="checkbox"]:not(:checked){pointer-events:initial}#onetrust-pc-sdk [type="checkbox"]:disabled+label::before,#onetrust-pc-sdk [type="checkbox"]:disabled+label:after,#onetrust-pc-sdk [type="checkbox"]:disabled+label{pointer-events:none;opacity:0.7}#onetrust-pc-sdk #vendor-list-content{transform:translate3d(0, 0, 0)}#onetrust-pc-sdk li input[type="checkbox"]{z-index:1}#onetrust-pc-sdk li .ot-checkbox label{z-index:2}#onetrust-pc-sdk li .ot-checkbox input[type="checkbox"]{height:auto;width:auto}#onetrust-pc-sdk li .host-title a,#onetrust-pc-sdk li .ot-host-name a,#onetrust-pc-sdk li .accordion-text,#onetrust-pc-sdk li .ot-acc-txt{z-index:2;position:relative}#onetrust-pc-sdk input{margin:3px 0.1ex}#onetrust-pc-sdk .pc-logo,#onetrust-pc-sdk .ot-pc-logo{height:60px;width:180px;background-position:center;background-size:contain;background-repeat:no-repeat}#onetrust-pc-sdk .screen-reader-only,#onetrust-pc-sdk .ot-scrn-rdr,.ot-sdk-cookie-policy .screen-reader-only,.ot-sdk-cookie-policy .ot-scrn-rdr{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}#onetrust-pc-sdk.ot-fade-in,.onetrust-pc-dark-filter.ot-fade-in,#onetrust-banner-sdk.ot-fade-in{animation-name:onetrust-fade-in;animation-duration:400ms;animation-timing-function:ease-in-out}#onetrust-pc-sdk.ot-hide{display:none !important}.onetrust-pc-dark-filter.ot-hide{display:none !important}#ot-sdk-btn.ot-sdk-show-settings,#ot-sdk-btn.optanon-show-settings{color:#68b631;border:1px solid #68b631;height:auto;white-space:normal;word-wrap:break-word;padding:0.8em 2em;font-size:0.8em;line-height:1.2;cursor:pointer;-moz-transition:0.1s ease;-o-transition:0.1s ease;-webkit-transition:1s ease;transition:0.1s ease}#ot-sdk-btn.ot-sdk-show-settings:hover,#ot-sdk-btn.optanon-show-settings:hover{color:#fff;background-color:#68b631}.onetrust-pc-dark-filter{background:rgba(0,0,0,0.5);z-index:2147483646;width:100%;height:100%;overflow:hidden;position:fixed;top:0;bottom:0;left:0}@keyframes onetrust-fade-in{0%{opacity:0}100%{opacity:1}}.ot-cookie-label{text-decoration:underline}@media only screen and (min-width: 426px) and (max-width: 896px) and (orientation: landscape){#onetrust-pc-sdk p{font-size:0.75em}}#onetrust-banner-sdk .banner-option-input:focus+label{outline:1px solid #000;outline-style:auto}.category-vendors-list-handler+a:focus,.category-vendors-list-handler+a:focus-visible{outline:2px solid #000}#onetrust-pc-sdk .ot-userid-title{margin-top:10px}#onetrust-pc-sdk .ot-userid-title>span,#onetrust-pc-sdk .ot-userid-timestamp>span{font-weight:700}#onetrust-pc-sdk .ot-userid-desc{font-style:italic}#onetrust-pc-sdk .ot-host-desc a{pointer-events:initial}#onetrust-pc-sdk .ot-ven-hdr>p a{position:relative;z-index:2;pointer-events:initial}#onetrust-pc-sdk .ot-vnd-serv .ot-vnd-item .ot-vnd-info a,#onetrust-pc-sdk .ot-vs-list .ot-vnd-item .ot-vnd-info a{margin-right:auto}
#onetrust-banner-sdk,#onetrust-pc-sdk,#ot-sdk-cookie-policy,#ot-sync-ntfy{font-size:16px}#onetrust-banner-sdk *,#onetrust-banner-sdk ::after,#onetrust-banner-sdk ::before,#onetrust-pc-sdk *,#onetrust-pc-sdk ::after,#onetrust-pc-sdk ::before,#ot-sdk-cookie-policy *,#ot-sdk-cookie-policy ::after,#ot-sdk-cookie-policy ::before,#ot-sync-ntfy *,#ot-sync-ntfy ::after,#ot-sync-ntfy ::before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}#onetrust-banner-sdk div,#onetrust-banner-sdk span,#onetrust-banner-sdk h1,#onetrust-banner-sdk h2,#onetrust-banner-sdk h3,#onetrust-banner-sdk h4,#onetrust-banner-sdk h5,#onetrust-banner-sdk h6,#onetrust-banner-sdk p,#onetrust-banner-sdk img,#onetrust-banner-sdk svg,#onetrust-banner-sdk button,#onetrust-banner-sdk section,#onetrust-banner-sdk a,#onetrust-banner-sdk label,#onetrust-banner-sdk input,#onetrust-banner-sdk ul,#onetrust-banner-sdk li,#onetrust-banner-sdk nav,#onetrust-banner-sdk table,#onetrust-banner-sdk thead,#onetrust-banner-sdk tr,#onetrust-banner-sdk td,#onetrust-banner-sdk tbody,#onetrust-banner-sdk .ot-main-content,#onetrust-banner-sdk .ot-toggle,#onetrust-banner-sdk #ot-content,#onetrust-banner-sdk #ot-pc-content,#onetrust-banner-sdk .checkbox,#onetrust-pc-sdk div,#onetrust-pc-sdk span,#onetrust-pc-sdk h1,#onetrust-pc-sdk h2,#onetrust-pc-sdk h3,#onetrust-pc-sdk h4,#onetrust-pc-sdk h5,#onetrust-pc-sdk h6,#onetrust-pc-sdk p,#onetrust-pc-sdk img,#onetrust-pc-sdk svg,#onetrust-pc-sdk button,#onetrust-pc-sdk section,#onetrust-pc-sdk a,#onetrust-pc-sdk label,#onetrust-pc-sdk input,#onetrust-pc-sdk ul,#onetrust-pc-sdk li,#onetrust-pc-sdk nav,#onetrust-pc-sdk table,#onetrust-pc-sdk thead,#onetrust-pc-sdk tr,#onetrust-pc-sdk td,#onetrust-pc-sdk tbody,#onetrust-pc-sdk .ot-main-content,#onetrust-pc-sdk .ot-toggle,#onetrust-pc-sdk #ot-content,#onetrust-pc-sdk #ot-pc-content,#onetrust-pc-sdk .checkbox,#ot-sdk-cookie-policy div,#ot-sdk-cookie-policy span,#ot-sdk-cookie-policy h1,#ot-sdk-cookie-policy h2,#ot-sdk-cookie-policy h3,#ot-sdk-cookie-policy h4,#ot-sdk-cookie-policy h5,#ot-sdk-cookie-policy h6,#ot-sdk-cookie-policy p,#ot-sdk-cookie-policy img,#ot-sdk-cookie-policy svg,#ot-sdk-cookie-policy button,#ot-sdk-cookie-policy section,#ot-sdk-cookie-policy a,#ot-sdk-cookie-policy label,#ot-sdk-cookie-policy input,#ot-sdk-cookie-policy ul,#ot-sdk-cookie-policy li,#ot-sdk-cookie-policy nav,#ot-sdk-cookie-policy table,#ot-sdk-cookie-policy thead,#ot-sdk-cookie-policy tr,#ot-sdk-cookie-policy td,#ot-sdk-cookie-policy tbody,#ot-sdk-cookie-policy .ot-main-content,#ot-sdk-cookie-policy .ot-toggle,#ot-sdk-cookie-policy #ot-content,#ot-sdk-cookie-policy #ot-pc-content,#ot-sdk-cookie-policy .checkbox,#ot-sync-ntfy div,#ot-sync-ntfy span,#ot-sync-ntfy h1,#ot-sync-ntfy h2,#ot-sync-ntfy h3,#ot-sync-ntfy h4,#ot-sync-ntfy h5,#ot-sync-ntfy h6,#ot-sync-ntfy p,#ot-sync-ntfy img,#ot-sync-ntfy svg,#ot-sync-ntfy button,#ot-sync-ntfy section,#ot-sync-ntfy a,#ot-sync-ntfy label,#ot-sync-ntfy input,#ot-sync-ntfy ul,#ot-sync-ntfy li,#ot-sync-ntfy nav,#ot-sync-ntfy table,#ot-sync-ntfy thead,#ot-sync-ntfy tr,#ot-sync-ntfy td,#ot-sync-ntfy tbody,#ot-sync-ntfy .ot-main-content,#ot-sync-ntfy .ot-toggle,#ot-sync-ntfy #ot-content,#ot-sync-ntfy #ot-pc-content,#ot-sync-ntfy .checkbox{font-family:inherit;font-weight:normal;-webkit-font-smoothing:auto;letter-spacing:normal;line-height:normal;padding:0;margin:0;height:auto;min-height:0;max-height:none;width:auto;min-width:0;max-width:none;border-radius:0;border:none;clear:none;float:none;position:static;bottom:auto;left:auto;right:auto;top:auto;text-align:left;text-decoration:none;text-indent:0;text-shadow:none;text-transform:none;white-space:normal;background:none;overflow:visible;vertical-align:baseline;visibility:visible;z-index:auto;box-shadow:none}#onetrust-banner-sdk label:before,#onetrust-banner-sdk label:after,#onetrust-banner-sdk .checkbox:after,#onetrust-banner-sdk .checkbox:before,#onetrust-pc-sdk label:before,#onetrust-pc-sdk label:after,#onetrust-pc-sdk .checkbox:after,#onetrust-pc-sdk .checkbox:before,#ot-sdk-cookie-policy label:before,#ot-sdk-cookie-policy label:after,#ot-sdk-cookie-policy .checkbox:after,#ot-sdk-cookie-policy .checkbox:before,#ot-sync-ntfy label:before,#ot-sync-ntfy label:after,#ot-sync-ntfy .checkbox:after,#ot-sync-ntfy .checkbox:before{content:"";content:none}
#onetrust-banner-sdk .ot-sdk-container,#onetrust-pc-sdk .ot-sdk-container,#ot-sdk-cookie-policy .ot-sdk-container{position:relative;width:100%;max-width:100%;margin:0 auto;padding:0 20px;box-sizing:border-box}#onetrust-banner-sdk .ot-sdk-column,#onetrust-banner-sdk .ot-sdk-columns,#onetrust-pc-sdk .ot-sdk-column,#onetrust-pc-sdk .ot-sdk-columns,#ot-sdk-cookie-policy .ot-sdk-column,#ot-sdk-cookie-policy .ot-sdk-columns{width:100%;float:left;box-sizing:border-box;padding:0;display:initial}@media (min-width: 400px){#onetrust-banner-sdk .ot-sdk-container,#onetrust-pc-sdk .ot-sdk-container,#ot-sdk-cookie-policy .ot-sdk-container{width:90%;padding:0}}@media (min-width: 550px){#onetrust-banner-sdk .ot-sdk-container,#onetrust-pc-sdk .ot-sdk-container,#ot-sdk-cookie-policy .ot-sdk-container{width:100%}#onetrust-banner-sdk .ot-sdk-column,#onetrust-banner-sdk .ot-sdk-columns,#onetrust-pc-sdk .ot-sdk-column,#onetrust-pc-sdk .ot-sdk-columns,#ot-sdk-cookie-policy .ot-sdk-column,#ot-sdk-cookie-policy .ot-sdk-columns{margin-left:4%}#onetrust-banner-sdk .ot-sdk-column:first-child,#onetrust-banner-sdk .ot-sdk-columns:first-child,#onetrust-pc-sdk .ot-sdk-column:first-child,#onetrust-pc-sdk .ot-sdk-columns:first-child,#ot-sdk-cookie-policy .ot-sdk-column:first-child,#ot-sdk-cookie-policy .ot-sdk-columns:first-child{margin-left:0}#onetrust-banner-sdk .ot-sdk-two.ot-sdk-columns,#onetrust-pc-sdk .ot-sdk-two.ot-sdk-columns,#ot-sdk-cookie-policy .ot-sdk-two.ot-sdk-columns{width:13.3333333333%}#onetrust-banner-sdk .ot-sdk-three.ot-sdk-columns,#onetrust-pc-sdk .ot-sdk-three.ot-sdk-columns,#ot-sdk-cookie-policy .ot-sdk-three.ot-sdk-columns{width:22%}#onetrust-banner-sdk .ot-sdk-four.ot-sdk-columns,#onetrust-pc-sdk .ot-sdk-four.ot-sdk-columns,#ot-sdk-cookie-policy .ot-sdk-four.ot-sdk-columns{width:30.6666666667%}#onetrust-banner-sdk .ot-sdk-eight.ot-sdk-columns,#onetrust-pc-sdk .ot-sdk-eight.ot-sdk-columns,#ot-sdk-cookie-policy .ot-sdk-eight.ot-sdk-columns{width:65.3333333333%}#onetrust-banner-sdk .ot-sdk-nine.ot-sdk-columns,#onetrust-pc-sdk .ot-sdk-nine.ot-sdk-columns,#ot-sdk-cookie-policy .ot-sdk-nine.ot-sdk-columns{width:74%}#onetrust-banner-sdk .ot-sdk-ten.ot-sdk-columns,#onetrust-pc-sdk .ot-sdk-ten.ot-sdk-columns,#ot-sdk-cookie-policy .ot-sdk-ten.ot-sdk-columns{width:82.6666666667%}#onetrust-banner-sdk .ot-sdk-eleven.ot-sdk-columns,#onetrust-pc-sdk .ot-sdk-eleven.ot-sdk-columns,#ot-sdk-cookie-policy .ot-sdk-eleven.ot-sdk-columns{width:91.3333333333%}#onetrust-banner-sdk .ot-sdk-twelve.ot-sdk-columns,#onetrust-pc-sdk .ot-sdk-twelve.ot-sdk-columns,#ot-sdk-cookie-policy .ot-sdk-twelve.ot-sdk-columns{width:100%;margin-left:0}}#onetrust-banner-sdk h1,#onetrust-banner-sdk h2,#onetrust-banner-sdk h3,#onetrust-banner-sdk h4,#onetrust-banner-sdk h5,#onetrust-banner-sdk h6,#onetrust-pc-sdk h1,#onetrust-pc-sdk h2,#onetrust-pc-sdk h3,#onetrust-pc-sdk h4,#onetrust-pc-sdk h5,#onetrust-pc-sdk h6,#ot-sdk-cookie-policy h1,#ot-sdk-cookie-policy h2,#ot-sdk-cookie-policy h3,#ot-sdk-cookie-policy h4,#ot-sdk-cookie-policy h5,#ot-sdk-cookie-policy h6{margin-top:0;font-weight:600;font-family:inherit}#onetrust-banner-sdk h1,#onetrust-pc-sdk h1,#ot-sdk-cookie-policy h1{font-size:1.5rem;line-height:1.2}#onetrust-banner-sdk h2,#onetrust-pc-sdk h2,#ot-sdk-cookie-policy h2{font-size:1.5rem;line-height:1.25}#onetrust-banner-sdk h3,#onetrust-pc-sdk h3,#ot-sdk-cookie-policy h3{font-size:1.5rem;line-height:1.3}#onetrust-banner-sdk h4,#onetrust-pc-sdk h4,#ot-sdk-cookie-policy h4{font-size:1.5rem;line-height:1.35}#onetrust-banner-sdk h5,#onetrust-pc-sdk h5,#ot-sdk-cookie-policy h5{font-size:1.5rem;line-height:1.5}#onetrust-banner-sdk h6,#onetrust-pc-sdk h6,#ot-sdk-cookie-policy h6{font-size:1.5rem;line-height:1.6}@media (min-width: 550px){#onetrust-banner-sdk h1,#onetrust-pc-sdk h1,#ot-sdk-cookie-policy h1{font-size:1.5rem}#onetrust-banner-sdk h2,#onetrust-pc-sdk h2,#ot-sdk-cookie-policy h2{font-size:1.5rem}#onetrust-banner-sdk h3,#onetrust-pc-sdk h3,#ot-sdk-cookie-policy h3{font-size:1.5rem}#onetrust-banner-sdk h4,#onetrust-pc-sdk h4,#ot-sdk-cookie-policy h4{font-size:1.5rem}#onetrust-banner-sdk h5,#onetrust-pc-sdk h5,#ot-sdk-cookie-policy h5{font-size:1.5rem}#onetrust-banner-sdk h6,#onetrust-pc-sdk h6,#ot-sdk-cookie-policy h6{font-size:1.5rem}}#onetrust-banner-sdk p,#onetrust-pc-sdk p,#ot-sdk-cookie-policy p{margin:0 0 1em 0;font-family:inherit;line-height:normal}#onetrust-banner-sdk a,#onetrust-pc-sdk a,#ot-sdk-cookie-policy a{color:#565656;text-decoration:underline}#onetrust-banner-sdk a:hover,#onetrust-pc-sdk a:hover,#ot-sdk-cookie-policy a:hover{color:#565656;text-decoration:none}#onetrust-banner-sdk .ot-sdk-button,#onetrust-banner-sdk button,#onetrust-pc-sdk .ot-sdk-button,#onetrust-pc-sdk button,#ot-sdk-cookie-policy .ot-sdk-button,#ot-sdk-cookie-policy button{margin-bottom:1rem;font-family:inherit}#onetrust-banner-sdk .ot-sdk-button,#onetrust-banner-sdk button,#onetrust-pc-sdk .ot-sdk-button,#onetrust-pc-sdk button,#ot-sdk-cookie-policy .ot-sdk-button,#ot-sdk-cookie-policy button{display:inline-block;height:38px;padding:0 30px;color:#555;text-align:center;font-size:0.9em;font-weight:400;line-height:38px;letter-spacing:0.01em;text-decoration:none;white-space:nowrap;background-color:transparent;border-radius:2px;border:1px solid #bbb;cursor:pointer;box-sizing:border-box}#onetrust-banner-sdk .ot-sdk-button:hover,#onetrust-banner-sdk :not(.ot-leg-btn-container)>button:not(.ot-link-btn):hover,#onetrust-banner-sdk :not(.ot-leg-btn-container)>button:not(.ot-link-btn):focus,#onetrust-pc-sdk .ot-sdk-button:hover,#onetrust-pc-sdk :not(.ot-leg-btn-container)>button:not(.ot-link-btn):hover,#onetrust-pc-sdk :not(.ot-leg-btn-container)>button:not(.ot-link-btn):focus,#ot-sdk-cookie-policy .ot-sdk-button:hover,#ot-sdk-cookie-policy :not(.ot-leg-btn-container)>button:not(.ot-link-btn):hover,#ot-sdk-cookie-policy :not(.ot-leg-btn-container)>button:not(.ot-link-btn):focus{color:#333;border-color:#888;opacity:0.7}#onetrust-banner-sdk .ot-sdk-button:focus,#onetrust-banner-sdk :not(.ot-leg-btn-container)>button:focus,#onetrust-pc-sdk .ot-sdk-button:focus,#onetrust-pc-sdk :not(.ot-leg-btn-container)>button:focus,#ot-sdk-cookie-policy .ot-sdk-button:focus,#ot-sdk-cookie-policy :not(.ot-leg-btn-container)>button:focus{outline:2px solid #000}#onetrust-banner-sdk .ot-sdk-button.ot-sdk-button-primary,#onetrust-banner-sdk button.ot-sdk-button-primary,#onetrust-banner-sdk input[type="submit"].ot-sdk-button-primary,#onetrust-banner-sdk input[type="reset"].ot-sdk-button-primary,#onetrust-banner-sdk input[type="button"].ot-sdk-button-primary,#onetrust-pc-sdk .ot-sdk-button.ot-sdk-button-primary,#onetrust-pc-sdk button.ot-sdk-button-primary,#onetrust-pc-sdk input[type="submit"].ot-sdk-button-primary,#onetrust-pc-sdk input[type="reset"].ot-sdk-button-primary,#onetrust-pc-sdk input[type="button"].ot-sdk-button-primary,#ot-sdk-cookie-policy .ot-sdk-button.ot-sdk-button-primary,#ot-sdk-cookie-policy button.ot-sdk-button-primary,#ot-sdk-cookie-policy input[type="submit"].ot-sdk-button-primary,#ot-sdk-cookie-policy input[type="reset"].ot-sdk-button-primary,#ot-sdk-cookie-policy input[type="button"].ot-sdk-button-primary{color:#fff;background-color:#33c3f0;border-color:#33c3f0}#onetrust-banner-sdk .ot-sdk-button.ot-sdk-button-primary:hover,#onetrust-banner-sdk button.ot-sdk-button-primary:hover,#onetrust-banner-sdk input[type="submit"].ot-sdk-button-primary:hover,#onetrust-banner-sdk input[type="reset"].ot-sdk-button-primary:hover,#onetrust-banner-sdk input[type="button"].ot-sdk-button-primary:hover,#onetrust-banner-sdk .ot-sdk-button.ot-sdk-button-primary:focus,#onetrust-banner-sdk button.ot-sdk-button-primary:focus,#onetrust-banner-sdk input[type="submit"].ot-sdk-button-primary:focus,#onetrust-banner-sdk input[type="reset"].ot-sdk-button-primary:focus,#onetrust-banner-sdk input[type="button"].ot-sdk-button-primary:focus,#onetrust-pc-sdk .ot-sdk-button.ot-sdk-button-primary:hover,#onetrust-pc-sdk button.ot-sdk-button-primary:hover,#onetrust-pc-sdk input[type="submit"].ot-sdk-button-primary:hover,#onetrust-pc-sdk input[type="reset"].ot-sdk-button-primary:hover,#onetrust-pc-sdk input[type="button"].ot-sdk-button-primary:hover,#onetrust-pc-sdk .ot-sdk-button.ot-sdk-button-primary:focus,#onetrust-pc-sdk button.ot-sdk-button-primary:focus,#onetrust-pc-sdk input[type="submit"].ot-sdk-button-primary:focus,#onetrust-pc-sdk input[type="reset"].ot-sdk-button-primary:focus,#onetrust-pc-sdk input[type="button"].ot-sdk-button-primary:focus,#ot-sdk-cookie-policy .ot-sdk-button.ot-sdk-button-primary:hover,#ot-sdk-cookie-policy button.ot-sdk-button-primary:hover,#ot-sdk-cookie-policy input[type="submit"].ot-sdk-button-primary:hover,#ot-sdk-cookie-policy input[type="reset"].ot-sdk-button-primary:hover,#ot-sdk-cookie-policy input[type="button"].ot-sdk-button-primary:hover,#ot-sdk-cookie-policy .ot-sdk-button.ot-sdk-button-primary:focus,#ot-sdk-cookie-policy button.ot-sdk-button-primary:focus,#ot-sdk-cookie-policy input[type="submit"].ot-sdk-button-primary:focus,#ot-sdk-cookie-policy input[type="reset"].ot-sdk-button-primary:focus,#ot-sdk-cookie-policy input[type="button"].ot-sdk-button-primary:focus{color:#fff;background-color:#1eaedb;border-color:#1eaedb}#onetrust-banner-sdk input[type="text"],#onetrust-pc-sdk input[type="text"],#ot-sdk-cookie-policy input[type="text"]{height:38px;padding:6px 10px;background-color:#fff;border:1px solid #d1d1d1;border-radius:4px;box-shadow:none;box-sizing:border-box}#onetrust-banner-sdk input[type="text"],#onetrust-pc-sdk input[type="text"],#ot-sdk-cookie-policy input[type="text"]{-webkit-appearance:none;-moz-appearance:none;appearance:none}#onetrust-banner-sdk input[type="text"]:focus,#onetrust-pc-sdk input[type="text"]:focus,#ot-sdk-cookie-policy input[type="text"]:focus{border:1px solid #000;outline:0}#onetrust-banner-sdk label,#onetrust-pc-sdk label,#ot-sdk-cookie-policy label{display:block;margin-bottom:0.5rem;font-weight:600}#onetrust-banner-sdk input[type="checkbox"],#onetrust-pc-sdk input[type="checkbox"],#ot-sdk-cookie-policy input[type="checkbox"]{display:inline}#onetrust-banner-sdk ul,#onetrust-pc-sdk ul,#ot-sdk-cookie-policy ul{list-style:circle inside}#onetrust-banner-sdk ul,#onetrust-pc-sdk ul,#ot-sdk-cookie-policy ul{padding-left:0;margin-top:0}#onetrust-banner-sdk ul ul,#onetrust-pc-sdk ul ul,#ot-sdk-cookie-policy ul ul{margin:1.5rem 0 1.5rem 3rem;font-size:90%}#onetrust-banner-sdk li,#onetrust-pc-sdk li,#ot-sdk-cookie-policy li{margin-bottom:1rem}#onetrust-banner-sdk th,#onetrust-banner-sdk td,#onetrust-pc-sdk th,#onetrust-pc-sdk td,#ot-sdk-cookie-policy th,#ot-sdk-cookie-policy td{padding:12px 15px;text-align:left;border-bottom:1px solid #e1e1e1}#onetrust-banner-sdk button,#onetrust-pc-sdk button,#ot-sdk-cookie-policy button{margin-bottom:1rem;font-family:inherit}#onetrust-banner-sdk .ot-sdk-container:after,#onetrust-banner-sdk .ot-sdk-row:after,#onetrust-pc-sdk .ot-sdk-container:after,#onetrust-pc-sdk .ot-sdk-row:after,#ot-sdk-cookie-policy .ot-sdk-container:after,#ot-sdk-cookie-policy .ot-sdk-row:after{content:"";display:table;clear:both}#onetrust-banner-sdk .ot-sdk-row,#onetrust-pc-sdk .ot-sdk-row,#ot-sdk-cookie-policy .ot-sdk-row{margin:0;max-width:none;display:block}
#onetrust-banner-sdk{box-shadow:0 0 18px rgba(0,0,0,.2)}#onetrust-banner-sdk.otFlat{position:fixed;z-index:2147483645;bottom:0;right:0;left:0;background-color:#fff;max-height:90%;overflow-x:hidden;overflow-y:auto}#onetrust-banner-sdk.otFlat.top{top:0px;bottom:auto}#onetrust-banner-sdk.otRelFont{font-size:1rem}#onetrust-banner-sdk>.ot-sdk-container{overflow:hidden}#onetrust-banner-sdk::-webkit-scrollbar{width:11px}#onetrust-banner-sdk::-webkit-scrollbar-thumb{border-radius:10px;background:#c1c1c1}#onetrust-banner-sdk{scrollbar-arrow-color:#c1c1c1;scrollbar-darkshadow-color:#c1c1c1;scrollbar-face-color:#c1c1c1;scrollbar-shadow-color:#c1c1c1}#onetrust-banner-sdk #onetrust-policy{margin:1.25em 0 .625em 2em;overflow:hidden}#onetrust-banner-sdk #onetrust-policy .ot-gv-list-handler{float:left;font-size:.82em;padding:0;margin-bottom:0;border:0;line-height:normal;height:auto;width:auto}#onetrust-banner-sdk #onetrust-policy-title{font-size:1.2em;line-height:1.3;margin-bottom:10px}#onetrust-banner-sdk #onetrust-policy-text{clear:both;text-align:left;font-size:.88em;line-height:1.4}#onetrust-banner-sdk #onetrust-policy-text *{font-size:inherit;line-height:inherit}#onetrust-banner-sdk #onetrust-policy-text a{font-weight:bold;margin-left:5px}#onetrust-banner-sdk #onetrust-policy-title,#onetrust-banner-sdk #onetrust-policy-text{color:dimgray;float:left}#onetrust-banner-sdk #onetrust-button-group-parent{min-height:1px;text-align:center}#onetrust-banner-sdk #onetrust-button-group{display:inline-block}#onetrust-banner-sdk #onetrust-accept-btn-handler,#onetrust-banner-sdk #onetrust-reject-all-handler,#onetrust-banner-sdk #onetrust-pc-btn-handler{background-color:#68b631;color:#fff;border-color:#68b631;margin-right:1em;min-width:125px;height:auto;white-space:normal;word-break:break-word;word-wrap:break-word;padding:12px 10px;line-height:1.2;font-size:.813em;font-weight:600}#onetrust-banner-sdk #onetrust-pc-btn-handler.cookie-setting-link{background-color:#fff;border:none;color:#68b631;text-decoration:underline;padding-left:0;padding-right:0}#onetrust-banner-sdk .onetrust-close-btn-ui{width:44px;height:44px;background-size:12px;border:none;position:relative;margin:auto;padding:0}#onetrust-banner-sdk .banner_logo{display:none}#onetrust-banner-sdk.ot-bnr-w-logo .ot-bnr-logo{position:absolute;top:50%;transform:translateY(-50%);left:0px}#onetrust-banner-sdk.ot-bnr-w-logo #onetrust-policy{margin-left:65px}#onetrust-banner-sdk .ot-b-addl-desc{clear:both;float:left;display:block}#onetrust-banner-sdk #banner-options{float:left;display:table;margin-right:0;margin-left:1em;width:calc(100% - 1em)}#onetrust-banner-sdk .banner-option-input{cursor:pointer;width:auto;height:auto;border:none;padding:0;padding-right:3px;margin:0 0 10px;font-size:.82em;line-height:1.4}#onetrust-banner-sdk .banner-option-input *{pointer-events:none;font-size:inherit;line-height:inherit}#onetrust-banner-sdk .banner-option-input[aria-expanded=true]~.banner-option-details{display:block;height:auto}#onetrust-banner-sdk .banner-option-input[aria-expanded=true] .ot-arrow-container{transform:rotate(90deg)}#onetrust-banner-sdk .banner-option{margin-bottom:12px;margin-left:0;border:none;float:left;padding:0}#onetrust-banner-sdk .banner-option:first-child{padding-left:2px}#onetrust-banner-sdk .banner-option:not(:first-child){padding:0;border:none}#onetrust-banner-sdk .banner-option-header{cursor:pointer;display:inline-block}#onetrust-banner-sdk .banner-option-header :first-child{color:dimgray;font-weight:bold;float:left}#onetrust-banner-sdk .banner-option-header .ot-arrow-container{display:inline-block;border-top:6px solid transparent;border-bottom:6px solid transparent;border-left:6px solid dimgray;margin-left:10px;vertical-align:middle}#onetrust-banner-sdk .banner-option-details{display:none;font-size:.83em;line-height:1.5;padding:10px 0px 5px 10px;margin-right:10px;height:0px}#onetrust-banner-sdk .banner-option-details *{font-size:inherit;line-height:inherit;color:dimgray}#onetrust-banner-sdk .ot-arrow-container,#onetrust-banner-sdk .banner-option-details{transition:all 300ms ease-in 0s;-webkit-transition:all 300ms ease-in 0s;-moz-transition:all 300ms ease-in 0s;-o-transition:all 300ms ease-in 0s}#onetrust-banner-sdk .ot-dpd-container{float:left}#onetrust-banner-sdk .ot-dpd-title{margin-bottom:10px}#onetrust-banner-sdk .ot-dpd-title,#onetrust-banner-sdk .ot-dpd-desc{font-size:.88em;line-height:1.4;color:dimgray}#onetrust-banner-sdk .ot-dpd-title *,#onetrust-banner-sdk .ot-dpd-desc *{font-size:inherit;line-height:inherit}#onetrust-banner-sdk.ot-iab-2 #onetrust-policy-text *{margin-bottom:0}#onetrust-banner-sdk.ot-iab-2 .onetrust-vendors-list-handler{display:block;margin-left:0;margin-top:5px;clear:both;margin-bottom:0;padding:0;border:0;height:auto;width:auto}#onetrust-banner-sdk.ot-iab-2 #onetrust-button-group button{display:block}#onetrust-banner-sdk.ot-close-btn-link{padding-top:25px}#onetrust-banner-sdk.ot-close-btn-link #onetrust-close-btn-container{top:15px;transform:none;right:15px}#onetrust-banner-sdk.ot-close-btn-link #onetrust-close-btn-container button{padding:0;white-space:pre-wrap;border:none;height:auto;line-height:1.5;text-decoration:underline;font-size:.69em}#onetrust-banner-sdk #onetrust-policy-text,#onetrust-banner-sdk .ot-dpd-desc,#onetrust-banner-sdk .ot-b-addl-desc{font-size:.813em;line-height:1.5}#onetrust-banner-sdk .ot-dpd-desc{margin-bottom:10px}#onetrust-banner-sdk .ot-dpd-desc>.ot-b-addl-desc{margin-top:10px;margin-bottom:10px;font-size:1em}@media only screen and (max-width: 425px){#onetrust-banner-sdk #onetrust-close-btn-container{position:absolute;top:6px;right:2px}#onetrust-banner-sdk #onetrust-policy{margin-left:0;margin-top:3em}#onetrust-banner-sdk #onetrust-button-group{display:block}#onetrust-banner-sdk #onetrust-accept-btn-handler,#onetrust-banner-sdk #onetrust-reject-all-handler,#onetrust-banner-sdk #onetrust-pc-btn-handler{width:100%}#onetrust-banner-sdk .onetrust-close-btn-ui{top:auto;transform:none}#onetrust-banner-sdk #onetrust-policy-title{display:inline;float:none}#onetrust-banner-sdk #banner-options{margin:0;padding:0;width:100%}}@media only screen and (min-width: 426px)and (max-width: 896px){#onetrust-banner-sdk #onetrust-close-btn-container{position:absolute;top:0;right:0}#onetrust-banner-sdk #onetrust-policy{margin-left:1em;margin-right:1em}#onetrust-banner-sdk .onetrust-close-btn-ui{top:10px;right:10px}#onetrust-banner-sdk:not(.ot-iab-2) #onetrust-group-container{width:95%}#onetrust-banner-sdk.ot-iab-2 #onetrust-group-container{width:100%}#onetrust-banner-sdk.ot-bnr-w-logo #onetrust-button-group-parent{padding-left:50px}#onetrust-banner-sdk #onetrust-button-group-parent{width:100%;position:relative;margin-left:0}#onetrust-banner-sdk #onetrust-button-group button{display:inline-block}#onetrust-banner-sdk #onetrust-button-group{margin-right:0;text-align:center}#onetrust-banner-sdk .has-reject-all-button #onetrust-pc-btn-handler{float:left}#onetrust-banner-sdk .has-reject-all-button #onetrust-reject-all-handler,#onetrust-banner-sdk .has-reject-all-button #onetrust-accept-btn-handler{float:right}#onetrust-banner-sdk .has-reject-all-button #onetrust-button-group{width:calc(100% - 2em);margin-right:0}#onetrust-banner-sdk .has-reject-all-button #onetrust-pc-btn-handler.cookie-setting-link{padding-left:0px;text-align:left}#onetrust-banner-sdk.ot-buttons-fw .ot-sdk-three button{width:100%;text-align:center}#onetrust-banner-sdk.ot-buttons-fw #onetrust-button-group-parent button{float:none}#onetrust-banner-sdk.ot-buttons-fw #onetrust-pc-btn-handler.cookie-setting-link{text-align:center}}@media only screen and (min-width: 550px){#onetrust-banner-sdk .banner-option:not(:first-child){border-left:1px solid #d8d8d8;padding-left:25px}}@media only screen and (min-width: 425px)and (max-width: 550px){#onetrust-banner-sdk.ot-iab-2 #onetrust-button-group,#onetrust-banner-sdk.ot-iab-2 #onetrust-policy,#onetrust-banner-sdk.ot-iab-2 .banner-option{width:100%}}@media only screen and (min-width: 769px){#onetrust-banner-sdk #onetrust-button-group{margin-right:30%}#onetrust-banner-sdk #banner-options{margin-left:2em;margin-right:5em;margin-bottom:1.25em;width:calc(100% - 7em)}}@media only screen and (min-width: 897px)and (max-width: 1023px){#onetrust-banner-sdk.vertical-align-content #onetrust-button-group-parent{position:absolute;top:50%;left:75%;transform:translateY(-50%)}#onetrust-banner-sdk #onetrust-close-btn-container{top:50%;margin:auto;transform:translate(-50%, -50%);position:absolute;padding:0;right:0}#onetrust-banner-sdk #onetrust-close-btn-container button{position:relative;margin:0;right:-22px;top:2px}}@media only screen and (min-width: 1024px){#onetrust-banner-sdk #onetrust-close-btn-container{top:50%;margin:auto;transform:translate(-50%, -50%);position:absolute;right:0}#onetrust-banner-sdk #onetrust-close-btn-container button{right:-12px}#onetrust-banner-sdk #onetrust-policy{margin-left:2em}#onetrust-banner-sdk.vertical-align-content #onetrust-button-group-parent{position:absolute;top:50%;left:60%;transform:translateY(-50%)}#onetrust-banner-sdk.ot-iab-2 #onetrust-policy-title{width:50%}#onetrust-banner-sdk.ot-iab-2 #onetrust-policy-text,#onetrust-banner-sdk.ot-iab-2 :not(.ot-dpd-desc)>.ot-b-addl-desc{margin-bottom:1em;width:50%;border-right:1px solid #d8d8d8;padding-right:1rem}#onetrust-banner-sdk.ot-iab-2 #onetrust-policy-text{margin-bottom:0;padding-bottom:1em}#onetrust-banner-sdk.ot-iab-2 :not(.ot-dpd-desc)>.ot-b-addl-desc{margin-bottom:0;padding-bottom:1em}#onetrust-banner-sdk.ot-iab-2 .ot-dpd-container{width:45%;padding-left:1rem;display:inline-block;float:none}#onetrust-banner-sdk.ot-iab-2 .ot-dpd-title{line-height:1.7}#onetrust-banner-sdk.ot-iab-2 #onetrust-button-group-parent{left:auto;right:4%;margin-left:0}#onetrust-banner-sdk.ot-iab-2 #onetrust-button-group button{display:block}#onetrust-banner-sdk:not(.ot-iab-2) #onetrust-button-group-parent{margin:auto;width:30%}#onetrust-banner-sdk:not(.ot-iab-2) #onetrust-group-container{width:60%}#onetrust-banner-sdk #onetrust-button-group{margin-right:auto}#onetrust-banner-sdk #onetrust-accept-btn-handler,#onetrust-banner-sdk #onetrust-reject-all-handler,#onetrust-banner-sdk #onetrust-pc-btn-handler{margin-top:1em}}@media only screen and (min-width: 890px){#onetrust-banner-sdk.ot-buttons-fw:not(.ot-iab-2) #onetrust-button-group-parent{padding-left:3%;padding-right:4%;margin-left:0}#onetrust-banner-sdk.ot-buttons-fw:not(.ot-iab-2) #onetrust-button-group{margin-right:0;margin-top:1.25em;width:100%}#onetrust-banner-sdk.ot-buttons-fw:not(.ot-iab-2) #onetrust-button-group button{width:100%;margin-bottom:5px;margin-top:5px}#onetrust-banner-sdk.ot-buttons-fw:not(.ot-iab-2) #onetrust-button-group button:last-of-type{margin-bottom:20px}}@media only screen and (min-width: 1280px){#onetrust-banner-sdk:not(.ot-iab-2) #onetrust-group-container{width:55%}#onetrust-banner-sdk:not(.ot-iab-2) #onetrust-button-group-parent{width:44%;padding-left:2%;padding-right:2%}#onetrust-banner-sdk:not(.ot-iab-2).vertical-align-content #onetrust-button-group-parent{position:absolute;left:55%}}
        #onetrust-consent-sdk #onetrust-banner-sdk {background-color: #FFFFFF;}
            #onetrust-consent-sdk #onetrust-policy-title,
                    #onetrust-consent-sdk #onetrust-policy-text,
                    #onetrust-consent-sdk .ot-b-addl-desc,
                    #onetrust-consent-sdk .ot-dpd-desc,
                    #onetrust-consent-sdk .ot-dpd-title,
                    #onetrust-consent-sdk #onetrust-policy-text *:not(.onetrust-vendors-list-handler),
                    #onetrust-consent-sdk .ot-dpd-desc *:not(.onetrust-vendors-list-handler),
                    #onetrust-consent-sdk #onetrust-banner-sdk #banner-options *,
                    #onetrust-banner-sdk .ot-cat-header {
                        color: #696969;
                    }
            #onetrust-consent-sdk #onetrust-banner-sdk .banner-option-details {
                    background-color: #E9E9E9;}
             #onetrust-consent-sdk #onetrust-banner-sdk a[href],
                    #onetrust-consent-sdk #onetrust-banner-sdk a[href] font,
                    #onetrust-consent-sdk #onetrust-banner-sdk .ot-link-btn
                        {
                            color: #2165e3;
                        }#onetrust-consent-sdk #onetrust-accept-btn-handler,
                         #onetrust-banner-sdk #onetrust-reject-all-handler {
                            background-color: #2165e3;border-color: #2165e3;
                color: #FFFFFF;
            }
            #onetrust-consent-sdk #onetrust-banner-sdk *:focus,
            #onetrust-consent-sdk #onetrust-banner-sdk:focus {
               outline-color: #000000;
               outline-width: 1px;
            }
            #onetrust-consent-sdk #onetrust-pc-btn-handler,
            #onetrust-consent-sdk #onetrust-pc-btn-handler.cookie-setting-link {
                color: #2165e3; border-color: #2165e3;
                background-color:
                #FFFFFF;
            }#onetrust-pc-sdk.otPcPopup *,#onetrust-pc-sdk.otPcPopup ::after,#onetrust-pc-sdk.otPcPopup ::before{box-sizing:content-box}#onetrust-pc-sdk.otPcPopup.ot-sdk-container{padding-right:0}#onetrust-pc-sdk.otPcPopup{position:fixed;bottom:3em;left:3em;background-color:#fff;width:25%;max-width:400px;min-width:400px;border-radius:6.5px;height:83%;max-height:800px;padding-left:0;-webkit-font-smoothing:auto;-webkit-box-shadow:0px 2px 10px -3px #999;-moz-box-shadow:0px 2px 10px -3px #999;box-shadow:0px 2px 10px -3px #999}#onetrust-pc-sdk{z-index:2147483647}#onetrust-pc-sdk .ot-hide-tgl{visibility:hidden}#onetrust-pc-sdk .ot-hide-tgl *{visibility:hidden}#onetrust-pc-sdk .ot-link-btn{padding:0;margin-bottom:0;border:0;font-weight:normal;line-height:normal;width:auto;height:auto}#onetrust-pc-sdk #pc-title{font-size:1.6em;margin-bottom:10px;color:#2c3643}#onetrust-pc-sdk #pc-policy-text{font-size:.7em;line-height:1.4;color:dimgray}#onetrust-pc-sdk #pc-policy-text a{font-size:1em;margin-right:8px}#onetrust-pc-sdk #pc-policy-text button{margin-right:8px}#onetrust-pc-sdk #pc-policy-text *{font-size:inherit}#onetrust-pc-sdk #pc-policy-text ul li{padding:10px}#onetrust-pc-sdk p{font-size:.7em;line-height:1.6;color:dimgray}#onetrust-pc-sdk a{color:#3860be;cursor:pointer}#onetrust-pc-sdk a:hover{color:#67b2fc}#onetrust-pc-sdk label{margin-bottom:0}#onetrust-pc-sdk .ot-close-icon{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIgd2lkdGg9IjQ3Ljk3MSIgaGVpZ2h0PSI0Ny45NzEiIHZpZXdCb3g9IjAgMCA0Ny45NzEgNDcuOTcxIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA0Ny45NzEgNDcuOTcxOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PGc+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTI4LjIyOCwyMy45ODZMNDcuMDkyLDUuMTIyYzEuMTcyLTEuMTcxLDEuMTcyLTMuMDcxLDAtNC4yNDJjLTEuMTcyLTEuMTcyLTMuMDctMS4xNzItNC4yNDIsMEwyMy45ODYsMTkuNzQ0TDUuMTIxLDAuODhjLTEuMTcyLTEuMTcyLTMuMDctMS4xNzItNC4yNDIsMGMtMS4xNzIsMS4xNzEtMS4xNzIsMy4wNzEsMCw0LjI0MmwxOC44NjUsMTguODY0TDAuODc5LDQyLjg1Yy0xLjE3MiwxLjE3MS0xLjE3MiwzLjA3MSwwLDQuMjQyQzEuNDY1LDQ3LjY3NywyLjIzMyw0Ny45NywzLDQ3Ljk3czEuNTM1LTAuMjkzLDIuMTIxLTAuODc5bDE4Ljg2NS0xOC44NjRMNDIuODUsNDcuMDkxYzAuNTg2LDAuNTg2LDEuMzU0LDAuODc5LDIuMTIxLDAuODc5czEuNTM1LTAuMjkzLDIuMTIxLTAuODc5YzEuMTcyLTEuMTcxLDEuMTcyLTMuMDcxLDAtNC4yNDJMMjguMjI4LDIzLjk4NnoiLz48L2c+PC9zdmc+");background-size:22px;background-repeat:no-repeat;background-position:center}#onetrust-pc-sdk .back-btn-handler p{font-weight:bold}#onetrust-pc-sdk #vendors-list-btn{font-size:.8em;text-decoration:none;font-weight:bold}#onetrust-pc-sdk #ot-content{position:absolute;overflow-y:scroll;padding-right:10px;top:30px;bottom:40px;margin-right:7px;margin-left:30px;width:calc(100% - 47px)}#onetrust-pc-sdk #ot-content::-webkit-scrollbar-track,#onetrust-pc-sdk #ot-options::-webkit-scrollbar-track,#onetrust-pc-sdk #vendor-list-content::-webkit-scrollbar-track{margin-right:20px}#onetrust-pc-sdk #ot-content::-webkit-scrollbar,#onetrust-pc-sdk #ot-options::-webkit-scrollbar,#onetrust-pc-sdk #vendor-list-content::-webkit-scrollbar{width:11px}#onetrust-pc-sdk #ot-content::-webkit-scrollbar-thumb,#onetrust-pc-sdk #ot-options::-webkit-scrollbar-thumb,#onetrust-pc-sdk #vendor-list-content::-webkit-scrollbar-thumb{border-radius:10px;background:#d8d8d8}#onetrust-pc-sdk #ot-content,#onetrust-pc-sdk #vendor-list-content,#onetrust-pc-sdk #ot-options{scrollbar-arrow-color:#d8d8d8;scrollbar-darkshadow-color:#d8d8d8;scrollbar-face-color:#d8d8d8;scrollbar-shadow-color:#d8d8d8}#onetrust-pc-sdk #vendor-list-container{margin-bottom:10px}#onetrust-pc-sdk .privacy-notice-link{text-decoration:underline}#onetrust-pc-sdk .pc-logo{height:40px;width:120px;margin-bottom:10px}#onetrust-pc-sdk .ot-pc-footer-logo{position:absolute;bottom:-1px;right:20px}#onetrust-pc-sdk .ot-pc-footer-logo svg{width:152px;height:25px}#onetrust-pc-sdk .checkbox{position:relative;display:inline-block}#onetrust-pc-sdk .checkbox label{width:90px;height:42px;background:#ccc;position:relative;display:inline-block;border-radius:46px;transition:.4s;z-index:2}#onetrust-pc-sdk .checkbox label:after{content:"";position:absolute;width:50px;height:50px;border-radius:100%;left:0;top:-5px;z-index:2;background:#fff;transition:.4s}#onetrust-pc-sdk .checkbox input{position:absolute;left:0;top:0;width:100%;height:100%;z-index:5;opacity:0;cursor:pointer}#onetrust-pc-sdk .checkbox input:checked+label:after{left:40px}#onetrust-pc-sdk .checkbox input:focus+label::after{outline-style:solid !important;outline-width:1px !important}#onetrust-pc-sdk .checkbox:after,#onetrust-pc-sdk .checkbox:before{-webkit-font-feature-settings:normal;font-feature-settings:normal;-webkit-font-kerning:auto;font-kerning:auto;-webkit-font-language-override:normal;font-language-override:normal;font-stretch:normal;font-style:normal;font-synthesis:weight style;font-variant:normal;font-weight:normal;text-rendering:auto}#onetrust-pc-sdk .ot-toggle .checkbox{z-index:2}#onetrust-pc-sdk .ot-toggle .checkbox label{background:#d6d6d6;border:none;height:10px;width:35px}#onetrust-pc-sdk .ot-toggle .checkbox label:after{background:#7b7b7b;width:20px;height:20px}#onetrust-pc-sdk .ot-toggle .checkbox input:checked+label{background:#cddcf2}#onetrust-pc-sdk .ot-toggle .checkbox input:checked+label:after{background:#4285f4;left:16px}#onetrust-pc-sdk .ot-toggle-group,#onetrust-pc-sdk .ot-toggle,#onetrust-pc-sdk .ot-arrow-container{float:left;display:inline-block}#onetrust-pc-sdk .ot-toggle-group{width:auto;float:right}#onetrust-pc-sdk .ot-toggle-group.ot-always-active{width:40%}#onetrust-pc-sdk .ot-arrow{width:10px;margin-left:15px;transition:all 300ms ease-in 0s;-webkit-transition:all 300ms ease-in 0s;-moz-transition:all 300ms ease-in 0s;-o-transition:all 300ms ease-in 0s}#onetrust-pc-sdk button.ot-pill{border-radius:20px;font-size:.75em;text-align:center;background-color:#68b631;border-color:#68b631;font-weight:600;box-shadow:0 0 10px 1px #cce1ff;width:170px;max-width:180px;color:#fff;height:auto;white-space:normal;word-wrap:break-word;padding:10px;line-height:1.2;letter-spacing:.05em;margin:1rem 0 0 0}#onetrust-pc-sdk button.ot-pill#filter-apply-handler{margin:0}#onetrust-pc-sdk .ot-arrow-container{margin-top:1.2px;float:right}#onetrust-pc-sdk .ot-arrow-container img{-webkit-transition:all 300ms ease-in 0s;-moz-transition:all 300ms ease-in 0s;-o-transition:all 300ms ease-in 0s;transition:all 300ms ease-in 0s}#onetrust-pc-sdk .ot-arrow-container svg{height:10px;width:10px}#onetrust-pc-sdk .ot-always-active{float:left;line-height:1.3;font-size:.9em;position:relative;top:3px;color:#3860be;font-weight:bold}#onetrust-pc-sdk.ot-accordions-pc .category-item{padding:0px}#onetrust-pc-sdk.ot-accordions-pc .accordion-header,#onetrust-pc-sdk.ot-accordions-pc .accordion-text,#onetrust-pc-sdk.ot-accordions-pc .accordion-text-description,#onetrust-pc-sdk.ot-accordions-pc .cookie-subgroups-container,#onetrust-pc-sdk.ot-accordions-pc .ot-accordion-group-pc-container,#onetrust-pc-sdk.ot-accordions-pc .ot-accordion-group-pc-container+.ot-leg-btn-container{padding-left:20px;padding-right:15px}#onetrust-pc-sdk.ot-accordions-pc .ot-accordion-group-pc-container+.ot-leg-btn-container{width:calc(100% - 35px);margin-bottom:10px;margin-top:0}#onetrust-pc-sdk.ot-accordions-pc .accordion-header{padding-top:14px;margin-top:1px;padding-bottom:15px}#onetrust-pc-sdk.ot-accordions-pc ul li input[type=checkbox]:not(:checked)~.accordion-text{width:auto}#onetrust-pc-sdk.ot-accordions-pc .accordion-text{width:100%;padding:0px}#onetrust-pc-sdk.ot-accordions-pc input[type=checkbox]:checked~.accordion-text{border-top:1px solid #c7c7c7;margin-top:0px;padding:0px;width:100%}#onetrust-pc-sdk.ot-accordions-pc .accordion-text-description{padding-top:10px;padding-bottom:7.5px}#onetrust-pc-sdk.ot-accordions-pc .cookie-subgroups-container{padding-bottom:7.5px;width:calc(100% - 35px);margin:0px;padding-top:7.5px;border-top:1px solid #d3d3d3}#onetrust-pc-sdk.ot-accordions-pc .category-vendors-list-container+.cookie-subgroups-container{border-top:none}#onetrust-pc-sdk.ot-accordions-pc input[type=checkbox]:checked~.accordion-text.ot-accordion-pc-container{width:auto}#onetrust-pc-sdk.ot-accordions-pc .ot-accordion-group-pc-container{padding-top:10px}#onetrust-pc-sdk.ot-accordions-pc .ot-accordion-group-pc-container+.category-vendors-list-container{margin-top:0px}#onetrust-pc-sdk .ot-toggle.ot-hide-tgl{visibility:hidden}#onetrust-pc-sdk .ot-toggle.ot-hide-tgl *{visibility:hidden}#onetrust-pc-sdk.ot-accordions-pc ul ul.cookie-subgroups li.cookie-subgroup{margin:0}#onetrust-pc-sdk .ot-accordion-pc-container>.cookie-subgroups-container{border-top:none}#onetrust-pc-sdk .ot-accordion-pc-container .cookie-subgroups .cookie-subgroup{margin:0px}#onetrust-pc-sdk .ot-accordion-pc-container .cookie-subgroups .cookie-subgroup>h4{width:60%}#onetrust-pc-sdk .ot-accordion-pc-container ul.cookie-subgroups .cookie-subgroup-toggle{width:55px}#onetrust-pc-sdk .ot-accordion-pc-container .cookie-subgroups-container{margin:0px;padding-bottom:7.5px;padding-top:7.5px;border-top:1px solid #d3d3d3}#onetrust-pc-sdk .ot-accordion-pc-container .cookie-subgroups-container:first-child{border:none}#onetrust-pc-sdk .ot-accordion-pc-container .ot-accordion-group-pc-container>ul,#onetrust-pc-sdk .ot-accordion-pc-container .cookie-subgroups-description-legal>ul{margin:0px;list-style:disc;padding-left:15px}#onetrust-pc-sdk .ot-accordion-pc-container .ot-accordion-group-pc-container,#onetrust-pc-sdk .ot-accordion-pc-container .ot-accordion-group-pc-container>ul,#onetrust-pc-sdk .ot-accordion-pc-container .cookie-subgroups-description-legal,#onetrust-pc-sdk .ot-accordion-pc-container .cookie-subgroups-description-legal>ul{color:gray}#onetrust-pc-sdk .ot-accordion-pc-container .ot-accordion-group-pc-container ul:first-child,#onetrust-pc-sdk .ot-accordion-pc-container .cookie-subgroups-description-legal ul:first-child{margin-bottom:5px}#onetrust-pc-sdk .ot-accordion-pc-container .ot-accordion-group-pc-container,#onetrust-pc-sdk .ot-accordion-pc-container .ot-accordion-group-pc-container li,#onetrust-pc-sdk .ot-accordion-pc-container .cookie-subgroups-description-legal,#onetrust-pc-sdk .ot-accordion-pc-container .cookie-subgroups-description-legal li{font-size:.7rem}#onetrust-pc-sdk .ot-accordion-pc-container .cookie-subgroups-description-legal,#onetrust-pc-sdk .ot-accordion-pc-container .cookie-subgroups-description-legal ul:first-child{margin-top:5px}#onetrust-pc-sdk .ot-accordion-pc-container .ot-accordion-group-pc-container{width:calc(100% - 35px);padding-bottom:10px}#onetrust-pc-sdk .ot-accordion-pc-container .ot-accordion-group-pc-container ul:first-child{margin-bottom:10px}#onetrust-pc-sdk .ot-accordion-pc-container .ot-accordion-group-pc-container li{border:none;padding:0}#onetrust-pc-sdk .ot-always-active-group{overflow:hidden}#onetrust-pc-sdk .ot-always-active-group .ot-always-active{width:calc(100% - 25px);text-align:right}#onetrust-pc-sdk .ot-always-active-group .ot-toggle-group{max-width:45%}#onetrust-pc-sdk .ot-always-active-subgroup{max-width:40%}#onetrust-pc-sdk .ot-always-active-subgroup .ot-always-active{text-align:right}#onetrust-pc-sdk.ot-leg-opt-out:not(.ot-leg-btn) #vendors-list:not(.hosts-list) #select-all-container{width:100%;max-width:100%}#onetrust-pc-sdk.ot-leg-opt-out:not(.ot-leg-btn) #vendors-list:not(.hosts-list) #select-all-container .ot-checkbox{right:10px}#onetrust-pc-sdk.ot-leg-opt-out:not(.ot-leg-btn) #select-all-container{display:block;float:none;clear:both}#onetrust-pc-sdk.ot-leg-opt-out:not(.ot-leg-btn) #select-all-container .ot-checkbox{margin:0;position:relative}#onetrust-pc-sdk.ot-leg-opt-out .category-item{margin-top:0px;border-top:0px;border-radius:2px;width:calc(100% - 2px);border-color:#e9e9e9}#onetrust-pc-sdk.ot-leg-opt-out .category-item:first-child{border-top:1px solid #e9e9e9;margin-top:10px}#onetrust-pc-sdk.ot-leg-opt-out .leg-int-header{color:#77808e;overflow:hidden;padding-top:7.5px;padding-bottom:7.5px;width:calc(100% - 2px);border-radius:2px;margin-top:10px}#onetrust-pc-sdk.ot-leg-opt-out .leg-int-header .leg-int-title{float:right;font-size:.813em}#onetrust-pc-sdk.ot-leg-opt-out .leg-int-header span:first-child{max-width:80px}#onetrust-pc-sdk.ot-leg-opt-out .leg-int-header span:last-child{padding-right:10px;max-width:95px;text-align:center}#onetrust-pc-sdk.ot-leg-opt-out .leg-int-header.ot-leg-border-color{background-color:#f8f8f8;border:1px solid #e9e9e9}#onetrust-pc-sdk.ot-leg-opt-out .leg-int-header.ot-leg-border-color span:first-child{text-align:left;width:80px}#onetrust-pc-sdk.ot-leg-opt-out ul.cookie-subgroups li.cookie-subgroup>h4+.cookie-subgroup-toggle{padding-right:20px;padding-left:15px}#onetrust-pc-sdk.ot-leg-opt-out ul.cookie-subgroups li.cookie-subgroup .cookie-subgroup-toggle{width:35px}#onetrust-pc-sdk.ot-leg-opt-out .accordion-header:not(.ot-always-active-group) h3+.ot-toggle-group{padding-left:15px}#onetrust-pc-sdk.ot-leg-opt-out .leg-int-sel-all-hdr{position:relative;display:inline-block;width:100%}#onetrust-pc-sdk.ot-leg-opt-out .leg-int-hdr,#onetrust-pc-sdk.ot-leg-opt-out .consent-hdr{float:right;font-size:.8em}#onetrust-pc-sdk.ot-leg-opt-out .leg-int-hdr{position:relative;right:45px}#onetrust-pc-sdk.ot-leg-opt-out .consent-hdr{position:relative;right:20px}#onetrust-pc-sdk.ot-leg-opt-out .ot-vendor-consent-tgl{margin-left:60px}#onetrust-pc-sdk.ot-leg-opt-out .ot-leg-int-tgl+.ot-arrow-container{margin-left:81px}#onetrust-pc-sdk.ot-leg-opt-out #select-all-container .ot-checkbox{line-height:normal}#onetrust-pc-sdk.ot-leg-opt-out #select-all-vendors-input-container{right:44px;position:relative;float:right;min-width:auto}#onetrust-pc-sdk.ot-leg-opt-out #select-all-vendors-leg-input-container{display:block;width:21px;height:20px;float:right;position:relative;right:104px}#onetrust-pc-sdk.ot-leg-opt-out #select-all-vendors-leg-input-container input{position:absolute}#onetrust-pc-sdk.ot-leg-opt-out #select-all-vendors-leg-input-container label{position:absolute}#onetrust-pc-sdk.ot-leg-opt-out #vendors-list.hosts-list #select-all-container{float:right}#onetrust-pc-sdk.ot-leg-opt-out #vendors-list #vendors-list-container .ot-toggle-group{width:auto;top:auto}#onetrust-pc-sdk.ot-leg-opt-out #vendors-list #vendors-list-container .ot-checkbox{position:relative;display:inline-block;width:20px;height:25px}#onetrust-pc-sdk.ot-leg-opt-out #vendors-list #vendors-list-container .ot-checkbox label{position:absolute;padding:0;width:18px;height:18px}#onetrust-pc-sdk.ot-leg-opt-out #vendors-list .vendor-options .consent-category{max-width:100%}#onetrust-pc-sdk input:checked~.accordion-header .ot-arrow{transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);-webkit-transform:rotate(90deg)}#onetrust-pc-sdk .btn-group{text-align:center;display:block}#onetrust-pc-sdk .btn-group button{border-radius:20px}#onetrust-pc-sdk #pc-close-btn-container{position:absolute;float:left;left:-35px;bottom:0;transform:translateY(50%);-o-transform:translateY(50%);-ms-transform:translateY(50%);-webkit-transform:translateY(50%);z-index:2147483647}#onetrust-pc-sdk #close-pc-btn-handler.ot-close-icon{text-align:center;display:block;border-radius:50%;height:64px;width:64px;background-color:#2e3643;cursor:pointer;padding:0;border:none}#onetrust-pc-sdk #close-pc-btn-handler.ot-close-icon svg{width:22px;height:22px;transform:translateY(90%);-o-transform:translateY(90%);-ms-transform:translateY(90%);-webkit-transform:translateY(90%)}#onetrust-pc-sdk #close-pc-btn-handler:hover,#onetrust-pc-sdk #close-pc-btn-handler:focus{opacity:.8}#onetrust-pc-sdk .category-vendors-list-btn,#onetrust-pc-sdk .category-vendors-list-btn+a,#onetrust-pc-sdk .category-host-list-btn{font-size:.7em;text-decoration:none;font-weight:bold;float:left}#onetrust-pc-sdk .category-vendors-list-btn+a{clear:none}#onetrust-pc-sdk .category-vendors-list-btn+a::after{content:"";height:15px;width:15px;background-repeat:no-repeat;margin-left:5px;float:right;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 511.626 511.627'%3E%3Cg fill='%231276CE'%3E%3Cpath d='M392.857 292.354h-18.274c-2.669 0-4.859.855-6.563 2.573-1.718 1.708-2.573 3.897-2.573 6.563v91.361c0 12.563-4.47 23.315-13.415 32.262-8.945 8.945-19.701 13.414-32.264 13.414H82.224c-12.562 0-23.317-4.469-32.264-13.414-8.945-8.946-13.417-19.698-13.417-32.262V155.31c0-12.562 4.471-23.313 13.417-32.259 8.947-8.947 19.702-13.418 32.264-13.418h200.994c2.669 0 4.859-.859 6.57-2.57 1.711-1.713 2.566-3.9 2.566-6.567V82.221c0-2.662-.855-4.853-2.566-6.563-1.711-1.713-3.901-2.568-6.57-2.568H82.224c-22.648 0-42.016 8.042-58.102 24.125C8.042 113.297 0 132.665 0 155.313v237.542c0 22.647 8.042 42.018 24.123 58.095 16.086 16.084 35.454 24.13 58.102 24.13h237.543c22.647 0 42.017-8.046 58.101-24.13 16.085-16.077 24.127-35.447 24.127-58.095v-91.358c0-2.669-.856-4.859-2.574-6.57-1.713-1.718-3.903-2.573-6.565-2.573z'/%3E%3Cpath d='M506.199 41.971c-3.617-3.617-7.905-5.424-12.85-5.424H347.171c-4.948 0-9.233 1.807-12.847 5.424-3.617 3.615-5.428 7.898-5.428 12.847s1.811 9.233 5.428 12.85l50.247 50.248-186.147 186.151c-1.906 1.903-2.856 4.093-2.856 6.563 0 2.479.953 4.668 2.856 6.571l32.548 32.544c1.903 1.903 4.093 2.852 6.567 2.852s4.665-.948 6.567-2.852l186.148-186.148 50.251 50.248c3.614 3.617 7.898 5.426 12.847 5.426s9.233-1.809 12.851-5.426c3.617-3.616 5.424-7.898 5.424-12.847V54.818c-.001-4.952-1.814-9.232-5.428-12.847z'/%3E%3C/g%3E%3C/svg%3E")}#onetrust-pc-sdk .category-vendors-list-container,#onetrust-pc-sdk .category-host-list-container{margin-bottom:15px}#onetrust-pc-sdk .category-host-list-container{display:inline-block;width:100%}#onetrust-pc-sdk .back-btn-handler{font-size:1em;text-decoration:none;font-weight:bold;color:#2e3644;display:table-cell;vertical-align:middle;width:auto}#onetrust-pc-sdk .back-btn-handler p{display:inline-block;word-wrap:break-word;margin-bottom:0;max-width:100px;vertical-align:middle;color:#2e3644;font-size:.9em}#onetrust-pc-sdk .back-btn-handler p:hover{opacity:.6}#onetrust-pc-sdk .back-btn-handler:focus{opacity:.6}#onetrust-pc-sdk #vendors-list-title{margin-bottom:10px}#onetrust-pc-sdk #vendors-list-title *{font-size:inherit}#onetrust-pc-sdk #vendors-list-header{margin:20px 15px 0 30px;height:36px;width:89%;display:inline-table}#onetrust-pc-sdk #vendors-list-header input{height:35px;width:220px;border-radius:50px;font-size:.8em;margin-right:10px;padding:0 35px 0 15px;float:left}#onetrust-pc-sdk #vendors-list-header input::placeholder{color:#d4d4d4;font-style:italic}#onetrust-pc-sdk #vendor-list-content{position:absolute;overflow-x:hidden;overflow-y:scroll;padding-left:0px;padding-right:10px;top:80px;bottom:40px;margin:0 7px 0 30px;width:calc(100% - 47px)}#onetrust-pc-sdk #vendors-list #hosts-list-container .ot-toggle-group>.ot-arrow-container:first-child{margin-top:10px}#onetrust-pc-sdk #vendors-list #vendors-list-container .ot-toggle-group{top:10px}#onetrust-pc-sdk #vendors-list .ot-toggle-group{width:50px;right:12px;position:absolute}#onetrust-pc-sdk #vendors-list .vendor-options .ot-toggle-group{position:relative;width:auto;transform:auto;-o-transform:auto;-ms-transform:auto;-webkit-transform:auto;top:auto;right:20px;margin:15px -5px 0 0}#onetrust-pc-sdk #vendors-list .ot-checkbox{height:auto}#onetrust-pc-sdk #vendors-list .ot-arrow-container{margin-top:0}#onetrust-pc-sdk #vendors-list .ot-arrow{margin-left:35px}#onetrust-pc-sdk #vendors-list .vendor-item label{cursor:pointer}#onetrust-pc-sdk #filter-container{height:auto;margin-bottom:10px;position:relative}#onetrust-pc-sdk #filter-display-container{display:inline-block;vertical-align:middle;height:auto}#onetrust-pc-sdk #select-all-container{float:right;height:auto;width:173px;margin-right:12px;margin-top:0}#onetrust-pc-sdk #select-all-container p{font-size:.9em;color:#2e3644;margin:0;font-weight:600;display:inline-block}#onetrust-pc-sdk #select-all-container .ot-checkbox{height:auto;line-height:43px;width:calc(100% - 10px)}#onetrust-pc-sdk #ot-back-arrow{height:17px;width:20px;display:inline-block;vertical-align:middle}#onetrust-pc-sdk #search-container{float:right}#onetrust-pc-sdk #search-container svg{width:30px;height:30px;position:absolute;right:25px;margin-top:2px}#onetrust-pc-sdk #filter-btn-handler{border-radius:3px;max-width:150px;height:auto;white-space:normal;word-wrap:break-word;padding-left:10px;padding-right:10px;margin-bottom:0}#onetrust-pc-sdk #filter-btn-handler svg,#onetrust-pc-sdk #filter-btn-handler span{display:inline-block}#onetrust-pc-sdk #filter-btn-handler svg{width:15px;vertical-align:middle;height:15px}#onetrust-pc-sdk #filter-btn-handler span{margin-bottom:0;line-height:1.2;font-size:1em;max-width:100px;vertical-align:middle}#onetrust-pc-sdk #filter-display-container #filter-btn-handler{border-color:dimgray;color:dimgray;background-color:#fff}#onetrust-pc-sdk .vendor-privacy-notice{color:dimgray;text-decoration:none;font-weight:100;display:block;padding-top:10px;position:relative;z-index:2;transform:translate(0, 1%);-o-transform:translate(0, 1%);-ms-transform:translate(0, 1%);-webkit-transform:translate(0, 1%)}#onetrust-pc-sdk .vendor-privacy-notice *{font-size:inherit}#onetrust-pc-sdk .vendor-privacy-notice:hover{text-decoration:underline}#onetrust-pc-sdk .vendor-title,#onetrust-pc-sdk .host-title,#onetrust-pc-sdk .host-title a{width:130px;max-width:130px;vertical-align:middle;font-size:.8em}#onetrust-pc-sdk .host-title{position:relative;color:dimgray}#onetrust-pc-sdk .cookie-name-container a,#onetrust-pc-sdk .host-title a{font-size:1em;color:dimgray}#onetrust-pc-sdk .host-info{width:70%;float:left}#onetrust-pc-sdk .host-description{color:dimgray}#onetrust-pc-sdk .host-info>a[href]:first-of-type{text-decoration:underline;font-size:.82em;position:relative;z-index:2;float:left;margin-bottom:5px}#onetrust-pc-sdk .host-info .host-title+a{margin-top:5px}#onetrust-pc-sdk .view-cookies-list{font-size:.7em;text-decoration:none;font-weight:bold;margin-top:5px;color:#3860be;display:block;clear:both}#onetrust-pc-sdk .view-cookies-list *{font-size:inherit}#onetrust-pc-sdk .host-description{font-size:.688em;line-height:1.4;font-weight:normal;float:left;width:100%;margin-top:5px}#onetrust-pc-sdk .vendor-info{width:120px;height:auto;display:inline-block;word-wrap:break-word;vertical-align:middle}#onetrust-pc-sdk .vendor-purposes{transform:translate(50%, 15%);-o-transform:translate(50%, 15%);-ms-transform:translate(50%, 15%);-webkit-transform:translate(50%, 15%);vertical-align:bottom;height:auto;display:inline-block;text-align:center}#onetrust-pc-sdk .vendor-purposes p{margin-bottom:0;font-weight:500;display:inline-block;word-wrap:break-word}#onetrust-pc-sdk .vendor-purposes p,#onetrust-pc-sdk .vendor-privacy-notice{letter-spacing:.03em;font-size:.7em;font-weight:400}#onetrust-pc-sdk .vendor-options{background-color:#f8f8f8;border-radius:2px}#onetrust-pc-sdk .vendor-option{min-height:30px;display:table;width:100%;height:50px}#onetrust-pc-sdk .vendor-option a{display:table-cell;vertical-align:middle;width:120px}#onetrust-pc-sdk .vendor-option a span{font-size:.75em;color:dimgray;margin:0;padding:0;width:100px}#onetrust-pc-sdk .vendor-option a svg{width:18px;vertical-align:bottom}#onetrust-pc-sdk .vendor-option p{display:table-cell;vertical-align:middle;word-wrap:break-word;margin:0;padding:0 0 0 15px;width:150px;font-size:.7em;line-height:1.4;color:#2e3644}#onetrust-pc-sdk #no-results{text-align:center;margin-top:30px}#onetrust-pc-sdk #no-results p{font-size:1em;color:#2e3644;word-wrap:break-word}#onetrust-pc-sdk #no-results p span{font-weight:bold}#onetrust-pc-sdk #ot-filter-modal{z-index:2147483646;border-radius:5px;width:0%;height:100%;position:absolute;background-color:rgba(0,0,0,.4);-moz-transition:.2s ease;-o-transition:.2s ease;-webkit-transition:2s ease;transition:.2s ease;overflow-x:hidden;opacity:1;right:0}#onetrust-pc-sdk #ot-filter-modal #modal-header{font-size:1.3em;margin:20px 0 40px 20px;color:#2e3644}#onetrust-pc-sdk #ot-filter-modal .ot-group-options{padding-bottom:10px;padding-left:20px}#onetrust-pc-sdk #ot-filter-modal .ot-group-option:nth-last-of-type(2){margin-bottom:15px}#onetrust-pc-sdk #ot-filter-modal .btn-group{border-top:1px solid #e6e6e6;padding-top:20px;margin-left:20px;margin-bottom:15px;width:calc(100% - 20px);overflow:hidden}#onetrust-pc-sdk #ot-filter-modal button{white-space:normal;word-break:break-word;word-wrap:break-word;line-height:1.2;padding:12px 10px;height:auto;min-width:125px;max-width:100%;width:calc(100% - 76px)}#onetrust-pc-sdk #ot-options{background-color:#fff;position:absolute;border-top-right-radius:5px;border-bottom-right-radius:5px;height:100%;width:325px;right:0;overflow-y:scroll}#onetrust-pc-sdk .ot-group-option{margin-bottom:25px;display:block}#onetrust-pc-sdk .ot-group-option input{position:relative;display:none}#onetrust-pc-sdk .ot-group-option .ot-checkbox{display:inline-block;width:100%}#onetrust-pc-sdk .ot-group-option p{display:inline-block;margin:0;font-size:.9em;color:#2e3644}#onetrust-pc-sdk .borderless-btn{border:none}#onetrust-pc-sdk .ot-checkbox{height:25px}#onetrust-pc-sdk .ot-checkbox input[type=checkbox]{opacity:0}#onetrust-pc-sdk .ot-checkbox label{position:relative;display:inline-block;padding-left:30px;cursor:pointer;font-weight:500}#onetrust-pc-sdk .ot-checkbox input:checked~label::before{background-color:#3860be}#onetrust-pc-sdk .ot-checkbox label::before,#onetrust-pc-sdk .ot-checkbox label::after{position:absolute;content:"";display:inline-block;border-radius:3px}#onetrust-pc-sdk .ot-checkbox label::before{height:18px;width:18px;border:1px solid #3860be;left:0px;top:2px}#onetrust-pc-sdk .ot-checkbox label::after{height:5px;width:9px;border-left:3px solid;border-bottom:3px solid;transform:rotate(-45deg);-o-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-webkit-transform:rotate(-45deg);left:4px;top:7px}#onetrust-pc-sdk .ot-checkbox input[type=checkbox]+label::after{content:none;color:#fff}#onetrust-pc-sdk .ot-checkbox input[type=checkbox]:checked+label::after{content:""}#onetrust-pc-sdk .ot-checkbox input[type=checkbox]:focus+label::before{outline-style:solid;outline-width:2px;outline-style:auto}#onetrust-pc-sdk #select-all-text-container{width:75%;height:auto;display:inline-block;text-align:left}#onetrust-pc-sdk #select-all-text-container *{font-size:inherit}#onetrust-pc-sdk #select-all-hosts-input-container,#onetrust-pc-sdk #select-all-vendors-input-container{min-width:25%;height:auto;display:inline-block}#onetrust-pc-sdk #select-all-hosts-input-container label,#onetrust-pc-sdk #select-all-vendors-input-container label{float:left;padding-left:0}#onetrust-pc-sdk #select-all-hosts-input-container .ot-group-option-box,#onetrust-pc-sdk #select-all-vendors-input-container .ot-group-option-box{margin:0}#onetrust-pc-sdk .label-text{display:none}#onetrust-pc-sdk .ot-sdk-column .btn-group{max-width:200px;margin:0 auto;padding-bottom:.5rem}#onetrust-pc-sdk .ot-toggle .checkbox label:after{cursor:pointer}#onetrust-pc-sdk ul{list-style:none;padding:0}#onetrust-pc-sdk ul li{position:relative;margin:10px 0 0 0;padding:15px 15px 15px 20px;border:1px solid #c7c7c7;border-radius:5px;display:inline-block;width:calc(100% - 37px)}#onetrust-pc-sdk ul li h3.category-header{font-size:.9em;color:#2e3644;margin:0;display:inline-block;width:55%;height:auto;word-wrap:break-word}#onetrust-pc-sdk ul li p{margin:0;font-size:.7em}#onetrust-pc-sdk ul li input[type=checkbox]{position:absolute;cursor:pointer;width:100%;height:100%;opacity:0;margin:0;top:0;left:0;z-index:1}#onetrust-pc-sdk ul li.category-item input[type=checkbox]~label{cursor:pointer}#onetrust-pc-sdk ul li input[type=checkbox]:not(:checked)~.accordion-text{margin-top:0;max-height:0;opacity:0;overflow:hidden;width:100%;transition:.25s ease-out;display:none}#onetrust-pc-sdk ul li input[type=checkbox]:checked~.accordion-text{transition:.1s ease-in;margin-top:10px;width:100%;overflow:auto;display:block}#onetrust-pc-sdk ul li input:focus+.accordion-header{outline-style:solid !important;outline-width:1px !important}#onetrust-pc-sdk ul .cookie-subgroups-container{max-width:304px;margin-right:5px;margin-top:8px;width:100%;float:right}#onetrust-pc-sdk ul ul.cookie-subgroups{margin:0}#onetrust-pc-sdk ul ul.cookie-subgroups .cookie-subgroup-toggle{width:63px}#onetrust-pc-sdk ul ul.cookie-subgroups .cookie-subgroup-toggle.ot-always-active-subgroup{width:auto}#onetrust-pc-sdk ul ul.cookie-subgroups li{margin:5px 0 0 0;padding:0;border:none;width:calc(100% - 5px)}#onetrust-pc-sdk ul ul.cookie-subgroups li p{margin-top:5px;font-size:.7rem}#onetrust-pc-sdk ul ul.cookie-subgroups li h4{font-size:.7rem;margin-bottom:0;display:inline-block}#onetrust-pc-sdk ul ul.cookie-subgroups li input[type=checkbox]:checked{height:inherit}#onetrust-pc-sdk ul ul.cookie-subgroups li.cookie-subgroup{margin-left:15px}#onetrust-pc-sdk .category-vendors-list-container,#onetrust-pc-sdk .category-host-list-container{margin-bottom:0;margin-top:10px;width:calc(100% - 35px);overflow:hidden;padding:10px 0px 10px 20px}#onetrust-pc-sdk .category-host-list-container{margin-top:0px}#onetrust-pc-sdk .vendor-option .op-out-group{float:right;margin-right:10px}#onetrust-pc-sdk #select-all-vendors-input-container.line-through label::after,#onetrust-pc-sdk #select-all-vendors-leg-input-container.line-through label::after,#onetrust-pc-sdk #select-all-hosts-input-container.line-through label::after{height:auto;border-left:0;transform:none;-o-transform:none;-ms-transform:none;-webkit-transform:none;left:5px;top:10.5px}#onetrust-pc-sdk .privacy-notice-link:focus,#onetrust-pc-sdk .category-vendors-list-handler:focus,#onetrust-pc-sdk .category-vendors-list-handler+a:focus .category-host-list-handler:focus{outline:1px solid #000}#onetrust-pc-sdk .vendor-option-purpose{height:24px;min-height:0;border-bottom:1px solid #e9e9e9}#onetrust-pc-sdk .vendor-option-purpose p{font-weight:bold;font-size:.65em}#onetrust-pc-sdk .vendor-option-purpose.legitimate-interest,#onetrust-pc-sdk .vendor-option-purpose.vendor-feature{border-top:1px solid #e9e9e9;margin-bottom:5px;margin-top:5px}#onetrust-pc-sdk #vendors-list .consent-status{top:10px;width:50px;right:12px;position:absolute}#onetrust-pc-sdk #vendors-list .vendor-options .consent-status{position:relative;width:auto;transform:auto;-o-transform:auto;-ms-transform:auto;-webkit-transform:auto;top:auto;text-align:right;right:20px;float:right;display:inline-block;max-width:45%}#onetrust-pc-sdk #vendors-list .vendor-options .consent-category{display:inline-block;margin-left:15px;max-width:45%;color:#2c3643;vertical-align:super}#onetrust-pc-sdk #vendors-list .vendor-options .vendor-consent-group{display:inline-block;width:100%}#onetrust-pc-sdk #vendors-list .vendor-options .vendor-consent-group:last-of-type{margin-bottom:5px}#onetrust-pc-sdk #vendors-list .vendor-options .vendor-consent-group:nth-of-type(2){margin-top:8px}#onetrust-pc-sdk #vendors-list .vendor-options .ot-ven-disc{border-bottom:1px solid #e9e9e9;padding-left:15px;padding-bottom:5px}#onetrust-pc-sdk #vendors-list .vendor-options .ot-ven-disc:nth-child(n+3) p{display:inline-block}#onetrust-pc-sdk #vendors-list .vendor-options .ot-ven-disc:nth-child(n+3) p:nth-of-type(odd){width:30%}#onetrust-pc-sdk #vendors-list .vendor-options .ot-ven-disc:nth-child(n+3) p:nth-of-type(even){width:50%;word-break:break-word;word-wrap:break-word}#onetrust-pc-sdk #vendors-list .vendor-options .ot-ven-disc p{padding-top:5px;display:block}#onetrust-pc-sdk .vendor-consent-group a{width:48%;float:right;display:inline-block;text-align:right;font-size:.95em}#onetrust-pc-sdk .vendor-consent-group a span{font-size:.75em;margin:0;padding:0;width:100px}#onetrust-pc-sdk .vendor-consent-group a svg{width:15px;height:15px;vertical-align:middle}#onetrust-pc-sdk .vendor-consent-group .op-out-group{float:right;padding-right:15px}#onetrust-pc-sdk #hosts-list-container .accordion-header{display:inline-block;width:calc(100% - 35px)}#onetrust-pc-sdk #hosts-list-container .host-item label{cursor:pointer;z-index:2}#onetrust-pc-sdk .host-option-group{margin:0;display:inline-block;width:100%}#onetrust-pc-sdk .host-option-group li{border:none;font-size:.8em;color:dimgray;padding:10px;margin-bottom:10px;background-color:#f8f8f8;display:inline-block;width:calc(100% - 20px)}#onetrust-pc-sdk .host-option-group li>div div{font-size:.8em;padding:5px 0}#onetrust-pc-sdk .host-option-group li>div div:nth-child(1){width:30%;float:left}#onetrust-pc-sdk .host-option-group li>div div:nth-child(2){width:70%;float:left;overflow-wrap:break-word}#onetrust-pc-sdk #vendors-list-container,#onetrust-pc-sdk #hosts-list-container{display:none}#onetrust-pc-sdk .ot-leg-btn-container{display:inline-block;width:100%;margin-top:10px}#onetrust-pc-sdk .ot-leg-btn-container button{width:auto;max-width:100%;margin:0;letter-spacing:0;height:auto;line-height:normal;border-radius:20px;padding:0 10px;font-size:.82em;line-height:1.4}#onetrust-pc-sdk .ot-leg-btn-container svg{display:none;height:14px;width:14px;padding-right:5px;vertical-align:sub}#onetrust-pc-sdk .ot-active-leg-btn{cursor:default;pointer-events:none}#onetrust-pc-sdk .ot-active-leg-btn svg{display:inline-block}#onetrust-pc-sdk .ot-remove-objection-handler{border:none;text-decoration:underline;padding:0;font-weight:600;line-height:1.4;padding-left:10px}#onetrust-pc-sdk .ot-obj-leg-btn-handler span{font-weight:bold;text-align:center;font-size:.91em}#onetrust-pc-sdk.otPcPopup[dir=rtl] #select-all-vendors-input-container.line-through label::after,#onetrust-pc-sdk.otPcPopup[dir=rtl] #select-all-vendors-leg-input-container.line-through label::after,#onetrust-pc-sdk.otPcPopup[dir=rtl] #select-all-hosts-input-container.line-through label::after{height:auto;border-left:0;transform:none;-o-transform:none;-ms-transform:none;-webkit-transform:none;left:4px;top:10.5px}#onetrust-pc-sdk.otPcPopup[dir=rtl].ot-leg-opt-out:not(.ot-leg-btn) #select-all-vendors-leg-input-container{right:117px}#onetrust-pc-sdk.otPcPopup[dir=rtl].ot-leg-opt-out:not(.ot-leg-btn) #select-all-container #select-all-vendors-input-container{right:25px}#onetrust-pc-sdk.otPcPopup[dir=rtl] input~.accordion-header .ot-arrow{transform:rotate(180deg);-o-transform:rotate(180deg);-ms-transform:rotate(180deg);-webkit-transform:rotate(180deg)}#onetrust-pc-sdk.otPcPopup[dir=rtl] input:checked~.accordion-header .ot-arrow{transform:rotate(270deg);-o-transform:rotate(270deg);-ms-transform:rotate(270deg);-webkit-transform:rotate(270deg)}#onetrust-pc-sdk.otPcPopup[dir=rtl] #search-container svg{right:33px}#onetrust-pc-sdk.otPcPopup[dir=rtl] #ot-back-arrow{transform:rotate(180deg);-o-transform:rotate(180deg);-ms-transform:rotate(180deg);-webkit-transform:rotate(180deg)}#onetrust-pc-sdk.otPcPopup[dir=rtl] .ot-checkbox label::after{transform:rotate(45deg);-webkit-transform:rotate(45deg);-o-transform:rotate(45deg);-ms-transform:rotate(45deg);border-left:0;border-right:3px solid}#onetrust-pc-sdk.otPcPopup[dir=rtl]{right:3em}#onetrust-pc-sdk.otPcPopup[dir=rtl] #pc-close-btn-container{float:right;left:-35px;right:auto}#onetrust-pc-sdk.otPcPopup[dir=rtl] .ot-toggle-group .ot-checkbox label{padding-right:50px}#onetrust-pc-sdk.otPcPopup[dir=rtl] .ot-group-option{width:100%}#onetrust-pc-sdk.otPcPopup[dir=rtl] #pc-policy-text,#onetrust-pc-sdk.otPcPopup[dir=rtl] ul li h3,#onetrust-pc-sdk.otPcPopup[dir=rtl] .accordion-text .accordion-text-description{text-align:left;display:inline-table}#onetrust-pc-sdk.otPcPopup[dir=rtl] .vendor-option{text-align:left}#onetrust-pc-sdk.otPcPopup[dir=rtl] #pc-title,#onetrust-pc-sdk.otPcPopup[dir=rtl] #vendors-list-btn,#onetrust-pc-sdk.otPcPopup[dir=rtl] #vendors-list-title,#onetrust-pc-sdk.otPcPopup[dir=rtl] #modal-header,#onetrust-pc-sdk.otPcPopup[dir=rtl] #ot-filter-modal .btn-group,#onetrust-pc-sdk.otPcPopup[dir=rtl] .category-vendors-list-btn,#onetrust-pc-sdk.otPcPopup[dir=rtl] .category-vendors-list-btn+a,#onetrust-pc-sdk.otPcPopup[dir=rtl] .category-host-list-btn .vendor-purposes,#onetrust-pc-sdk.otPcPopup[dir=rtl] .vendor-info,#onetrust-pc-sdk.otPcPopup[dir=rtl] .ot-group-option .ot-checkbox,#onetrust-pc-sdk.otPcPopup[dir=rtl] .ot-group-option{float:left}#onetrust-pc-sdk.otPcPopup[dir=rtl] .category-vendors-list-container,#onetrust-pc-sdk.otPcPopup[dir=rtl] .category-host-list-container{margin-bottom:20px}#onetrust-pc-sdk.otPcPopup[dir=rtl] .ot-pc-footer-logo{right:35px;direction:rtl}@media only screen and (max-width: 425px){#onetrust-pc-sdk #pc-close-btn-container{display:none}#onetrust-pc-sdk #ot-content{margin:0 10px 0 20px}#onetrust-pc-sdk #pc-title{font-size:1.3em}#onetrust-pc-sdk p{font-size:.7em}#onetrust-pc-sdk .ot-arrow{margin-left:10px}#onetrust-pc-sdk .ot-toggle-group{width:auto}#onetrust-pc-sdk .vendor-purposes{-webkit-transform:translate(20%, 15%)}#onetrust-pc-sdk #vendors-list-header{margin:10px 10px 0 5px;width:100%}#onetrust-pc-sdk #vendors-list-header input{margin-right:20px}#onetrust-pc-sdk #vendor-list-content{margin:0;padding:0 5px 0 15px;width:calc(100% - 20px)}#onetrust-pc-sdk #search-container svg{right:10px}#onetrust-pc-sdk #no-results p,#onetrust-pc-sdk #vendors-list-title{width:90vw}#onetrust-pc-sdk.otPcPopup[dir=rtl]{right:auto}#onetrust-pc-sdk .ot-pc-footer-logo{width:100%;right:auto}#onetrust-pc-sdk .ot-pc-footer-logo a{width:auto}#onetrust-pc-sdk input{font-size:1em !important}#onetrust-pc-sdk #ot-filter-modal{height:0;width:100%;top:0}#onetrust-pc-sdk #ot-filter-modal #modal-header{margin-bottom:15px}#onetrust-pc-sdk #ot-options{width:100%;border-top-right-radius:0;border-bottom-right-radius:0}#onetrust-pc-sdk .ot-group-option{margin-bottom:10px}#onetrust-pc-sdk.otPcPopup{left:0;min-width:100%;height:100%;top:0;border-radius:0}}@media only screen and (min-width: 426px){#onetrust-pc-sdk ul .cookie-subgroups-container{max-width:100%}}@media only screen and (min-width: 426px)and (max-width: 896px)and (max-height: 425px)and (orientation: landscape){#onetrust-pc-sdk #pc-close-btn-container{display:none}#onetrust-pc-sdk input{font-size:1em !important}#onetrust-pc-sdk #search-container svg{right:45px}#onetrust-pc-sdk #vendors-list-header{float:left}#onetrust-pc-sdk #vendors-list-header .back-btn-handler{text-align:left}#onetrust-pc-sdk #vendors-list-header input{margin-right:0;padding-right:45px}#onetrust-pc-sdk .vendor-purposes{margin:0 25%;-webkit-transform:translate(20%, 15%)}#onetrust-pc-sdk p{font-size:.5em}#onetrust-pc-sdk .vendor-option p{font-size:.8em}#onetrust-pc-sdk .vendor-option a{width:70px}#onetrust-pc-sdk #ot-filter-modal{height:0;width:100%;top:0}#onetrust-pc-sdk #ot-filter-modal #modal-header{margin-bottom:5px}#onetrust-pc-sdk #ot-options{height:250px;width:100%}#onetrust-pc-sdk ul li p,#onetrust-pc-sdk .category-vendors-list-btn,#onetrust-pc-sdk .category-vendors-list-btn+a,#onetrust-pc-sdk .category-host-list-btn{font-size:.7em}#onetrust-pc-sdk .btn-group{margin-bottom:30px}#onetrust-pc-sdk.otPcPopup[dir=rtl]{right:auto}#onetrust-pc-sdk.otPcPopup{left:0;top:0;min-width:100%;height:100%;border-radius:0}#onetrust-pc-sdk.otPcPopup[dir=rtl] #search-container svg{right:60px}}
            #onetrust-consent-sdk #onetrust-pc-sdk,
                #onetrust-consent-sdk #search-container,
                #onetrust-consent-sdk #onetrust-pc-sdk .ot-switch.ot-toggle,
                #onetrust-consent-sdk #onetrust-pc-sdk group-toggle .checkbox,
                #onetrust-consent-sdk #onetrust-pc-sdk #pc-title:after
                 {
                    background-color: #FFFFFF;
                }
               
            #onetrust-consent-sdk #onetrust-pc-sdk h3,
                #onetrust-consent-sdk #onetrust-pc-sdk h4,
                #onetrust-consent-sdk #onetrust-pc-sdk h5,
                #onetrust-consent-sdk #onetrust-pc-sdk h6,
                #onetrust-consent-sdk #onetrust-pc-sdk p,
                #onetrust-consent-sdk #onetrust-pc-sdk #vendors-list-container .vendor-options p,
                #onetrust-consent-sdk #onetrust-pc-sdk #pc-policy-text,
                #onetrust-consent-sdk #onetrust-pc-sdk #pc-title,
                #onetrust-consent-sdk #onetrust-pc-sdk .leg-int-title,
                #onetrust-consent-sdk #onetrust-pc-sdk .leg-int-sel-all-hdr span,
                #onetrust-consent-sdk #onetrust-pc-sdk #hosts-list-container .vendor-host,
                #onetrust-consent-sdk #onetrust-pc-sdk #ot-filter-modal #modal-header,
                #onetrust-consent-sdk #onetrust-pc-sdk .ot-checkbox label span,
                #onetrust-consent-sdk #onetrust-pc-sdk #vendors-list #select-all-container p,
                #onetrust-consent-sdk #onetrust-pc-sdk #vendors-list #vendors-list-title,
                #onetrust-consent-sdk #onetrust-pc-sdk #vendors-list .back-btn-handler p,
                #onetrust-consent-sdk #onetrust-pc-sdk #vendors-list .vendor-title,
                #onetrust-consent-sdk #onetrust-pc-sdk #vendors-list #vendors-list-container .consent-category,
                #onetrust-consent-sdk #onetrust-pc-sdk .ot-leg-btn-container .ot-inactive-leg-btn,
                #onetrust-consent-sdk #onetrust-pc-sdk .ot-label-status,
                #onetrust-consent-sdk #onetrust-pc-sdk .ot-chkbox label span,
                #onetrust-consent-sdk #onetrust-pc-sdk #clear-filters-handler
                {
                    color: #696969;
                }
             #onetrust-consent-sdk #onetrust-pc-sdk .privacy-notice-link,
                    #onetrust-consent-sdk #onetrust-pc-sdk .category-vendors-list-handler,
                    #onetrust-consent-sdk #onetrust-pc-sdk .category-vendors-list-handler + a,
                    #onetrust-consent-sdk #onetrust-pc-sdk .category-host-list-handler,
                    #onetrust-consent-sdk #onetrust-pc-sdk .vendor-privacy-notice,
                    #onetrust-consent-sdk #onetrust-pc-sdk #hosts-list-container .host-title a,
                    #onetrust-consent-sdk #onetrust-pc-sdk #hosts-list-container .accordion-header .host-view-cookies,
                    #onetrust-consent-sdk #onetrust-pc-sdk #hosts-list-container .vendor-host a,
                    #onetrust-consent-sdk #onetrust-pc-sdk #ot-content #pc-policy-text .ot-link-btn,
                    #onetrust-consent-sdk #onetrust-pc-sdk .ot-vnd-serv .ot-vnd-item .ot-vnd-info a,
                    #onetrust-consent-sdk #onetrust-pc-sdk #ot-lst-cnt .ot-vnd-info a
                    {
                        color: #2165e3;
                    }
            #onetrust-consent-sdk #onetrust-pc-sdk .category-vendors-list-handler:hover { text-decoration: underline;}
            
             #onetrust-consent-sdk #onetrust-pc-sdk #hosts-list-container .vendor-host,
                    #onetrust-consent-sdk #onetrust-pc-sdk .accordion-text .vendor-options
                            {
                                background-color: #E9E9E9;
                            }
        #onetrust-consent-sdk #onetrust-pc-sdk
            button:not(#clear-filters-handler):not(.ot-close-icon):not(#filter-btn-handler):not(.ot-remove-objection-handler):not(.ot-obj-leg-btn-handler):not([aria-expanded]):not(.ot-link-btn),
            #onetrust-consent-sdk #onetrust-pc-sdk .ot-leg-btn-container .ot-active-leg-btn {
                background-color: #2165e3;border-color: #2165e3;
                color: #FFFFFF;
            }
            #onetrust-consent-sdk #onetrust-pc-sdk .active-group {
                border-color: #2165e3;
            }
            
            #onetrust-consent-sdk #onetrust-pc-sdk .ot-leg-btn-container .ot-remove-objection-handler{
                background-color: transparent;
                border: 1px solid transparent;
            }
            #onetrust-consent-sdk #onetrust-pc-sdk .ot-leg-btn-container .ot-inactive-leg-btn {
                background-color: #FFFFFF;
                color: #78808E; border-color: #78808E;
            }
            
            #onetrust-consent-sdk #onetrust-pc-sdk .ot-tgl input:focus + .ot-switch, .ot-switch .ot-switch-nob, .ot-switch .ot-switch-nob:before,
            #onetrust-pc-sdk .ot-checkbox input[type="checkbox"]:focus + label::before,
            #onetrust-pc-sdk .ot-chkbox input[type="checkbox"]:focus + label::before {
                outline-color: #000000;
                outline-width: 1px;
            }
            #onetrust-pc-sdk .ot-host-item > button:focus, #onetrust-pc-sdk .ot-ven-item > button:focus {
                border: 1px solid #000000;
            }
            #onetrust-consent-sdk #onetrust-pc-sdk *:focus,
            #onetrust-consent-sdk #onetrust-pc-sdk .ot-vlst-cntr > a:focus {
               outline: 1px solid #000000;
            }
            #onetrust-pc-sdk input[type="checkbox"]:focus + .accordion-header,
            #onetrust-pc-sdk .category-item .ot-switch.ot-toggle input:focus + .ot-switch-label,
            #onetrust-pc-sdk .checkbox input:focus + label::after {
                outline-color: #000000;
                outline-width: 1px;
            }.ot-sdk-cookie-policy{font-family:inherit;font-size:16px}.ot-sdk-cookie-policy.otRelFont{font-size:1rem}.ot-sdk-cookie-policy h3,.ot-sdk-cookie-policy h4,.ot-sdk-cookie-policy h6,.ot-sdk-cookie-policy p,.ot-sdk-cookie-policy li,.ot-sdk-cookie-policy a,.ot-sdk-cookie-policy th,.ot-sdk-cookie-policy #cookie-policy-description,.ot-sdk-cookie-policy .ot-sdk-cookie-policy-group,.ot-sdk-cookie-policy #cookie-policy-title{color:dimgray}.ot-sdk-cookie-policy #cookie-policy-description{margin-bottom:1em}.ot-sdk-cookie-policy h4{font-size:1.2em}.ot-sdk-cookie-policy h6{font-size:1em;margin-top:2em}.ot-sdk-cookie-policy th{min-width:75px}.ot-sdk-cookie-policy a,.ot-sdk-cookie-policy a:hover{background:#fff}.ot-sdk-cookie-policy thead{background-color:#f6f6f4;font-weight:bold}.ot-sdk-cookie-policy .ot-mobile-border{display:none}.ot-sdk-cookie-policy section{margin-bottom:2em}.ot-sdk-cookie-policy table{border-collapse:inherit}#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy{font-family:inherit;font-size:1rem}#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy h3,#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy h4,#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy h6,#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy p,#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy li,#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy a,#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy th,#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy #cookie-policy-description,#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy .ot-sdk-cookie-policy-group,#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy #cookie-policy-title{color:dimgray}#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy #cookie-policy-description{margin-bottom:1em}#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy .ot-sdk-subgroup{margin-left:1.5em}#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy #cookie-policy-description,#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy .ot-sdk-cookie-policy-group-desc,#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy .ot-table-header,#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy a,#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy span,#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy td{font-size:.9em}#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy td span,#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy td a{font-size:inherit}#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy .ot-sdk-cookie-policy-group{font-size:1em;margin-bottom:.6em}#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy .ot-sdk-cookie-policy-title{margin-bottom:1.2em}#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy>section{margin-bottom:1em}#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy th{min-width:75px}#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy a,#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy a:hover{background:#fff}#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy thead{background-color:#f6f6f4;font-weight:bold}#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy .ot-mobile-border{display:none}#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy section{margin-bottom:2em}#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy .ot-sdk-subgroup ul li{list-style:disc;margin-left:1.5em}#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy .ot-sdk-subgroup ul li h4{display:inline-block}#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy table{border-collapse:inherit;margin:auto;border:1px solid #d7d7d7;border-radius:5px;border-spacing:initial;width:100%;overflow:hidden}#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy table th,#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy table td{border-bottom:1px solid #d7d7d7;border-right:1px solid #d7d7d7}#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy table tr:last-child td{border-bottom:0px}#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy table tr th:last-child,#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy table tr td:last-child{border-right:0px}#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy table .ot-host,#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy table .ot-cookies-type{width:25%}.ot-sdk-cookie-policy[dir=rtl]{text-align:left}#ot-sdk-cookie-policy h3{font-size:1.5em}@media only screen and (max-width: 530px){.ot-sdk-cookie-policy:not(#ot-sdk-cookie-policy-v2) table,.ot-sdk-cookie-policy:not(#ot-sdk-cookie-policy-v2) thead,.ot-sdk-cookie-policy:not(#ot-sdk-cookie-policy-v2) tbody,.ot-sdk-cookie-policy:not(#ot-sdk-cookie-policy-v2) th,.ot-sdk-cookie-policy:not(#ot-sdk-cookie-policy-v2) td,.ot-sdk-cookie-policy:not(#ot-sdk-cookie-policy-v2) tr{display:block}.ot-sdk-cookie-policy:not(#ot-sdk-cookie-policy-v2) thead tr{position:absolute;top:-9999px;left:-9999px}.ot-sdk-cookie-policy:not(#ot-sdk-cookie-policy-v2) tr{margin:0 0 1em 0}.ot-sdk-cookie-policy:not(#ot-sdk-cookie-policy-v2) tr:nth-child(odd),.ot-sdk-cookie-policy:not(#ot-sdk-cookie-policy-v2) tr:nth-child(odd) a{background:#f6f6f4}.ot-sdk-cookie-policy:not(#ot-sdk-cookie-policy-v2) td{border:none;border-bottom:1px solid #eee;position:relative;padding-left:50%}.ot-sdk-cookie-policy:not(#ot-sdk-cookie-policy-v2) td:before{position:absolute;height:100%;left:6px;width:40%;padding-right:10px}.ot-sdk-cookie-policy:not(#ot-sdk-cookie-policy-v2) .ot-mobile-border{display:inline-block;background-color:#e4e4e4;position:absolute;height:100%;top:0;left:45%;width:2px}.ot-sdk-cookie-policy:not(#ot-sdk-cookie-policy-v2) td:before{content:attr(data-label);font-weight:bold}.ot-sdk-cookie-policy:not(#ot-sdk-cookie-policy-v2) li{word-break:break-word;word-wrap:break-word}#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy table{overflow:hidden}#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy table td{border:none;border-bottom:1px solid #d7d7d7}#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy table,#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy thead,#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy tbody,#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy th,#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy td,#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy tr{display:block}#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy table .ot-host,#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy table .ot-cookies-type{width:auto}#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy tr{margin:0 0 1em 0}#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy td:before{height:100%;width:40%;padding-right:10px}#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy td:before{content:attr(data-label);font-weight:bold}#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy li{word-break:break-word;word-wrap:break-word}#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy thead tr{position:absolute;top:-9999px;left:-9999px;z-index:-9999}#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy table tr:last-child td{border-bottom:1px solid #d7d7d7;border-right:0px}#ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy table tr:last-child td:last-child{border-bottom:0px}}
                
                    #ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy h5,
                    #ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy h6,
                    #ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy li,
                    #ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy p,
                    #ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy a,
                    #ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy span,
                    #ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy td,
                    #ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy #cookie-policy-description {
                        color: #696969;
                    }
                    #ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy th {
                        color: #696969;
                    }
                    #ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy .ot-sdk-cookie-policy-group {
                        color: #696969;
                    }
                    
                    #ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy #cookie-policy-title {
                            color: #696969;
                        }
                    
            
                    #ot-sdk-cookie-policy-v2.ot-sdk-cookie-policy table th {
                            background-color: #F8F8F8;
                        }
                    
            .ot-floating-button__front{background-image:url('https://cdn.cookielaw.org/logos/static/ot_persistent_cookie.png')}
                      @keyframes slide-down-custom {
                          0% {
                              bottom: 600px !important;
                          }
                          100% {
                              bottom: 0px;
                          }
                      }
                      @-webkit-keyframes slide-down-custom {
                          0% {
                              bottom: 600px !important;
                          }
                          100% {
                              bottom: 0px;
                          }
                      }
                      @-moz-keyframes slide-down-custom {
                          0% {
                              bottom: 600px !important;
                          }
                          100% {
                              bottom: 0px;
                          }
                      }
                      </style></head>


<body><div id="hs-web-interactives-top-push-anchor" class="go3670563033"></div>
    <div id="wrapper" x-data="{ current: '/adding-a-permission-system-to-node-js', background: '#ffffff', gradient: '', showNotice: false, bodyClass: '', headerClass: '', bannerVideo: false, menu: false, setBGColor() { if (this.background==  '#000e38') { this.bodyClass=  'dark-mode'; } else if (this.background==  '#00e5a4') { this.bodyClass=  'green'; } else if (this.background==  '#ffffff') { this.bodyClass=  'light-mode'; } else if (this.background==  '#E1DFFF') { this.bodyClass=  'lightpurple'; } else if(this.background==  '') { this.bodyClass=  'light-mode'; } }, headerCheck() { if(window.scrollY> (window.innerHeight * 0.02)) { 
                this.headerClass = 'header--frosted'; 
                if(window.location.pathname == '/') {
                    this.bannerVideo = false;
                    this.headerClass = 'header--frosted'; 
                    this.showNotice = false;
                }
            } else { 
                this.headerClass = 'nope';
                if(window.location.pathname == '/') {
                    this.bannerVideo = true;
                    this.headerClass = 'header--overvideo';
                    this.showNotice = true;
                } else {
                    this.bannerVideo = false;
                    this.headerClass = '';
                    this.showNotice = false;
                }
            }
            if(window.location.pathname == '/work') {
                this.bodyClass = 'dark-mode';
            }
        }
    }" @scroll.window="headerCheck()" :class="bodyClass" class="light-mode">

        <a class="skip-to-content-link" href="#main">Skip to content</a>


        <header id="header" :class="headerClass" class="header" role="banner">
                        <div class="header_container">
                <div class="logo">
                    <a data-no-swup="" href="https://www.nearform.com" title="Back to homepage" @click="current = '/home'">
                                                                            <svg width="144" height="25" viewBox="0 0 144 25" fill="none" xmlns="http://www.w3.org/2000/svg">
  <g class="wordmark">
  <path d="M0 0H3.26601L13.8828 15.4476V0H17.4036V21.7977H14.1376L3.52074 6.35007V21.7977H0V0Z" fill="#000E38"></path>
  <path d="M19.6966 13.8557C19.6966 8.93399 22.8443 5.66797 27.5387 5.66797C32.233 5.66797 35.2261 8.59738 35.3261 13.2644C35.3261 13.6646 35.2989 14.1013 35.2352 14.538H23.2173V14.7564C23.3083 17.4674 25.0277 19.2414 27.666 19.2414C29.7221 19.2414 31.2141 18.2134 31.678 16.4394H35.0441C34.4801 19.5871 31.8054 21.9799 27.848 21.9799C22.8352 21.9799 19.6875 18.7411 19.6875 13.8557H19.6966ZM31.8418 12.0817C31.5598 9.71637 29.9131 8.37904 27.5751 8.37904C25.428 8.37904 23.5903 9.80735 23.3447 12.0817H31.8418Z" fill="#000E38"></path>
  <path d="M44.5055 5.66797C48.7358 5.66797 51.1649 7.68763 51.1649 11.463V17.8495C51.1649 18.6592 51.5106 18.8775 52.1929 18.8775H52.8752V21.8069H51.1012C48.9178 21.8069 48.1718 20.8426 48.1718 19.2505C47.1165 20.8699 45.4971 21.9889 42.9134 21.9889C39.429 21.9889 37 20.2786 37 17.3219C37 14.0558 39.3654 12.2181 43.8231 12.2181H47.8443V11.2538C47.8443 9.47984 46.5706 8.38814 44.3599 8.38814C42.3675 8.38814 41.0302 9.32518 40.7755 10.7261H37.4731C37.8188 7.61485 40.4934 5.68617 44.5055 5.68617V5.66797ZM43.3865 19.3688C46.1885 19.3688 47.8079 17.7221 47.8352 15.2567V14.6927H43.6594C41.5761 14.6927 40.4207 15.4751 40.4207 17.0944C40.4207 18.4318 41.5397 19.3688 43.3774 19.3688H43.3865Z" fill="#000E38"></path>
  <path d="M58.1152 5.84961L58.4882 8.25136C59.2978 6.91402 60.5715 5.84961 63.1916 5.84961H75.6734V8.99736H62.4456C59.4525 8.99736 58.4882 11.3354 58.4882 13.7918V21.7976H55.1221V5.84961H58.1152Z" fill="#000E38"></path>
  <path d="M68.013 5.84971V4.35771C68.013 1.49199 69.3868 0 72.4617 0H75.6731V2.9567H72.8984C71.8067 2.9567 71.3427 3.42067 71.3427 4.51237V5.84971H75.6731V8.8064H71.4064V21.7886H68.013V8.8064H65.2383V5.84971H68.013Z" fill="#000E38"></path>
  <path d="M84.1973 5.66797C89.0554 5.66797 92.3214 8.97038 92.3214 13.8284C92.3214 18.6865 89.0554 21.9889 84.1973 21.9889C79.3393 21.9889 76.0732 18.7229 76.0732 13.8284C76.0732 8.93399 79.3393 5.66797 84.1973 5.66797ZM88.9008 13.8284C88.9008 10.7443 87.0358 8.5337 84.1973 8.5337C81.3589 8.5337 79.5303 10.7443 79.5303 13.8284C79.5303 16.9125 81.368 19.1232 84.1973 19.1232C87.0267 19.1232 88.9008 16.9125 88.9008 13.8284Z" fill="#000E38"></path>
  <path d="M97.498 5.84961L97.871 8.25136C98.6807 6.91402 99.9543 5.84961 102.574 5.84961H103.32V8.99736H101.828C98.8353 8.99736 97.871 11.3354 97.871 13.7918V21.7976H94.5049V5.84961H97.498Z" fill="#000E38"></path>
  <path d="M105.376 5.84925H108.306L108.679 7.93258C109.579 6.74991 110.953 5.69459 113.346 5.6582C115.429 5.6582 117.303 6.49518 118.267 8.55122C119.296 6.80449 121.097 5.6582 123.717 5.6582C127.019 5.6582 129.694 7.55959 129.694 12.5996V21.7881H126.328V12.818C126.328 10.0159 125.172 8.55122 122.998 8.55122C120.697 8.55122 119.232 10.2979 119.232 13.1637V21.7881H115.838V12.818C115.838 10.0159 114.683 8.55122 112.472 8.55122C110.262 8.55122 108.733 10.4162 108.733 13.2546V21.7881H105.367V5.84925H105.376Z" fill="#000E38"></path>
  </g>
  <g class="dash">
  <path d="M131.505 21.7979H143.741V25.0093H131.505V21.7979Z" fill="#00E5A4"></path>
  </g>
</svg>
                                            </a>
                </div>

                <button class="header_burger" aria-label="Open menu" @click="menu = !menu">
                    <span></span>
                    <span></span>
                    <span></span>
                </button>


                <nav class="nav" aria-label="main">
                    <ul class="nav_mobile" x-trap="menu">
                                                    <li>
                                <a :aria-current="menu = false; current == 'about'  ? 'true' : 'false'" :class="current == '/about' ? 'active' : ''" href="https://www.nearform.com/about/" @click="current = '/about'" class="">
                                    About                                </a>
                            </li>
                                                    <li>
                                <a :aria-current="menu = false; current == 'work'  ? 'true' : 'false'" :class="current == '/work' ? 'active' : ''" href="https://www.nearform.com/work/" @click="current = '/work'" class="">
                                    Work                                </a>
                            </li>
                                                    <li>
                                <a :aria-current="menu = false; current == 'insights'  ? 'true' : 'false'" :class="current == '/insights' ? 'active' : ''" href="https://www.nearform.com/insights/" @click="current = '/insights'" class="">
                                    Insights                                </a>
                            </li>
                                                                            <li>
                                <a :class="menu = false; current == '/careers' ? 'active' : ''" href="https://www.nearform.com/careers/" @click="current = '/careers'" class="">
                                    Careers                                </a>
                            </li>
                                                    <li>
                                <a data-no-swup="" :class="menu = false; current == '/contact' ? 'active' : ''" href="https://www.nearform.com/contact/" @click="current = '/contact'" class="">
                                    Contact                                </a>
                            </li>
                                            </ul>
                    <ul class="nav_left">
                                                    <li>
                                <a :aria-current="current == '/about'  ? 'true' : 'false'" :class="current == '/about' ? 'active' : ''" href="https://www.nearform.com/about/" @click="current = '/about'" aria-current="false" class="">
                                    About                                </a>
                            </li>
                                                    <li>
                                <a :aria-current="current == '/work'  ? 'true' : 'false'" :class="current == '/work' ? 'active' : ''" href="https://www.nearform.com/work/" @click="current = '/work'" aria-current="false" class="">
                                    Work                                </a>
                            </li>
                                                    <li>
                                <a :aria-current="current == '/insights'  ? 'true' : 'false'" :class="current == '/insights' ? 'active' : ''" href="https://www.nearform.com/insights/" @click="current = '/insights'" aria-current="false" class="">
                                    Insights                                </a>
                            </li>
                                            </ul>
                    <ul class="nav_right">
                                                    <li>
                                <a :aria-current="current == '/careers' ? 'true' : 'false'" :class="current == '/careers' ? 'active' : ''" href="https://www.nearform.com/careers/" @click="current = '/careers'" aria-current="false" class="">
                                    Careers                                </a>
                            </li>
                                                    <li>
                                <a :aria-current="current == '/contact' ? 'true' : 'false'" :class="current == '/contact' ? 'active' : ''" href="https://www.nearform.com/contact/" @click="current = '/contact'" data-no-swup="" aria-current="false" class="">
                                    Contact                                </a>
                            </li>
                                            </ul>
                </nav>


            </div>



        </header>

        <main id="swup" class="transition-fade push   " data-gradient-on="false" data-distance="20" x-init="
            background = '#ffffff'; 
            setBGColor(); 
            headerClass = ''
            showNotice = false;" @pageshow.window="data = $el.value">



    <!-- News/Insights/Digital Community Section -->
    <section class="grid--container intro intro--max-width intro_adding-a-permission-system-to-node-js ">
        <div class="grid grid--show" data-align="true">
            <div class="col col--12 col--md-9">
                <div class="title title--h2">
                    <h1 class="t-4xl">Adding a permission system to Node.js</h1>
                </div>    
            </div>

                            <div class="col col--12 col--md-6">
<div class="t-large ">
</div>
</div>
            
        </div>
    </section>
    <!-- End News/Insights/Digital Community Section -->







<section id="banner" class="banner banner--full-width banner_adding-a-permission-system-to-node-js ">
    
        <div class="image_container" x-init="bannerVideo = false; headerCheck()">
        

                                                <img loading="lazy" src="https://www.nearform.com/assets/images/placeholder.jpg" alt="Placeholder">
                            
        </div>
    </section>

    <section class="grid--container">
        <div class="grid grid--border-bottom">
            <div class="col col--10">
                                    <div class="banner_meta">
                        <div class="iconWhite">
                            <img alt="" src="https://www.nearform.com/media/site/b703c929e2-1722603194/icon-white.svg">                        </div>
                        <div class="iconDark">
                            <img alt="" src="https://www.nearform.com/media/site/5acfe14499-1722603194/icon-dark.svg">                        </div>
                        <div class="article_info">
                            <span class="t-xs"></span>
                            <span class="t-xs">22 Dec 2020</span>
                        </div>
                    </div>
                            </div>
                <div class="sharelinks col col--2 col--right">
        <ul class="banner_share">
            <li><span class="t-xs">Share</span></li>
                                                <li>
                        <a target="_blank" href="https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fwww.nearform.com%2Finsights%2Fadding-a-permission-system-to-node-js" title="Share on Linkedin">
                                                <svg class="svg-inline--fa fa-linkedin-in" aria-hidden="true" focusable="false" data-prefix="fab" data-icon="linkedin-in" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" data-fa-i2svg=""><path fill="currentColor" d="M100.28 448H7.4V148.9h92.88zM53.79 108.1C24.09 108.1 0 83.5 0 53.8a53.79 53.79 0 0 1 107.58 0c0 29.7-24.1 54.3-53.79 54.3zM447.9 448h-92.68V302.4c0-34.7-.7-79.2-48.29-79.2-48.29 0-55.69 37.7-55.69 76.7V448h-92.78V148.9h89.08v40.8h1.3c12.4-23.5 42.69-48.3 87.88-48.3 94 0 111.28 61.9 111.28 142.3V448z"></path></svg>    
                                                </a>
                    </li>
                                                                <li>
                        <a target="_blank" href="https://twitter.com/intent/tweet?text=Adding%20a%20permission%20system%20to%20Node.js%20https%3A%2F%2Fwww.nearform.com%2Finsights%2Fadding-a-permission-system-to-node-js%20via%20@nearform" title="Share on X">
                                                <svg class="svg-inline--fa fa-x-twitter" aria-hidden="true" focusable="false" data-prefix="fab" data-icon="x-twitter" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" data-fa-i2svg=""><path fill="currentColor" d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8L200.7 275.5 26.8 48H172.4L272.9 180.9 389.2 48zM364.4 421.8h39.1L151.1 88h-42L364.4 421.8z"></path></svg>
                                                </a>
                    </li>
                                                                <li>
                        <a target="_blank" href="http://www.facebook.com/sharer.php?u=https%3A%2F%2Fwww.nearform.com%2Finsights%2Fadding-a-permission-system-to-node-js" title="Share on Facebook">
                                                <svg class="svg-inline--fa fa-facebook-f" aria-hidden="true" focusable="false" data-prefix="fab" data-icon="facebook-f" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512" data-fa-i2svg=""><path fill="currentColor" d="M80 299.3V512H196V299.3h86.5l18-97.8H196V166.9c0-51.7 20.3-71.5 72.7-71.5c16.3 0 29.4 .4 37 1.2V7.9C291.4 4 256.4 0 236.2 0C129.3 0 80 50.5 80 159.4v42.1H14v97.8H80z"></path></svg>
                                                </a>
                    </li>
                                                                                                <li>
                <a href="mailto:?subject=Adding%20a%20permission%20system%20to%20Node.js&amp;body=Check out this page: https%3A%2F%2Fwww.nearform.com%2Finsights%2Fadding-a-permission-system-to-node-js" title="Share by Email">
                    <svg class="svg-inline--fa fa-envelope" aria-hidden="true" focusable="false" data-prefix="far" data-icon="envelope" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" data-fa-i2svg=""><path fill="currentColor" d="M64 112c-8.8 0-16 7.2-16 16v22.1L220.5 291.7c20.7 17 50.4 17 71.1 0L464 150.1V128c0-8.8-7.2-16-16-16H64zM48 212.2V384c0 8.8 7.2 16 16 16H448c8.8 0 16-7.2 16-16V212.2L322 328.8c-38.4 31.5-93.7 31.5-132 0L48 212.2zM0 128C0 92.7 28.7 64 64 64H448c35.3 0 64 28.7 64 64V384c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V128z"></path></svg>                
                </a>
            </li>
        </ul>
    </div>
        </div>
    </section>





<section id="" class="grid--container article    grid--space-bottom  ">
  <div class="grid grid--show" style="" data-align="true">
          
      <div class="blocks col col--12 col--md-6">
        
 

                      <div class="heading ">
              <h2 class="t-3xl ">Is adding a permission system in Node.js desirable — or even feasible? James Snell explores the challenges, workarounds and potential payoffs of permissions in Node.</h2>
            </div>
          

              </div>
          
      <div class="blocks col col--12 col--md-6">
        
 

                      <div class="text aligned-heading" style="padding-top: 157px;">
              
<div class="t-small ">
<p>Every so often we get a vulnerability report in <a href="https://nodejs.org/en/" rel="noopener" target="_blank">Node.js</a> that highlights the fact that the platform allows any arbitrary JavaScript loaded at runtime to access system resources with the full rights as the user.</p><p>For example, the npm package manager that ships with Node.js includes a utility called npx. This is a simple tool designed to make it easier to work with command-line tools deployed to the npm package registry without first having those installed. If you have Node.js installed, you can give it a try with a simple package that shows some basic contact information for me:</p></div>
            </div>
          

        
 

                      <div class="code ">
              <figure class="code_container">
        

    <figcaption>
        <span>text</span> <!-- Display the languageTitle or languageCode -->
        <button class="copy-button" data-clipboard-target="#code_block_66fb781a4003f">Copy to clipboard</button>
    </figcaption>
    <pre><code id="code_block_66fb781a4003f" class="language-text hljs language-plaintext" data-highlighted="yes">$ npx jasnell-card
   ╭────────────────────────────────────────────────────────────────────╮
   │                                                                    │
   │                  James M Snell / jasnell                           │
   │                                                                    │
   │          Work:  One Who Writes Codes                               │
   │   Open Source:  Node.js Technical Steering Committee ⬢             │
   │                                                                    │
   │       Twitter:  https://twitter.com/jasnell                        │
   │           npm:  https://npmjs.com/~jasnell                         │
   │        GitHub:  https://github.com/jasnell                         │
   │          Card:  npx @jasnell/card  (via GitHub Package Registry)   │
   │                                                                    │
   ╰────────────────────────────────────────────────────────────────────╯</code></pre>
</figure>
            </div>
          

        
 

                      <div class="text ">
              
<div class="t-small ">
<p>The first time you run this command, npx will prompt you to install it. Once it is downloaded and installed, the script is executed locally. This seems simple and straightforward enough until you look at the actual code that was executed. To make it easier, I've included the contents of the jasnell-card script below&nbsp;— see if you can spot the problem:</p></div>
            </div>
          

        
 

                      <div class="code ">
              <figure class="code_container">
        

    <figcaption>
        <span>text</span> <!-- Display the languageTitle or languageCode -->
        <button class="copy-button" data-clipboard-target="#code_block_66fb781a400a0">Copy to clipboard</button>
    </figcaption>
    <pre><code id="code_block_66fb781a400a0" class="language-text hljs language-plaintext" data-highlighted="yes">#!/usr/bin/env node
'use strict';&lt;/p&gt;&lt;p&gt;const fs = require('fs');
const path = require('path');
const output = fs.readFileSync(path.join(__dirname, 'output'), 'utf8');
console.log(output);&lt;/p&gt;&lt;p&gt;// try {
// const { userInfo } = require('os');
// const { resolve } = require('path')
// fs.readdir(resolve(userInfo().homedir, '.ssh'), (err, files) =&gt; {
//   I could have done something evil here...
// });
// } catch {}</code></pre>
</figure>
            </div>
          

        
 

                      <div class="text ">
              
<div class="t-small ">
<p>That's right, if that commented out section hadn't been commented out, that script you just downloaded and ran blindly from npm could actually have harvested all of your ssh private keys and sent them to me over the network.</p><p>Is this a security vulnerability? Yes! Is it intentional? Also yes. This is just the way Node.js works. Specifically, Node.js unconditionally runs any code that it loads with the permissions of the user that launches it. The next time someone tells you to run an npx command, it may be a good idea to look into what that script is doing before you actually run it!</p><p>When the TypeScript and Rust-based <a href="https://deno.land/" rel="noopener" target="_blank">deno</a> runtime was announced, it was touted from the outset as "secure by default". While that assertion has yet to be fully and rigorously tested in broad practice, part of the justification behind that claim is that users must explicitly grant permission for deno applications to use the file system and network. If file system access is not granted, for example, the above trick with my "business card" wouldn't be possible in deno.</p><p>Over the years, even long before deno emerged, there have been discussions about whether Node.js should introduce a permissions model that would allow blocking access to system resources and APIs, but the project has not been able to gain traction or consensus on a model that would work. A key reason for this has to do with the fundamental complexity of successfully implementing such a mechanism retroactively in the platform.</p><p>At NearForm Research, we have been revisiting this problem and exploring a possible approach to implementing it. In this article, we lay out the challenges and questions that must be addressed and answered, including explaining why adding a permission system in Node.js would absolutely be a non-trivial and difficult exercise.</p></div>
            </div>
          

        
 

                      <div class="heading ">
              <h3 class="t-large ">Operating system or platform</h3>
            </div>
          

        
 

                      <div class="text ">
              
<div class="t-small ">
<p>One question that immediately comes to mind when talking about a permission system for Node.js is whether Node.js should even bother with enforcing privileged access to system resources. Or should Node.js simply rely on mechanisms provided by the host operating system.</p><p>Certainly if we are talking about Node.js applications running in server environments, containers, Kubernetes clusters and so forth, there are more than adequate controls in place already to enforce isolation to keep a Node.js process from accessing anything it shouldn't. In such environments, the container is the sandbox. With properly configured container isolation and network policies, a permission system built into Node.js would be largely useless!</p><p>But Node.js is not run only on servers and in container environments. For instance, if you have Slack or Microsoft Teams or VSCode or any number of other Electron-based applications installed on your local workstation, you're running Node.js. If you're running a toolchain of developer tools such as <a href="https://reactjs.org/" rel="noopener" target="_blank">React</a> , <a href="https://eslint.org/" rel="noopener" target="_blank">eslint</a> , <a href="https://www.typescriptlang.org/" rel="noopener" target="_blank">typescript</a> , etc, you're running Node.js. And whenever you're running Node.js, the JavaScript that is executing is running with the full permissions of the user. Do you know what local resources all of those packages in your node_modules folders are using? Have you taken the time to find out?</p><p>Our platform and tooling infrastructure is based on a massive degree of trust afforded to code we never look at written by people we never know!</p><p>Some desktop operating systems have the ability to lock down local processes. Windows 10 Enterprise and Education editions running on AMD64 architecture now have a <a href="https://learn.microsoft.com/en-us/windows/security/threat-protection/windows-sandbox/windows-sandbox-overview" rel="noopener" target="_blank">Sandbox feature</a> that allows running applications in a protected environment. That feature is not available on all Windows 10 architectures or editions, however. OSX also provides a limited sandbox capability for applications distributed outside of Apple’s App Store; however, this sandbox rarely, if ever, is applied to Node.js applications. It can work, yes, but it's cumbersome to set up and difficult to achieve consistency.</p><p>[caption id="attachment_300014005" align="alignnone" width="600"]</p></div>
            </div>
          

        
 

                      <div class="image ">
              



  <figure>
    <img loading="lazy" src="https://www.nearform.com/media/pages/insights/adding-a-permission-system-to-node-js/43eb8c0096-1722602883/screenshot-2020-12-15-at-10.18.13-600x236-1600x.png" srcset="https://www.nearform.com/media/pages/insights/adding-a-permission-system-to-node-js/43eb8c0096-1722602883/screenshot-2020-12-15-at-10.18.13-600x236-1600x.png 1600w, https://www.nearform.com/media/pages/insights/adding-a-permission-system-to-node-js/43eb8c0096-1722602883/screenshot-2020-12-15-at-10.18.13-600x236-1200x.png 1200w, https://www.nearform.com/media/pages/insights/adding-a-permission-system-to-node-js/43eb8c0096-1722602883/screenshot-2020-12-15-at-10.18.13-600x236-800x.png 800w, https://www.nearform.com/media/pages/insights/adding-a-permission-system-to-node-js/43eb8c0096-1722602883/screenshot-2020-12-15-at-10.18.13-600x236-400x.png 400w" sizes="(max-width: 1600px) 100vw, 1600px" alt="permissions in node.js, app sandbox">
      </figure>



            </div>
          

        
 

                      <div class="text ">
              
<div class="t-small ">
<p><strong>Image Credit:</strong> Apple, <a href="https://developer.apple.com/library/archive/documentation/Security/Conceptual/AppSandboxDesignGuide/AboutAppSandbox/AboutAppSandbox.html" rel="noopener" target="_blank">About App Sandbox</a> [/caption]</p><p>The bottom line is that, on the client side, we cannot reasonably expect that all Node.js supported operating systems will be capable of <em>consistently</em> implementing sandboxes that limit system access or that those mechanisms will even be used. The lack of consistency is a fundamental problem if we want to ensure an experience that protects all users.</p><p>So, for the sake of discussion, let's assume that yes, we want the permission system to be provided by Node.js itself — recognising that it will not be useful or used in every deployment scenario. What other issues and challenges do we face?</p></div>
            </div>
          

        
 

                      <div class="heading ">
              <h3 class="t-large ">Defining a permission system for Node.js</h3>
            </div>
          

        
 

                      <div class="text ">
              
<div class="t-small ">
<p>With deno, when a script attempts to access the file system without the user having explicitly granted the script permission to do so, the operation will fail with a PermissionDenied error. This is a part of the "secure by default" assertion. This has been the behaviour in deno since it was released.</p><p>[caption id="attachment_300014006" align="alignnone" width="600"]</p></div>
            </div>
          

        
 

                      <div class="image ">
              



  <figure>
    <img loading="lazy" src="https://www.nearform.com/media/pages/insights/adding-a-permission-system-to-node-js/b0b8b4fcea-1722602883/screenshot-2020-12-15-at-10.19.55-600x206-1600x.png" srcset="https://www.nearform.com/media/pages/insights/adding-a-permission-system-to-node-js/b0b8b4fcea-1722602883/screenshot-2020-12-15-at-10.19.55-600x206-1600x.png 1600w, https://www.nearform.com/media/pages/insights/adding-a-permission-system-to-node-js/b0b8b4fcea-1722602883/screenshot-2020-12-15-at-10.19.55-600x206-1200x.png 1200w, https://www.nearform.com/media/pages/insights/adding-a-permission-system-to-node-js/b0b8b4fcea-1722602883/screenshot-2020-12-15-at-10.19.55-600x206-800x.png 800w, https://www.nearform.com/media/pages/insights/adding-a-permission-system-to-node-js/b0b8b4fcea-1722602883/screenshot-2020-12-15-at-10.19.55-600x206-400x.png 400w" sizes="(max-width: 1600px) 100vw, 1600px" alt="deno script, no file permissions">
      </figure>



            </div>
          

        
 

                      <div class="text ">
              
<div class="t-small ">
<p>Deno running a script without file permissions[/caption]</p><p>Node.js, on the other hand, has gone for 10+ years with the ability to read from the file system enabled by default for all Node.js applications. Changing that to reject file system access by default would quite literally break the workflow for tens of millions, if not hundreds of millions, of users globally. To be clear, the Node.js project absolutely <em>could</em> decide to follow deno's lead here and lockdown file system, network and other resources by default, but doing so would likely be the largest breaking change in Node.js history. It's possible but extremely unlikely to ever happen.</p><p>Any permission system added to Node.js must be backwards compatible with the existing ecosystem in order to succeed. Simply put, that means it will always be opt-in as opposed to deno's explicit opt-out approach.</p><p>For the sake of this conversation, then, let's start by defining command-line arguments for the node binary that explicitly list which permissions are granted and which are denied: <code>$ node --policy-deny=net --policy-grant=net.dns</code> We'll worry about the actual permissions a bit later. In a Node.js permission model, to remain backwards compatible with the existing ecosystem and not break the planet, we have to assume that all permissions are granted by default. In this example then, only the <code>net</code> permission is denied. The <code>--policy-grant</code> does not need to explicitly list file system access (for instance) because file system access is already granted. What we do have to list in <code>--policy-grant</code> are any adjustments to the denied permissions. In the example, we assume that permissions are hierarchical and that <code>--policy-deny=net</code> denies all access to network -related APIs, but we want to allow the application to go ahead and access Node's built-in <code>require('dns')</code> module.</p><p>To determine the active permissions, we start with an assumption that all permissions are granted, remove those that are explicitly and implicitly denied, then add back in those that are explicitly granted.</p><p>The immediate next question should be: What permissions are <em>implicitly denied</em> if we're assuming that all permissions are granted by default?</p><p>A core part of Node.js is the ability to spawn child processes and load native addons. It does no good for Node.js to restrict a process's ability to access the filesystem if the script can just turn around and spawn a separate process that does not have that same restriction! Likewise, given that native addons can directly link to system libraries and execute system calls, they can be used to completely bypass any permissions that have been denied.</p><p>The assumption, then, is that explicitly denying any permission should also implicitly deny other permissions that could be used to bypass those restrictions. In the above example, invoking the node binary with <code>--policy-deny=net</code> would also restrict access to loading native addons and spawning child processes. The <code>--policy-grant</code> would be used to explicitly re-enable those implicitly denied permissions if necessary.</p></div>
            </div>
          

        
 

                      <div class="heading ">
              <h3 class="t-large ">The granularity problem</h3>
            </div>
          

        
 

                      <div class="text ">
              
<div class="t-small ">
<p>Deno's permissions are fairly simplistic (that's not a bad thing). They are:</p></div>
            </div>
          

        
 

                      <div class="list ">
              <ul><li><code>--allow-all</code> (grants all permissions, effectively disabling checking)</li><li><code>--allow-env</code> (grants access to getting and setting environment variables)</li><li><code>--allow-hrtime</code> (grants access to high-resolution time measurement)</li><li><code>-allow-net= </code>(grants access to network access, with an optional comma-delimited list of allowed domain names)</li><li><code>--allow-plugin</code> (grants access to native addons / plugins)</li><li><code>--allow-read= </code>(grants access to file system read access, with an optional comma-delimited list of directories and file paths)</li><li><code>--allow-run </code>(grants the ability to spawn child processes)</li><li><code>--allow-write= </code>(grants access to file system write access, with an optional comma-delimited list of directories and file paths)</li></ul>            </div>
          

        
 

                      <div class="text ">
              
<div class="t-small ">
<p>The key question for Node.js — should we choose to implement a permissions system — is whether this level of granularity is sufficient. The deno permissions exist as a flat namespace and apply to the entire process, including all modules loaded and run. The <code>--allow-net</code> allows all network access (TCP, UDP, etc.) for the given set of target domain names and allows all dependency modules loaded to access the network. Is that good enough, or does Node.js need something more granular? For instance, Node.js allows creating arbitrary TCP servers and UDP bindings, in addition to HTTP. Should Node.js's permissions specifically allow disabling UDP while allowing TCP? (For instance, node <code>--policy-deny=net.udp</code> ).</p></div>
            </div>
          

        
 

                      <div class="heading ">
              <h3 class="t-large ">Flat vs hierarchical permission namespace</h3>
            </div>
          

        
 

                      <div class="text ">
              
<div class="t-small ">
<p>While researching this topic, we generated a set of potential permissions for Node.js arranged hierarchically. They are:</p></div>
            </div>
          

        
 

                      <div class="list ">
              <ul><li><code>special</code> (those that are implicitly denied if any others are explicitly denied)
<ul><li><code>special.inspector</code> (controls user-code access to the Inspector protocol, which may be used to bypass permissions)</li><li><code>special.addons</code> (controls the ability to load native addons)</li><li><code>special.child_process</code> (controls the ability to spawn child processes)</li></ul></li><li><code>fs</code> (access to file system)
<ul><li><code>fs.in</code> (controls the ability to read from the file system)</li><li><code>fs.out</code> (controls the ability to write to the file system)</li></ul></li><li><code>net</code> (access to networking operations)
<ul><li><code>net.udp</code> (controls access to UDP)</li><li><code>net.dns</code> (controls access to DNS functions)</li><li><code>net.tcp</code> (controls access to TCP)
<ul><li><code>net.tcp.in</code> (controls the ability to listen for TCP connections -- that is, act as a server)</li><li><code>net.tcp.out</code> (controls the ability to initiate TCP connections -- that is, act as a client)</li></ul></li><li><code>net.tls</code> (controls the ability to use TLS connections)
<ul><li><code>net.tls.log</code> (controls the ability to enable detailed TLS logging)</li></ul></li></ul></li><li><code>process</code> (controls access to APIs that manipulate process state, e.g. setting the process title or rlimit, for instance)</li><li><code>signal</code> (controls the ability to send OS signals to other processes)</li><li><code>timing</code> (controls access to high-resolution time measurements)</li><li><code>user</code> (controls access to user information, such as calling os.userInfo() to get the location of the user's home directory or access environment variables)</li><li><code>workers</code> (controls the ability to spawn worker threads)</li><li><code>experimental</code> (controls access to experimental APIs)</li></ul>            </div>
          

        
 

                      <div class="text ">
              
<div class="t-small ">
<p>Looking at this list, the immediate first question should be: Is this level of detail necessary, or is deno's more simplistic approach adequate? That remains an unanswered question that will need to be answered before we can make further progress on the permissions system.</p><p>For example, is there enough reason to break down the set of net permissions to this degree? Or is it sufficient to say, no matter what the protocol you're using, network access is allowed or denied? In deno, using the <code>--allow-net</code> allows an application to act as both a TCP client and server, without differentiating between inbound and outbound connections. Would that also be enough for Node.js or do we need to better differentiate between those?</p><p>Let's assume, however, for the sake of this conversation that we're going with this kind of hierarchical permission namespace.</p></div>
            </div>
          

        
 

                      <div class="heading ">
              <h3 class="t-large ">Process or module scoped? Or both?</h3>
            </div>
          

        
 

                      <div class="text ">
              
<div class="t-small ">
<p>As I've mentioned, deno's permissions are always process-scoped. When net is denied, it's denied for the entire application and all modules that application imports. Would process scope be sufficient for Node.js? Some have argued that it is not.</p><p>While discussing the possibility of adding permissions to Node.js, the question has been raised about whether the permissions could be applied <em>per module</em> . What exactly this means depends entirely on whom you ask.</p><p>For some, per module permissions mean that the active permissions for a process is the union of permissions configured (per their respective package.json files) by all loaded modules and those granted by the user of the process. In this approach, modules essentially declare what permissions they need and some part of the Node.js permission system matches those up with the permissions granted. If there's a mismatch, an error is thrown, the module is not loaded, or some other action is taken.</p><p>For others, per module permissions implies each module has its own active set of permissions — theoretically allowing a trusted application to load and execute a potentially untrusted module with a different set of permissions. Accomplishing this in Node.js would be non-trivial at best and impossible at worst. The key complicating factor is that Node.js loads all modules (running within a single thread) into the same global context. Modules can share code, pass references around, exchange callbacks, etc. Requiring that every module have its own active permissions would require us to reimplement a significant chunk of Node.js and definitely does not fit into the backwards compatibility goal we stated upfront without incurring a significantly higher complexity cost. We could, in theory, implement another type of module loading within Node.js, or give each module their own possibly restricted copies of the Node.js core APIs, or work with TC-39 to define and implement new language level constructs where modules can be loaded into isolated contexts — but doing so would be complicated, take a long time and honestly be of questionable value given the difficulty involved!</p><p>Whatever your definition of per module permissions happens to be, they add a level of complexity to the entire discussion that we are not (yet) convinced is justified. Per-process and per-worker thread permissions are by far easier to implement, easier to reason about and likely cover the overwhelming majority of use cases. Especially if we consider that there will be environments (such as containers) where use of the permission system simply won't make sense, the additional complexity just may not be worth it.</p></div>
            </div>
          

        
 

                      <div class="heading ">
              <h3 class="t-large ">The complexity of asynchronous context</h3>
            </div>
          

        
 

                      <div class="text ">
              
<div class="t-small ">
<p>Closely related to this issue of permission scope is the question of whether permissions should be mutable within a process, and what the impact of such changes should be.</p><p>Take the following case as an example: Here we run an application that creates two parallel asynchronous contexts. When both contexts are created, the <code>net</code> permission is granted. In one, however, the <code>net</code> permission is immediately denied. Should that change impact the entire process, or should it only impact the asynchronous context in which it was denied? Specifically, what should the two console.log statements in the script output?</p></div>
            </div>
          

        
 

                      <div class="code ">
              <figure class="code_container">
        

    <figcaption>
        <span>text</span> <!-- Display the languageTitle or languageCode -->
        <button class="copy-button" data-clipboard-target="#code_block_66fb781a424ca">Copy to clipboard</button>
    </figcaption>
    <pre><code id="code_block_66fb781a424ca" class="language-text hljs language-plaintext" data-highlighted="yes">const { setTimeout } = require('timers/promises');&lt;/p&gt;&lt;p&gt;console.log(process.policy.check('net')); // true&lt;/p&gt;&lt;p&gt;process.nextTick(() =&gt; {
  process.policy.deny('net');
  setTimeout(1000).then(() =&gt; {
    /* 1 */ console.log(process.policy.check('net'));
  });
});&lt;/p&gt;&lt;p&gt;process.nextTick(() =&gt; {
  setTimeout(1000).then(() =&gt; {
    /* 2 */ console.log(process.policy.check('net'));
  });
});</code></pre>
</figure>
            </div>
          

        
 

                      <div class="text ">
              
<div class="t-small ">
<p>The answer has major ramifications to the complexity of the implementation inside Node.js. If the answer is that the change should affect the entire process (which is the way deno handles it), then the implementation is much easier — but code that starts to execute when the permission is granted may fail later when that permission is revoked. (For instance, imagine an async generator function that is created when the permission is allowed that suddenly errors when attempting to yield on the next internal iteration.) It's a perfectly acceptable answer to say that's fine, permission changes should be process-scoped, and leave it at that. But is that what we want?</p><p>If the answer is that the change should be limited only to the async context in which the change was made, suddenly the implementation becomes much more complicated because we have to modify Node.js's internal asynchronous context tracing mechanisms to retain the policy that was in scope when the context was created, ensure that the retained policy is used when callbacks or microtasks are invoked, then revert to the prior policy when those callbacks complete. It becomes a careful and tedious dance that requires changes everywhere in Node.js where native code invokes JavaScript code or where the asynchronous execution context changes. We'd even have to make sure that native C++ calls to the V8 APIs that get and set properties are protected, since those can run arbitrary user code in the form of getters and setters or proxies — we can't have a case where all the code <em>except</em> getters running in an async context are denied net permissions!</p><p>(There are also quite a few issues around maintaining performance and usability with this approach that are way too much to get into here!)</p><p>There are advantages to having permissions flow with the async context, however, that make it an attractive option. We could, for instance, vary permissions in a server by request (e.g. an authenticated user may have read permissions in the file system while an anonymous user does not). Is that kind of benefit worth the additional complexity? At this point we're definitely not yet convinced, but it's still a worthwhile mental exercise in this discussion.</p></div>
            </div>
          

        
 

                      <div class="heading ">
              <h3 class="t-large ">The public vs private API problem</h3>
            </div>
          

        
 

                      <div class="text ">
              
<div class="t-small ">
<p>Another critical issue with this whole discussion is the fact that, in Node.js, most of the built-in modules (fs, http, net, crypto, etc) make use of the same APIs as user code. Loading a module with <code>require()</code> , for instance, makes use of the same file system operations as user code calling <code>fs.readFile()</code> . We can't have a situation where denying file system access to the Node.js process causes Node.js itself to stop working. Node.js's own core library must be capable of running in a privileged access mode that is not available to user code, but it would be ideal not to have to rewrite most of the core JavaScript to accomplish that.</p><p>Fortunately, such a privileged mode is easy enough to implement but still does require extensive changes through the codebase. Every time Node.js internal code is running, the privileged access would apply; every time user code is running, the set of active permissions would apply. This would mean gating every callback with some additional code to ensure that appropriate security context has been applied. That can be difficult to do! It would be much easier if the Node.js internals followed a different code path than user code, but to accomplish that would take a significant effort! Also, we need answers to all of the rest of the questions raised here in order to implement it correctly. For instance, the question about whether permission changes follow the async execution context would have a major impact on the internal implementation of asynchronous callback and Promise API implementations (it would also have a major impact on performance but that's a whole different matter!).</p></div>
            </div>
          

        
 

                      <div class="heading ">
              <h3 class="t-large ">Where do we go from here?</h3>
            </div>
          

        
 

                      <div class="text ">
              
<div class="t-small ">
<p>Right now, our intent in investigating these issues is to start a dialogue to first determine whether adding a permission system in Node.js is both desirable and feasible, and second to determine what such a system may look like. The issues discussed here are only a small handful of the issues that need to be considered. If Node.js were starting from scratch, with a totally green field and the luxury of a decade of hindsight, this discussion and the decisions would be much easier. But Node.js has an ecosystem that touches hundreds of millions of people globally and is used pretty much everywhere&nbsp;— we cannot break the planet, so we have to be careful how we proceed.</p><p>As one would likely expect, Node.js users have opinions about a great many topics — this is no exception. I recently ran a very unscientific but still meaningful poll on Twitter about how folks would feel about adding a permission system to Node.js. The response was overwhelmingly consistent in terms of wanting permissions but extremely divergent on the details:</p><p>[caption id="attachment_300014007" align="alignnone" width="600"]</p></div>
            </div>
          

        
 

                      <div class="image ">
              



  <figure>
    <img loading="lazy" src="https://www.nearform.com/media/pages/insights/adding-a-permission-system-to-node-js/30ba168cec-1722602883/screenshot-2020-12-15-at-10.21.55-600x299-1600x.png" srcset="https://www.nearform.com/media/pages/insights/adding-a-permission-system-to-node-js/30ba168cec-1722602883/screenshot-2020-12-15-at-10.21.55-600x299-1600x.png 1600w, https://www.nearform.com/media/pages/insights/adding-a-permission-system-to-node-js/30ba168cec-1722602883/screenshot-2020-12-15-at-10.21.55-600x299-1200x.png 1200w, https://www.nearform.com/media/pages/insights/adding-a-permission-system-to-node-js/30ba168cec-1722602883/screenshot-2020-12-15-at-10.21.55-600x299-800x.png 800w, https://www.nearform.com/media/pages/insights/adding-a-permission-system-to-node-js/30ba168cec-1722602883/screenshot-2020-12-15-at-10.21.55-600x299-400x.png 400w" sizes="(max-width: 1600px) 100vw, 1600px" alt="Twitter poll on file permissions in node.js">
      </figure>



            </div>
          

        
 

                      <div class="text ">
              
<div class="t-small ">
<p>When asked in a fairly unscientific survey, a not-quite-statistically-significant-but-still-interesting number of respondents were overwhelmingly in favour of adding permissions to Node.js.[/caption]</p><p>I'd love to hear your thoughts and have you join the conversation! Exploration on the permission system is being done currently in <a href="https://github.com/nodejs/node/pull/33504" rel="noopener" target="_blank">this pull request</a> in the Node.js repository. If this is an area of interest and you have some thoughts on how permissions can be implemented in Node.js, I invite you to share and help in the effort! Struggling with <a href="/services/enterprise-node-js-development/" rel="noreferrer">Node.js development</a> ? <a href="/contact/" rel="noreferrer">Get in touch</a> today to organise a <a href="/services/discovery-workshop/" rel="noreferrer">discovery workshop</a> .</p></div>
            </div>
          

              </div>
      </div>
</section>




<div x-intersect:enter="bodyClass = 'light-mode'"></div>

                          
            <div class="layout_wrap contact_cta dark-mode">

                <section class="grid--container grid--show dark-mode" style="background-color: rgba(0,14,56,1);">
                    <div class="grid grid--h-center grid--border-bottom">
                        <div class="col col--6 col--center col--h-center">
                            <p class="t-3xl">Insight, imagination and expertly engineered solutions to accelerate and sustain progress.</p> 
                            <a class="btn btn--primary" href="https://www.nearform.com/contact">Contact</a>
                        </div>
                    </div>
                </section>
            </div>
            
</main>

<footer class="footer footer--full-width grid-container">
  <div class="footer_content footer--max-width grid">

    <div class="footer_contact col col--12 col--md-6">
      <div>

        <div class="footer_form">
          <h2>Keep in touch</h2>
          <div>
            <p>Get our newsletter, event invites, plus developer insights and research.</p>            <a href="/newsletter" class="btn btn--primary btn--small" data-no-swup="">Subscribe</a>
          </div>
        </div>

        <div class="footer_commerce">
          <p>Check out our retail offerings<br><a href="https://commerce.nearform.com/" target="_blank">Nearform_Commerce</a></p>        </div>

      </div>

    </div>

    <div class="footer_menu col col--12 col--md-5">
      <nav aria-label="footer">
                <ul>
          <li>
            <h3 class="t-disabled">Company</h3>
          </li>
                                    <li>
                <a href="https://www.nearform.com/about/">About</a>
              </li>
                                                <li>
                <a href="https://www.nearform.com/work/">Work</a>
              </li>
                                                <li>
                <a href="https://www.nearform.com/careers/">Careers</a>
              </li>
                                                <li>
                <a href="https://www.nearform.com/sustainability/">Sustainability</a>
              </li>
                                                <li>
                <a data-no-swup="" href="https://www.nearform.com/contact/">Contact</a>
              </li>
                              </ul>

                <ul>
          <li>
            <h3 class="t-disabled">Updates</h3>
          </li>
                                    <li>
                <a href="https://www.nearform.com/insights/">Insights</a>
              </li>
                                                <li>
                <a href="https://www.nearform.com/news/">News</a>
              </li>
                                                <li>
                <a href="https://www.nearform.com/events/">Events</a>
              </li>
                              </ul>

                <ul>
          <li>
            <h3 class="t-disabled">Developers</h3>
          </li>
                                    <li>
                <a href="https://www.nearform.com/open-source/">Open Source</a>
              </li>
                                                <li>
                <a href="https://www.nearform.com/hashnode/">Hashnode</a>
              </li>
                              </ul>
            <ul class="nav_social">
    <li><h3 class="t-disabled">Follow</h3></li>
              <li>
          <a target="_blank" href="https://www.linkedin.com/company/nearform">LinkedIn</a>
        </li>
              <li>
          <a target="_blank" href="https://twitter.com/nearform">X</a>
        </li>
              <li>
          <a target="_blank" href="https://www.facebook.com/NearformLtd/">Facebook</a>
        </li>
              <li>
          <a target="_blank" href="https://www.instagram.com/nearform_hq/?hl=en">Instagram</a>
        </li>
              <li>
          <a target="_blank" href="https://www.youtube.com/c/nearform">YouTube</a>
        </li>
          </ul>
      </nav>
    </div>

  </div>

  <div class="footer_imprint grid">
    <div class="footer_icon col col--12 col--md-5">
      <svg width="64" height="50" viewBox="0 0 64 50" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 0H6.53695L27.7727 30.8849V0H34.8096V43.5839H28.2726L7.03691 12.6989V43.5839H0V0Z" fill="white"></path>
<path d="M38.9971 43.5853H63.47V49.9973H38.9971V43.5853Z" fill="#00EAB0"></path>
</svg>
    </div>
    <div class="footer_terms col col--12 col--md-7">
      <div>
        <p class="copyright">© 2024 Nearform</p>
        <a href="https://www.nearform.com/cookie-policy/">Cookie policy</a>
        <a href="https://www.nearform.com/legal/">Legal requirements</a>
        <a href="https://www.nearform.com/privacy-statement/">Privacy statement</a>
        <button id="toggleMotion" class="toggle-button">
          Site Motion <span>ON</span>
        </button>

      </div>
    </div>
  </div>

  <script type="text/javascript">
// LinkedIn Insight Tag - goes before </body> tag
_linkedin_partner_id = "399841";
window._linkedin_data_partner_ids = window._linkedin_data_partner_ids || [];
window._linkedin_data_partner_ids.push(_linkedin_partner_id);
</script>
<script type="text/javascript">
(function(l) {
if (!l){window.lintrk = function(a,b){window.lintrk.q.push([a,b])};
window.lintrk.q=[]}
var s = document.getElementsByTagName("script")[0];
var b = document.createElement("script");
b.type = "text/javascript";b.async = true;
b.src = "https://snap.licdn.com/li.lms-analytics/insight.min.js";
s.parentNode.insertBefore(b, s);})(window.lintrk);
</script>
<noscript>
<img height="1" width="1" style="display:none;" alt="" src="https://px.ads.linkedin.com/collect/?pid=399841&fmt=gif"/>
</noscript>
  </footer></div> <!-- Alpine Wrapper -->

  <!-- Start of HubSpot Embed Code -->
  <script type="text/javascript" id="hs-script-loader" async="" defer="" src="//js.hs-scripts.com/1964953.js"></script>
  <!-- End of HubSpot Embed Code -->

  

  
<div class="go2933276541 go2369186930" id="hs-web-interactives-top-anchor"><div id="hs-interactives-modal-overlay" class="go1632949049"></div></div>
<div class="go2933276541 go1348078617" id="hs-web-interactives-bottom-anchor"></div>
<div id="hs-web-interactives-floating-container">
  <div id="hs-web-interactives-floating-top-left-anchor" class="go2417249464 go613305155">
  </div>
  <div id="hs-web-interactives-floating-top-right-anchor" class="go2417249464 go471583506">
  </div>
  <div id="hs-web-interactives-floating-bottom-left-anchor" class="go2417249464 go3921366393">
  </div>
  <div id="hs-web-interactives-floating-bottom-right-anchor" class="go2417249464 go3967842156">
  </div>
</div>
<div id="onetrust-consent-sdk"><div class="onetrust-pc-dark-filter ot-fade-in" style="z-index:2147483645;"></div><div id="onetrust-banner-sdk" class="otFlat bottom ot-wo-title vertical-align-content" aria-modal="true" tabindex="0" style="bottom: 0px;"><div role="alertdialog" aria-describedby="onetrust-policy-text" aria-label="Privacy"><div class="ot-sdk-container"><div class="ot-sdk-row"><div id="onetrust-group-container" class="ot-sdk-eight ot-sdk-columns"><div class="banner_logo"></div><div id="onetrust-policy"><p id="onetrust-policy-text">By clicking “All looks good”, you agree to the storing of cookies on your device to enhance site navigation, analyze site usage, and assist in our marketing efforts. <a href="https://www.nearform.com/cookie-policy/" aria-label="More information about your privacy">Cookies Notice</a></p></div></div><div id="onetrust-button-group-parent" class="ot-sdk-three ot-sdk-columns"><div id="onetrust-button-group"><button id="onetrust-pc-btn-handler" class="cookie-setting-link">Manage Settings</button>  <button id="onetrust-accept-btn-handler">All looks good</button></div></div></div></div><!-- Close Button --><div id="onetrust-close-btn-container"><button class="onetrust-close-btn-handler onetrust-close-btn-ui banner-close-button ot-close-icon" aria-label="Close"></button></div><!-- Close Button END--></div></div><div id="onetrust-pc-sdk" class="ot-sdk-container otPcPopup ot-hide ot-fade-in ot-accordions-pc" aria-modal="true" role="alertdialog" aria-describedby="pc-policy-text" lang="en" aria-label="Privacy Preference Center"><section id="ot-filter-modal"><div id="ot-options"><h3 id="modal-header">Filters</h3><div class="ot-group-options"><div class="ot-group-option"><div class="ot-checkbox"><input id="storage-access-group" class="ot-group-option-box category-filter-handler" type="checkbox"> <label for="storage-access-group"><span>Information storage and access</span></label></div></div></div><div class="btn-group"><button id="filter-cancel-handler" class="borderless-btn">Cancel</button> <button id="filter-apply-handler" class="ot-pill">Apply</button></div></div></section><!-- PC Close Button --><div id="pc-close-btn-container"><button id="close-pc-btn-handler" class="main close-pc-btn-handler pc-close-button ot-close-icon" aria-label="Close"></button></div><!-- PC Close Button END --><div id="ot-content" class="ot-main-content"><!-- PC logo--><div class="pc-logo-container"><div class="pc-logo" role="img" aria-label="Company Logo" style="background-image: url(&quot;https://cdn.cookielaw.org/logos/static/ot_logo.png&quot;);
                background-position: left;"></div></div><h2 id="pc-title">Privacy Preference Center</h2><div id="pc-policy-text">When you visit any website, it may store or retrieve information on your browser, mostly in the form of cookies. This information might be about you, your preferences or your device and is mostly used to make the site work as you expect it to. The information does not usually directly identify you, but it can give you a more personalized web experience. Because we respect your right to privacy, you can choose not to allow some types of cookies. Click on the different category headings to find out more and change our default settings. However, blocking some types of cookies may impact your experience of the site and the services we are able to offer.
            <br><a href="https://cookiepedia.co.uk/giving-consent-to-cookies" class="privacy-notice-link" rel="noopener" target="_blank" aria-label="More information about your privacy, opens in a new tab">More information</a></div><section class="ot-sdk-row"><div class="ot-sdk-column"><ul class="category-group"><li class="category-item" data-optanongroupid="C0003"><input type="checkbox" role="button" tabindex="0" name="storage-access" id="ot-group-id-C0003-toggle" aria-expanded="false" ot-accordion="true" aria-controls="ot-desc-id-C0003" aria-labelledby="ot-header-id-C0003"><div class="accordion-header"><h3 class="category-header" id="ot-header-id-C0003">Functional Cookies</h3><div class="ot-toggle-group"><div class="ot-toggle"><div class="checkbox"><input id="ot-group-id-C0003" class="category-switch-handler" type="checkbox" role="switch" aria-checked="false" name="ot-group-id-C0003" data-optanongroupid="C0003" aria-labelledby="ot-header-id-C0003"> <label for="ot-group-id-C0003"><span class="label-text">Functional Cookies</span></label></div></div><div class="ot-arrow-container"><svg class="ot-arrow" x="0px" y="0px" width="10px" height="10px" viewBox="0 0 451.846 451.847" xml:space="preserve"><g><path fill="#7b7b7b" d="M345.441,248.292L151.154,442.573c-12.359,12.365-32.397,12.365-44.75,0c-12.354-12.354-12.354-32.391,0-44.744
                    L278.318,225.92L106.409,54.017c-12.354-12.359-12.354-32.394,0-44.748c12.354-12.359,32.391-12.359,44.75,0l194.287,194.284
                    c6.177,6.18,9.262,14.271,9.262,22.366C354.708,234.018,351.617,242.115,345.441,248.292z"></path></g></svg></div></div></div><div class="accordion-text" role="region"><p class="accordion-text-description ot-category-desc" id="ot-desc-id-C0003">These cookies enable the website to provide enhanced functionality and personalisation. They may be set by us or by third party providers whose services we have added to our pages. If you do not allow these cookies then some or all of these services may not function properly.</p><!-- COOKIE SUBGROUPS*** --><!-- COOKIE SUBGROUPS END*** --></div><!-- IAB2 purpose description--></li><li class="category-item ot-always-active-group" data-optanongroupid="C0001"><input type="checkbox" role="button" tabindex="0" name="storage-access" id="ot-group-id-C0001-toggle" aria-expanded="false" ot-accordion="true" aria-controls="ot-desc-id-C0001" aria-labelledby="ot-header-id-C0001"><div class="accordion-header"><h3 class="category-header" id="ot-header-id-C0001">Strictly Necessary Cookies</h3><div class="ot-toggle-group"><div class="ot-always-active">Always Active</div><div class="ot-toggle ot-hide-tgl"><div class="checkbox"><input id="ot-group-id-C0001" class="category-switch-handler" type="checkbox" role="switch" aria-checked="true" aria-hidden="true" name="ot-group-id-C0001" data-optanongroupid="C0001" checked="" aria-labelledby="ot-header-id-C0001"> <label for="ot-group-id-C0001"><span class="label-text">Strictly Necessary Cookies</span></label></div></div><div class="ot-arrow-container"><svg class="ot-arrow" x="0px" y="0px" width="10px" height="10px" viewBox="0 0 451.846 451.847" xml:space="preserve"><g><path fill="#7b7b7b" d="M345.441,248.292L151.154,442.573c-12.359,12.365-32.397,12.365-44.75,0c-12.354-12.354-12.354-32.391,0-44.744
                    L278.318,225.92L106.409,54.017c-12.354-12.359-12.354-32.394,0-44.748c12.354-12.359,32.391-12.359,44.75,0l194.287,194.284
                    c6.177,6.18,9.262,14.271,9.262,22.366C354.708,234.018,351.617,242.115,345.441,248.292z"></path></g></svg></div></div></div><div class="accordion-text" role="region"><p class="accordion-text-description ot-category-desc" id="ot-desc-id-C0001">These cookies are necessary for the website to function and cannot be switched off in our systems. They are usually only set in response to actions made by you which amount to a request for services, such as setting your privacy preferences, logging in or filling in forms. You can set your browser to block or alert you about these cookies, but some parts of the site will not then work. These cookies do not store any personally identifiable information.</p><!-- COOKIE SUBGROUPS*** --><!-- COOKIE SUBGROUPS END*** --></div><!-- IAB2 purpose description--></li><li class="category-item" data-optanongroupid="C0004"><input type="checkbox" role="button" tabindex="0" name="storage-access" id="ot-group-id-C0004-toggle" aria-expanded="false" ot-accordion="true" aria-controls="ot-desc-id-C0004" aria-labelledby="ot-header-id-C0004"><div class="accordion-header"><h3 class="category-header" id="ot-header-id-C0004">Targeting Cookies</h3><div class="ot-toggle-group"><div class="ot-toggle"><div class="checkbox"><input id="ot-group-id-C0004" class="category-switch-handler" type="checkbox" role="switch" aria-checked="false" name="ot-group-id-C0004" data-optanongroupid="C0004" aria-labelledby="ot-header-id-C0004"> <label for="ot-group-id-C0004"><span class="label-text">Targeting Cookies</span></label></div></div><div class="ot-arrow-container"><svg class="ot-arrow" x="0px" y="0px" width="10px" height="10px" viewBox="0 0 451.846 451.847" xml:space="preserve"><g><path fill="#7b7b7b" d="M345.441,248.292L151.154,442.573c-12.359,12.365-32.397,12.365-44.75,0c-12.354-12.354-12.354-32.391,0-44.744
                    L278.318,225.92L106.409,54.017c-12.354-12.359-12.354-32.394,0-44.748c12.354-12.359,32.391-12.359,44.75,0l194.287,194.284
                    c6.177,6.18,9.262,14.271,9.262,22.366C354.708,234.018,351.617,242.115,345.441,248.292z"></path></g></svg></div></div></div><div class="accordion-text" role="region"><p class="accordion-text-description ot-category-desc" id="ot-desc-id-C0004">These cookies may be set through our site by our advertising partners. They may be used by those companies to build a profile of your interests and show you relevant adverts on other sites. They do not store directly personal information, but are based on uniquely identifying your browser and internet device. If you do not allow these cookies, you will experience less targeted advertising.</p><!-- COOKIE SUBGROUPS*** --><!-- COOKIE SUBGROUPS END*** --></div><!-- IAB2 purpose description--></li><li class="category-item" data-optanongroupid="C0002"><input type="checkbox" role="button" tabindex="0" name="storage-access" id="ot-group-id-C0002-toggle" aria-expanded="false" ot-accordion="true" aria-controls="ot-desc-id-C0002" aria-labelledby="ot-header-id-C0002"><div class="accordion-header"><h3 class="category-header" id="ot-header-id-C0002">Performance Cookies</h3><div class="ot-toggle-group"><div class="ot-toggle"><div class="checkbox"><input id="ot-group-id-C0002" class="category-switch-handler" type="checkbox" role="switch" aria-checked="false" name="ot-group-id-C0002" data-optanongroupid="C0002" aria-labelledby="ot-header-id-C0002"> <label for="ot-group-id-C0002"><span class="label-text">Performance Cookies</span></label></div></div><div class="ot-arrow-container"><svg class="ot-arrow" x="0px" y="0px" width="10px" height="10px" viewBox="0 0 451.846 451.847" xml:space="preserve"><g><path fill="#7b7b7b" d="M345.441,248.292L151.154,442.573c-12.359,12.365-32.397,12.365-44.75,0c-12.354-12.354-12.354-32.391,0-44.744
                    L278.318,225.92L106.409,54.017c-12.354-12.359-12.354-32.394,0-44.748c12.354-12.359,32.391-12.359,44.75,0l194.287,194.284
                    c6.177,6.18,9.262,14.271,9.262,22.366C354.708,234.018,351.617,242.115,345.441,248.292z"></path></g></svg></div></div></div><div class="accordion-text" role="region"><p class="accordion-text-description ot-category-desc" id="ot-desc-id-C0002">These cookies allow us to count visits and traffic sources so we can measure and improve the performance of our site. They help us to know which pages are the most and least popular and see how visitors move around the site. All information these cookies collect is aggregated and therefore anonymous. If you do not allow these cookies we will not know when you have visited our site, and will not be able to monitor its performance.</p><!-- COOKIE SUBGROUPS*** --><!-- COOKIE SUBGROUPS END*** --></div><!-- IAB2 purpose description--></li></ul><div class="btn-group"><button class="ot-pill" id="accept-recommended-btn-handler">Allow All</button>  <button class="ot-pill save-preference-btn-handler onetrust-close-btn-handler" id="confirm-choices-handler">Confirm My Choices</button></div></div></section></div><section id="vendors-list" class="ot-hide"><div id="vendors-list-header"><button class="ot-link-btn back-btn-handler"><div id="ot-back-arrow"><svg x="0px" y="0px" width="15px" height="15px" viewBox="0 0 444.531 444.531" xml:space="preserve"><title>Back Button</title><g><path fill="#2c3643" d="M213.13,222.409L351.88,83.653c7.05-7.043,10.567-15.657,10.567-25.841c0-10.183-3.518-18.793-10.567-25.835
            l-21.409-21.416C323.432,3.521,314.817,0,304.637,0s-18.791,3.521-25.841,10.561L92.649,196.425
            c-7.044,7.043-10.566,15.656-10.566,25.841s3.521,18.791,10.566,25.837l186.146,185.864c7.05,7.043,15.66,10.564,25.841,10.564
            s18.795-3.521,25.834-10.564l21.409-21.412c7.05-7.039,10.567-15.604,10.567-25.697c0-10.085-3.518-18.746-10.567-25.978
            L213.13,222.409z"></path></g></svg></div><p class="pc-back-button-text">Back</p></button><div id="search-container"><p role="status" class="screen-reader-only"></p><label for="vendor-search-handler" class="screen-reader-only">Vendor Search</label> <input id="vendor-search-handler" type="text" placeholder="Search..." name="vendor-search-handler"> <svg width="30" height="30" x="0px" y="0px" viewBox="0 -30 110 110" aria-hidden="true"><title>Search Icon</title><path fill="#2e3644" d="M55.146,51.887L41.588,37.786c3.486-4.144,5.396-9.358,5.396-14.786c0-12.682-10.318-23-23-23s-23,10.318-23,23
      s10.318,23,23,23c4.761,0,9.298-1.436,13.177-4.162l13.661,14.208c0.571,0.593,1.339,0.92,2.162,0.92
      c0.779,0,1.518-0.297,2.079-0.837C56.255,54.982,56.293,53.08,55.146,51.887z M23.984,6c9.374,0,17,7.626,17,17s-7.626,17-17,17
      s-17-7.626-17-17S14.61,6,23.984,6z"></path></svg></div></div><section id="vendor-list-content"><h3 id="vendors-list-title">Vendors List</h3><div id="vendors-list-text" class="ot-sdk-row"><div class="ot-sdk-column"><div id="filter-container"><div id="filter-display-container"><button id="filter-btn-handler" aria-haspopup="true"><svg role="presentation" aria-hidden="true" x="0px" y="0px" width="15" height="15" viewBox="0 0 402.577 402.577" xml:space="preserve"><title>Filter Icon</title><g><path fill="#2c3643" d="M400.858,11.427c-3.241-7.421-8.85-11.132-16.854-11.136H18.564c-7.993,0-13.61,3.715-16.846,11.136
                  c-3.234,7.801-1.903,14.467,3.999,19.985l140.757,140.753v138.755c0,4.955,1.809,9.232,5.424,12.854l73.085,73.083
                  c3.429,3.614,7.71,5.428,12.851,5.428c2.282,0,4.66-0.479,7.135-1.43c7.426-3.238,11.14-8.851,11.14-16.845V172.166L396.861,31.413
                  C402.765,25.895,404.093,19.231,400.858,11.427z"></path></g></svg> <span><span>Filters</span> (<span id="filter-count">0</span>)</span></button></div><div id="select-all-container"><div class="ot-checkbox"><div class="leg-int-sel-all-hdr"><span class="consent-hdr">Consent</span> <span class="leg-int-hdr">Leg.Interest</span></div><div id="select-all-text-container"><p>Select All</p></div><!-- select all vendor consent toggle container --><div id="select-all-vendors-input-container"><input id="select-all-vendor-groups-handler" class="ot-group-option-box" type="checkbox"> <label for="select-all-vendor-groups-handler"><span class="label-text">Select All Vendors</span></label></div><!-- select all vendor leg.int toggle container --><div id="select-all-vendors-leg-input-container"><input id="select-all-vendor-leg-handler" class="ot-group-option-box" type="checkbox"> <label for="select-all-vendor-leg-handler"><span class="label-text">Select All Vendors</span></label></div><!-- select all host consent toggle container --><div id="select-all-hosts-input-container"><input id="select-all-hosts-groups-handler" class="ot-group-option-box" type="checkbox"> <label for="select-all-hosts-groups-handler"><span class="label-text">Select All Hosts</span></label></div></div></div></div></div></div></section></section><div class="ot-pc-footer-logo"><a class="powered-by-logo" href="https://www.onetrust.com/products/cookie-consent/" target="_blank" rel="noopener noreferrer" aria-label="Powered by OneTrust Opens in a new Tab"><img alt="Powered by Onetrust" src="https://cdn.cookielaw.org/logos/static/poweredBy_ot_logo.svg" title="Powered by OneTrust Opens in a new Tab"></a></div><iframe class="ot-text-resize" title="onetrust-text-resize" style="position: absolute; top: -50000px; width: 100em;" aria-hidden="true"></iframe></div></div></body></html>