UNPKG

llearn

Version:

Bad-ass developers create awesome apps

251 lines 831 kB
<!DOCTYPE html>
<!-- saved from url=(0105)https://hackernoon.com/the-definitive-guide-to-express-the-node-js-web-application-framework-649352e2ae87 -->
<html xmlns:cc="http://creativecommons.org/ns#"><head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# medium-com: http://ogp.me/ns/fb/medium-com#"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=contain"><title>The definitive guide to Express, the Node.js Web Application Framework</title><link rel="canonical" href="https://hackernoon.com/the-definitive-guide-to-express-the-node-js-web-application-framework-649352e2ae87"><meta name="title" content="The definitive guide to Express, the Node.js Web Application Framework"><meta name="referrer" content="always"><meta name="description" content="You can get a PDF, ePub and Mobi version of this page for an easier reference, or to read it on your Kindle or tablet. Express builds on top of its features to provide easy to use functionality that…"><meta name="theme-color" content="#000000"><meta property="og:title" content="The definitive guide to Express, the Node.js Web Application Framework"><meta property="twitter:title" content="The definitive guide to Express, the Node.js Web Application Framework"><meta property="og:url" content="https://hackernoon.com/the-definitive-guide-to-express-the-node-js-web-application-framework-649352e2ae87#cb86"><meta property="og:image" content="https://cdn-images-1.medium.com/max/1200/1*huCrw2ybIkyg6NzbhvrAeA.jpeg"><meta property="fb:app_id" content="542599432471018"><meta property="og:description" content="You can get a PDF, ePub and Mobi version of this page for an easier reference, or to read it on your Kindle or tablet."><meta name="twitter:description" content="You can get a PDF, ePub and Mobi version of this page for an easier reference, or to read it on your Kindle or tablet."><meta name="twitter:image:src" content="https://cdn-images-1.medium.com/max/1200/1*huCrw2ybIkyg6NzbhvrAeA.jpeg"><link rel="publisher" href="https://plus.google.com/103654360130207659246"><link rel="author" href="https://hackernoon.com/@flaviocopes"><meta property="author" content="Flavio Copes"><meta property="og:type" content="article"><meta name="twitter:card" content="summary_large_image"><meta property="article:publisher" content="https://www.facebook.com/hackernoon"><meta property="article:author" content="Flavio Copes"><meta name="robots" content="index, follow"><meta property="article:published_time" content="2018-09-12T18:04:12.054Z"><meta name="twitter:creator" content="@flaviocopes"><meta name="twitter:site" content="@hackernoon"><meta property="og:site_name" content="Hacker Noon"><meta name="twitter:label1" value="Reading time"><meta name="twitter:data1" value="32 min read"><meta name="twitter:app:name:iphone" content="Medium"><meta name="twitter:app:id:iphone" content="828256236"><meta name="twitter:app:url:iphone" content="medium://p/649352e2ae87"><meta property="al:ios:app_name" content="Medium"><meta property="al:ios:app_store_id" content="828256236"><meta property="al:android:package" content="com.medium.reader"><meta property="al:android:app_name" content="Medium"><meta property="al:ios:url" content="medium://p/649352e2ae87"><meta property="al:android:url" content="medium://p/649352e2ae87"><meta property="al:web:url" content="https://hackernoon.com/the-definitive-guide-to-express-the-node-js-web-application-framework-649352e2ae87#cb86"><link rel="search" type="application/opensearchdescription+xml" title="Medium" href="https://hackernoon.com/osd.xml"><link rel="alternate" href="android-app://com.medium.reader/https/medium.com/p/649352e2ae87"><script async="" src="./The definitive guide to Express, the Node.js Web Application Framework_files/branch-latest.min.js.download"></script><script type="application/ld+json">{"@context":"http://schema.org","@type":"NewsArticle","image":{"@type":"ImageObject","width":809,"height":606,"url":"https://cdn-images-1.medium.com/max/809/1*huCrw2ybIkyg6NzbhvrAeA.jpeg"},"url":"https://hackernoon.com/the-definitive-guide-to-express-the-node-js-web-application-framework-649352e2ae87","dateCreated":"2018-09-12T18:04:12.054Z","datePublished":"2018-09-12T18:04:12.054Z","dateModified":"2018-09-12T18:04:13.028Z","headline":"The definitive guide to Express, the Node.js Web Application Framework","name":"The definitive guide to Express, the Node.js Web Application Framework","thumbnailUrl":"https://cdn-images-1.medium.com/max/809/1*huCrw2ybIkyg6NzbhvrAeA.jpeg","keywords":["Tag:Nodejs","Tag:Web Application Framework","Tag:Express","Tag:Nodejs App Framework","Tag:Express Nodejs","Publication:hacker-daily","LockedPostSource:0","Elevated:false","LayerCake:0"],"author":{"@type":"Person","name":"Flavio Copes","url":"https://hackernoon.com/@flaviocopes"},"creator":["Flavio Copes"],"publisher":{"@type":"Organization","name":"Hacker Noon","url":"https://hackernoon.com","logo":{"@type":"ImageObject","width":500,"height":60,"url":"https://cdn-images-1.medium.com/max/500/1*1HcGNZYjo78mH0faO3BnaQ.png"}},"mainEntityOfPage":"https://hackernoon.com/the-definitive-guide-to-express-the-node-js-web-application-framework-649352e2ae87"}</script><meta name="parsely-link" content="https://hackernoon.com/the-definitive-guide-to-express-the-node-js-web-application-framework-649352e2ae87"><link rel="stylesheet" type="text/css" class="js-glyph-" id="glyph-8" href="./The definitive guide to Express, the Node.js Web Application Framework_files/m2.css"><link rel="stylesheet" href="./The definitive guide to Express, the Node.js Web Application Framework_files/main-branding-base.30DdO326JbC7yzk38YQA0Q.css"><script>if (window.top !== window.self) window.top.location = window.self.location.href;var OB_startTime = new Date().getTime(); var OB_loadErrors = []; function _onerror(e) { OB_loadErrors.push(e) }; if (document.addEventListener) document.addEventListener("error", _onerror, true); else if (document.attachEvent) document.attachEvent("onerror", _onerror); function _asyncScript(u) {var d = document, f = d.getElementsByTagName("script")[0], s = d.createElement("script"); s.type = "text/javascript"; s.async = true; s.src = u; f.parentNode.insertBefore(s, f);}function _asyncStyles(u) {var d = document, f = d.getElementsByTagName("script")[0], s = d.createElement("link"); s.rel = "stylesheet"; s.href = u; f.parentNode.insertBefore(s, f); return s}(new Image()).src = "/_/stat?event=pixel.load&origin=" + encodeURIComponent(location.origin);</script><script>window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date; ga("create", "UA-24232453-2", "auto", {"allowLinker": true, "legacyCookieDomain": window.location.hostname}); ga("send", "pageview");ga("create", "UA-65623566-4", "auto", 'tracker0'); ga("tracker0.send", "pageview");</script><script async="" src="./The definitive guide to Express, the Node.js Web Application Framework_files/analytics.js.download"></script><!--[if lt IE 9]><script charset="UTF-8" src="https://cdn-static-1.medium.com/_/fp/js/shiv.RI2ePTZ5gFmMgLzG5bEVAA.js"></script><![endif]--><link rel="icon" href="https://cdn-images-1.medium.com/fit/c/128/128/1*76XiKOa05Yya6_CdYX8pVg.jpeg" class="js-favicon"><link rel="apple-touch-icon" sizes="152x152" href="https://cdn-images-1.medium.com/fit/c/152/152/1*76XiKOa05Yya6_CdYX8pVg.jpeg"><link rel="apple-touch-icon" sizes="120x120" href="https://cdn-images-1.medium.com/fit/c/120/120/1*76XiKOa05Yya6_CdYX8pVg.jpeg"><link rel="apple-touch-icon" sizes="76x76" href="https://cdn-images-1.medium.com/fit/c/76/76/1*76XiKOa05Yya6_CdYX8pVg.jpeg"><link rel="apple-touch-icon" sizes="60x60" href="./The definitive guide to Express, the Node.js Web Application Framework_files/1_76XiKOa05Yya6_CdYX8pVg.jpeg"><link rel="mask-icon" href="https://cdn-static-1.medium.com/_/fp/icons/monogram-mask.KPLCSFEZviQN0jQ7veN2RQ.svg" color="#171717"></head><body itemscope="" class="postShowScreen browser-chrome os-windows is-withMagicUnderlinesv-glyph v-glyph--m2 is-js is-withMagicUnderlines is-resizing" data-action-scope="_actionscope_0"><script>document.body.className = document.body.className.replace(/(^|\s)is-noJs(\s|$)/, "$1is-js$2")</script><div class="site-main surface-container" id="container"><div class="butterBar butterBar--error" data-action-scope="_actionscope_1"></div><div class="surface" id="_obv.shell._surface_1536831681297" style="display: block; visibility: visible;"><div class="screenContent surface-content is-supplementalPostContentLoaded" data-used="true" data-action-scope="_actionscope_2"><canvas class="canvas-renderer" width="1905" height="1065"></canvas><div class="container u-maxWidth740 u-xs-margin0 notesPositionContainer js-notesPositionContainer"><div class="notesMarkers" data-action-scope="_actionscope_4"></div></div><div class="metabar u-clearfix js-metabar u-textColorDarker u-tintBgColor u-tintSpectrum is-withBottomSection is-hiddenWhenMinimized metabar--affixed is-maximized"><div class="branch-journeys-top"></div><div class="js-metabarMiddle metabar-inner u-marginAuto u-maxWidth1000 u-flexCenter u-justifyContentSpaceBetween u-height65 u-xs-height56 u-paddingLeft20 u-paddingRight20"><div class="metabar-block u-flex1  u-flexCenter"><div class="js-metabarLogoLeft"><a href="https://medium.com/" data-log-event="home" class="siteNav-logo u-flexCenter u-paddingTop0"><span class="svgIcon svgIcon--logoMonogram svgIcon--45px is-flushLeft u-textColorDarker"><svg class="svgIcon-use" width="45" height="45"><path d="M5 40V5h35v35H5zm8.56-12.627c0 .555-.027.687-.318 1.03l-2.457 2.985v.396h6.974v-.396l-2.456-2.985c-.291-.343-.344-.502-.344-1.03V18.42l6.127 13.364h.714l5.256-13.364v10.644c0 .29 0 .342-.185.528l-1.848 1.796v.396h9.19v-.396l-1.822-1.796c-.184-.186-.21-.238-.21-.528V15.937c0-.291.026-.344.21-.528l1.823-1.797v-.396h-6.471l-4.622 11.542-5.203-11.542h-6.79v.396l2.14 2.64c.239.292.291.37.291.768v10.353z"></path></svg></span><span class="u-textScreenReader">Homepage</span></a></div><div class="u-flexCenter u-height65 u-xs-height56"><span class="u-inlineBlock u-height28 u-xs-height24 u-verticalAlignTop u-marginRight20 u-marginLeft15 u-borderRightLighter"></span></div><div class="u-flexCenter u-height65 u-xs-height56 u-marginRight18"><a class="js-collectionLogoOrName u-uiTextBold u-fontSize18 u-lineHeightTightest u-xs-fontSize22" href="https://hackernoon.com/?source=logo-f829b8959ad2---3a8144eabfe3"><img height="36" width="300" class="u-paddingTop5" src="./The definitive guide to Express, the Node.js Web Application Framework_files/1_1HcGNZYjo78mH0faO3BnaQ.png" alt="Hacker Noon"></a></div><div class="u-flexCenter u-height65 u-xs-height56 u-xs-hide"><div class="buttonSet"><button class="button button--primary button--smallest u-noUserSelect button--withChrome u-accentColor--buttonNormal js-relationshipButton is-smallPill" data-action="toggle-follow-collection" data-action-source="----3a8144eabfe3----------------------follow_header" data-collection-id="3a8144eabfe3"><span class="button-label  js-buttonLabel">Follow</span></button><a class="button button--chromeless is-touchIconBlackPulse u-baseColor--buttonNormal button--withIcon button--withSvgIcon" href="https://twitter.com/hackernoon" title="Visit “Hacker Noon” on Twitter" aria-label="Visit “Hacker Noon” on Twitter" rel="me" target="_blank"><span class="button-defaultState"><span class="svgIcon svgIcon--twitterFilled svgIcon--25px"><svg class="svgIcon-use" width="25" height="25"><path d="M21.725 5.338c-.744.47-1.605.804-2.513 1.006a3.978 3.978 0 0 0-2.942-1.293c-2.22 0-4.02 1.81-4.02 4.02 0 .32.034.63.07.94-3.31-.18-6.27-1.78-8.255-4.23a4.544 4.544 0 0 0-.574 2.01c.04 1.43.74 2.66 1.8 3.38-.63-.01-1.25-.19-1.79-.5v.08c0 1.93 1.38 3.56 3.23 3.95-.34.07-.7.12-1.07.14-.25-.02-.5-.04-.72-.07.49 1.58 1.97 2.74 3.74 2.8a8.49 8.49 0 0 1-5.02 1.72c-.3-.03-.62-.04-.93-.07A11.447 11.447 0 0 0 8.88 21c7.386 0 11.43-6.13 11.414-11.414.015-.21.01-.38 0-.578a7.604 7.604 0 0 0 2.01-2.08 7.27 7.27 0 0 1-2.297.645 3.856 3.856 0 0 0 1.72-2.23"></path></svg></span></span></a><a class="button button--chromeless is-touchIconBlackPulse u-baseColor--buttonNormal button--withIcon button--withSvgIcon u-paddingLeft0" href="https://facebook.com/hackernoon" title="Visit “Hacker Noon” on Facebook" aria-label="Visit “Hacker Noon” on Facebook" rel="me" target="_blank"><span class="button-defaultState"><span class="svgIcon svgIcon--facebookFilled svgIcon--25px"><svg class="svgIcon-use" width="25" height="25"><path d="M21 12.646C21 7.65 16.97 3.6 12 3.6s-9 4.05-9 9.046a9.026 9.026 0 0 0 7.59 8.924v-6.376H8.395V12.64h2.193v-1.88c0-2.186 1.328-3.375 3.267-3.375.93 0 1.728.07 1.96.1V9.77H14.47c-1.055 0-1.26.503-1.26 1.242v1.63h2.517l-.33 2.554H13.21V21.6c4.398-.597 7.79-4.373 7.79-8.954"></path></svg></span></span></a></div></div></div><div class="metabar-block u-flex0 u-flexCenter"><div class="u-flexCenter u-height65 u-xs-height56"><div class="buttonSet buttonSet--wide u-lineHeightInherit"><label class="button button--chromeless inputGroup u-sm-hide metabar-predictiveSearch u-baseColor--buttonNormal u-baseColor--placeholderNormal" title="Search Hacker Noon"><span class="svgIcon svgIcon--search svgIcon--25px u-top0 u-baseColor--iconLight"><svg class="svgIcon-use" width="25" height="25"><path d="M20.067 18.933l-4.157-4.157a6 6 0 1 0-.884.884l4.157 4.157a.624.624 0 1 0 .884-.884zM6.5 11c0-2.62 2.13-4.75 4.75-4.75S16 8.38 16 11s-2.13 4.75-4.75 4.75S6.5 13.62 6.5 11z"></path></svg></span><input class="js-predictiveSearchInput textInput textInput--rounded textInput--darkText u-baseColor--textNormal textInput--transparent" type="search" placeholder="Search Hacker Noon" required="true" data-collection-id="3a8144eabfe3"></label><a class="button button--small button--chromeless u-sm-show is-inSiteNavBar u-baseColor--buttonNormal button--withIcon button--withSvgIcon u-xs-top2" href="https://hackernoon.com/search" title="Search" aria-label="Search"><span class="button-defaultState"><span class="svgIcon svgIcon--search svgIcon--25px"><svg class="svgIcon-use" width="25" height="25"><path d="M20.067 18.933l-4.157-4.157a6 6 0 1 0-.884.884l4.157 4.157a.624.624 0 1 0 .884-.884zM6.5 11c0-2.62 2.13-4.75 4.75-4.75S16 8.38 16 11s-2.13 4.75-4.75 4.75S6.5 13.62 6.5 11z"></path></svg></span></span></a><button class="button button--small button--chromeless is-inSiteNavBar u-baseColor--buttonNormal button--withIcon button--withSvgIcon button--activity js-notificationsButton u-marginRight16 u-xs-marginRight5 u-lineHeight0 u-size25x25 is-styleDark" title="Notifications" aria-label="Notifications" data-action="open-notifications"><span class="svgIcon svgIcon--bell svgIcon--25px"><svg class="svgIcon-use" width="25" height="25" viewBox="-293 409 25 25"><path d="M-273.327 423.67l-1.673-1.52v-3.646a5.5 5.5 0 0 0-6.04-5.474c-2.86.273-4.96 2.838-4.96 5.71v3.41l-1.68 1.553c-.204.19-.32.456-.32.734V427a1 1 0 0 0 1 1h3.49a3.079 3.079 0 0 0 3.01 2.45 3.08 3.08 0 0 0 3.01-2.45h3.49a1 1 0 0 0 1-1v-2.59c0-.28-.12-.55-.327-.74zm-7.173 5.63c-.842 0-1.55-.546-1.812-1.3h3.624a1.92 1.92 0 0 1-1.812 1.3zm6.35-2.45h-12.7v-2.347l1.63-1.51c.236-.216.37-.522.37-.843v-3.41c0-2.35 1.72-4.356 3.92-4.565a4.353 4.353 0 0 1 4.78 4.33v3.645c0 .324.137.633.376.85l1.624 1.477v2.373z"></path></svg></span></button><button class="button button--chromeless u-baseColor--buttonNormal u-marginLeft4 is-inSiteNavBar js-userActions" aria-haspopup="true" data-action="open-userActions"><div class="avatar"><img src="./The definitive guide to Express, the Node.js Web Application Framework_files/0_1avnlthxeQwsrBav" class="avatar-image avatar-image--icon" alt="Cobus Olivier"></div></button></div></div></div></div><div class="metabar-inner u-marginAuto u-maxWidth1000 js-metabarBottom"><nav role="navigation" class="metabar-block metabar-block--below u-overflowHidden u-height44"><ul class="u-textAlignLeft u-noWrap u-overflowX u-paddingBottom100 u-sm-paddingLeft20 u-sm-paddingRight20 js-collectionNavItems"><li class="metabar-navItem js-collectionNavItem u-uiTextMedium u-fontSize14 u-inlineBlock u-textUppercase u-letterSpacing003 u-textColorNormal u-xs-paddingRight12 u-xs-marginRight0 u-paddingTop5 u-xs-paddingTop10"><a class="link link--darken u-accentColor--textDarken u-baseColor--link js-homeNav" href="https://hackernoon.com/">Home</a></li><li class="metabar-navItem js-collectionNavItem  u-uiTextMedium u-fontSize14 u-inlineBlock u-textUppercase u-letterSpacing003 u-textColorNormal u-xs-paddingRight12 u-xs-marginRight0 u-paddingTop5 u-xs-paddingTop10"><a class="link link--darken u-accentColor--textDarken link--noUnderline u-baseColor--link js-navItemLink" href="https://hackernoon.com/latest-tech-stories/home">Latest</a></li><li class="metabar-navItem js-collectionNavItem  u-uiTextMedium u-fontSize14 u-inlineBlock u-textUppercase u-letterSpacing003 u-textColorNormal u-xs-paddingRight12 u-xs-marginRight0 u-paddingTop5 u-xs-paddingTop10"><a class="link link--darken u-accentColor--textDarken link--noUnderline u-baseColor--link js-navItemLink" href="https://hackernoon.com/tagged/software-development">Dev</a></li><li class="metabar-navItem js-collectionNavItem  u-uiTextMedium u-fontSize14 u-inlineBlock u-textUppercase u-letterSpacing003 u-textColorNormal u-xs-paddingRight12 u-xs-marginRight0 u-paddingTop5 u-xs-paddingTop10"><a class="link link--darken u-accentColor--textDarken link--noUnderline u-baseColor--link js-navItemLink" href="https://hackernoon.com/blockchain/home">Blockchain</a></li><li class="metabar-navItem js-collectionNavItem  u-uiTextMedium u-fontSize14 u-inlineBlock u-textUppercase u-letterSpacing003 u-textColorNormal u-xs-paddingRight12 u-xs-marginRight0 u-paddingTop5 u-xs-paddingTop10"><a class="link link--darken u-accentColor--textDarken link--noUnderline u-baseColor--link js-navItemLink" href="https://hackernoon.com/product-management-life/home">PM</a></li><li class="metabar-navItem js-collectionNavItem  u-uiTextMedium u-fontSize14 u-inlineBlock u-textUppercase u-letterSpacing003 u-textColorNormal u-xs-paddingRight12 u-xs-marginRight0 u-paddingTop5 u-xs-paddingTop10"><a class="link link--darken u-accentColor--textDarken link--noUnderline u-baseColor--link js-navItemLink" href="https://hackernoon.com/cryptocurrency-trading-bible/home">Crypto Trading</a></li><li class="metabar-navItem js-collectionNavItem  u-uiTextMedium u-fontSize14 u-inlineBlock u-textUppercase u-letterSpacing003 u-textColorNormal u-xs-paddingRight12 u-xs-marginRight0 u-paddingTop5 u-xs-paddingTop10"><a class="link link--darken u-accentColor--textDarken link--noUnderline u-baseColor--link js-navItemLink" href="https://hackernoon.com/artificial-intelligence/home">AI </a></li><span class="u-borderLeft1 u-paddingLeft12 u-baseColor--borderLight"></span><li class="metabar-navItem js-collectionNavItem  u-paddingLeft0 is-external u-uiTextMedium u-fontSize14 u-inlineBlock u-textUppercase u-letterSpacing003 u-textColorNormal u-xs-paddingRight12 u-xs-marginRight0 u-paddingTop5 u-xs-paddingTop10"><a class="link link--darkenOnHover u-accentColor--textDarken link--noUnderline u-baseColor--link js-navItemLink" href="http://bit.ly/2LLdEDb" rel="nofollow noopener" target="_blank">Tech Jobs</a></li></ul></nav></div></div><div class="metabar metabar--spacer js-metabarSpacer u-tintBgColor  u-height105 u-xs-height95"></div><main role="main"><article class=" u-minHeight100vhOffset65 u-overflowHidden postArticle postArticle--full is-withAccentColors" lang="en"><header class="container u-maxWidth740"><div class="uiScale uiScale-ui--regular uiScale-caption--regular postMetaHeader u-paddingBottom10 row"><div class="col u-size12of12 js-postMetaLockup"><div class="uiScale uiScale-ui--regular uiScale-caption--regular postMetaLockup postMetaLockup--authorWithBio u-flexCenter js-postMetaLockup"><div class="u-flex0"><a class="link u-baseColor--link avatar" href="https://hackernoon.com/@flaviocopes?source=post_header_lockup" data-action="show-user-card" data-action-source="post_header_lockup" data-action-value="fe1c14f6cde" data-action-type="hover" data-user-id="fe1c14f6cde" data-collection-slug="hacker-daily" dir="auto"><img src="./The definitive guide to Express, the Node.js Web Application Framework_files/1_EhDax362AQ39b-_vSUMO2Q.jpeg" class="avatar-image avatar-image--small" alt="Go to the profile of Flavio Copes"></a></div><div class="u-flex1 u-paddingLeft15 u-overflowHidden"><div class="u-lineHeightTightest"><a class="ds-link ds-link--styleSubtle ui-captionStrong u-inlineBlock link link--darken link--darker" href="https://hackernoon.com/@flaviocopes?source=post_header_lockup" data-action="show-user-card" data-action-source="post_header_lockup" data-action-value="fe1c14f6cde" data-action-type="hover" data-user-id="fe1c14f6cde" data-collection-slug="hacker-daily" dir="auto">Flavio Copes</a><span class="followState js-followState" data-user-id="fe1c14f6cde"><button class="button button--smallest u-noUserSelect button--withChrome u-baseColor--buttonNormal button--withHover button--unblock js-unblockButton u-marginLeft10 u-xs-hide" data-action="toggle-block-user" data-action-value="fe1c14f6cde" data-action-source="post_header_lockup"><span class="button-label  button-defaultState">Blocked</span><span class="button-label button-hoverState">Unblock</span></button><button class="button button--primary button--smallest u-noUserSelect button--withChrome u-accentColor--buttonNormal button--follow js-followButton u-marginLeft10 u-xs-hide" data-action="toggle-subscribe-user" data-action-value="fe1c14f6cde" data-action-source="post_header_lockup-fe1c14f6cde-------------------------follow_byline" data-subscribe-source="post_header_lockup" data-follow-context-entity-id="649352e2ae87"><span class="button-label  button-defaultState js-buttonLabel">Follow</span><span class="button-label button-activeState">Following</span></button></span></div><div class="ui-caption ui-xs-clamp2 postMetaInline">I write tutorials for developers at https://flaviocopes.com</div><div class="ui-caption postMetaInline js-testPostMetaInlineSupplemental"><time datetime="2018-09-12T18:04:12.054Z">Sep 12</time><span class="middotDivider u-fontSize12"></span><span class="readingTime" title="32 min read"></span></div></div></div></div></div></header><div class="postArticle-content js-postField js-notesSource js-trackedPost" data-post-id="649352e2ae87" data-source="post_page" data-collection-id="3a8144eabfe3" data-tracking-context="postPage" data-scroll="native"><section name="0c5d" class="section section--body section--first section--last"><div class="section-divider"><hr class="section-divider"></div><div class="section-content"><div class="section-inner sectionLayout--insetColumn"><h1 name="89cd" id="89cd" class="graf graf--h3 graf--leading graf--title">The definitive guide to Express, the Node.js Web Application Framework</h1><figure name="8204" id="8204" class="graf graf--figure graf-after--h3"><div class="aspectRatioPlaceholder is-locked" style="max-width: 700px; max-height: 524px;"><div class="aspectRatioPlaceholder-fill" style="padding-bottom: 74.9%;"></div><div class="progressiveMedia js-progressiveMedia graf-image is-canvasLoaded is-imageLoaded" data-image-id="1*huCrw2ybIkyg6NzbhvrAeA.jpeg" data-width="809" data-height="606" data-action="zoom" data-action-value="1*huCrw2ybIkyg6NzbhvrAeA.jpeg" data-scroll="native"><img src="./The definitive guide to Express, the Node.js Web Application Framework_files/1_huCrw2ybIkyg6NzbhvrAeA.jpeg" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail"><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas" width="75" height="55"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/800/1*huCrw2ybIkyg6NzbhvrAeA.jpeg" src="./The definitive guide to Express, the Node.js Web Application Framework_files/1_huCrw2ybIkyg6NzbhvrAeA(1).jpeg"><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/800/1*huCrw2ybIkyg6NzbhvrAeA.jpeg"></noscript></div></div></figure><p name="ff1f" id="ff1f" class="graf graf--p graf-after--figure">You can get a <a href="https://pages.convertkit.com/7ba7d476a5/f0c9c5cdb4" data-href="https://pages.convertkit.com/7ba7d476a5/f0c9c5cdb4" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">PDF, ePub and Mobi</a> version of this page for an easier reference, or to read it on your Kindle or tablet.</p><h4 name="2e0c" id="2e0c" class="graf graf--h4 graf-after--p">Table of&nbsp;Contents</h4><ul class="postList"><li name="59c8" id="59c8" class="graf graf--li graf-after--h4"><a href="https://medium.com/p/649352e2ae87#cf65" data-href="https://medium.com/p/649352e2ae87#cf65" class="markup--anchor markup--li-anchor">Installation</a></li><li name="0616" id="0616" class="graf graf--li graf-after--li"><a href="https://medium.com/p/649352e2ae87#3c1b" data-href="https://medium.com/p/649352e2ae87#3c1b" class="markup--anchor markup--li-anchor">Hello World</a></li><li name="048b" id="048b" class="graf graf--li graf-after--li"><a href="https://medium.com/p/649352e2ae87#e2ea" data-href="https://medium.com/p/649352e2ae87#e2ea" class="markup--anchor markup--li-anchor">Learn the basics of Express by understanding the Hello World code</a></li><li name="cf48" id="cf48" class="graf graf--li graf-after--li"><a href="https://medium.com/p/649352e2ae87#12e8" data-href="https://medium.com/p/649352e2ae87#12e8" class="markup--anchor markup--li-anchor">Request parameters</a></li><li name="ea3b" id="ea3b" class="graf graf--li graf-after--li"><a href="https://medium.com/p/649352e2ae87#abc5" data-href="https://medium.com/p/649352e2ae87#abc5" class="markup--anchor markup--li-anchor">How to retrieve the GET query string parameters</a></li><li name="8d2c" id="8d2c" class="graf graf--li graf-after--li"><a href="https://medium.com/p/649352e2ae87#901a" data-href="https://medium.com/p/649352e2ae87#901a" class="markup--anchor markup--li-anchor">How to retrieve the POST query string parameters</a></li><li name="a49e" id="a49e" class="graf graf--li graf-after--li"><a href="https://medium.com/p/649352e2ae87#3f9c" data-href="https://medium.com/p/649352e2ae87#3f9c" class="markup--anchor markup--li-anchor">Sending a response</a></li><li name="8e63" id="8e63" class="graf graf--li graf-after--li"><a href="https://medium.com/p/649352e2ae87#cb86" data-href="https://medium.com/p/649352e2ae87#cb86" class="markup--anchor markup--li-anchor">How to serve JSON data</a></li><li name="1036" id="1036" class="graf graf--li graf-after--li"><a href="https://medium.com/p/649352e2ae87#74db" data-href="https://medium.com/p/649352e2ae87#74db" class="markup--anchor markup--li-anchor">Manage cookies</a></li><li name="e235" id="e235" class="graf graf--li graf-after--li"><a href="https://medium.com/p/649352e2ae87#6ba1" data-href="https://medium.com/p/649352e2ae87#6ba1" class="markup--anchor markup--li-anchor">Working with HTTP headers</a></li><li name="919c" id="919c" class="graf graf--li graf-after--li"><a href="https://medium.com/p/649352e2ae87#5fc3" data-href="https://medium.com/p/649352e2ae87#5fc3" class="markup--anchor markup--li-anchor">Redirects</a></li><li name="7350" id="7350" class="graf graf--li graf-after--li"><a href="https://medium.com/p/649352e2ae87#32e3" data-href="https://medium.com/p/649352e2ae87#32e3" class="markup--anchor markup--li-anchor">Routing</a></li><li name="e640" id="e640" class="graf graf--li graf-after--li"><a href="https://medium.com/p/649352e2ae87#243c" data-href="https://medium.com/p/649352e2ae87#243c" class="markup--anchor markup--li-anchor">CORS</a></li><li name="32be" id="32be" class="graf graf--li graf-after--li"><a href="https://medium.com/p/649352e2ae87#a525" data-href="https://medium.com/p/649352e2ae87#a525" class="markup--anchor markup--li-anchor">Templating</a></li><li name="dcca" id="dcca" class="graf graf--li graf-after--li"><a href="https://medium.com/p/649352e2ae87#98bb" data-href="https://medium.com/p/649352e2ae87#98bb" class="markup--anchor markup--li-anchor">Introduction to Pug</a></li><li name="b5d3" id="b5d3" class="graf graf--li graf-after--li"><a href="https://medium.com/p/649352e2ae87#af6b" data-href="https://medium.com/p/649352e2ae87#af6b" class="markup--anchor markup--li-anchor">Middleware</a></li><li name="29f5" id="29f5" class="graf graf--li graf-after--li"><a href="https://medium.com/p/649352e2ae87#3603" data-href="https://medium.com/p/649352e2ae87#3603" class="markup--anchor markup--li-anchor">Serving static files</a></li><li name="9d5f" id="9d5f" class="graf graf--li graf-after--li"><a href="https://medium.com/p/649352e2ae87#9942" data-href="https://medium.com/p/649352e2ae87#9942" class="markup--anchor markup--li-anchor">Send files</a></li><li name="662c" id="662c" class="graf graf--li graf-after--li"><a href="https://medium.com/p/649352e2ae87#e5a4" data-href="https://medium.com/p/649352e2ae87#e5a4" class="markup--anchor markup--li-anchor">Sessions</a></li><li name="03c0" id="03c0" class="graf graf--li graf-after--li"><a href="https://medium.com/p/649352e2ae87#2c7d" data-href="https://medium.com/p/649352e2ae87#2c7d" class="markup--anchor markup--li-anchor">Validating input</a></li><li name="29c4" id="29c4" class="graf graf--li graf-after--li"><a href="https://medium.com/p/649352e2ae87#f1c1" data-href="https://medium.com/p/649352e2ae87#f1c1" class="markup--anchor markup--li-anchor">Sanitizing input</a></li><li name="5f41" id="5f41" class="graf graf--li graf-after--li"><a href="https://medium.com/p/649352e2ae87#7fa4" data-href="https://medium.com/p/649352e2ae87#7fa4" class="markup--anchor markup--li-anchor">Handling forms</a></li><li name="2092" id="2092" class="graf graf--li graf-after--li"><a href="https://medium.com/p/649352e2ae87#fb32" data-href="https://medium.com/p/649352e2ae87#fb32" class="markup--anchor markup--li-anchor">File uploads in forms</a></li><li name="c9d0" id="c9d0" class="graf graf--li graf-after--li"><a href="https://medium.com/p/649352e2ae87#f32a" data-href="https://medium.com/p/649352e2ae87#f32a" class="markup--anchor markup--li-anchor">How to create a self-signed HTTPS certificate for Node.js to test apps locally</a></li><li name="b2f1" id="b2f1" class="graf graf--li graf-after--li"><a href="https://medium.com/p/649352e2ae87#c2d0" data-href="https://medium.com/p/649352e2ae87#c2d0" class="markup--anchor markup--li-anchor">Setup Let’s Encrypt for Express</a></li></ul><p name="1bc9" id="1bc9" class="graf graf--p graf-after--li">Node.js is an amazing tool for building networking services and applications.</p><p name="5e31" id="5e31" class="graf graf--p graf-after--p">Express builds on top of its features to provide easy to use functionality that satisfy the needs of the Web Server use case.</p><p name="cbe8" id="cbe8" class="graf graf--p graf-after--p">It’s Open Source, free, easy to extend, very performant, and has lots and lots of pre-built packages you can just drop in and use, to perform all kind of things.</p><h4 name="cf65" id="cf65" class="graf graf--h4 graf-after--p">Installation</h4><p name="2be0" id="2be0" class="graf graf--p graf-after--h4">You can install Express into any project with <a href="https://flaviocopes.com/npm/" data-href="https://flaviocopes.com/npm/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">npm</a>:</p><pre name="9632" id="9632" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">npm install express --save</code></pre><p name="5fbd" id="5fbd" class="graf graf--p graf-after--pre">or <a href="https://flaviocopes.com/yarn/" data-href="https://flaviocopes.com/yarn/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Yarn</a>:</p><pre name="ddb4" id="ddb4" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">yarn add express</code></pre><p name="d418" id="d418" class="graf graf--p graf-after--pre">Both commands will also work in an empty directory, to start up your project from scratch, although <code class="markup--code markup--p-code">npm</code> does not create a <code class="markup--code markup--p-code">package.json</code> file at all, and Yarn creates a basic one.</p><p name="45df" id="45df" class="graf graf--p graf-after--p">Just run <code class="markup--code markup--p-code">npm init</code> or <code class="markup--code markup--p-code">yarn init</code> if you're starting a new project from scratch.</p><h4 name="3c1b" id="3c1b" class="graf graf--h4 graf-after--p">Hello World</h4><p name="5939" id="5939" class="graf graf--p graf-after--h4">We’re ready to create our first Express Web Server.</p><p name="3d1c" id="3d1c" class="graf graf--p graf-after--p">Here is some code:</p><pre name="5feb" id="5feb" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">const express = require('express')<br>const app = express()</code></pre><pre name="4709" id="4709" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">app.get('/', (req, res) =&gt; res.send('Hello World!'))<br>app.listen(3000, () =&gt; console.log('Server ready'))</code></pre><p name="9382" id="9382" class="graf graf--p graf-after--pre">Save this to an <code class="markup--code markup--p-code">index.js</code> file in your project root folder, and start the server using</p><pre name="2890" id="2890" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">node index.js</code></pre><p name="18f6" id="18f6" class="graf graf--p graf-after--pre">You can open the browser to port 3000 on localhost and you should see the <code class="markup--code markup--p-code">Hello World!</code> message.</p><h4 name="e2ea" id="e2ea" class="graf graf--h4 graf-after--p">Learn the basics of Express by understanding the Hello World&nbsp;code</h4><p name="f4df" id="f4df" class="graf graf--p graf-after--h4">Those 4 lines of code do a lot behind the scenes.</p><p name="0555" id="0555" class="graf graf--p graf-after--p">First, we import the <code class="markup--code markup--p-code">express</code> package to the <code class="markup--code markup--p-code">express</code> value.</p><p name="a89f" id="a89f" class="graf graf--p graf-after--p">We instantiate an application by calling its <code class="markup--code markup--p-code">app()</code> method.</p><p name="1951" id="1951" class="graf graf--p graf-after--p">Once we have the application object, we tell it to listen for GET requests on the <code class="markup--code markup--p-code">/</code> path, using the <code class="markup--code markup--p-code">get()</code> method.</p><p name="0bad" id="0bad" class="graf graf--p graf-after--p">There is a method for every HTTP <strong class="markup--strong markup--p-strong">verb</strong>: <code class="markup--code markup--p-code">get()</code>, <code class="markup--code markup--p-code">post()</code>, <code class="markup--code markup--p-code">put()</code>, <code class="markup--code markup--p-code">delete()</code>, <code class="markup--code markup--p-code">patch()</code>:</p><pre name="bc33" id="bc33" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">app.get('/', (req, res) =&gt; { /* */ })<br>app.post('/', (req, res) =&gt; { /* */ })<br>app.put('/', (req, res) =&gt; { /* */ })<br>app.delete('/', (req, res) =&gt; { /* */ })<br>app.patch('/', (req, res) =&gt; { /* */ })</code></pre><p name="b48a" id="b48a" class="graf graf--p graf-after--pre">Those methods accept a callback function, which is called when a request is started, and we need to handle it.</p><p name="ae88" id="ae88" class="graf graf--p graf-after--p">We pass in an arrow function:</p><pre name="52d2" id="52d2" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">(req, res) =&gt; res.send('Hello World!')</code></pre><p name="1f45" id="1f45" class="graf graf--p graf-after--pre">Express sends us two objects in this callback, which we called <code class="markup--code markup--p-code">req</code> and <code class="markup--code markup--p-code">res</code>, that represent the Request and the Response objects.</p><p name="7c50" id="7c50" class="graf graf--p graf-after--p">Request is the HTTP request. It can give us all the info about that, including the request parameters, the headers, the body of the request, and more.</p><p name="2631" id="2631" class="graf graf--p graf-after--p">Response is the HTTP response object that we’ll send to the client.</p><p name="d6da" id="d6da" class="graf graf--p graf-after--p">What we do in this callback is to send the ‘Hello World!’ string to the client, using the <code class="markup--code markup--p-code">Response.send()</code>method.</p><p name="3ac8" id="3ac8" class="graf graf--p graf-after--p">This method sets that string as the body, and it closes the connection.</p><p name="17bb" id="17bb" class="graf graf--p graf-after--p">The last line of the example actually starts the server and tells it to listen on port <code class="markup--code markup--p-code">3000</code>. We pass in a callback that is called when the server is ready to accept new requests.</p><h3 name="12e8" id="12e8" class="graf graf--h3 graf-after--p">Request parameters</h3><p name="c3eb" id="c3eb" class="graf graf--p graf-after--h3">I mentioned how the Request object holds all the HTTP request information.</p><p name="8f97" id="8f97" class="graf graf--p graf-after--p">These are the main properties you’ll likely use:</p><ul class="postList"><li name="55a9" id="55a9" class="graf graf--li graf-after--p"><strong class="markup--strong markup--li-strong">.app</strong> holds a reference to the Express app object</li><li name="25f4" id="25f4" class="graf graf--li graf-after--li"><strong class="markup--strong markup--li-strong">.baseUrl</strong> the base path on which the app responds</li><li name="b380" id="b380" class="graf graf--li graf-after--li"><strong class="markup--strong markup--li-strong">.body</strong> contains the data submitted in the request body (must be parsed and populated manually before you can access it)</li><li name="076a" id="076a" class="graf graf--li graf-after--li"><strong class="markup--strong markup--li-strong">.cookies</strong> contains the cookies sent by the request (needs the <code class="markup--code markup--li-code">cookie-parser</code>middleware)</li><li name="9199" id="9199" class="graf graf--li graf-after--li"><strong class="markup--strong markup--li-strong">.hostname</strong> the server hostname</li><li name="b212" id="b212" class="graf graf--li graf-after--li"><strong class="markup--strong markup--li-strong">.ip</strong> the server IP</li><li name="4417" id="4417" class="graf graf--li graf-after--li"><strong class="markup--strong markup--li-strong">.method</strong> the HTTP method used</li><li name="e534" id="e534" class="graf graf--li graf-after--li"><strong class="markup--strong markup--li-strong">.params</strong> the route named parameters</li><li name="c844" id="c844" class="graf graf--li graf-after--li"><strong class="markup--strong markup--li-strong">.path</strong> the URL path</li><li name="0da3" id="0da3" class="graf graf--li graf-after--li"><strong class="markup--strong markup--li-strong">.protocol</strong> the request protocol</li><li name="a489" id="a489" class="graf graf--li graf-after--li"><strong class="markup--strong markup--li-strong">.query</strong> an object containing all the query strings used in the request</li><li name="3aae" id="3aae" class="graf graf--li graf-after--li"><strong class="markup--strong markup--li-strong">.secure</strong> true if the request is secure (uses HTTPS)</li><li name="485f" id="485f" class="graf graf--li graf-after--li"><strong class="markup--strong markup--li-strong">.signedCookies</strong> contains the signed cookies sent by the request (needs the <code class="markup--code markup--li-code">cookie-parser</code>middleware)</li><li name="8366" id="8366" class="graf graf--li graf-after--li"><strong class="markup--strong markup--li-strong">.xhr</strong> true if the request is an <a href="https://flaviocopes.com/xhr/" data-href="https://flaviocopes.com/xhr/" class="markup--anchor markup--li-anchor" rel="noopener" target="_blank">XMLHttpRequest</a></li></ul><h4 name="abc5" id="abc5" class="graf graf--h4 graf-after--li">How to retrieve the GET query string parameters</h4><p name="c1b9" id="c1b9" class="graf graf--p graf-after--h4">The query string is the part that comes after the URL path and starts with an exclamation mark&nbsp;<code class="markup--code markup--p-code">?</code>.</p><p name="49f3" id="49f3" class="graf graf--p graf-after--p">Example:</p><pre name="bcb9" id="bcb9" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">?name=flavio</code></pre><p name="7529" id="7529" class="graf graf--p graf-after--pre">Multiple query parameters can be added using <code class="markup--code markup--p-code">&amp;</code>:</p><pre name="4b75" id="4b75" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">?name=flavio&amp;age=35</code></pre><p name="115a" id="115a" class="graf graf--p graf-after--pre">How do you get those query string values in Express?</p><p name="0d93" id="0d93" class="graf graf--p graf-after--p">Express makes it very easy by populating the <code class="markup--code markup--p-code">Request.query</code> object for us:</p><pre name="660b" id="660b" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">const express = require('express')<br>const app = express()</code></pre><pre name="ada0" id="ada0" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">app.get('/', (req, res) =&gt; {<br>  console.log(req.query)<br>})</code></pre><pre name="e6b7" id="e6b7" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">app.listen(8080)</code></pre><p name="d328" id="d328" class="graf graf--p graf-after--pre">This object is filled with a property for each query parameter.</p><p name="b8fd" id="b8fd" class="graf graf--p graf-after--p">If there are no query params, it’s an empty object.</p><p name="d7e8" id="d7e8" class="graf graf--p graf-after--p">This makes it easy to iterate on it using the for…in loop:</p><pre name="b58a" id="b58a" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">for (const key in req.query) {<br>  console.log(key, req.query[key])<br>}</code></pre><p name="16b7" id="16b7" class="graf graf--p graf-after--pre">This will print the query property key and the value.</p><p name="7543" id="7543" class="graf graf--p graf-after--p">You can access single properties as well:</p><pre name="457b" id="457b" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">req.query.name //flavio<br>req.query.age //35</code></pre><h4 name="901a" id="901a" class="graf graf--h4 graf-after--pre">How to retrieve the POST query string parameters</h4><p name="f96c" id="f96c" class="graf graf--p graf-after--h4">POST query parameters are sent by HTTP clients for example by forms, or when performing a POST request sending data.</p><p name="b34d" id="b34d" class="graf graf--p graf-after--p">How can you access this data?</p><p name="911a" id="911a" class="graf graf--p graf-after--p">If the data was sent as JSON, using <code class="markup--code markup--p-code">Content-Type: application/json</code>, you will use the <code class="markup--code markup--p-code">express.json()</code> middleware:</p><pre name="2f31" id="2f31" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">const express = require('express')<br>const app = express()</code></pre><pre name="64e7" id="64e7" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">app.use(express.json())</code></pre><p name="f969" id="f969" class="graf graf--p graf-after--pre">If the data was sent as JSON, using <code class="markup--code markup--p-code">Content-Type: application/x-www-form-urlencoded</code>, you will use the <code class="markup--code markup--p-code">express.urlencoded()</code> middleware:</p><pre name="6c6b" id="6c6b" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">const express = require('express')<br>const app = express()</code></pre><pre name="6b89" id="6b89" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">app.use(express.urlencoded())</code></pre><p name="548a" id="548a" class="graf graf--p graf-after--pre">In both cases you can access the data by referencing it from <code class="markup--code markup--p-code">Request.body</code>:</p><pre name="c5a5" id="c5a5" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">app.post('/form', (req, res) =&gt; {<br>  const name = req.body.name<br>})</code></pre><blockquote name="a8c6" id="a8c6" class="graf graf--blockquote graf-after--pre"><em class="markup--em markup--blockquote-em">Note: older Express versions required the use of the </em><code class="markup--code markup--blockquote-code"><em class="markup--em markup--blockquote-em">body-parser</em></code><em class="markup--em markup--blockquote-em"> module to process POST data. This is no longer the case as of Express 4.16 (released in September 2017) and later versions.</em></blockquote><h3 name="3f9c" id="3f9c" class="graf graf--h3 graf-after--blockquote">Sending a&nbsp;response</h3><p name="5557" id="5557" class="graf graf--p graf-after--h3">In the Hello World example we used the <code class="markup--code markup--p-code">Response.send()</code> method to send a simple string as a response, and to close the connection:</p><pre name="7856" id="7856" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">(req, res) =&gt; res.send('Hello World!')</code></pre><p name="19e2" id="19e2" class="graf graf--p graf-after--pre">If you pass in a string, it sets the <code class="markup--code markup--p-code">Content-Type</code> header to <code class="markup--code markup--p-code">text/html</code>.</p><p name="3d03" id="3d03" class="graf graf--p graf-after--p">if you pass in an object or an array, it sets the <code class="markup--code markup--p-code">application/json</code> <code class="markup--code markup--p-code">Content-Type</code> header, and parses that parameter into JSON.</p><p name="af97" id="af97" class="graf graf--p graf-after--p"><code class="markup--code markup--p-code">send()</code> automatically sets the <code class="markup--code markup--p-code">Content-Length</code> HTTP response header.</p><p name="ca56" id="ca56" class="graf graf--p graf-after--p"><code class="markup--code markup--p-code">send()</code> also automatically closes the connection.</p><h4 name="64a8" id="64a8" class="graf graf--h4 graf-after--p">Use end() to send an empty&nbsp;response</h4><p name="c4f2" id="c4f2" class="graf graf--p graf-after--h4">An alternative way to send the response, without any body, it’s by using the <code class="markup--code markup--p-code">Response.end()</code> method:</p><pre name="cf0e" id="cf0e" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">res.end()</code></pre><h4 name="2636" id="2636" class="graf graf--h4 graf-after--pre">Set the HTTP response&nbsp;status</h4><p name="1438" id="1438" class="graf graf--p graf-after--h4">Use the <code class="markup--code markup--p-code">Response.status()</code>:</p><pre name="bd62" id="bd62" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">res.status(404).end()</code></pre><p name="1831" id="1831" class="graf graf--p graf-after--pre">or</p><pre name="9912" id="9912" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">res.status(404).send('File not found')</code></pre><p name="685a" id="685a" class="graf graf--p graf-after--pre"><code class="markup--code markup--p-code">sendStatus()</code> is a shortcut:</p><pre name="09cd" id="09cd" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">res.sendStatus(200)<br>// === res.status(200).send('OK')</code></pre><pre name="6212" id="6212" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">res.sendStatus(403)<br>// === res.status(403).send('Forbidden')</code></pre><pre name="aa5a" id="aa5a" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">res.sendStatus(404)<br>// === res.status(404).send('Not Found')</code></pre><pre name="6a40" id="6a40" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">res.sendStatus(500)<br>// === res.status(500).send('Internal Server Error')</code></pre><h3 name="cb86" id="cb86" class="graf graf--h3 graf-after--pre">How to serve JSON&nbsp;data</h3><p name="b0a5" id="b0a5" class="graf graf--p graf-after--h3">When you listen for connections on a route in Express, the callback function will be invoked on every network call with a Request object instance and a Response object instance.</p><p name="aa96" id="aa96" class="graf graf--p graf-after--p">Example:</p><pre name="01cd" id="01cd" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">app.get('/', (req, res) =&gt; res.send('Hello World!'))</code></pre><p name="3cc3" id="3cc3" class="graf graf--p graf-after--pre">Here we used the <code class="markup--code markup--p-code">Response.send()</code> method, which accepts any string.</p><p name="b03c" id="b03c" class="graf graf--p graf-after--p">You can send JSON to the client by using <code class="markup--code markup--p-code">Response.json()</code>, a useful method.</p><p name="253f" id="253f" class="graf graf--p graf-after--p">It accepts an object or array, and converts it to JSON before sending it:</p><pre name="fa03" id="fa03" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">res.json({ username: 'Flavio' })</code></pre><h3 name="74db" id="74db" class="graf graf--h3 graf-after--pre">Manage cookies</h3><h4 name="a1d2" id="a1d2" class="graf graf--h4 graf-after--h3">How to use the `Response.cookie()` method to manipulate your&nbsp;cookies</h4><p name="f0af" id="f0af" class="graf graf--p graf-after--h4">Use the <code class="markup--code markup--p-code">Response.cookie()</code> method to manipulate your cookies.</p><p name="6fa3" id="6fa3" class="graf graf--p graf-after--p">Examples:</p><pre name="988c" id="988c" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">res.cookie('username', 'Flavio')</code></pre><p name="8547" id="8547" class="graf graf--p graf-after--pre">This method accepts a third parameter which contains various options:</p><pre name="99fc" id="99fc" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">res.cookie('username', 'Flavio', { domain: '.flaviocopes.com', path: '/administrator', secure: true })</code></pre><pre name="2a0f" id="2a0f" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">res.cookie('username', 'Flavio', { expires: new Date(Date.now() + 900000), httpOnly: true })</code></pre><p name="0d67" id="0d67" class="graf graf--p graf-after--pre">The most useful parameters you can set are:</p><p name="6553" id="6553" class="graf graf--p graf-after--p"><code class="markup--code markup--p-code">domain</code>the <a href="http://localhost:1313/cookies/#set-a-cookie-domain" data-href="http://localhost:1313/cookies/#set-a-cookie-domain" class="markup--anchor markup--p-anchor" target="_blank">cookie domain name</a></p><p name="c7f2" id="c7f2" class="graf graf--p graf-after--p"><code class="markup--code markup--p-code">expires</code>set the <a href="http://localhost:1313/cookies/#set-a-cookie-expiration-date" data-href="http://localhost:1313/cookies/#set-a-cookie-expiration-date" class="markup--anchor markup--p-anchor" target="_blank">cookie expiration date</a>. If missing, or 0, the cookie is a session cookie</p><p name="af65" id="af65" class="graf graf--p graf-after--p"><code class="markup--code markup--p-code">httpOnly</code>set the cookie to be accessible only by the web server. See <a href="https://flaviocopes.com/cookies/#httponly" data-href="https://flaviocopes.com/cookies/#httponly" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">HttpOnly</a></p><p name="f1bd" id="f1bd" class="graf graf--p graf-after--p"><code class="markup--code markup--p-code">maxAge</code>set the expiry time relative to the current time, expressed in milliseconds</p><p name="f035" id="f035" class="graf graf--p graf-after--p"><code class="markup--code markup--p-code">path</code>the <a href="https://flaviocopes.com/cookies/#set-a-cookie-path" data-href="https://flaviocopes.com/cookies/#set-a-cookie-path" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">cookie path</a>. Defaults to /</p><p name="26a9" id="26a9" class="graf graf--p graf-after--p"><code class="markup--code markup--p-code">secure</code>Marks the <a href="https://flaviocopes.com/cookies/#secure" data-href="https://flaviocopes.com/cookies/#secure" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">cookie HTTPS only</a></p><p name="1333" id="1333" class="graf graf--p graf-after--p"><code class="markup--code markup--p-code">signed</code>set the cookie to be signed</p><p name="810e" id="810e" class="graf graf--p graf-after--p"><code class="markup--code markup--p-code">sameSite</code>Value of <code class="markup--code markup--p-code"><a href="https://flaviocopes.com/cookies/#samesite" data-href="https://flaviocopes.com/cookies/#samesite" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">SameSite</a></code></p><p name="13d8" id="13d8" class="graf graf--p graf-after--p">A cookie can be cleared with</p><pre name="3406" id="3406" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">res.clearCookie('username')</code></pre><h3 name="6ba1" id="6ba1" class="graf graf--h3 graf-after--pre">Working with HTTP&nbsp;headers</h3><h4 name="2d38" id="2d38" class="graf graf--h4 graf-after--h3">Access HTTP headers values from a&nbsp;request</h4><p name="fdec" id="fdec" class="graf graf--p graf-after--h4">You can access all the HTTP headers using the <code class="markup--code markup--p-code">Request.headers</code> property:</p><pre name="0457" id="0457" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">app.get('/', (req, res) =&gt; {<br>  console.log(req.headers)<br>})</code></pre><p name="8df6" id="8df6" class="graf graf--p graf-after--pre">Use the <code class="markup--code markup--p-code">Request.header()</code> method to access one individual request header value:</p><pre name="e671" id="e671" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">app.get('/', (req, res) =&gt; {<br>  req.header('User-Agent')<br>})</code></pre><h4 name="d9d1" id="d9d1" class="graf graf--h4 graf-after--pre">Change any HTTP header value of a&nbsp;response</h4><p name="a107" id="a107" class="graf graf--p graf-after--h4">You can change any HTTP header value using <code class="markup--code markup--p-code">Response.set()</code>:</p><pre name="023b" id="023b" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">res.set('Content-Type', 'text/html')</code></pre><p name="4bfb" id="4bfb" class="graf graf--p graf-after--pre">There is a shortcut for the Content-Type header however:</p><pre name="111f" id="111f" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">res.type('.html')<br>// =&gt; 'text/html'</code></pre><pre name="76b2" id="76b2" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">res.type('html')<br>// =&gt; 'text/html'</code></pre><pre name="c973" id="c973" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">res.type('json')<br>// =&gt; 'application/json'</code></pre><pre name="de58" id="de58" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">res.type('application/json')<br>// =&gt; 'application/json'</code></pre><pre name="f327" id="f327" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">res.type('png')<br>// =&gt; image/png:</code></pre><h3 name="5fc3" id="5fc3" class="graf graf--h3 graf-after--pre">Redirects</h3><p name="f4ce" id="f4ce" class="graf graf--p graf-after--h3">Redirects are common in Web Development. You can create a redirect using the <code class="markup--code markup--p-code">Response.redirect()</code>method:</p><pre name="0f29" id="0f29" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">res.redirect('/go-there')</code></pre><p name="f430" id="f430" class="graf graf--p graf-after--pre">This creates a 302 redirect.</p><p name="0c95" id="0c95" class="graf graf--p graf-after--p">A 301 redirect is made in this way:</p><pre name="c702" id="c702" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">res.redirect(301, '/go-there')</code></pre><p name="061f" id="061f" class="graf graf--p graf-after--pre">You can specify an absolute path (<code class="markup--code markup--p-code">/go-there</code>), an absolute url (<code class="markup--code markup--p-code">https://anothersite.com</code>), a relative path (<code class="markup--code markup--p-code">go-there</code>) or use the&nbsp;<code class="markup--code markup--p-code">..</code> to go back one level:</p><pre name="57a6" id="57a6" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">res.redirect('../go-there')<br>res.redirect('..')</code></pre><p name="0322" id="0322" class="graf graf--p graf-after--pre">You can also redirect back to the Referer HTTP header value (defaulting to <code class="markup--code markup--p-code">/</code> if not set) using</p><pre name="6491" id="6491" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">res.redirect('back')</code></pre><h3 name="32e3" id="32e3" class="graf graf--h3 graf-after--pre">Routing</h3><p name="a871" id="a871" class="graf graf--p graf-after--h3">Routing is the process of determining what should happen when a URL is called, or also which parts of the application should handle a specific incoming request.</p><p name="0d18" id="0d18" class="graf graf--p graf-after--p">In the Hello World example, we used this code</p><pre name="536e" id="536e" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">app.get('/', (req, res) =&gt; { /* */ })</code></pre><p name="e88e" id="e88e" class="graf graf--p graf-after--pre">This creates a route that maps accessing the root domain URL <code class="markup--code markup--p-code">/</code> using the HTTP GET method to the response we want to provide.</p><h4 name="5ff7" id="5ff7" class="graf graf--h4 graf-after--p">Named parameters</h4><p name="4b45" id="4b45" class="graf graf--p graf-after--h4">What if we want to listen for custom requests, maybe we want to create a service that accepts a string, and returns that uppercase, and we don’t want the parameter to be sent as a query string, but part of the URL. We use named parameters:</p><pre name="6321" id="6321" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">app.get('/uppercase/:theValue', (req, res) =&gt; res.send(req.params.theValue.toUpperCase()))</code></pre><p name="74fd" id="74fd" class="graf graf--p graf-after--pre">If we send a request to <code class="markup--code markup--p-code">/uppercase/test</code>, we'll get <code class="markup--code markup--p-code">TEST</code> in the body of the response.</p><p name="78c7" id="78c7" class="graf graf--p graf-after--p">You can use multiple named parameters in the same URL, and they will all be stored in <code class="markup--code markup--p-code">req.params</code>.</p><h4 name="1555" id="1555" class="graf graf--h4 graf-after--p">Use a regular expression to match a&nbsp;path</h4><p name="32a4" id="32a4" class="graf graf--p graf-after--h4">You can use <a href="https://flaviocopes.com/javascript-regular-expressions/" data-href="https://flaviocopes.com/javascript-regular-expressions/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">regular expressions</a> to match multiple paths with one statement:</p><pre name="36d0" id="36d0" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">app.get(/post/, (req, res) =&gt; { /* */ })</code></pre><p name="50a4" id="50a4" class="graf graf--p graf-after--pre">will match <code class="markup--code markup--p-code">/post</code>, <code class="markup--code markup--p-code">/post/first</code>, <code class="markup--code markup--p-code">/thepost</code>, <code class="markup--code markup--p-code">/posting/something</code>, and so on.</p><h3 name="243c" id="243c" class="graf graf--h3 graf-after--p">CORS</h3><p name="96a6" id="96a6" class="graf graf--p graf-after--h3">A JavaScript application running in the browser can usually only access HTTP resources on the same domain (origin) that serves it.</p><p name="6522" id="6522" class="graf graf--p graf-after--p">Loading images or scripts/styles always works, but XHR and Fetch calls to another server will fail, unless that server implements a way to allow that connection.</p><p name="ed9f" id="ed9f" class="graf graf--p graf-after--p">This way is called CORS, <strong class="markup--strong markup--p-strong">Cross-Origin Resource Sharing</strong>.</p><p name="2880" id="2880" class="graf graf--p graf-after--p">Also loading Web Fonts using <code class="markup--code markup--p-code">@font-face</code> has same-origin policy by default, and other less popular things (like WebGL textures and <code class="markup--code markup--p-code">drawImage</code> resources loaded in the Canvas API).</p><p name="7668" id="7668" class="graf graf--p graf-after--p">One very important thing that needs CORS is <strong class="markup--strong markup--p-strong">ES Modules</strong>, recently introduced in modern browsers.</p><p name="1542" id="1542" class="graf graf--p graf-after--p">If you don’t set up a CORS policy <strong class="markup--strong markup--p-strong">on the server</strong> that allows to serve 3rd part origins, the request will fail.</p><p name="a04c" id="a04c" class="graf graf--p graf-after--p">Fetch example:</p><figure name="76a4" id="76a4" class="graf graf--figure graf-after--p"><div class="aspectRatioPlaceholder is-locked" style="max-width: 700px; max-height: 185px;"><div class="aspectRatioPlaceholder-fill" style="padding-bottom: 26.5%;"></div><div class="progressiveMedia js-progressiveMedia graf-image is-canvasLoaded" data-image-id="1*7dadBaGuH3B_PU8z29enIw.png" data-width="1243" data-height="329" data-action="zoom" data-action-value="1*7dadBaGuH3B_PU8z29enIw.png" data-scroll="native"><img src="./The definitive guide to Express, the Node.js Web Application Framework_files/1_7dadBaGuH3B_PU8z29enIw.png" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail"><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas" width="75" height="17"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/800/1*7dadBaGuH3B_PU8z29enIw.png"><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/800/1*7dadBaGuH3B_PU8z29enIw.png"></noscript></div></div></figure><p name="c5a9" id="c5a9" class="graf graf--p graf-after--figure">XHR example:</p><figure name="6208" id="6208" class="graf graf--figure graf-after--p"><div class="aspectRatioPlaceholder is-locked" style="max-width: 700px; max-height: 275px;"><div class="aspectRatioPlaceholder-fill" style="padding-bottom: 39.2%;"></div><div class="progressiveMedia js-progressiveMedia graf-image is-canvasLoaded" data-image-id="1*REjz-bvrKhnj8kfCBBY8UA.png" data-width="1252" data-height="491" data-action="zoom" data-action-value="1*REjz-bvrKhnj8kfCBBY8UA.png" data-scroll="native"><img src="./The definitive guide to Express, the Node.js Web Application Framework_files/1_REjz-bvrKhnj8kfCBBY8UA.png" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail"><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas" width="75" height="27"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/800/1*REjz-bvrKhnj8kfCBBY8UA.png"><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/800/1*REjz-bvrKhnj8kfCBBY8UA.png"></noscript></div></div></figure><p name="d1d3" id="d1d3" class="graf graf--p graf-after--figure">A Cross-Origin resource fails if it’s:</p><ul class="postList"><li name="cbff" id="cbff" class="graf graf--li graf-after--p">to a different <strong class="markup--strong markup--li-strong">domain</strong></li><li name="0520" id="0520" class="graf graf--li graf-after--li">to a different <strong class="markup--strong markup--li-strong">subdomain</strong></li><li name="3380" id="3380" class="graf graf--li graf-after--li">to a different <strong class="markup--strong markup--li-strong">port</strong></li><li name="a48c" id="a48c" class="graf graf--li graf-after--li">to a different <strong class="markup--strong markup--li-strong">protocol</strong></li></ul><p name="dc87" id="dc87" class="graf graf--p graf-after--li">and it’s there for your security, to prevent malicious users to exploit the Web Platform.</p><p name="1fd1" id="1fd1" class="graf graf--p graf-after--p">But if you control both the server and the client, you have all the good reasons to allow them to talk to each other.</p><p name="53b8" id="53b8" class="graf graf--p graf-after--p">How?</p><p name="0a00" id="0a00" class="graf graf--p graf-after--p">It depends on your server-side stack.</p><h3 name="fa19" id="fa19" class="graf graf--h3 graf-after--p">Browser support</h3><p name="3996" id="3996" class="graf graf--p graf-after--h3">Pretty good (basically all except IE&lt;10):</p><figure name="0843" id="0843" class="graf graf--figure graf-after--p"><div class="aspectRatioPlaceholder is-locked" style="max-width: 700px; max-height: 382px;"><div class="aspectRatioPlaceholder-fill" style="padding-bottom: 54.6%;"></div><div class="progressiveMedia js-progressiveMedia graf-image is-canvasLoaded" data-image-id="1*Iky9_Ne6chRFDJR7jinrSw.png" data-width="920" data-height="502" data-action="zoom" data-action-value="1*Iky9_Ne6chRFDJR7jinrSw.png" data-scroll="native"><img src="./The definitive guide to Express, the Node.js Web Application Framework_files/1_Iky9_Ne6chRFDJR7jinrSw.png" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail"><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas" width="75" height="40"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/800/1*Iky9_Ne6chRFDJR7jinrSw.png"><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/800/1*Iky9_Ne6chRFDJR7jinrSw.png"></noscript></div></div></figure><h4 name="2273" id="2273" class="graf graf--h4 graf-after--figure">Example with&nbsp;Express</h4><p name="4d8c" id="4d8c" class="graf graf--p graf-after--h4">If you are using Node.js and Express as a framework, use the <a href="https://github.com/expressjs/cors" data-href="https://github.com/expressjs/cors" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">CORS middleware package</a>.</p><p name="3d64" id="3d64" class="graf graf--p graf-after--p">Here’s a simple implementation of an Express Node.js server:</p><pre name="aa05" id="aa05" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">const express = require('express')<br>const app = express()</code></pre><pre name="0333" id="0333" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">app.get('/without-cors', (req, res, next) =&gt; {<br>  res.json({ msg: '😞 no CORS, no party!' })<br>})</code></pre><pre name="503f" id="503f" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">const server = app.listen(3000, () =&gt; {<br>  console.log('Listening on port %s', server.address().port)<br>})</code></pre><p name="93a2" id="93a2" class="graf graf--p graf-after--pre">If you hit <code class="markup--code markup--p-code">/without-cors</code> with a fetch request from a different origin, it's going to raise the CORS issue.</p><p name="0c3c" id="0c3c" class="graf graf--p graf-after--p">All you need to do to make things work out is to require the <code class="markup--code markup--p-code">cors</code> package linked above, and pass it in as a middleware function to an endpoint request handler:</p><pre name="3fa0" id="3fa0" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">const express = require('express')<br>const cors = require('cors')<br>const app = express()</code></pre><pre name="61d6" id="61d6" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">app.get('/with-cors', cors(), (req, res, next) =&gt; {<br>  res.json({ msg: 'WHOAH with CORS it works! 🔝 🎉' })<br>})</code></pre><pre name="961e" id="961e" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">/* the rest of the app */</code></pre><p name="9b28" id="9b28" class="graf graf--p graf-after--pre">I made a simple Glitch example. <a href="https://flavio-cors-client.glitch.me/" data-href="https://flavio-cors-client.glitch.me/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Here is the client</a> working, and here’s its code: <a href="https://glitch.com/edit/#!/flavio-cors-client" data-href="https://glitch.com/edit/#!/flavio-cors-client" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">https://glitch.com/edit/#!/flavio-cors-client</a>.</p><p name="2113" id="2113" class="graf graf--p graf-after--p">This is the Node.js Express server: <a href="https://glitch.com/edit/#!/flaviocopes-cors-example-express" data-href="https://glitch.com/edit/#!/flaviocopes-cors-example-express" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">https://glitch.com/edit/#!/flaviocopes-cors-example-express</a></p><p name="b7a4" id="b7a4" class="graf graf--p graf-after--p">Note how the request that fails because it does not handle the CORS headings correctly is still received, as you can see in the Network panel, where you find the message the server sent:</p><figure name="2d11" id="2d11" class="graf graf--figure graf-after--p"><div class="aspectRatioPlaceholder is-locked" style="max-width: 700px; max-height: 312px;"><div class="aspectRatioPlaceholder-fill" style="padding-bottom: 44.5%;"></div><div class="progressiveMedia js-progressiveMedia graf-image is-canvasLoaded" data-image-id="1*V_k9xuUdF53zDHmNhkwCSg.png" data-width="878" data-height="391" data-action="zoom" data-action-value="1*V_k9xuUdF53zDHmNhkwCSg.png" data-scroll="native"><img src="./The definitive guide to Express, the Node.js Web Application Framework_files/1_V_k9xuUdF53zDHmNhkwCSg.png" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail"><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas" width="75" height="32"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/800/1*V_k9xuUdF53zDHmNhkwCSg.png"><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/800/1*V_k9xuUdF53zDHmNhkwCSg.png"></noscript></div></div></figure><h4 name="ff7d" id="ff7d" class="graf graf--h4 graf-after--figure">Allow only specific&nbsp;origins</h4><p name="ddef" id="ddef" class="graf graf--p graf-after--h4">This example has a problem however: ANY request will be accepted by the server as cross-origin.</p><p name="aaa2" id="aaa2" class="graf graf--p graf-after--p">As you can see in the Network panel, the request that passed has a response header <code class="markup--code markup--p-code">access-control-allow-origin: *</code>:</p><figure name="9d56" id="9d56" class="graf graf--figure graf-after--p"><div class="aspectRatioPlaceholder is-locked" style="max-width: 700px; max-height: 267px;"><div class="aspectRatioPlaceholder-fill" style="padding-bottom: 38.2%;"></div><div class="progressiveMedia js-progressiveMedia graf-image is-canvasLoaded" data-image-id="1*eYshr5kURTCXK_J8b3047Q.png" data-width="1039" data-height="397" data-action="zoom" data-action-value="1*eYshr5kURTCXK_J8b3047Q.png" data-scroll="native"><img src="./The definitive guide to Express, the Node.js Web Application Framework_files/1_eYshr5kURTCXK_J8b3047Q.png" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail"><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas" width="75" height="27"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/800/1*eYshr5kURTCXK_J8b3047Q.png"><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/800/1*eYshr5kURTCXK_J8b3047Q.png"></noscript></div></div></figure><p name="5ccc" id="5ccc" class="graf graf--p graf-after--figure">You need to configure the server to only allow one origin to serve, and block all the others.</p><p name="e81c" id="e81c" class="graf graf--p graf-after--p">Using the same <code class="markup--code markup--p-code">cors</code> Node library, here's how you would do it:</p><pre name="2605" id="2605" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">const cors = require('cors')</code></pre><pre name="57fe" id="57fe" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">const corsOptions = {<br>  origin: 'https://yourdomain.com'<br>}</code></pre><pre name="8d21" id="8d21" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">app.get('/products/:id', cors(corsOptions), (req, res, next) =&gt; {<br>  //...<br>})</code></pre><p name="ed54" id="ed54" class="graf graf--p graf-after--pre">You can serve more as well:</p><pre name="29bf" id="29bf" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">const whitelist = ['http://example1.com', 'http://example2.com']<br>const corsOptions = {<br>  origin: function(origin, callback) {<br>    if (whitelist.indexOf(origin) !== -1) {<br>      callback(null, true)<br>    } else {<br>      callback(new Error('Not allowed by CORS'))<br>    }<br>  }<br>}</code></pre><h4 name="1631" id="1631" class="graf graf--h4 graf-after--pre">Preflight</h4><p name="0737" id="0737" class="graf graf--p graf-after--h4">There are some requests that are handled in a “simple” way. All <code class="markup--code markup--p-code">GET</code> requests belong to this group.</p><p name="eca3" id="eca3" class="graf graf--p graf-after--p">Also <em class="markup--em markup--p-em">some</em> <code class="markup--code markup--p-code">POST</code> and <code class="markup--code markup--p-code">HEAD</code> requests do as well.</p><p name="58e9" id="58e9" class="graf graf--p graf-after--p"><code class="markup--code markup--p-code">POST</code> requests are also in this group if they satisfy the requirement of using a Content-Type of</p><ul class="postList"><li name="8c7a" id="8c7a" class="graf graf--li graf-after--p"><code class="markup--code markup--li-code">application/x-www-form-urlencoded</code></li><li name="8b0e" id="8b0e" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">multipart/form-data</code></li><li name="d85d" id="d85d" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">text/plain</code></li></ul><p name="e3cd" id="e3cd" class="graf graf--p graf-after--li">All other requests must run through a pre-approval phase, called preflight. The browser does this to determine if it has the permission to perform an action, by issuing an <code class="markup--code markup--p-code">OPTIONS</code> request.</p><p name="ea24" id="ea24" class="graf graf--p graf-after--p">A preflight request contains a few headers that the server will use to check permissions (irrelevant fields omitted):</p><pre name="5202" id="5202" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code u-paddingRight0 u-marginRight0">OPTIONS /the/resource/you/request<br>Access-Control-Request-Method: POST<br>Access-Control-Request-Headers: origin, x-requested-with, accept<br>Origin: <a href="https://your-origin.com/" data-href="https://your-origin.com" class="markup--anchor markup--pre-anchor" rel="noopener" target="_blank">https://your-origin.com</a></code></pre><p name="fea0" id="fea0" class="graf graf--p graf-after--pre">The server will respond with something like this(irrelevant fields omitted):</p><pre name="7b28" id="7b28" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">HTTP/1.1 200 OK<br>Access-Control-Allow-Origin: https://your-origin.com<br>Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE</code></pre><p name="f04e" id="f04e" class="graf graf--p graf-after--pre">We checked for POST, but the server tells us we can also issue other HTTP request types for that particular resource.</p><p name="7857" id="7857" class="graf graf--p graf-after--p">Following the Node.js Express example above, the server must also handle the OPTIONS request:</p><pre name="d97e" id="d97e" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">var express = require('express')<br>var cors = require('cors')<br>var app = express()</code></pre><pre name="e713" id="e713" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">//allow OPTIONS on just one resource<br>app.options('/the/resource/you/request', cors())</code></pre><pre name="46a6" id="46a6" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">//allow OPTIONS on all resources<br>app.options('*', cors())</code></pre><h3 name="a525" id="a525" class="graf graf--h3 graf-after--pre">Templating</h3><p name="82a1" id="82a1" class="graf graf--p graf-after--h3">Express is capable of handling server-side template engines.</p><p name="b94a" id="b94a" class="graf graf--p graf-after--p">Template engines allow us to add data to a view, and generate HTML dynamically.</p><p name="1d80" id="1d80" class="graf graf--p graf-after--p">Express uses Jade as the default. Jade is the old version of Pug, specifically Pug 1.0.</p><blockquote name="42ee" id="42ee" class="graf graf--blockquote graf-after--p"><em class="markup--em markup--blockquote-em">The name was changed from Jade to Pug due to a trademark issue in 2016, when the project released version 2. You can still use Jade, aka Pug 1.0, but going forward, it’s best to use Pug 2.0</em></blockquote><p name="9f48" id="9f48" class="graf graf--p graf-after--blockquote">Although the last version of Jade is 3 years old (at the time of writing, summer 2018), it’s still the default in Express for backward compatibility reasons.</p><p name="b2af" id="b2af" class="graf graf--p graf-after--p">In any new project, you should use Pug or another engine of your choice. The official site of Pug is <a href="https://pugjs.org/" data-href="https://pugjs.org/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">https://pugjs.org/</a>.</p><p name="a2fa" id="a2fa" class="graf graf--p graf-after--p">You can use many different template engines, including Pug, Handlebars, Mustache, EJS and more.</p><h3 name="6c09" id="6c09" class="graf graf--h3 graf-after--p">Using Pug</h3><p name="71b1" id="71b1" class="graf graf--p graf-after--h3">To use Pug we must first install it:</p><pre name="bc34" id="bc34" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">npm install pug</code></pre><p name="ef2f" id="ef2f" class="graf graf--p graf-after--pre">and when initializing the Express app, we need to set it:</p><pre name="b337" id="b337" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">const express = require('express')<br>const app = express()<br>app.set('view engine', 'pug')</code></pre><p name="1356" id="1356" class="graf graf--p graf-after--pre">We can now start writing our templates in&nbsp;<code class="markup--code markup--p-code">.pug</code> files.</p><p name="8aee" id="8aee" class="graf graf--p graf-after--p">Create an about view:</p><pre name="eaab" id="eaab" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">app.get('/about', (req, res) =&gt; {<br>  res.render('about')<br>})</code></pre><p name="8078" id="8078" class="graf graf--p graf-after--pre">and the template in <code class="markup--code markup--p-code">views/about.pug</code>:</p><pre name="062a" id="062a" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">p Hello from Flavio</code></pre><p name="5fa6" id="5fa6" class="graf graf--p graf-after--pre">This template will create a <code class="markup--code markup--p-code">p</code> tag with the content <code class="markup--code markup--p-code">Hello from Flavio</code>.</p><p name="e3cc" id="e3cc" class="graf graf--p graf-after--p">You can interpolate a variable using</p><pre name="0f1d" id="0f1d" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">app.get('/about', (req, res) =&gt; {<br>  res.render('about', { name: 'Flavio' })<br>})</code></pre><pre name="38c0" id="38c0" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">p Hello from #{name}</code></pre><p name="bb83" id="bb83" class="graf graf--p graf-after--pre">This is a very short introduction to Pug, in the context of using it with Express. Look at the <a href="https://flaviocopes.com/pug" data-href="https://flaviocopes.com/pug" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Pug guide</a> for more information on how to use Pug.</p><p name="f317" id="f317" class="graf graf--p graf-after--p">If you are used to template engines that use HTML and interpolate variables, like Handlebars (described next), you might run into issues, especially when you need to convert existing HTML to Pug. This online converter from HTML to Jade (which is very similar, but a little different than Pug) will be a great help: <a href="https://jsonformatter.org/html-to-jade" data-href="https://jsonformatter.org/html-to-jade" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">https://jsonformatter.org/html-to-jade</a></p><h4 name="d5f2" id="d5f2" class="graf graf--h4 graf-after--p">Using Handlebars</h4><p name="a1c7" id="a1c7" class="graf graf--p graf-after--h4">Let’s try and use Handlebars instead of Pug.</p><p name="3aaa" id="3aaa" class="graf graf--p graf-after--p">You can install it using <code class="markup--code markup--p-code">npm install hbs</code>.</p><p name="d252" id="d252" class="graf graf--p graf-after--p">Put an <code class="markup--code markup--p-code">about.hbs</code> template file in the <code class="markup--code markup--p-code">views/</code> folder:</p><pre name="cc66" id="cc66" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">Hello from {{name}}</code></pre><p name="d441" id="d441" class="graf graf--p graf-after--pre">and then use this Express configuration to serve it on <code class="markup--code markup--p-code">/about</code>:</p><pre name="3fff" id="3fff" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">const express = require('express')<br>const app = express()<br>const hbs = require('hbs')</code></pre><pre name="b804" id="b804" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">app.set('view engine', 'hbs')<br>app.set('views', path.join(__dirname, 'views'))</code></pre><pre name="c6a6" id="c6a6" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">app.get('/about', (req, res) =&gt; {<br>  res.render('about', { name: 'Flavio' })<br>})</code></pre><pre name="6c88" id="6c88" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">app.listen(3000, () =&gt; console.log('Server ready'))</code></pre><p name="2eb9" id="2eb9" class="graf graf--p graf-after--pre">You can also <strong class="markup--strong markup--p-strong">render a React application server-side</strong>, using the <code class="markup--code markup--p-code"><a href="https://github.com/reactjs/express-react-views" data-href="https://github.com/reactjs/express-react-views" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">express-react-views</a></code> package.</p><p name="7bd1" id="7bd1" class="graf graf--p graf-after--p">Start with <code class="markup--code markup--p-code">npm install express-react-views react react-dom</code>.</p><p name="13ab" id="13ab" class="graf graf--p graf-after--p">Now instead of requiring <code class="markup--code markup--p-code">hbs</code> we require <code class="markup--code markup--p-code">express-react-views</code> and use that as the engine, using <code class="markup--code markup--p-code">jsx</code> files:</p><pre name="212c" id="212c" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">const express = require('express')<br>const app = express()</code></pre><pre name="b599" id="b599" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">app.set('view engine', 'jsx')<br>app.engine('jsx', require('express-react-views').createEngine())</code></pre><pre name="4c82" id="4c82" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">app.get('/about', (req, res) =&gt; {<br>  res.render('about', { name: 'Flavio' })<br>})</code></pre><pre name="e888" id="e888" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">app.listen(3000, () =&gt; console.log('Server ready'))</code></pre><p name="9be6" id="9be6" class="graf graf--p graf-after--pre">Just put an <code class="markup--code markup--p-code">about.jsx</code> file in <code class="markup--code markup--p-code">views/</code>, and calling <code class="markup--code markup--p-code">/about</code> should present you an "Hello from Flavio" string:</p><pre name="7f38" id="7f38" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">const React = require('react')</code></pre><pre name="4068" id="4068" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">class HelloMessage extends React.Component {<br>  render() {<br>    return &lt;div&gt;Hello from {this.props.name}&lt;/div&gt;<br>  }<br>}</code></pre><pre name="8116" id="8116" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">module.exports = HelloMessage</code></pre><h3 name="98bb" id="98bb" class="graf graf--h3 graf-after--pre">Introduction to&nbsp;Pug</h3><p name="399c" id="399c" class="graf graf--p graf-after--h3">What is Pug? It’s a template engine for server-side Node.js applications.</p><p name="54d8" id="54d8" class="graf graf--p graf-after--p">Express is capable of handling server-side template engines. Template engines allow us to add data to a view, and generate HTML dynamically.</p><p name="c4fa" id="c4fa" class="graf graf--p graf-after--p">Pug is a new name for an old thing. It’s <em class="markup--em markup--p-em">Jade 2.0</em>.</p><p name="26c5" id="26c5" class="graf graf--p graf-after--p">The name was changed from Jade to Pug due to a trademark issue in 2016, when the project released version 2. You can still use Jade, aka Pug 1.0, but going forward, it’s best to use Pug 2.0</p><blockquote name="d7e3" id="d7e3" class="graf graf--blockquote graf-after--p"><em class="markup--em markup--blockquote-em">Also see the </em><a href="https://pugjs.org/api/migration-v2.html" data-href="https://pugjs.org/api/migration-v2.html" class="markup--anchor markup--blockquote-anchor" rel="noopener" target="_blank"><em class="markup--em markup--blockquote-em">differences between Jade and Pug</em></a></blockquote><p name="0c35" id="0c35" class="graf graf--p graf-after--blockquote">Express uses Jade as the default. Jade is the old version of Pug, specifically Pug 1.0.</p><p name="9751" id="9751" class="graf graf--p graf-after--p">Although the last version of Jade is 3 years old (at the time of writing, summer 2018), it’s still the default in Express for backward compatibility reasons.</p><p name="b9dd" id="b9dd" class="graf graf--p graf-after--p">In any new project, you should use Pug or another engine of your choice. The official site of Pug is <a href="https://pugjs.org/" data-href="https://pugjs.org/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">https://pugjs.org/</a>.</p><h4 name="157e" id="157e" class="graf graf--h4 graf-after--p">How does Pug look&nbsp;like</h4><pre name="b3cd" id="b3cd" class="graf graf--pre graf-after--h4"><code class="markup--code markup--pre-code">p Hello from Flavio</code></pre><p name="5524" id="5524" class="graf graf--p graf-after--pre">This template will create a <code class="markup--code markup--p-code">p</code> tag with the content <code class="markup--code markup--p-code">Hello from Flavio</code>.</p><p name="3a57" id="3a57" class="graf graf--p graf-after--p">As you can see, Pug is quite special. It takes the tag name as the first thing in a line, and the rest is the content that goes inside it.</p><p name="f472" id="f472" class="graf graf--p graf-after--p">If you are used to template engines that use HTML and interpolate variables, like Handlebars (described next), you might run into issues, especially when you need to convert existing HTML to Pug. This online converter from HTML to Jade (which is very similar, but a little different than Pug) will be a great help: <a href="https://jsonformatter.org/html-to-jade" data-href="https://jsonformatter.org/html-to-jade" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">https://jsonformatter.org/html-to-jade</a></p><h4 name="3e84" id="3e84" class="graf graf--h4 graf-after--p">Install Pug</h4><p name="9e07" id="9e07" class="graf graf--p graf-after--h4">Installing Pug is as simple as running <code class="markup--code markup--p-code">npm install</code>:</p><pre name="6425" id="6425" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">npm install pug</code></pre><h4 name="7161" id="7161" class="graf graf--h4 graf-after--pre">Setup Pug to be the template engine in&nbsp;Express</h4><p name="7d7e" id="7d7e" class="graf graf--p graf-after--h4">and when initializing the Express app, we need to set it:</p><pre name="4cc5" id="4cc5" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">const express = require('express')<br>const app = express()<br>app.set('view engine', 'pug')<br>app.set('views', path.join(__dirname, 'views'))</code></pre><h4 name="0e4c" id="0e4c" class="graf graf--h4 graf-after--pre">Your first Pug&nbsp;template</h4><p name="101c" id="101c" class="graf graf--p graf-after--h4">Create an about view:</p><pre name="4aec" id="4aec" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">app.get('/about', (req, res) =&gt; {<br>  res.render('about')<br>})</code></pre><p name="b9c8" id="b9c8" class="graf graf--p graf-after--pre">and the template in <code class="markup--code markup--p-code">views/about.pug</code>:</p><pre name="aa79" id="aa79" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">p Hello from Flavio</code></pre><p name="a11d" id="a11d" class="graf graf--p graf-after--pre">This template will create a <code class="markup--code markup--p-code">p</code> tag with the content <code class="markup--code markup--p-code">Hello from Flavio</code>.</p><h4 name="e050" id="e050" class="graf graf--h4 graf-after--p">Interpolating variables in&nbsp;Pug</h4><p name="41bb" id="41bb" class="graf graf--p graf-after--h4">You can interpolate a variable using</p><pre name="4872" id="4872" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">app.get('/about', (req, res) =&gt; {<br>  res.render('about', { name: 'Flavio' })<br>})</code></pre><pre name="8eda" id="8eda" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">p Hello from #{name}</code></pre><h4 name="8281" id="8281" class="graf graf--h4 graf-after--pre">Interpolate a function return&nbsp;value</h4><p name="0942" id="0942" class="graf graf--p graf-after--h4">You can interpolate a function return value using</p><pre name="d28c" id="d28c" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">app.get('/about', (req, res) =&gt; {<br>  res.render('about', { getName: () =&gt; 'Flavio' })<br>})</code></pre><pre name="1327" id="1327" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">p Hello from #{getName()}</code></pre><h4 name="2b1e" id="2b1e" class="graf graf--h4 graf-after--pre">Adding id and class attributes to&nbsp;elements</h4><pre name="ee35" id="ee35" class="graf graf--pre graf-after--h4"><code class="markup--code markup--pre-code">p#title<br>p.title</code></pre><h4 name="d820" id="d820" class="graf graf--h4 graf-after--pre">Set the&nbsp;doctype</h4><pre name="6ef4" id="6ef4" class="graf graf--pre graf-after--h4"><code class="markup--code markup--pre-code">doctype html</code></pre><h4 name="0e70" id="0e70" class="graf graf--h4 graf-after--pre">Meta tags</h4><pre name="7a83" id="7a83" class="graf graf--pre graf-after--h4"><code class="markup--code markup--pre-code">html<br>  head<br>    meta(charset='utf-8')<br>    meta(http-equiv='X-UA-Compatible', content='IE=edge')<br>    meta(name='description', content='Some description')<br>    meta(name='viewport', content='width=device-width, initial-scale=1')</code></pre><h4 name="416b" id="416b" class="graf graf--h4 graf-after--pre">Adding scripts and&nbsp;styles</h4><pre name="9f34" id="9f34" class="graf graf--pre graf-after--h4"><code class="markup--code markup--pre-code">html<br>  head<br>    script(src="script.js")<br>    script(src='//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js')</code></pre><pre name="6b80" id="6b80" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">    link(rel='stylesheet', href='css/main.css')</code></pre><h4 name="f9ae" id="f9ae" class="graf graf--h4 graf-after--pre">Inline scripts</h4><pre name="436f" id="436f" class="graf graf--pre graf-after--h4"><code class="markup--code markup--pre-code">script alert('test')</code></pre><pre name="a6a6" id="a6a6" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">script<br>  (function(b,o,i,l,e,r){b.GoogleAnalyticsObject=l;b[l]||(b[l]=<br>  function(){(b[l].q=b[l].q||[]).push(arguments)});b[l].l=+new Date;<br>  e=o.createElement(i);r=o.getElementsByTagName(i)[0];<br>  e.src='//www.google-analytics.com/analytics.js';<br>  r.parentNode.insertBefore(e,r)}(window,document,'script','ga'));<br>  ga('create','UA-XXXXX-X');ga('send','pageview');</code></pre><h4 name="9506" id="9506" class="graf graf--h4 graf-after--pre">Loops</h4><pre name="84cd" id="84cd" class="graf graf--pre graf-after--h4"><code class="markup--code markup--pre-code">ul<br>  each color in ['Red', 'Yellow', 'Blue']<br>    li= color</code></pre><pre name="604c" id="604c" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">ul<br>  each color, index in ['Red', 'Yellow', 'Blue']<br>    li= 'Color number ' + index + ': ' + color</code></pre><h4 name="8964" id="8964" class="graf graf--h4 graf-after--pre">Conditionals</h4><pre name="d51a" id="d51a" class="graf graf--pre graf-after--h4"><code class="markup--code markup--pre-code">if name<br>  h2 Hello from #{name}<br>else<br>  h2 Hello</code></pre><p name="3509" id="3509" class="graf graf--p graf-after--pre">else-if works too:</p><pre name="ce17" id="ce17" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">if name<br>  h2 Hello from #{name}<br>else if anotherName<br>  h2 Hello from #{anotherName}<br>else<br>  h2 Hello</code></pre><h4 name="a7f2" id="a7f2" class="graf graf--h4 graf-after--pre">Set variables</h4><p name="9c1a" id="9c1a" class="graf graf--p graf-after--h4">You can set variables in Pug templates:</p><pre name="a496" id="a496" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">- var name = 'Flavio'<br>- var age = 35<br>- var roger = { name: 'Roger' }<br>- var dogs = ['Roger', 'Syd']</code></pre><h4 name="84b0" id="84b0" class="graf graf--h4 graf-after--pre">Incrementing variables</h4><p name="e5a0" id="e5a0" class="graf graf--p graf-after--h4">You can increment a numeric variable using <code class="markup--code markup--p-code">++</code>:</p><pre name="626c" id="626c" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">age++</code></pre><h4 name="18cc" id="18cc" class="graf graf--h4 graf-after--pre">Assigning variables to element&nbsp;values</h4><pre name="5cd0" id="5cd0" class="graf graf--pre graf-after--h4"><code class="markup--code markup--pre-code">p= name</code></pre><pre name="2a89" id="2a89" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">span.age= age</code></pre><h4 name="d120" id="d120" class="graf graf--h4 graf-after--pre">Iterating over variables</h4><p name="b5bb" id="b5bb" class="graf graf--p graf-after--h4">You can use <code class="markup--code markup--p-code">for</code> or <code class="markup--code markup--p-code">each</code>. There is no difference.</p><pre name="4451" id="4451" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">for dog in dogs<br>    li= dog</code></pre><pre name="7901" id="7901" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">ul<br>  each dog in dogs<br>    li= dog</code></pre><p name="d520" id="d520" class="graf graf--p graf-after--pre">You can use&nbsp;<code class="markup--code markup--p-code">.length</code> to get the number of items:</p><pre name="4802" id="4802" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">p There are #{values.length}</code></pre><p name="2612" id="2612" class="graf graf--p graf-after--pre"><code class="markup--code markup--p-code">while</code> is another kind of loop:</p><pre name="7e86" id="7e86" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">- var n = 0;</code></pre><pre name="53f4" id="53f4" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">ul<br>  while n &lt;= 5<br>    li= n++</code></pre><h4 name="2409" id="2409" class="graf graf--h4 graf-after--pre">Including other Pug&nbsp;files</h4><p name="b0ef" id="b0ef" class="graf graf--p graf-after--h4">In a Pug file you can include other Pug files:</p><pre name="9bd1" id="9bd1" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">include otherfile.pug</code></pre><h4 name="019d" id="019d" class="graf graf--h4 graf-after--pre">Defining blocks</h4><p name="e8b1" id="e8b1" class="graf graf--p graf-after--h4">A well organized template system will define a base template, and then all the other templates extend from it.</p><p name="09d3" id="09d3" class="graf graf--p graf-after--p">The way a part of a template can be extended is by using blocks:</p><pre name="aade" id="aade" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">html<br>  head<br>    script(src="script.js")<br>    script(src='//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js')</code></pre><pre name="dc9f" id="dc9f" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">    link(rel='stylesheet', href='css/main.css')<br>    block head<br>  body<br>    block body<br>      h1 Home page<br>      p welcome</code></pre><p name="17e2" id="17e2" class="graf graf--p graf-after--pre">In this case one block, <code class="markup--code markup--p-code">body</code>, has some content, while <code class="markup--code markup--p-code">head</code> does not. <code class="markup--code markup--p-code">head</code> is intended to be used to add additional content to the heading, while the <code class="markup--code markup--p-code">body</code> content is made to be overridden by other pages.</p><h4 name="5259" id="5259" class="graf graf--h4 graf-after--p">Extending a base&nbsp;template</h4><p name="4c58" id="4c58" class="graf graf--p graf-after--h4">A template can extend a base template by using the <code class="markup--code markup--p-code">extends</code> keyword:</p><pre name="9704" id="9704" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">extends home.pug</code></pre><p name="e8c7" id="e8c7" class="graf graf--p graf-after--pre">Once this is done, you need to redefine blocks. All the content of the template must go into blocks, otherwise the engine does not know where to put them.</p><p name="9fc1" id="9fc1" class="graf graf--p graf-after--p">Example:</p><pre name="3978" id="3978" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">extends home.pug</code></pre><pre name="250b" id="250b" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">block body<br>  h1 Another page<br>  p Hey!<br>  ul<br>    li Something<br>    li Something else</code></pre><p name="cac0" id="cac0" class="graf graf--p graf-after--pre">You can redefine one or more blocks. The ones not redefined will be kept with the original template content.</p><h4 name="e31b" id="e31b" class="graf graf--h4 graf-after--p">Comments</h4><p name="717e" id="717e" class="graf graf--p graf-after--h4">Comments in Pug can be of two types: visible or not visible in the resulting HTML.</p><h4 name="ff54" id="ff54" class="graf graf--h4 graf-after--p">Visible</h4><p name="b683" id="b683" class="graf graf--p graf-after--h4">Inline:</p><pre name="f446" id="f446" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">// some comment</code></pre><p name="a90d" id="a90d" class="graf graf--p graf-after--pre">Block:</p><pre name="9273" id="9273" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">//<br>  some<br>  comment</code></pre><h4 name="1ec0" id="1ec0" class="graf graf--h4 graf-after--pre">Invisible</h4><p name="6a78" id="6a78" class="graf graf--p graf-after--h4">Inline:</p><pre name="d43c" id="d43c" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">//- some comment</code></pre><p name="738b" id="738b" class="graf graf--p graf-after--pre">Block:</p><pre name="bf0a" id="bf0a" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">//-<br>  some<br>  comment</code></pre><h3 name="af6b" id="af6b" class="graf graf--h3 graf-after--pre">Middleware</h3><p name="a0b9" id="a0b9" class="graf graf--p graf-after--h3">A middleware is a function that hooks into the routing process, and performs some operation at some point, depending on what it want to do.</p><p name="b86a" id="b86a" class="graf graf--p graf-after--p">It’s commonly used to edit the request or response objects, or terminate the request before it reaches the route handler code.</p><p name="3868" id="3868" class="graf graf--p graf-after--p">It’s added to the execution stack like this:</p><pre name="a0c1" id="a0c1" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">app.use((req, res, next) =&gt; { /* */ })</code></pre><p name="a457" id="a457" class="graf graf--p graf-after--pre">This is similar to defining a route, but in addition to the Request and Response objects instances, we also have a reference to the <em class="markup--em markup--p-em">next</em> middleware function, which we assign to the variable <code class="markup--code markup--p-code">next</code>.</p><p name="fb63" id="fb63" class="graf graf--p graf-after--p">We always call <code class="markup--code markup--p-code">next()</code> at the end of our middleware function, to pass the execution to the next handler, unless we want to prematurely end the response, and send it back to the client.</p><p name="a6b6" id="a6b6" class="graf graf--p graf-after--p">You typically use pre-made middleware, in the form of <code class="markup--code markup--p-code">npm</code> packages. A big list of the available ones is <a href="https://expressjs.com/en/resources/middleware.html" data-href="https://expressjs.com/en/resources/middleware.html" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">here</a>.</p><p name="16fb" id="16fb" class="graf graf--p graf-after--p">One example is <code class="markup--code markup--p-code">cookie-parser</code>, which is used to parse the cookies into the <code class="markup--code markup--p-code">req.cookies</code> object. You install it using <code class="markup--code markup--p-code">npm install cookie-parser</code> and you can use it like this:</p><pre name="a3d9" id="a3d9" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">const express = require('express')<br>const app = express()<br>const cookieParser = require('cookie-parser')</code></pre><pre name="0562" id="0562" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">app.get('/', (req, res) =&gt; res.send('Hello World!'))</code></pre><pre name="47c2" id="47c2" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">app.use(cookieParser())<br>app.listen(3000, () =&gt; console.log('Server ready'))</code></pre><p name="5a62" id="5a62" class="graf graf--p graf-after--pre">You can also set a middleware function to run for specific routes only, not for all, by using it as the second parameter of the route definition:</p><pre name="60c6" id="60c6" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">const myMiddleware = (req, res, next) =&gt; {<br>  /* ... */<br>  next()<br>}</code></pre><pre name="12d6" id="12d6" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">app.get('/', myMiddleware, (req, res) =&gt; res.send('Hello World!'))</code></pre><p name="beda" id="beda" class="graf graf--p graf-after--pre">If you need to store data that’s generated in a middleware to pass it down to subsequent middleware functions, or to the request handler, you can use the <code class="markup--code markup--p-code">Request.locals</code> object. It will attach that data to the current request:</p><pre name="ca31" id="ca31" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">req.locals.name = 'Flavio'</code></pre><h3 name="3603" id="3603" class="graf graf--h3 graf-after--pre">Serving static&nbsp;files</h3><p name="c365" id="c365" class="graf graf--p graf-after--h3">It’s common to have images, CSS and more in a <code class="markup--code markup--p-code">public</code> subfolder, and expose them to the root level:</p><pre name="9a2d" id="9a2d" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">const express = require('express')<br>const app = express()</code></pre><pre name="d530" id="d530" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">app.use(express.static('public'))</code></pre><pre name="0efb" id="0efb" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">/* ... */</code></pre><pre name="f565" id="f565" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">app.listen(3000, () =&gt; console.log('Server ready'))</code></pre><p name="27ef" id="27ef" class="graf graf--p graf-after--pre">If you have an <code class="markup--code markup--p-code">index.html</code> file in <code class="markup--code markup--p-code">public/</code>, that will be served if you now hit the root domain URL (<code class="markup--code markup--p-code">http://localhost:3000</code>)</p><h3 name="9942" id="9942" class="graf graf--h3 graf-after--p">Send files</h3><p name="4edc" id="4edc" class="graf graf--p graf-after--h3">Express provides a handy method to transfer a file as attachment: <code class="markup--code markup--p-code">Response.download()</code>.</p><p name="f270" id="f270" class="graf graf--p graf-after--p">Once a user hits a route that sends a file using this method, browsers will prompt the user for download.</p><p name="9509" id="9509" class="graf graf--p graf-after--p">The <code class="markup--code markup--p-code">Response.download()</code> method allows you to send a file attached to the request, and the browser instead of showing it in the page, it will save it to disk.</p><pre name="b04f" id="b04f" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">app.get('/', (req, res) =&gt; res.download('./file.pdf'))</code></pre><p name="8505" id="8505" class="graf graf--p graf-after--pre">In the context of an app:</p><pre name="4db0" id="4db0" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">const express = require('express')<br>const app = express()</code></pre><pre name="ae77" id="ae77" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">app.get('/', (req, res) =&gt; res.download('./file.pdf'))<br>app.listen(3000, () =&gt; console.log('Server ready'))</code></pre><p name="f901" id="f901" class="graf graf--p graf-after--pre">You can set the file to be sent with a custom filename:</p><pre name="374d" id="374d" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">res.download('./file.pdf', 'user-facing-filename.pdf')</code></pre><p name="f770" id="f770" class="graf graf--p graf-after--pre">This method provides a callback function which you can use to execute code once the file has been sent:</p><pre name="7c39" id="7c39" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">res.download('./file.pdf', 'user-facing-filename.pdf', (err) =&gt; {<br>  if (err) {<br>    //handle error<br>    return<br>  } else {<br>    //do something<br>  }<br>})</code></pre><h3 name="e5a4" id="e5a4" class="graf graf--h3 graf-after--pre">Sessions</h3><p name="633f" id="633f" class="graf graf--p graf-after--h3">By default Express requests are sequential and no request can be linked to each other. There is no way to know if this request comes from a client that already performed a request previously.</p><p name="ad1f" id="ad1f" class="graf graf--p graf-after--p">Users cannot be identified unless using some kind of mechanism that makes it possible.</p><p name="41e6" id="41e6" class="graf graf--p graf-after--p">That’s what sessions are.</p><p name="1dd2" id="1dd2" class="graf graf--p graf-after--p">When implemented, every user of you API or website will be assigned a unique session, and this allows you to store the user state.</p><p name="39da" id="39da" class="graf graf--p graf-after--p">We’ll use the <code class="markup--code markup--p-code">express-session</code> module, which is maintained by the Express team.</p><p name="8248" id="8248" class="graf graf--p graf-after--p">You can install it using</p><pre name="2f3f" id="2f3f" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">npm install express-session</code></pre><p name="07f6" id="07f6" class="graf graf--p graf-after--pre">and once you’re done, you can instantiate it in your application with</p><pre name="fdda" id="fdda" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">const session = require('express-session')</code></pre><p name="67d6" id="67d6" class="graf graf--p graf-after--pre">This is a middleware, so you <em class="markup--em markup--p-em">install</em> it in Express using</p><pre name="4d78" id="4d78" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">const express = require('express')<br>const session = require('express-session')</code></pre><pre name="b1bb" id="b1bb" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">const app = express()<br>app.use(session(<br>  'secret': '343ji43j4n3jn4jk3n'<br>))</code></pre><p name="1b26" id="1b26" class="graf graf--p graf-after--pre">After this is done, all the requests to the app routes are now using sessions.</p><p name="31a6" id="31a6" class="graf graf--p graf-after--p"><code class="markup--code markup--p-code">secret</code> is the only required parameter, but there are many more you can use. It should be a randomly unique string for you application.</p><p name="f507" id="f507" class="graf graf--p graf-after--p">The session is attached to the request, so you can access it using <code class="markup--code markup--p-code">req.session</code> here:</p><pre name="88ed" id="88ed" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">app.get('/', (req, res, next) =&gt; {<br>  // req.session<br>}</code></pre><p name="768e" id="768e" class="graf graf--p graf-after--pre">This object can be used to get data out of the session, and also to set data:</p><pre name="4e2d" id="4e2d" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">req.session.name = 'Flavio'<br>console.log(req.session.name) // 'Flavio'</code></pre><p name="84b1" id="84b1" class="graf graf--p graf-after--pre">This data is serialized as JSON when stored, so you are safe to use nested objects.</p><p name="8db5" id="8db5" class="graf graf--p graf-after--p">You can use sessions to communicate data to middleware that’s executed later, or to retrieve it later on on subsequent requests.</p><p name="136f" id="136f" class="graf graf--p graf-after--p">Where is the session data stored? it depends on how you set up the <code class="markup--code markup--p-code">express-session</code> module.</p><p name="971c" id="971c" class="graf graf--p graf-after--p">It can store session data in</p><ul class="postList"><li name="7928" id="7928" class="graf graf--li graf-after--p"><strong class="markup--strong markup--li-strong">memory</strong>, not meant for production</li><li name="69b8" id="69b8" class="graf graf--li graf-after--li">a <strong class="markup--strong markup--li-strong">database</strong> like MySQL or Mongo</li><li name="5171" id="5171" class="graf graf--li graf-after--li">a <strong class="markup--strong markup--li-strong">memory cache</strong> like Redis or Memcached</li></ul><blockquote name="38b4" id="38b4" class="graf graf--blockquote graf-after--li"><em class="markup--em markup--blockquote-em">There is a big list of 3rd packages that implement a wide variety of different compatible caching stores in </em><a href="https://github.com/expressjs/session" data-href="https://github.com/expressjs/session" class="markup--anchor markup--blockquote-anchor" rel="noopener" target="_blank"><em class="markup--em markup--blockquote-em">https://github.com/expressjs/session</em></a></blockquote><p name="586e" id="586e" class="graf graf--p graf-after--blockquote">All solutions store the session id in a cookie, and keep the data server-side. The client will receive the session id in a cookie, and will send it along with every HTTP request.</p><p name="420a" id="420a" class="graf graf--p graf-after--p">We’ll reference that server-side to associate the session id with the data stored locally.</p><p name="f86c" id="f86c" class="graf graf--p graf-after--p">Memory is the default, it requires no special setup on your part, it’s the simplest thing but it’s meant only for development purposes.</p><p name="f8c3" id="f8c3" class="graf graf--p graf-after--p">The best choice is a memory cache like Redis, for which you need to setup its own infrastructure.</p><p name="bd8a" id="bd8a" class="graf graf--p graf-after--p">Another popular package to manage sessions in Express is <code class="markup--code markup--p-code">cookie-session</code>, which has a big difference: it stores data client-side in the cookie. I do not recommend doing that because storing data in cookies means that it's stored client-side, and sent back and forth in every single request made by the user. It's also limited in size, as it can only store 4 kilobytes of data. Cookies also need to be secured, but by default they are not, since secure Cookies are possible on HTTPS sites and you need to configure them if you have proxies.</p><h3 name="2c7d" id="2c7d" class="graf graf--h3 graf-after--p">Validating input</h3><p name="186f" id="186f" class="graf graf--p graf-after--h3">Say you have a POST endpoint that accepts the name, email and age parameters:</p><pre name="35ad" id="35ad" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">const express = require('express')<br>const app = express()</code></pre><pre name="6a52" id="6a52" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">app.use(express.json())</code></pre><pre name="3a22" id="3a22" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">app.post('/form', (req, res) =&gt; {<br>  const name  = req.body.name<br>  const email = req.body.email<br>  const age   = req.body.age<br>})</code></pre><p name="a26c" id="a26c" class="graf graf--p graf-after--pre">How do you server-side validate those results to make sure</p><ul class="postList"><li name="e29f" id="e29f" class="graf graf--li graf-after--p">name is a string of at least 3 characters?</li><li name="9c12" id="9c12" class="graf graf--li graf-after--li">email is a real email?</li><li name="77f0" id="77f0" class="graf graf--li graf-after--li">age is a number, between 0 and 110?</li></ul><p name="17df" id="17df" class="graf graf--p graf-after--li">The best way to handle validating any kind of input coming from outside in Express is by using the <code class="markup--code markup--p-code"><a href="https://express-validator.github.io/" data-href="https://express-validator.github.io/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">express-validator</a></code><a href="https://express-validator.github.io/" data-href="https://express-validator.github.io/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank"> package</a>:</p><pre name="948d" id="948d" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">npm install express-validator</code></pre><p name="47fa" id="47fa" class="graf graf--p graf-after--pre">You require the <code class="markup--code markup--p-code">check</code> object from the package:</p><pre name="a8a8" id="a8a8" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">const { check } = require('express-validator/check')</code></pre><p name="2e1b" id="2e1b" class="graf graf--p graf-after--pre">We pass an array of <code class="markup--code markup--p-code">check()</code> calls as the second argument of the <code class="markup--code markup--p-code">post()</code> call. Every <code class="markup--code markup--p-code">check()</code> call accepts the parameter name as argument:</p><pre name="1a11" id="1a11" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">app.post('/form', [<br>  check('name').isLength({ min: 3 }),<br>  check('email').isEmail(),<br>  check('age').isNumeric()<br>], (req, res) =&gt; {<br>  const name  = req.body.name<br>  const email = req.body.email<br>  const age   = req.body.age<br>})</code></pre><p name="1c5a" id="1c5a" class="graf graf--p graf-after--pre">Notice I used</p><ul class="postList"><li name="6f73" id="6f73" class="graf graf--li graf-after--p"><code class="markup--code markup--li-code">isLength()</code></li><li name="2f89" id="2f89" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">isEmail()</code></li><li name="6449" id="6449" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">isNumeric()</code></li></ul><p name="9899" id="9899" class="graf graf--p graf-after--li">There are many more of these methods, all coming from <a href="https://github.com/chriso/validator.js#validators" data-href="https://github.com/chriso/validator.js#validators" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">validator.js</a>, including:</p><ul class="postList"><li name="9765" id="9765" class="graf graf--li graf-after--p"><code class="markup--code markup--li-code">contains()</code>, check if value contains the specified value</li><li name="55a6" id="55a6" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">equals()</code>, check if value equals the specified value</li><li name="eef5" id="eef5" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">isAlpha()</code></li><li name="31c3" id="31c3" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">isAlphanumeric()</code></li><li name="2cb0" id="2cb0" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">isAscii()</code></li><li name="a221" id="a221" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">isBase64()</code></li><li name="dd05" id="dd05" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">isBoolean()</code></li><li name="d802" id="d802" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">isCurrency()</code></li><li name="c6b8" id="c6b8" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">isDecimal()</code></li><li name="f1d3" id="f1d3" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">isEmpty()</code></li><li name="745f" id="745f" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">isFQDN()</code>, is a fully qualified domain name?</li><li name="fc95" id="fc95" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">isFloat()</code></li><li name="1adc" id="1adc" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">isHash()</code></li><li name="1dc5" id="1dc5" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">isHexColor()</code></li><li name="632f" id="632f" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">isIP()</code></li><li name="d085" id="d085" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">isIn()</code>, check if the value is in an array of allowed values</li><li name="da12" id="da12" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">isInt()</code></li><li name="55e8" id="55e8" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">isJSON()</code></li><li name="8589" id="8589" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">isLatLong()</code></li><li name="81e5" id="81e5" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">isLength()</code></li><li name="3205" id="3205" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">isLowercase()</code></li><li name="acfb" id="acfb" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">isMobilePhone()</code></li><li name="bcb6" id="bcb6" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">isNumeric()</code></li><li name="cecc" id="cecc" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">isPostalCode()</code></li><li name="5035" id="5035" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">isURL()</code></li><li name="2cd3" id="2cd3" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">isUppercase()</code></li><li name="ef7a" id="ef7a" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">isWhitelisted()</code>, checks the input against a whitelist of allowed characters</li></ul><p name="6de8" id="6de8" class="graf graf--p graf-after--li">You can validate the input against a regular expression using <code class="markup--code markup--p-code">matches()</code>.</p><p name="eba4" id="eba4" class="graf graf--p graf-after--p">Dates can be checked using</p><ul class="postList"><li name="db1d" id="db1d" class="graf graf--li graf-after--p"><code class="markup--code markup--li-code">isAfter()</code>, check if the entered date is after the one you pass</li><li name="db26" id="db26" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">isBefore()</code>, check if the entered date is before the one you pass</li><li name="0070" id="0070" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">isISO8601()</code></li><li name="a621" id="a621" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">isRFC3339()</code></li></ul><p name="d552" id="d552" class="graf graf--p graf-after--li">For exact details on how to use those validators, refer to <a href="https://github.com/chriso/validator.js#validators" data-href="https://github.com/chriso/validator.js#validators" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">https://github.com/chriso/validator.js#validators</a>.</p><p name="4363" id="4363" class="graf graf--p graf-after--p">All those checks can be combined by piping them:</p><pre name="ac8f" id="ac8f" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">check('name')<br>  .isAlpha()<br>  .isLength({ min: 10 })</code></pre><p name="439e" id="439e" class="graf graf--p graf-after--pre">If there is any error, the server automatically sends a response to communicate the error. For example if the email is not valid, this is what will be returned:</p><pre name="832e" id="832e" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">{<br>  "errors": [{<br>    "location": "body",<br>    "msg": "Invalid value",<br>    "param": "email"<br>  }]<br>}</code></pre><p name="2846" id="2846" class="graf graf--p graf-after--pre">This default error can be overridden for each check you perform, using <code class="markup--code markup--p-code">withMessage()</code>:</p><pre name="bdfc" id="bdfc" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">check('name')<br>  .isAlpha()<br>  .withMessage('Must be only alphabetical chars')<br>  .isLength({ min: 10 })<br>  .withMessage('Must be at least 10 chars long')</code></pre><p name="70e4" id="70e4" class="graf graf--p graf-after--pre">What if you want to write your own special, custom validator? You can use the <code class="markup--code markup--p-code">custom</code> validator.</p><p name="0a07" id="0a07" class="graf graf--p graf-after--p">In the callback function you can reject the validation either by throwing an exception, or by returning a rejected promise:</p><pre name="13ba" id="13ba" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">app.post('/form', [<br>  check('name').isLength({ min: 3 }),<br>  check('email').custom(email =&gt; {<br>    if (alreadyHaveEmail(email)) {<br>      throw new Error('Email already registered')<br>    }<br>  }),<br>  check('age').isNumeric()<br>], (req, res) =&gt; {<br>  const name  = req.body.name<br>  const email = req.body.email<br>  const age   = req.body.age<br>})</code></pre><p name="fea3" id="fea3" class="graf graf--p graf-after--pre">The custom validator:</p><pre name="6d1e" id="6d1e" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">check('email').custom(email =&gt; {<br>  if (alreadyHaveEmail(email)) {<br>    throw new Error('Email already registered')<br>  }<br>})</code></pre><p name="7eb8" id="7eb8" class="graf graf--p graf-after--pre">can be rewritten as</p><pre name="cccc" id="cccc" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">check('email').custom(email =&gt; {<br>  if (alreadyHaveEmail(email)) {<br>    return Promise.reject('Email already registered')<br>  }<br>})</code></pre><h3 name="f1c1" id="f1c1" class="graf graf--h3 graf-after--pre">Sanitizing input</h3><p name="3dad" id="3dad" class="graf graf--p graf-after--h3">You’ve seen how to validate input that comes from the outside world to your Express app.</p><p name="3a58" id="3a58" class="graf graf--p graf-after--p">There’s one thing you quickly learn when you run a public-facing server: never trust the input.</p><p name="674d" id="674d" class="graf graf--p graf-after--p">Even if you sanitize and make sure that people can’t enter weird things using client-side code, you’ll still be subject to people using tools (even just the browser devtools) to POST directly to your endpoints.</p><p name="b0c6" id="b0c6" class="graf graf--p graf-after--p">Or bots trying every possible combination of exploit known to humans.</p><p name="3b2d" id="3b2d" class="graf graf--p graf-after--p">What you need to do is sanitizing your input.</p><p name="5527" id="5527" class="graf graf--p graf-after--p">The <code class="markup--code markup--p-code"><a href="https://express-validator.github.io/" data-href="https://express-validator.github.io/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">express-validator</a></code><a href="https://express-validator.github.io/" data-href="https://express-validator.github.io/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank"> package</a> you already use to validate input can also conveniently used to perform sanitization.</p><p name="a693" id="a693" class="graf graf--p graf-after--p">Say you have a POST endpoint that accepts the name, email and age parameters:</p><pre name="e220" id="e220" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">const express = require('express')<br>const app = express()</code></pre><pre name="1d43" id="1d43" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">app.use(express.json())</code></pre><pre name="819e" id="819e" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">app.post('/form', (req, res) =&gt; {<br>  const name  = req.body.name<br>  const email = req.body.email<br>  const age   = req.body.age<br>})</code></pre><p name="d0b5" id="d0b5" class="graf graf--p graf-after--pre">You might validate it using:</p><pre name="e48b" id="e48b" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">const express = require('express')<br>const app = express()</code></pre><pre name="83b4" id="83b4" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">app.use(express.json())</code></pre><pre name="f988" id="f988" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">app.post('/form', [<br>  check('name').isLength({ min: 3 }),<br>  check('email').isEmail(),<br>  check('age').isNumeric()<br>], (req, res) =&gt; {<br>  const name  = req.body.name<br>  const email = req.body.email<br>  const age   = req.body.age<br>})</code></pre><p name="6d79" id="6d79" class="graf graf--p graf-after--pre">You can add sanitization by piping the sanitization methods after the validation ones:</p><pre name="b413" id="b413" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">app.post('/form', [<br>  check('name').isLength({ min: 3 }).trim().escape(),<br>  check('email').isEmail().normalizeEmail(),<br>  check('age').isNumeric().trim().escape()<br>], (req, res) =&gt; {<br>  //...<br>})</code></pre><p name="e267" id="e267" class="graf graf--p graf-after--pre">Here I used the methods:</p><ul class="postList"><li name="5eac" id="5eac" class="graf graf--li graf-after--p"><code class="markup--code markup--li-code">trim()</code> trims characters (whitespace by default) at the beginning and at the end of a string</li><li name="1317" id="1317" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">escape()</code> replaces <code class="markup--code markup--li-code">&lt;</code>, <code class="markup--code markup--li-code">&gt;</code>, <code class="markup--code markup--li-code">&amp;</code>, <code class="markup--code markup--li-code">'</code>, <code class="markup--code markup--li-code">"</code> and <code class="markup--code markup--li-code">/</code> with their corresponding HTML entities</li><li name="cb71" id="cb71" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">normalizeEmail()</code> canonicalizes an email address. Accepts several options to lowercase email addresses or subaddresses (e.g. <code class="markup--code markup--li-code">flavio+newsletters@gmail.com</code>)</li></ul><p name="13f5" id="13f5" class="graf graf--p graf-after--li">Other sanitization methods:</p><ul class="postList"><li name="f13b" id="f13b" class="graf graf--li graf-after--p"><code class="markup--code markup--li-code">blacklist()</code> remove characters that appear in the blacklist</li><li name="59ad" id="59ad" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">whitelist()</code> remove characters that do not appear in the whitelist</li><li name="ead4" id="ead4" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">unescape()</code> replaces HTML encoded entities with <code class="markup--code markup--li-code">&lt;</code>, <code class="markup--code markup--li-code">&gt;</code>, <code class="markup--code markup--li-code">&amp;</code>, <code class="markup--code markup--li-code">'</code>, <code class="markup--code markup--li-code">"</code> and <code class="markup--code markup--li-code">/</code></li><li name="4d08" id="4d08" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">ltrim()</code> like trim(), but only trims characters at the start of the string</li><li name="50d0" id="50d0" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">rtrim()</code> like trim(), but only trims characters at the end of the string</li><li name="80ab" id="80ab" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">stripLow()</code> remove ASCII control characters, which are normally invisible</li></ul><p name="7f40" id="7f40" class="graf graf--p graf-after--li">Force conversion to a format:</p><ul class="postList"><li name="d039" id="d039" class="graf graf--li graf-after--p"><code class="markup--code markup--li-code">toBoolean()</code> convert the input string to a boolean. Everything except for '0', 'false' and '' returns true. In strict mode only '1' and 'true' return true</li><li name="8554" id="8554" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">toDate()</code> convert the input string to a date, or null if the input is not a date</li><li name="8219" id="8219" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">toFloat()</code> convert the input string to a float, or NaN if the input is not a float</li><li name="9271" id="9271" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">toInt()</code> convert the input string to an integer, or NaN if the input is not an integer</li></ul><p name="2858" id="2858" class="graf graf--p graf-after--li">Like with custom validators, you can create a custom sanitizer.</p><p name="d4e5" id="d4e5" class="graf graf--p graf-after--p">In the callback function you just return the sanitized value:</p><pre name="86c2" id="86c2" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">const sanitizeValue = value =&gt; {<br>  //sanitize...<br>}</code></pre><pre name="fca5" id="fca5" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">app.post('/form', [<br>  check('value').customSanitizer(value =&gt; {<br>    return sanitizeValue(value)<br>  }),<br>], (req, res) =&gt; {<br>  const value  = req.body.value<br>})</code></pre><h3 name="7fa4" id="7fa4" class="graf graf--h3 graf-after--pre">Handling forms</h3><p name="7770" id="7770" class="graf graf--p graf-after--h3">This is an example of an HTML form:</p><pre name="73a8" id="73a8" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">&lt;form method="POST" action="/submit-form"&gt;<br>  &lt;input type="text" name="username" /&gt;<br>  &lt;input type="submit" /&gt;<br>&lt;/form&gt;</code></pre><p name="43e8" id="43e8" class="graf graf--p graf-after--pre">When the user press the submit button, the browser will automatically make a <code class="markup--code markup--p-code">POST</code> request to the <code class="markup--code markup--p-code">/submit-form</code> URL on the same origin of the page, sending the data it contains, encoded as <code class="markup--code markup--p-code">application/x-www-form-urlencoded</code>. In this case, the form data contains the <code class="markup--code markup--p-code">username</code> input field value.</p><p name="ddeb" id="ddeb" class="graf graf--p graf-after--p">Forms can also send data using the <code class="markup--code markup--p-code">GET</code> method, but the vast majority of the forms you'll build will use <code class="markup--code markup--p-code">POST</code>.</p><p name="4de9" id="4de9" class="graf graf--p graf-after--p">The form data will be sent in the POST request body.</p><p name="9f3b" id="9f3b" class="graf graf--p graf-after--p">To extract it, you will use the <code class="markup--code markup--p-code">express.urlencoded()</code> middleware, provided by Express:</p><pre name="b23e" id="b23e" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">const express = require('express')<br>const app = express()</code></pre><pre name="1407" id="1407" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">app.use(express.urlencoded())</code></pre><p name="04dc" id="04dc" class="graf graf--p graf-after--pre">Now you need to create a <code class="markup--code markup--p-code">POST</code> endpoint on the <code class="markup--code markup--p-code">/submit-form</code> route, and any data will be available on <code class="markup--code markup--p-code">Request.body</code>:</p><pre name="9629" id="9629" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">app.post('/submit-form', (req, res) =&gt; {<br>  const username = req.body.username<br>  //...<br>  res.end()<br>})</code></pre><p name="cacb" id="cacb" class="graf graf--p graf-after--pre">Don’t forget to validate the data before using it, using <code class="markup--code markup--p-code">express-validator</code>.</p><h3 name="fb32" id="fb32" class="graf graf--h3 graf-after--p">File uploads in&nbsp;forms</h3><p name="9b23" id="9b23" class="graf graf--p graf-after--h3">This is an example of an HTML form that allows a user to upload a file:</p><pre name="ebad" id="ebad" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">&lt;form method="POST" action="/submit-form"&gt;<br>  &lt;input type="file" name="document" /&gt;<br>  &lt;input type="submit" /&gt;<br>&lt;/form&gt;</code></pre><p name="a364" id="a364" class="graf graf--p graf-after--pre">When the user press the submit button, the browser will automatically make a <code class="markup--code markup--p-code">POST</code> request to the <code class="markup--code markup--p-code">/submit-form</code> URL on the same origin of the page, sending the data it contains, not encoded as <code class="markup--code markup--p-code">application/x-www-form-urlencoded</code> as a normal form, but as <code class="markup--code markup--p-code">multipart/form-data</code>.</p><p name="efee" id="efee" class="graf graf--p graf-after--p">Server-side, handling multipart data can be tricky and error prone, so we are going to use a utility library called <strong class="markup--strong markup--p-strong">formidable</strong>. <a href="https://github.com/felixge/node-formidable" data-href="https://github.com/felixge/node-formidable" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Here’s the GitHub repo</a>, it has over 4000 stars and well maintained.</p><p name="ce70" id="ce70" class="graf graf--p graf-after--p">You can install it using:</p><pre name="2587" id="2587" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">npm install formidable</code></pre><p name="3504" id="3504" class="graf graf--p graf-after--pre">Then in your Node.js file, include it:</p><pre name="5b10" id="5b10" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">const express = require('express')<br>const app = express()<br>const formidable = require('formidable')</code></pre><p name="52d6" id="52d6" class="graf graf--p graf-after--pre">Now in the <code class="markup--code markup--p-code">POST</code> endpoint on the <code class="markup--code markup--p-code">/submit-form</code> route, we instantiate a new Formidable form using <code class="markup--code markup--p-code">formidable.IncomingFrom()</code>:</p><pre name="cb0b" id="cb0b" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">app.post('/submit-form', (req, res) =&gt; {<br>  new formidable.IncomingFrom()<br>})</code></pre><p name="4c2a" id="4c2a" class="graf graf--p graf-after--pre">After doing so, we need to parse the form. We can do so synchronously by providing a callback, which means all files are processed, and once formidable is done, it makes them available:</p><pre name="83e7" id="83e7" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">app.post('/submit-form', (req, res) =&gt; {<br>  new formidable.IncomingFrom().parse(req, (err, fields, files) =&gt; {<br>    if (err) {<br>      console.error('Error', err)<br>      throw err<br>    }<br>    console.log('Fields', fields)<br>    console.log('Files', files)<br>    files.map(file =&gt; {<br>      console.log(file)<br>    })<br>  })<br>})</code></pre><p name="d88a" id="d88a" class="graf graf--p graf-after--pre">Or you can use events instead of a callback, to be notified when each file is parsed, and other events, like ending processing, receiving a non-file field, or an error occurred:</p><pre name="5bc5" id="5bc5" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">app.post('/submit-form', (req, res) =&gt; {<br>  new formidable.IncomingFrom().parse(req)<br>    .on('field', (name, field) =&gt; {<br>      console.log('Field', name, field)<br>    })<br>    .on('file', (name, file) =&gt; {<br>      console.log('Uploaded file', name, file)<br>    })<br>    .on('aborted', () =&gt; {<br>      console.error('Request aborted by the user')<br>    })<br>    .on('error', (err) =&gt; {<br>      console.error('Error', err)<br>      throw err<br>    })<br>    .on('end', () =&gt; {<br>      res.end()<br>    })<br>})</code></pre><p name="42aa" id="42aa" class="graf graf--p graf-after--pre">Whatever way you choose, you’ll get one or more Formidable.File objects, which give you information about the file uploaded. These are some of the methods you can call:</p><ul class="postList"><li name="946e" id="946e" class="graf graf--li graf-after--p"><code class="markup--code markup--li-code">file.size</code>, the file size in bytes</li><li name="26a0" id="26a0" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">file.path</code>, the path this file is written to</li><li name="da7a" id="da7a" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">file.name</code>, the name of the file</li><li name="e0a0" id="e0a0" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">file.type</code>, the MIME type of the file</li></ul><p name="0bde" id="0bde" class="graf graf--p graf-after--li">The path defaults to the temporary folder and can be modified if you listen to the <code class="markup--code markup--p-code">fileBegin</code> event:</p><pre name="791a" id="791a" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">app.post('/submit-form', (req, res) =&gt; {<br>  new formidable.IncomingFrom().parse(req)<br>    .on('fileBegin', (name, file) =&gt; {<br>      form.on('fileBegin', (name, file) =&gt; {<br>        file.path = __dirname + '/uploads/' + file.name<br>      })<br>    })<br>    .on('file', (name, file) =&gt; {<br>      console.log('Uploaded file', name, file)<br>    })<br>    //...<br>})</code></pre><h3 name="f32a" id="f32a" class="graf graf--h3 graf-after--pre">How to create a self-signed HTTPS certificate for Node.js to test apps&nbsp;locally</h3><p name="e081" id="e081" class="graf graf--p graf-after--h3">To be able to serve a site on HTTPS from localhost you need to create a self-signed certificate.</p><p name="bc98" id="bc98" class="graf graf--p graf-after--p">A self-signed certificate will be enough to establish a secure HTTPS connection, although browsers will complain that the certificate is self-signed and as such it’s not trusted. It’s great for development purposes.</p><p name="2bb5" id="2bb5" class="graf graf--p graf-after--p">To create the certificate you must have <strong class="markup--strong markup--p-strong">OpenSSL</strong> installed on your system.</p><p name="34b0" id="34b0" class="graf graf--p graf-after--p">You might have it installed already, just test by typing <code class="markup--code markup--p-code">openssl</code> in your terminal.</p><p name="4f63" id="4f63" class="graf graf--p graf-after--p">If not, on a Mac you can install it using <code class="markup--code markup--p-code">brew install openssl</code> if you use <a href="https://brew.sh/" data-href="https://brew.sh/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Homebrew</a>. Otherwise search on Google "how to install openssl on ".</p><p name="28be" id="28be" class="graf graf--p graf-after--p">Once OpenSSL is installed, run this command:</p><pre name="15e9" id="15e9" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">openssl req -nodes -new -x509 -keyout server.key -out server.cert</code></pre><p name="bcd1" id="bcd1" class="graf graf--p graf-after--pre">It will as you a few questions. The first is the country name:</p><pre name="c54a" id="c54a" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">Generating a 1024 bit RSA private key<br>...........++++++<br>.........++++++<br>writing new private key to 'server.key'<br>-----<br>You are about to be asked to enter information that will be incorporated into your certificate request.<br>What you are about to enter is what is called a Distinguished Name or a DN.<br>There are quite a few fields but you can leave some blank<br>For some fields there will be a default value,<br>If you enter '.', the field will be left blank.<br>-----<br>Country Name (2 letter code) [AU]:</code></pre><p name="9af3" id="9af3" class="graf graf--p graf-after--pre">Then your state or province:</p><pre name="4f7e" id="4f7e" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">State or Province Name (full name) [Some-State]:</code></pre><p name="579d" id="579d" class="graf graf--p graf-after--pre">your city:</p><pre name="fead" id="fead" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">Locality Name (eg, city) []:</code></pre><p name="3daf" id="3daf" class="graf graf--p graf-after--pre">and your organization name:</p><pre name="d824" id="d824" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">Organization Name (eg, company) [Internet Widgits Pty Ltd]:<br>Organizational Unit Name (eg, section) []:</code></pre><p name="58be" id="58be" class="graf graf--p graf-after--pre">You can leave all of these empty.</p><p name="8fe0" id="8fe0" class="graf graf--p graf-after--p">Just remember to set this to <code class="markup--code markup--p-code">localhost</code>:</p><pre name="9479" id="9479" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">Common Name (e.g. server FQDN or YOUR name) []: localhost</code></pre><p name="a4b1" id="a4b1" class="graf graf--p graf-after--pre">and to add your email address:</p><pre name="3fb5" id="3fb5" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">Email Address []:</code></pre><p name="0dbd" id="0dbd" class="graf graf--p graf-after--pre">That’s it! Now you have 2 files in the folder where you ran this command:</p><ul class="postList"><li name="341f" id="341f" class="graf graf--li graf-after--p"><code class="markup--code markup--li-code">server.cert</code> is the self-signed certificate file</li><li name="433c" id="433c" class="graf graf--li graf-after--li"><code class="markup--code markup--li-code">server.key</code> is the private key of the certificate</li></ul><p name="06a3" id="06a3" class="graf graf--p graf-after--li">Both files will be needed to establish the HTTPS connection, and depending on how you are going to setup your server, the process to use them will be different.</p><p name="0f9f" id="0f9f" class="graf graf--p graf-after--p">Those files need to be put in a place reachable by the application, then you need to configure the server to use them.</p><p name="32db" id="32db" class="graf graf--p graf-after--p">This is an example using the <code class="markup--code markup--p-code">https</code> core module and Express:</p><pre name="7a46" id="7a46" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">const https = require('https')<br>const app = express()</code></pre><pre name="c113" id="c113" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">app.get('/', (req, res) =&gt; {<br>  res.send('Hello HTTPS!')<br>})</code></pre><pre name="c9c5" id="c9c5" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">https.createServer({}, app).listen(3000, () =&gt; {<br>  console.log('Listening...')<br>})</code></pre><p name="77bb" id="77bb" class="graf graf--p graf-after--pre">without adding the certificate, if I connect to <code class="markup--code markup--p-code">https://localhost:3000</code> this is what the browser will show:</p><figure name="5a7a" id="5a7a" class="graf graf--figure graf-after--p"><div class="aspectRatioPlaceholder is-locked" style="max-width: 700px; max-height: 378px;"><div class="aspectRatioPlaceholder-fill" style="padding-bottom: 53.900000000000006%;"></div><div class="progressiveMedia js-progressiveMedia graf-image is-canvasLoaded" data-image-id="1*VFrGRrmDGH2m9R4456UCDg.png" data-width="899" data-height="485" data-action="zoom" data-action-value="1*VFrGRrmDGH2m9R4456UCDg.png" data-scroll="native"><img src="./The definitive guide to Express, the Node.js Web Application Framework_files/1_VFrGRrmDGH2m9R4456UCDg.png" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail"><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas" width="75" height="40"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/800/1*VFrGRrmDGH2m9R4456UCDg.png"><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/800/1*VFrGRrmDGH2m9R4456UCDg.png"></noscript></div></div></figure><p name="decb" id="decb" class="graf graf--p graf-after--figure">With the certificate in place:</p><pre name="8d48" id="8d48" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">const fs = require('fs')</code></pre><pre name="b444" id="b444" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">//...</code></pre><pre name="c1c0" id="c1c0" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">https.createServer({<br>  key: fs.readFileSync('server.key'),<br>  cert: fs.readFileSync('server.cert')<br>}, app).listen(3000, () =&gt; {<br>  console.log('Listening...')<br>})</code></pre><p name="9702" id="9702" class="graf graf--p graf-after--pre">Chrome will tell us the certificate is invalid, since it’s self-signed, and will ask us to confirm to continue, but the HTTPS connection will work:</p><figure name="9fff" id="9fff" class="graf graf--figure graf-after--p"><div class="aspectRatioPlaceholder is-locked" style="max-width: 700px; max-height: 403px;"><div class="aspectRatioPlaceholder-fill" style="padding-bottom: 57.599999999999994%;"></div><div class="progressiveMedia js-progressiveMedia graf-image is-canvasLoaded" data-image-id="1*wBZ5jTfVTX-OqeQ4dlP7yg.png" data-width="929" data-height="535" data-action="zoom" data-action-value="1*wBZ5jTfVTX-OqeQ4dlP7yg.png" data-scroll="native"><img src="./The definitive guide to Express, the Node.js Web Application Framework_files/1_wBZ5jTfVTX-OqeQ4dlP7yg.png" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail"><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas" width="75" height="42"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/800/1*wBZ5jTfVTX-OqeQ4dlP7yg.png"><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/800/1*wBZ5jTfVTX-OqeQ4dlP7yg.png"></noscript></div></div></figure><h3 name="c2d0" id="c2d0" class="graf graf--h3 graf-after--figure">Setup Let’s Encrypt for&nbsp;Express</h3><p name="bbbc" id="bbbc" class="graf graf--p graf-after--h3">If you run a Node.js application on your own VPS, you need to manage getting an SSL certificate.</p><p name="a54e" id="a54e" class="graf graf--p graf-after--p">Today the standard for doing this is to use <a href="https://letsencrypt.org/" data-href="https://letsencrypt.org/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Let’s Encrypt</a> and <a href="https://certbot.eff.org/" data-href="https://certbot.eff.org/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Certbot</a>, a tool from <a href="https://www.eff.org/" data-href="https://www.eff.org/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">EFF</a>, aka Electronic Frontier Foundation, the leading nonprofit organization focused on privacy, free speech, and in general civil liberties in the digital world.</p><p name="55df" id="55df" class="graf graf--p graf-after--p">These are the steps we’ll follow:</p><ul class="postList"><li name="39ea" id="39ea" class="graf graf--li graf-after--p">Install Certbot</li><li name="3861" id="3861" class="graf graf--li graf-after--li">Generate the SSL certificate using Certbot</li><li name="1fad" id="1fad" class="graf graf--li graf-after--li">Allow Express to serve static files</li><li name="7915" id="7915" class="graf graf--li graf-after--li">Confirm the domain</li><li name="86ab" id="86ab" class="graf graf--li graf-after--li">Obtain the certificate</li><li name="7791" id="7791" class="graf graf--li graf-after--li">Setup the renewal</li></ul><h4 name="8760" id="8760" class="graf graf--h4 graf-after--li">Install Certbot</h4><p name="1bb2" id="1bb2" class="graf graf--p graf-after--h4">Those instructions assume you are using Ubuntu, Debian or any other Linux distribution that uses <code class="markup--code markup--p-code">apt-get</code>:</p><pre name="d8cc" id="d8cc" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">sudo add-apt repository ppa:certbot/certbot<br>sudo apt-get update<br>sudo apt-get install certbot</code></pre><p name="b86e" id="b86e" class="graf graf--p graf-after--pre">You can also install Certbot on a Mac to test:</p><pre name="7f11" id="7f11" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">brew install certbot</code></pre><p name="44d7" id="44d7" class="graf graf--p graf-after--pre">but you will need to link that to a real domain name, in order for it to be useful.</p><h4 name="db9e" id="db9e" class="graf graf--h4 graf-after--p">Generate the SSL certificate using&nbsp;Certbot</h4><p name="9e78" id="9e78" class="graf graf--p graf-after--h4">Now that Certbot is installed, you can invoke it to generate the certificate. You must run this as root:</p><pre name="320a" id="320a" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">certbot certonly --manual</code></pre><p name="1a85" id="1a85" class="graf graf--p graf-after--pre">or call sudo</p><pre name="4957" id="4957" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">sudo certbot certonly --manual</code></pre><p name="1ba7" id="1ba7" class="graf graf--p graf-after--pre">The installer will ask you the domain of your website.</p><p name="406e" id="406e" class="graf graf--p graf-after--p">This is the process in detail.</p><p name="4217" id="4217" class="graf graf--p graf-after--p">It asks for the email</p><pre name="8ad7" id="8ad7" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">➜ sudo certbot certonly --manual<br>Password: XXXXXXXXXXXXXXXXXX<br>Saving debug log to /var/log/letsencrypt/letsencrypt.log<br>Plugins selected: Authenticator manual, Installer None<br>Enter email address (used for urgent renewal and security notices) (Enter 'c' to<br>cancel): flavio@flaviocopes.com</code></pre><p name="efa0" id="efa0" class="graf graf--p graf-after--pre">It asks to accept the ToS:</p><pre name="f05c" id="f05c" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">Please read the Terms of Service at<br>https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must<br>agree in order to register with the ACME server at<br>https://acme-v02.api.letsencrypt.org/directory</code></pre><pre name="0a56" id="0a56" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">(A)gree/(C)ancel: A</code></pre><p name="bdc2" id="bdc2" class="graf graf--p graf-after--pre">It asks to share the email address</p><pre name="5165" id="5165" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">Would you be willing to share your email address with the Electronic Frontier<br>Foundation, a founding partner of the Let's Encrypt project and the non-profit<br>organization that develops Certbot? We'd like to send you email about our work<br>encrypting the web, EFF news, campaigns, and ways to support digital freedom.<br>- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<br>(Y)es/(N)o: Y</code></pre><p name="dd90" id="dd90" class="graf graf--p graf-after--pre">And finally we can enter the domain where we want to use the SSL certificate:</p><pre name="bc0d" id="bc0d" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">Please enter in your domain name(s) (comma and/or space separated)  (Enter 'c'<br>to cancel): copesflavio.com</code></pre><p name="41e8" id="41e8" class="graf graf--p graf-after--pre">It asks if it’s ok to log your IP:</p><pre name="d875" id="d875" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">Obtaining a new certificate<br>Performing the following challenges:<br>http-01 challenge for copesflavio.com</code></pre><pre name="4125" id="4125" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<br>NOTE: The IP of this machine will be publicly logged as having requested this<br>certificate. If you're running certbot in manual mode on a machine that is not<br>your server, please ensure you're okay with that.</code></pre><pre name="8446" id="8446" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">Are you OK with your IP being logged?<br>- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<br>(Y)es/(N)o: y</code></pre><p name="ac85" id="ac85" class="graf graf--p graf-after--pre">And finally we get to the verification phase!</p><pre name="869d" id="869d" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<br>Create a file containing just this data:</code></pre><pre name="5484" id="5484" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">TS_oZ2-ji23jrio3j2irj3iroj_U51u1o0x7rrDY2E.1DzOo_voCOsrpddP_2kpoek2opeko2pke-UAPb21sW1c</code></pre><pre name="b1d3" id="b1d3" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">And make it available on your web server at this URL:</code></pre><pre name="23a3" id="23a3" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">http://copesflavio.com/.well-known/acme-challenge/TS_oZ2-ji23jrio3j2irj3iroj_U51u1o0x7rrDY2E</code></pre><p name="e92e" id="e92e" class="graf graf--p graf-after--pre">Now let’s leave Certbot alone for a couple minutes.</p><p name="1032" id="1032" class="graf graf--p graf-after--p">We need to verify we own the domain, by creating a file named <code class="markup--code markup--p-code">TS_oZ2-ji23jrio3j2irj3iroj_U51u1o0x7rrDY2E</code> in the&nbsp;<code class="markup--code markup--p-code">.well-known/acme-challenge/</code> folder. Pay attention! The weird string I just pasted change every single time.</p><p name="7453" id="7453" class="graf graf--p graf-after--p">You’ll need to create the folder and the file, since they do not exist by default.</p><p name="d440" id="d440" class="graf graf--p graf-after--p">In this file you need to put the content that Certbot printed:</p><pre name="2d8f" id="2d8f" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">TS_oZ2-ji23jrio3j2irj3iroj_U51u1o0x7rrDY2E.1DzOo_voCOsrpddP_2kpoek2opeko2pke-UAPb21sW1c</code></pre><p name="cf84" id="cf84" class="graf graf--p graf-after--pre">As for the filename, this string is unique each time you run Certbot.</p><h4 name="c0c3" id="c0c3" class="graf graf--h4 graf-after--p">Allow Express to serve static&nbsp;files</h4><p name="a153" id="a153" class="graf graf--p graf-after--h4">In order to serve that file from Express, you need to enable serving static files. You can create a <code class="markup--code markup--p-code">static</code>folder, and add there the&nbsp;<code class="markup--code markup--p-code">.well-known</code> subfolder, then configure Express like this:</p><pre name="92e8" id="92e8" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">const express = require('express')<br>const app = express()</code></pre><pre name="97fa" id="97fa" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">//...</code></pre><pre name="adac" id="adac" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">app.use(express.static(__dirname + '/static', { dotfiles: 'allow' } ))</code></pre><pre name="080f" id="080f" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">//...</code></pre><p name="04c0" id="04c0" class="graf graf--p graf-after--pre">The <code class="markup--code markup--p-code">dotfiles</code> option is mandatory otherwise&nbsp;<code class="markup--code markup--p-code">.well-known</code>, which is a dotfile as it starts with a dot, won't be made visible. This is a security measure, because dotfiles can contain sensitive information and they are better off preserved by default.</p><h4 name="1531" id="1531" class="graf graf--h4 graf-after--p">Confirm the&nbsp;domain</h4><p name="d64c" id="d64c" class="graf graf--p graf-after--h4">Now run the application and make sure the file is reachable from the public internet, and go back to Certbot, which is still running, and press ENTER to go on with the script.</p><h4 name="ec56" id="ec56" class="graf graf--h4 graf-after--p">Obtain the certificate</h4><p name="f630" id="f630" class="graf graf--p graf-after--h4">That’s it! If all went well, Certbot created the certificate, and the private key, and made them available in a folder on your computer (and it will tell you which folder, of course).</p><p name="d246" id="d246" class="graf graf--p graf-after--p">Now copy/paste the paths into your application, to start using them to serve your requests:</p><pre name="50c5" id="50c5" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">const fs = require('fs')<br>const https = require('https')<br>const app = express()</code></pre><pre name="757e" id="757e" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">app.get('/', (req, res) =&gt; {<br>  res.send('Hello HTTPS!')<br>})</code></pre><pre name="078a" id="078a" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">https.createServer({<br>  key: fs.readFileSync('/etc/letsencrypt/path/to/key.pem'),<br>  cert: fs.readFileSync('/etc/letsencrypt/path/to/cert.pem'),<br>  ca: fs.readFileSync('/etc/letsencrypt/path/to/chain.pem')<br>}, app).listen(443, () =&gt; {<br>  console.log('Listening...')<br>})</code></pre><p name="4530" id="4530" class="graf graf--p graf-after--pre">Note that I made this server listen on port 443, so you need to run it with root permissions.</p><p name="6823" id="6823" class="graf graf--p graf-after--p">Also, the server is exclusively running in HTTPS, because I used <code class="markup--code markup--p-code">https.createServer()</code>. You can also run an HTTP server alongside this, by running:</p><pre name="5f01" id="5f01" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">http.createServer(app).listen(80, () =&gt; {<br>  console.log('Listening...')<br>})</code></pre><pre name="e509" id="e509" class="graf graf--pre graf-after--pre"><code class="markup--code markup--pre-code">https.createServer({<br>  key: fs.readFileSync('/etc/letsencrypt/path/to/key.pem'),<br>  cert: fs.readFileSync('/etc/letsencrypt/path/to/cert.pem'),<br>  ca: fs.readFileSync('/etc/letsencrypt/path/to/chain.pem')<br>}, app).listen(443, () =&gt; {<br>  console.log('Listening...')<br>})</code></pre><h4 name="50d4" id="50d4" class="graf graf--h4 graf-after--pre">Setup the&nbsp;renewal</h4><p name="4f5f" id="4f5f" class="graf graf--p graf-after--h4">The SSL certificate is not going to be valid for 90 days. You need to set up an automated system for renewing it.</p><p name="fa72" id="fa72" class="graf graf--p graf-after--p">How? Using a cron job.</p><p name="206a" id="206a" class="graf graf--p graf-after--p">A cron job is a way to run tasks every interval of time. It can be eery week, every minute, every month.</p><p name="da97" id="da97" class="graf graf--p graf-after--p">In our case we’ll run the renewal script twice per day, as recommended in the Certbot documentation.</p><p name="5b9d" id="5b9d" class="graf graf--p graf-after--p">First find out the absolute path of <code class="markup--code markup--p-code">certbot</code> on you system. I use <code class="markup--code markup--p-code">type certbot</code> on macOS to get it, and in my case it's <code class="markup--code markup--p-code">/usr/local/bin/certbot</code>.</p><p name="8dd1" id="8dd1" class="graf graf--p graf-after--p">Here’s the script we need to run:</p><p name="073e" id="073e" class="graf graf--p graf-after--p"><code class="markup--code markup--p-code">certbot renew</code></p><p name="8ca2" id="8ca2" class="graf graf--p graf-after--p">This is the cron job entry:</p><pre name="82b9" id="82b9" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">0 */12 * * * root /usr/local/bin/certbot renew &gt;/dev/null 2&gt;&amp;1</code></pre><p name="0c59" id="0c59" class="graf graf--p graf-after--pre">It means run it every 12 hours, every day: at 00:00 and at 12:00.</p><blockquote name="6dc5" id="6dc5" class="graf graf--blockquote graf-after--p"><em class="markup--em markup--blockquote-em">Tip: I generated this line using </em><a href="https://crontab-generator.org/" data-href="https://crontab-generator.org/" class="markup--anchor markup--blockquote-anchor" rel="noopener" target="_blank"><em class="markup--em markup--blockquote-em">https://crontab-generator.org/</em></a></blockquote><p name="ac06" id="ac06" class="graf graf--p graf-after--blockquote">Add this script to your crontab, by using the command:</p><pre name="0d5b" id="0d5b" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">env EDITOR=pico crontab -e</code></pre><p name="8061" id="8061" class="graf graf--p graf-after--pre">This opens the <code class="markup--code markup--p-code">pico</code> editor (you can choose the one you prefer). You enter the line, save, and the cron job is installed.</p><p name="481c" id="481c" class="graf graf--p graf-after--p">Once this is done, you can see the list of cron jobs active using</p><pre name="368f" id="368f" class="graf graf--pre graf-after--p"><code class="markup--code markup--pre-code">crontab -l</code></pre><h3 name="57d6" id="57d6" class="graf graf--h3 graf-after--pre">Wrapping up</h3><p name="6b4c" id="6b4c" class="graf graf--p graf-after--h3">If you made this far, that’s awesome! I hope this introduction to Express will get you up to speed with this awesome Node.js library. Remember, you can get a <a href="https://pages.convertkit.com/7ba7d476a5/f0c9c5cdb4" data-href="https://pages.convertkit.com/7ba7d476a5/f0c9c5cdb4" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">PDF, ePub and Mobi</a> version of this page for an easier reference, or to read it on your Kindle or tablet.</p><figure name="0c1b" id="0c1b" class="graf graf--figure graf-after--p graf--trailing" data-scroll="native"><div class="aspectRatioPlaceholder is-locked" style="max-width: 700px; max-height: 350px;"><div class="aspectRatioPlaceholder-fill" style="padding-bottom: 50%;"></div><a href="https://goo.gl/w4Pbea" data-href="https://goo.gl/w4Pbea" class="graf-imageAnchor" data-action="image-link" data-action-observe-only="true"><div class="progressiveMedia js-progressiveMedia graf-image is-canvasLoaded" data-image-id="1*PZjwR1Nbluff5IMI6Y1T6g@2x.png" data-width="1400" data-height="700" data-scroll="native"><img src="./The definitive guide to Express, the Node.js Web Application Framework_files/1_PZjwR1Nbluff5IMI6Y1T6g@2x.png" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail"><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas" width="75" height="37"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/800/1*PZjwR1Nbluff5IMI6Y1T6g@2x.png"><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/800/1*PZjwR1Nbluff5IMI6Y1T6g@2x.png"></noscript></div></a></div></figure></div></div></section></div><footer class="u-paddingTop10"><div class="container u-maxWidth740"><div class="row"><div class="col u-size12of12"></div></div><div class="row"><div class="col u-size12of12 js-postTags"><div class="u-paddingBottom10"><ul class="tags tags--postTags tags--borderless"><li><a class="link u-baseColor--link" href="https://hackernoon.com/tagged/nodejs?source=post" data-action-source="post" data-collection-slug="hacker-daily">Nodejs</a></li><li><a class="link u-baseColor--link" href="https://hackernoon.com/tagged/web-application-framework?source=post" data-action-source="post" data-collection-slug="hacker-daily">Web Application Framework</a></li><li><a class="link u-baseColor--link" href="https://hackernoon.com/tagged/express?source=post" data-action-source="post" data-collection-slug="hacker-daily">Express</a></li><li><a class="link u-baseColor--link" href="https://hackernoon.com/tagged/nodejs-app-framework?source=post" data-action-source="post" data-collection-slug="hacker-daily">Nodejs App Framework</a></li><li><a class="link u-baseColor--link" href="https://hackernoon.com/tagged/express-nodejs?source=post" data-action-source="post" data-collection-slug="hacker-daily">Express Nodejs</a></li></ul></div></div></div><section class="uiScale uiScale-ui--small uiScale-caption--regular u-borderTopLightest u-marginTop10 u-paddingTop20"><div class="ui-h3 u-textColorDarker u-fontSize22">Like what you read? Give Flavio Copes a round of applause.</div><p class="ui-body u-marginBottom20 u-textColorDark u-fontSize16">From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.</p></section><div class="postActions js-postActionsFooter"><div class="u-flexCenter"><div class="u-flex1"><div class="multirecommend js-actionMultirecommend u-flexCenter u-width60" data-post-id="649352e2ae87" data-is-icon-29px="true" data-is-circle="true" data-has-recommend-list="true" data-source="post_actions_footer-----649352e2ae87---------------------clap_footer"><div class="u-relative u-foreground"><button class="button button--large button--circle button--withChrome u-baseColor--buttonNormal button--withIcon button--withSvgIcon clapButton js-actionMultirecommendButton clapButton--largePill u-relative u-foreground u-xs-paddingLeft13 u-width60 u-height60 u-accentColor--textNormal u-accentColor--buttonNormal clap-onboardingcollection" data-action="multivote" data-action-value="649352e2ae87" data-action-type="long-press" data-action-source="post_actions_footer-----649352e2ae87---------------------clap_footer" aria-label="Clap"><span class="button-defaultState"><span class="svgIcon svgIcon--clap svgIcon--33px u-relative u-topNegative2 u-xs-top0"><svg class="svgIcon-use" width="33" height="33"><path d="M28.86 17.342l-3.64-6.402c-.292-.433-.712-.729-1.163-.8a1.124 1.124 0 0 0-.889.213c-.63.488-.742 1.181-.33 2.061l1.222 2.587 1.4 2.46c2.234 4.085 1.511 8.007-2.145 11.663-.26.26-.526.49-.797.707 1.42-.084 2.881-.683 4.292-2.094 3.822-3.823 3.565-7.876 2.05-10.395zm-6.252 11.075c3.352-3.35 3.998-6.775 1.978-10.469l-3.378-5.945c-.292-.432-.712-.728-1.163-.8a1.122 1.122 0 0 0-.89.213c-.63.49-.742 1.182-.33 2.061l1.72 3.638a.502.502 0 0 1-.806.568l-8.91-8.91a1.335 1.335 0 0 0-1.887 1.886l5.292 5.292a.5.5 0 0 1-.707.707l-5.292-5.292-1.492-1.492c-.503-.503-1.382-.505-1.887 0a1.337 1.337 0 0 0 0 1.886l1.493 1.492 5.292 5.292a.499.499 0 0 1-.353.854.5.5 0 0 1-.354-.147L5.642 13.96a1.338 1.338 0 0 0-1.887 0 1.338 1.338 0 0 0 0 1.887l2.23 2.228 3.322 3.324a.499.499 0 0 1-.353.853.502.502 0 0 1-.354-.146l-3.323-3.324a1.333 1.333 0 0 0-1.886 0 1.325 1.325 0 0 0-.39.943c0 .356.138.691.39.943l6.396 6.397c3.528 3.53 8.86 5.313 12.821 1.353zM12.73 9.26l5.68 5.68-.49-1.037c-.518-1.107-.426-2.13.224-2.89l-3.303-3.304a1.337 1.337 0 0 0-1.886 0 1.326 1.326 0 0 0-.39.944c0 .217.067.42.165.607zm14.787 19.184c-1.599 1.6-3.417 2.392-5.353 2.392-.349 0-.7-.03-1.058-.082a7.922 7.922 0 0 1-3.667.887c-3.049 0-6.115-1.626-8.359-3.87l-6.396-6.397A2.315 2.315 0 0 1 2 19.724a2.327 2.327 0 0 1 1.923-2.296l-.875-.875a2.339 2.339 0 0 1 0-3.3 2.33 2.33 0 0 1 1.24-.647l-.139-.139c-.91-.91-.91-2.39 0-3.3.884-.884 2.421-.882 3.301 0l.138.14a2.335 2.335 0 0 1 3.948-1.24l.093.092c.091-.423.291-.828.62-1.157a2.336 2.336 0 0 1 3.3 0l3.384 3.386a2.167 2.167 0 0 1 1.271-.173c.534.086 1.03.354 1.441.765.11-.549.415-1.034.911-1.418a2.12 2.12 0 0 1 1.661-.41c.727.117 1.385.565 1.853 1.262l3.652 6.423c1.704 2.832 2.025 7.377-2.205 11.607zM13.217.484l-1.917.882 2.37 2.837-.454-3.719zm8.487.877l-1.928-.86-.44 3.697 2.368-2.837zM16.5 3.293L15.478-.005h2.044L16.5 3.293z" fill-rule="evenodd"></path></svg></span></span><span class="button-activeState"><span class="svgIcon svgIcon--clapFilled svgIcon--33px u-relative u-topNegative2 u-xs-top0"><svg class="svgIcon-use" width="33" height="33"><g fill-rule="evenodd"><path d="M29.58 17.1l-3.854-6.78c-.365-.543-.876-.899-1.431-.989a1.491 1.491 0 0 0-1.16.281c-.42.327-.65.736-.7 1.207v.001l3.623 6.367c2.46 4.498 1.67 8.802-2.333 12.807-.265.265-.536.505-.81.728 1.973-.222 3.474-1.286 4.45-2.263 4.166-4.165 3.875-8.6 2.215-11.36zm-4.831.82l-3.581-6.3c-.296-.439-.725-.742-1.183-.815a1.105 1.105 0 0 0-.89.213c-.647.502-.755 1.188-.33 2.098l1.825 3.858a.601.601 0 0 1-.197.747.596.596 0 0 1-.77-.067L10.178 8.21c-.508-.506-1.393-.506-1.901 0a1.335 1.335 0 0 0-.393.95c0 .36.139.698.393.95v.001l5.61 5.61a.599.599 0 1 1-.848.847l-5.606-5.606c-.001 0-.002 0-.003-.002L5.848 9.375a1.349 1.349 0 0 0-1.902 0 1.348 1.348 0 0 0 0 1.901l1.582 1.582 5.61 5.61a.6.6 0 0 1-.848.848l-5.61-5.61c-.51-.508-1.393-.508-1.9 0a1.332 1.332 0 0 0-.394.95c0 .36.139.697.393.952l2.363 2.362c.002.001.002.002.002.003l3.52 3.52a.6.6 0 0 1-.848.847l-3.522-3.523h-.001a1.336 1.336 0 0 0-.95-.393 1.345 1.345 0 0 0-.949 2.295l6.779 6.78c3.715 3.713 9.327 5.598 13.49 1.434 3.527-3.528 4.21-7.13 2.086-11.015zM11.817 7.727c.06-.328.213-.64.466-.893.64-.64 1.755-.64 2.396 0l3.232 3.232c-.82.783-1.09 1.833-.764 2.992l-5.33-5.33z"></path><path d="M13.285.48l-1.916.881 2.37 2.837z"></path><path d="M21.719 1.361L19.79.501l-.44 3.697z"></path><path d="M16.502 3.298L15.481 0h2.043z"></path></g></svg></span></span></button><div class="clapUndo u-width60 u-round u-height32 u-absolute u-borderBox u-paddingRight5 u-transition--transform200Spring u-background--brandSageLighter js-clapUndo" style="top: 14px; padding: 2px;"><button class="button button--chromeless u-baseColor--buttonNormal button--withIcon button--withSvgIcon u-floatRight" data-action="multivote-undo" data-action-value="649352e2ae87"><span class="svgIcon svgIcon--removeThin svgIcon--29px"><svg class="svgIcon-use" width="29" height="29"><path d="M20.13 8.11l-5.61 5.61-5.609-5.61-.801.801 5.61 5.61-5.61 5.61.801.8 5.61-5.609 5.61 5.61.8-.801-5.609-5.61 5.61-5.61" fill-rule="evenodd"></path></svg></span></button></div></div><span class="u-textAlignCenter u-relative u-background js-actionMultirecommendCount u-marginLeft10"><button class="button button--chromeless u-baseColor--buttonNormal js-multirecommendCountButton" data-action="show-recommends" data-action-value="649352e2ae87">258</button></span></div></div><div class="buttonSet u-flex0"><button class="button button--large button--dark button--chromeless is-touchIconBlackPulse u-baseColor--buttonDark button--withIcon button--withSvgIcon" data-action="respond" data-action-source="post_actions_footer"><span class="svgIcon svgIcon--response svgIcon--29px"><svg class="svgIcon-use" width="29" height="29"><path d="M21.27 20.058c1.89-1.826 2.754-4.17 2.754-6.674C24.024 8.21 19.67 4 14.1 4 8.53 4 4 8.21 4 13.384c0 5.175 4.53 9.385 10.1 9.385 1.007 0 2-.14 2.95-.41.285.25.592.49.918.7 1.306.87 2.716 1.31 4.19 1.31.276-.01.494-.14.6-.36a.625.625 0 0 0-.052-.65c-.61-.84-1.042-1.71-1.282-2.58a5.417 5.417 0 0 1-.154-.75zm-3.85 1.324l-.083-.28-.388.12a9.72 9.72 0 0 1-2.85.424c-4.96 0-8.99-3.706-8.99-8.262 0-4.556 4.03-8.263 8.99-8.263 4.95 0 8.77 3.71 8.77 8.27 0 2.25-.75 4.35-2.5 5.92l-.24.21v.32c0 .07 0 .19.02.37.03.29.1.6.19.92.19.7.49 1.4.89 2.08-.93-.14-1.83-.49-2.67-1.06-.34-.22-.88-.48-1.16-.74z"></path></svg></span></button><button class="button button--large button--dark button--chromeless is-touchIconBlackPulse u-baseColor--buttonDark button--withIcon button--withSvgIcon u-xs-hide" title="Share on Twitter" aria-label="Share on Twitter" data-action="share-on-twitter" data-action-source="post_actions_footer"><span class="svgIcon svgIcon--twitter svgIcon--29px"><svg class="svgIcon-use" width="29" height="29"><path d="M21.967 11.8c.018 5.93-4.607 11.18-11.177 11.18-2.172 0-4.25-.62-6.047-1.76l-.268.422-.038.5.186.013.168.012c.3.02.44.032.6.046 2.06-.026 3.95-.686 5.49-1.86l1.12-.85-1.4-.048c-1.57-.055-2.92-1.08-3.36-2.51l-.48.146-.05.5c.22.03.48.05.75.08.48-.02.87-.07 1.25-.15l2.33-.49-2.32-.49c-1.68-.35-2.91-1.83-2.91-3.55 0-.05 0-.01-.01.03l-.49-.1-.25.44c.63.36 1.35.57 2.07.58l1.7.04L7.4 13c-.978-.662-1.59-1.79-1.618-3.047a4.08 4.08 0 0 1 .524-1.8l-.825.07a12.188 12.188 0 0 0 8.81 4.515l.59.033-.06-.59v-.02c-.05-.43-.06-.63-.06-.87a3.617 3.617 0 0 1 6.27-2.45l.2.21.28-.06c1.01-.22 1.94-.59 2.73-1.09l-.75-.56c-.1.36-.04.89.12 1.36.23.68.58 1.13 1.17.85l-.21-.45-.42-.27c-.52.8-1.17 1.48-1.92 2L22 11l.016.28c.013.2.014.35 0 .52v.04zm.998.038c.018-.22.017-.417 0-.66l-.498.034.284.41a8.183 8.183 0 0 0 2.2-2.267l.97-1.48-1.6.755c.17-.08.3-.02.34.03a.914.914 0 0 1-.13-.292c-.1-.297-.13-.64-.1-.766l.36-1.254-1.1.695c-.69.438-1.51.764-2.41.963l.48.15a4.574 4.574 0 0 0-3.38-1.484 4.616 4.616 0 0 0-4.61 4.613c0 .29.02.51.08.984l.01.02.5-.06.03-.5c-3.17-.18-6.1-1.7-8.08-4.15l-.48-.56-.36.64c-.39.69-.62 1.48-.65 2.28.04 1.61.81 3.04 2.06 3.88l.3-.92c-.55-.02-1.11-.17-1.6-.45l-.59-.34-.14.67c-.02.08-.02.16 0 .24-.01 2.12 1.55 4.01 3.69 4.46l.1-.49-.1-.49c-.33.07-.67.12-1.03.14-.18-.02-.43-.05-.64-.07l-.76-.09.23.73c.57 1.84 2.29 3.14 4.28 3.21l-.28-.89a8.252 8.252 0 0 1-4.85 1.66c-.12-.01-.26-.02-.56-.05l-.17-.01-.18-.01L2.53 21l1.694 1.07a12.233 12.233 0 0 0 6.58 1.917c7.156 0 12.2-5.73 12.18-12.18l-.002.04z"></path></svg></span></button><button class="button button--large button--dark button--chromeless is-touchIconBlackPulse u-baseColor--buttonDark button--withIcon button--withSvgIcon u-xs-hide" title="Share on Facebook" aria-label="Share on Facebook" data-action="share-on-facebook" data-action-source="post_actions_footer"><span class="svgIcon svgIcon--facebook svgIcon--29px"><svg class="svgIcon-use" width="29" height="29"><path d="M16.39 23.61v-5.808h1.846a.55.55 0 0 0 .546-.48l.36-2.797a.551.551 0 0 0-.547-.62H16.39V12.67c0-.67.12-.813.828-.813h1.474a.55.55 0 0 0 .55-.55V8.803a.55.55 0 0 0-.477-.545c-.436-.06-1.36-.116-2.22-.116-2.5 0-4.13 1.62-4.13 4.248v1.513H10.56a.551.551 0 0 0-.55.55v2.797c0 .304.248.55.55.55h1.855v5.76c-4.172-.96-7.215-4.7-7.215-9.1 0-5.17 4.17-9.36 9.31-9.36 5.14 0 9.31 4.19 9.31 9.36 0 4.48-3.155 8.27-7.43 9.15M14.51 4C8.76 4 4.1 8.684 4.1 14.46c0 5.162 3.75 9.523 8.778 10.32a.55.55 0 0 0 .637-.543v-6.985a.551.551 0 0 0-.55-.55H11.11v-1.697h1.855a.55.55 0 0 0 .55-.55v-2.063c0-2.02 1.136-3.148 3.03-3.148.567 0 1.156.027 1.597.06v1.453h-.924c-1.363 0-1.93.675-1.93 1.912v1.78c0 .3.247.55.55.55h2.132l-.218 1.69H15.84c-.305 0-.55.24-.55.55v7.02c0 .33.293.59.623.54 5.135-.7 9.007-5.11 9.007-10.36C24.92 8.68 20.26 4 14.51 4"></path></svg></span></button><button class="button button--large button--dark button--chromeless u-baseColor--buttonDark button--withIcon button--withSvgIcon u-xs-show" title="Share this story on Twitter or Facebook" aria-label="Share this story on Twitter or Facebook" data-action="show-share-popover" data-action-source="post_actions_footer"><span class="svgIcon svgIcon--share svgIcon--29px"><svg class="svgIcon-use" width="29" height="29"><path d="M20.385 8H19a.5.5 0 1 0 .011 1h1.39c.43 0 .84.168 1.14.473.31.305.48.71.48 1.142v10.77c0 .43-.17.837-.47 1.142-.3.305-.71.473-1.14.473H8.62c-.43 0-.84-.168-1.144-.473a1.603 1.603 0 0 1-.473-1.142v-10.77c0-.43.17-.837.48-1.142A1.599 1.599 0 0 1 8.62 9H10a.502.502 0 0 0 0-1H8.615c-.67 0-1.338.255-1.85.766-.51.51-.765 1.18-.765 1.85v10.77c0 .668.255 1.337.766 1.848.51.51 1.18.766 1.85.766h11.77c.668 0 1.337-.255 1.848-.766.51-.51.766-1.18.766-1.85v-10.77c0-.668-.255-1.337-.766-1.848A2.61 2.61 0 0 0 20.384 8zm-8.67-2.508L14 3.207v8.362c0 .27.224.5.5.5s.5-.23.5-.5V3.2l2.285 2.285a.49.49 0 0 0 .704-.001.511.511 0 0 0 0-.708l-3.14-3.14a.504.504 0 0 0-.71 0L11 4.776a.501.501 0 0 0 .71.706" fill-rule="evenodd"></path></svg></span></button><button class="button button--large button--dark button--chromeless is-touchIconFadeInPulse u-baseColor--buttonDark button--withIcon button--withSvgIcon button--bookmark js-bookmarkButton" title="Bookmark this story to read later" aria-label="Bookmark this story to read later" data-action="add-to-bookmarks" data-action-value="649352e2ae87" data-action-source="post_actions_footer"><span class="button-defaultState"><span class="svgIcon svgIcon--bookmark svgIcon--29px"><svg class="svgIcon-use" width="29" height="29"><path d="M19.385 4h-9.77A2.623 2.623 0 0 0 7 6.615V23.01a1.022 1.022 0 0 0 1.595.847l5.905-4.004 5.905 4.004A1.022 1.022 0 0 0 22 23.011V6.62A2.625 2.625 0 0 0 19.385 4zM21 23l-5.91-3.955-.148-.107a.751.751 0 0 0-.884 0l-.147.107L8 23V6.615C8 5.725 8.725 5 9.615 5h9.77C20.275 5 21 5.725 21 6.615V23z" fill-rule="evenodd"></path></svg></span></span><span class="button-activeState"><span class="svgIcon svgIcon--bookmarkFilled svgIcon--29px"><svg class="svgIcon-use" width="29" height="29"><path d="M19.385 4h-9.77A2.623 2.623 0 0 0 7 6.615V23.01a1.022 1.022 0 0 0 1.595.847l5.905-4.004 5.905 4.004A1.022 1.022 0 0 0 22 23.011V6.62A2.625 2.625 0 0 0 19.385 4z" fill-rule="evenodd"></path></svg></span></span></button><button class="button button--large button--dark button--chromeless is-touchIconBlackPulse u-baseColor--buttonDark button--withIcon button--withSvgIcon js-moreActionsButton" title="More actions" aria-label="More actions" data-action="more-actions"><span class="svgIcon svgIcon--more svgIcon--25px"><svg class="svgIcon-use" width="25" height="25" viewBox="-480.5 272.5 21 21"><path d="M-463 284.6c.9 0 1.6-.7 1.6-1.6s-.7-1.6-1.6-1.6-1.6.7-1.6 1.6.7 1.6 1.6 1.6zm0 .9c-1.4 0-2.5-1.1-2.5-2.5s1.1-2.5 2.5-2.5 2.5 1.1 2.5 2.5-1.1 2.5-2.5 2.5zm-7-.9c.9 0 1.6-.7 1.6-1.6s-.7-1.6-1.6-1.6-1.6.7-1.6 1.6.7 1.6 1.6 1.6zm0 .9c-1.4 0-2.5-1.1-2.5-2.5s1.1-2.5 2.5-2.5 2.5 1.1 2.5 2.5-1.1 2.5-2.5 2.5zm-7-.9c.9 0 1.6-.7 1.6-1.6s-.7-1.6-1.6-1.6-1.6.7-1.6 1.6.7 1.6 1.6 1.6zm0 .9c-1.4 0-2.5-1.1-2.5-2.5s1.1-2.5 2.5-2.5 2.5 1.1 2.5 2.5-1.1 2.5-2.5 2.5z"></path></svg></span></button></div></div></div></div><div class="u-maxWidth740 u-paddingTop20 u-marginTop20 u-borderTopLightest container u-paddingBottom20 u-xs-paddingBottom10 js-postAttributionFooterContainer"><div class="row js-postFooterInfo"><div class="col u-size6of12 u-xs-size12of12"><li class="uiScale uiScale-ui--small uiScale-caption--regular u-block u-paddingBottom18 js-cardUser"><div class="u-marginLeft20 u-floatRight"><span class="followState js-followState" data-user-id="fe1c14f6cde"><button class="button button--small u-noUserSelect button--withChrome u-baseColor--buttonNormal button--withHover button--unblock js-unblockButton" data-action="toggle-block-user" data-action-value="fe1c14f6cde" data-action-source="footer_card"><span class="button-label  button-defaultState">Blocked</span><span class="button-label button-hoverState">Unblock</span></button><button class="button button--primary button--small u-noUserSelect button--withChrome u-accentColor--buttonNormal button--follow js-followButton" data-action="toggle-subscribe-user" data-action-value="fe1c14f6cde" data-action-source="footer_card-fe1c14f6cde-------------------------follow_footer" data-subscribe-source="footer_card" data-follow-context-entity-id="649352e2ae87"><span class="button-label  button-defaultState js-buttonLabel">Follow</span><span class="button-label button-activeState">Following</span></button></span></div><div class="u-tableCell"><a class="link u-baseColor--link avatar" href="https://hackernoon.com/@flaviocopes?source=footer_card" title="Go to the profile of Flavio Copes" aria-label="Go to the profile of Flavio Copes" data-action-source="footer_card" data-user-id="fe1c14f6cde" data-collection-slug="hacker-daily" dir="auto"><img src="./The definitive guide to Express, the Node.js Web Application Framework_files/1_EhDax362AQ39b-_vSUMO2Q.jpeg" class="avatar-image avatar-image--small" alt="Go to the profile of Flavio Copes"></a></div><div class="u-tableCell u-verticalAlignMiddle u-breakWord u-paddingLeft15"><h3 class="ui-h3 u-fontSize18 u-lineHeightTighter u-marginBottom4"><a class="link link--primary u-accentColor--hoverTextNormal" href="https://hackernoon.com/@flaviocopes" property="cc:attributionName" title="Go to the profile of Flavio Copes" aria-label="Go to the profile of Flavio Copes" rel="author cc:attributionUrl" data-user-id="fe1c14f6cde" data-collection-slug="hacker-daily" dir="auto">Flavio Copes</a></h3><p class="ui-body u-fontSize14 u-lineHeightBaseSans u-textColorDark u-marginBottom4">I write tutorials for developers at <a rel="nofollow" href="https://flaviocopes.com/">https://flaviocopes.com</a></p></div></li></div><div class="col u-size6of12 u-xs-size12of12 u-xs-marginTop30"><li class="uiScale uiScale-ui--small uiScale-caption--regular u-block u-paddingBottom18 js-cardCollection"><div class="u-marginLeft20 u-floatRight"><button class="button button--primary button--small u-noUserSelect button--withChrome u-accentColor--buttonNormal js-relationshipButton" data-action="toggle-follow-collection" data-action-source="----3a8144eabfe3----------------------follow_footer" data-collection-id="3a8144eabfe3"><span class="button-label  js-buttonLabel">Follow</span></button></div><div class="u-tableCell "><a class="link u-baseColor--link avatar avatar--roundedRectangle" href="https://hackernoon.com/?source=footer_card" title="Go to Hacker Noon" aria-label="Go to Hacker Noon" data-action-source="footer_card" data-collection-slug="hacker-daily"><img src="./The definitive guide to Express, the Node.js Web Application Framework_files/1_76XiKOa05Yya6_CdYX8pVg.jpeg" class="avatar-image u-size60x60" alt="Hacker Noon"></a></div><div class="u-tableCell u-verticalAlignMiddle u-breakWord u-paddingLeft15"><h3 class="ui-h3 u-fontSize18 u-lineHeightTighter u-marginBottom4"><a class="link link--primary u-accentColor--hoverTextNormal" href="https://hackernoon.com/?source=footer_card" rel="collection" data-action-source="footer_card" data-collection-slug="hacker-daily">Hacker Noon</a></h3><p class="ui-body u-fontSize14 u-lineHeightBaseSans u-textColorDark u-marginBottom4">how hackers start their afternoons.</p><div class="buttonSet"></div></div></li></div></div></div><div class="js-postFooterPlacements"><div class="streamItem streamItem--placementCardGrid js-streamItem"><div class="u-clearfix u-backgroundGrayLightest"><div class="row u-marginAuto u-maxWidth1000 u-paddingTop30 u-paddingBottom40"><div class="col u-padding8 u-xs-size12of12 u-size4of12"><div class="uiScale uiScale-ui--small uiScale-caption--regular u-height280 u-sizeFullWidth u-backgroundWhite u-borderCardBorder u-boxShadow u-borderBox u-borderRadius4 js-trackedPost" data-post-id="830dd607dad7" data-source="placement_card_footer_grid---------0-41" data-tracking-context="placement" data-scroll="native"><a class="link link--noUnderline u-baseColor--link" href="https://hackernoon.com/college-is-dying-design-your-own-education-830dd607dad7?source=placement_card_footer_grid---------0-41" data-action-source="placement_card_footer_grid---------0-41"><div class="u-backgroundCover u-backgroundColorGrayLight u-height100 u-sizeFullWidth u-borderBottomLight u-borderRadiusTop4" style="background-image: url(&quot;https://cdn-images-1.medium.com/fit/c/400/120/1*bLQ43HLQRp1r6KGs2G7PsA.jpeg&quot;); background-position: 50% 50% !important;"></div></a><div class="u-padding15 u-borderBox u-flexColumn u-height180"><a class="link link--noUnderline u-baseColor--link u-flex1" href="https://hackernoon.com/college-is-dying-design-your-own-education-830dd607dad7?source=placement_card_footer_grid---------0-41" data-action-source="placement_card_footer_grid---------0-41"><div class="uiScale uiScale-ui--regular uiScale-caption--small u-textColorNormal u-marginBottom7">More from Hacker Noon</div><div class="ui-h3 ui-clamp2 u-textColorDarkest u-contentSansBold u-fontSize24 u-maxHeight2LineHeightTighter u-lineClamp2 u-textOverflowEllipsis u-letterSpacingTight u-paddingBottom2">College is Dying, Design Your Own Education.</div></a><div class="u-paddingBottom10 u-flex0 u-flexCenter"><div class="u-flex1 u-minWidth0 u-marginRight10"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://hackernoon.com/@Johnny_Uzan" data-action="show-user-card" data-action-value="336fe295463d" data-action-type="hover" data-user-id="336fe295463d" data-collection-slug="hacker-daily" dir="auto"><div class="u-relative u-inlineBlock u-flex0"><img src="./The definitive guide to Express, the Node.js Web Application Framework_files/1_Rt1fBpYn7WhLi6-BYXcfxw.jpeg" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Johnny"><div class="avatar-halo u-absolute u-textColorGreenNormal svgIcon" style="width: calc(100% + 10px); height: calc(100% + 10px); top:-5px; left:-5px"><svg viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg"><path d="M3.44615311,11.6601601 C6.57294867,5.47967718 12.9131553,1.5 19.9642857,1.5 C27.0154162,1.5 33.3556228,5.47967718 36.4824183,11.6601601 L37.3747245,11.2087295 C34.0793076,4.69494641 27.3961457,0.5 19.9642857,0.5 C12.5324257,0.5 5.84926381,4.69494641 2.55384689,11.2087295 L3.44615311,11.6601601 Z"></path><path d="M36.4824183,28.2564276 C33.3556228,34.4369105 27.0154162,38.4165876 19.9642857,38.4165876 C12.9131553,38.4165876 6.57294867,34.4369105 3.44615311,28.2564276 L2.55384689,28.7078582 C5.84926381,35.2216412 12.5324257,39.4165876 19.9642857,39.4165876 C27.3961457,39.4165876 34.0793076,35.2216412 37.3747245,28.7078582 L36.4824183,28.2564276 Z"></path></svg></div></div></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--darker" href="https://hackernoon.com/@Johnny_Uzan?source=placement_card_footer_grid---------0-41" data-action="show-user-card" data-action-source="placement_card_footer_grid---------0-41" data-action-value="336fe295463d" data-action-type="hover" data-user-id="336fe295463d" data-collection-slug="hacker-daily" dir="auto">Johnny</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><span class="readingTime u-textColorNormal" title="12 min read"></span></div></div></div></div><div class="u-flex0 u-flexCenter"><div class="buttonSet"><div class="multirecommend js-actionMultirecommend u-flexCenter" data-post-id="830dd607dad7" data-is-label-padded="true" data-source="placement_card_footer_grid-----830dd607dad7----0-41----------------clap_preview"><div class="u-relative u-foreground"><button class="button button--primary button--chromeless u-accentColor--buttonNormal button--withIcon button--withSvgIcon clapButton js-actionMultirecommendButton" data-action="multivote" data-action-value="830dd607dad7" data-action-type="long-press" data-action-source="placement_card_footer_grid-----830dd607dad7----0-41----------------clap_preview" aria-label="Clap"><span class="button-defaultState"><span class="svgIcon svgIcon--clap svgIcon--25px"><svg class="svgIcon-use" width="25" height="25"><g fill-rule="evenodd"><path d="M11.739 0l.761 2.966L13.261 0z"></path><path d="M14.815 3.776l1.84-2.551-1.43-.471z"></path><path d="M8.378 1.224l1.84 2.551L9.81.753z"></path><path d="M20.382 21.622c-1.04 1.04-2.115 1.507-3.166 1.608.168-.14.332-.29.492-.45 2.885-2.886 3.456-5.982 1.69-9.211l-1.101-1.937-.955-2.02c-.315-.676-.235-1.185.245-1.556a.836.836 0 0 1 .66-.16c.342.056.66.28.879.605l2.856 5.023c1.179 1.962 1.379 5.119-1.6 8.098m-13.29-.528l-5.02-5.02a1 1 0 0 1 .707-1.701c.255 0 .512.098.707.292l2.607 2.607a.442.442 0 0 0 .624-.624L4.11 14.04l-1.75-1.75a.998.998 0 1 1 1.41-1.413l4.154 4.156a.44.44 0 0 0 .624 0 .44.44 0 0 0 0-.624l-4.152-4.153-1.172-1.171a.998.998 0 0 1 0-1.41 1.018 1.018 0 0 1 1.41 0l1.172 1.17 4.153 4.152a.437.437 0 0 0 .624 0 .442.442 0 0 0 0-.624L6.43 8.222a.988.988 0 0 1-.291-.705.99.99 0 0 1 .29-.706 1 1 0 0 1 1.412 0l6.992 6.993a.443.443 0 0 0 .71-.501l-1.35-2.856c-.315-.676-.235-1.185.246-1.557a.85.85 0 0 1 .66-.16c.342.056.659.28.879.606L18.628 14c1.573 2.876 1.067 5.545-1.544 8.156-1.396 1.397-3.144 1.966-5.063 1.652-1.713-.286-3.463-1.248-4.928-2.714zM10.99 5.976l2.562 2.562c-.497.607-.563 1.414-.155 2.284l.265.562-4.257-4.257a.98.98 0 0 1-.117-.445c0-.267.104-.517.292-.706a1.023 1.023 0 0 1 1.41 0zm8.887 2.06c-.375-.557-.902-.916-1.486-1.011a1.738 1.738 0 0 0-1.342.332c-.376.29-.61.656-.712 1.065a2.1 2.1 0 0 0-1.095-.562 1.776 1.776 0 0 0-.992.128l-2.636-2.636a1.883 1.883 0 0 0-2.658 0 1.862 1.862 0 0 0-.478.847 1.886 1.886 0 0 0-2.671-.012 1.867 1.867 0 0 0-.503.909c-.754-.754-1.992-.754-2.703-.044a1.881 1.881 0 0 0 0 2.658c-.288.12-.605.288-.864.547a1.884 1.884 0 0 0 0 2.659l.624.622a1.879 1.879 0 0 0-.91 3.16l5.019 5.02c1.595 1.594 3.515 2.645 5.408 2.959a7.16 7.16 0 0 0 1.173.098c1.026 0 1.997-.24 2.892-.7.279.04.555.065.828.065 1.53 0 2.969-.628 4.236-1.894 3.338-3.338 3.083-6.928 1.738-9.166l-2.868-5.043z"></path></g></svg></span></span><span class="button-activeState"><span class="svgIcon svgIcon--clapFilled svgIcon--25px"><svg class="svgIcon-use" width="25" height="25"><g fill-rule="evenodd"><path d="M11.738 0l.762 2.966L13.262 0z"></path><path d="M16.634 1.224l-1.432-.47-.408 3.022z"></path><path d="M9.79.754l-1.431.47 1.84 2.552z"></path><path d="M22.472 13.307l-3.023-5.32c-.287-.426-.689-.705-1.123-.776a1.16 1.16 0 0 0-.911.221c-.297.231-.474.515-.535.84.017.022.036.04.053.063l2.843 5.001c1.95 3.564 1.328 6.973-1.843 10.144a8.46 8.46 0 0 1-.549.501c1.205-.156 2.328-.737 3.351-1.76 3.268-3.268 3.041-6.749 1.737-8.914"></path><path d="M12.58 9.887c-.156-.83.096-1.569.692-2.142L10.78 5.252c-.5-.504-1.378-.504-1.879 0-.178.18-.273.4-.329.63l4.008 4.005z"></path><path d="M15.812 9.04c-.218-.323-.539-.55-.88-.606a.814.814 0 0 0-.644.153c-.176.137-.713.553-.24 1.566l1.43 3.025a.539.539 0 1 1-.868.612L7.2 6.378a.986.986 0 1 0-1.395 1.395l4.401 4.403a.538.538 0 1 1-.762.762L5.046 8.54 3.802 7.295a.99.99 0 0 0-1.396 0 .981.981 0 0 0 0 1.394L3.647 9.93l4.402 4.403a.537.537 0 0 1 0 .761.535.535 0 0 1-.762 0L2.89 10.696a.992.992 0 0 0-1.399-.003.983.983 0 0 0 0 1.395l1.855 1.854 2.763 2.765a.538.538 0 0 1-.76.761l-2.765-2.764a.982.982 0 0 0-1.395 0 .989.989 0 0 0 0 1.395l5.32 5.32c3.371 3.372 6.64 4.977 10.49 1.126C19.74 19.8 20.271 17 18.62 13.982L15.812 9.04z"></path></g></svg></span></span></button></div><span class="u-textAlignCenter u-relative u-background js-actionMultirecommendCount u-marginLeft5"><button class="button button--chromeless u-baseColor--buttonNormal js-multirecommendCountButton u-disablePointerEvents u-marginLeft4" data-action="show-recommends" data-action-value="830dd607dad7">4K</button></span></div></div><div class="u-height20 u-borderRightLighter u-inlineBlock u-relative u-marginRight10 u-marginLeft12"></div><div class="buttonSet"><button class="button button--chromeless is-touchIconFadeInPulse u-baseColor--buttonNormal button--withIcon button--withSvgIcon button--bookmark js-bookmarkButton" title="Bookmark this story to read later" aria-label="Bookmark this story to read later" data-action="add-to-bookmarks" data-action-value="830dd607dad7" data-action-source="placement_card_footer_grid-----830dd607dad7----0-41----------------bookmark_preview"><span class="button-defaultState"><span class="svgIcon svgIcon--bookmark svgIcon--25px"><svg class="svgIcon-use" width="25" height="25"><path d="M19 6c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v14.66h.012c.01.103.045.204.12.285a.5.5 0 0 0 .706.03L12.5 16.85l5.662 4.126a.508.508 0 0 0 .708-.03.5.5 0 0 0 .118-.285H19V6zm-6.838 9.97L7 19.636V6c0-.55.45-1 1-1h9c.55 0 1 .45 1 1v13.637l-5.162-3.668a.49.49 0 0 0-.676 0z" fill-rule="evenodd"></path></svg></span></span><span class="button-activeState"><span class="svgIcon svgIcon--bookmarkFilled svgIcon--25px"><svg class="svgIcon-use" width="25" height="25"><path d="M19 6c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v14.66h.012c.01.103.045.204.12.285a.5.5 0 0 0 .706.03L12.5 16.85l5.662 4.126c.205.183.52.17.708-.03a.5.5 0 0 0 .118-.285H19V6z"></path></svg></span></span></button></div></div></div></div></div></div><div class="col u-padding8 u-xs-size12of12 u-size4of12"><div class="uiScale uiScale-ui--small uiScale-caption--regular u-height280 u-sizeFullWidth u-backgroundWhite u-borderCardBorder u-boxShadow u-borderBox u-borderRadius4 js-trackedPost" data-post-id="636ef725cb1c" data-source="placement_card_footer_grid---------1-41" data-tracking-context="placement" data-scroll="native"><a class="link link--noUnderline u-baseColor--link" href="https://hackernoon.com/five-changes-that-are-coming-to-the-software-development-industry-with-the-future-of-work-636ef725cb1c?source=placement_card_footer_grid---------1-41" data-action-source="placement_card_footer_grid---------1-41"><div class="u-backgroundCover u-backgroundColorGrayLight u-height100 u-sizeFullWidth u-borderBottomLight u-borderRadiusTop4" style="background-image: url(&quot;https://cdn-images-1.medium.com/fit/c/400/120/0*3-8Oc5yQ_iuAawfw&quot;); background-position: 50% 50% !important;"></div></a><div class="u-padding15 u-borderBox u-flexColumn u-height180"><a class="link link--noUnderline u-baseColor--link u-flex1" href="https://hackernoon.com/five-changes-that-are-coming-to-the-software-development-industry-with-the-future-of-work-636ef725cb1c?source=placement_card_footer_grid---------1-41" data-action-source="placement_card_footer_grid---------1-41"><div class="uiScale uiScale-ui--regular uiScale-caption--small u-textColorNormal u-marginBottom7">More from Hacker Noon</div><div class="ui-h3 ui-clamp2 u-textColorDarkest u-contentSansBold u-fontSize24 u-maxHeight2LineHeightTighter u-lineClamp2 u-textOverflowEllipsis u-letterSpacingTight u-paddingBottom2">Five Emerging Trends for the Future of the Software Development</div></a><div class="u-paddingBottom10 u-flex0 u-flexCenter"><div class="u-flex1 u-minWidth0 u-marginRight10"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://hackernoon.com/@eisabai" data-action="show-user-card" data-action-value="ab8ce31a624d" data-action-type="hover" data-user-id="ab8ce31a624d" data-collection-slug="hacker-daily" dir="auto"><div class="u-relative u-inlineBlock u-flex0"><img src="./The definitive guide to Express, the Node.js Web Application Framework_files/1_BGXgVWhH-nqrX6VruxEvmA.jpeg" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Isabel Nyo"><div class="avatar-halo u-absolute u-textColorGreenNormal svgIcon" style="width: calc(100% + 10px); height: calc(100% + 10px); top:-5px; left:-5px"><svg viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg"><path d="M3.44615311,11.6601601 C6.57294867,5.47967718 12.9131553,1.5 19.9642857,1.5 C27.0154162,1.5 33.3556228,5.47967718 36.4824183,11.6601601 L37.3747245,11.2087295 C34.0793076,4.69494641 27.3961457,0.5 19.9642857,0.5 C12.5324257,0.5 5.84926381,4.69494641 2.55384689,11.2087295 L3.44615311,11.6601601 Z"></path><path d="M36.4824183,28.2564276 C33.3556228,34.4369105 27.0154162,38.4165876 19.9642857,38.4165876 C12.9131553,38.4165876 6.57294867,34.4369105 3.44615311,28.2564276 L2.55384689,28.7078582 C5.84926381,35.2216412 12.5324257,39.4165876 19.9642857,39.4165876 C27.3961457,39.4165876 34.0793076,35.2216412 37.3747245,28.7078582 L36.4824183,28.2564276 Z"></path></svg></div></div></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--darker" href="https://hackernoon.com/@eisabai?source=placement_card_footer_grid---------1-41" data-action="show-user-card" data-action-source="placement_card_footer_grid---------1-41" data-action-value="ab8ce31a624d" data-action-type="hover" data-user-id="ab8ce31a624d" data-collection-slug="hacker-daily" dir="auto">Isabel Nyo</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><span class="readingTime u-textColorNormal" title="6 min read"></span></div></div></div></div><div class="u-flex0 u-flexCenter"><div class="buttonSet"><div class="multirecommend js-actionMultirecommend u-flexCenter" data-post-id="636ef725cb1c" data-is-label-padded="true" data-source="placement_card_footer_grid-----636ef725cb1c----1-41----------------clap_preview"><div class="u-relative u-foreground"><button class="button button--primary button--chromeless u-accentColor--buttonNormal button--withIcon button--withSvgIcon clapButton js-actionMultirecommendButton" data-action="multivote" data-action-value="636ef725cb1c" data-action-type="long-press" data-action-source="placement_card_footer_grid-----636ef725cb1c----1-41----------------clap_preview" aria-label="Clap"><span class="button-defaultState"><span class="svgIcon svgIcon--clap svgIcon--25px"><svg class="svgIcon-use" width="25" height="25"><g fill-rule="evenodd"><path d="M11.739 0l.761 2.966L13.261 0z"></path><path d="M14.815 3.776l1.84-2.551-1.43-.471z"></path><path d="M8.378 1.224l1.84 2.551L9.81.753z"></path><path d="M20.382 21.622c-1.04 1.04-2.115 1.507-3.166 1.608.168-.14.332-.29.492-.45 2.885-2.886 3.456-5.982 1.69-9.211l-1.101-1.937-.955-2.02c-.315-.676-.235-1.185.245-1.556a.836.836 0 0 1 .66-.16c.342.056.66.28.879.605l2.856 5.023c1.179 1.962 1.379 5.119-1.6 8.098m-13.29-.528l-5.02-5.02a1 1 0 0 1 .707-1.701c.255 0 .512.098.707.292l2.607 2.607a.442.442 0 0 0 .624-.624L4.11 14.04l-1.75-1.75a.998.998 0 1 1 1.41-1.413l4.154 4.156a.44.44 0 0 0 .624 0 .44.44 0 0 0 0-.624l-4.152-4.153-1.172-1.171a.998.998 0 0 1 0-1.41 1.018 1.018 0 0 1 1.41 0l1.172 1.17 4.153 4.152a.437.437 0 0 0 .624 0 .442.442 0 0 0 0-.624L6.43 8.222a.988.988 0 0 1-.291-.705.99.99 0 0 1 .29-.706 1 1 0 0 1 1.412 0l6.992 6.993a.443.443 0 0 0 .71-.501l-1.35-2.856c-.315-.676-.235-1.185.246-1.557a.85.85 0 0 1 .66-.16c.342.056.659.28.879.606L18.628 14c1.573 2.876 1.067 5.545-1.544 8.156-1.396 1.397-3.144 1.966-5.063 1.652-1.713-.286-3.463-1.248-4.928-2.714zM10.99 5.976l2.562 2.562c-.497.607-.563 1.414-.155 2.284l.265.562-4.257-4.257a.98.98 0 0 1-.117-.445c0-.267.104-.517.292-.706a1.023 1.023 0 0 1 1.41 0zm8.887 2.06c-.375-.557-.902-.916-1.486-1.011a1.738 1.738 0 0 0-1.342.332c-.376.29-.61.656-.712 1.065a2.1 2.1 0 0 0-1.095-.562 1.776 1.776 0 0 0-.992.128l-2.636-2.636a1.883 1.883 0 0 0-2.658 0 1.862 1.862 0 0 0-.478.847 1.886 1.886 0 0 0-2.671-.012 1.867 1.867 0 0 0-.503.909c-.754-.754-1.992-.754-2.703-.044a1.881 1.881 0 0 0 0 2.658c-.288.12-.605.288-.864.547a1.884 1.884 0 0 0 0 2.659l.624.622a1.879 1.879 0 0 0-.91 3.16l5.019 5.02c1.595 1.594 3.515 2.645 5.408 2.959a7.16 7.16 0 0 0 1.173.098c1.026 0 1.997-.24 2.892-.7.279.04.555.065.828.065 1.53 0 2.969-.628 4.236-1.894 3.338-3.338 3.083-6.928 1.738-9.166l-2.868-5.043z"></path></g></svg></span></span><span class="button-activeState"><span class="svgIcon svgIcon--clapFilled svgIcon--25px"><svg class="svgIcon-use" width="25" height="25"><g fill-rule="evenodd"><path d="M11.738 0l.762 2.966L13.262 0z"></path><path d="M16.634 1.224l-1.432-.47-.408 3.022z"></path><path d="M9.79.754l-1.431.47 1.84 2.552z"></path><path d="M22.472 13.307l-3.023-5.32c-.287-.426-.689-.705-1.123-.776a1.16 1.16 0 0 0-.911.221c-.297.231-.474.515-.535.84.017.022.036.04.053.063l2.843 5.001c1.95 3.564 1.328 6.973-1.843 10.144a8.46 8.46 0 0 1-.549.501c1.205-.156 2.328-.737 3.351-1.76 3.268-3.268 3.041-6.749 1.737-8.914"></path><path d="M12.58 9.887c-.156-.83.096-1.569.692-2.142L10.78 5.252c-.5-.504-1.378-.504-1.879 0-.178.18-.273.4-.329.63l4.008 4.005z"></path><path d="M15.812 9.04c-.218-.323-.539-.55-.88-.606a.814.814 0 0 0-.644.153c-.176.137-.713.553-.24 1.566l1.43 3.025a.539.539 0 1 1-.868.612L7.2 6.378a.986.986 0 1 0-1.395 1.395l4.401 4.403a.538.538 0 1 1-.762.762L5.046 8.54 3.802 7.295a.99.99 0 0 0-1.396 0 .981.981 0 0 0 0 1.394L3.647 9.93l4.402 4.403a.537.537 0 0 1 0 .761.535.535 0 0 1-.762 0L2.89 10.696a.992.992 0 0 0-1.399-.003.983.983 0 0 0 0 1.395l1.855 1.854 2.763 2.765a.538.538 0 0 1-.76.761l-2.765-2.764a.982.982 0 0 0-1.395 0 .989.989 0 0 0 0 1.395l5.32 5.32c3.371 3.372 6.64 4.977 10.49 1.126C19.74 19.8 20.271 17 18.62 13.982L15.812 9.04z"></path></g></svg></span></span></button></div><span class="u-textAlignCenter u-relative u-background js-actionMultirecommendCount u-marginLeft5"><button class="button button--chromeless u-baseColor--buttonNormal js-multirecommendCountButton u-disablePointerEvents u-marginLeft4" data-action="show-recommends" data-action-value="636ef725cb1c">978</button></span></div></div><div class="u-height20 u-borderRightLighter u-inlineBlock u-relative u-marginRight10 u-marginLeft12"></div><div class="buttonSet"><button class="button button--chromeless is-touchIconFadeInPulse u-baseColor--buttonNormal button--withIcon button--withSvgIcon button--bookmark js-bookmarkButton" title="Bookmark this story to read later" aria-label="Bookmark this story to read later" data-action="add-to-bookmarks" data-action-value="636ef725cb1c" data-action-source="placement_card_footer_grid-----636ef725cb1c----1-41----------------bookmark_preview"><span class="button-defaultState"><span class="svgIcon svgIcon--bookmark svgIcon--25px"><svg class="svgIcon-use" width="25" height="25"><path d="M19 6c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v14.66h.012c.01.103.045.204.12.285a.5.5 0 0 0 .706.03L12.5 16.85l5.662 4.126a.508.508 0 0 0 .708-.03.5.5 0 0 0 .118-.285H19V6zm-6.838 9.97L7 19.636V6c0-.55.45-1 1-1h9c.55 0 1 .45 1 1v13.637l-5.162-3.668a.49.49 0 0 0-.676 0z" fill-rule="evenodd"></path></svg></span></span><span class="button-activeState"><span class="svgIcon svgIcon--bookmarkFilled svgIcon--25px"><svg class="svgIcon-use" width="25" height="25"><path d="M19 6c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v14.66h.012c.01.103.045.204.12.285a.5.5 0 0 0 .706.03L12.5 16.85l5.662 4.126c.205.183.52.17.708-.03a.5.5 0 0 0 .118-.285H19V6z"></path></svg></span></span></button></div></div></div></div></div></div><div class="col u-padding8 u-xs-size12of12 u-size4of12"><div class="uiScale uiScale-ui--small uiScale-caption--regular u-height280 u-sizeFullWidth u-backgroundWhite u-borderCardBorder u-boxShadow u-borderBox u-borderRadius4 js-trackedPost" data-post-id="f012a989113" data-source="placement_card_footer_grid---------2-41" data-tracking-context="placement" data-scroll="native"><a class="link link--noUnderline u-baseColor--link" href="https://hackernoon.com/lessons-learned-code-splitting-with-webpack-and-react-f012a989113?source=placement_card_footer_grid---------2-41" data-action-source="placement_card_footer_grid---------2-41"><div class="u-backgroundCover u-backgroundColorGrayLight u-height100 u-sizeFullWidth u-borderBottomLight u-borderRadiusTop4" style="background-image: url(&quot;https://cdn-images-1.medium.com/fit/c/400/120/1*LN1L-vuR_vEcJosbO7vtCQ.jpeg&quot;); background-position: 50% 50% !important;"></div></a><div class="u-padding15 u-borderBox u-flexColumn u-height180"><a class="link link--noUnderline u-baseColor--link u-flex1" href="https://hackernoon.com/lessons-learned-code-splitting-with-webpack-and-react-f012a989113?source=placement_card_footer_grid---------2-41" data-action-source="placement_card_footer_grid---------2-41"><div class="uiScale uiScale-ui--regular uiScale-caption--small u-textColorNormal u-marginBottom7">More from Hacker Noon</div><div class="ui-h3 ui-clamp2 u-textColorDarkest u-contentSansBold u-fontSize24 u-maxHeight2LineHeightTighter u-lineClamp2 u-textOverflowEllipsis u-letterSpacingTight u-paddingBottom2">Lessons Learned: Code Splitting with Webpack and React</div></a><div class="u-paddingBottom10 u-flex0 u-flexCenter"><div class="u-flex1 u-minWidth0 u-marginRight10"><div class="u-flexCenter"><div class="postMetaInline-avatar u-flex0"><a class="link u-baseColor--link avatar" href="https://hackernoon.com/@KondovAlexander" data-action="show-user-card" data-action-value="3b61246a927e" data-action-type="hover" data-user-id="3b61246a927e" data-collection-slug="hacker-daily" dir="auto"><img src="./The definitive guide to Express, the Node.js Web Application Framework_files/1_hc8J6d-QWJb_SgylKqw-sA.jpeg" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Alexander Kondov"></a></div><div class="postMetaInline postMetaInline-authorLockup ui-captionStrong u-flex1 u-noWrapWithEllipsis"><a class="ds-link ds-link--styleSubtle link link--darken link--darker" href="https://hackernoon.com/@KondovAlexander?source=placement_card_footer_grid---------2-41" data-action="show-user-card" data-action-source="placement_card_footer_grid---------2-41" data-action-value="3b61246a927e" data-action-type="hover" data-user-id="3b61246a927e" data-collection-slug="hacker-daily" dir="auto">Alexander Kondov</a><div class="ui-caption u-fontSize12 u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><span class="readingTime u-textColorNormal" title="11 min read"></span></div></div></div></div><div class="u-flex0 u-flexCenter"><div class="buttonSet"><div class="multirecommend js-actionMultirecommend u-flexCenter" data-post-id="f012a989113" data-is-label-padded="true" data-source="placement_card_footer_grid-----f012a989113----2-41----------------clap_preview"><div class="u-relative u-foreground"><button class="button button--primary button--chromeless u-accentColor--buttonNormal button--withIcon button--withSvgIcon clapButton js-actionMultirecommendButton" data-action="multivote" data-action-value="f012a989113" data-action-type="long-press" data-action-source="placement_card_footer_grid-----f012a989113----2-41----------------clap_preview" aria-label="Clap"><span class="button-defaultState"><span class="svgIcon svgIcon--clap svgIcon--25px"><svg class="svgIcon-use" width="25" height="25"><g fill-rule="evenodd"><path d="M11.739 0l.761 2.966L13.261 0z"></path><path d="M14.815 3.776l1.84-2.551-1.43-.471z"></path><path d="M8.378 1.224l1.84 2.551L9.81.753z"></path><path d="M20.382 21.622c-1.04 1.04-2.115 1.507-3.166 1.608.168-.14.332-.29.492-.45 2.885-2.886 3.456-5.982 1.69-9.211l-1.101-1.937-.955-2.02c-.315-.676-.235-1.185.245-1.556a.836.836 0 0 1 .66-.16c.342.056.66.28.879.605l2.856 5.023c1.179 1.962 1.379 5.119-1.6 8.098m-13.29-.528l-5.02-5.02a1 1 0 0 1 .707-1.701c.255 0 .512.098.707.292l2.607 2.607a.442.442 0 0 0 .624-.624L4.11 14.04l-1.75-1.75a.998.998 0 1 1 1.41-1.413l4.154 4.156a.44.44 0 0 0 .624 0 .44.44 0 0 0 0-.624l-4.152-4.153-1.172-1.171a.998.998 0 0 1 0-1.41 1.018 1.018 0 0 1 1.41 0l1.172 1.17 4.153 4.152a.437.437 0 0 0 .624 0 .442.442 0 0 0 0-.624L6.43 8.222a.988.988 0 0 1-.291-.705.99.99 0 0 1 .29-.706 1 1 0 0 1 1.412 0l6.992 6.993a.443.443 0 0 0 .71-.501l-1.35-2.856c-.315-.676-.235-1.185.246-1.557a.85.85 0 0 1 .66-.16c.342.056.659.28.879.606L18.628 14c1.573 2.876 1.067 5.545-1.544 8.156-1.396 1.397-3.144 1.966-5.063 1.652-1.713-.286-3.463-1.248-4.928-2.714zM10.99 5.976l2.562 2.562c-.497.607-.563 1.414-.155 2.284l.265.562-4.257-4.257a.98.98 0 0 1-.117-.445c0-.267.104-.517.292-.706a1.023 1.023 0 0 1 1.41 0zm8.887 2.06c-.375-.557-.902-.916-1.486-1.011a1.738 1.738 0 0 0-1.342.332c-.376.29-.61.656-.712 1.065a2.1 2.1 0 0 0-1.095-.562 1.776 1.776 0 0 0-.992.128l-2.636-2.636a1.883 1.883 0 0 0-2.658 0 1.862 1.862 0 0 0-.478.847 1.886 1.886 0 0 0-2.671-.012 1.867 1.867 0 0 0-.503.909c-.754-.754-1.992-.754-2.703-.044a1.881 1.881 0 0 0 0 2.658c-.288.12-.605.288-.864.547a1.884 1.884 0 0 0 0 2.659l.624.622a1.879 1.879 0 0 0-.91 3.16l5.019 5.02c1.595 1.594 3.515 2.645 5.408 2.959a7.16 7.16 0 0 0 1.173.098c1.026 0 1.997-.24 2.892-.7.279.04.555.065.828.065 1.53 0 2.969-.628 4.236-1.894 3.338-3.338 3.083-6.928 1.738-9.166l-2.868-5.043z"></path></g></svg></span></span><span class="button-activeState"><span class="svgIcon svgIcon--clapFilled svgIcon--25px"><svg class="svgIcon-use" width="25" height="25"><g fill-rule="evenodd"><path d="M11.738 0l.762 2.966L13.262 0z"></path><path d="M16.634 1.224l-1.432-.47-.408 3.022z"></path><path d="M9.79.754l-1.431.47 1.84 2.552z"></path><path d="M22.472 13.307l-3.023-5.32c-.287-.426-.689-.705-1.123-.776a1.16 1.16 0 0 0-.911.221c-.297.231-.474.515-.535.84.017.022.036.04.053.063l2.843 5.001c1.95 3.564 1.328 6.973-1.843 10.144a8.46 8.46 0 0 1-.549.501c1.205-.156 2.328-.737 3.351-1.76 3.268-3.268 3.041-6.749 1.737-8.914"></path><path d="M12.58 9.887c-.156-.83.096-1.569.692-2.142L10.78 5.252c-.5-.504-1.378-.504-1.879 0-.178.18-.273.4-.329.63l4.008 4.005z"></path><path d="M15.812 9.04c-.218-.323-.539-.55-.88-.606a.814.814 0 0 0-.644.153c-.176.137-.713.553-.24 1.566l1.43 3.025a.539.539 0 1 1-.868.612L7.2 6.378a.986.986 0 1 0-1.395 1.395l4.401 4.403a.538.538 0 1 1-.762.762L5.046 8.54 3.802 7.295a.99.99 0 0 0-1.396 0 .981.981 0 0 0 0 1.394L3.647 9.93l4.402 4.403a.537.537 0 0 1 0 .761.535.535 0 0 1-.762 0L2.89 10.696a.992.992 0 0 0-1.399-.003.983.983 0 0 0 0 1.395l1.855 1.854 2.763 2.765a.538.538 0 0 1-.76.761l-2.765-2.764a.982.982 0 0 0-1.395 0 .989.989 0 0 0 0 1.395l5.32 5.32c3.371 3.372 6.64 4.977 10.49 1.126C19.74 19.8 20.271 17 18.62 13.982L15.812 9.04z"></path></g></svg></span></span></button></div><span class="u-textAlignCenter u-relative u-background js-actionMultirecommendCount u-marginLeft5"><button class="button button--chromeless u-baseColor--buttonNormal js-multirecommendCountButton u-disablePointerEvents u-marginLeft4" data-action="show-recommends" data-action-value="f012a989113">1.6K</button></span></div></div><div class="u-height20 u-borderRightLighter u-inlineBlock u-relative u-marginRight10 u-marginLeft12"></div><div class="buttonSet"><button class="button button--chromeless is-touchIconFadeInPulse u-baseColor--buttonNormal button--withIcon button--withSvgIcon button--bookmark js-bookmarkButton" title="Bookmark this story to read later" aria-label="Bookmark this story to read later" data-action="add-to-bookmarks" data-action-value="f012a989113" data-action-source="placement_card_footer_grid-----f012a989113----2-41----------------bookmark_preview"><span class="button-defaultState"><span class="svgIcon svgIcon--bookmark svgIcon--25px"><svg class="svgIcon-use" width="25" height="25"><path d="M19 6c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v14.66h.012c.01.103.045.204.12.285a.5.5 0 0 0 .706.03L12.5 16.85l5.662 4.126a.508.508 0 0 0 .708-.03.5.5 0 0 0 .118-.285H19V6zm-6.838 9.97L7 19.636V6c0-.55.45-1 1-1h9c.55 0 1 .45 1 1v13.637l-5.162-3.668a.49.49 0 0 0-.676 0z" fill-rule="evenodd"></path></svg></span></span><span class="button-activeState"><span class="svgIcon svgIcon--bookmarkFilled svgIcon--25px"><svg class="svgIcon-use" width="25" height="25"><path d="M19 6c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v14.66h.012c.01.103.045.204.12.285a.5.5 0 0 0 .706.03L12.5 16.85l5.662 4.126c.205.183.52.17.708-.03a.5.5 0 0 0 .118-.285H19V6z"></path></svg></span></span></button></div></div></div></div></div></div></div></div></div></div><div class="u-padding0 u-clearfix u-backgroundGrayLightest u-print-hide supplementalPostContent js-responsesWrapper" data-action-scope="_actionscope_5"><div class="container u-maxWidth740"><div class="responsesStreamWrapper u-maxWidth640 js-responsesStreamWrapper"><div class="container responsesStream-title u-paddingTop15"><div class="row"><header class="heading"><div class="u-clearfix"><div class="heading-content u-floatLeft"><span class="heading-title heading-title--semibold">Responses</span></div></div></header></div></div><div class="responsesStream-editor cardChromeless u-marginBottom20 u-paddingLeft20 u-paddingRight20 js-responsesStreamEditor"><div class="inlineNewPostControl js-inlineNewPostControl" data-action-scope="_actionscope_6"><div class="inlineEditor is-collapsed is-postEditMode js-inlineEditor" data-action="focus-editor"><div class="u-paddingTop20 js-block js-inlineEditorContent"><div class="inlineEditor-header"><div class="inlineEditor-avatar u-paddingRight20"><div class="avatar u-inline"><img src="./The definitive guide to Express, the Node.js Web Application Framework_files/0_1avnlthxeQwsrBav(1)" class="avatar-image u-size36x36 u-xs-size32x32" alt="Cobus Olivier"></div></div><div class="inlineEditor-headerContent"><div class="inlineEditor-placeholder js-inlineEditorPrompt">Be the first to write a response…</div><div class="inlineEditor-author u-accentColor--textNormal">Cobus Olivier</div></div></div></div></div></div></div><div class="responsesStream js-responsesStream"></div><div class="container u-hide js-showOtherResponses"><div class="row"><button class="button button--primary button--withChrome u-accentColor--buttonNormal responsesStream-showOtherResponses cardChromeless u-sizeFullWidth u-marginVertical20 u-heightAuto" data-action="show-other-responses">Show all responses</button></div></div><div class="responsesStream js-responsesStreamOther"></div></div></div></div><div class="supplementalPostContent js-heroPromo"></div></footer></article></main><aside class="u-marginAuto u-maxWidth1000 js-postLeftSidebar"><div class="u-foreground u-top0 u-fixed u-sm-hide u-marginLeftNegative12 js-postShareWidget u-transition--fadeIn300" data-scroll="fixed" style="transform: translateY(150px);"><ul><li class="u-textAlignCenter u-marginVertical10"><div class="multirecommend js-actionMultirecommend u-flexColumn u-marginBottom10 u-width60" data-post-id="649352e2ae87" data-is-icon-29px="true" data-is-vertical="true" data-is-circle="true" data-has-recommend-list="true" data-source="post_share_widget-----649352e2ae87---------------------clap_sidebar"><div class="u-relative u-foreground"><button class="button button--large button--circle button--withChrome u-baseColor--buttonNormal button--withIcon button--withSvgIcon clapButton js-actionMultirecommendButton clapButton--largePill u-relative u-foreground u-xs-paddingLeft13 u-width60 u-height60 u-accentColor--textNormal u-accentColor--buttonNormal" data-action="multivote" data-action-value="649352e2ae87" data-action-type="long-press" data-action-source="post_share_widget-----649352e2ae87---------------------clap_sidebar" aria-label="Clap"><span class="button-defaultState"><span class="svgIcon svgIcon--clap svgIcon--33px u-relative u-topNegative2 u-xs-top0"><svg class="svgIcon-use" width="33" height="33"><path d="M28.86 17.342l-3.64-6.402c-.292-.433-.712-.729-1.163-.8a1.124 1.124 0 0 0-.889.213c-.63.488-.742 1.181-.33 2.061l1.222 2.587 1.4 2.46c2.234 4.085 1.511 8.007-2.145 11.663-.26.26-.526.49-.797.707 1.42-.084 2.881-.683 4.292-2.094 3.822-3.823 3.565-7.876 2.05-10.395zm-6.252 11.075c3.352-3.35 3.998-6.775 1.978-10.469l-3.378-5.945c-.292-.432-.712-.728-1.163-.8a1.122 1.122 0 0 0-.89.213c-.63.49-.742 1.182-.33 2.061l1.72 3.638a.502.502 0 0 1-.806.568l-8.91-8.91a1.335 1.335 0 0 0-1.887 1.886l5.292 5.292a.5.5 0 0 1-.707.707l-5.292-5.292-1.492-1.492c-.503-.503-1.382-.505-1.887 0a1.337 1.337 0 0 0 0 1.886l1.493 1.492 5.292 5.292a.499.499 0 0 1-.353.854.5.5 0 0 1-.354-.147L5.642 13.96a1.338 1.338 0 0 0-1.887 0 1.338 1.338 0 0 0 0 1.887l2.23 2.228 3.322 3.324a.499.499 0 0 1-.353.853.502.502 0 0 1-.354-.146l-3.323-3.324a1.333 1.333 0 0 0-1.886 0 1.325 1.325 0 0 0-.39.943c0 .356.138.691.39.943l6.396 6.397c3.528 3.53 8.86 5.313 12.821 1.353zM12.73 9.26l5.68 5.68-.49-1.037c-.518-1.107-.426-2.13.224-2.89l-3.303-3.304a1.337 1.337 0 0 0-1.886 0 1.326 1.326 0 0 0-.39.944c0 .217.067.42.165.607zm14.787 19.184c-1.599 1.6-3.417 2.392-5.353 2.392-.349 0-.7-.03-1.058-.082a7.922 7.922 0 0 1-3.667.887c-3.049 0-6.115-1.626-8.359-3.87l-6.396-6.397A2.315 2.315 0 0 1 2 19.724a2.327 2.327 0 0 1 1.923-2.296l-.875-.875a2.339 2.339 0 0 1 0-3.3 2.33 2.33 0 0 1 1.24-.647l-.139-.139c-.91-.91-.91-2.39 0-3.3.884-.884 2.421-.882 3.301 0l.138.14a2.335 2.335 0 0 1 3.948-1.24l.093.092c.091-.423.291-.828.62-1.157a2.336 2.336 0 0 1 3.3 0l3.384 3.386a2.167 2.167 0 0 1 1.271-.173c.534.086 1.03.354 1.441.765.11-.549.415-1.034.911-1.418a2.12 2.12 0 0 1 1.661-.41c.727.117 1.385.565 1.853 1.262l3.652 6.423c1.704 2.832 2.025 7.377-2.205 11.607zM13.217.484l-1.917.882 2.37 2.837-.454-3.719zm8.487.877l-1.928-.86-.44 3.697 2.368-2.837zM16.5 3.293L15.478-.005h2.044L16.5 3.293z" fill-rule="evenodd"></path></svg></span></span><span class="button-activeState"><span class="svgIcon svgIcon--clapFilled svgIcon--33px u-relative u-topNegative2 u-xs-top0"><svg class="svgIcon-use" width="33" height="33"><g fill-rule="evenodd"><path d="M29.58 17.1l-3.854-6.78c-.365-.543-.876-.899-1.431-.989a1.491 1.491 0 0 0-1.16.281c-.42.327-.65.736-.7 1.207v.001l3.623 6.367c2.46 4.498 1.67 8.802-2.333 12.807-.265.265-.536.505-.81.728 1.973-.222 3.474-1.286 4.45-2.263 4.166-4.165 3.875-8.6 2.215-11.36zm-4.831.82l-3.581-6.3c-.296-.439-.725-.742-1.183-.815a1.105 1.105 0 0 0-.89.213c-.647.502-.755 1.188-.33 2.098l1.825 3.858a.601.601 0 0 1-.197.747.596.596 0 0 1-.77-.067L10.178 8.21c-.508-.506-1.393-.506-1.901 0a1.335 1.335 0 0 0-.393.95c0 .36.139.698.393.95v.001l5.61 5.61a.599.599 0 1 1-.848.847l-5.606-5.606c-.001 0-.002 0-.003-.002L5.848 9.375a1.349 1.349 0 0 0-1.902 0 1.348 1.348 0 0 0 0 1.901l1.582 1.582 5.61 5.61a.6.6 0 0 1-.848.848l-5.61-5.61c-.51-.508-1.393-.508-1.9 0a1.332 1.332 0 0 0-.394.95c0 .36.139.697.393.952l2.363 2.362c.002.001.002.002.002.003l3.52 3.52a.6.6 0 0 1-.848.847l-3.522-3.523h-.001a1.336 1.336 0 0 0-.95-.393 1.345 1.345 0 0 0-.949 2.295l6.779 6.78c3.715 3.713 9.327 5.598 13.49 1.434 3.527-3.528 4.21-7.13 2.086-11.015zM11.817 7.727c.06-.328.213-.64.466-.893.64-.64 1.755-.64 2.396 0l3.232 3.232c-.82.783-1.09 1.833-.764 2.992l-5.33-5.33z"></path><path d="M13.285.48l-1.916.881 2.37 2.837z"></path><path d="M21.719 1.361L19.79.501l-.44 3.697z"></path><path d="M16.502 3.298L15.481 0h2.043z"></path></g></svg></span></span></button><div class="clapUndo u-width60 u-round u-height32 u-absolute u-borderBox u-paddingRight5 u-transition--transform200Spring u-background--brandSageLighter js-clapUndo" style="top: 14px; padding: 2px;"><button class="button button--chromeless u-baseColor--buttonNormal button--withIcon button--withSvgIcon u-floatRight" data-action="multivote-undo" data-action-value="649352e2ae87"><span class="svgIcon svgIcon--removeThin svgIcon--29px"><svg class="svgIcon-use" width="29" height="29"><path d="M20.13 8.11l-5.61 5.61-5.609-5.61-.801.801 5.61 5.61-5.61 5.61.801.8 5.61-5.609 5.61 5.61.8-.801-5.609-5.61 5.61-5.61" fill-rule="evenodd"></path></svg></span></button></div></div><span class="u-textAlignCenter u-relative u-background js-actionMultirecommendCount u-flexOrderNegative1 u-height20 u-marginBottom7"><button class="button button--chromeless u-baseColor--buttonNormal js-multirecommendCountButton u-block u-marginAuto" data-action="show-recommends" data-action-value="649352e2ae87">258</button></span></div></li><li class="u-textAlignCenter u-marginVertical10"><button class="button button--large button--dark button--chromeless is-touchIconBlackPulse u-baseColor--buttonDark button--withIcon button--withSvgIcon" title="Share on Twitter" aria-label="Share on Twitter" data-action="share-on-twitter" data-action-source="post_share_widget"><span class="svgIcon svgIcon--twitter svgIcon--29px"><svg class="svgIcon-use" width="29" height="29"><path d="M21.967 11.8c.018 5.93-4.607 11.18-11.177 11.18-2.172 0-4.25-.62-6.047-1.76l-.268.422-.038.5.186.013.168.012c.3.02.44.032.6.046 2.06-.026 3.95-.686 5.49-1.86l1.12-.85-1.4-.048c-1.57-.055-2.92-1.08-3.36-2.51l-.48.146-.05.5c.22.03.48.05.75.08.48-.02.87-.07 1.25-.15l2.33-.49-2.32-.49c-1.68-.35-2.91-1.83-2.91-3.55 0-.05 0-.01-.01.03l-.49-.1-.25.44c.63.36 1.35.57 2.07.58l1.7.04L7.4 13c-.978-.662-1.59-1.79-1.618-3.047a4.08 4.08 0 0 1 .524-1.8l-.825.07a12.188 12.188 0 0 0 8.81 4.515l.59.033-.06-.59v-.02c-.05-.43-.06-.63-.06-.87a3.617 3.617 0 0 1 6.27-2.45l.2.21.28-.06c1.01-.22 1.94-.59 2.73-1.09l-.75-.56c-.1.36-.04.89.12 1.36.23.68.58 1.13 1.17.85l-.21-.45-.42-.27c-.52.8-1.17 1.48-1.92 2L22 11l.016.28c.013.2.014.35 0 .52v.04zm.998.038c.018-.22.017-.417 0-.66l-.498.034.284.41a8.183 8.183 0 0 0 2.2-2.267l.97-1.48-1.6.755c.17-.08.3-.02.34.03a.914.914 0 0 1-.13-.292c-.1-.297-.13-.64-.1-.766l.36-1.254-1.1.695c-.69.438-1.51.764-2.41.963l.48.15a4.574 4.574 0 0 0-3.38-1.484 4.616 4.616 0 0 0-4.61 4.613c0 .29.02.51.08.984l.01.02.5-.06.03-.5c-3.17-.18-6.1-1.7-8.08-4.15l-.48-.56-.36.64c-.39.69-.62 1.48-.65 2.28.04 1.61.81 3.04 2.06 3.88l.3-.92c-.55-.02-1.11-.17-1.6-.45l-.59-.34-.14.67c-.02.08-.02.16 0 .24-.01 2.12 1.55 4.01 3.69 4.46l.1-.49-.1-.49c-.33.07-.67.12-1.03.14-.18-.02-.43-.05-.64-.07l-.76-.09.23.73c.57 1.84 2.29 3.14 4.28 3.21l-.28-.89a8.252 8.252 0 0 1-4.85 1.66c-.12-.01-.26-.02-.56-.05l-.17-.01-.18-.01L2.53 21l1.694 1.07a12.233 12.233 0 0 0 6.58 1.917c7.156 0 12.2-5.73 12.18-12.18l-.002.04z"></path></svg></span></button></li><li class="u-textAlignCenter u-marginVertical10"><button class="button button--large button--dark button--chromeless is-touchIconBlackPulse u-baseColor--buttonDark button--withIcon button--withSvgIcon" title="Share on Facebook" aria-label="Share on Facebook" data-action="share-on-facebook" data-action-source="post_share_widget"><span class="svgIcon svgIcon--facebook svgIcon--29px"><svg class="svgIcon-use" width="29" height="29"><path d="M16.39 23.61v-5.808h1.846a.55.55 0 0 0 .546-.48l.36-2.797a.551.551 0 0 0-.547-.62H16.39V12.67c0-.67.12-.813.828-.813h1.474a.55.55 0 0 0 .55-.55V8.803a.55.55 0 0 0-.477-.545c-.436-.06-1.36-.116-2.22-.116-2.5 0-4.13 1.62-4.13 4.248v1.513H10.56a.551.551 0 0 0-.55.55v2.797c0 .304.248.55.55.55h1.855v5.76c-4.172-.96-7.215-4.7-7.215-9.1 0-5.17 4.17-9.36 9.31-9.36 5.14 0 9.31 4.19 9.31 9.36 0 4.48-3.155 8.27-7.43 9.15M14.51 4C8.76 4 4.1 8.684 4.1 14.46c0 5.162 3.75 9.523 8.778 10.32a.55.55 0 0 0 .637-.543v-6.985a.551.551 0 0 0-.55-.55H11.11v-1.697h1.855a.55.55 0 0 0 .55-.55v-2.063c0-2.02 1.136-3.148 3.03-3.148.567 0 1.156.027 1.597.06v1.453h-.924c-1.363 0-1.93.675-1.93 1.912v1.78c0 .3.247.55.55.55h2.132l-.218 1.69H15.84c-.305 0-.55.24-.55.55v7.02c0 .33.293.59.623.54 5.135-.7 9.007-5.11 9.007-10.36C24.92 8.68 20.26 4 14.51 4"></path></svg></span></button></li><li class="u-textAlignCenter u-marginVertical10"><button class="button button--large button--dark button--chromeless is-touchIconFadeInPulse u-baseColor--buttonDark button--withIcon button--withSvgIcon button--bookmark js-bookmarkButton" title="Bookmark this story to read later" aria-label="Bookmark this story to read later" data-action="add-to-bookmarks" data-action-value="649352e2ae87" data-action-source="post_share_widget-----649352e2ae87---------------------bookmark_sidebar"><span class="button-defaultState"><span class="svgIcon svgIcon--bookmark svgIcon--29px"><svg class="svgIcon-use" width="29" height="29"><path d="M19.385 4h-9.77A2.623 2.623 0 0 0 7 6.615V23.01a1.022 1.022 0 0 0 1.595.847l5.905-4.004 5.905 4.004A1.022 1.022 0 0 0 22 23.011V6.62A2.625 2.625 0 0 0 19.385 4zM21 23l-5.91-3.955-.148-.107a.751.751 0 0 0-.884 0l-.147.107L8 23V6.615C8 5.725 8.725 5 9.615 5h9.77C20.275 5 21 5.725 21 6.615V23z" fill-rule="evenodd"></path></svg></span></span><span class="button-activeState"><span class="svgIcon svgIcon--bookmarkFilled svgIcon--29px"><svg class="svgIcon-use" width="29" height="29"><path d="M19.385 4h-9.77A2.623 2.623 0 0 0 7 6.615V23.01a1.022 1.022 0 0 0 1.595.847l5.905-4.004 5.905 4.004A1.022 1.022 0 0 0 22 23.011V6.62A2.625 2.625 0 0 0 19.385 4z" fill-rule="evenodd"></path></svg></span></span></button></li></ul></div></aside><div class="postActionsBar uiScale uiScale-ui--regular uiScale-caption--regular js-postActionsBar is-visible"><div class="postActionsBar-container container"><div class="postActionsBar-content row u-boxShadowNormal js-postActionsBarContent"><div class="postActions"><div class="u-height44 u-maxWidth1250 u-marginAuto u-relative"><div class="u-absolute u-right0 u-marginRight20 u-sizeFullHeight u-flexCenter"><div class="u-floatLeft"><div class="u-floatRight buttonSet"><button class="button button--large button--dark button--chromeless is-touchIconBlackPulse u-baseColor--buttonDark button--withIcon button--withSvgIcon" data-action="respond" data-action-source="post_actions_bar"><span class="svgIcon svgIcon--response svgIcon--29px"><svg class="svgIcon-use" width="29" height="29"><path d="M21.27 20.058c1.89-1.826 2.754-4.17 2.754-6.674C24.024 8.21 19.67 4 14.1 4 8.53 4 4 8.21 4 13.384c0 5.175 4.53 9.385 10.1 9.385 1.007 0 2-.14 2.95-.41.285.25.592.49.918.7 1.306.87 2.716 1.31 4.19 1.31.276-.01.494-.14.6-.36a.625.625 0 0 0-.052-.65c-.61-.84-1.042-1.71-1.282-2.58a5.417 5.417 0 0 1-.154-.75zm-3.85 1.324l-.083-.28-.388.12a9.72 9.72 0 0 1-2.85.424c-4.96 0-8.99-3.706-8.99-8.262 0-4.556 4.03-8.263 8.99-8.263 4.95 0 8.77 3.71 8.77 8.27 0 2.25-.75 4.35-2.5 5.92l-.24.21v.32c0 .07 0 .19.02.37.03.29.1.6.19.92.19.7.49 1.4.89 2.08-.93-.14-1.83-.49-2.67-1.06-.34-.22-.88-.48-1.16-.74z"></path></svg></span></button><button class="button button--large button--dark button--chromeless is-touchIconBlackPulse u-baseColor--buttonDark button--withIcon button--withSvgIcon u-xs-hide" title="Share on Twitter" aria-label="Share on Twitter" data-action="share-on-twitter" data-action-source="post_actions_bar"><span class="svgIcon svgIcon--twitter svgIcon--29px"><svg class="svgIcon-use" width="29" height="29"><path d="M21.967 11.8c.018 5.93-4.607 11.18-11.177 11.18-2.172 0-4.25-.62-6.047-1.76l-.268.422-.038.5.186.013.168.012c.3.02.44.032.6.046 2.06-.026 3.95-.686 5.49-1.86l1.12-.85-1.4-.048c-1.57-.055-2.92-1.08-3.36-2.51l-.48.146-.05.5c.22.03.48.05.75.08.48-.02.87-.07 1.25-.15l2.33-.49-2.32-.49c-1.68-.35-2.91-1.83-2.91-3.55 0-.05 0-.01-.01.03l-.49-.1-.25.44c.63.36 1.35.57 2.07.58l1.7.04L7.4 13c-.978-.662-1.59-1.79-1.618-3.047a4.08 4.08 0 0 1 .524-1.8l-.825.07a12.188 12.188 0 0 0 8.81 4.515l.59.033-.06-.59v-.02c-.05-.43-.06-.63-.06-.87a3.617 3.617 0 0 1 6.27-2.45l.2.21.28-.06c1.01-.22 1.94-.59 2.73-1.09l-.75-.56c-.1.36-.04.89.12 1.36.23.68.58 1.13 1.17.85l-.21-.45-.42-.27c-.52.8-1.17 1.48-1.92 2L22 11l.016.28c.013.2.014.35 0 .52v.04zm.998.038c.018-.22.017-.417 0-.66l-.498.034.284.41a8.183 8.183 0 0 0 2.2-2.267l.97-1.48-1.6.755c.17-.08.3-.02.34.03a.914.914 0 0 1-.13-.292c-.1-.297-.13-.64-.1-.766l.36-1.254-1.1.695c-.69.438-1.51.764-2.41.963l.48.15a4.574 4.574 0 0 0-3.38-1.484 4.616 4.616 0 0 0-4.61 4.613c0 .29.02.51.08.984l.01.02.5-.06.03-.5c-3.17-.18-6.1-1.7-8.08-4.15l-.48-.56-.36.64c-.39.69-.62 1.48-.65 2.28.04 1.61.81 3.04 2.06 3.88l.3-.92c-.55-.02-1.11-.17-1.6-.45l-.59-.34-.14.67c-.02.08-.02.16 0 .24-.01 2.12 1.55 4.01 3.69 4.46l.1-.49-.1-.49c-.33.07-.67.12-1.03.14-.18-.02-.43-.05-.64-.07l-.76-.09.23.73c.57 1.84 2.29 3.14 4.28 3.21l-.28-.89a8.252 8.252 0 0 1-4.85 1.66c-.12-.01-.26-.02-.56-.05l-.17-.01-.18-.01L2.53 21l1.694 1.07a12.233 12.233 0 0 0 6.58 1.917c7.156 0 12.2-5.73 12.18-12.18l-.002.04z"></path></svg></span></button><button class="button button--large button--dark button--chromeless is-touchIconBlackPulse u-baseColor--buttonDark button--withIcon button--withSvgIcon u-xs-hide" title="Share on Facebook" aria-label="Share on Facebook" data-action="share-on-facebook" data-action-source="post_actions_bar"><span class="svgIcon svgIcon--facebook svgIcon--29px"><svg class="svgIcon-use" width="29" height="29"><path d="M16.39 23.61v-5.808h1.846a.55.55 0 0 0 .546-.48l.36-2.797a.551.551 0 0 0-.547-.62H16.39V12.67c0-.67.12-.813.828-.813h1.474a.55.55 0 0 0 .55-.55V8.803a.55.55 0 0 0-.477-.545c-.436-.06-1.36-.116-2.22-.116-2.5 0-4.13 1.62-4.13 4.248v1.513H10.56a.551.551 0 0 0-.55.55v2.797c0 .304.248.55.55.55h1.855v5.76c-4.172-.96-7.215-4.7-7.215-9.1 0-5.17 4.17-9.36 9.31-9.36 5.14 0 9.31 4.19 9.31 9.36 0 4.48-3.155 8.27-7.43 9.15M14.51 4C8.76 4 4.1 8.684 4.1 14.46c0 5.162 3.75 9.523 8.778 10.32a.55.55 0 0 0 .637-.543v-6.985a.551.551 0 0 0-.55-.55H11.11v-1.697h1.855a.55.55 0 0 0 .55-.55v-2.063c0-2.02 1.136-3.148 3.03-3.148.567 0 1.156.027 1.597.06v1.453h-.924c-1.363 0-1.93.675-1.93 1.912v1.78c0 .3.247.55.55.55h2.132l-.218 1.69H15.84c-.305 0-.55.24-.55.55v7.02c0 .33.293.59.623.54 5.135-.7 9.007-5.11 9.007-10.36C24.92 8.68 20.26 4 14.51 4"></path></svg></span></button><button class="button button--large button--dark button--chromeless u-baseColor--buttonDark button--withIcon button--withSvgIcon u-xs-show" title="Share this story on Twitter or Facebook" aria-label="Share this story on Twitter or Facebook" data-action="show-share-popover" data-action-source="post_actions_bar"><span class="svgIcon svgIcon--share svgIcon--29px"><svg class="svgIcon-use" width="29" height="29"><path d="M20.385 8H19a.5.5 0 1 0 .011 1h1.39c.43 0 .84.168 1.14.473.31.305.48.71.48 1.142v10.77c0 .43-.17.837-.47 1.142-.3.305-.71.473-1.14.473H8.62c-.43 0-.84-.168-1.144-.473a1.603 1.603 0 0 1-.473-1.142v-10.77c0-.43.17-.837.48-1.142A1.599 1.599 0 0 1 8.62 9H10a.502.502 0 0 0 0-1H8.615c-.67 0-1.338.255-1.85.766-.51.51-.765 1.18-.765 1.85v10.77c0 .668.255 1.337.766 1.848.51.51 1.18.766 1.85.766h11.77c.668 0 1.337-.255 1.848-.766.51-.51.766-1.18.766-1.85v-10.77c0-.668-.255-1.337-.766-1.848A2.61 2.61 0 0 0 20.384 8zm-8.67-2.508L14 3.207v8.362c0 .27.224.5.5.5s.5-.23.5-.5V3.2l2.285 2.285a.49.49 0 0 0 .704-.001.511.511 0 0 0 0-.708l-3.14-3.14a.504.504 0 0 0-.71 0L11 4.776a.501.501 0 0 0 .71.706" fill-rule="evenodd"></path></svg></span></button><button class="button button--large button--dark button--chromeless is-touchIconFadeInPulse u-baseColor--buttonDark button--withIcon button--withSvgIcon button--bookmark js-bookmarkButton" title="Bookmark this story to read later" aria-label="Bookmark this story to read later" data-action="add-to-bookmarks" data-action-value="649352e2ae87" data-action-source="post_actions_bar"><span class="button-defaultState"><span class="svgIcon svgIcon--bookmark svgIcon--29px"><svg class="svgIcon-use" width="29" height="29"><path d="M19.385 4h-9.77A2.623 2.623 0 0 0 7 6.615V23.01a1.022 1.022 0 0 0 1.595.847l5.905-4.004 5.905 4.004A1.022 1.022 0 0 0 22 23.011V6.62A2.625 2.625 0 0 0 19.385 4zM21 23l-5.91-3.955-.148-.107a.751.751 0 0 0-.884 0l-.147.107L8 23V6.615C8 5.725 8.725 5 9.615 5h9.77C20.275 5 21 5.725 21 6.615V23z" fill-rule="evenodd"></path></svg></span></span><span class="button-activeState"><span class="svgIcon svgIcon--bookmarkFilled svgIcon--29px"><svg class="svgIcon-use" width="29" height="29"><path d="M19.385 4h-9.77A2.623 2.623 0 0 0 7 6.615V23.01a1.022 1.022 0 0 0 1.595.847l5.905-4.004 5.905 4.004A1.022 1.022 0 0 0 22 23.011V6.62A2.625 2.625 0 0 0 19.385 4z" fill-rule="evenodd"></path></svg></span></span></button></div></div><div class="u-xs-hide u-width255 u-height44 u-floatLeft js-readNextMetabarRight"><div class="streamItem streamItem--placementCardMetabar js-streamItem"><div class="readNextPromo readNextPromo--chromeless"><div class="buttonSet-separator u-floatLeft"></div><div class="js-trackedPost" data-post-id="51b4a7354e06" data-source="read_next_metabar----------41" data-tracking-context="placement" data-scroll="fixed"><a class="link link--noUnderline u-baseColor--link u-block" href="https://hackernoon.com/top-3-most-popular-programming-languages-in-2018-and-their-annual-salaries-51b4a7354e06?source=read_next_metabar----------41"><div class="uiScale uiScale-ui--small uiScale-caption--small readNextPromo-postInfo"><div class="ui-caption u-marginTop5 readNextPromo-callToAction u-accentColor--textNormal u-uiTextBold">Next story</div><h4 class="ui-h4 readNextPromo-postTitle u-block u-noWrapWithEllipsis u-contentSansBold">Top 3 most popular programming languages in 2018 (and their annual salaries)</h4></div></a></div></div></div></div></div><div class="container u-maxWidth740 u-sizeFullHeight u-flexCenter"><div class="buttonSet"><div class="multirecommend js-actionMultirecommend u-flexCenter" data-post-id="649352e2ae87" data-is-icon-29px="true" data-has-recommend-list="true" data-source="post_actions_bar-----649352e2ae87---------------------clap_footer"><div class="u-relative u-foreground"><button class="button button--primary button--large button--chromeless u-accentColor--buttonNormal button--withIcon button--withSvgIcon clapButton js-actionMultirecommendButton" data-action="multivote" data-action-value="649352e2ae87" data-action-type="long-press" data-action-source="post_actions_bar-----649352e2ae87---------------------clap_footer" aria-label="Clap"><span class="button-defaultState"><span class="svgIcon svgIcon--clap svgIcon--29px"><svg class="svgIcon-use" width="29" height="29"><g fill-rule="evenodd"><path d="M13.739 1l.761 2.966L15.261 1z"></path><path d="M16.815 4.776l1.84-2.551-1.43-.471z"></path><path d="M10.378 2.224l1.84 2.551-.408-3.022z"></path><path d="M22.382 22.622c-1.04 1.04-2.115 1.507-3.166 1.608.168-.14.332-.29.492-.45 2.885-2.886 3.456-5.982 1.69-9.211l-1.101-1.937-.955-2.02c-.315-.676-.235-1.185.245-1.556a.836.836 0 0 1 .66-.16c.342.056.66.28.879.605l2.856 5.023c1.179 1.962 1.379 5.119-1.6 8.098m-13.29-.528l-5.02-5.02a1 1 0 0 1 .707-1.701c.255 0 .512.098.707.292l2.607 2.607a.442.442 0 0 0 .624-.624L6.11 15.04l-1.75-1.75a.998.998 0 1 1 1.41-1.413l4.154 4.156a.44.44 0 0 0 .624 0 .44.44 0 0 0 0-.624l-4.152-4.153-1.172-1.171a.998.998 0 0 1 0-1.41 1.018 1.018 0 0 1 1.41 0l1.172 1.17 4.153 4.152a.437.437 0 0 0 .624 0 .442.442 0 0 0 0-.624L8.43 9.222a.988.988 0 0 1-.291-.705.99.99 0 0 1 .29-.706 1 1 0 0 1 1.412 0l6.992 6.993a.443.443 0 0 0 .71-.501l-1.35-2.856c-.315-.676-.235-1.185.246-1.557a.85.85 0 0 1 .66-.16c.342.056.659.28.879.606L20.628 15c1.573 2.876 1.067 5.545-1.544 8.156-1.396 1.397-3.144 1.966-5.063 1.652-1.713-.286-3.463-1.248-4.928-2.714zM12.99 6.976l2.562 2.562c-.497.607-.563 1.414-.155 2.284l.265.562-4.257-4.257a.98.98 0 0 1-.117-.445c0-.267.104-.517.292-.706a1.023 1.023 0 0 1 1.41 0zm8.887 2.06c-.375-.557-.902-.916-1.486-1.011a1.738 1.738 0 0 0-1.342.332c-.376.29-.61.656-.712 1.065a2.1 2.1 0 0 0-1.095-.562 1.776 1.776 0 0 0-.992.128l-2.636-2.636a1.883 1.883 0 0 0-2.658 0 1.862 1.862 0 0 0-.478.847 1.886 1.886 0 0 0-2.671-.012 1.867 1.867 0 0 0-.503.909c-.754-.754-1.992-.754-2.703-.044a1.881 1.881 0 0 0 0 2.658c-.288.12-.605.288-.864.547a1.884 1.884 0 0 0 0 2.659l.624.622a1.879 1.879 0 0 0-.91 3.16l5.019 5.02c1.595 1.594 3.515 2.645 5.408 2.959a7.16 7.16 0 0 0 1.173.098c1.026 0 1.997-.24 2.892-.7.279.04.555.065.828.065 1.53 0 2.969-.628 4.236-1.894 3.338-3.338 3.083-6.928 1.738-9.166l-2.868-5.043z"></path></g></svg></span></span><span class="button-activeState"><span class="svgIcon svgIcon--clapFilled svgIcon--29px"><svg class="svgIcon-use" width="29" height="29"><g fill-rule="evenodd"><path d="M13.738 1l.762 2.966L15.262 1z"></path><path d="M18.634 2.224l-1.432-.47-.408 3.022z"></path><path d="M11.79 1.754l-1.431.47 1.84 2.552z"></path><path d="M24.472 14.307l-3.023-5.32c-.287-.426-.689-.705-1.123-.776a1.16 1.16 0 0 0-.911.221c-.297.231-.474.515-.535.84.017.022.036.04.053.063l2.843 5.001c1.95 3.564 1.328 6.973-1.843 10.144a8.46 8.46 0 0 1-.549.501c1.205-.156 2.328-.737 3.351-1.76 3.268-3.268 3.041-6.749 1.737-8.914"></path><path d="M14.58 10.887c-.156-.83.096-1.569.692-2.142L12.78 6.252c-.5-.504-1.378-.504-1.879 0-.178.18-.273.4-.329.63l4.008 4.005z"></path><path d="M17.812 10.04c-.218-.323-.539-.55-.88-.606a.814.814 0 0 0-.644.153c-.176.137-.713.553-.24 1.566l1.43 3.025a.539.539 0 1 1-.868.612L9.2 7.378a.986.986 0 1 0-1.395 1.395l4.401 4.403a.538.538 0 1 1-.762.762L7.046 9.54 5.802 8.295a.99.99 0 0 0-1.396 0 .981.981 0 0 0 0 1.394l1.241 1.241 4.402 4.403a.537.537 0 0 1 0 .761.535.535 0 0 1-.762 0L4.89 11.696a.992.992 0 0 0-1.399-.003.983.983 0 0 0 0 1.395l1.855 1.854 2.763 2.765a.538.538 0 0 1-.76.761l-2.765-2.764a.982.982 0 0 0-1.395 0 .989.989 0 0 0 0 1.395l5.32 5.32c3.371 3.372 6.64 4.977 10.49 1.126C21.74 20.8 22.271 18 20.62 14.982l-2.809-4.942z"></path></g></svg></span></span></button></div><span class="u-textAlignCenter u-relative u-background js-actionMultirecommendCount u-marginLeft5"><button class="button button--chromeless u-baseColor--buttonNormal js-multirecommendCountButton" data-action="show-recommends" data-action-value="649352e2ae87">258</button></span></div></div></div></div></div></div></div></div><style class="js-collectionStyle">
.u-accentColor--borderLight {border-color: #00A600 !important;}
.u-accentColor--borderNormal {border-color: #00A600 !important;}
.u-accentColor--borderDark {border-color: #008E00 !important;}
.u-accentColor--iconLight .svgIcon,.u-accentColor--iconLight.svgIcon {fill: #00A600 !important;}
.u-accentColor--iconNormal .svgIcon,.u-accentColor--iconNormal.svgIcon {fill: #00A600 !important;}
.u-accentColor--iconDark .svgIcon,.u-accentColor--iconDark.svgIcon {fill: #008E00 !important;}
.u-accentColor--textNormal {color: #008E00 !important;}
.u-accentColor--hoverTextNormal:hover {color: #008E00 !important;}
.u-accentColor--textNormal.u-accentColor--textDarken:hover {color: #008100 !important;}
.u-accentColor--textDark {color: #008100 !important;}
.u-accentColor--backgroundLight {background-color: #00A600 !important;}
.u-accentColor--backgroundNormal {background-color: #00A600 !important;}
.u-accentColor--backgroundDark {background-color: #008E00 !important;}
.u-accentColor--buttonDark {border-color: #008E00 !important; color: #008100 !important;}
.u-accentColor--buttonDark:hover {border-color: #008100 !important;}
.u-accentColor--buttonDark .icon:before,.u-accentColor--buttonDark .svgIcon{color: #008E00 !important; fill: #008E00 !important;}
.u-accentColor--buttonNormal:not(.clapButton--largePill) {border-color: #00A600 !important; color: #008E00 !important;}
.u-accentColor--buttonNormal:hover {border-color: #008E00 !important;}
.u-accentColor--buttonNormal .icon:before,.u-accentColor--buttonNormal .svgIcon{color: #00A600 !important; fill: #00A600 !important;}
.u-accentColor--buttonNormal.button--filled .icon:before,.u-accentColor--buttonNormal.button--filled .svgIcon{color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;}
.u-accentColor--buttonDark.button--filled,.u-accentColor--buttonDark.button--withChrome.is-active,.u-accentColor--fillWhenActive.is-active {background-color: #008E00 !important; border-color: #008E00 !important; color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;}
.u-accentColor--buttonNormal.button--filled:not(.clapButton--largePill),.u-accentColor--buttonNormal.button--withChrome.is-active:not(.clapButton--largePill) {background-color: #00A600 !important; border-color: #00A600 !important; color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;}
.postArticle.is-withAccentColors .markup--user,.postArticle.is-withAccentColors .markup--query {color: #008E00 !important;}.u-tintBgColor {background-color: rgba(0, 255, 0, 1) !important;}.u-tintBgColor .u-fadeLeft:before {background-image: linear-gradient(to right, rgba(0, 255, 0, 1) 0%, rgba(0, 255, 0, 0) 100%) !important;}.u-tintBgColor .u-fadeRight:after {background-image: linear-gradient(to right, rgba(0, 255, 0, 0) 0%, rgba(0, 255, 0, 1) 100%) !important;}
.u-tintSpectrum .u-baseColor--borderLight {border-color: #00B400 !important;}
.u-tintSpectrum .u-baseColor--borderNormal {border-color: #009200 !important;}
.u-tintSpectrum .u-baseColor--borderDark {border-color: #006D00 !important;}
.u-tintSpectrum .u-baseColor--iconLight .svgIcon,.u-tintSpectrum .u-baseColor--iconLight.svgIcon {fill: #00B400 !important;}
.u-tintSpectrum .u-baseColor--iconNormal .svgIcon,.u-tintSpectrum .u-baseColor--iconNormal.svgIcon {fill: #009200 !important;}
.u-tintSpectrum .u-baseColor--iconDark .svgIcon,.u-tintSpectrum .u-baseColor--iconDark.svgIcon {fill: #006D00 !important;}
.u-tintSpectrum .u-baseColor--textNormal {color: #009200 !important;}
.u-tintSpectrum .u-baseColor--textNormal.u-baseColor--textDarken:hover {color: #005900 !important;}
.u-tintSpectrum .u-baseColor--textDark {color: #005900 !important;}
.u-tintSpectrum .u-baseColor--textDarker {color: #005900 !important;}
.u-tintSpectrum .u-baseColor--backgroundLight {background-color: #00B400 !important;}
.u-tintSpectrum .u-baseColor--backgroundNormal {background-color: #009200 !important;}
.u-tintSpectrum .u-baseColor--backgroundDark {background-color: #006D00 !important;}
.u-tintSpectrum .u-baseColor--buttonLight {border-color: #00B400 !important; color: #00B400 !important;}
.u-tintSpectrum .u-baseColor--buttonLight:hover {border-color: #00B400 !important;}
.u-tintSpectrum .u-baseColor--buttonLight .icon:before,.u-tintSpectrum .u-baseColor--buttonLight .svgIcon {color: #00B400 !important; fill: #00B400 !important;}
.u-tintSpectrum .u-baseColor--buttonDark {border-color: #006D00 !important; color: #005900 !important;}
.u-tintSpectrum .u-baseColor--buttonDark:hover {border-color: #005900 !important;}
.u-tintSpectrum .u-baseColor--buttonDark .icon:before,.u-tintSpectrum .u-baseColor--buttonDark .svgIcon {color: #006D00 !important; fill: #006D00 !important;}
.u-tintSpectrum .u-baseColor--buttonNormal {border-color: #009200 !important; color: #009200 !important;}
.u-tintSpectrum .u-baseColor--buttonNormal:hover {border-color: #006D00 !important;}
.u-tintSpectrum .u-baseColor--buttonNormal .icon:before,.u-tintSpectrum .u-baseColor--buttonNormal .svgIcon {color: #009200 !important; fill: #009200 !important;}
.u-tintSpectrum .u-baseColor--buttonDark.button--filled,.u-tintSpectrum .u-baseColor--buttonDark.button--withChrome.is-active {background-color: #006D00 !important; border-color: #006D00 !important; color: rgba(0, 255, 0, 1) !important; fill: rgba(0, 255, 0, 1) !important;}
.u-tintSpectrum .u-baseColor--buttonNormal.button--filled,.u-tintSpectrum .u-baseColor--buttonNormal.button--withChrome.is-active {background-color: #009200 !important; border-color: #009200 !important; color: rgba(0, 255, 0, 1) !important; fill: rgba(0, 255, 0, 1) !important;}
.u-tintSpectrum .u-baseColor--link {color: #009200 !important;}
.u-tintSpectrum .u-baseColor--link.link--darkenOnHover:hover {color: #005900 !important;}
.u-tintSpectrum .u-baseColor--link.link--darken:hover,.u-tintSpectrum .u-baseColor--link.link--darken:focus,.u-tintSpectrum .u-baseColor--link.link--darken:active {color: #005900 !important;}
.u-tintSpectrum .u-baseColor--link.link--dark {color: #005900 !important;}
.u-tintSpectrum .u-baseColor--link.link--dark.link--darken:hover,.u-tintSpectrum .u-baseColor--link.link--dark.link--darken:focus,.u-tintSpectrum .u-baseColor--link.link--dark.link--darken:active {color: #005900 !important;}
.u-tintSpectrum .u-baseColor--link.link--darker {color: #005900 !important;}
.u-tintSpectrum .u-baseColor--placeholderNormal ::-webkit-input-placeholder {color: #00B400;}
.u-tintSpectrum .u-baseColor--placeholderNormal ::-moz-placeholder {color: #00B400;}
.u-tintSpectrum .u-baseColor--placeholderNormal :-ms-input-placeholder {color: #00B400;}
.u-tintSpectrum .svgIcon--logoNew path:nth-child(1) {stroke: none !important; fill: #00E200 !important;}
.u-tintSpectrum .svgIcon--logoNew path:nth-child(2) {stroke: none !important; fill: #00D300 !important;}
.u-tintSpectrum .svgIcon--logoNew path:nth-child(3) {stroke: none !important; fill: #00B400 !important;}
.u-tintSpectrum .svgIcon--logoNew path:nth-child(4) {stroke: none !important; fill: #009200 !important;}
.u-tintSpectrum .svgIcon--logoWordmark {stroke: none !important; fill: #005900 !important;}
.u-tintSpectrum .svgIcon--logoMonogram {stroke: none !important; fill: #005900 !important;}
.u-tintSpectrum  .ui-h1,.u-tintSpectrum  .ui-h2,.u-tintSpectrum  .ui-h3,.u-tintSpectrum  .ui-h4,.u-tintSpectrum  .ui-brand1,.u-tintSpectrum  .ui-brand2,.u-tintSpectrum  .ui-captionStrong {color: #005900 !important; fill: #005900 !important;}
.u-tintSpectrum  .ui-body,.u-tintSpectrum  .ui-caps {color: #005900 !important; fill: #005900 !important;}
.u-tintSpectrum  .ui-summary,.u-tintSpectrum  .ui-caption {color: #00B400 !important; fill: #00B400 !important;}
.u-tintSpectrum .u-accentColor--borderLight {border-color: #00B400 !important;}
.u-tintSpectrum .u-accentColor--borderNormal {border-color: #009200 !important;}
.u-tintSpectrum .u-accentColor--borderDark {border-color: #006D00 !important;}
.u-tintSpectrum .u-accentColor--iconLight .svgIcon,.u-tintSpectrum .u-accentColor--iconLight.svgIcon {fill: #00B400 !important;}
.u-tintSpectrum .u-accentColor--iconNormal .svgIcon,.u-tintSpectrum .u-accentColor--iconNormal.svgIcon {fill: #009200 !important;}
.u-tintSpectrum .u-accentColor--iconDark .svgIcon,.u-tintSpectrum .u-accentColor--iconDark.svgIcon {fill: #006D00 !important;}
.u-tintSpectrum .u-accentColor--textNormal {color: #009200 !important;}
.u-tintSpectrum .u-accentColor--hoverTextNormal:hover {color: #009200 !important;}
.u-tintSpectrum .u-accentColor--textNormal.u-accentColor--textDarken:hover {color: #005900 !important;}
.u-tintSpectrum .u-accentColor--textDark {color: #005900 !important;}
.u-tintSpectrum .u-accentColor--backgroundLight {background-color: #00B400 !important;}
.u-tintSpectrum .u-accentColor--backgroundNormal {background-color: #009200 !important;}
.u-tintSpectrum .u-accentColor--backgroundDark {background-color: #006D00 !important;}
.u-tintSpectrum .u-accentColor--buttonDark {border-color: #006D00 !important; color: #005900 !important;}
.u-tintSpectrum .u-accentColor--buttonDark:hover {border-color: #005900 !important;}
.u-tintSpectrum .u-accentColor--buttonDark .icon:before,.u-tintSpectrum .u-accentColor--buttonDark .svgIcon{color: #006D00 !important; fill: #006D00 !important;}
.u-tintSpectrum .u-accentColor--buttonNormal:not(.clapButton--largePill) {border-color: #009200 !important; color: #009200 !important;}
.u-tintSpectrum .u-accentColor--buttonNormal:hover {border-color: #006D00 !important;}
.u-tintSpectrum .u-accentColor--buttonNormal .icon:before,.u-tintSpectrum .u-accentColor--buttonNormal .svgIcon{color: #009200 !important; fill: #009200 !important;}
.u-tintSpectrum .u-accentColor--buttonNormal.button--filled .icon:before,.u-tintSpectrum .u-accentColor--buttonNormal.button--filled .svgIcon{color: rgba(0, 255, 0, 1) !important; fill: rgba(0, 255, 0, 1) !important;}
.u-tintSpectrum .u-accentColor--buttonDark.button--filled,.u-tintSpectrum .u-accentColor--buttonDark.button--withChrome.is-active,.u-tintSpectrum .u-accentColor--fillWhenActive.is-active {background-color: #006D00 !important; border-color: #006D00 !important; color: rgba(0, 255, 0, 1) !important; fill: rgba(0, 255, 0, 1) !important;}
.u-tintSpectrum .u-accentColor--buttonNormal.button--filled:not(.clapButton--largePill),.u-tintSpectrum .u-accentColor--buttonNormal.button--withChrome.is-active:not(.clapButton--largePill) {background-color: #009200 !important; border-color: #009200 !important; color: rgba(0, 255, 0, 1) !important; fill: rgba(0, 255, 0, 1) !important;}
.u-tintSpectrum .postArticle.is-withAccentColors .markup--user,.u-tintSpectrum .postArticle.is-withAccentColors .markup--query {color: #009200 !important;}
.u-accentColor--highlightFaint {background-color: rgba(203, 255, 186, 1) !important;}
.u-accentColor--highlightStrong.is-active .svgIcon {fill: rgba(110, 255, 89, 1) !important;}
.postArticle.is-withAccentColors .markup--quote.is-other {background-color: rgba(203, 255, 186, 1) !important;}
body.is-withMagicUnderlines .postArticle.is-withAccentColors .markup--quote.is-other {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(203, 255, 186, 1), rgba(203, 255, 186, 1));}
.postArticle.is-withAccentColors .markup--quote.is-me {background-color: rgba(157, 255, 134, 1) !important;}
body.is-withMagicUnderlines .postArticle.is-withAccentColors .markup--quote.is-me {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(157, 255, 134, 1), rgba(157, 255, 134, 1));}
.postArticle.is-withAccentColors .markup--quote.is-targeted {background-color: rgba(110, 255, 89, 1) !important;}
body.is-withMagicUnderlines .postArticle.is-withAccentColors .markup--quote.is-targeted {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(110, 255, 89, 1), rgba(110, 255, 89, 1));}
.postArticle.is-withAccentColors .markup--quote.is-selected {background-color: rgba(110, 255, 89, 1) !important;}
body.is-withMagicUnderlines .postArticle.is-withAccentColors .markup--quote.is-selected {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(110, 255, 89, 1), rgba(110, 255, 89, 1));}
.postArticle.is-withAccentColors .markup--highlight {background-color: rgba(110, 255, 89, 1) !important;}
body.is-withMagicUnderlines .postArticle.is-withAccentColors .markup--highlight {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(110, 255, 89, 1), rgba(110, 255, 89, 1));}.u-baseColor--iconNormal.avatar-halo {fill: rgba(0, 0, 0, 0.4980392156862745) !important;}</style><style class="js-collectionStyleConstant">.u-imageBgColor {background-color: rgba(0, 0, 0, 0.24705882352941178);}
.u-imageSpectrum .u-baseColor--borderLight {border-color: rgba(255, 255, 255, 0.6980392156862745) !important;}
.u-imageSpectrum .u-baseColor--borderNormal {border-color: rgba(255, 255, 255, 0.8980392156862745) !important;}
.u-imageSpectrum .u-baseColor--borderDark {border-color: rgba(255, 255, 255, 0.9490196078431372) !important;}
.u-imageSpectrum .u-baseColor--iconLight .svgIcon,.u-imageSpectrum .u-baseColor--iconLight.svgIcon {fill: rgba(255, 255, 255, 0.8) !important;}
.u-imageSpectrum .u-baseColor--iconNormal .svgIcon,.u-imageSpectrum .u-baseColor--iconNormal.svgIcon {fill: rgba(255, 255, 255, 0.9490196078431372) !important;}
.u-imageSpectrum .u-baseColor--iconDark .svgIcon,.u-imageSpectrum .u-baseColor--iconDark.svgIcon {fill: rgba(255, 255, 255, 1) !important;}
.u-imageSpectrum .u-baseColor--textNormal {color: rgba(255, 255, 255, 0.9490196078431372) !important;}
.u-imageSpectrum .u-baseColor--textNormal.u-baseColor--textDarken:hover {color: rgba(255, 255, 255, 1) !important;}
.u-imageSpectrum .u-baseColor--textDark {color: rgba(255, 255, 255, 1) !important;}
.u-imageSpectrum .u-baseColor--textDarker {color: rgba(255, 255, 255, 1) !important;}
.u-imageSpectrum .u-baseColor--backgroundLight {background-color: rgba(255, 255, 255, 0.8980392156862745) !important;}
.u-imageSpectrum .u-baseColor--backgroundNormal {background-color: rgba(255, 255, 255, 0.9490196078431372) !important;}
.u-imageSpectrum .u-baseColor--backgroundDark {background-color: rgba(255, 255, 255, 1) !important;}
.u-imageSpectrum .u-baseColor--buttonLight {border-color: rgba(255, 255, 255, 0.6980392156862745) !important; color: rgba(255, 255, 255, 0.8) !important;}
.u-imageSpectrum .u-baseColor--buttonLight:hover {border-color: rgba(255, 255, 255, 0.6980392156862745) !important;}
.u-imageSpectrum .u-baseColor--buttonLight .icon:before,.u-imageSpectrum .u-baseColor--buttonLight .svgIcon {color: rgba(255, 255, 255, 0.8) !important; fill: rgba(255, 255, 255, 0.8) !important;}
.u-imageSpectrum .u-baseColor--buttonDark {border-color: rgba(255, 255, 255, 0.9490196078431372) !important; color: rgba(255, 255, 255, 1) !important;}
.u-imageSpectrum .u-baseColor--buttonDark:hover {border-color: rgba(255, 255, 255, 1) !important;}
.u-imageSpectrum .u-baseColor--buttonDark .icon:before,.u-imageSpectrum .u-baseColor--buttonDark .svgIcon {color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;}
.u-imageSpectrum .u-baseColor--buttonNormal {border-color: rgba(255, 255, 255, 0.8980392156862745) !important; color: rgba(255, 255, 255, 0.9490196078431372) !important;}
.u-imageSpectrum .u-baseColor--buttonNormal:hover {border-color: rgba(255, 255, 255, 0.9490196078431372) !important;}
.u-imageSpectrum .u-baseColor--buttonNormal .icon:before,.u-imageSpectrum .u-baseColor--buttonNormal .svgIcon {color: rgba(255, 255, 255, 0.9490196078431372) !important; fill: rgba(255, 255, 255, 0.9490196078431372) !important;}
.u-imageSpectrum .u-baseColor--buttonDark.button--filled,.u-imageSpectrum .u-baseColor--buttonDark.button--withChrome.is-active {background-color: rgba(255, 255, 255, 1) !important; border-color: rgba(255, 255, 255, 1) !important; color: rgba(0, 0, 0, 0.24705882352941178) !important; fill: rgba(0, 0, 0, 0.24705882352941178) !important;}
.u-imageSpectrum .u-baseColor--buttonNormal.button--filled,.u-imageSpectrum .u-baseColor--buttonNormal.button--withChrome.is-active {background-color: rgba(255, 255, 255, 0.9490196078431372) !important; border-color: rgba(255, 255, 255, 0.9490196078431372) !important; color: rgba(0, 0, 0, 0.24705882352941178) !important; fill: rgba(0, 0, 0, 0.24705882352941178) !important;}
.u-imageSpectrum .u-baseColor--link {color: rgba(255, 255, 255, 0.9490196078431372) !important;}
.u-imageSpectrum .u-baseColor--link.link--darkenOnHover:hover {color: rgba(255, 255, 255, 1) !important;}
.u-imageSpectrum .u-baseColor--link.link--darken:hover,.u-imageSpectrum .u-baseColor--link.link--darken:focus,.u-imageSpectrum .u-baseColor--link.link--darken:active {color: rgba(255, 255, 255, 1) !important;}
.u-imageSpectrum .u-baseColor--link.link--dark {color: rgba(255, 255, 255, 1) !important;}
.u-imageSpectrum .u-baseColor--link.link--dark.link--darken:hover,.u-imageSpectrum .u-baseColor--link.link--dark.link--darken:focus,.u-imageSpectrum .u-baseColor--link.link--dark.link--darken:active {color: rgba(255, 255, 255, 1) !important;}
.u-imageSpectrum .u-baseColor--link.link--darker {color: rgba(255, 255, 255, 1) !important;}
.u-imageSpectrum .u-baseColor--placeholderNormal ::-webkit-input-placeholder {color: rgba(255, 255, 255, 0.8);}
.u-imageSpectrum .u-baseColor--placeholderNormal ::-moz-placeholder {color: rgba(255, 255, 255, 0.8);}
.u-imageSpectrum .u-baseColor--placeholderNormal :-ms-input-placeholder {color: rgba(255, 255, 255, 0.8);}
.u-imageSpectrum .svgIcon--logoNew path:nth-child(1) {stroke: none !important; fill: rgba(255, 255, 255, 0.4) !important;}
.u-imageSpectrum .svgIcon--logoNew path:nth-child(2) {stroke: none !important; fill: rgba(255, 255, 255, 0.4980392156862745) !important;}
.u-imageSpectrum .svgIcon--logoNew path:nth-child(3) {stroke: none !important; fill: rgba(255, 255, 255, 0.6980392156862745) !important;}
.u-imageSpectrum .svgIcon--logoNew path:nth-child(4) {stroke: none !important; fill: rgba(255, 255, 255, 0.8980392156862745) !important;}
.u-imageSpectrum .svgIcon--logoWordmark {stroke: none !important; fill: rgba(255, 255, 255, 1) !important;}
.u-imageSpectrum .svgIcon--logoMonogram {stroke: none !important; fill: rgba(255, 255, 255, 1) !important;}
.u-imageSpectrum  .ui-h1,.u-imageSpectrum  .ui-h2,.u-imageSpectrum  .ui-h3,.u-imageSpectrum  .ui-h4,.u-imageSpectrum  .ui-brand1,.u-imageSpectrum  .ui-brand2,.u-imageSpectrum  .ui-captionStrong {color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;}
.u-imageSpectrum  .ui-body,.u-imageSpectrum  .ui-caps {color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;}
.u-imageSpectrum  .ui-summary,.u-imageSpectrum  .ui-caption {color: rgba(255, 255, 255, 0.8) !important; fill: rgba(255, 255, 255, 0.8) !important;}
.u-imageSpectrum .u-accentColor--borderLight {border-color: rgba(255, 255, 255, 0.6980392156862745) !important;}
.u-imageSpectrum .u-accentColor--borderNormal {border-color: rgba(255, 255, 255, 0.8980392156862745) !important;}
.u-imageSpectrum .u-accentColor--borderDark {border-color: rgba(255, 255, 255, 0.9490196078431372) !important;}
.u-imageSpectrum .u-accentColor--iconLight .svgIcon,.u-imageSpectrum .u-accentColor--iconLight.svgIcon {fill: rgba(255, 255, 255, 0.8) !important;}
.u-imageSpectrum .u-accentColor--iconNormal .svgIcon,.u-imageSpectrum .u-accentColor--iconNormal.svgIcon {fill: rgba(255, 255, 255, 0.9490196078431372) !important;}
.u-imageSpectrum .u-accentColor--iconDark .svgIcon,.u-imageSpectrum .u-accentColor--iconDark.svgIcon {fill: rgba(255, 255, 255, 1) !important;}
.u-imageSpectrum .u-accentColor--textNormal {color: rgba(255, 255, 255, 0.9490196078431372) !important;}
.u-imageSpectrum .u-accentColor--hoverTextNormal:hover {color: rgba(255, 255, 255, 0.9490196078431372) !important;}
.u-imageSpectrum .u-accentColor--textNormal.u-accentColor--textDarken:hover {color: rgba(255, 255, 255, 1) !important;}
.u-imageSpectrum .u-accentColor--textDark {color: rgba(255, 255, 255, 1) !important;}
.u-imageSpectrum .u-accentColor--backgroundLight {background-color: rgba(255, 255, 255, 0.8980392156862745) !important;}
.u-imageSpectrum .u-accentColor--backgroundNormal {background-color: rgba(255, 255, 255, 0.9490196078431372) !important;}
.u-imageSpectrum .u-accentColor--backgroundDark {background-color: rgba(255, 255, 255, 1) !important;}
.u-imageSpectrum .u-accentColor--buttonDark {border-color: rgba(255, 255, 255, 0.9490196078431372) !important; color: rgba(255, 255, 255, 1) !important;}
.u-imageSpectrum .u-accentColor--buttonDark:hover {border-color: rgba(255, 255, 255, 1) !important;}
.u-imageSpectrum .u-accentColor--buttonDark .icon:before,.u-imageSpectrum .u-accentColor--buttonDark .svgIcon{color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;}
.u-imageSpectrum .u-accentColor--buttonNormal:not(.clapButton--largePill) {border-color: rgba(255, 255, 255, 0.8980392156862745) !important; color: rgba(255, 255, 255, 0.9490196078431372) !important;}
.u-imageSpectrum .u-accentColor--buttonNormal:hover {border-color: rgba(255, 255, 255, 0.9490196078431372) !important;}
.u-imageSpectrum .u-accentColor--buttonNormal .icon:before,.u-imageSpectrum .u-accentColor--buttonNormal .svgIcon{color: rgba(255, 255, 255, 0.9490196078431372) !important; fill: rgba(255, 255, 255, 0.9490196078431372) !important;}
.u-imageSpectrum .u-accentColor--buttonNormal.button--filled .icon:before,.u-imageSpectrum .u-accentColor--buttonNormal.button--filled .svgIcon{color: rgba(0, 0, 0, 0.24705882352941178) !important; fill: rgba(0, 0, 0, 0.24705882352941178) !important;}
.u-imageSpectrum .u-accentColor--buttonDark.button--filled,.u-imageSpectrum .u-accentColor--buttonDark.button--withChrome.is-active,.u-imageSpectrum .u-accentColor--fillWhenActive.is-active {background-color: rgba(255, 255, 255, 1) !important; border-color: rgba(255, 255, 255, 1) !important; color: rgba(0, 0, 0, 0.24705882352941178) !important; fill: rgba(0, 0, 0, 0.24705882352941178) !important;}
.u-imageSpectrum .u-accentColor--buttonNormal.button--filled:not(.clapButton--largePill),.u-imageSpectrum .u-accentColor--buttonNormal.button--withChrome.is-active:not(.clapButton--largePill) {background-color: rgba(255, 255, 255, 0.9490196078431372) !important; border-color: rgba(255, 255, 255, 0.9490196078431372) !important; color: rgba(0, 0, 0, 0.24705882352941178) !important; fill: rgba(0, 0, 0, 0.24705882352941178) !important;}
.u-imageSpectrum .postArticle.is-withAccentColors .markup--user,.u-imageSpectrum .postArticle.is-withAccentColors .markup--query {color: rgba(255, 255, 255, 0.9490196078431372) !important;}
.u-imageSpectrum .u-accentColor--highlightFaint {background-color: rgba(255, 255, 255, 0.2) !important;}
.u-imageSpectrum .u-accentColor--highlightStrong.is-active .svgIcon {fill: rgba(255, 255, 255, 0.6) !important;}
.postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-other {background-color: rgba(255, 255, 255, 0.2) !important;}
body.is-withMagicUnderlines .postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-other {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(255, 255, 255, 0.2), rgba(255, 255, 255, 0.2));}
.postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-me {background-color: rgba(255, 255, 255, 0.4) !important;}
body.is-withMagicUnderlines .postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-me {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(255, 255, 255, 0.4), rgba(255, 255, 255, 0.4));}
.postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-targeted {background-color: rgba(255, 255, 255, 0.6) !important;}
body.is-withMagicUnderlines .postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-targeted {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(255, 255, 255, 0.6), rgba(255, 255, 255, 0.6));}
.postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-selected {background-color: rgba(255, 255, 255, 0.6) !important;}
body.is-withMagicUnderlines .postArticle.is-withAccentColors .u-imageSpectrum .markup--quote.is-selected {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(255, 255, 255, 0.6), rgba(255, 255, 255, 0.6));}
.postArticle.is-withAccentColors .u-imageSpectrum .markup--highlight {background-color: rgba(255, 255, 255, 0.6) !important;}
body.is-withMagicUnderlines .postArticle.is-withAccentColors .u-imageSpectrum .markup--highlight {background-color: transparent !important; background-image: linear-gradient(to bottom, rgba(255, 255, 255, 0.6), rgba(255, 255, 255, 0.6));}.u-resetSpectrum .u-tintBgColor {background-color: rgba(255, 255, 255, 1) !important;}.u-resetSpectrum .u-tintBgColor .u-fadeLeft:before {background-image: linear-gradient(to right, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 0) 100%) !important;}.u-resetSpectrum .u-tintBgColor .u-fadeRight:after {background-image: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 100%) !important;}
.u-resetSpectrum .u-baseColor--borderLight {border-color: rgba(0, 0, 0, 0.2980392156862745) !important;}
.u-resetSpectrum .u-baseColor--borderNormal {border-color: rgba(0, 0, 0, 0.4980392156862745) !important;}
.u-resetSpectrum .u-baseColor--borderDark {border-color: rgba(0, 0, 0, 0.6) !important;}
.u-resetSpectrum .u-baseColor--iconLight .svgIcon,.u-resetSpectrum .u-baseColor--iconLight.svgIcon {fill: rgba(0, 0, 0, 0.2980392156862745) !important;}
.u-resetSpectrum .u-baseColor--iconNormal .svgIcon,.u-resetSpectrum .u-baseColor--iconNormal.svgIcon {fill: rgba(0, 0, 0, 0.4980392156862745) !important;}
.u-resetSpectrum .u-baseColor--iconDark .svgIcon,.u-resetSpectrum .u-baseColor--iconDark.svgIcon {fill: rgba(0, 0, 0, 0.6) !important;}
.u-resetSpectrum .u-baseColor--textNormal {color: rgba(0, 0, 0, 0.4980392156862745) !important;}
.u-resetSpectrum .u-baseColor--textNormal.u-baseColor--textDarken:hover {color: rgba(0, 0, 0, 0.6) !important;}
.u-resetSpectrum .u-baseColor--textDark {color: rgba(0, 0, 0, 0.6) !important;}
.u-resetSpectrum .u-baseColor--textDarker {color: rgba(0, 0, 0, 0.8) !important;}
.u-resetSpectrum .u-baseColor--backgroundLight {background-color: rgba(0, 0, 0, 0.09803921568627451) !important;}
.u-resetSpectrum .u-baseColor--backgroundNormal {background-color: rgba(0, 0, 0, 0.2) !important;}
.u-resetSpectrum .u-baseColor--backgroundDark {background-color: rgba(0, 0, 0, 0.2980392156862745) !important;}
.u-resetSpectrum .u-baseColor--buttonLight {border-color: rgba(0, 0, 0, 0.2980392156862745) !important; color: rgba(0, 0, 0, 0.2980392156862745) !important;}
.u-resetSpectrum .u-baseColor--buttonLight:hover {border-color: rgba(0, 0, 0, 0.2980392156862745) !important;}
.u-resetSpectrum .u-baseColor--buttonLight .icon:before,.u-resetSpectrum .u-baseColor--buttonLight .svgIcon {color: rgba(0, 0, 0, 0.2980392156862745) !important; fill: rgba(0, 0, 0, 0.2980392156862745) !important;}
.u-resetSpectrum .u-baseColor--buttonDark {border-color: rgba(0, 0, 0, 0.6) !important; color: rgba(0, 0, 0, 0.6) !important;}
.u-resetSpectrum .u-baseColor--buttonDark:hover {border-color: rgba(0, 0, 0, 0.8) !important;}
.u-resetSpectrum .u-baseColor--buttonDark .icon:before,.u-resetSpectrum .u-baseColor--buttonDark .svgIcon {color: rgba(0, 0, 0, 0.6) !important; fill: rgba(0, 0, 0, 0.6) !important;}
.u-resetSpectrum .u-baseColor--buttonNormal {border-color: rgba(0, 0, 0, 0.4980392156862745) !important; color: rgba(0, 0, 0, 0.4980392156862745) !important;}
.u-resetSpectrum .u-baseColor--buttonNormal:hover {border-color: rgba(0, 0, 0, 0.6) !important;}
.u-resetSpectrum .u-baseColor--buttonNormal .icon:before,.u-resetSpectrum .u-baseColor--buttonNormal .svgIcon {color: rgba(0, 0, 0, 0.4980392156862745) !important; fill: rgba(0, 0, 0, 0.4980392156862745) !important;}
.u-resetSpectrum .u-baseColor--buttonDark.button--filled,.u-resetSpectrum .u-baseColor--buttonDark.button--withChrome.is-active {background-color: rgba(0, 0, 0, 0.2980392156862745) !important; border-color: rgba(0, 0, 0, 0.2980392156862745) !important; color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;}
.u-resetSpectrum .u-baseColor--buttonNormal.button--filled,.u-resetSpectrum .u-baseColor--buttonNormal.button--withChrome.is-active {background-color: rgba(0, 0, 0, 0.2) !important; border-color: rgba(0, 0, 0, 0.2) !important; color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;}
.u-resetSpectrum .u-baseColor--link {color: rgba(0, 0, 0, 0.4980392156862745) !important;}
.u-resetSpectrum .u-baseColor--link.link--darkenOnHover:hover {color: rgba(0, 0, 0, 0.6) !important;}
.u-resetSpectrum .u-baseColor--link.link--darken:hover,.u-resetSpectrum .u-baseColor--link.link--darken:focus,.u-resetSpectrum .u-baseColor--link.link--darken:active {color: rgba(0, 0, 0, 0.6) !important;}
.u-resetSpectrum .u-baseColor--link.link--dark {color: rgba(0, 0, 0, 0.6) !important;}
.u-resetSpectrum .u-baseColor--link.link--dark.link--darken:hover,.u-resetSpectrum .u-baseColor--link.link--dark.link--darken:focus,.u-resetSpectrum .u-baseColor--link.link--dark.link--darken:active {color: rgba(0, 0, 0, 0.8) !important;}
.u-resetSpectrum .u-baseColor--link.link--darker {color: rgba(0, 0, 0, 0.8) !important;}
.u-resetSpectrum .u-baseColor--placeholderNormal ::-webkit-input-placeholder {color: rgba(0, 0, 0, 0.2980392156862745);}
.u-resetSpectrum .u-baseColor--placeholderNormal ::-moz-placeholder {color: rgba(0, 0, 0, 0.2980392156862745);}
.u-resetSpectrum .u-baseColor--placeholderNormal :-ms-input-placeholder {color: rgba(0, 0, 0, 0.2980392156862745);}
.u-resetSpectrum .svgIcon--logoNew path:nth-child(1) {stroke: none !important; fill: rgba(0, 0, 0, 0.2) !important;}
.u-resetSpectrum .svgIcon--logoNew path:nth-child(2) {stroke: none !important; fill: rgba(0, 0, 0, 0.2980392156862745) !important;}
.u-resetSpectrum .svgIcon--logoNew path:nth-child(3) {stroke: none !important; fill: rgba(0, 0, 0, 0.4) !important;}
.u-resetSpectrum .svgIcon--logoNew path:nth-child(4) {stroke: none !important; fill: rgba(0, 0, 0, 0.4980392156862745) !important;}
.u-resetSpectrum .svgIcon--logoWordmark {stroke: none !important; fill: rgba(0, 0, 0, 0.6) !important;}
.u-resetSpectrum .svgIcon--logoMonogram {stroke: none !important; fill: rgba(0, 0, 0, 0.6) !important;}
.u-resetSpectrum  .ui-h1,.u-resetSpectrum  .ui-h2,.u-resetSpectrum  .ui-h3,.u-resetSpectrum  .ui-h4,.u-resetSpectrum  .ui-brand1,.u-resetSpectrum  .ui-brand2,.u-resetSpectrum  .ui-captionStrong {color: rgba(0, 0, 0, 0.8) !important; fill: rgba(0, 0, 0, 0.8) !important;}
.u-resetSpectrum  .ui-body,.u-resetSpectrum  .ui-caps {color: rgba(0, 0, 0, 0.6) !important; fill: rgba(0, 0, 0, 0.6) !important;}
.u-resetSpectrum  .ui-summary,.u-resetSpectrum  .ui-caption {color: rgba(0, 0, 0, 0.2980392156862745) !important; fill: rgba(0, 0, 0, 0.2980392156862745) !important;}
.u-resetSpectrum .u-accentColor--borderLight {border-color: rgba(2, 184, 117, 1) !important;}
.u-resetSpectrum .u-accentColor--borderNormal {border-color: rgba(2, 184, 117, 1) !important;}
.u-resetSpectrum .u-accentColor--borderDark {border-color: rgba(0, 171, 107, 1) !important;}
.u-resetSpectrum .u-accentColor--iconLight .svgIcon,.u-resetSpectrum .u-accentColor--iconLight.svgIcon {fill: rgba(2, 184, 117, 1) !important;}
.u-resetSpectrum .u-accentColor--iconNormal .svgIcon,.u-resetSpectrum .u-accentColor--iconNormal.svgIcon {fill: rgba(0, 171, 107, 1) !important;}
.u-resetSpectrum .u-accentColor--iconDark .svgIcon,.u-resetSpectrum .u-accentColor--iconDark.svgIcon {fill: rgba(28, 153, 99, 1) !important;}
.u-resetSpectrum .u-accentColor--textNormal {color: rgba(0, 171, 107, 1) !important;}
.u-resetSpectrum .u-accentColor--hoverTextNormal:hover {color: rgba(0, 171, 107, 1) !important;}
.u-resetSpectrum .u-accentColor--textNormal.u-accentColor--textDarken:hover {color: rgba(28, 153, 99, 1) !important;}
.u-resetSpectrum .u-accentColor--textDark {color: rgba(28, 153, 99, 1) !important;}
.u-resetSpectrum .u-accentColor--backgroundLight {background-color: rgba(2, 184, 117, 1) !important;}
.u-resetSpectrum .u-accentColor--backgroundNormal {background-color: rgba(0, 171, 107, 1) !important;}
.u-resetSpectrum .u-accentColor--backgroundDark {background-color: rgba(28, 153, 99, 1) !important;}
.u-resetSpectrum .u-accentColor--buttonDark {border-color: rgba(0, 171, 107, 1) !important; color: rgba(28, 153, 99, 1) !important;}
.u-resetSpectrum .u-accentColor--buttonDark:hover {border-color: rgba(28, 153, 99, 1) !important;}
.u-resetSpectrum .u-accentColor--buttonDark .icon:before,.u-resetSpectrum .u-accentColor--buttonDark .svgIcon{color: rgba(28, 153, 99, 1) !important; fill: rgba(28, 153, 99, 1) !important;}
.u-resetSpectrum .u-accentColor--buttonNormal:not(.clapButton--largePill) {border-color: rgba(2, 184, 117, 1) !important; color: rgba(0, 171, 107, 1) !important;}
.u-resetSpectrum .u-accentColor--buttonNormal:hover {border-color: rgba(0, 171, 107, 1) !important;}
.u-resetSpectrum .u-accentColor--buttonNormal .icon:before,.u-resetSpectrum .u-accentColor--buttonNormal .svgIcon{color: rgba(0, 171, 107, 1) !important; fill: rgba(0, 171, 107, 1) !important;}
.u-resetSpectrum .u-accentColor--buttonNormal.button--filled .icon:before,.u-resetSpectrum .u-accentColor--buttonNormal.button--filled .svgIcon{color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;}
.u-resetSpectrum .u-accentColor--buttonDark.button--filled,.u-resetSpectrum .u-accentColor--buttonDark.button--withChrome.is-active,.u-resetSpectrum .u-accentColor--fillWhenActive.is-active {background-color: rgba(28, 153, 99, 1) !important; border-color: rgba(28, 153, 99, 1) !important; color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;}
.u-resetSpectrum .u-accentColor--buttonNormal.button--filled:not(.clapButton--largePill),.u-resetSpectrum .u-accentColor--buttonNormal.button--withChrome.is-active:not(.clapButton--largePill) {background-color: rgba(0, 171, 107, 1) !important; border-color: rgba(0, 171, 107, 1) !important; color: rgba(255, 255, 255, 1) !important; fill: rgba(255, 255, 255, 1) !important;}
.u-resetSpectrum .postArticle.is-withAccentColors .markup--user,.u-resetSpectrum .postArticle.is-withAccentColors .markup--query {color: rgba(0, 171, 107, 1) !important;}</style><div class="highlightMenu" data-action-scope="_actionscope_3"><div class="highlightMenu-inner"><div class="buttonSet"><button class="button button--chromeless u-baseColor--buttonNormal button--withIcon button--withSvgIcon button--highlightMenu u-accentColor--highlightStrong js-highlightMenuQuoteButton" data-action="quote" data-action-source="quote_menu--------------------------highlight_text" data-skip-onboarding="true"><span class="svgIcon svgIcon--highlighter svgIcon--25px"><svg class="svgIcon-use" width="25" height="25"><path d="M13.7 15.964l5.204-9.387-4.726-2.62-5.204 9.387 4.726 2.62zm-.493.885l-1.313 2.37-1.252.54-.702 1.263-3.796-.865 1.228-2.213-.202-1.35 1.314-2.37 4.722 2.616z" fill-rule="evenodd"></path></svg></span></button><button class="button button--chromeless u-baseColor--buttonNormal button--withIcon button--withSvgIcon button--highlightMenu" data-action="quote-respond" data-action-source="quote_menu--------------------------respond_text" data-skip-onboarding="true"><span class="svgIcon svgIcon--responseFilled svgIcon--25px"><svg class="svgIcon-use" width="25" height="25"><path d="M19.074 21.117c-1.244 0-2.432-.37-3.532-1.096a7.792 7.792 0 0 1-.703-.52c-.77.21-1.57.32-2.38.32-4.67 0-8.46-3.5-8.46-7.8C4 7.7 7.79 4.2 12.46 4.2c4.662 0 8.457 3.5 8.457 7.803 0 2.058-.85 3.984-2.403 5.448.023.17.06.35.118.55.192.69.537 1.38 1.026 2.04.15.21.172.48.058.7a.686.686 0 0 1-.613.38h-.03z" fill-rule="evenodd"></path></svg></span></button><button class="button button--chromeless u-baseColor--buttonNormal button--withIcon button--withSvgIcon button--highlightMenu" data-action="twitter" data-action-source="quote_menu" data-skip-onboarding="true"><span class="svgIcon svgIcon--twitterFilled svgIcon--25px"><svg class="svgIcon-use" width="25" height="25"><path d="M21.725 5.338c-.744.47-1.605.804-2.513 1.006a3.978 3.978 0 0 0-2.942-1.293c-2.22 0-4.02 1.81-4.02 4.02 0 .32.034.63.07.94-3.31-.18-6.27-1.78-8.255-4.23a4.544 4.544 0 0 0-.574 2.01c.04 1.43.74 2.66 1.8 3.38-.63-.01-1.25-.19-1.79-.5v.08c0 1.93 1.38 3.56 3.23 3.95-.34.07-.7.12-1.07.14-.25-.02-.5-.04-.72-.07.49 1.58 1.97 2.74 3.74 2.8a8.49 8.49 0 0 1-5.02 1.72c-.3-.03-.62-.04-.93-.07A11.447 11.447 0 0 0 8.88 21c7.386 0 11.43-6.13 11.414-11.414.015-.21.01-.38 0-.578a7.604 7.604 0 0 0 2.01-2.08 7.27 7.27 0 0 1-2.297.645 3.856 3.856 0 0 0 1.72-2.23"></path></svg></span></button><div class="buttonSet-separator"></div><button class="button button--chromeless u-baseColor--buttonNormal button--withIcon button--withSvgIcon button--highlightMenu" data-action="highlight" data-action-source="quote_menu--------------------------privatenote_text" data-skip-onboarding="true"><span class="svgIcon svgIcon--privatenoteFilled svgIcon--25px"><svg class="svgIcon-use" width="25" height="25"><g fill-rule="evenodd"><path d="M17.662 4.552H7.346A4.36 4.36 0 0 0 3 8.898v5.685c0 2.168 1.614 3.962 3.697 4.28v2.77c0 .303.35.476.59.29l3.904-2.994h6.48c2.39 0 4.35-1.96 4.35-4.35V8.9c0-2.39-1.95-4.346-4.34-4.346zM16 14.31a.99.99 0 0 1-1.003.99h-4.994C9.45 15.3 9 14.85 9 14.31v-3.02a.99.99 0 0 1 1-.99v-.782a2.5 2.5 0 0 1 2.5-2.51c1.38 0 2.5 1.13 2.5 2.51v.782c.552.002 1 .452 1 .99v3.02z"></path><path d="M14 9.81c0-.832-.674-1.68-1.5-1.68-.833 0-1.5.84-1.5 1.68v.49h3v-.49z"></path></g></svg></span></button></div></div><div class="highlightMenu-arrowClip"><span class="highlightMenu-arrow"></span></div></div></div></div></div><div class="loadingBar"></div><script>// <![CDATA[
window["obvInit"] = function (opt_embedded) {window["obvInit"]["embedded"] = opt_embedded; window["obvInit"]["ready"] = true;}
// ]]></script><script>// <![CDATA[
var GLOBALS = {"audioUrl":"https://d1fcbxp97j4nb2.cloudfront.net","baseUrl":"https://hackernoon.com","buildLabel":"34899-e9ef7b0","currentUser":{"userId":"f829b8959ad2","username":"cobus.olivier.co","name":"Cobus Olivier","email":"cobus.olivier.co@gmail.com","imageId":"0*1avnlthxeQwsrBav","createdAt":1535455837078,"isVerified":true,"subscriberEmail":"","googleAccountId":"103152184601849916198","googleEmail":"cobus.olivier.co@gmail.com","hasPastMemberships":false,"isEnrolledInHightower":false,"isEligibleForHightower":true,"hightowerLastLockedAt":0,"isWriterProgramEnrolled":false,"isWriterProgramInvited":false,"isWriterProgramOptedOut":false},"currentUserHasUnverifiedEmail":false,"isAuthenticated":true,"isCurrentUserVerified":true,"language":"en-us","miroUrl":"https://cdn-images-1.medium.com","moduleUrls":{"base":"https://cdn-static-1.medium.com/_/fp/gen-js/main-base.bundle.Poh0GMaA_gQRPgI8lOEEjA.js","common-async":"https://cdn-static-1.medium.com/_/fp/gen-js/main-common-async.bundle.4bW7T_abyC_4MYqPFTYsYg.js","hightower":"https://cdn-static-1.medium.com/_/fp/gen-js/main-hightower.bundle.EdTatmBFd15-Geo2yAYfiQ.js","home-screens":"https://cdn-static-1.medium.com/_/fp/gen-js/main-home-screens.bundle.lRTYigdVVlB94U7uxuh65g.js","misc-screens":"https://cdn-static-1.medium.com/_/fp/gen-js/main-misc-screens.bundle.SaKhJlOJVRX6ywxd6YdLCg.js","notes":"https://cdn-static-1.medium.com/_/fp/gen-js/main-notes.bundle.rwz5u9E5cbVAaErsvQ4l9g.js","payments":"https://cdn-static-1.medium.com/_/fp/gen-js/main-payments.bundle.WN9cEUGg9jE0qHpBAS6uIQ.js","posters":"https://cdn-static-1.medium.com/_/fp/gen-js/main-posters.bundle.o7El3pb1BFaMU6cEzH15sw.js","power-readers":"https://cdn-static-1.medium.com/_/fp/gen-js/main-power-readers.bundle.sgtyn71JbEficFG6hy2Yyg.js","pubs":"https://cdn-static-1.medium.com/_/fp/gen-js/main-pubs.bundle.sjWDggPquLPeW96CN7dWGQ.js","stats":"https://cdn-static-1.medium.com/_/fp/gen-js/main-stats.bundle.Y3Uyd4qLJcWjnUEWtYjxXw.js"},"previewConfig":{"weightThreshold":1,"weightImageParagraph":0.51,"weightIframeParagraph":0.8,"weightTextParagraph":0.08,"weightEmptyParagraph":0,"weightP":0.003,"weightH":0.005,"weightBq":0.003,"minPTextLength":60,"truncateBoundaryChars":20,"detectTitle":true,"detectTitleLevThreshold":0.15},"productName":"Medium","supportsEdit":true,"termsUrl":"//medium.com/policy/9db0094a1e0f","textshotHost":"textshot.medium.com","transactionId":"1536831679293:982999998745","useragent":{"browser":"chrome","family":"chrome","os":"windows","version":68,"supportsDesktopEdit":true,"supportsInteract":true,"supportsView":true,"isMobile":false,"isTablet":false,"isNative":false,"supportsFileAPI":true,"isTier1":true,"clientVersion":"","unknownParagraphsBad":false,"clientChannel":"","supportsRealScrollEvents":true,"supportsVhUnits":true,"ruinsViewportSections":false,"supportsHtml5Video":true,"supportsMagicUnderlines":true,"isWebView":false,"isFacebookWebView":false,"supportsProgressiveMedia":true,"supportsPromotedPosts":true,"isBot":false,"isNativeIphone":false,"supportsCssVariables":true,"supportsVideoSections":true,"emojiSupportLevel":1,"isSearchBot":false,"isSyndicationBot":false,"supportsScrollableMetabar":true},"variants":{"allow_access":true,"allow_signup":true,"allow_test_auth":"disallow","signin_services":"twitter,facebook,google,email,google-fastidv","signup_services":"twitter,facebook,google,email,google-fastidv","android_rating_prompt_recommend_threshold":5,"google_sign_in_android":true,"reengagement_notification_duration":3,"browsable_stream_config_bucket":"curated-topics","enable_dedicated_series_tab_api_ios":true,"enable_post_import":true,"available_monthly_plan":"60e220181034","available_annual_plan":"2c754bcc2995","disable_ios_resume_reading_toast":true,"is_not_medium_subscriber":true,"glyph_font_set":"m2","enable_branding":true,"enable_branding_fonts":true,"enable_multirecommends":true,"enable_post_monger_v2":true,"enable_post_monger_v3":true,"enable_fastrak_beta":true,"enable_fastrak_beta_opt_out_toggle":true,"enable_user_post_metering":true,"enable_star_meter_ui":true,"max_premium_content_per_user_under_metering":3,"enable_metered_out_email":true,"enable_automated_mission_control_triggers":true,"enable_top_stories_for_you":true,"enable_ios_member_post_labeling":true,"enable_lite_profile":true,"enable_li_search_collection":true,"enable_signin_wall_custom_domain":true,"app_download_email_template":"control","enable_topic_lifecycle_email":true,"enable_marketing_emails":true,"ios_hide_avatars_on_home":true,"android_disable_author_avatars":true,"enable_truncated_rss_for_tags_and_topics":true,"enable_ios_related_reads_api_change":true,"enable_ios_related_reads_ui_large":true,"enable_ios_responses_collapsed":true,"enable_rex_service_daily_digest_top_posts":true,"enable_parsely":true,"enable_branch_io":true,"enable_synchronous_parsely":true,"enable_distributable_post_post_similarity_table":true,"enable_post_stats_page":true,"enable_ios_post_stats":true,"enable_reader_interests":true,"enable_prepublish_flow_2":true,"enable_prepublish_flow_2_unlisted":true,"enable_prepublish_flow_2_inline_visibility":true,"enable_lite_topics":true,"enable_lite_stories":true,"enable_lite_billing_history":true,"enable_ios_payment_page_v2":true,"annual_renewal_reminder_email_variant":"fun","enable_annual_renewal_reminder_email":true,"enable_sift_integration":true,"enable_sift_science_webhook":true,"enable_quality_assurance_queue":true,"enable_writer_controls":true,"enable_september_meter_email_test":true},"xsrfToken":"Y271lqnkasioiV90","iosAppId":"828256236","supportEmail":"yourfriends@medium.com","fp":{"/icons/monogram-mask.svg":"https://cdn-static-1.medium.com/_/fp/icons/monogram-mask.KPLCSFEZviQN0jQ7veN2RQ.svg","/icons/favicon-dev-editor.ico":"https://cdn-static-1.medium.com/_/fp/icons/favicon-dev-editor.YKKRxBO8EMvIqhyCwIiJeQ.ico","/icons/favicon-hatch-editor.ico":"https://cdn-static-1.medium.com/_/fp/icons/favicon-hatch-editor.BuEyHIqlyh2s_XEk4Rl32Q.ico","/icons/favicon-medium-editor.ico":"https://cdn-static-1.medium.com/_/fp/icons/favicon-medium-editor.PiakrZWB7Yb80quUVQWM6g.ico"},"authBaseUrl":"https://medium.com","imageUploadSizeMb":25,"isAuthDomainRequest":false,"domainCollectionSlug":"hacker-daily","algoliaApiEndpoint":"https://MQ57UUUQZ2-dsn.algolia.net","algoliaAppId":"MQ57UUUQZ2","algoliaSearchOnlyApiKey":"394474ced050e3911ae2249ecc774921","iosAppStoreUrl":"https://itunes.apple.com/app/medium-everyones-stories/id828256236?pt=698524&mt=8","iosAppLinkBaseUrl":"medium:","algoliaIndexPrefix":"medium_","androidPlayStoreUrl":"https://play.google.com/store/apps/details?id=com.medium.reader","googleClientId":"216296035834-k1k6qe060s2tp2a2jam4ljdcms00sttg.apps.googleusercontent.com","androidPackage":"com.medium.reader","androidPlayStoreMarketScheme":"market://details?id=com.medium.reader","googleAuthUri":"https://accounts.google.com/o/oauth2/auth","androidScheme":"medium","layoutData":{"useDynamicScripts":false,"googleAnalyticsTrackingCode":"UA-24232453-2","jsShivUrl":"https://cdn-static-1.medium.com/_/fp/js/shiv.RI2ePTZ5gFmMgLzG5bEVAA.js","useDynamicCss":false,"faviconUrl":"https://cdn-static-1.medium.com/_/fp/icons/favicon-rebrand-medium.3Y6xpZ-0FSdWDnPM3hSBIA.ico","faviconImageId":"1*8I-HPL0bfoIzGied-dzOvA.png","fontSets":[{"id":8,"url":"https://glyph.medium.com/css/e/sr/latin/e/ssr/latin/e/ssb/latin/m2.css"},{"id":11,"url":"https://glyph.medium.com/css/m2.css"},{"id":9,"url":"https://glyph.medium.com/css/mkt.css"},{"id":10,"url":"https://glyph.medium.com/css/elv8.css"}],"editorFaviconUrl":"https://cdn-static-1.medium.com/_/fp/icons/favicon-rebrand-medium-editor.3Y6xpZ-0FSdWDnPM3hSBIA.ico","glyphUrl":"https://glyph.medium.com"},"authBaseUrlRev":"moc.muidem//:sptth","isDnt":false,"stripePublishableKey":"pk_live_7FReX44VnNIInZwrIIx6ghjl","archiveUploadSizeMb":100,"paymentData":{"currencies":{"1":{"label":"US Dollar","external":"usd"}},"countries":{"1":{"label":"United States of America","external":"US"}},"accountTypes":{"1":{"label":"Individual","external":"individual"},"2":{"label":"Company","external":"company"}}},"previewConfig2":{"weightThreshold":1,"weightImageParagraph":0.05,"raiseImage":true,"enforceHeaderHierarchy":true,"isImageInsetRight":true},"isAmp":false,"iosScheme":"medium","isSwBoot":false,"lightstep":{"accessToken":"ce5be895bef60919541332990ac9fef2","carrier":"{\"ot-tracer-spanid\":\"314878be59666b8a\",\"ot-tracer-traceid\":\"7da204ae2fd77770\",\"ot-tracer-sampled\":\"true\"}","host":"collector-medium.lightstep.com"},"facebook":{"key":"542599432471018","namespace":"medium-com","scope":{"default":["public_profile","email"],"connect":["public_profile","email"],"login":["public_profile","email"],"share":["public_profile","email"]}},"editorsPicksTopicId":"3985d2a191c5","popularOnMediumTopicId":"9d34e48ecf94","memberContentTopicId":"13d7efd82fb2","audioContentTopicId":"3792abbd134","brandedSequenceId":"7d337ddf1941","isDoNotAuth":false,"goldfinchUrl":"https://goldfinch.medium.com","buggle":{"url":"https://buggle.medium.com","videoUrl":"https://cdn-videos-1.medium.com","audioUrl":"https://cdn-audio-1.medium.com"},"referrerType":1,"isMeteredOut":false,"meterConfig":{"maxUnlockCount":3,"windowLength":"MONTHLY"},"partnerProgramEmail":"partnerprogram@medium.com","userResearchPrompts":[{"promptId":"li_post_page","type":0,"url":"www.calendly.com"},{"promptId":"li_home_page","type":1,"url":"mediumuserfeedback.typeform.com/to/GcFjEO"},{"promptId":"li_profile_page","type":2,"url":"www.calendly.com"}],"recaptchaKey":"6LdAokEUAAAAAC7seICd4vtC8chDb3jIXDQulyUJ","paypalClientMode":"production","signinWallCustomDomainCollectionIds":["3a8144eabfe3","336d898217ee","61061eb0c96b","138adf9c44c","819cc2aaeee0"],"countryCode":"ZA","bypassMeter":false,"branchKey":"key_live_ofxXr2qTrrU9NqURK8ZwEhknBxiI6KBm"}
// ]]></script><script charset="UTF-8" src="./The definitive guide to Express, the Node.js Web Application Framework_files/main-base.bundle.Poh0GMaA_gQRPgI8lOEEjA.js.download" async=""></script><script>// <![CDATA[
window["obvInit"]({"value":{"id":"649352e2ae87","versionId":"ab9094050a6","creatorId":"fe1c14f6cde","creator":{"userId":"fe1c14f6cde","name":"Flavio Copes","username":"flaviocopes","createdAt":1402434519132,"lastPostCreatedAt":1536402505397,"imageId":"1*EhDax362AQ39b-_vSUMO2Q.jpeg","backgroundImageId":"","bio":"I write tutorials for developers at https://flaviocopes.com","twitterScreenName":"flaviocopes","socialStats":{"userId":"fe1c14f6cde","usersFollowedCount":7,"usersFollowedByCount":4264,"type":"SocialStats"},"social":{"userId":"f829b8959ad2","targetUserId":"fe1c14f6cde","type":"Social"},"facebookAccountId":"","allowNotes":1,"isNsfw":false,"isWriterProgramInvited":false,"isPartnerProgramEnrolled":false,"isWriterProgramEnrolled":false,"isWriterProgramOptedOut":false,"type":"User"},"homeCollection":{"id":"3a8144eabfe3","name":"Hacker Noon","slug":"hacker-daily","tags":["HACKATHONS","HACKING","PROGRAMMING","TECH","HACKER"],"creatorId":"3ba40c3346c4","description":"how hackers start their afternoons.","shortDescription":"how hackers start their afternoons.","image":{"imageId":"1*76XiKOa05Yya6_CdYX8pVg.jpeg","filter":"","backgroundSize":"","originalWidth":8346,"originalHeight":8346,"strategy":"resample","height":0,"width":0},"metadata":{"followerCount":370901,"activeAt":1536830161548},"virtuals":{"permissions":{"canPublish":false,"canPublishAll":false,"canRepublish":false,"canRemove":false,"canManageAll":false,"canSubmit":false,"canEditPosts":false,"canAddWriters":false,"canViewStats":false,"canSendNewsletter":false,"canViewLockedPosts":false,"canViewCloaked":false,"canEditOwnPosts":false,"canBeAssignedAuthor":false,"canEnrollInHightower":false,"canLockPostsForMediumMembers":false,"canLockOwnPostsForMediumMembers":false},"isSubscribed":false,"isNewsletterSubscribed":false,"memberOfMembershipPlanId":"","isEnrolledInHightower":false,"isEligibleForHightower":false},"logo":{"imageId":"1*1HcGNZYjo78mH0faO3BnaQ.png","filter":"","backgroundSize":"","originalWidth":3600,"originalHeight":432,"strategy":"resample","height":0,"width":0},"twitterUsername":"hackernoon","facebookPageName":"hackernoon","publicEmail":"stories@amipublications.com","collectionMastheadId":"628349c2609a","domain":"hackernoon.com","sections":[{"type":2,"collectionHeaderMetadata":{"backgroundImage":{},"logoImage":{"id":"1*1HcGNZYjo78mH0faO3BnaQ@2x.png","originalWidth":3600,"originalHeight":432,"alt":"Hacker Noon"},"alignment":2,"layout":5}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["8a990ecb82a9","18a1a624e3b0"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["649352e2ae87","e4676986c89c"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["d8232bd0f39b","a4c8a2db26ad","be70a760a5f"]}},{"type":1,"postListMetadata":{"source":3,"layout":5,"number":2,"postIds":["469ba77d6c42","76045c58ca55"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["8df8c5a5dcd8","55f1a7cfd596","db8b79cbc4eb","3e783b409e52","3b5c6dc78708"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["5e2d252dbd08","1c4ce5c33d9e","4e2f8fbe87b0"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["636ef725cb1c","352409ad2c0b","e738b9668e94","e2636d9c2fd9","c984b020d186","9467aac7e05","6da90ca32189"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["f8a9df5b7758","ce91d7ab738f"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f2ecad74a597","26e6a27b3a0b","e44aa5373479","892108fd0d","2229a2b3732","7d8d5579a2c3","f012a989113"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["d63286fdbbac","820ae76beb95","f188169e5d3b"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["aae095126cfe","9ccddba55e54","ced61f4ac6"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["930b1b7e960b","f6eb7626ff96","a5b19901056e","ae537fc1a6d","a7112b43f016","f012a989113"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":4,"postIds":["3065028897a3","4440235f2bca","c750f9bf56a0"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["56d301675117","830dd607dad7","3b5c6dc78708","1ec601356af3","e44aa5373479"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"e1bbaf203d83"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"3f7e6af7c199"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["14c1c912e85b","f9bac8e5a1c9","82f98ef4f381","2d19046e90ee","db26cd444f9b","9f926798da29","b885b3a43fb4"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":5,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["4e3efed8649b","406c97cb311","a1ac874710a5","3c3e37f358dc"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["24ffd53c052b","88e77d2b39af","f778555d5a1f"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"7e1ab4bb4c4d"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["b0cd22a4c159","7238d13ebfea","a5792e90c836"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["e1d8cbda8543","2ddaf52ad862","e62ee790238e","399fcd21507e","ac9bfbf2f6b3","469c11b48b8d","4d2ffcaa9d0b"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":2,"layout":3,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["911ac23ab4f5","88113e885f56","3beaf62a01bb","88570ddce7d7","4e5407d0c68"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"e2e8c20bd949"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":9,"postIds":["8d44b54be055","c13cc138378a","b0bdfe028dd2","f52088213026","f778555d5a1f","f93764d64a8c","45004a23e8a7","1332a0877a6a","a1a0c8ea0695"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["a803d05e5ce3","14379e0e23ad"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"206d59e13d50"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["3d38422333b","1b4d29a0d7b4","640a254ee38c"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["fbfaad80aa25","a947404ff36e","86e53392d9bc","68b9b46fd1ab","676de6fb555f","61dfecbe2090","731973698385"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["44f4af1249b1","30cd4b9c6230","604ae27693e8","1021dbe7ecb1","713149eb9a21","7c8de164e423","f1baed075d1b"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["22dab6d98d0e","edea6ff5c5ea","e5ad483f85f2","bb3bcc4b347f","cc7816ff9cd3","f49ca6095054","6329696702a6"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["5a7042ca5fc","9ab9d749eeb1"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["afc5e9248c4c","19a3aa295642"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["f2d443eba35","c70ceac0f264","9df549af73e9","81df3330b938","235b60005d04","ea94805cf05d"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"f25bb1325a64"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"912ab169c2e1"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"3a46abfda389"}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["8efcf6d28322","b1a0733ccc93","2d5eec68f52b"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["81ddaa31de06","a6cd177dacf4"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["3351907ca6cd","dd5feb558e45"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["c38970a181bc","dea6542cdb64","a6824b6dcbd4","d412827a66c9","8a86b749545f"]}},{"type":3,"promoMetadata":{"sectionHeader":"Meet Our Weekly Sponsor!  ","promoId":"7e1e27aac372"}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["89aeed8322dc","fd8548f04777","5d019f4e014a"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f815eb19cd97","24e916ebb4c4","7a9374cbe12e","36a13723a454","fab973708146","a0dca457faef","1eeb6561549d"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"ca7621b9b007"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"dd039baaa823"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"80a850e5020b"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["ac6e9b04fcb6","2836251922e0","1627fa3f6936"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["73fb1b818f35","f3a1c599daef","b976da1ebd35"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["20c134d5050e"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["bdefac3656b7","f561fc21784","3ad489d6ff3f","abf74266c442","65343f18e5e4"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":3,"postIds":["ddb91ecec2e0","448675592803","4ed162db5777"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":1,"postIds":["afc5e9248c4c"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["b93a2b63c1a6","43e7708515ab","9cf0a05e4995","8d7b28133809","b91d3d770366","4a398889fe68"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["b91d3d770366","416b9e0284f3","e3f669d96033"]}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["aeb3e6f02077","e3f669d96033","56ba6335778b","7484fbdbcb31","2f871f298cbb"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["b2ce18d5b054","ee39c9b12ac0","9cc362a1343","cb8c9b016f9d"]}},{"type":3,"promoMetadata":{"sectionHeader":"Meet Our Weekly Sponsor!  ","promoId":"bff30d2f35b4"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["70b4f581ee4e","433171581d01","9241df07c18b","f5205ff483cf","25675234273d","bf398bc0e99b","b0f0ee83c982"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"Meet Our Weekly Sponsor!  ","promoId":"a5b9e0de6107"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["cc749ae14905","798c0ff3d26c"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":6,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["4af75b292135","c4d81adb146d","a756faf1bb03","6d01945ac262","65eb061b907b"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["b4122f657e44","8c305120e06a","9df493a8ce16","58e9ef855d3e","d9bb33bb62ed","c2828693f68f","390680e0e04e"]}},{"type":3,"promoMetadata":{"sectionHeader":"Meet Our Weekly Sponsor!  ","promoId":"65be46fc82ae"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["eea7ccd0eed2","223907ec298b","9a9d8e993be0"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":7,"postIds":["bbf9496b35bb","2d1651dece6f","a4e772c60f5f","44d71313364e","a1f71cc260ce","e127bc7a6fb5","480a90c5e7f9"]}},{"type":3,"promoMetadata":{"sectionHeader":"Meet Our Weekly Sponsor!  ","promoId":"d47cc296aef5"}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["c87cc77d723f","ed253e5b3594"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":8,"postIds":["cd6619cd4d59","52935c848f9c","81938689c79d","be9014a7ba","1136ed550bb2","6967985cc1db","3af569c7ac52","e56863694e1c"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["e7f05d90d961","8429229301ce","aa70fedfb1aa","19370ba1a356","d0b952baccdd","e1d8cbda8543","9832c11cf9b3"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"84c29054e7dd"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"8f2ae56c251c"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"bfd9d5ea6ede"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["1e8b50df3655","76425bef8d6b","ae7e7ebe0996","875cac6c172d","bb5f75d7ef79"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":1,"postIds":["ed253e5b3594"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["6144df75fe03","120132be508","bfdfff86fc5b","9f60e4130b78","6140e1c2a46b","11938fed397b","c6e412d0b9ab"]}},{"type":3,"promoMetadata":{"sectionHeader":"Meet Our Weekly Sponsor!  ","promoId":"711ef50ccbdb"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["2f2c9f9fcdbf","3769c6bde9cb","a4c46a608df8","1cdfaecb4851","c3ed049e8d91","cb9bdcbb5a67","5bbf3874496"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":8,"postIds":["4d0d916b9f78","d5a8b1a98dd8","292fa64bdaef","77de2155ce45","cf41f83de5ec","55d5f5283386","cf3a39aa95de","65cf7cb4c75a"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"3cd9168184aa"}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["8beaa863653b","5c78db3999b2","2cd7248ee623","cdae29f91ba0","4867f66da1e5","e5074b6fe55b"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["684817c8bff2","1f30545af17a","6639f46ba416","c90964a885fc","5c1f2ef18695","1f4c9cc0eca1","316bad449279"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["8067ec4cf7e5","f79f872224ad","e0c457884d2e"],"sectionHeader":"cheers! to independent tech media!!"}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["14060d66027b","582d0b35e2ac","b032e09140f4"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["54e65781acf1","a8b5a3415227","56c2d6689677","95c336f6b747","7915f23339a0","39fa9955e8cf","2a4dd2a62398"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["59164b1d25c9","a4f29c718b57","e011c3cda55e","f873664fce5b","651891ebe1e4","2a9253ccdd6","46e50438ed5b"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["af7a696e02cd","3d2dc4c2e029","a9f343b2239"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["6aae4cb26bbf","890b91e0822","fb35e9fc9b8f"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["77774f7730fe","b644dbeb6a21","f985f1472b9","43fa156719b4","14f7608e743a","856bbcbd8f49","16dbbbcfee9"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"e9e2cb0c807d"}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["540e8f46fbfb","7ac3357dfcab","3b0c9475412d","49c4bdabc0df","82f9c6b4cd6c","cddb29953aee"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["acb0d97c83c8","de5014f2bdf3","79387767830b"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["e9f9b2d4248b","f73ec1d2c70d","b644dbeb6a21","ce56d591af","44abfe48240d","323751799664","b6088f650605"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"cfc4622cb9ef"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"357550d9c823"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["fc6863e41b2a","ce24b611f0f5"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":5,"number":8,"postIds":["6d5034ff1eec","e0c457884d2e","3b5f03cf180f","514d8399b97c","dcb687766b23","40aeb2e4f7fa","fbf14610305","a69091083f91"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["50c161fbdcf6","e9c4b4b7d08f","1efd3a963111","adf61869cd79","9f306e57db8f","7364370b7b95","c7be9b17ae54"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":5,"number":2,"postIds":["36b28417f399","ccc259f2f1a5"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["b497c92d0b49","fbff41c4d5db","f28ff0f1bd8e","a0de334b5e8d","10188479699d","d39cb6f6feaa","b497c92d0b49"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"31a43072dc37"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"49a7eeaf669f"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"a548490580d2"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"e19ad0b082c5"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["128dff535a08","14060d66027b","161f03b04149"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"45b34a100b3e"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":8,"postIds":["6a35bcf34f7f","e8123d6a4199","6a6ca5d3637b","e9526066ddb8","68ff19441599","6213e105b00b","1002449ad474","86d6e55a5b34"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"fd1bd1a10478"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"8663d9e83c0e"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["c545353b7e4c","b520588eb345"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["e9049858f43e","4200c86ba513","8d8a9e7d3bac","57b186769d8f","36209dd6f6a8","d94c88cd4475"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["fd62a9809d94","5471f1935ff3","8b48b2cefc63","4a87ff2509c9","77b78d0a3c34","c20d18ed5b43","293514a516fd"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["330d8202825b","80d71f19dc11","f1efb0b361b"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"fa90a1708db"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"3e591077534d"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"6d9affab575d"}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":4,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["28acd1da0371","7c9ab96a7779","54ec79a47215","e42e49b524c5","e80ae1dc5e82","7c7f39916e","f0c2c5ab9e95"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["bf8ad832e0c8","6c22f14208ba","d3429200a1da","92543078551b","8178f4e058e1","59e593ff9f07","4556e5a9060e"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"e4c58baa5135"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["e2b4bfcd4d7e","30d8b9fd7f6a","ea22b7b7fcaa"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["5bb9a7b7ae11","31882fb6ab9c"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":8,"postIds":["ed99312f3d24","a55e3685f7a2","330d8202825b","574da50e6d88","e19fbe265e03","912301a287e9","d2fae1c68a88","b1d81c02d6cf"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"de8ac0687ae8"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"834a8f38c283"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["5bb9a7b7ae11","f135e2de9a1b","f13025af3ebc"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["a33da2d1f5d1","19af3ffef9e0","5f2c0a0850df","91484ceaf5d5","6b5f836c2b","c06a6b052838","8e532e436402"]}},{"type":1,"postListMetadata":{"source":1,"layout":3,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":1,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["4c5c326ee1a6","2384451f2f5b","3d63213c8370","960f7c987176"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["a08ab06b6ebf","68126944ce1f"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["5af99ff115c9","86ed41383d36","40c5448c066","133320bcb52f","b4010e9b962f","8140d3f7d3a3","2e469b762ba9"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["b0b8a6fda52a","4cae22e22fb","feb51b4bd99c"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["7851d0d77ebc","db3f76d9e9e7","d1aba226da43"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"230369e3cb80"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["35697427960"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["8398548f27be","582d0b35e2ac","8a7afd388bbe","d598e266762d","f27bb956eb8c","7251face1ad2","8ec69749b61b"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["73db0440ad26","4c5c326ee1a6"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"1e01bd79dd04"}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":3,"postIds":[],"tagSlug":"Story Licensing","sectionHeader":"Learn more about our newest digital publishing product: StoryLicensing.com"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["aa35b6e0f405","23d2428afda3","17ad575230a8","51da93530623","bb8512c70857","c0b883a7f460","fe7a98c0759"]}},{"type":1,"postListMetadata":{"source":1,"layout":3,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["a6f8ce6ac0b4","b0ffb26d33ea","66a34985249e"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["b8a451784dab","480072581f1b"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["266c136fc55d","9b759ca21cda","ef937e919ec2","e23df3d2e4be","480072581f1b","f1f203e9a4ef","72c22c75193f"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":5,"postIds":[],"tagSlug":"Github"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["cc8ff4f5199b","8250d69fd079"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["c429327cf577","f8f480448057","1882afc527bf","e5a58ab051e4","39ce7b036da2","fc552254ebf4"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["e3a615747dd5","56171e6e26c3","dc4824795d9"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["b3563722e856","a5c6d9549be2","50813d12aa46","909b48eb318b","706072f301b","a85edaa5e37a"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["6613d33229af","81616ac3e89e","1c93afec3066","2d3146a82c2e","f7e64a650b67","e972134c1cba"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["406445177a80","7cd1123cbdad","7199b686b6c1","3f9ece85983d","9901caca4fd5","bebc0700047c"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"f2d9903b5b4a"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":6,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["4dae4827841b","b42873eba509","f3f365ffca76"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[],"sectionHeader":" The Latest Stories on Hacker Noon:"}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"More of the Latest Hacker Noon stories:"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["2b650b5f4f62","6cbb1f0b6726"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f4d0ce28574f","c1fa8f4260d","c7eaab3511fa","32d018c46b06","23f944203598","3288b789b85d","5b4c28bc8824"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["11dc203890b","11b545c0a3f0","da7fcaad05c9","3fe23be5c19e","6d45fdd26721","79ebf0461b9c","4f82bd3eb62d"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":5,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["d641f1714903","973d904bf28b"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["79ebf0461b9c","59fee84a9ed9","ef3add0fa202","f0702143be08","b69a91598f5a"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"e2b2b6e2e85d"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":1,"postIds":["8142f8277c50"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["216dcba55d35","5ca310455019","6864bed9349f"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["d1bfebcb3a21","f102d0c50a7d","f4f719532b64"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["3fa6ec61fab2","9d440dcec825"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"6d460003f6fb"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["83ef7260cbf1","c42a95a8f884","7cd116cc5347","bc0b08312fa","861990a7320a","be5c30184e13","6fcd1b49cffa"],"sectionHeader":"Tech 101 Stories "}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"d41c74ae0d0a"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["5fef0df0f00d","e95100f7c7b1","2fc7becd6852"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["4f4f2ac214c","de999a41e047","b87cc694ca7d","6394a645478d","df77da680219","d46783a33881","8d33351e59c0"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["6af7ceb0d8a3","16f87f17cb4d"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"82f867b3a9f0"}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["58c0c2da8a7b","4286f6c98cdc","3a0ce661642a"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["6b2677044214","8b9a83f2aa23","e9f0e3ed36a6"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["899949ec555b","1476db95eaab","31afba7fc044","3f174d50708e","117428612f46"]}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":3,"postIds":[],"tagSlug":"Hackernoon Letter"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["9935e1c72019","a278c726315","824ff4b3ea19","5e5023dc1c75","a2cc855ce9ae","d0225be35b53","cd840fe3c79b"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["41562cfe910b","7886aef60b4a","98a93c5cf335"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"793f2cc02d19"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["b5b88baab63b","9abb40005d15","695333d8f92b","84947b6e1854","c320c860019a","6cd6501d261e"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["44f237982d95","9935e1c72019","48eb1b90a834"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"e9784f75d4eb"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["6d36690f511f","243bdfa2c3fc","a278c726315","8918084095a6","6eb87a79b39","cc7ecb8b3e70","bca86435c878"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":6,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"5c287d7d6e2d"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["26588a660afe","680dfa213aa6"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"942c8f6c414"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["6090a9abe813","aeaa1f5eee80","5a329ea6813e","c2b22d7cf95a","188ea18527a2"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["73d60e08b85a","7dd8a85f299b","9e13678041fe","565637747557","d33aee2f699c"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["2a1779c4db7b","8f9e22d49353","6104453bbfdb","907a08a3630","16a96b04125f"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"fe33e0367f6b"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["4b2959c03a35","3b91562c9b3c"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["11abea97a88c","a35ced0d1871","914dd392b33e","72355c1ffc33"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["cdffbb6bd6b9","598988b15748"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":8,"postIds":["fa9f4ce822ed","9c996d352af3","1c298570d191","14379e0e23ad","230fd9bb61f4","806ec0ecd60","21c239c1d5a7","9149e0267e6d"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"2e556522b3e2"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"54b9084a116f"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["5d12f84f9824","d3be086effa0","dad55578062c","e9f2f7b31b0e"],"sectionHeader":"\"Are you raising $$$? We raise $$$ everyday from our customers\" -Sahil Lavingia"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f3073c725232","71c8be58948e","9b9b66a50aac","4c65613c2db9","7addac683285","ccab7b5552de","6a4c5cf3cc89"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"c28219e53f1b"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["4e3efed8649b","de1a3cef2341"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["1f0b2c7370d9","692bf676b05","47b5575d4e20","5c4fa340f2c2","13d92a6df5f3","a56be62b1f95","6e92f79fa66b"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"9a707f3516a4"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["94be921e6354","2d69aebe715b"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["7302bcc3901e","668f97c138b1","1781df7ebdd1"],"sectionHeader":"Recommended Tech Books"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["fb19314afdaa","60edfbe60786","1478c2eafb20","f776080ac8d9","5b485ebbe99c","bb15c6c1e163","c9bb2b6d1acb"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"fad5e7f4d8fa"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["5b13b1ebcd4e","8372628154c3"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["3d7e0d72213f","34c2d8ced7f1","aefb24529c4f","53d4e7ab19cc","6e1379f0caf7","ef54815873f9","7e75481a798c"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["b12e85aa7d17","513d78add55","364bfc96560","15ba02ddf4a3"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["97867fc06f2b","8933fe2ae51c","139c0dcd3245","b85b079ac45f","b80d0f8ae906","f0d27634ef91","8be7577d925"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["d25024db07d5","1b5f53ab69e0"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["9dbc05f2e41f","5b13b1ebcd4e","ab45446edb11"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["502dbcaeabaf","a6640ac69325","109670038859","d8f2d8cc2c15","d20b2dbecc07","9e4c258ec9fb","32aadc8e773a"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["3febe4574467","d61d064f2fc6","3680c4524fbd","865dc2c06528","4b8dcb756937","6dc138061235","67754743d494"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"94fa23e3f13e"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["c1c4ffb4ebf4","c2385e0d2f89","b85b079ac45f"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["bf27e4837151","89170c501e4c","737d2206545a","13b08b512bcd","a6640ac69325"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"684c6c2c49cb"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["f1115739e76b","9a8cb347c5b5","b9224e44d3ad"],"sectionHeader":"Tech can be scary..."}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["117428612f46","837276200b9f","21f9a470160f","af5b9ef41aa","ee81374c01aa","396f6953f844","596ad4d4c085"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":1,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":8,"postIds":["a9664c76336f","3103e26fddd8","e1ef8c98b605","a7b19508d9f4","5a7b2562f3c9","dc8690bf41f7","117428612f46","54d14e279552"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["34bdd3cbec4b","c9146716e0cb","21362adba27a","1227aa782d","a004746d2ff5","f928dbb145eb","95e7256b6854"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["b7c3bbe0b0d7","618282a1a9ec"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["319ae47117e6","60c5b399100e","4e94c8e7e5c1","afc7edfe3913","3e9a7643152b","62ebeb5f39c5"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["692c51030342","eeb07486230b"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"7c637d313bd8"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["6f71868902b7","1851667c726","c8070c5b901f"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"b22fb67c4117"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["c465669cff48","7b42b1033c4e","8804905db43e","5d10d72f14d1","e9d5266d13f7","bd361d0086e","55cf2b8e6fa2"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"1631885336c"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["94be921e6354","2d69aebe715b"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["b8566cc3fe8f","e824e9c2a4ef","1584f19a7eec","74dc65d5d058","8ef06e2b43f7","7dddf8d635e4","5e6de1b61a6b"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"e8740b08c8b1"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["6bd7607d537e"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":8,"postIds":["a1cf2ca834eb","a868606a6f0c","959dc53238b7","aa868bc549e4","4567d67ea773","d2655df479bc"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"937f8dffb138"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["9a8cb347c5b5","844f739659b9"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["47e0aaefd624","b9df618d53b4","862c01d07f30","ac22fbf07e0c","5955b71536d4","c0ace26d21c9","692c51030342"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["a71a6d788ad5","2b06e7ffd843","11b8b360617c"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["d1ce3ab0f047","69a6bd2c6842","2332a29e00a7","cf3fac75dcf7","77c6db5ee192","661de3e32976"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["3d67a3a8be93","94c890a36c0b","e541f1387592","a398a9a029a7"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"ead6f9956e53"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["5db88b79ce61","fce011e7d87","d37207dec27f"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":8,"postIds":["e1c6d3044dae","eb4eb32cc4f8","6d508cfc70c9","ca39c6407d48","7144566c54f9","3e7030748810","499579033214","3878a05713f2"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["644a0d6d048","5beb2cc6bbfa"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"9541290ea94c"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["fccd630d73d1","2ae7c61a6b2b","11f7a1bba400","945f734e43d5","d7ba9c0fffb6"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["ed1ca8c6147","b5e1b5b3dd0f"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["e2e1a1785895","11f7a1bba400","659cc5117f8f","fccd630d73d1","3c359e741d74","600288df98be","4f04261b85f2"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"685b09a42172"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"7972faeb3fa0"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["ecd3e1e2cd7a","fe49c0372a63","a3aca0a4792b","da4dad30d2f6","dba1c7d02dea","8c2508eba4aa","e888ad5a13be"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"493dca7207bb"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["5cc25e808275","53af1f5e2277"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["61a2bf1168a6","b049880df46e","fe49c0372a63","8100b6daa2b5","2f673bf089e3","924e70776c6b","2c9a1b04de78"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"df61911479f0"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["5be295dad17c","6aee4e32ed51","c1baa1c07872"],"sectionHeader":"History of Programming Series"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":4,"postIds":["630c22f5ba58","5cc25e808275","b358a2b97770","176f7e4416d"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":1,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":8,"postIds":["f518edf1e4ee","6267b7fec50d","92c178e2a178","b2bce9fcbb2","4ef1b68aac25","d2e735d8e32e","a09cfcf56aa5","b7c6d3df442c"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"22a76b2145c7"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"4a6ef90d6c0e"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["88c3cfb6a66b","d96808b3344"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["6cec86ca9d73","bee4a9eb3b5f","835128b18816","e42434f722b1","a09cfcf56aa5"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"2a67d05cfb88"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":8,"postIds":["c67f51c2f83e","17c01240266b","1454888f94ef","54544acc69a1","cc94030fba3d","904302498704","603412218c38","4f5470485aca"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["50eedc7762b6","c2771c62d179","ef8380a9f945"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":8,"postIds":["29db8afb9b13","855f378b4176","de36ee5ab474","1781df7ebdd1","eed08acbd6bf","375533b16113","a1f798c10376","2a0741dac17d"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"9802cd10aa6a"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"47481f2ad2"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"8a53e08c8b16"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"173d58c496f1"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"16409e84e618"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"1accb036fbc0"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"b632bc9c9150"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["92ae03ca04ae","67e91f65dd4b","d4f3b3d01b8c"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["5a936313c6a1","f843c48139d6","6c5366985026","e73e0289ad86","60235b40bd77","80d6893602fa","8bb59b243e9c"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["5c6fbbf1f157","e92a1e6dad9e","18cb3bbff17c"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["60da81123306","7ea5ca1c9a6d","95d1ddf176ea","fb22f52da758","8154bd6e2de1","7ca0015a9c75"]}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":3,"postIds":[],"tagSlug":"Facebook"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["1864af02f68b","54f7fb980bd3","c51b5cd6c2ff","e6398984350d","713f5a40949f","c3f3529a0bff","57a864c2d04d"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"681ee5fb34e9"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["558bf6817069","4ef1b68aac25","d447d1b97f62"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["98787d2a2fa0","d9f55aed596d","87615bc0894f","cd1cd3ed58a6","f9a8f162bd3e","3396df9935d4","772d7ec80e4"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["9ceb0ee249a1","c4dfebf66802","49b9e4f37df1"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["74b022f195c1","adf0b97a116c","d09d24992cec","161a693bf74e","2ebffebb362d","a8ccd8e647bd","b16b6d523b83"]}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["b4f590edc8e9","1af2bfcfec78","d9c397b887e4","505f0b61e53b","e1ddd1791450","b7f7b6a1707d","5e0c3b32b3c7"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["731c10a1b98e","d09d24992cec","c3f1e6273262"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["d5ab6899f249","74712f1dd310","4f1aebc444c"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["2bd0d4a9c520","2195359d5d49"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"63b964ee9718"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["4d5a7b7be869","8bca0e20a333","32d0209803a6","47ad79a54519","5a46cf3689f6","afe167c90568","6cc4c0142a12"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["37441c136de7","608c255b3056"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["11ec2f964c72","564fa85e2235","d5f9e8f79ed4"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["fed2341078c8","563e4569086e","20c9947c22d9","7c57a100a12f","938a533b685"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["869241659d84","2176bde2a4d9","655a160d66cb"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["b64684fe2c7","f13108f10ecc","ab95bed3a57f","732017a00a9c","5c119f7f5a72","1cb57e01d40c","f44a2ee30caa"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":2,"layout":3,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["7cfc55e64a15","aab16fcb5b08","a425968c7d4a","c790aead5c1f"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["dc298154fafd","e5e2fce9ccfa","2dd17119c58a","eca57de7d4a2"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"551c3c6a45e"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["d81639d8291c","e8b7cd29d398"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["308a205fdd5f","a3606305321f","cb5a36e91072","332e5c302909","2189ce09940","71a06afce81","52bdc3f05782"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"fc72050a94a6"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["579f9373e24b","9aa7301e41ac","dc298154fafd"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["abe594c49a84","4253b6d12347","de7af7e5a38b","4ed747cf315","a1914dd95c36","7130156f91b2"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["5dc8d705c5dd","ee733224e6f2","b53d36e69400","b6c6b27398f5"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["ed9b009c225","4e57c4e80cac","add1c3274e1f","f9d9c10fd901","d70f8a48d1ce","55590ccb2fd6"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"41877e09353a"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["192d55f26900","6d8bdb7c1697","f937480b941c"]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":4,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["11b304db97c2","33ea51e87f5d","dab606bfc57b","30da79af4712"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"f97a1a229c86"}},{"type":3,"promoMetadata":{"sectionHeader":"Please welcome our weekly sponsor!","promoId":"7298d28f3755"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["c320ce54a4bb","b06a982a2bba","f29257b0dea2"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["a099b228a87b","9dd8760304d8","889df80c8641","e23b4a45be82","947afb25edb4","1f7275e396e","3ec1901ec7ba"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["a41bd309d6ad","74e5f88cbc9","47ad19652eab","6d49b583df42"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["ff7999977e84","c97ff02adda5","1a92e6629842","99a0ecc56f10","92f32a98188b","2796e34673b7"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["1036c6f6b19a","bc829983bddd","4009dd85dfde","ebae43cdf859","b3a1988d5ad3","873cc405d5c2"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"b31e45357c6"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["e212e111c675","b2baee8b8a38","1261b6e18d76","846da334f8fc"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["51cfc3ff53d8","6e94372789af","d8b1d413a477","dd635a054ebf","511fe09a770a","aaaa0f2155c7"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"99f2dfed19ee"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["ce4fc49fa980","923b6008cf7f","2b0aea499f9","b85ee38bcbe2"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["2c87760a2315","41407a8b1a45","9ac524a2612b","78938b37092d","36da9973388e"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"24efbda0c3bf"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"5e5e05f2c01f"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["e9a2ed53b93c","a6c78e0951d8"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["3f93c7fc0390","bd20d3020470","d0415775efd0","37ddca3e63f5","4663e2c80992","62f3e50cd57f","b7696eea52ba"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f1bfc1548c72","7367f04c7037","949de347e5b9","eb9e3b8d6d0b","f018f20656c1"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["55420e2951f5","f406417ca318","eb87ac8c18d3","8554cb526158","2c6cdfbd6809","d333bde82509"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["1a0fee9b4020","54f5a273cebc","4f9620124624"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["3ea6ba22cd71","46957c6aa5b7"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["3a75963317f9","596cf822ef3f"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["f7c3dd65f5c0","af78626730b","804fcecccef8"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["831e74d5c6f8","43fd0e0cc2e6","cf251e123e69","4ea26a0316b2","adc5af474dc9","f3f7dda84bae"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"1624de9e9555"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["7fcdc1ac4a05","b09bbc38e7c3","6b56fd60b7fe"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"c1f408fbb54c"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["cb48be00fda7","8eb217adc3","800dde4978a","c2a2b19cc1e5","d81771539ccc","d533ef6d4862","a761239f6b2d"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["4c2a3bbcd5e5","105372ff599e","92632ff0dcef"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["6bf24e2689e5","e9e45f8c10bf","6eb44bb9ea75","f8b7fc0a89d7","95336b5acbf9","8e713b5053a3","43a03e52ff38"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f68efc61c599","5909d28bf004","170734a98d25","5c5ee713b223","5278e0bc8482","3a75963317f9"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["3fa161f4a546","9e30695e8ae6","e42434f722b1","ac6f8a867fae"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["3d00c92fc746"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["582bea781d55"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"aada577bf9e4"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"a51c0e6c2886"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["2cea7841d444","3d70e4ee6f6c","62bfaec722f1","2cea7841d444","567405045112"]}},{"type":1,"postListMetadata":{"source":2,"layout":3,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["a33f68546f71","5a537033da0a","792653bc3623","281f70322adc","2194640efee","5a71d74edf69","66ceb38b3a9e"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["8bc50c46bf3","2662f5882f9"],"sectionHeader":"HOW HACKERS START THEIR AFTERNOONS."}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["66aa710178fd","6ab8e5a3827b","6e52394c38f1","5a4aa4840135","dbba1f2c0c71","ec4b9d1dbb8b"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["50c1ee5282f7","582bea781d55","57a85d5f8fee","4a38ad02a239","792653bc3623","1bb2bad8960a"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":5,"postIds":["1b39d1581d86","319ae47117e6","d81aae3eb0e3","cef28fed6c50"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["38e51e1bb57e","c5b03d8dc8d7","6470d7945e71"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["1b45e6a3d9ed","69f57804d6f5","732f2a4db512","f6c18a91b232","382e72f7f7f","99add8963a20"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"144cca1fb011"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["3150faf965e4","908a001e15d4"],"sectionHeader":"HOW HACKERS START THEIR AFTERNOON"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["fd73260ffee9"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["99add8963a20","66e27996410a","5c3032328e52","a2d27897b5a4","43e261d03bb3","cc6e6d68661e","d4ff8d9a3fa3"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["dda85b876adf","fd14842794f6","906d3c34893c"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"d7b00b6f98b4"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["1c6493ede120","458f06732dc5"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"b66c4352b8a"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["68e4f907f661","1393ecef76de","4dc743fac5f8","bb1fe996352e","7515fbbc85f","c431564c84a8","b564fe938e8"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"af026da3d06c"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f16643bf325d","98b76e15d44d","b0388beae9b9","5f394fc5ebd0","6f315e4433ae","b19603502103"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f4c71712624c","648990d84dd","7868eb9bfc83","9461dad669db","4be57bcca1c7","8f0da3f22f67"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["2e78dbec87c8","9ebb7ba83a8f","862b90dabae5","673f64f63dd2","3af844f61257"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"bd37d9d1eeed"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["ca5850e8421c","412a24357d76","ae7492fb01a6","dce7624690d3","70ce667c212a","9d5bb83510a5"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["165fa612ab42","92829cb42bb1"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["2f09e925cc06","e5e6289bb8e5","25f2277c73a6","ab0b413e5d2b","2e78dbec87c8","fe17480ed5c6"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"a7a08a8703fc"}},{"type":1,"postListMetadata":{"source":3,"layout":5,"number":2,"postIds":["df4e1905d373"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["2703165f737c","73991f2328b0","d66c3d37ad71","12878a1bd7f6","9101528a7b76","8985a53920b3"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["9ce93184f3dd","1210ab27ebe4","a89c82d1b494","be70a62937ef","4be57bcca1c7","69b96ad943e5","5b47ca1209b3"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["12878a1bd7f6","9c4b84d38ce5","ca01af1a7041"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"7708721caff6"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"4c015e9ea6e4"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"c3628562fbb0"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["308fe7b223f3","3de21282c7ce","50e47dfd95a0","e1b504179848","3d817aa25dff","44c9659c5e75"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["d7b3780920e2","33df51f7367c","b995c5aa7e37","c29cf8bc09b2","9e2f596a050c"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f3f7dda84bae","b669ae467f92","52b1ff18552","37bb2701bd2","2695835f59be","2f6b889dcf6d","281b6abaec5"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["4be57bcca1c7","e464a2dd34f4","64ca9f6f9a69","f7637b80ec26","e541e2a1414d","eb0e20a4a2b","4b4aef907810"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"e526a5db2a99"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":12,"postIds":["b552f584776d","f3f7dda84bae","85258e1bc87","771afebffc0f","256a4781e843","39607104e89e","8e2cbc0ce420","dfdad0a61e99","2cc3fb1fbefc","79da9a941ec1","f19b3f33ea92"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"e6a39af2d128"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["c2f26933db23","213f8a924e89","568be62fdf6d","4a3328a4c50c","7ff89cebf6fd","8ab9c532c500","77b105033d8e"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["e9bbf9675a8b","a0df80914f05","b5698f0e2058","586f09a17fff","2ab1471ff078","ce467aee06c1","a6780d67480"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"c1f8ea66adc"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["d1cd80c26f08","4e292524ff47"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["89fde97b5352","1f17fe30333d","41a11307d075","5f5bae03f113","de9481966b98","27505e7ec03","70e2083f103c"]}},{"type":3,"promoMetadata":{"sectionHeader":"Meet our weekly sponsor","promoId":"4b7a404a6ac8"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["6e97a25e7402","6bcd71794853","3b823e434fc8"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["abc9d709399d","946849c2fbd4","8394d06a0a8d","b9ef59bffe8a","263434c0b8ad"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"2b715129e8a7"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["d4a71f601346","3ae907a5b4a5","defde2a28b51","4710914f1b01","fd2721a00586","99233a415462"]}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["b0a7c743c1c1","6b6f64da07e2","1705df5434ca","5e7e7f7d8914","26582430bf58","16dbbbcfee9"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"b2250ffee70b"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["33ec8c79a8e2","429653de42d3","a04a94ff758e","15384bd30354","77bfa1afd1b2"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["8aae6042fb48","66df47506371","ab1ed50c0e49","2c0b44f57a14","788e94441d60"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"65cd9bbeee53"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["f5ef050c8c92","fbc2712fa322","e56846300025","fcf5fab9cdf1","60ab1e1b50f9"]}},{"type":1,"postListMetadata":{"source":3,"layout":5,"number":2,"postIds":["91c6318a7045"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["7d907f278a4f","d9bc85e1d91f","57cf806d34df","d733cc2c48b0","caf2e2318abb","b8cd3287f9f0","1628d08aa7dd"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["32c35267a585","689157d9d64c","afd0d32ab50","3b4bf96e138f","2c1b96a77cd6","117428612f46","5be456018040"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["65c51e24398e","287ea58a3395","7c5f6d4efbec","da7d04bd7f42","5dd92b533870","f1b6966c7dbc"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["ecffb15fb24e","ba05a84281b6"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["8aae6042fb48","f69206586a7f","a78d320de97f","5c0a454fb278","e4974a8d165a","6bd28795b313","33126a96ee23"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"446a32fc0d24"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"865e00d7a5cc"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["34161bed1775","f85e24733654","24dc08ffe60b","3dde6c77adbb","71b84292bf3a","4991ceff55d7","94abc7f2232d"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["9a8cb347c5b5","94bc09232b9c","69fdf195e47","4f250385673e","38be5bdcf4da","14a3aecbbb98"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["e39f92cf16e1","7b45498cedfb","ba71a5c9c7f6","4f64fb199df3","41ee7c6d032a","5949d21ca5b9","6816b85deb0c"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["1f147b8dfd56","cf54999c097b"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["97a9daaab2ad","ef2aaa069cf7","d52f3413bca7","209358817f9a","4088f2eb01be","ebeff6c34f8b","3e07b02394c"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"a1f1dfd22f1e"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["c674c4b06b3a","b9390c44318b","554e4c586b1b","c10871bea599","a613048959b2"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"689bd0be3c27"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["a316ed3f445f","a154194cbb4f","5c7e7359109","71c602bc1fdc","b9390c44318b","819053c3b2cb","31c809bfc39f"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"f797a76afb45"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f3d47b6686ef","6567cee2bccc","cec76793b6a1","5b7b0da5d4b5","5b578bc5cb7b","dad55578062c","ba71a5c9c7f6"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"9d7a29ed9e19"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"494042c57cb7"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"c2e6b6be8e86"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["27a4a3cc2bb1","d983279dfac6","78197497f95","90c005d2129f","824ba801a51b","530b36147e13"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["67ebb5fc7ae","3abc7e00148e","be4b3e326387"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["e82531365e6d","4f403e96d50c","952b389ad7df","baade68284f8","16d8c81b4077","f94e3929891b"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["214122a8948f","1aec77fbe2fa","a6ab438fe79f"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"47b3ba8e6409"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"9e3d7cfcf2ae"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["235b29ed126b","36584863b0f8","4678b8d231b4"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["2e0ed0638f47","39782417f990","a550fb945e81","560a42d96ba7","713149eb9a21","5405058f36cf","a4ec565b5387"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["d04266844e7","d101995bb843","7a895c3c1b67"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"d0f942e21392"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"389040327ca9"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f2b5521c3f25","b91f4ea3a3c9","beea36ef194e","9f7e3d52941d","44ecf9e8461f","75701ed23f68","94a3aa4c2aab"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"f970499f6f87"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["aa56f4fcdc42","c33c16ea5e88","dedab6afd3f6","119863d5d9f3","806b8ae77fa6","97dbad1ff28c","a1088198874"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":3,"postIds":["3c6116ba30a8","c54ea887598"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["1cb71fc969ff","78f3a69552ac","a8437dd94425"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"25442c821aaa"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["3ab8dbc55eb3","7fe46fc43600","9d65031e7491","5f03eddd3add","3e13008fbef9","85cb43b302a0"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"d9a690308592"}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["2a02c5e8f138","e7dfb9377e28","2ffdbd8a880f","3201917e2ac3","df4804fcfc1","a8437dd94425","98a98e360315"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"d45f1e1b26b5"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"631cbd4d4722"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"37611551a9bd"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["786b0640fe85","dc8c23a52985","4b503e6485db","dacceaff9a13","3eaa4d38da63"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"f96cf948f855"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["8ae5594d7446","218a23186cd7","60839779996b"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["c39aebc25517","beaf3b9a88b0","8d6ac4c17e8c","bbe1016d1f7a","c57acd51846a","5ac67fb138ff","e01c605ec296"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["f2d443eba35","ee98c180100"],"sectionHeader":"On one hand, BLOCKCHAIN! And on the other hand, blockchain... "}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["a9a397af9221","468ae877700f"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f24a206dc467","fe28d4d11c71","2e469b762ba9","85d5881cf163","62a56d8435e4","d575f70b39a0","dbe237c40430"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"7b8579556cc6"}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":3,"postIds":[],"tagSlug":"the next web partnership","sectionHeader":"Hackers on The Next Web [Partnership]"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["87e6426398","413679bb4c3e","d183db1057ea"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["73a93685197a","b338247eed6a","3f05f6cee400","46408cf09734","d575f70b39a0","c229df788439","8b3bbc7ac3c3"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":8,"postIds":["b6aa17eeac20","2e469b762ba9","89985ca2be48","f37cf4c0043","89570568417","ee98c180100"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"1776e09fbee8"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"315d6b101da4"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["8ac9fa893823","133f1c375cd3"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["68750ed16365","c4526d6d3f8"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["ecce0d27e638","1f886fbd3c5c","5597c743cd0a","73caaacfe31b","58884e95c2bd","11e158b734ee"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["fa3bd02101ee","ebb3253e63ce"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"38f55445474d"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"aceba1abaf3c"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["5d3574a3aab6","96e3230782ab","a2eb19a26c32"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["9a8ec4ec7d62","ca553f5a002c","c8b49bfe6e32","e1b3062b9341","d2c79ec43201","e9db73107ebf","2e9c1c685576"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"7f61c3746a72"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["350ba0060fc9","f2d443eba35"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["aeaf126ce979","3d63fe4c5c76","8e59984a491b","c2f491199549","f1f8f63594ee","133f1c375cd3"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["f39a5c778c4c","8ac9fa893823"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["a73122dd23d4","822478b5afbd","96e3230782ab"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["29599a5c78ac","324bac3a0ffc","6f2cb28657cb","1d5f82e4c26f","2b87f63bcbaa"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["62a56d8435e4","e9f0e3ed36a6","4c36ce8d4535","feea7730b20b","4f1872171475","a1d9eecdf8fe","7fab00ee678e"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["3bbaabceadac","657a1a3332e2","d1ae5e562a1","a5b54745eed2","69a6cf68f447","ae58c69b3bf0","de59e6770e9"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["3ba2c770ba98","809672a678a1"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["fa6f28ba0649","a1333072a2e3","f2ffb2810203","b08e9f87052c","6cd9426f0923","684bc0584bb6"]}},{"type":3,"promoMetadata":{"sectionHeader":"We publish 25 tech stories today. Choose a category below:","promoId":"abff68f8f897"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"bfe226690685"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"a598a648231e"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"566ff7dbcbea"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"4f2c7a62f9b8"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["d572bb52e21c","7fab00ee678e","76dfcb33587f"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["f4c7fffc0297","d572bb52e21c"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["dc1a6f725490","d40da0449faf","7b952b8b038e","cecc1ba64506","3de86d22bd6e","5d6396c3a402","8e73903b98fc"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["15f03f5df12","301a96f49c34"],"sectionHeader":"Lets Talk Headware!"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["22e2a52f9c7d","83bdaf2fdf4f","77bf34bec2d1","30a3acbfef13","2ac5d2dd4881"],"sectionHeader":"5 Trending Tech Stories!"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["79956138bea3","6dda57b5b00d","aae9fcc75e94","ece2eaf5bf44","2297730143a5","3216607f63f4"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["652b7055569d","c0b44bf2b17d","6c91a13b6685","bc1ddb91845f","d030804bf358","258ebe9eed1","44d4bd3961b7"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["fe28d4d11c71","2aac943acd97","73bdb49693a","c1c5714f79a0","f6ee15646981","117428612f46","a2b66f0f81fd"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["17c4743b3850","5a0cdeb4d579","2f2b7b3f124","b30494c0e19e","4b066aa6aa9c","9a3e613c833c","d04e0a525779"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["6bd1f401fc3a","bd07b282416f","bc5752187556","a6b2e2859c13","1fe876bcf5aa","bdd44746e83a","b3aeb35ffe31"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["5d41628227e7","f5851848de5"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["e9f0e3ed36a6","d1ae5e562a1"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["9aa32fdef359","4eab513485d1","b5f8f736c79b","94c775f93fd0","c9683fd3295","4437a1aec217","b30494c0e19e"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["6108081dbada","4e7a00eb6196","933b24009e35","9df9db9e7d23","1d0a5fe08183","247a0df25338","ad5946378fb4"]}},{"type":3,"promoMetadata":{"sectionHeader":"meet our weekly sponsor!","promoId":"970992ef0476"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["788fcbdcac2a","69c8b2a55ef9","28e9e2a47eae"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["85d5881cf163","11213600658c","d0787f2abfd","28e9e2a47eae","3121f8d50cf0","c1ea802c353b","92a6b19ede18"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["272ecc0ad370","7412d121798d","67d633ce8ace","e5eca9f0920b","5483362d79b5","5447c641d397"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["475010b26fb4","e9f0e3ed36a6","5bbebddad96b","2f4bb021abc4","6a804f334beb","9534818fb217","f59f92fd8dca"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"cd73f03d69e7"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["7c05361e467d","b280bef441e7","c3e07819c5bb","ea9338cb13ed","8cf194987a50","5447c641d397"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["de2913b04ca4","454fae465d63","ef00e6f3d8a6"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["286aa625e26d","2790fa6c81a1"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["2e6a5b65665b","b9a7f01f84ff","9d6c7b7f9c3b","d9ebca8d370e","31c6858e47b7","f2d443eba35","6c11b6735d10"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["4df003345ccd","75387cbeed3d","d6d9887c494e"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["1f331dd11b1e","87f859f13f75"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["f5838fc27382","c6278cf09e85"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"79b655bd009"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":9,"postIds":["1751bd1212bf","c71fdb07d51c","c54346cd8ca0","c4d02f27dd3","6926df5af0c7","5bb0f9d56801","c5c5b86e9458","bdc5aeaf2d07","68bbccf6885c"]}},{"type":1,"postListMetadata":{"source":1,"layout":3,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"The Latest on Hacker Noon! "}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["b8081402a3d5","8d353abd2f0f","438b51333fa","4409bd8528b0","70e4b8cc72eb","3a5dfc96c355"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Latest Stories on Hacker Noon"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["10b059541894","8f91dad8e4e1","b5caefd995df"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["1788da8a7449","31a88b97b282"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["3229d79ec062"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["6435ad6839be","ee9e7fcb1a51","2a2d627b0202"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"d4039f479491"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"ff71209e861d"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"2e1c6d75c04b"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["d3a272034668","f2dfdfe82de8"],"sectionHeader":"From our new partner, Quora! "}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["467368aad888","68d7bfb37a9e"]}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":2,"postIds":[],"sectionHeader":"Monthly Trending Stories on Hacker Noon"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["60cd8d2713c1","7acd8ea68157","6d82fad147b9","a73af700aee6","79ccfe159d08","eabecd21a365","b3ce3a939b7b"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"31a93c4f45d3"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["46e7f4dc34e6","5a68fe24a849","7a31565e768","5b4be1b7c9b2","fe9f574b3c5e"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Latest on Hacker Noon"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["6bdfa366b899","38d41aff563e","b94973c21784","cb3b1fd04a1c","be5c30184e13"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["5e937707c27b","938cff3a0fcb","bbd5fd790af3","14e46e99942e","873dae511021","35b89e67ce79","9367e620d8cf"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"5bc3d515af98"}},{"type":1,"postListMetadata":{"source":3,"layout":5,"number":2,"postIds":["80704ba39873","9cb62476ef3a"]}},{"type":1,"postListMetadata":{"source":4,"layout":7,"number":7,"postIds":[],"tagSlug":"quora partnership","sectionHeader":"Popular Tech Answers via Our New Partner, Quora"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"f847b2930ad2"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["6dfef764da1f","d4615c12ad09","3fceeae2b21","64be1a7a0264","956cc2edcf9f"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["71098afa07c9","62ecae8fc85d"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"b8617813d6e0"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["40ee1ee9314f","eefbf1a44ae8","49166e1a69de","491703c8277d","7a470cd02e75","c300abe152e5"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["ce82188d0019","3522483fa146"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"5e5af391cd00"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":6,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"5d5b48b7aa50"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["c755838dfc79","a3a35785692b"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["f7fdc7059cf8","dd4ea38b4bfb","52d1cebf0394"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"896d70ab8ca8"}},{"type":1,"postListMetadata":{"source":2,"layout":3,"number":2,"postIds":[],"sectionHeader":"Trending on Hacker Noon"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["91e1a0052c53","785622043b7b","fcdfd9d68ad2","2d6bb6750bb9","c233a0971952","401eb4869012"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"f4db069cfe53"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["3c7ec5664c42","f3ce9500a028"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["984a72d48ebc","db3add166840"]}},{"type":3,"promoMetadata":{"sectionHeader":"Meet our weekly sponsor","promoId":"9e0f29f4dfc1"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["14df8cc1c68a","82fc8a0a1bfe"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["24d184e871a3","d8277a4ba86d","9147f805ef96","f5730fdf19c9","cf28ba9557d1","f322108695c","b6aa17eeac20"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"252741d1ff19"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["635e7ed00fa3","d0e5fa65698e","c84eb94d0a13","9a9a1c9c5c16","f94d0ee13eb9","76ff3b8e92d7","3ef503d93609"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"e42ae0703754"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["4ed049d2b0c0","1e7a97fc1bd"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["2a2d627b0202","6127269ff25f","7b80f8ab7279","3cc2857618d3","bb09192916a3","736feda86507"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"ca296d74fb59"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["ea0330cb69a5","494996b66932"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["3edf51ce448c","1eeeb14f20f8","3ff673a3955"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["8976b6886481","ae9a5752fe82","faf7bcd44c0e","97d0e18a2999"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"396ff1a74de6"}},{"type":1,"postListMetadata":{"source":2,"layout":3,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["27ae935bab1b","7b07c7b57cef","66c75ebf760","f13e89da1432","a7df366d800e"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"2e849410fe12"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["a78e60927042","e11b96e27199","abc0ba7028a4","83f196e6e560","dd9dfe25accb"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"b9fcbbb01e0c"}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f2d443eba35","7b213c1bb867","eace34fcae8a","b17131ec20f4","2bfbe48769cc"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["60f195cabd68","7e75481a798c"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"fbe56cc5bbf3"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["a8fe48feb023","a3ef6f35f0a8","50d3b27f838c","e95f3ce061f3","e8016fcef3b2","2f27a367baa9"]}},{"type":3,"promoMetadata":{"sectionHeader":"Meet our weekly sponsor ","promoId":"7d330af61dc1"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["b5aaf1444d44","97a23092473c"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["464a5797c799","39d6d038e5da"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["5855a7e4aa2c"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"40b8858f2e22"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["643d8ba42ace","fb1380f5cb6c"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["19720a7447d2","3bb9fc924712"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"a1161179b8f7"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["231c7b3d088d","5f7a9ef4cebc","6f67810983aa","34d28430a5a2","fa38e28f2531","e53594aabb47"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["eef7a088a6d9"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["437b852acc0d","a1ac874710a5","11ef078ef5fc","2661580d0b8d","12169dd44a92"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"702fc34c8599"}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["9bdcc60a39c1","3a7287d953a5","e948d3353aa7","fdf45a7b1fbc"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["169c8158ec16","12809d74b6b0"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["67ca0cb88358","6d9da452fa8d","895e006b1bb3"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"6ec02c38218e"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"63b0176ffa0d"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["332f0b76ab4"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["26d87774c011","eca67feb079c","7d5ec4b8c81b","3f816c90ce61","66281760037","77d628ac9518"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"90cbf1a830b6"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"5756aa691588"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["f15edd11505f","9913745d7d8","36af9aecfc47"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["2d06bd7bcf5d","3f3bc80d0c4b","b02c6d7828ab","8e28d94f5f04","d7dd592c39b2","32e783d87210"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"4e24a829bfa3"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":1,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":1,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["b435f98569ab","8e28d94f5f04","b9b6ec034afd","3b03970c8df7","bbeeaa7a5449"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["b441e5ab9e38","efc565f8e8d8"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["a6a5cea6a6c7","a291011a71c5","aaecf2d35312","da90f2a98102"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["485abe0ec522","175f845c2bcf","7c75a30ddd87","3cdd916407cf"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Latest on Hacker Noon"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"35565d881c23"}},{"type":1,"postListMetadata":{"source":3,"layout":5,"number":2,"postIds":["a9d7550c157e","cacd04f916b3"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["800c3b218c15","1fdb7f0c5263","2a2a0614bddf","ce21a989c61d","462fa4bb401e","d52302d270b4","f31332421f31"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"53de142e92fa"}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":2,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"download our weekly sponsor's awesome product benchmarks report ","promoId":"2b2e66625479"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["fcffd87c15a3","9b6fcb668111","ee8a77f7f4c7","20a647b8f39f","d29e3b92495b","93bcb2c7dbb7"]}},{"type":3,"promoMetadata":{"sectionHeader":"The human spirit must prevail over technology.  – Albert Einstein","promoId":"d4dad3e9000f"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["9fe8a468bebc","6640df17e263","2151784eb785","4f31d3063a28","3e69e5323f0","e3a1179883bd"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["1ad7e58a7127","1d707806d66c"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":1,"postIds":["44f260cdeda3"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["f6c904618190"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"a67a450d664a"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"144303e22689"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"1e999a4b2a3"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["2848971a34a0","12809d74b6b0"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"8a32897abd22"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["2980b2e32717","c1802315007f"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"de89d7fed5b8"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"19bc68559507"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"2dc11ae5af0d"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"c21a21cec864"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"fa0faaaf4f9f"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["e10aed48dfeb","17b985271ef9","2235b96d64cf","6f32ea8f5888"],"sectionHeader":"crypto columns"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"b149ae8c197a"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"4fcdd3b69683"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["57fa096c09ab"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["79b46a91ac63","62b66ddd0f89","3ede534ef1ed","fb95dfb7af31","347822f5419f","69f295e63759"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["a1df2eb9e8a9","36ce63b6b4d3"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"c7f4ceefd279"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["355f818161a6","f3178540f5e3"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Latest on Hacker Noon"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["2a2e846ae113","251d19b23597"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["1043c756a221","d794ab48fb82"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["dc9adb4c162b","4c772b7c2642","23049d7209af"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":3,"postIds":["9b0d78585d67","222c02b7b5e2","50fc18cfcebf"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"2e538b9b7158"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["2a2e846ae113","79377c3dca7e","934f1908194b","800cea71b06c"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["b1f30845b43e","5c335b2775b6","a2929b4d8eee"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["2a2e846ae113","eacda5cc41a6","6061d3c93e7","e3f0f882df0d","a65c7bfab490"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"b13aa799f39e"}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":4,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"ef8d38097b3d"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":5,"postIds":["3e432c5e8caa","1fe85ad40e35","2d17db675a1","cce0fe222a71"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"9c5e096897cf"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["e509dd0b6bd4","1ede32aa0711"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["8b03b18b0bd0","a901e1cea549","b3a3b6167566"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["55943d523b56","54e24395243f"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["196ccd9564ce","3d3cc24217f4"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":5,"postIds":["c8037bcacc23","fe70af065a7d","56b573ad010a","e61c7d89bf27"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["6d5c20825e56","e7b5c26b0624"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"meet our weekly sponsor:","promoId":"8e7362b57766"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"a4c96b609aa3"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["70ce98492aed"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["93d73306e0c5","9b5510ca25e3","ac36449ffa10","5169fbb570cc"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":1,"postIds":["ee59ded4602d"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["772d0e6ad322","8b8af8aaffe0"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["8201e7a9003","fb4b0e1752a5","6b76ae597ace"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["fcfa418bfce1","af1fa3dbf7d8","e505c798ce77","8b2e08ebd563"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["ed51207952a8","5169fbb570cc"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["dad83ec3fc23","23d484d8bef8"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["66b4e2043621","4dc566be372e","eed1ed01127f","b5cd7275dc84"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["4a72ce2bb1f3","707c532abbe2","b1d2e93a703"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["f3e0424cf2f0","8b7be39f30fc"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["cdc8aeb5db0b","4c33e9b6bfaa","dbb3f9e2349f"]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":4,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":9,"postIds":["6f0f099850f9","11ccc607c504","71998e2524e7","9070a9800c26","c69443606805","c87be8dc0e47","bdb983bc3e49","3ebc654e0ad6","f75f376f422"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"7ddbb40a1140"}},{"type":1,"postListMetadata":{"source":4,"layout":2,"number":2,"postIds":[],"tagSlug":"Amazon"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["ea94805cf05d","d499c198aec5","23d484d8bef8","ddcab1bb1f75"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":1,"postIds":["5bff38d9a93a"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":1,"postIds":["50246fc36e9e"]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["7aee9c1b566","516da34ce5d6","29a5a754eb1a"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"a18a7026fcbc"}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":1,"postIds":["e8f628d51700"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":1,"postIds":["f4269cb5cc40"],"sectionHeader":"Why does this happen? It’s complicated…"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["c2f0b835ab92","75b84458d86c"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["782efb19d900","d773118420d2","355ff87859f9","a7f5889f81b5","bc8ebe7a84e5"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Latest on Hacker Noon"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["486c31768b97","daff6042413a"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["2e2d261b73ed","38f8b25978c0","f28dc766ef32"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["94470b18156f","84fa910fcd42"]}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["7b39bc404404","c17512a0e2a4","4182f0b00ae7"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":6,"postIds":["7d3fb8667030","d6603a5fc64d","e542606eb67d","9b8865c8e46f","d936a71d0263"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["5cd013f37782","1e82a8bc27f4"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["5ac12ba91f34","b1c89554bcba"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["cdf37b7f6b33"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["aec1c470cf8f","dc2af3ceebad"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["19c0620e4a43","2e4c92b0b80b"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["a0e2011d36","7d571fb5b034","f4c1696e6ffd","b9e0222b5b5e"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["a66a9e01253d","1459d32f3395"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":3,"postIds":["23d484d8bef8","60b296c4c031","6a418db04a21"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["886db508cc31","28c251df4018","a8912a25dc88","19a852fea4ff"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["f0c66cf6fc22","437405a2cdae"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":1,"postIds":["6a007cfb9b97"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["9ebe117b5759"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["b6f8cf612743","c2c9ee8ad201","3b1994a33522"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["fd5124088875","ae9fdc38479f","2cb43946551a","fbe6098de696","b0567f3922cc"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["c6af86023022","faffb6da1371","b5dc6bb92d49","23d484d8bef8","1020969abfcd","bc8eeea54220","8fc6e9ff348b"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["f0f7614cab32","f06c008f8f84"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["bdf48340c1be","8e49b6badaa4"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["345d9f12f40b","cd1f681d4f42"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["b285b070d456","fb002f281102","b5f3d4dff66","42c39fa638f5"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["4fd640698e9b","30ae29add74b","66060f3799e5"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":3,"postIds":["99c07a93c8eb","ebbb98cfb05"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["4db8646cae30","a95f936e8b85"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["177cc115b749","244a412b9455","8f119bd4bc87","f5dbb4ba5fcc"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["3d18be586249"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["e699820c7e9b","d77774802bbd"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["e5080a2be6e4","9430a2dbb895","6c21de7a1f28","5b34614ae69a"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["23d484d8bef8","18f111fcc007"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["b03c707b8f90","91aeb58b4689","34766550f8d7","e97eea715f1c"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["a093b83ac99a","b8a59585a7e0"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":1,"postIds":["fd22d84ae61c"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":4,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["ca7dc80e9d8","49d35ac463b1"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["c774ae5f7d9a","8963863d4a03","bbf941c7f0dc","a9335697163b","7c727a71dda8"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["baf1d1fccb04","cdf37b7f6b33","c65e0d67ac09","c485dd5b8c6c"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["a3b4b39fe0ae","67799886b78f","341f57364481"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["416431539c6","a24ab4bc0d55"]}},{"type":1,"postListMetadata":{"source":4,"layout":2,"number":4,"postIds":[],"tagSlug":"Bitcoin","sectionHeader":"Bitcoin"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["e7253ac24306","83d5ae84fb8e","3909fff55ba3","85eda475f96d","6f25e1f2463c"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":4,"postIds":[]}},{"type":1,"postListMetadata":{"source":2,"layout":2,"number":4,"postIds":[],"sectionHeader":"Trending Stories"}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":10,"postIds":[],"sectionHeader":"Latest Stories"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["3cb7a7d49d95","20ebb37d8a79","6b0031eead87","cab1bfa1615","f32aee3fcbf7","ee1ecd5c9c87"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["98fef71aefcf","729abe42a02f"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["6c8727fefcd2","ac83d2ab567c","39c711d28eb4","72bab45608af","66f590abb7d0","638da7a3dce0"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":3,"postIds":["b34b2247520f","3a093c5ba1a0","9cdaf2ab3d48"],"sectionHeader":"From The Design Director of Unannounced @ Magic Leap."}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":3,"postIds":["9df799984034","d25045cbfa61","d538d1e8f831"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["2a5d78072128","521bae1411f","866c7cec88b0","860c3f25f1fb","afe675c64340"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":3,"postIds":["e75185793aa6","18f111fcc007","7e6321236b8e"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["46c17eb955e6","8bc79eac469d","35e4f9701504","d167302c17f5"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["b7e368cb16df","4269c0bf6c8b"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":4,"postIds":["7cfdaff04b12","491cf55d501b","7781fe0bf7d"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"8c1f297e1d"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["de62c859643","98faa4754fd5","107c9cabc4dc","2801aa031202"]}},{"type":1,"postListMetadata":{"source":4,"layout":2,"number":2,"postIds":[],"tagSlug":"Artificial Intelligence","sectionHeader":"Artificial Intelligence"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"11350928f495"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["93c4f1a30c82","a8cac81cd02f"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["8cbbd31568ec","f1baed075d1b","b8040b1e225f","672b3b81eac9"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["7e2e3723c877","a3ec1644cb0a","705a89fa8978","f15ef317cd6d","9a2b19114520","c2e788290f5f"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["ab424913a4b5","c9155c5f6bdf"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["2bebed57ed64"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["37921874349f","9e029b872304","5d8249407f3a","3ed4cccc669a"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["b3b4cdcfb4f4","501ae81d28aa","7d33811da15"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["43d0c57e3fe6","dc3e0c4410d4","c1025f001e68","10126d988655"]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":1,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["bc0b08312fa","256ac0c2a3ff"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["6b1439a30bd8","647d9314baaa"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":1,"postIds":["e192224c6c3b"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["b52f2265c596"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["55932ecffdd7","7d33811da15"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["badb6b01e53f","14a0575a8be7","d4449920d2","420ff367c5c1"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["cf3a210a36b1","424b6d697e35","fcb2f55088f9"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["96f13a66bb51","adeda8f7f39e","4c7eb541d193","cf953e4ec7e0"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["6dbb5d03ba2a","838024c7bfbf"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["a1efcf97a264","9d5bb83510a5"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":1,"postIds":["db34b9d034a2"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["b4b76e3ecd64","6928db640c42","96f13a66bb51","a84b0737f027","e02bafe9c9f6","dd97420f640e"]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["39e1cf69395f"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["54e84aa7a421"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["a64adc93525a","4703c3f02fbb"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["71449d49b170","385e25c65d33"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["57a46ecd8723","a2be67247969","1da89ba19348"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"More of the Latest on Hacker Noon"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["794e0a4c334f"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["baee5376a6a2","f79d7be702be"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["104f77277297","2f94d313c7e5","4a54857b82ba"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["68c98a8d003a","4ae300cdc220"]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":6,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":6,"postIds":["861990a7320a","ee9c394adf66","44043dc7b3f5","50e3de238376","3bb9d0f76766","582b47774ad9"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["52a8331030f1","7586ca5b7ef8","4a8866be3e14","8e1793ed32be"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["890b868cec06","4433eba0466d","ebd055c2482e","6df85598a444"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["8994061d2176","6aa750cde1a2"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["8d1d57ec6f0c","2db68487f4ba"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["b593e408b643","e2188cc34422"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["64104f59bf5e","f3b3540f8545"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["1da89ba19348"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["3ab23da15e0a","4755649d96ec","58526819f21e","ebd055c2482e"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["aac04ce5dc45","e8eb1e934dc5"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["5cdddc9f674d","ffaf78da36","21e01e1c6154"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"The Latest on Hacker Noon"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["487f8bae4e3"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["5b540cd42cc1","a71a730f1a5d"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["bbc9f66ad8de","cf972744a3e4","f4d7c6fcca26","6b736b01bd23"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["ffaf78da36","1ca17bd97a1a"]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["c90b0151c169","ed365b4af28a","d3be086effa0"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["9b97f3ed4fe5","da994c17d483"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["e28b95dd0a05","3c5b5829d19c","6a729de34a3a","5e9788c30958"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":3,"postIds":["9d2a8867b69b","43cfe5e3b066"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["fef16cdbc7fe","a3ef60225ee3","9b97f3ed4fe5","88333284f8fe"]}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":3,"postIds":[],"tagSlug":"Machine Learning","sectionHeader":"Machine Learning: man made machines make something new. "}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["61d3f64fd397","2df421fa941c"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"4600252e2591"}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"520dda10d047"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"900307ba912c"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["ed2ca00a953","54c569c17a49"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["928208b1978a"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["9c9397b30558","f455e9f6403b"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["70572c6d1c8d","c828187f9084"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["87b663662cea","bc063d0f9a80","9227bb3d46af","bd6c1bb3de2c"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":1,"postIds":[],"sectionHeader":"Learn from Pinterest's engineering team"}},{"type":1,"postListMetadata":{"source":4,"layout":2,"number":2,"postIds":[],"tagSlug":"Kotlin","sectionHeader":"Kotlin"}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":3,"postIds":[],"tagSlug":"React","sectionHeader":"React"}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":1,"postIds":["22673fb56ae8"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["38309f1daee8","269cece92274","41bc9ae947e6","aa411461a7e0","f455e9f6403b","39be653dde9a"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["b4942c6812ad","c16154013e12"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["622aa194787d","18363c040656","b47370c5ab17","1f71ec40de45","c0d2371151d6"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["b1824464dd5f","cd58b7ec2543"]}},{"type":1,"postListMetadata":{"source":3,"layout":5,"number":2,"postIds":["1baedbb71419","840f1c45d7ba"],"sectionHeader":"Learn from a16z's AI Playbook"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"237870dea01"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["4ed31a7304b8","f6fcdea4f521","89e30a6accf4","2f8d287f88c3"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":1,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":3,"postIds":["45f94bb5bfbf","49877739ba0d"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["1f71ec40de45"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":7,"postIds":["6be568a3b7d9","e6bc64754cd4","17a1161e7aa1"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["54c569c17a49","5f0c799c776b"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["3c1d03b90356","8975d5e68879"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["4f2309e6055d","a818dbc25cc6","e45dcddb1bdb"]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":3,"postIds":["414065bf5ec0","b4e4b011616a"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["7456d235abdf","ce57cdc3b206","2dc4a862b47e"]}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":4,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["8c605297aecd","bc914071a155","3b6c56ee938c","78ba605c2ed2"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["6db77ade3c18","446b006675c9","c0a4f614bd09","c2ac7d008591"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":3,"postIds":["209376f69731","d932556ffd8c","35dda19c8a3f"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["6134dce40e7f","62ddb47b9370"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["23049d7209af","6fec9de6765a","d6bf4991dd9","aab8969cef0b"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":1,"postIds":["6e02e7e6c8cb"]}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":5,"postIds":[],"tagSlug":"Artificial Intelligence"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"437cac726b4d"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["d7368c7fe2c2","72a96a43d5d9"]}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["ba7e4f772d78","c966f71a4abc"],"sectionHeader":"Lets Talk Business "}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["a0ff6f2bb6c8","22553abb038b"],"sectionHeader":"Tech's Big Picture"}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["d29cb2cbb637","6d91c6005d40","5bbb5f42914d"],"sectionHeader":"Develop, develop, develop... into what?"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["11f6a5196b00","cec82aea3b81","3ba513df303e","c5e75b2fc1c8"]}},{"type":1,"postListMetadata":{"source":1,"layout":3,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["689c45b57607","e2960d0516a","b9b080ca6ccf"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["cffbd21881bc","5b20f364b216","a146d851f14f"]}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":4,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":6,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["6b5eb6a48356","7190d8a01d09","39a035c33120"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["1844e1a8522d","dcf502bed28a","ca3cbbf4f62f"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["aa8028c99c83","c3707f065069","dc8ece0a8a1b"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["6f93c7e7d702","2a277b6c296c","9389631f05d8"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["8f364119d226","d2b5d665c1c0"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["ad699fffd651","a7c6dc616bff"]}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["bea305e26741","2398b5c3731c"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["3bd60fc1e5cb","1fc3b85ce964"],"sectionHeader":"read some startup $$$ experts: "}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"from our blog network:","promoId":"513b961185f0"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["91177148ec00","a4e273babaea","7190d8a01d09","378e09f469"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":6,"postIds":[],"sectionHeader":"The Latest from Hacker Noon! "}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["2398b5c3731c","a9cf29480a88"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["c2b431bf0ac2","d070ac86d996"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":4,"postIds":[]}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"86226b581199"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["a8d595882a7a","68f92f671378"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["2e2196049547","e9601ace9393"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["7681766b7d79","7ae7b47a8698","6839ba295e9e","c0951613808e","b8945ce095d2","2fcdcd856886"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["f3819a689386","6516bfde9c5c","a254c5b410bc","c226d7ed6d88"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Read the Latest on Hacker Noon"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["4ecc9becad85"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["64cacca3b908","5ad769c4d3c6"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["9fb800eca775","9f54420f683e"],"sectionHeader":"some more \"boring\" articles :-) "}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":6,"postIds":["86d7166911ea","33973645be01","928bc6e9a9a8","2bb0288f05e0","f3eaff55b626","2c1687173c7c"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Read the Latest on Hacker Noon! "}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["bcaa3fda9a31","2c3abb235915","b52c8cb33161"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["116fe6c9ae8b","10068195ea7c","9e3a88a8ec07"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["505a7272e4f0","3e354a2e41cf","a8760c014327"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"The Latest from Hacker Noon"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["aedf4bd4393c","6e02e7e6c8cb"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["2612349105c6","41831d92a446"]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":8,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["fa9eb7c86dbb","3e08b0723d8f","bfd87efa2e5b","9a43fd71457a","7a0f5d1c580a"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["6a0baf5bc31b"]}},{"type":1,"postListMetadata":{"source":2,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["536375023b29","928984c2e36a"]}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["2e1d796704d5","cdbf95288333"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":4,"postIds":["40579cc8ea00","28af584adc0a","68c5167ecfe0","abd73a1aa736"]}},{"type":1,"postListMetadata":{"source":2,"layout":2,"number":6,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":8,"postIds":["73db53b2dea1","1cabea2b8e06","c52d911b62bf","ba9cf8724e57","5ed5265c6547","6543e6b10040","832986551df8"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["1806424e7d40","71ba0c73e34d","82dab4e3e80c","ffde04fbdc08"]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":6,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["4381241a6453","663e5db40707","48cfbbc390b5","cce0fe222a71"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["360fe56b658","b2c5ffaee997","1b7bbbc13b13","d31efbb641b4"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":4,"layout":1,"number":4,"postIds":[],"tagSlug":"cia"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"New Category:","promoId":"168c69de50b9"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["5ff4c1b1a790","f1ec1738cf45"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":6,"postIds":["bf0b2ef0e22e","355cb5944f9c","751387bd0caa","720d4e7c8a14","1c47033900e9","f8a121c3b019"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"How's a Hacker to learn from the news?"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["6fdab1f771ea"],"sectionHeader":"From the Vault! Visit the Archive for more tech history."}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["e0b20cbd7118","f537a2cc7962","233d5d16ab02","f145469a9f1d"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"how's a hacker to better the system?"}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":4,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["39ecf99e4e8c","bad56f28c278","dac99da790ed","7929a0d9010f"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":4,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["ff3548406eb1","1c47033900e9","5fb296b35c0b"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["a253df32a7d1","5dd5f238bc5"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":4,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["1c47033900e9","604e8ced841e","418271194682","285f1988957a"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":4,"postIds":[],"sectionHeader":"Latest !!"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["624d50c76e8e"],"sectionHeader":"Blast from the Past! "}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["82cec422d67d","e06ec40c3f16"],"sectionHeader":"Making Moves! "}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":4,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":2,"postIds":[],"sectionHeader":"Trending"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["99a31cb84065","c0985e261b4f"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":8,"postIds":["720d4e7c8a14","9f831b6d430d","ea221363235d","e4bac1d5c124","e51e5ec3af6"]}},{"type":1,"postListMetadata":{"source":4,"layout":1,"number":2,"postIds":[],"tagSlug":"Startup Scene","sectionHeader":"Startup Scene"}},{"type":1,"postListMetadata":{"source":4,"layout":1,"number":2,"postIds":[],"tagSlug":"Machine Learning","sectionHeader":"Machine Learning"}},{"type":1,"postListMetadata":{"source":4,"layout":1,"number":2,"postIds":[],"tagSlug":"Autonomous Cars","sectionHeader":"Autonomous Cars"}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"More of the Latest From Hacker Noon"}},{"type":1,"postListMetadata":{"source":4,"layout":1,"number":2,"postIds":[],"tagSlug":"Artificial Intelligence","sectionHeader":"can you build a brain better than your brain? "}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"The best sh*t for Hackers at noon."}},{"type":1,"postListMetadata":{"source":4,"layout":1,"number":2,"postIds":[],"tagSlug":"Letters","sectionHeader":"A roundup of the month's top posts."}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":6,"postIds":[],"sectionHeader":"\"I would love to change the world, but they won't give me the source code.\""}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"how's a hacker to change the system ?? "}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"how's a hacker to change the system ?? "}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["b5c64c964faf"]}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":6,"postIds":[],"sectionHeader":"\"don't take the realities of the world for granted.\""}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"The Latest From Hacker Noon"}},{"type":1,"postListMetadata":{"source":2,"layout":7,"number":7,"postIds":[],"sectionHeader":"What's Trending on Hacker Noon"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["8bdfb4b79037"]}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":4,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["4e992a26b711","300cc67ca6ee","4b14b1b2faff","529219a03409"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":2,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":2,"postIds":[],"sectionHeader":"\"Intention is at the heart of this discussion.\" - Kevin Mitnick "}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":4,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":2,"postIds":[],"sectionHeader":"how did you start your afternoon ??"}},{"type":1,"postListMetadata":{"source":4,"layout":1,"number":4,"postIds":[],"tagSlug":"Docker"}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":4,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":2,"layout":7,"number":7,"postIds":[],"sectionHeader":"Trending"}},{"type":1,"postListMetadata":{"source":4,"layout":2,"number":2,"postIds":[],"tagSlug":"Silicon Valley","sectionHeader":"Silicon Valley"}},{"type":1,"postListMetadata":{"source":4,"layout":2,"number":2,"postIds":[],"tagSlug":"JavaScript","sectionHeader":"Javascript"}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":1,"postIds":[],"tagSlug":"Letters","sectionHeader":"Letters"}},{"type":1,"postListMetadata":{"source":2,"layout":2,"number":4,"postIds":[],"sectionHeader":"Trending"}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":2,"layout":2,"number":6,"postIds":[],"sectionHeader":"Trending"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["85fc643ccc2f"]}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":6,"postIds":[],"sectionHeader":"Trending"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["95f87f51d79","8694020b96e8"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["88aabb0d2a7","31529b30d367","a293a4d7d4e7","d49e6bc22936","b3901584d61d"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["7cd00926828","5bd563fbb26e","f44e381951b6","7d20a0e38997","521cb2925155","8e70452f3eed"]}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":5,"postIds":[],"sectionHeader":"whats trending"}}],"tintColor":"#FF00FF00","lightText":false,"favicon":{"imageId":"1*76XiKOa05Yya6_CdYX8pVg.jpeg","filter":"","backgroundSize":"","originalWidth":8346,"originalHeight":8346,"strategy":"resample","height":0,"width":0},"colorPalette":{"defaultBackgroundSpectrum":{"colorPoints":[{"color":"#FF00A600","point":0},{"color":"#FF009A00","point":0.1},{"color":"#FF008E00","point":0.2},{"color":"#FF008100","point":0.3},{"color":"#FF007500","point":0.4},{"color":"#FF006800","point":0.5},{"color":"#FF005A00","point":0.6},{"color":"#FF044D01","point":0.7},{"color":"#FF083F04","point":0.8},{"color":"#FF093005","point":0.9},{"color":"#FF062004","point":1}],"backgroundColor":"#FFFFFFFF"},"tintBackgroundSpectrum":{"colorPoints":[{"color":"#FF00FF00","point":0},{"color":"#FF00F100","point":0.1},{"color":"#FF00E200","point":0.2},{"color":"#FF00D300","point":0.3},{"color":"#FF00C300","point":0.4},{"color":"#FF00B400","point":0.5},{"color":"#FF00A300","point":0.6},{"color":"#FF009200","point":0.7},{"color":"#FF008000","point":0.8},{"color":"#FF006D00","point":0.9},{"color":"#FF005900","point":1}],"backgroundColor":"#FF00FF00"},"highlightSpectrum":{"colorPoints":[{"color":"#FFD3FFC4","point":0},{"color":"#FFCBFFBA","point":0.1},{"color":"#FFC2FFB0","point":0.2},{"color":"#FFB9FFA6","point":0.3},{"color":"#FFB0FF9B","point":0.4},{"color":"#FFA7FF91","point":0.5},{"color":"#FF9DFF86","point":0.6},{"color":"#FF92FF7B","point":0.7},{"color":"#FF87FF70","point":0.8},{"color":"#FF7BFF65","point":0.9},{"color":"#FF6EFF59","point":1}],"backgroundColor":"#FFFFFFFF"}},"navItems":[{"type":4,"title":"Latest","url":"https://hackernoon.com/latest-tech-stories/home","topicId":"ee08869d885a","source":"topicId"},{"type":1,"title":"Dev","tagSlug":"software-development","url":"https://hackernoon.com/tagged/software-development","source":"tagSlug"},{"type":4,"title":"Blockchain","url":"https://hackernoon.com/blockchain/home","topicId":"ee063c681e1e","source":"topicId"},{"type":4,"title":"PM","url":"https://hackernoon.com/product-management-life/home","topicId":"25e9a79e14fe","source":"topicId"},{"type":4,"title":"Crypto Trading","url":"https://hackernoon.com/cryptocurrency-trading-bible/home","topicId":"3cfb1656fc30","source":"topicId"},{"type":4,"title":"AI ","url":"https://hackernoon.com/artificial-intelligence/home","topicId":"cd291aa79e72","source":"topicId"},{"type":3,"title":"Tech Jobs","url":"http://bit.ly/2LLdEDb"}],"colorBehavior":2,"instantArticlesState":0,"acceleratedMobilePagesState":0,"googleAnalyticsId":"UA-65623566-4","collectionFeatures":[13],"ampLogo":{"imageId":"","filter":"","backgroundSize":"","originalWidth":0,"originalHeight":0,"strategy":"resample","height":0,"width":0},"header":{"backgroundImage":{},"logoImage":{"id":"1*1HcGNZYjo78mH0faO3BnaQ@2x.png","originalWidth":3600,"originalHeight":432,"alt":"Hacker Noon"},"alignment":2,"layout":5},"type":"Collection"},"homeCollectionId":"3a8144eabfe3","title":"The definitive guide to Express, the Node.js Web Application Framework","detectedLanguage":"en","latestVersion":"ab9094050a6","latestPublishedVersion":"ab9094050a6","hasUnpublishedEdits":false,"latestRev":1419,"createdAt":1536402505397,"updatedAt":1536775453028,"acceptedAt":0,"firstPublishedAt":1536775452054,"latestPublishedAt":1536775452054,"vote":false,"experimentalCss":"","displayAuthor":"","content":{"subtitle":"You can get a PDF, ePub and Mobi version of this page for an easier reference, or to read it on your Kindle or tablet.","bodyModel":{"paragraphs":[{"name":"89cd","type":3,"text":"The definitive guide to Express, the Node.js Web Application Framework","markups":[]},{"name":"8204","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"1*huCrw2ybIkyg6NzbhvrAeA.jpeg","originalWidth":809,"originalHeight":606}},{"name":"ff1f","type":1,"text":"You can get a PDF, ePub and Mobi version of this page for an easier reference, or to read it on your Kindle or tablet.","markups":[{"type":3,"start":14,"end":32,"href":"https://pages.convertkit.com/7ba7d476a5/f0c9c5cdb4","title":"","rel":"","anchorType":0}]},{"name":"2e0c","type":13,"text":"Table of Contents","markups":[]},{"name":"59c8","type":9,"text":"Installation","markups":[{"type":3,"start":0,"end":12,"href":"https://medium.com/p/649352e2ae87#cf65","title":"","rel":"","anchorType":0}]},{"name":"0616","type":9,"text":"Hello World","markups":[{"type":3,"start":0,"end":11,"href":"https://medium.com/p/649352e2ae87#3c1b","title":"","rel":"","anchorType":0}]},{"name":"048b","type":9,"text":"Learn the basics of Express by understanding the Hello World code","markups":[{"type":3,"start":0,"end":65,"href":"https://medium.com/p/649352e2ae87#e2ea","title":"","rel":"","anchorType":0}]},{"name":"cf48","type":9,"text":"Request parameters","markups":[{"type":3,"start":0,"end":18,"href":"https://medium.com/p/649352e2ae87#12e8","title":"","rel":"","anchorType":0}]},{"name":"ea3b","type":9,"text":"How to retrieve the GET query string parameters","markups":[{"type":3,"start":0,"end":47,"href":"https://medium.com/p/649352e2ae87#abc5","title":"","rel":"","anchorType":0}]},{"name":"8d2c","type":9,"text":"How to retrieve the POST query string parameters","markups":[{"type":3,"start":0,"end":48,"href":"https://medium.com/p/649352e2ae87#901a","title":"","rel":"","anchorType":0}]},{"name":"a49e","type":9,"text":"Sending a response","markups":[{"type":3,"start":0,"end":18,"href":"https://medium.com/p/649352e2ae87#3f9c","title":"","rel":"","anchorType":0}]},{"name":"8e63","type":9,"text":"How to serve JSON data","markups":[{"type":3,"start":0,"end":22,"href":"https://medium.com/p/649352e2ae87#cb86","title":"","rel":"","anchorType":0}]},{"name":"1036","type":9,"text":"Manage cookies","markups":[{"type":3,"start":0,"end":14,"href":"https://medium.com/p/649352e2ae87#74db","title":"","rel":"","anchorType":0}]},{"name":"e235","type":9,"text":"Working with HTTP headers","markups":[{"type":3,"start":0,"end":25,"href":"https://medium.com/p/649352e2ae87#6ba1","title":"","rel":"","anchorType":0}]},{"name":"919c","type":9,"text":"Redirects","markups":[{"type":3,"start":0,"end":9,"href":"https://medium.com/p/649352e2ae87#5fc3","title":"","rel":"","anchorType":0}]},{"name":"7350","type":9,"text":"Routing","markups":[{"type":3,"start":0,"end":7,"href":"https://medium.com/p/649352e2ae87#32e3","title":"","rel":"","anchorType":0}]},{"name":"e640","type":9,"text":"CORS","markups":[{"type":3,"start":0,"end":4,"href":"https://medium.com/p/649352e2ae87#243c","title":"","rel":"","anchorType":0}]},{"name":"32be","type":9,"text":"Templating","markups":[{"type":3,"start":0,"end":10,"href":"https://medium.com/p/649352e2ae87#a525","title":"","rel":"","anchorType":0}]},{"name":"dcca","type":9,"text":"Introduction to Pug","markups":[{"type":3,"start":0,"end":19,"href":"https://medium.com/p/649352e2ae87#98bb","title":"","rel":"","anchorType":0}]},{"name":"b5d3","type":9,"text":"Middleware","markups":[{"type":3,"start":0,"end":10,"href":"https://medium.com/p/649352e2ae87#af6b","title":"","rel":"","anchorType":0}]},{"name":"29f5","type":9,"text":"Serving static files","markups":[{"type":3,"start":0,"end":20,"href":"https://medium.com/p/649352e2ae87#3603","title":"","rel":"","anchorType":0}]},{"name":"9d5f","type":9,"text":"Send files","markups":[{"type":3,"start":0,"end":10,"href":"https://medium.com/p/649352e2ae87#9942","title":"","rel":"","anchorType":0}]},{"name":"662c","type":9,"text":"Sessions","markups":[{"type":3,"start":0,"end":8,"href":"https://medium.com/p/649352e2ae87#e5a4","title":"","rel":"","anchorType":0}]},{"name":"03c0","type":9,"text":"Validating input","markups":[{"type":3,"start":0,"end":16,"href":"https://medium.com/p/649352e2ae87#2c7d","title":"","rel":"","anchorType":0}]},{"name":"29c4","type":9,"text":"Sanitizing input","markups":[{"type":3,"start":0,"end":16,"href":"https://medium.com/p/649352e2ae87#f1c1","title":"","rel":"","anchorType":0}]},{"name":"5f41","type":9,"text":"Handling forms","markups":[{"type":3,"start":0,"end":14,"href":"https://medium.com/p/649352e2ae87#7fa4","title":"","rel":"","anchorType":0}]},{"name":"2092","type":9,"text":"File uploads in forms","markups":[{"type":3,"start":0,"end":21,"href":"https://medium.com/p/649352e2ae87#fb32","title":"","rel":"","anchorType":0}]},{"name":"c9d0","type":9,"text":"How to create a self-signed HTTPS certificate for Node.js to test apps locally","markups":[{"type":3,"start":0,"end":78,"href":"https://medium.com/p/649352e2ae87#f32a","title":"","rel":"","anchorType":0}]},{"name":"b2f1","type":9,"text":"Setup Let’s Encrypt for Express","markups":[{"type":3,"start":0,"end":31,"href":"https://medium.com/p/649352e2ae87#c2d0","title":"","rel":"","anchorType":0}]},{"name":"1bc9","type":1,"text":"Node.js is an amazing tool for building networking services and applications.","markups":[]},{"name":"5e31","type":1,"text":"Express builds on top of its features to provide easy to use functionality that satisfy the needs of the Web Server use case.","markups":[]},{"name":"cbe8","type":1,"text":"It’s Open Source, free, easy to extend, very performant, and has lots and lots of pre-built packages you can just drop in and use, to perform all kind of things.","markups":[]},{"name":"cf65","type":13,"text":"Installation","markups":[]},{"name":"2be0","type":1,"text":"You can install Express into any project with npm:","markups":[{"type":3,"start":46,"end":49,"href":"https://flaviocopes.com/npm/","title":"","rel":"","anchorType":0}]},{"name":"9632","type":8,"text":"npm install express --save","markups":[{"type":10,"start":0,"end":26}]},{"name":"5fbd","type":1,"text":"or Yarn:","markups":[{"type":3,"start":3,"end":7,"href":"https://flaviocopes.com/yarn/","title":"","rel":"","anchorType":0}]},{"name":"ddb4","type":8,"text":"yarn add express","markups":[{"type":10,"start":0,"end":16}]},{"name":"d418","type":1,"text":"Both commands will also work in an empty directory, to start up your project from scratch, although npm does not create a package.json file at all, and Yarn creates a basic one.","markups":[{"type":10,"start":100,"end":103},{"type":10,"start":122,"end":134}]},{"name":"45df","type":1,"text":"Just run npm init or yarn init if you're starting a new project from scratch.","markups":[{"type":10,"start":9,"end":17},{"type":10,"start":21,"end":30}]},{"name":"3c1b","type":13,"text":"Hello World","markups":[]},{"name":"5939","type":1,"text":"We’re ready to create our first Express Web Server.","markups":[]},{"name":"3d1c","type":1,"text":"Here is some code:","markups":[]},{"name":"5feb","type":8,"text":"const express = require('express')\nconst app = express()","markups":[{"type":10,"start":0,"end":56}]},{"name":"4709","type":8,"text":"app.get('/', (req, res) =\x3e res.send('Hello World!'))\napp.listen(3000, () =\x3e console.log('Server ready'))","markups":[{"type":10,"start":0,"end":104}]},{"name":"9382","type":1,"text":"Save this to an index.js file in your project root folder, and start the server using","markups":[{"type":10,"start":16,"end":24}]},{"name":"2890","type":8,"text":"node index.js","markups":[{"type":10,"start":0,"end":13}]},{"name":"18f6","type":1,"text":"You can open the browser to port 3000 on localhost and you should see the Hello World! message.","markups":[{"type":10,"start":74,"end":86}]},{"name":"e2ea","type":13,"text":"Learn the basics of Express by understanding the Hello World code","markups":[]},{"name":"f4df","type":1,"text":"Those 4 lines of code do a lot behind the scenes.","markups":[]},{"name":"0555","type":1,"text":"First, we import the express package to the express value.","markups":[{"type":10,"start":21,"end":28},{"type":10,"start":44,"end":51}]},{"name":"a89f","type":1,"text":"We instantiate an application by calling its app() method.","markups":[{"type":10,"start":45,"end":50}]},{"name":"1951","type":1,"text":"Once we have the application object, we tell it to listen for GET requests on the / path, using the get() method.","markups":[{"type":10,"start":82,"end":83},{"type":10,"start":100,"end":105}]},{"name":"0bad","type":1,"text":"There is a method for every HTTP verb: get(), post(), put(), delete(), patch():","markups":[{"type":10,"start":39,"end":44},{"type":10,"start":46,"end":52},{"type":10,"start":54,"end":59},{"type":10,"start":61,"end":69},{"type":10,"start":71,"end":78},{"type":1,"start":33,"end":37}]},{"name":"bc33","type":8,"text":"app.get('/', (req, res) =\x3e { /* */ })\napp.post('/', (req, res) =\x3e { /* */ })\napp.put('/', (req, res) =\x3e { /* */ })\napp.delete('/', (req, res) =\x3e { /* */ })\napp.patch('/', (req, res) =\x3e { /* */ })","markups":[{"type":10,"start":0,"end":195}]},{"name":"b48a","type":1,"text":"Those methods accept a callback function, which is called when a request is started, and we need to handle it.","markups":[]},{"name":"ae88","type":1,"text":"We pass in an arrow function:","markups":[]},{"name":"52d2","type":8,"text":"(req, res) =\x3e res.send('Hello World!')","markups":[{"type":10,"start":0,"end":38}]},{"name":"1f45","type":1,"text":"Express sends us two objects in this callback, which we called req and res, that represent the Request and the Response objects.","markups":[{"type":10,"start":63,"end":66},{"type":10,"start":71,"end":74}]},{"name":"7c50","type":1,"text":"Request is the HTTP request. It can give us all the info about that, including the request parameters, the headers, the body of the request, and more.","markups":[]},{"name":"2631","type":1,"text":"Response is the HTTP response object that we’ll send to the client.","markups":[]},{"name":"d6da","type":1,"text":"What we do in this callback is to send the ‘Hello World!’ string to the client, using the Response.send()method.","markups":[{"type":10,"start":90,"end":105}]},{"name":"3ac8","type":1,"text":"This method sets that string as the body, and it closes the connection.","markups":[]},{"name":"17bb","type":1,"text":"The last line of the example actually starts the server and tells it to listen on port 3000. We pass in a callback that is called when the server is ready to accept new requests.","markups":[{"type":10,"start":87,"end":91}]},{"name":"12e8","type":3,"text":"Request parameters","markups":[]},{"name":"c3eb","type":1,"text":"I mentioned how the Request object holds all the HTTP request information.","markups":[]},{"name":"8f97","type":1,"text":"These are the main properties you’ll likely use:","markups":[]},{"name":"55a9","type":9,"text":".app holds a reference to the Express app object","markups":[{"type":1,"start":0,"end":4}]},{"name":"25f4","type":9,"text":".baseUrl the base path on which the app responds","markups":[{"type":1,"start":0,"end":8}]},{"name":"b380","type":9,"text":".body contains the data submitted in the request body (must be parsed and populated manually before you can access it)","markups":[{"type":1,"start":0,"end":5}]},{"name":"076a","type":9,"text":".cookies contains the cookies sent by the request (needs the cookie-parsermiddleware)","markups":[{"type":10,"start":61,"end":74},{"type":1,"start":0,"end":8}]},{"name":"9199","type":9,"text":".hostname the server hostname","markups":[{"type":1,"start":0,"end":9}]},{"name":"b212","type":9,"text":".ip the server IP","markups":[{"type":1,"start":0,"end":3}]},{"name":"4417","type":9,"text":".method the HTTP method used","markups":[{"type":1,"start":0,"end":7}]},{"name":"e534","type":9,"text":".params the route named parameters","markups":[{"type":1,"start":0,"end":7}]},{"name":"c844","type":9,"text":".path the URL path","markups":[{"type":1,"start":0,"end":5}]},{"name":"0da3","type":9,"text":".protocol the request protocol","markups":[{"type":1,"start":0,"end":9}]},{"name":"a489","type":9,"text":".query an object containing all the query strings used in the request","markups":[{"type":1,"start":0,"end":6}]},{"name":"3aae","type":9,"text":".secure true if the request is secure (uses HTTPS)","markups":[{"type":1,"start":0,"end":7}]},{"name":"485f","type":9,"text":".signedCookies contains the signed cookies sent by the request (needs the cookie-parsermiddleware)","markups":[{"type":10,"start":74,"end":87},{"type":1,"start":0,"end":14}]},{"name":"8366","type":9,"text":".xhr true if the request is an XMLHttpRequest","markups":[{"type":3,"start":31,"end":45,"href":"https://flaviocopes.com/xhr/","title":"","rel":"","anchorType":0},{"type":1,"start":0,"end":4}]},{"name":"abc5","type":13,"text":"How to retrieve the GET query string parameters","markups":[]},{"name":"c1b9","type":1,"text":"The query string is the part that comes after the URL path and starts with an exclamation mark ?.","markups":[{"type":10,"start":95,"end":96}]},{"name":"49f3","type":1,"text":"Example:","markups":[]},{"name":"bcb9","type":8,"text":"?name=flavio","markups":[{"type":10,"start":0,"end":12}]},{"name":"7529","type":1,"text":"Multiple query parameters can be added using &:","markups":[{"type":10,"start":45,"end":46}]},{"name":"4b75","type":8,"text":"?name=flavio&age=35","markups":[{"type":10,"start":0,"end":19}]},{"name":"115a","type":1,"text":"How do you get those query string values in Express?","markups":[]},{"name":"0d93","type":1,"text":"Express makes it very easy by populating the Request.query object for us:","markups":[{"type":10,"start":45,"end":58}]},{"name":"660b","type":8,"text":"const express = require('express')\nconst app = express()","markups":[{"type":10,"start":0,"end":56}]},{"name":"ada0","type":8,"text":"app.get('/', (req, res) =\x3e {\n  console.log(req.query)\n})","markups":[{"type":10,"start":0,"end":56}]},{"name":"e6b7","type":8,"text":"app.listen(8080)","markups":[{"type":10,"start":0,"end":16}]},{"name":"d328","type":1,"text":"This object is filled with a property for each query parameter.","markups":[]},{"name":"b8fd","type":1,"text":"If there are no query params, it’s an empty object.","markups":[]},{"name":"d7e8","type":1,"text":"This makes it easy to iterate on it using the for…in loop:","markups":[]},{"name":"b58a","type":8,"text":"for (const key in req.query) {\n  console.log(key, req.query[key])\n}","markups":[{"type":10,"start":0,"end":67}]},{"name":"16b7","type":1,"text":"This will print the query property key and the value.","markups":[]},{"name":"7543","type":1,"text":"You can access single properties as well:","markups":[]},{"name":"457b","type":8,"text":"req.query.name //flavio\nreq.query.age //35","markups":[{"type":10,"start":0,"end":42}]},{"name":"901a","type":13,"text":"How to retrieve the POST query string parameters","markups":[]},{"name":"f96c","type":1,"text":"POST query parameters are sent by HTTP clients for example by forms, or when performing a POST request sending data.","markups":[]},{"name":"b34d","type":1,"text":"How can you access this data?","markups":[]},{"name":"911a","type":1,"text":"If the data was sent as JSON, using Content-Type: application/json, you will use the express.json() middleware:","markups":[{"type":10,"start":36,"end":66},{"type":10,"start":85,"end":99}]},{"name":"2f31","type":8,"text":"const express = require('express')\nconst app = express()","markups":[{"type":10,"start":0,"end":56}]},{"name":"64e7","type":8,"text":"app.use(express.json())","markups":[{"type":10,"start":0,"end":23}]},{"name":"f969","type":1,"text":"If the data was sent as JSON, using Content-Type: application/x-www-form-urlencoded, you will use the express.urlencoded() middleware:","markups":[{"type":10,"start":36,"end":83},{"type":10,"start":102,"end":122}]},{"name":"6c6b","type":8,"text":"const express = require('express')\nconst app = express()","markups":[{"type":10,"start":0,"end":56}]},{"name":"6b89","type":8,"text":"app.use(express.urlencoded())","markups":[{"type":10,"start":0,"end":29}]},{"name":"548a","type":1,"text":"In both cases you can access the data by referencing it from Request.body:","markups":[{"type":10,"start":61,"end":73}]},{"name":"c5a5","type":8,"text":"app.post('/form', (req, res) =\x3e {\n  const name = req.body.name\n})","markups":[{"type":10,"start":0,"end":65}]},{"name":"a8c6","type":6,"text":"Note: older Express versions required the use of the body-parser module to process POST data. This is no longer the case as of Express 4.16 (released in September 2017) and later versions.","markups":[{"type":10,"start":53,"end":64},{"type":2,"start":0,"end":188}]},{"name":"3f9c","type":3,"text":"Sending a response","markups":[]},{"name":"5557","type":1,"text":"In the Hello World example we used the Response.send() method to send a simple string as a response, and to close the connection:","markups":[{"type":10,"start":39,"end":54}]},{"name":"7856","type":8,"text":"(req, res) =\x3e res.send('Hello World!')","markups":[{"type":10,"start":0,"end":38}]},{"name":"19e2","type":1,"text":"If you pass in a string, it sets the Content-Type header to text/html.","markups":[{"type":10,"start":37,"end":49},{"type":10,"start":60,"end":69}]},{"name":"3d03","type":1,"text":"if you pass in an object or an array, it sets the application/json Content-Type header, and parses that parameter into JSON.","markups":[{"type":10,"start":50,"end":66},{"type":10,"start":67,"end":79}]},{"name":"af97","type":1,"text":"send() automatically sets the Content-Length HTTP response header.","markups":[{"type":10,"start":0,"end":6},{"type":10,"start":30,"end":44}]},{"name":"ca56","type":1,"text":"send() also automatically closes the connection.","markups":[{"type":10,"start":0,"end":6}]},{"name":"64a8","type":13,"text":"Use end() to send an empty response","markups":[]},{"name":"c4f2","type":1,"text":"An alternative way to send the response, without any body, it’s by using the Response.end() method:","markups":[{"type":10,"start":77,"end":91}]},{"name":"cf0e","type":8,"text":"res.end()","markups":[{"type":10,"start":0,"end":9}]},{"name":"2636","type":13,"text":"Set the HTTP response status","markups":[]},{"name":"1438","type":1,"text":"Use the Response.status():","markups":[{"type":10,"start":8,"end":25}]},{"name":"bd62","type":8,"text":"res.status(404).end()","markups":[{"type":10,"start":0,"end":21}]},{"name":"1831","type":1,"text":"or","markups":[]},{"name":"9912","type":8,"text":"res.status(404).send('File not found')","markups":[{"type":10,"start":0,"end":38}]},{"name":"685a","type":1,"text":"sendStatus() is a shortcut:","markups":[{"type":10,"start":0,"end":12}]},{"name":"09cd","type":8,"text":"res.sendStatus(200)\n// === res.status(200).send('OK')","markups":[{"type":10,"start":0,"end":53}]},{"name":"6212","type":8,"text":"res.sendStatus(403)\n// === res.status(403).send('Forbidden')","markups":[{"type":10,"start":0,"end":60}]},{"name":"aa5a","type":8,"text":"res.sendStatus(404)\n// === res.status(404).send('Not Found')","markups":[{"type":10,"start":0,"end":60}]},{"name":"6a40","type":8,"text":"res.sendStatus(500)\n// === res.status(500).send('Internal Server Error')","markups":[{"type":10,"start":0,"end":72}]},{"name":"cb86","type":3,"text":"How to serve JSON data","markups":[]},{"name":"b0a5","type":1,"text":"When you listen for connections on a route in Express, the callback function will be invoked on every network call with a Request object instance and a Response object instance.","markups":[]},{"name":"aa96","type":1,"text":"Example:","markups":[]},{"name":"01cd","type":8,"text":"app.get('/', (req, res) =\x3e res.send('Hello World!'))","markups":[{"type":10,"start":0,"end":52}]},{"name":"3cc3","type":1,"text":"Here we used the Response.send() method, which accepts any string.","markups":[{"type":10,"start":17,"end":32}]},{"name":"b03c","type":1,"text":"You can send JSON to the client by using Response.json(), a useful method.","markups":[{"type":10,"start":41,"end":56}]},{"name":"253f","type":1,"text":"It accepts an object or array, and converts it to JSON before sending it:","markups":[]},{"name":"fa03","type":8,"text":"res.json({ username: 'Flavio' })","markups":[{"type":10,"start":0,"end":32}]},{"name":"74db","type":3,"text":"Manage cookies","markups":[]},{"name":"a1d2","type":13,"text":"How to use the `Response.cookie()` method to manipulate your cookies","markups":[]},{"name":"f0af","type":1,"text":"Use the Response.cookie() method to manipulate your cookies.","markups":[{"type":10,"start":8,"end":25}]},{"name":"6fa3","type":1,"text":"Examples:","markups":[]},{"name":"988c","type":8,"text":"res.cookie('username', 'Flavio')","markups":[{"type":10,"start":0,"end":32}]},{"name":"8547","type":1,"text":"This method accepts a third parameter which contains various options:","markups":[]},{"name":"99fc","type":8,"text":"res.cookie('username', 'Flavio', { domain: '.flaviocopes.com', path: '/administrator', secure: true })","markups":[{"type":10,"start":0,"end":102}]},{"name":"2a0f","type":8,"text":"res.cookie('username', 'Flavio', { expires: new Date(Date.now() + 900000), httpOnly: true })","markups":[{"type":10,"start":0,"end":92}]},{"name":"0d67","type":1,"text":"The most useful parameters you can set are:","markups":[]},{"name":"6553","type":1,"text":"domainthe cookie domain name","markups":[{"type":10,"start":0,"end":6},{"type":3,"start":10,"end":28,"href":"http://localhost:1313/cookies/#set-a-cookie-domain","title":"","rel":"","anchorType":0}]},{"name":"c7f2","type":1,"text":"expiresset the cookie expiration date. If missing, or 0, the cookie is a session cookie","markups":[{"type":10,"start":0,"end":7},{"type":3,"start":15,"end":37,"href":"http://localhost:1313/cookies/#set-a-cookie-expiration-date","title":"","rel":"","anchorType":0}]},{"name":"af65","type":1,"text":"httpOnlyset the cookie to be accessible only by the web server. See HttpOnly","markups":[{"type":10,"start":0,"end":8},{"type":3,"start":68,"end":76,"href":"https://flaviocopes.com/cookies/#httponly","title":"","rel":"","anchorType":0}]},{"name":"f1bd","type":1,"text":"maxAgeset the expiry time relative to the current time, expressed in milliseconds","markups":[{"type":10,"start":0,"end":6}]},{"name":"f035","type":1,"text":"paththe cookie path. Defaults to /","markups":[{"type":10,"start":0,"end":4},{"type":3,"start":8,"end":19,"href":"https://flaviocopes.com/cookies/#set-a-cookie-path","title":"","rel":"","anchorType":0}]},{"name":"26a9","type":1,"text":"secureMarks the cookie HTTPS only","markups":[{"type":10,"start":0,"end":6},{"type":3,"start":16,"end":33,"href":"https://flaviocopes.com/cookies/#secure","title":"","rel":"","anchorType":0}]},{"name":"1333","type":1,"text":"signedset the cookie to be signed","markups":[{"type":10,"start":0,"end":6}]},{"name":"810e","type":1,"text":"sameSiteValue of SameSite","markups":[{"type":10,"start":0,"end":8},{"type":10,"start":17,"end":25},{"type":3,"start":17,"end":25,"href":"https://flaviocopes.com/cookies/#samesite","title":"","rel":"","anchorType":0}]},{"name":"13d8","type":1,"text":"A cookie can be cleared with","markups":[]},{"name":"3406","type":8,"text":"res.clearCookie('username')","markups":[{"type":10,"start":0,"end":27}]},{"name":"6ba1","type":3,"text":"Working with HTTP headers","markups":[]},{"name":"2d38","type":13,"text":"Access HTTP headers values from a request","markups":[]},{"name":"fdec","type":1,"text":"You can access all the HTTP headers using the Request.headers property:","markups":[{"type":10,"start":46,"end":61}]},{"name":"0457","type":8,"text":"app.get('/', (req, res) =\x3e {\n  console.log(req.headers)\n})","markups":[{"type":10,"start":0,"end":58}]},{"name":"8df6","type":1,"text":"Use the Request.header() method to access one individual request header value:","markups":[{"type":10,"start":8,"end":24}]},{"name":"e671","type":8,"text":"app.get('/', (req, res) =\x3e {\n  req.header('User-Agent')\n})","markups":[{"type":10,"start":0,"end":58}]},{"name":"d9d1","type":13,"text":"Change any HTTP header value of a response","markups":[]},{"name":"a107","type":1,"text":"You can change any HTTP header value using Response.set():","markups":[{"type":10,"start":43,"end":57}]},{"name":"023b","type":8,"text":"res.set('Content-Type', 'text/html')","markups":[{"type":10,"start":0,"end":36}]},{"name":"4bfb","type":1,"text":"There is a shortcut for the Content-Type header however:","markups":[]},{"name":"111f","type":8,"text":"res.type('.html')\n// =\x3e 'text/html'","markups":[{"type":10,"start":0,"end":35}]},{"name":"76b2","type":8,"text":"res.type('html')\n// =\x3e 'text/html'","markups":[{"type":10,"start":0,"end":34}]},{"name":"c973","type":8,"text":"res.type('json')\n// =\x3e 'application/json'","markups":[{"type":10,"start":0,"end":41}]},{"name":"de58","type":8,"text":"res.type('application/json')\n// =\x3e 'application/json'","markups":[{"type":10,"start":0,"end":53}]},{"name":"f327","type":8,"text":"res.type('png')\n// =\x3e image/png:","markups":[{"type":10,"start":0,"end":32}]},{"name":"5fc3","type":3,"text":"Redirects","markups":[]},{"name":"f4ce","type":1,"text":"Redirects are common in Web Development. You can create a redirect using the Response.redirect()method:","markups":[{"type":10,"start":77,"end":96}]},{"name":"0f29","type":8,"text":"res.redirect('/go-there')","markups":[{"type":10,"start":0,"end":25}]},{"name":"f430","type":1,"text":"This creates a 302 redirect.","markups":[]},{"name":"0c95","type":1,"text":"A 301 redirect is made in this way:","markups":[]},{"name":"c702","type":8,"text":"res.redirect(301, '/go-there')","markups":[{"type":10,"start":0,"end":30}]},{"name":"061f","type":1,"text":"You can specify an absolute path (/go-there), an absolute url (https://anothersite.com), a relative path (go-there) or use the .. to go back one level:","markups":[{"type":10,"start":34,"end":43},{"type":10,"start":63,"end":86},{"type":10,"start":106,"end":114},{"type":10,"start":127,"end":129}]},{"name":"57a6","type":8,"text":"res.redirect('../go-there')\nres.redirect('..')","markups":[{"type":10,"start":0,"end":46}]},{"name":"0322","type":1,"text":"You can also redirect back to the Referer HTTP header value (defaulting to / if not set) using","markups":[{"type":10,"start":75,"end":76}]},{"name":"6491","type":8,"text":"res.redirect('back')","markups":[{"type":10,"start":0,"end":20}]},{"name":"32e3","type":3,"text":"Routing","markups":[]},{"name":"a871","type":1,"text":"Routing is the process of determining what should happen when a URL is called, or also which parts of the application should handle a specific incoming request.","markups":[]},{"name":"0d18","type":1,"text":"In the Hello World example, we used this code","markups":[]},{"name":"536e","type":8,"text":"app.get('/', (req, res) =\x3e { /* */ })","markups":[{"type":10,"start":0,"end":37}]},{"name":"e88e","type":1,"text":"This creates a route that maps accessing the root domain URL / using the HTTP GET method to the response we want to provide.","markups":[{"type":10,"start":61,"end":62}]},{"name":"5ff7","type":13,"text":"Named parameters","markups":[]},{"name":"4b45","type":1,"text":"What if we want to listen for custom requests, maybe we want to create a service that accepts a string, and returns that uppercase, and we don’t want the parameter to be sent as a query string, but part of the URL. We use named parameters:","markups":[]},{"name":"6321","type":8,"text":"app.get('/uppercase/:theValue', (req, res) =\x3e res.send(req.params.theValue.toUpperCase()))","markups":[{"type":10,"start":0,"end":90}]},{"name":"74fd","type":1,"text":"If we send a request to /uppercase/test, we'll get TEST in the body of the response.","markups":[{"type":10,"start":24,"end":39},{"type":10,"start":51,"end":55}]},{"name":"78c7","type":1,"text":"You can use multiple named parameters in the same URL, and they will all be stored in req.params.","markups":[{"type":10,"start":86,"end":96}]},{"name":"1555","type":13,"text":"Use a regular expression to match a path","markups":[]},{"name":"32a4","type":1,"text":"You can use regular expressions to match multiple paths with one statement:","markups":[{"type":3,"start":12,"end":31,"href":"https://flaviocopes.com/javascript-regular-expressions/","title":"","rel":"","anchorType":0}]},{"name":"36d0","type":8,"text":"app.get(/post/, (req, res) =\x3e { /* */ })","markups":[{"type":10,"start":0,"end":40}]},{"name":"50a4","type":1,"text":"will match /post, /post/first, /thepost, /posting/something, and so on.","markups":[{"type":10,"start":11,"end":16},{"type":10,"start":18,"end":29},{"type":10,"start":31,"end":39},{"type":10,"start":41,"end":59}]},{"name":"243c","type":3,"text":"CORS","markups":[]},{"name":"96a6","type":1,"text":"A JavaScript application running in the browser can usually only access HTTP resources on the same domain (origin) that serves it.","markups":[]},{"name":"6522","type":1,"text":"Loading images or scripts/styles always works, but XHR and Fetch calls to another server will fail, unless that server implements a way to allow that connection.","markups":[]},{"name":"ed9f","type":1,"text":"This way is called CORS, Cross-Origin Resource Sharing.","markups":[{"type":1,"start":25,"end":54}]},{"name":"2880","type":1,"text":"Also loading Web Fonts using @font-face has same-origin policy by default, and other less popular things (like WebGL textures and drawImage resources loaded in the Canvas API).","markups":[{"type":10,"start":29,"end":39},{"type":10,"start":130,"end":139}]},{"name":"7668","type":1,"text":"One very important thing that needs CORS is ES Modules, recently introduced in modern browsers.","markups":[{"type":1,"start":44,"end":54}]},{"name":"1542","type":1,"text":"If you don’t set up a CORS policy on the server that allows to serve 3rd part origins, the request will fail.","markups":[{"type":1,"start":34,"end":47}]},{"name":"a04c","type":1,"text":"Fetch example:","markups":[]},{"name":"76a4","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"1*7dadBaGuH3B_PU8z29enIw.png","originalWidth":1243,"originalHeight":329}},{"name":"c5a9","type":1,"text":"XHR example:","markups":[]},{"name":"6208","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"1*REjz-bvrKhnj8kfCBBY8UA.png","originalWidth":1252,"originalHeight":491}},{"name":"d1d3","type":1,"text":"A Cross-Origin resource fails if it’s:","markups":[]},{"name":"cbff","type":9,"text":"to a different domain","markups":[{"type":1,"start":15,"end":21}]},{"name":"0520","type":9,"text":"to a different subdomain","markups":[{"type":1,"start":15,"end":24}]},{"name":"3380","type":9,"text":"to a different port","markups":[{"type":1,"start":15,"end":19}]},{"name":"a48c","type":9,"text":"to a different protocol","markups":[{"type":1,"start":15,"end":23}]},{"name":"dc87","type":1,"text":"and it’s there for your security, to prevent malicious users to exploit the Web Platform.","markups":[]},{"name":"1fd1","type":1,"text":"But if you control both the server and the client, you have all the good reasons to allow them to talk to each other.","markups":[]},{"name":"53b8","type":1,"text":"How?","markups":[]},{"name":"0a00","type":1,"text":"It depends on your server-side stack.","markups":[]},{"name":"fa19","type":3,"text":"Browser support","markups":[]},{"name":"3996","type":1,"text":"Pretty good (basically all except IE\x3c10):","markups":[]},{"name":"0843","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"1*Iky9_Ne6chRFDJR7jinrSw.png","originalWidth":920,"originalHeight":502}},{"name":"2273","type":13,"text":"Example with Express","markups":[]},{"name":"4d8c","type":1,"text":"If you are using Node.js and Express as a framework, use the CORS middleware package.","markups":[{"type":3,"start":61,"end":84,"href":"https://github.com/expressjs/cors","title":"","rel":"","anchorType":0}]},{"name":"3d64","type":1,"text":"Here’s a simple implementation of an Express Node.js server:","markups":[]},{"name":"aa05","type":8,"text":"const express = require('express')\nconst app = express()","markups":[{"type":10,"start":0,"end":56}]},{"name":"0333","type":8,"text":"app.get('/without-cors', (req, res, next) =\x3e {\n  res.json({ msg: '😞 no CORS, no party!' })\n})","markups":[{"type":10,"start":0,"end":94}]},{"name":"503f","type":8,"text":"const server = app.listen(3000, () =\x3e {\n  console.log('Listening on port %s', server.address().port)\n})","markups":[{"type":10,"start":0,"end":103}]},{"name":"93a2","type":1,"text":"If you hit /without-cors with a fetch request from a different origin, it's going to raise the CORS issue.","markups":[{"type":10,"start":11,"end":24}]},{"name":"0c3c","type":1,"text":"All you need to do to make things work out is to require the cors package linked above, and pass it in as a middleware function to an endpoint request handler:","markups":[{"type":10,"start":61,"end":65}]},{"name":"3fa0","type":8,"text":"const express = require('express')\nconst cors = require('cors')\nconst app = express()","markups":[{"type":10,"start":0,"end":85}]},{"name":"61d6","type":8,"text":"app.get('/with-cors', cors(), (req, res, next) =\x3e {\n  res.json({ msg: 'WHOAH with CORS it works! 🔝 🎉' })\n})","markups":[{"type":10,"start":0,"end":109}]},{"name":"961e","type":8,"text":"/* the rest of the app */","markups":[{"type":10,"start":0,"end":25}]},{"name":"9b28","type":1,"text":"I made a simple Glitch example. Here is the client working, and here’s its code: https://glitch.com/edit/#!/flavio-cors-client.","markups":[{"type":3,"start":32,"end":50,"href":"https://flavio-cors-client.glitch.me/","title":"","rel":"","anchorType":0},{"type":3,"start":81,"end":126,"href":"https://glitch.com/edit/#!/flavio-cors-client","title":"","rel":"","anchorType":0}]},{"name":"2113","type":1,"text":"This is the Node.js Express server: https://glitch.com/edit/#!/flaviocopes-cors-example-express","markups":[{"type":3,"start":36,"end":95,"href":"https://glitch.com/edit/#!/flaviocopes-cors-example-express","title":"","rel":"","anchorType":0}]},{"name":"b7a4","type":1,"text":"Note how the request that fails because it does not handle the CORS headings correctly is still received, as you can see in the Network panel, where you find the message the server sent:","markups":[]},{"name":"2d11","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"1*V_k9xuUdF53zDHmNhkwCSg.png","originalWidth":878,"originalHeight":391}},{"name":"ff7d","type":13,"text":"Allow only specific origins","markups":[]},{"name":"ddef","type":1,"text":"This example has a problem however: ANY request will be accepted by the server as cross-origin.","markups":[]},{"name":"aaa2","type":1,"text":"As you can see in the Network panel, the request that passed has a response header access-control-allow-origin: *:","markups":[{"type":10,"start":83,"end":113}]},{"name":"9d56","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"1*eYshr5kURTCXK_J8b3047Q.png","originalWidth":1039,"originalHeight":397}},{"name":"5ccc","type":1,"text":"You need to configure the server to only allow one origin to serve, and block all the others.","markups":[]},{"name":"e81c","type":1,"text":"Using the same cors Node library, here's how you would do it:","markups":[{"type":10,"start":15,"end":19}]},{"name":"2605","type":8,"text":"const cors = require('cors')","markups":[{"type":10,"start":0,"end":28}]},{"name":"57fe","type":8,"text":"const corsOptions = {\n  origin: 'https://yourdomain.com'\n}","markups":[{"type":10,"start":0,"end":58}]},{"name":"8d21","type":8,"text":"app.get('/products/:id', cors(corsOptions), (req, res, next) =\x3e {\n  //...\n})","markups":[{"type":10,"start":0,"end":76}]},{"name":"ed54","type":1,"text":"You can serve more as well:","markups":[]},{"name":"29bf","type":8,"text":"const whitelist = ['http://example1.com', 'http://example2.com']\nconst corsOptions = {\n  origin: function(origin, callback) {\n    if (whitelist.indexOf(origin) !== -1) {\n      callback(null, true)\n    } else {\n      callback(new Error('Not allowed by CORS'))\n    }\n  }\n}","markups":[{"type":10,"start":0,"end":270}]},{"name":"1631","type":13,"text":"Preflight","markups":[]},{"name":"0737","type":1,"text":"There are some requests that are handled in a “simple” way. All GET requests belong to this group.","markups":[{"type":10,"start":64,"end":67}]},{"name":"eca3","type":1,"text":"Also some POST and HEAD requests do as well.","markups":[{"type":10,"start":10,"end":14},{"type":10,"start":19,"end":23},{"type":2,"start":5,"end":9}]},{"name":"58e9","type":1,"text":"POST requests are also in this group if they satisfy the requirement of using a Content-Type of","markups":[{"type":10,"start":0,"end":4}]},{"name":"8c7a","type":9,"text":"application/x-www-form-urlencoded","markups":[{"type":10,"start":0,"end":33}]},{"name":"8b0e","type":9,"text":"multipart/form-data","markups":[{"type":10,"start":0,"end":19}]},{"name":"d85d","type":9,"text":"text/plain","markups":[{"type":10,"start":0,"end":10}]},{"name":"e3cd","type":1,"text":"All other requests must run through a pre-approval phase, called preflight. The browser does this to determine if it has the permission to perform an action, by issuing an OPTIONS request.","markups":[{"type":10,"start":172,"end":179}]},{"name":"ea24","type":1,"text":"A preflight request contains a few headers that the server will use to check permissions (irrelevant fields omitted):","markups":[]},{"name":"5202","type":8,"text":"OPTIONS /the/resource/you/request\nAccess-Control-Request-Method: POST\nAccess-Control-Request-Headers: origin, x-requested-with, accept\nOrigin: https://your-origin.com","markups":[{"type":10,"start":0,"end":166},{"type":3,"start":143,"end":166,"href":"https://your-origin.com","title":"","rel":"","anchorType":0}]},{"name":"fea0","type":1,"text":"The server will respond with something like this(irrelevant fields omitted):","markups":[]},{"name":"7b28","type":8,"text":"HTTP/1.1 200 OK\nAccess-Control-Allow-Origin: https://your-origin.com\nAccess-Control-Allow-Methods: POST, GET, OPTIONS, DELETE","markups":[{"type":10,"start":0,"end":125}]},{"name":"f04e","type":1,"text":"We checked for POST, but the server tells us we can also issue other HTTP request types for that particular resource.","markups":[]},{"name":"7857","type":1,"text":"Following the Node.js Express example above, the server must also handle the OPTIONS request:","markups":[]},{"name":"d97e","type":8,"text":"var express = require('express')\nvar cors = require('cors')\nvar app = express()","markups":[{"type":10,"start":0,"end":79}]},{"name":"e713","type":8,"text":"//allow OPTIONS on just one resource\napp.options('/the/resource/you/request', cors())","markups":[{"type":10,"start":0,"end":85}]},{"name":"46a6","type":8,"text":"//allow OPTIONS on all resources\napp.options('*', cors())","markups":[{"type":10,"start":0,"end":57}]},{"name":"a525","type":3,"text":"Templating","markups":[]},{"name":"82a1","type":1,"text":"Express is capable of handling server-side template engines.","markups":[]},{"name":"b94a","type":1,"text":"Template engines allow us to add data to a view, and generate HTML dynamically.","markups":[]},{"name":"1d80","type":1,"text":"Express uses Jade as the default. Jade is the old version of Pug, specifically Pug 1.0.","markups":[]},{"name":"42ee","type":6,"text":"The name was changed from Jade to Pug due to a trademark issue in 2016, when the project released version 2. You can still use Jade, aka Pug 1.0, but going forward, it’s best to use Pug 2.0","markups":[{"type":2,"start":0,"end":189}]},{"name":"9f48","type":1,"text":"Although the last version of Jade is 3 years old (at the time of writing, summer 2018), it’s still the default in Express for backward compatibility reasons.","markups":[]},{"name":"b2af","type":1,"text":"In any new project, you should use Pug or another engine of your choice. The official site of Pug is https://pugjs.org/.","markups":[{"type":3,"start":101,"end":119,"href":"https://pugjs.org/","title":"","rel":"","anchorType":0}]},{"name":"a2fa","type":1,"text":"You can use many different template engines, including Pug, Handlebars, Mustache, EJS and more.","markups":[]},{"name":"6c09","type":3,"text":"Using Pug","markups":[]},{"name":"71b1","type":1,"text":"To use Pug we must first install it:","markups":[]},{"name":"bc34","type":8,"text":"npm install pug","markups":[{"type":10,"start":0,"end":15}]},{"name":"ef2f","type":1,"text":"and when initializing the Express app, we need to set it:","markups":[]},{"name":"b337","type":8,"text":"const express = require('express')\nconst app = express()\napp.set('view engine', 'pug')","markups":[{"type":10,"start":0,"end":86}]},{"name":"1356","type":1,"text":"We can now start writing our templates in .pug files.","markups":[{"type":10,"start":42,"end":46}]},{"name":"8aee","type":1,"text":"Create an about view:","markups":[]},{"name":"eaab","type":8,"text":"app.get('/about', (req, res) =\x3e {\n  res.render('about')\n})","markups":[{"type":10,"start":0,"end":58}]},{"name":"8078","type":1,"text":"and the template in views/about.pug:","markups":[{"type":10,"start":20,"end":35}]},{"name":"062a","type":8,"text":"p Hello from Flavio","markups":[{"type":10,"start":0,"end":19}]},{"name":"5fa6","type":1,"text":"This template will create a p tag with the content Hello from Flavio.","markups":[{"type":10,"start":28,"end":29},{"type":10,"start":51,"end":68}]},{"name":"e3cc","type":1,"text":"You can interpolate a variable using","markups":[]},{"name":"0f1d","type":8,"text":"app.get('/about', (req, res) =\x3e {\n  res.render('about', { name: 'Flavio' })\n})","markups":[{"type":10,"start":0,"end":78}]},{"name":"38c0","type":8,"text":"p Hello from #{name}","markups":[{"type":10,"start":0,"end":20}]},{"name":"bb83","type":1,"text":"This is a very short introduction to Pug, in the context of using it with Express. Look at the Pug guide for more information on how to use Pug.","markups":[{"type":3,"start":95,"end":104,"href":"https://flaviocopes.com/pug","title":"","rel":"","anchorType":0}]},{"name":"f317","type":1,"text":"If you are used to template engines that use HTML and interpolate variables, like Handlebars (described next), you might run into issues, especially when you need to convert existing HTML to Pug. This online converter from HTML to Jade (which is very similar, but a little different than Pug) will be a great help: https://jsonformatter.org/html-to-jade","markups":[{"type":3,"start":315,"end":353,"href":"https://jsonformatter.org/html-to-jade","title":"","rel":"","anchorType":0}]},{"name":"d5f2","type":13,"text":"Using Handlebars","markups":[]},{"name":"a1c7","type":1,"text":"Let’s try and use Handlebars instead of Pug.","markups":[]},{"name":"3aaa","type":1,"text":"You can install it using npm install hbs.","markups":[{"type":10,"start":25,"end":40}]},{"name":"d252","type":1,"text":"Put an about.hbs template file in the views/ folder:","markups":[{"type":10,"start":7,"end":16},{"type":10,"start":38,"end":44}]},{"name":"cc66","type":8,"text":"Hello from {{name}}","markups":[{"type":10,"start":0,"end":19}]},{"name":"d441","type":1,"text":"and then use this Express configuration to serve it on /about:","markups":[{"type":10,"start":55,"end":61}]},{"name":"3fff","type":8,"text":"const express = require('express')\nconst app = express()\nconst hbs = require('hbs')","markups":[{"type":10,"start":0,"end":83}]},{"name":"b804","type":8,"text":"app.set('view engine', 'hbs')\napp.set('views', path.join(__dirname, 'views'))","markups":[{"type":10,"start":0,"end":77}]},{"name":"c6a6","type":8,"text":"app.get('/about', (req, res) =\x3e {\n  res.render('about', { name: 'Flavio' })\n})","markups":[{"type":10,"start":0,"end":78}]},{"name":"6c88","type":8,"text":"app.listen(3000, () =\x3e console.log('Server ready'))","markups":[{"type":10,"start":0,"end":51}]},{"name":"2eb9","type":1,"text":"You can also render a React application server-side, using the express-react-views package.","markups":[{"type":10,"start":63,"end":82},{"type":3,"start":63,"end":82,"href":"https://github.com/reactjs/express-react-views","title":"","rel":"","anchorType":0},{"type":1,"start":13,"end":51}]},{"name":"7bd1","type":1,"text":"Start with npm install express-react-views react react-dom.","markups":[{"type":10,"start":11,"end":58}]},{"name":"13ab","type":1,"text":"Now instead of requiring hbs we require express-react-views and use that as the engine, using jsx files:","markups":[{"type":10,"start":25,"end":28},{"type":10,"start":40,"end":59},{"type":10,"start":94,"end":97}]},{"name":"212c","type":8,"text":"const express = require('express')\nconst app = express()","markups":[{"type":10,"start":0,"end":56}]},{"name":"b599","type":8,"text":"app.set('view engine', 'jsx')\napp.engine('jsx', require('express-react-views').createEngine())","markups":[{"type":10,"start":0,"end":94}]},{"name":"4c82","type":8,"text":"app.get('/about', (req, res) =\x3e {\n  res.render('about', { name: 'Flavio' })\n})","markups":[{"type":10,"start":0,"end":78}]},{"name":"e888","type":8,"text":"app.listen(3000, () =\x3e console.log('Server ready'))","markups":[{"type":10,"start":0,"end":51}]},{"name":"9be6","type":1,"text":"Just put an about.jsx file in views/, and calling /about should present you an \"Hello from Flavio\" string:","markups":[{"type":10,"start":12,"end":21},{"type":10,"start":30,"end":36},{"type":10,"start":50,"end":56}]},{"name":"7f38","type":8,"text":"const React = require('react')","markups":[{"type":10,"start":0,"end":30}]},{"name":"4068","type":8,"text":"class HelloMessage extends React.Component {\n  render() {\n    return \x3cdiv\x3eHello from {this.props.name}\x3c/div\x3e\n  }\n}","markups":[{"type":10,"start":0,"end":114}]},{"name":"8116","type":8,"text":"module.exports = HelloMessage","markups":[{"type":10,"start":0,"end":29}]},{"name":"98bb","type":3,"text":"Introduction to Pug","markups":[]},{"name":"399c","type":1,"text":"What is Pug? It’s a template engine for server-side Node.js applications.","markups":[]},{"name":"54d8","type":1,"text":"Express is capable of handling server-side template engines. Template engines allow us to add data to a view, and generate HTML dynamically.","markups":[]},{"name":"c4fa","type":1,"text":"Pug is a new name for an old thing. It’s Jade 2.0.","markups":[{"type":2,"start":41,"end":49}]},{"name":"26c5","type":1,"text":"The name was changed from Jade to Pug due to a trademark issue in 2016, when the project released version 2. You can still use Jade, aka Pug 1.0, but going forward, it’s best to use Pug 2.0","markups":[]},{"name":"d7e3","type":6,"text":"Also see the differences between Jade and Pug","markups":[{"type":3,"start":13,"end":45,"href":"https://pugjs.org/api/migration-v2.html","title":"","rel":"","anchorType":0},{"type":2,"start":0,"end":45}]},{"name":"0c35","type":1,"text":"Express uses Jade as the default. Jade is the old version of Pug, specifically Pug 1.0.","markups":[]},{"name":"9751","type":1,"text":"Although the last version of Jade is 3 years old (at the time of writing, summer 2018), it’s still the default in Express for backward compatibility reasons.","markups":[]},{"name":"b9dd","type":1,"text":"In any new project, you should use Pug or another engine of your choice. The official site of Pug is https://pugjs.org/.","markups":[{"type":3,"start":101,"end":119,"href":"https://pugjs.org/","title":"","rel":"","anchorType":0}]},{"name":"157e","type":13,"text":"How does Pug look like","markups":[]},{"name":"b3cd","type":8,"text":"p Hello from Flavio","markups":[{"type":10,"start":0,"end":19}]},{"name":"5524","type":1,"text":"This template will create a p tag with the content Hello from Flavio.","markups":[{"type":10,"start":28,"end":29},{"type":10,"start":51,"end":68}]},{"name":"3a57","type":1,"text":"As you can see, Pug is quite special. It takes the tag name as the first thing in a line, and the rest is the content that goes inside it.","markups":[]},{"name":"f472","type":1,"text":"If you are used to template engines that use HTML and interpolate variables, like Handlebars (described next), you might run into issues, especially when you need to convert existing HTML to Pug. This online converter from HTML to Jade (which is very similar, but a little different than Pug) will be a great help: https://jsonformatter.org/html-to-jade","markups":[{"type":3,"start":315,"end":353,"href":"https://jsonformatter.org/html-to-jade","title":"","rel":"","anchorType":0}]},{"name":"3e84","type":13,"text":"Install Pug","markups":[]},{"name":"9e07","type":1,"text":"Installing Pug is as simple as running npm install:","markups":[{"type":10,"start":39,"end":50}]},{"name":"6425","type":8,"text":"npm install pug","markups":[{"type":10,"start":0,"end":15}]},{"name":"7161","type":13,"text":"Setup Pug to be the template engine in Express","markups":[]},{"name":"7d7e","type":1,"text":"and when initializing the Express app, we need to set it:","markups":[]},{"name":"4cc5","type":8,"text":"const express = require('express')\nconst app = express()\napp.set('view engine', 'pug')\napp.set('views', path.join(__dirname, 'views'))","markups":[{"type":10,"start":0,"end":134}]},{"name":"0e4c","type":13,"text":"Your first Pug template","markups":[]},{"name":"101c","type":1,"text":"Create an about view:","markups":[]},{"name":"4aec","type":8,"text":"app.get('/about', (req, res) =\x3e {\n  res.render('about')\n})","markups":[{"type":10,"start":0,"end":58}]},{"name":"b9c8","type":1,"text":"and the template in views/about.pug:","markups":[{"type":10,"start":20,"end":35}]},{"name":"aa79","type":8,"text":"p Hello from Flavio","markups":[{"type":10,"start":0,"end":19}]},{"name":"a11d","type":1,"text":"This template will create a p tag with the content Hello from Flavio.","markups":[{"type":10,"start":28,"end":29},{"type":10,"start":51,"end":68}]},{"name":"e050","type":13,"text":"Interpolating variables in Pug","markups":[]},{"name":"41bb","type":1,"text":"You can interpolate a variable using","markups":[]},{"name":"4872","type":8,"text":"app.get('/about', (req, res) =\x3e {\n  res.render('about', { name: 'Flavio' })\n})","markups":[{"type":10,"start":0,"end":78}]},{"name":"8eda","type":8,"text":"p Hello from #{name}","markups":[{"type":10,"start":0,"end":20}]},{"name":"8281","type":13,"text":"Interpolate a function return value","markups":[]},{"name":"0942","type":1,"text":"You can interpolate a function return value using","markups":[]},{"name":"d28c","type":8,"text":"app.get('/about', (req, res) =\x3e {\n  res.render('about', { getName: () =\x3e 'Flavio' })\n})","markups":[{"type":10,"start":0,"end":87}]},{"name":"1327","type":8,"text":"p Hello from #{getName()}","markups":[{"type":10,"start":0,"end":25}]},{"name":"2b1e","type":13,"text":"Adding id and class attributes to elements","markups":[]},{"name":"ee35","type":8,"text":"p#title\np.title","markups":[{"type":10,"start":0,"end":15}]},{"name":"d820","type":13,"text":"Set the doctype","markups":[]},{"name":"6ef4","type":8,"text":"doctype html","markups":[{"type":10,"start":0,"end":12}]},{"name":"0e70","type":13,"text":"Meta tags","markups":[]},{"name":"7a83","type":8,"text":"html\n  head\n    meta(charset='utf-8')\n    meta(http-equiv='X-UA-Compatible', content='IE=edge')\n    meta(name='description', content='Some description')\n    meta(name='viewport', content='width=device-width, initial-scale=1')","markups":[{"type":10,"start":0,"end":225}]},{"name":"416b","type":13,"text":"Adding scripts and styles","markups":[]},{"name":"9f34","type":8,"text":"html\n  head\n    script(src=\"script.js\")\n    script(src='//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js')","markups":[{"type":10,"start":0,"end":117}]},{"name":"6b80","type":8,"text":"    link(rel='stylesheet', href='css/main.css')","markups":[{"type":10,"start":0,"end":47}]},{"name":"f9ae","type":13,"text":"Inline scripts","markups":[]},{"name":"436f","type":8,"text":"script alert('test')","markups":[{"type":10,"start":0,"end":20}]},{"name":"a6a6","type":8,"text":"script\n  (function(b,o,i,l,e,r){b.GoogleAnalyticsObject=l;b[l]||(b[l]=\n  function(){(b[l].q=b[l].q||[]).push(arguments)});b[l].l=+new Date;\n  e=o.createElement(i);r=o.getElementsByTagName(i)[0];\n  e.src='//www.google-analytics.com/analytics.js';\n  r.parentNode.insertBefore(e,r)}(window,document,'script','ga'));\n  ga('create','UA-XXXXX-X');ga('send','pageview');","markups":[{"type":10,"start":0,"end":363}]},{"name":"9506","type":13,"text":"Loops","markups":[]},{"name":"84cd","type":8,"text":"ul\n  each color in ['Red', 'Yellow', 'Blue']\n    li= color","markups":[{"type":10,"start":0,"end":58}]},{"name":"604c","type":8,"text":"ul\n  each color, index in ['Red', 'Yellow', 'Blue']\n    li= 'Color number ' + index + ': ' + color","markups":[{"type":10,"start":0,"end":98}]},{"name":"8964","type":13,"text":"Conditionals","markups":[]},{"name":"d51a","type":8,"text":"if name\n  h2 Hello from #{name}\nelse\n  h2 Hello","markups":[{"type":10,"start":0,"end":47}]},{"name":"3509","type":1,"text":"else-if works too:","markups":[]},{"name":"ce17","type":8,"text":"if name\n  h2 Hello from #{name}\nelse if anotherName\n  h2 Hello from #{anotherName}\nelse\n  h2 Hello","markups":[{"type":10,"start":0,"end":98}]},{"name":"a7f2","type":13,"text":"Set variables","markups":[]},{"name":"9c1a","type":1,"text":"You can set variables in Pug templates:","markups":[]},{"name":"a496","type":8,"text":"- var name = 'Flavio'\n- var age = 35\n- var roger = { name: 'Roger' }\n- var dogs = ['Roger', 'Syd']","markups":[{"type":10,"start":0,"end":98}]},{"name":"84b0","type":13,"text":"Incrementing variables","markups":[]},{"name":"e5a0","type":1,"text":"You can increment a numeric variable using ++:","markups":[{"type":10,"start":43,"end":45}]},{"name":"626c","type":8,"text":"age++","markups":[{"type":10,"start":0,"end":5}]},{"name":"18cc","type":13,"text":"Assigning variables to element values","markups":[]},{"name":"5cd0","type":8,"text":"p= name","markups":[{"type":10,"start":0,"end":7}]},{"name":"2a89","type":8,"text":"span.age= age","markups":[{"type":10,"start":0,"end":13}]},{"name":"d120","type":13,"text":"Iterating over variables","markups":[]},{"name":"b5bb","type":1,"text":"You can use for or each. There is no difference.","markups":[{"type":10,"start":12,"end":15},{"type":10,"start":19,"end":23}]},{"name":"4451","type":8,"text":"for dog in dogs\n    li= dog","markups":[{"type":10,"start":0,"end":27}]},{"name":"7901","type":8,"text":"ul\n  each dog in dogs\n    li= dog","markups":[{"type":10,"start":0,"end":33}]},{"name":"d520","type":1,"text":"You can use .length to get the number of items:","markups":[{"type":10,"start":12,"end":19}]},{"name":"4802","type":8,"text":"p There are #{values.length}","markups":[{"type":10,"start":0,"end":28}]},{"name":"2612","type":1,"text":"while is another kind of loop:","markups":[{"type":10,"start":0,"end":5}]},{"name":"7e86","type":8,"text":"- var n = 0;","markups":[{"type":10,"start":0,"end":12}]},{"name":"53f4","type":8,"text":"ul\n  while n \x3c= 5\n    li= n++","markups":[{"type":10,"start":0,"end":29}]},{"name":"2409","type":13,"text":"Including other Pug files","markups":[]},{"name":"b0ef","type":1,"text":"In a Pug file you can include other Pug files:","markups":[]},{"name":"9bd1","type":8,"text":"include otherfile.pug","markups":[{"type":10,"start":0,"end":21}]},{"name":"019d","type":13,"text":"Defining blocks","markups":[]},{"name":"e8b1","type":1,"text":"A well organized template system will define a base template, and then all the other templates extend from it.","markups":[]},{"name":"09d3","type":1,"text":"The way a part of a template can be extended is by using blocks:","markups":[]},{"name":"aade","type":8,"text":"html\n  head\n    script(src=\"script.js\")\n    script(src='//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js')","markups":[{"type":10,"start":0,"end":117}]},{"name":"dc9f","type":8,"text":"    link(rel='stylesheet', href='css/main.css')\n    block head\n  body\n    block body\n      h1 Home page\n      p welcome","markups":[{"type":10,"start":0,"end":119}]},{"name":"17e2","type":1,"text":"In this case one block, body, has some content, while head does not. head is intended to be used to add additional content to the heading, while the body content is made to be overridden by other pages.","markups":[{"type":10,"start":24,"end":28},{"type":10,"start":54,"end":58},{"type":10,"start":69,"end":73},{"type":10,"start":149,"end":153}]},{"name":"5259","type":13,"text":"Extending a base template","markups":[]},{"name":"4c58","type":1,"text":"A template can extend a base template by using the extends keyword:","markups":[{"type":10,"start":51,"end":58}]},{"name":"9704","type":8,"text":"extends home.pug","markups":[{"type":10,"start":0,"end":16}]},{"name":"e8c7","type":1,"text":"Once this is done, you need to redefine blocks. All the content of the template must go into blocks, otherwise the engine does not know where to put them.","markups":[]},{"name":"9fc1","type":1,"text":"Example:","markups":[]},{"name":"3978","type":8,"text":"extends home.pug","markups":[{"type":10,"start":0,"end":16}]},{"name":"250b","type":8,"text":"block body\n  h1 Another page\n  p Hey!\n  ul\n    li Something\n    li Something else","markups":[{"type":10,"start":0,"end":81}]},{"name":"cac0","type":1,"text":"You can redefine one or more blocks. The ones not redefined will be kept with the original template content.","markups":[]},{"name":"e31b","type":13,"text":"Comments","markups":[]},{"name":"717e","type":1,"text":"Comments in Pug can be of two types: visible or not visible in the resulting HTML.","markups":[]},{"name":"ff54","type":13,"text":"Visible","markups":[]},{"name":"b683","type":1,"text":"Inline:","markups":[]},{"name":"f446","type":8,"text":"// some comment","markups":[{"type":10,"start":0,"end":15}]},{"name":"a90d","type":1,"text":"Block:","markups":[]},{"name":"9273","type":8,"text":"//\n  some\n  comment","markups":[{"type":10,"start":0,"end":19}]},{"name":"1ec0","type":13,"text":"Invisible","markups":[]},{"name":"6a78","type":1,"text":"Inline:","markups":[]},{"name":"d43c","type":8,"text":"//- some comment","markups":[{"type":10,"start":0,"end":16}]},{"name":"738b","type":1,"text":"Block:","markups":[]},{"name":"bf0a","type":8,"text":"//-\n  some\n  comment","markups":[{"type":10,"start":0,"end":20}]},{"name":"af6b","type":3,"text":"Middleware","markups":[]},{"name":"a0b9","type":1,"text":"A middleware is a function that hooks into the routing process, and performs some operation at some point, depending on what it want to do.","markups":[]},{"name":"b86a","type":1,"text":"It’s commonly used to edit the request or response objects, or terminate the request before it reaches the route handler code.","markups":[]},{"name":"3868","type":1,"text":"It’s added to the execution stack like this:","markups":[]},{"name":"a0c1","type":8,"text":"app.use((req, res, next) =\x3e { /* */ })","markups":[{"type":10,"start":0,"end":38}]},{"name":"a457","type":1,"text":"This is similar to defining a route, but in addition to the Request and Response objects instances, we also have a reference to the next middleware function, which we assign to the variable next.","markups":[{"type":10,"start":190,"end":194},{"type":2,"start":132,"end":136}]},{"name":"fb63","type":1,"text":"We always call next() at the end of our middleware function, to pass the execution to the next handler, unless we want to prematurely end the response, and send it back to the client.","markups":[{"type":10,"start":15,"end":21}]},{"name":"a6b6","type":1,"text":"You typically use pre-made middleware, in the form of npm packages. A big list of the available ones is here.","markups":[{"type":10,"start":54,"end":57},{"type":3,"start":104,"end":108,"href":"https://expressjs.com/en/resources/middleware.html","title":"","rel":"","anchorType":0}]},{"name":"16fb","type":1,"text":"One example is cookie-parser, which is used to parse the cookies into the req.cookies object. You install it using npm install cookie-parser and you can use it like this:","markups":[{"type":10,"start":15,"end":28},{"type":10,"start":74,"end":85},{"type":10,"start":115,"end":140}]},{"name":"a3d9","type":8,"text":"const express = require('express')\nconst app = express()\nconst cookieParser = require('cookie-parser')","markups":[{"type":10,"start":0,"end":102}]},{"name":"0562","type":8,"text":"app.get('/', (req, res) =\x3e res.send('Hello World!'))","markups":[{"type":10,"start":0,"end":52}]},{"name":"47c2","type":8,"text":"app.use(cookieParser())\napp.listen(3000, () =\x3e console.log('Server ready'))","markups":[{"type":10,"start":0,"end":75}]},{"name":"5a62","type":1,"text":"You can also set a middleware function to run for specific routes only, not for all, by using it as the second parameter of the route definition:","markups":[]},{"name":"60c6","type":8,"text":"const myMiddleware = (req, res, next) =\x3e {\n  /* ... */\n  next()\n}","markups":[{"type":10,"start":0,"end":65}]},{"name":"12d6","type":8,"text":"app.get('/', myMiddleware, (req, res) =\x3e res.send('Hello World!'))","markups":[{"type":10,"start":0,"end":66}]},{"name":"beda","type":1,"text":"If you need to store data that’s generated in a middleware to pass it down to subsequent middleware functions, or to the request handler, you can use the Request.locals object. It will attach that data to the current request:","markups":[{"type":10,"start":154,"end":168}]},{"name":"ca31","type":8,"text":"req.locals.name = 'Flavio'","markups":[{"type":10,"start":0,"end":26}]},{"name":"3603","type":3,"text":"Serving static files","markups":[]},{"name":"c365","type":1,"text":"It’s common to have images, CSS and more in a public subfolder, and expose them to the root level:","markups":[{"type":10,"start":46,"end":52}]},{"name":"9a2d","type":8,"text":"const express = require('express')\nconst app = express()","markups":[{"type":10,"start":0,"end":56}]},{"name":"d530","type":8,"text":"app.use(express.static('public'))","markups":[{"type":10,"start":0,"end":33}]},{"name":"0efb","type":8,"text":"/* ... */","markups":[{"type":10,"start":0,"end":9}]},{"name":"f565","type":8,"text":"app.listen(3000, () =\x3e console.log('Server ready'))","markups":[{"type":10,"start":0,"end":51}]},{"name":"27ef","type":1,"text":"If you have an index.html file in public/, that will be served if you now hit the root domain URL (http://localhost:3000)","markups":[{"type":10,"start":15,"end":25},{"type":10,"start":34,"end":41},{"type":10,"start":99,"end":120}]},{"name":"9942","type":3,"text":"Send files","markups":[]},{"name":"4edc","type":1,"text":"Express provides a handy method to transfer a file as attachment: Response.download().","markups":[{"type":10,"start":66,"end":85}]},{"name":"f270","type":1,"text":"Once a user hits a route that sends a file using this method, browsers will prompt the user for download.","markups":[]},{"name":"9509","type":1,"text":"The Response.download() method allows you to send a file attached to the request, and the browser instead of showing it in the page, it will save it to disk.","markups":[{"type":10,"start":4,"end":23}]},{"name":"b04f","type":8,"text":"app.get('/', (req, res) =\x3e res.download('./file.pdf'))","markups":[{"type":10,"start":0,"end":54}]},{"name":"8505","type":1,"text":"In the context of an app:","markups":[]},{"name":"4db0","type":8,"text":"const express = require('express')\nconst app = express()","markups":[{"type":10,"start":0,"end":56}]},{"name":"ae77","type":8,"text":"app.get('/', (req, res) =\x3e res.download('./file.pdf'))\napp.listen(3000, () =\x3e console.log('Server ready'))","markups":[{"type":10,"start":0,"end":106}]},{"name":"f901","type":1,"text":"You can set the file to be sent with a custom filename:","markups":[]},{"name":"374d","type":8,"text":"res.download('./file.pdf', 'user-facing-filename.pdf')","markups":[{"type":10,"start":0,"end":54}]},{"name":"f770","type":1,"text":"This method provides a callback function which you can use to execute code once the file has been sent:","markups":[]},{"name":"7c39","type":8,"text":"res.download('./file.pdf', 'user-facing-filename.pdf', (err) =\x3e {\n  if (err) {\n    //handle error\n    return\n  } else {\n    //do something\n  }\n})","markups":[{"type":10,"start":0,"end":145}]},{"name":"e5a4","type":3,"text":"Sessions","markups":[]},{"name":"633f","type":1,"text":"By default Express requests are sequential and no request can be linked to each other. There is no way to know if this request comes from a client that already performed a request previously.","markups":[]},{"name":"ad1f","type":1,"text":"Users cannot be identified unless using some kind of mechanism that makes it possible.","markups":[]},{"name":"41e6","type":1,"text":"That’s what sessions are.","markups":[]},{"name":"1dd2","type":1,"text":"When implemented, every user of you API or website will be assigned a unique session, and this allows you to store the user state.","markups":[]},{"name":"39da","type":1,"text":"We’ll use the express-session module, which is maintained by the Express team.","markups":[{"type":10,"start":14,"end":29}]},{"name":"8248","type":1,"text":"You can install it using","markups":[]},{"name":"2f3f","type":8,"text":"npm install express-session","markups":[{"type":10,"start":0,"end":27}]},{"name":"07f6","type":1,"text":"and once you’re done, you can instantiate it in your application with","markups":[]},{"name":"fdda","type":8,"text":"const session = require('express-session')","markups":[{"type":10,"start":0,"end":42}]},{"name":"67d6","type":1,"text":"This is a middleware, so you install it in Express using","markups":[{"type":2,"start":29,"end":36}]},{"name":"4d78","type":8,"text":"const express = require('express')\nconst session = require('express-session')","markups":[{"type":10,"start":0,"end":77}]},{"name":"b1bb","type":8,"text":"const app = express()\napp.use(session(\n  'secret': '343ji43j4n3jn4jk3n'\n))","markups":[{"type":10,"start":0,"end":74}]},{"name":"1b26","type":1,"text":"After this is done, all the requests to the app routes are now using sessions.","markups":[]},{"name":"31a6","type":1,"text":"secret is the only required parameter, but there are many more you can use. It should be a randomly unique string for you application.","markups":[{"type":10,"start":0,"end":6}]},{"name":"f507","type":1,"text":"The session is attached to the request, so you can access it using req.session here:","markups":[{"type":10,"start":67,"end":78}]},{"name":"88ed","type":8,"text":"app.get('/', (req, res, next) =\x3e {\n  // req.session\n}","markups":[{"type":10,"start":0,"end":53}]},{"name":"768e","type":1,"text":"This object can be used to get data out of the session, and also to set data:","markups":[]},{"name":"4e2d","type":8,"text":"req.session.name = 'Flavio'\nconsole.log(req.session.name) // 'Flavio'","markups":[{"type":10,"start":0,"end":69}]},{"name":"84b1","type":1,"text":"This data is serialized as JSON when stored, so you are safe to use nested objects.","markups":[]},{"name":"8db5","type":1,"text":"You can use sessions to communicate data to middleware that’s executed later, or to retrieve it later on on subsequent requests.","markups":[]},{"name":"136f","type":1,"text":"Where is the session data stored? it depends on how you set up the express-session module.","markups":[{"type":10,"start":67,"end":82}]},{"name":"971c","type":1,"text":"It can store session data in","markups":[]},{"name":"7928","type":9,"text":"memory, not meant for production","markups":[{"type":1,"start":0,"end":6}]},{"name":"69b8","type":9,"text":"a database like MySQL or Mongo","markups":[{"type":1,"start":2,"end":10}]},{"name":"5171","type":9,"text":"a memory cache like Redis or Memcached","markups":[{"type":1,"start":2,"end":14}]},{"name":"38b4","type":6,"text":"There is a big list of 3rd packages that implement a wide variety of different compatible caching stores in https://github.com/expressjs/session","markups":[{"type":3,"start":108,"end":144,"href":"https://github.com/expressjs/session","title":"","rel":"","anchorType":0},{"type":2,"start":0,"end":144}]},{"name":"586e","type":1,"text":"All solutions store the session id in a cookie, and keep the data server-side. The client will receive the session id in a cookie, and will send it along with every HTTP request.","markups":[]},{"name":"420a","type":1,"text":"We’ll reference that server-side to associate the session id with the data stored locally.","markups":[]},{"name":"f86c","type":1,"text":"Memory is the default, it requires no special setup on your part, it’s the simplest thing but it’s meant only for development purposes.","markups":[]},{"name":"f8c3","type":1,"text":"The best choice is a memory cache like Redis, for which you need to setup its own infrastructure.","markups":[]},{"name":"bd8a","type":1,"text":"Another popular package to manage sessions in Express is cookie-session, which has a big difference: it stores data client-side in the cookie. I do not recommend doing that because storing data in cookies means that it's stored client-side, and sent back and forth in every single request made by the user. It's also limited in size, as it can only store 4 kilobytes of data. Cookies also need to be secured, but by default they are not, since secure Cookies are possible on HTTPS sites and you need to configure them if you have proxies.","markups":[{"type":10,"start":57,"end":71}]},{"name":"2c7d","type":3,"text":"Validating input","markups":[]},{"name":"186f","type":1,"text":"Say you have a POST endpoint that accepts the name, email and age parameters:","markups":[]},{"name":"35ad","type":8,"text":"const express = require('express')\nconst app = express()","markups":[{"type":10,"start":0,"end":56}]},{"name":"6a52","type":8,"text":"app.use(express.json())","markups":[{"type":10,"start":0,"end":23}]},{"name":"3a22","type":8,"text":"app.post('/form', (req, res) =\x3e {\n  const name  = req.body.name\n  const email = req.body.email\n  const age   = req.body.age\n})","markups":[{"type":10,"start":0,"end":126}]},{"name":"a26c","type":1,"text":"How do you server-side validate those results to make sure","markups":[]},{"name":"e29f","type":9,"text":"name is a string of at least 3 characters?","markups":[]},{"name":"9c12","type":9,"text":"email is a real email?","markups":[]},{"name":"77f0","type":9,"text":"age is a number, between 0 and 110?","markups":[]},{"name":"17df","type":1,"text":"The best way to handle validating any kind of input coming from outside in Express is by using the express-validator package:","markups":[{"type":10,"start":99,"end":116},{"type":3,"start":99,"end":124,"href":"https://express-validator.github.io/","title":"","rel":"","anchorType":0}]},{"name":"948d","type":8,"text":"npm install express-validator","markups":[{"type":10,"start":0,"end":29}]},{"name":"47fa","type":1,"text":"You require the check object from the package:","markups":[{"type":10,"start":16,"end":21}]},{"name":"a8a8","type":8,"text":"const { check } = require('express-validator/check')","markups":[{"type":10,"start":0,"end":52}]},{"name":"2e1b","type":1,"text":"We pass an array of check() calls as the second argument of the post() call. Every check() call accepts the parameter name as argument:","markups":[{"type":10,"start":20,"end":27},{"type":10,"start":64,"end":70},{"type":10,"start":83,"end":90}]},{"name":"1a11","type":8,"text":"app.post('/form', [\n  check('name').isLength({ min: 3 }),\n  check('email').isEmail(),\n  check('age').isNumeric()\n], (req, res) =\x3e {\n  const name  = req.body.name\n  const email = req.body.email\n  const age   = req.body.age\n})","markups":[{"type":10,"start":0,"end":224}]},{"name":"1c5a","type":1,"text":"Notice I used","markups":[]},{"name":"6f73","type":9,"text":"isLength()","markups":[{"type":10,"start":0,"end":10}]},{"name":"2f89","type":9,"text":"isEmail()","markups":[{"type":10,"start":0,"end":9}]},{"name":"6449","type":9,"text":"isNumeric()","markups":[{"type":10,"start":0,"end":11}]},{"name":"9899","type":1,"text":"There are many more of these methods, all coming from validator.js, including:","markups":[{"type":3,"start":54,"end":66,"href":"https://github.com/chriso/validator.js#validators","title":"","rel":"","anchorType":0}]},{"name":"9765","type":9,"text":"contains(), check if value contains the specified value","markups":[{"type":10,"start":0,"end":10}]},{"name":"55a6","type":9,"text":"equals(), check if value equals the specified value","markups":[{"type":10,"start":0,"end":8}]},{"name":"eef5","type":9,"text":"isAlpha()","markups":[{"type":10,"start":0,"end":9}]},{"name":"31c3","type":9,"text":"isAlphanumeric()","markups":[{"type":10,"start":0,"end":16}]},{"name":"2cb0","type":9,"text":"isAscii()","markups":[{"type":10,"start":0,"end":9}]},{"name":"a221","type":9,"text":"isBase64()","markups":[{"type":10,"start":0,"end":10}]},{"name":"dd05","type":9,"text":"isBoolean()","markups":[{"type":10,"start":0,"end":11}]},{"name":"d802","type":9,"text":"isCurrency()","markups":[{"type":10,"start":0,"end":12}]},{"name":"c6b8","type":9,"text":"isDecimal()","markups":[{"type":10,"start":0,"end":11}]},{"name":"f1d3","type":9,"text":"isEmpty()","markups":[{"type":10,"start":0,"end":9}]},{"name":"745f","type":9,"text":"isFQDN(), is a fully qualified domain name?","markups":[{"type":10,"start":0,"end":8}]},{"name":"fc95","type":9,"text":"isFloat()","markups":[{"type":10,"start":0,"end":9}]},{"name":"1adc","type":9,"text":"isHash()","markups":[{"type":10,"start":0,"end":8}]},{"name":"1dc5","type":9,"text":"isHexColor()","markups":[{"type":10,"start":0,"end":12}]},{"name":"632f","type":9,"text":"isIP()","markups":[{"type":10,"start":0,"end":6}]},{"name":"d085","type":9,"text":"isIn(), check if the value is in an array of allowed values","markups":[{"type":10,"start":0,"end":6}]},{"name":"da12","type":9,"text":"isInt()","markups":[{"type":10,"start":0,"end":7}]},{"name":"55e8","type":9,"text":"isJSON()","markups":[{"type":10,"start":0,"end":8}]},{"name":"8589","type":9,"text":"isLatLong()","markups":[{"type":10,"start":0,"end":11}]},{"name":"81e5","type":9,"text":"isLength()","markups":[{"type":10,"start":0,"end":10}]},{"name":"3205","type":9,"text":"isLowercase()","markups":[{"type":10,"start":0,"end":13}]},{"name":"acfb","type":9,"text":"isMobilePhone()","markups":[{"type":10,"start":0,"end":15}]},{"name":"bcb6","type":9,"text":"isNumeric()","markups":[{"type":10,"start":0,"end":11}]},{"name":"cecc","type":9,"text":"isPostalCode()","markups":[{"type":10,"start":0,"end":14}]},{"name":"5035","type":9,"text":"isURL()","markups":[{"type":10,"start":0,"end":7}]},{"name":"2cd3","type":9,"text":"isUppercase()","markups":[{"type":10,"start":0,"end":13}]},{"name":"ef7a","type":9,"text":"isWhitelisted(), checks the input against a whitelist of allowed characters","markups":[{"type":10,"start":0,"end":15}]},{"name":"6de8","type":1,"text":"You can validate the input against a regular expression using matches().","markups":[{"type":10,"start":62,"end":71}]},{"name":"eba4","type":1,"text":"Dates can be checked using","markups":[]},{"name":"db1d","type":9,"text":"isAfter(), check if the entered date is after the one you pass","markups":[{"type":10,"start":0,"end":9}]},{"name":"db26","type":9,"text":"isBefore(), check if the entered date is before the one you pass","markups":[{"type":10,"start":0,"end":10}]},{"name":"0070","type":9,"text":"isISO8601()","markups":[{"type":10,"start":0,"end":11}]},{"name":"a621","type":9,"text":"isRFC3339()","markups":[{"type":10,"start":0,"end":11}]},{"name":"d552","type":1,"text":"For exact details on how to use those validators, refer to https://github.com/chriso/validator.js#validators.","markups":[{"type":3,"start":59,"end":108,"href":"https://github.com/chriso/validator.js#validators","title":"","rel":"","anchorType":0}]},{"name":"4363","type":1,"text":"All those checks can be combined by piping them:","markups":[]},{"name":"ac8f","type":8,"text":"check('name')\n  .isAlpha()\n  .isLength({ min: 10 })","markups":[{"type":10,"start":0,"end":51}]},{"name":"439e","type":1,"text":"If there is any error, the server automatically sends a response to communicate the error. For example if the email is not valid, this is what will be returned:","markups":[]},{"name":"832e","type":8,"text":"{\n  \"errors\": [{\n    \"location\": \"body\",\n    \"msg\": \"Invalid value\",\n    \"param\": \"email\"\n  }]\n}","markups":[{"type":10,"start":0,"end":96}]},{"name":"2846","type":1,"text":"This default error can be overridden for each check you perform, using withMessage():","markups":[{"type":10,"start":71,"end":84}]},{"name":"bdfc","type":8,"text":"check('name')\n  .isAlpha()\n  .withMessage('Must be only alphabetical chars')\n  .isLength({ min: 10 })\n  .withMessage('Must be at least 10 chars long')","markups":[{"type":10,"start":0,"end":150}]},{"name":"70e4","type":1,"text":"What if you want to write your own special, custom validator? You can use the custom validator.","markups":[{"type":10,"start":78,"end":84}]},{"name":"0a07","type":1,"text":"In the callback function you can reject the validation either by throwing an exception, or by returning a rejected promise:","markups":[]},{"name":"13ba","type":8,"text":"app.post('/form', [\n  check('name').isLength({ min: 3 }),\n  check('email').custom(email =\x3e {\n    if (alreadyHaveEmail(email)) {\n      throw new Error('Email already registered')\n    }\n  }),\n  check('age').isNumeric()\n], (req, res) =\x3e {\n  const name  = req.body.name\n  const email = req.body.email\n  const age   = req.body.age\n})","markups":[{"type":10,"start":0,"end":328}]},{"name":"fea3","type":1,"text":"The custom validator:","markups":[]},{"name":"6d1e","type":8,"text":"check('email').custom(email =\x3e {\n  if (alreadyHaveEmail(email)) {\n    throw new Error('Email already registered')\n  }\n})","markups":[{"type":10,"start":0,"end":120}]},{"name":"7eb8","type":1,"text":"can be rewritten as","markups":[]},{"name":"cccc","type":8,"text":"check('email').custom(email =\x3e {\n  if (alreadyHaveEmail(email)) {\n    return Promise.reject('Email already registered')\n  }\n})","markups":[{"type":10,"start":0,"end":126}]},{"name":"f1c1","type":3,"text":"Sanitizing input","markups":[]},{"name":"3dad","type":1,"text":"You’ve seen how to validate input that comes from the outside world to your Express app.","markups":[]},{"name":"3a58","type":1,"text":"There’s one thing you quickly learn when you run a public-facing server: never trust the input.","markups":[]},{"name":"674d","type":1,"text":"Even if you sanitize and make sure that people can’t enter weird things using client-side code, you’ll still be subject to people using tools (even just the browser devtools) to POST directly to your endpoints.","markups":[]},{"name":"b0c6","type":1,"text":"Or bots trying every possible combination of exploit known to humans.","markups":[]},{"name":"3b2d","type":1,"text":"What you need to do is sanitizing your input.","markups":[]},{"name":"5527","type":1,"text":"The express-validator package you already use to validate input can also conveniently used to perform sanitization.","markups":[{"type":10,"start":4,"end":21},{"type":3,"start":4,"end":29,"href":"https://express-validator.github.io/","title":"","rel":"","anchorType":0}]},{"name":"a693","type":1,"text":"Say you have a POST endpoint that accepts the name, email and age parameters:","markups":[]},{"name":"e220","type":8,"text":"const express = require('express')\nconst app = express()","markups":[{"type":10,"start":0,"end":56}]},{"name":"1d43","type":8,"text":"app.use(express.json())","markups":[{"type":10,"start":0,"end":23}]},{"name":"819e","type":8,"text":"app.post('/form', (req, res) =\x3e {\n  const name  = req.body.name\n  const email = req.body.email\n  const age   = req.body.age\n})","markups":[{"type":10,"start":0,"end":126}]},{"name":"d0b5","type":1,"text":"You might validate it using:","markups":[]},{"name":"e48b","type":8,"text":"const express = require('express')\nconst app = express()","markups":[{"type":10,"start":0,"end":56}]},{"name":"83b4","type":8,"text":"app.use(express.json())","markups":[{"type":10,"start":0,"end":23}]},{"name":"f988","type":8,"text":"app.post('/form', [\n  check('name').isLength({ min: 3 }),\n  check('email').isEmail(),\n  check('age').isNumeric()\n], (req, res) =\x3e {\n  const name  = req.body.name\n  const email = req.body.email\n  const age   = req.body.age\n})","markups":[{"type":10,"start":0,"end":224}]},{"name":"6d79","type":1,"text":"You can add sanitization by piping the sanitization methods after the validation ones:","markups":[]},{"name":"b413","type":8,"text":"app.post('/form', [\n  check('name').isLength({ min: 3 }).trim().escape(),\n  check('email').isEmail().normalizeEmail(),\n  check('age').isNumeric().trim().escape()\n], (req, res) =\x3e {\n  //...\n})","markups":[{"type":10,"start":0,"end":191}]},{"name":"e267","type":1,"text":"Here I used the methods:","markups":[]},{"name":"5eac","type":9,"text":"trim() trims characters (whitespace by default) at the beginning and at the end of a string","markups":[{"type":10,"start":0,"end":6}]},{"name":"1317","type":9,"text":"escape() replaces \x3c, \x3e, &, ', \" and / with their corresponding HTML entities","markups":[{"type":10,"start":0,"end":8},{"type":10,"start":18,"end":19},{"type":10,"start":21,"end":22},{"type":10,"start":24,"end":25},{"type":10,"start":27,"end":28},{"type":10,"start":30,"end":31},{"type":10,"start":36,"end":37}]},{"name":"cb71","type":9,"text":"normalizeEmail() canonicalizes an email address. Accepts several options to lowercase email addresses or subaddresses (e.g. flavio+newsletters@gmail.com)","markups":[{"type":10,"start":0,"end":16},{"type":10,"start":124,"end":152}]},{"name":"13f5","type":1,"text":"Other sanitization methods:","markups":[]},{"name":"f13b","type":9,"text":"blacklist() remove characters that appear in the blacklist","markups":[{"type":10,"start":0,"end":11}]},{"name":"59ad","type":9,"text":"whitelist() remove characters that do not appear in the whitelist","markups":[{"type":10,"start":0,"end":11}]},{"name":"ead4","type":9,"text":"unescape() replaces HTML encoded entities with \x3c, \x3e, &, ', \" and /","markups":[{"type":10,"start":0,"end":10},{"type":10,"start":47,"end":48},{"type":10,"start":50,"end":51},{"type":10,"start":53,"end":54},{"type":10,"start":56,"end":57},{"type":10,"start":59,"end":60},{"type":10,"start":65,"end":66}]},{"name":"4d08","type":9,"text":"ltrim() like trim(), but only trims characters at the start of the string","markups":[{"type":10,"start":0,"end":7}]},{"name":"50d0","type":9,"text":"rtrim() like trim(), but only trims characters at the end of the string","markups":[{"type":10,"start":0,"end":7}]},{"name":"80ab","type":9,"text":"stripLow() remove ASCII control characters, which are normally invisible","markups":[{"type":10,"start":0,"end":10}]},{"name":"7f40","type":1,"text":"Force conversion to a format:","markups":[]},{"name":"d039","type":9,"text":"toBoolean() convert the input string to a boolean. Everything except for '0', 'false' and '' returns true. In strict mode only '1' and 'true' return true","markups":[{"type":10,"start":0,"end":11}]},{"name":"8554","type":9,"text":"toDate() convert the input string to a date, or null if the input is not a date","markups":[{"type":10,"start":0,"end":8}]},{"name":"8219","type":9,"text":"toFloat() convert the input string to a float, or NaN if the input is not a float","markups":[{"type":10,"start":0,"end":9}]},{"name":"9271","type":9,"text":"toInt() convert the input string to an integer, or NaN if the input is not an integer","markups":[{"type":10,"start":0,"end":7}]},{"name":"2858","type":1,"text":"Like with custom validators, you can create a custom sanitizer.","markups":[]},{"name":"d4e5","type":1,"text":"In the callback function you just return the sanitized value:","markups":[]},{"name":"86c2","type":8,"text":"const sanitizeValue = value =\x3e {\n  //sanitize...\n}","markups":[{"type":10,"start":0,"end":50}]},{"name":"fca5","type":8,"text":"app.post('/form', [\n  check('value').customSanitizer(value =\x3e {\n    return sanitizeValue(value)\n  }),\n], (req, res) =\x3e {\n  const value  = req.body.value\n})","markups":[{"type":10,"start":0,"end":155}]},{"name":"7fa4","type":3,"text":"Handling forms","markups":[]},{"name":"7770","type":1,"text":"This is an example of an HTML form:","markups":[]},{"name":"73a8","type":8,"text":"\x3cform method=\"POST\" action=\"/submit-form\"\x3e\n  \x3cinput type=\"text\" name=\"username\" /\x3e\n  \x3cinput type=\"submit\" /\x3e\n\x3c/form\x3e","markups":[{"type":10,"start":0,"end":116}]},{"name":"43e8","type":1,"text":"When the user press the submit button, the browser will automatically make a POST request to the /submit-form URL on the same origin of the page, sending the data it contains, encoded as application/x-www-form-urlencoded. In this case, the form data contains the username input field value.","markups":[{"type":10,"start":77,"end":81},{"type":10,"start":97,"end":109},{"type":10,"start":187,"end":220},{"type":10,"start":263,"end":271}]},{"name":"ddeb","type":1,"text":"Forms can also send data using the GET method, but the vast majority of the forms you'll build will use POST.","markups":[{"type":10,"start":35,"end":38},{"type":10,"start":104,"end":108}]},{"name":"4de9","type":1,"text":"The form data will be sent in the POST request body.","markups":[]},{"name":"9f3b","type":1,"text":"To extract it, you will use the express.urlencoded() middleware, provided by Express:","markups":[{"type":10,"start":32,"end":52}]},{"name":"b23e","type":8,"text":"const express = require('express')\nconst app = express()","markups":[{"type":10,"start":0,"end":56}]},{"name":"1407","type":8,"text":"app.use(express.urlencoded())","markups":[{"type":10,"start":0,"end":29}]},{"name":"04dc","type":1,"text":"Now you need to create a POST endpoint on the /submit-form route, and any data will be available on Request.body:","markups":[{"type":10,"start":25,"end":29},{"type":10,"start":46,"end":58},{"type":10,"start":100,"end":112}]},{"name":"9629","type":8,"text":"app.post('/submit-form', (req, res) =\x3e {\n  const username = req.body.username\n  //...\n  res.end()\n})","markups":[{"type":10,"start":0,"end":100}]},{"name":"cacb","type":1,"text":"Don’t forget to validate the data before using it, using express-validator.","markups":[{"type":10,"start":57,"end":74}]},{"name":"fb32","type":3,"text":"File uploads in forms","markups":[]},{"name":"9b23","type":1,"text":"This is an example of an HTML form that allows a user to upload a file:","markups":[]},{"name":"ebad","type":8,"text":"\x3cform method=\"POST\" action=\"/submit-form\"\x3e\n  \x3cinput type=\"file\" name=\"document\" /\x3e\n  \x3cinput type=\"submit\" /\x3e\n\x3c/form\x3e","markups":[{"type":10,"start":0,"end":116}]},{"name":"a364","type":1,"text":"When the user press the submit button, the browser will automatically make a POST request to the /submit-form URL on the same origin of the page, sending the data it contains, not encoded as application/x-www-form-urlencoded as a normal form, but as multipart/form-data.","markups":[{"type":10,"start":77,"end":81},{"type":10,"start":97,"end":109},{"type":10,"start":191,"end":224},{"type":10,"start":250,"end":269}]},{"name":"efee","type":1,"text":"Server-side, handling multipart data can be tricky and error prone, so we are going to use a utility library called formidable. Here’s the GitHub repo, it has over 4000 stars and well maintained.","markups":[{"type":3,"start":128,"end":150,"href":"https://github.com/felixge/node-formidable","title":"","rel":"","anchorType":0},{"type":1,"start":116,"end":126}]},{"name":"ce70","type":1,"text":"You can install it using:","markups":[]},{"name":"2587","type":8,"text":"npm install formidable","markups":[{"type":10,"start":0,"end":22}]},{"name":"3504","type":1,"text":"Then in your Node.js file, include it:","markups":[]},{"name":"5b10","type":8,"text":"const express = require('express')\nconst app = express()\nconst formidable = require('formidable')","markups":[{"type":10,"start":0,"end":97}]},{"name":"52d6","type":1,"text":"Now in the POST endpoint on the /submit-form route, we instantiate a new Formidable form using formidable.IncomingFrom():","markups":[{"type":10,"start":11,"end":15},{"type":10,"start":32,"end":44},{"type":10,"start":95,"end":120}]},{"name":"cb0b","type":8,"text":"app.post('/submit-form', (req, res) =\x3e {\n  new formidable.IncomingFrom()\n})","markups":[{"type":10,"start":0,"end":75}]},{"name":"4c2a","type":1,"text":"After doing so, we need to parse the form. We can do so synchronously by providing a callback, which means all files are processed, and once formidable is done, it makes them available:","markups":[]},{"name":"83e7","type":8,"text":"app.post('/submit-form', (req, res) =\x3e {\n  new formidable.IncomingFrom().parse(req, (err, fields, files) =\x3e {\n    if (err) {\n      console.error('Error', err)\n      throw err\n    }\n    console.log('Fields', fields)\n    console.log('Files', files)\n    files.map(file =\x3e {\n      console.log(file)\n    })\n  })\n})","markups":[{"type":10,"start":0,"end":309}]},{"name":"d88a","type":1,"text":"Or you can use events instead of a callback, to be notified when each file is parsed, and other events, like ending processing, receiving a non-file field, or an error occurred:","markups":[]},{"name":"5bc5","type":8,"text":"app.post('/submit-form', (req, res) =\x3e {\n  new formidable.IncomingFrom().parse(req)\n    .on('field', (name, field) =\x3e {\n      console.log('Field', name, field)\n    })\n    .on('file', (name, file) =\x3e {\n      console.log('Uploaded file', name, file)\n    })\n    .on('aborted', () =\x3e {\n      console.error('Request aborted by the user')\n    })\n    .on('error', (err) =\x3e {\n      console.error('Error', err)\n      throw err\n    })\n    .on('end', () =\x3e {\n      res.end()\n    })\n})","markups":[{"type":10,"start":0,"end":473}]},{"name":"42aa","type":1,"text":"Whatever way you choose, you’ll get one or more Formidable.File objects, which give you information about the file uploaded. These are some of the methods you can call:","markups":[]},{"name":"946e","type":9,"text":"file.size, the file size in bytes","markups":[{"type":10,"start":0,"end":9}]},{"name":"26a0","type":9,"text":"file.path, the path this file is written to","markups":[{"type":10,"start":0,"end":9}]},{"name":"da7a","type":9,"text":"file.name, the name of the file","markups":[{"type":10,"start":0,"end":9}]},{"name":"e0a0","type":9,"text":"file.type, the MIME type of the file","markups":[{"type":10,"start":0,"end":9}]},{"name":"0bde","type":1,"text":"The path defaults to the temporary folder and can be modified if you listen to the fileBegin event:","markups":[{"type":10,"start":83,"end":92}]},{"name":"791a","type":8,"text":"app.post('/submit-form', (req, res) =\x3e {\n  new formidable.IncomingFrom().parse(req)\n    .on('fileBegin', (name, file) =\x3e {\n      form.on('fileBegin', (name, file) =\x3e {\n        file.path = __dirname + '/uploads/' + file.name\n      })\n    })\n    .on('file', (name, file) =\x3e {\n      console.log('Uploaded file', name, file)\n    })\n    //...\n})","markups":[{"type":10,"start":0,"end":340}]},{"name":"f32a","type":3,"text":"How to create a self-signed HTTPS certificate for Node.js to test apps locally","markups":[]},{"name":"e081","type":1,"text":"To be able to serve a site on HTTPS from localhost you need to create a self-signed certificate.","markups":[]},{"name":"bc98","type":1,"text":"A self-signed certificate will be enough to establish a secure HTTPS connection, although browsers will complain that the certificate is self-signed and as such it’s not trusted. It’s great for development purposes.","markups":[]},{"name":"2bb5","type":1,"text":"To create the certificate you must have OpenSSL installed on your system.","markups":[{"type":1,"start":40,"end":47}]},{"name":"34b0","type":1,"text":"You might have it installed already, just test by typing openssl in your terminal.","markups":[{"type":10,"start":57,"end":64}]},{"name":"4f63","type":1,"text":"If not, on a Mac you can install it using brew install openssl if you use Homebrew. Otherwise search on Google \"how to install openssl on \".","markups":[{"type":10,"start":42,"end":62},{"type":3,"start":74,"end":82,"href":"https://brew.sh/","title":"","rel":"","anchorType":0}]},{"name":"28be","type":1,"text":"Once OpenSSL is installed, run this command:","markups":[]},{"name":"15e9","type":8,"text":"openssl req -nodes -new -x509 -keyout server.key -out server.cert","markups":[{"type":10,"start":0,"end":65}]},{"name":"bcd1","type":1,"text":"It will as you a few questions. The first is the country name:","markups":[]},{"name":"c54a","type":8,"text":"Generating a 1024 bit RSA private key\n...........++++++\n.........++++++\nwriting new private key to 'server.key'\n-----\nYou are about to be asked to enter information that will be incorporated into your certificate request.\nWhat you are about to enter is what is called a Distinguished Name or a DN.\nThere are quite a few fields but you can leave some blank\nFor some fields there will be a default value,\nIf you enter '.', the field will be left blank.\n-----\nCountry Name (2 letter code) [AU]:","markups":[{"type":10,"start":0,"end":491}]},{"name":"9af3","type":1,"text":"Then your state or province:","markups":[]},{"name":"4f7e","type":8,"text":"State or Province Name (full name) [Some-State]:","markups":[{"type":10,"start":0,"end":48}]},{"name":"579d","type":1,"text":"your city:","markups":[]},{"name":"fead","type":8,"text":"Locality Name (eg, city) []:","markups":[{"type":10,"start":0,"end":28}]},{"name":"3daf","type":1,"text":"and your organization name:","markups":[]},{"name":"d824","type":8,"text":"Organization Name (eg, company) [Internet Widgits Pty Ltd]:\nOrganizational Unit Name (eg, section) []:","markups":[{"type":10,"start":0,"end":102}]},{"name":"58be","type":1,"text":"You can leave all of these empty.","markups":[]},{"name":"8fe0","type":1,"text":"Just remember to set this to localhost:","markups":[{"type":10,"start":29,"end":38}]},{"name":"9479","type":8,"text":"Common Name (e.g. server FQDN or YOUR name) []: localhost","markups":[{"type":10,"start":0,"end":57}]},{"name":"a4b1","type":1,"text":"and to add your email address:","markups":[]},{"name":"3fb5","type":8,"text":"Email Address []:","markups":[{"type":10,"start":0,"end":17}]},{"name":"0dbd","type":1,"text":"That’s it! Now you have 2 files in the folder where you ran this command:","markups":[]},{"name":"341f","type":9,"text":"server.cert is the self-signed certificate file","markups":[{"type":10,"start":0,"end":11}]},{"name":"433c","type":9,"text":"server.key is the private key of the certificate","markups":[{"type":10,"start":0,"end":10}]},{"name":"06a3","type":1,"text":"Both files will be needed to establish the HTTPS connection, and depending on how you are going to setup your server, the process to use them will be different.","markups":[]},{"name":"0f9f","type":1,"text":"Those files need to be put in a place reachable by the application, then you need to configure the server to use them.","markups":[]},{"name":"32db","type":1,"text":"This is an example using the https core module and Express:","markups":[{"type":10,"start":29,"end":34}]},{"name":"7a46","type":8,"text":"const https = require('https')\nconst app = express()","markups":[{"type":10,"start":0,"end":52}]},{"name":"c113","type":8,"text":"app.get('/', (req, res) =\x3e {\n  res.send('Hello HTTPS!')\n})","markups":[{"type":10,"start":0,"end":58}]},{"name":"c9c5","type":8,"text":"https.createServer({}, app).listen(3000, () =\x3e {\n  console.log('Listening...')\n})","markups":[{"type":10,"start":0,"end":81}]},{"name":"77bb","type":1,"text":"without adding the certificate, if I connect to https://localhost:3000 this is what the browser will show:","markups":[{"type":10,"start":48,"end":70}]},{"name":"5a7a","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"1*VFrGRrmDGH2m9R4456UCDg.png","originalWidth":899,"originalHeight":485}},{"name":"decb","type":1,"text":"With the certificate in place:","markups":[]},{"name":"8d48","type":8,"text":"const fs = require('fs')","markups":[{"type":10,"start":0,"end":24}]},{"name":"b444","type":8,"text":"//...","markups":[{"type":10,"start":0,"end":5}]},{"name":"c1c0","type":8,"text":"https.createServer({\n  key: fs.readFileSync('server.key'),\n  cert: fs.readFileSync('server.cert')\n}, app).listen(3000, () =\x3e {\n  console.log('Listening...')\n})","markups":[{"type":10,"start":0,"end":159}]},{"name":"9702","type":1,"text":"Chrome will tell us the certificate is invalid, since it’s self-signed, and will ask us to confirm to continue, but the HTTPS connection will work:","markups":[]},{"name":"9fff","type":4,"text":"","markups":[],"layout":1,"metadata":{"id":"1*wBZ5jTfVTX-OqeQ4dlP7yg.png","originalWidth":929,"originalHeight":535}},{"name":"c2d0","type":3,"text":"Setup Let’s Encrypt for Express","markups":[]},{"name":"bbbc","type":1,"text":"If you run a Node.js application on your own VPS, you need to manage getting an SSL certificate.","markups":[]},{"name":"a54e","type":1,"text":"Today the standard for doing this is to use Let’s Encrypt and Certbot, a tool from EFF, aka Electronic Frontier Foundation, the leading nonprofit organization focused on privacy, free speech, and in general civil liberties in the digital world.","markups":[{"type":3,"start":44,"end":57,"href":"https://letsencrypt.org/","title":"","rel":"","anchorType":0},{"type":3,"start":62,"end":69,"href":"https://certbot.eff.org/","title":"","rel":"","anchorType":0},{"type":3,"start":83,"end":86,"href":"https://www.eff.org/","title":"","rel":"","anchorType":0}]},{"name":"55df","type":1,"text":"These are the steps we’ll follow:","markups":[]},{"name":"39ea","type":9,"text":"Install Certbot","markups":[]},{"name":"3861","type":9,"text":"Generate the SSL certificate using Certbot","markups":[]},{"name":"1fad","type":9,"text":"Allow Express to serve static files","markups":[]},{"name":"7915","type":9,"text":"Confirm the domain","markups":[]},{"name":"86ab","type":9,"text":"Obtain the certificate","markups":[]},{"name":"7791","type":9,"text":"Setup the renewal","markups":[]},{"name":"8760","type":13,"text":"Install Certbot","markups":[]},{"name":"1bb2","type":1,"text":"Those instructions assume you are using Ubuntu, Debian or any other Linux distribution that uses apt-get:","markups":[{"type":10,"start":97,"end":104}]},{"name":"d8cc","type":8,"text":"sudo add-apt repository ppa:certbot/certbot\nsudo apt-get update\nsudo apt-get install certbot","markups":[{"type":10,"start":0,"end":92}]},{"name":"b86e","type":1,"text":"You can also install Certbot on a Mac to test:","markups":[]},{"name":"7f11","type":8,"text":"brew install certbot","markups":[{"type":10,"start":0,"end":20}]},{"name":"44d7","type":1,"text":"but you will need to link that to a real domain name, in order for it to be useful.","markups":[]},{"name":"db9e","type":13,"text":"Generate the SSL certificate using Certbot","markups":[]},{"name":"9e78","type":1,"text":"Now that Certbot is installed, you can invoke it to generate the certificate. You must run this as root:","markups":[]},{"name":"320a","type":8,"text":"certbot certonly --manual","markups":[{"type":10,"start":0,"end":25}]},{"name":"1a85","type":1,"text":"or call sudo","markups":[]},{"name":"4957","type":8,"text":"sudo certbot certonly --manual","markups":[{"type":10,"start":0,"end":30}]},{"name":"1ba7","type":1,"text":"The installer will ask you the domain of your website.","markups":[]},{"name":"406e","type":1,"text":"This is the process in detail.","markups":[]},{"name":"4217","type":1,"text":"It asks for the email","markups":[]},{"name":"8ad7","type":8,"text":"➜ sudo certbot certonly --manual\nPassword: XXXXXXXXXXXXXXXXXX\nSaving debug log to /var/log/letsencrypt/letsencrypt.log\nPlugins selected: Authenticator manual, Installer None\nEnter email address (used for urgent renewal and security notices) (Enter 'c' to\ncancel): flavio@flaviocopes.com","markups":[{"type":10,"start":0,"end":286}]},{"name":"efa0","type":1,"text":"It asks to accept the ToS:","markups":[]},{"name":"f05c","type":8,"text":"Please read the Terms of Service at\nhttps://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must\nagree in order to register with the ACME server at\nhttps://acme-v02.api.letsencrypt.org/directory","markups":[{"type":10,"start":0,"end":209}]},{"name":"0a56","type":8,"text":"(A)gree/(C)ancel: A","markups":[{"type":10,"start":0,"end":19}]},{"name":"bdc2","type":1,"text":"It asks to share the email address","markups":[]},{"name":"5165","type":8,"text":"Would you be willing to share your email address with the Electronic Frontier\nFoundation, a founding partner of the Let's Encrypt project and the non-profit\norganization that develops Certbot? We'd like to send you email about our work\nencrypting the web, EFF news, campaigns, and ways to support digital freedom.\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n(Y)es/(N)o: Y","markups":[{"type":10,"start":0,"end":407}]},{"name":"dd90","type":1,"text":"And finally we can enter the domain where we want to use the SSL certificate:","markups":[]},{"name":"bc0d","type":8,"text":"Please enter in your domain name(s) (comma and/or space separated)  (Enter 'c'\nto cancel): copesflavio.com","markups":[{"type":10,"start":0,"end":106}]},{"name":"41e8","type":1,"text":"It asks if it’s ok to log your IP:","markups":[]},{"name":"d875","type":8,"text":"Obtaining a new certificate\nPerforming the following challenges:\nhttp-01 challenge for copesflavio.com","markups":[{"type":10,"start":0,"end":102}]},{"name":"4125","type":8,"text":"- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\nNOTE: The IP of this machine will be publicly logged as having requested this\ncertificate. If you're running certbot in manual mode on a machine that is not\nyour server, please ensure you're okay with that.","markups":[{"type":10,"start":0,"end":286}]},{"name":"8446","type":8,"text":"Are you OK with your IP being logged?\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n(Y)es/(N)o: y","markups":[{"type":10,"start":0,"end":131}]},{"name":"ac85","type":1,"text":"And finally we get to the verification phase!","markups":[]},{"name":"869d","type":8,"text":"- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\nCreate a file containing just this data:","markups":[{"type":10,"start":0,"end":120}]},{"name":"5484","type":8,"text":"TS_oZ2-ji23jrio3j2irj3iroj_U51u1o0x7rrDY2E.1DzOo_voCOsrpddP_2kpoek2opeko2pke-UAPb21sW1c","markups":[{"type":10,"start":0,"end":87}]},{"name":"b1d3","type":8,"text":"And make it available on your web server at this URL:","markups":[{"type":10,"start":0,"end":53}]},{"name":"23a3","type":8,"text":"http://copesflavio.com/.well-known/acme-challenge/TS_oZ2-ji23jrio3j2irj3iroj_U51u1o0x7rrDY2E","markups":[{"type":10,"start":0,"end":92}]},{"name":"e92e","type":1,"text":"Now let’s leave Certbot alone for a couple minutes.","markups":[]},{"name":"1032","type":1,"text":"We need to verify we own the domain, by creating a file named TS_oZ2-ji23jrio3j2irj3iroj_U51u1o0x7rrDY2E in the .well-known/acme-challenge/ folder. Pay attention! The weird string I just pasted change every single time.","markups":[{"type":10,"start":62,"end":104},{"type":10,"start":112,"end":139}]},{"name":"7453","type":1,"text":"You’ll need to create the folder and the file, since they do not exist by default.","markups":[]},{"name":"d440","type":1,"text":"In this file you need to put the content that Certbot printed:","markups":[]},{"name":"2d8f","type":8,"text":"TS_oZ2-ji23jrio3j2irj3iroj_U51u1o0x7rrDY2E.1DzOo_voCOsrpddP_2kpoek2opeko2pke-UAPb21sW1c","markups":[{"type":10,"start":0,"end":87}]},{"name":"cf84","type":1,"text":"As for the filename, this string is unique each time you run Certbot.","markups":[]},{"name":"c0c3","type":13,"text":"Allow Express to serve static files","markups":[]},{"name":"a153","type":1,"text":"In order to serve that file from Express, you need to enable serving static files. You can create a staticfolder, and add there the .well-known subfolder, then configure Express like this:","markups":[{"type":10,"start":100,"end":106},{"type":10,"start":132,"end":143}]},{"name":"92e8","type":8,"text":"const express = require('express')\nconst app = express()","markups":[{"type":10,"start":0,"end":56}]},{"name":"97fa","type":8,"text":"//...","markups":[{"type":10,"start":0,"end":5}]},{"name":"adac","type":8,"text":"app.use(express.static(__dirname + '/static', { dotfiles: 'allow' } ))","markups":[{"type":10,"start":0,"end":70}]},{"name":"080f","type":8,"text":"//...","markups":[{"type":10,"start":0,"end":5}]},{"name":"04c0","type":1,"text":"The dotfiles option is mandatory otherwise .well-known, which is a dotfile as it starts with a dot, won't be made visible. This is a security measure, because dotfiles can contain sensitive information and they are better off preserved by default.","markups":[{"type":10,"start":4,"end":12},{"type":10,"start":43,"end":54}]},{"name":"1531","type":13,"text":"Confirm the domain","markups":[]},{"name":"d64c","type":1,"text":"Now run the application and make sure the file is reachable from the public internet, and go back to Certbot, which is still running, and press ENTER to go on with the script.","markups":[]},{"name":"ec56","type":13,"text":"Obtain the certificate","markups":[]},{"name":"f630","type":1,"text":"That’s it! If all went well, Certbot created the certificate, and the private key, and made them available in a folder on your computer (and it will tell you which folder, of course).","markups":[]},{"name":"d246","type":1,"text":"Now copy/paste the paths into your application, to start using them to serve your requests:","markups":[]},{"name":"50c5","type":8,"text":"const fs = require('fs')\nconst https = require('https')\nconst app = express()","markups":[{"type":10,"start":0,"end":77}]},{"name":"757e","type":8,"text":"app.get('/', (req, res) =\x3e {\n  res.send('Hello HTTPS!')\n})","markups":[{"type":10,"start":0,"end":58}]},{"name":"078a","type":8,"text":"https.createServer({\n  key: fs.readFileSync('/etc/letsencrypt/path/to/key.pem'),\n  cert: fs.readFileSync('/etc/letsencrypt/path/to/cert.pem'),\n  ca: fs.readFileSync('/etc/letsencrypt/path/to/chain.pem')\n}, app).listen(443, () =\x3e {\n  console.log('Listening...')\n})","markups":[{"type":10,"start":0,"end":263}]},{"name":"4530","type":1,"text":"Note that I made this server listen on port 443, so you need to run it with root permissions.","markups":[]},{"name":"6823","type":1,"text":"Also, the server is exclusively running in HTTPS, because I used https.createServer(). You can also run an HTTP server alongside this, by running:","markups":[{"type":10,"start":65,"end":85}]},{"name":"5f01","type":8,"text":"http.createServer(app).listen(80, () =\x3e {\n  console.log('Listening...')\n})","markups":[{"type":10,"start":0,"end":74}]},{"name":"e509","type":8,"text":"https.createServer({\n  key: fs.readFileSync('/etc/letsencrypt/path/to/key.pem'),\n  cert: fs.readFileSync('/etc/letsencrypt/path/to/cert.pem'),\n  ca: fs.readFileSync('/etc/letsencrypt/path/to/chain.pem')\n}, app).listen(443, () =\x3e {\n  console.log('Listening...')\n})","markups":[{"type":10,"start":0,"end":263}]},{"name":"50d4","type":13,"text":"Setup the renewal","markups":[]},{"name":"4f5f","type":1,"text":"The SSL certificate is not going to be valid for 90 days. You need to set up an automated system for renewing it.","markups":[]},{"name":"fa72","type":1,"text":"How? Using a cron job.","markups":[]},{"name":"206a","type":1,"text":"A cron job is a way to run tasks every interval of time. It can be eery week, every minute, every month.","markups":[]},{"name":"da97","type":1,"text":"In our case we’ll run the renewal script twice per day, as recommended in the Certbot documentation.","markups":[]},{"name":"5b9d","type":1,"text":"First find out the absolute path of certbot on you system. I use type certbot on macOS to get it, and in my case it's /usr/local/bin/certbot.","markups":[{"type":10,"start":36,"end":43},{"type":10,"start":65,"end":77},{"type":10,"start":118,"end":140}]},{"name":"8dd1","type":1,"text":"Here’s the script we need to run:","markups":[]},{"name":"073e","type":1,"text":"certbot renew","markups":[{"type":10,"start":0,"end":13}]},{"name":"8ca2","type":1,"text":"This is the cron job entry:","markups":[]},{"name":"82b9","type":8,"text":"0 */12 * * * root /usr/local/bin/certbot renew \x3e/dev/null 2\x3e&1","markups":[{"type":10,"start":0,"end":62}]},{"name":"0c59","type":1,"text":"It means run it every 12 hours, every day: at 00:00 and at 12:00.","markups":[]},{"name":"6dc5","type":6,"text":"Tip: I generated this line using https://crontab-generator.org/","markups":[{"type":3,"start":33,"end":63,"href":"https://crontab-generator.org/","title":"","rel":"","anchorType":0},{"type":2,"start":0,"end":63}]},{"name":"ac06","type":1,"text":"Add this script to your crontab, by using the command:","markups":[]},{"name":"0d5b","type":8,"text":"env EDITOR=pico crontab -e","markups":[{"type":10,"start":0,"end":26}]},{"name":"8061","type":1,"text":"This opens the pico editor (you can choose the one you prefer). You enter the line, save, and the cron job is installed.","markups":[{"type":10,"start":15,"end":19}]},{"name":"481c","type":1,"text":"Once this is done, you can see the list of cron jobs active using","markups":[]},{"name":"368f","type":8,"text":"crontab -l","markups":[{"type":10,"start":0,"end":10}]},{"name":"57d6","type":3,"text":"Wrapping up","markups":[]},{"name":"6b4c","type":1,"text":"If you made this far, that’s awesome! I hope this introduction to Express will get you up to speed with this awesome Node.js library. Remember, you can get a PDF, ePub and Mobi version of this page for an easier reference, or to read it on your Kindle or tablet.","markups":[{"type":3,"start":158,"end":176,"href":"https://pages.convertkit.com/7ba7d476a5/f0c9c5cdb4","title":"","rel":"noopener","anchorType":0}]},{"name":"0c1b","type":4,"layout":1,"metadata":{"id":"1*PZjwR1Nbluff5IMI6Y1T6g@2x.png","originalWidth":1400,"originalHeight":700},"href":"https://goo.gl/w4Pbea"}],"sections":[{"name":"0c5d","startIndex":0}]},"postDisplay":{"coverless":true}},"virtuals":{"statusForCollection":"APPROVED","allowNotes":true,"previewImage":{"imageId":"1*huCrw2ybIkyg6NzbhvrAeA.jpeg","filter":"","backgroundSize":"","originalWidth":809,"originalHeight":606,"strategy":"resample","height":0,"width":0},"wordCount":8039,"imageCount":9,"readingTime":31.535849056603773,"subtitle":"You can get a PDF, ePub and Mobi version of this page for an easier reference, or to read it on your Kindle or tablet.","userPostRelation":{"userId":"f829b8959ad2","postId":"649352e2ae87","readAt":0,"readLaterAddedAt":0,"votedAt":0,"collaboratorAddedAt":0,"notesAddedAt":0,"subscribedAt":0,"lastReadSectionName":"0c5d","lastReadVersionId":"ab9094050a6","lastReadAt":1536831662374,"lastReadParagraphName":"2092","lastReadPercentage":0.02,"viewedAt":0,"presentedCountInResponseManagement":0,"clapCount":0,"seriesUpdateNotifsOptedInAt":0,"queuedAt":0,"seriesFirstViewedAt":0,"presentedCountInStream":0,"seriesLastViewedAt":0,"audioProgressSec":0},"publishedInCount":1,"usersBySocialRecommends":[],"noIndex":false,"recommends":25,"socialRecommends":[],"isBookmarked":false,"tags":[{"slug":"nodejs","name":"Nodejs","postCount":14053,"virtuals":{"isFollowing":false},"metadata":{"followerCount":12613,"postCount":14053,"coverImage":{"id":"1*S7VjOUzpgIORXUIOa17UKg.jpeg","originalWidth":1920,"originalHeight":1280,"isFeatured":true}},"type":"Tag"},{"slug":"web-application-framework","name":"Web Application Framework","postCount":2,"virtuals":{"isFollowing":false},"metadata":{"followerCount":0,"postCount":2,"coverImage":{"id":"1*huCrw2ybIkyg6NzbhvrAeA.jpeg","originalWidth":809,"originalHeight":606}},"type":"Tag"},{"slug":"express","name":"Express","postCount":483,"virtuals":{"isFollowing":false},"metadata":{"followerCount":54,"postCount":483,"coverImage":{"id":"1*huCrw2ybIkyg6NzbhvrAeA.jpeg","originalWidth":809,"originalHeight":606}},"type":"Tag"},{"slug":"nodejs-app-framework","name":"Nodejs App Framework","postCount":0,"virtuals":{"isFollowing":false},"metadata":{"followerCount":0,"postCount":0,"coverImage":{"id":"1*huCrw2ybIkyg6NzbhvrAeA.jpeg","originalWidth":809,"originalHeight":606}},"type":"Tag"},{"slug":"express-nodejs","name":"Express Nodejs","postCount":0,"virtuals":{"isFollowing":false},"metadata":{"followerCount":0,"postCount":0,"coverImage":{"id":"1*huCrw2ybIkyg6NzbhvrAeA.jpeg","originalWidth":809,"originalHeight":606}},"type":"Tag"}],"socialRecommendsCount":0,"responsesCreatedCount":0,"links":{"entries":[{"url":"https://flaviocopes.com/cookies/#secure","alts":[],"httpStatus":200},{"url":"https://letsencrypt.org/","alts":[],"httpStatus":200},{"url":"https://express-validator.github.io/","alts":[],"httpStatus":200},{"url":"https://www.eff.org/","alts":[],"httpStatus":200},{"url":"https://flaviocopes.com/yarn/","alts":[],"httpStatus":200},{"url":"https://flaviocopes.com/cookies/#set-a-cookie-path","alts":[],"httpStatus":200},{"url":"https://brew.sh/","alts":[],"httpStatus":200},{"url":"https://flaviocopes.com/npm/","alts":[],"httpStatus":200},{"url":"https://flavio-cors-client.glitch.me/","alts":[],"httpStatus":200},{"url":"https://flaviocopes.com/javascript-regular-expressions/","alts":[],"httpStatus":200},{"url":"http://localhost:1313/cookies/#set-a-cookie-domain","alts":[],"httpStatus":0},{"url":"https://flaviocopes.com/cookies/#samesite","alts":[],"httpStatus":200},{"url":"https://flaviocopes.com/cookies/#httponly","alts":[],"httpStatus":200},{"url":"https://your-origin.com","alts":[],"httpStatus":0},{"url":"http://localhost:1313/cookies/#set-a-cookie-expiration-date","alts":[],"httpStatus":0},{"url":"https://glitch.com/edit/#%21/flavio-cors-client","alts":[],"httpStatus":200},{"url":"https://glitch.com/edit/#%21/flaviocopes-cors-example-express","alts":[],"httpStatus":200},{"url":"https://expressjs.com/en/resources/middleware.html","alts":[],"httpStatus":200},{"url":"https://pages.convertkit.com/7ba7d476a5/f0c9c5cdb4","alts":[],"httpStatus":200},{"url":"https://crontab-generator.org/","alts":[],"httpStatus":200},{"url":"https://pugjs.org/","alts":[],"httpStatus":200},{"url":"https://github.com/chriso/validator.js#validators","alts":[],"httpStatus":200},{"url":"https://pugjs.org/api/migration-v2.html","alts":[],"httpStatus":200},{"url":"https://jsonformatter.org/html-to-jade","alts":[],"httpStatus":200},{"url":"https://flaviocopes.com/xhr/","alts":[],"httpStatus":200},{"url":"https://github.com/expressjs/session","alts":[],"httpStatus":200},{"url":"https://flaviocopes.com/pug","alts":[],"httpStatus":200},{"url":"https://github.com/felixge/node-formidable","alts":[],"httpStatus":200},{"url":"https://github.com/reactjs/express-react-views","alts":[],"httpStatus":200},{"url":"https://github.com/expressjs/cors","alts":[],"httpStatus":200},{"url":"https://certbot.eff.org/","alts":[],"httpStatus":200},{"url":"https://medium.com/p/649352e2ae87#6ba1","alts":[{"type":2,"url":"medium://p/649352e2ae87"},{"type":3,"url":"medium://p/649352e2ae87"}],"httpStatus":200},{"url":"https://medium.com/p/649352e2ae87#c2d0","alts":[{"type":2,"url":"medium://p/649352e2ae87"},{"type":3,"url":"medium://p/649352e2ae87"}],"httpStatus":200},{"url":"https://medium.com/p/649352e2ae87#abc5","alts":[{"type":2,"url":"medium://p/649352e2ae87"},{"type":3,"url":"medium://p/649352e2ae87"}],"httpStatus":200},{"url":"https://medium.com/p/649352e2ae87#e2ea","alts":[{"type":2,"url":"medium://p/649352e2ae87"},{"type":3,"url":"medium://p/649352e2ae87"}],"httpStatus":200},{"url":"https://medium.com/p/649352e2ae87#2c7d","alts":[{"type":3,"url":"medium://p/649352e2ae87"},{"type":2,"url":"medium://p/649352e2ae87"}],"httpStatus":200},{"url":"https://medium.com/p/649352e2ae87#3f9c","alts":[{"type":2,"url":"medium://p/649352e2ae87"},{"type":3,"url":"medium://p/649352e2ae87"}],"httpStatus":200},{"url":"https://medium.com/p/649352e2ae87#74db","alts":[{"type":2,"url":"medium://p/649352e2ae87"},{"type":3,"url":"medium://p/649352e2ae87"}],"httpStatus":200},{"url":"https://medium.com/p/649352e2ae87#5fc3","alts":[{"type":3,"url":"medium://p/649352e2ae87"},{"type":2,"url":"medium://p/649352e2ae87"}],"httpStatus":200},{"url":"https://medium.com/p/649352e2ae87#3c1b","alts":[{"type":2,"url":"medium://p/649352e2ae87"},{"type":3,"url":"medium://p/649352e2ae87"}],"httpStatus":200},{"url":"https://medium.com/p/649352e2ae87#32e3","alts":[{"type":2,"url":"medium://p/649352e2ae87"},{"type":3,"url":"medium://p/649352e2ae87"}],"httpStatus":200},{"url":"https://medium.com/p/649352e2ae87#e5a4","alts":[{"type":2,"url":"medium://p/649352e2ae87"},{"type":3,"url":"medium://p/649352e2ae87"}],"httpStatus":200},{"url":"https://medium.com/p/649352e2ae87#243c","alts":[{"type":2,"url":"medium://p/649352e2ae87"},{"type":3,"url":"medium://p/649352e2ae87"}],"httpStatus":200},{"url":"https://medium.com/p/649352e2ae87#f1c1","alts":[{"type":2,"url":"medium://p/649352e2ae87"},{"type":3,"url":"medium://p/649352e2ae87"}],"httpStatus":200},{"url":"https://medium.com/p/649352e2ae87#7fa4","alts":[{"type":2,"url":"medium://p/649352e2ae87"},{"type":3,"url":"medium://p/649352e2ae87"}],"httpStatus":200},{"url":"https://medium.com/p/649352e2ae87#901a","alts":[{"type":2,"url":"medium://p/649352e2ae87"},{"type":3,"url":"medium://p/649352e2ae87"}],"httpStatus":200},{"url":"https://medium.com/p/649352e2ae87#cf65","alts":[{"type":2,"url":"medium://p/649352e2ae87"},{"type":3,"url":"medium://p/649352e2ae87"}],"httpStatus":200},{"url":"https://medium.com/p/649352e2ae87#9942","alts":[{"type":2,"url":"medium://p/649352e2ae87"},{"type":3,"url":"medium://p/649352e2ae87"}],"httpStatus":200},{"url":"https://medium.com/p/649352e2ae87#af6b","alts":[{"type":2,"url":"medium://p/649352e2ae87"},{"type":3,"url":"medium://p/649352e2ae87"}],"httpStatus":200},{"url":"https://medium.com/p/649352e2ae87#fb32","alts":[{"type":2,"url":"medium://p/649352e2ae87"},{"type":3,"url":"medium://p/649352e2ae87"}],"httpStatus":200},{"url":"https://medium.com/p/649352e2ae87#98bb","alts":[{"type":2,"url":"medium://p/649352e2ae87"},{"type":3,"url":"medium://p/649352e2ae87"}],"httpStatus":200},{"url":"https://medium.com/p/649352e2ae87#a525","alts":[{"type":2,"url":"medium://p/649352e2ae87"},{"type":3,"url":"medium://p/649352e2ae87"}],"httpStatus":200},{"url":"https://medium.com/p/649352e2ae87#12e8","alts":[{"type":2,"url":"medium://p/649352e2ae87"},{"type":3,"url":"medium://p/649352e2ae87"}],"httpStatus":200},{"url":"https://medium.com/p/649352e2ae87#cb86","alts":[{"type":2,"url":"medium://p/649352e2ae87"},{"type":3,"url":"medium://p/649352e2ae87"}],"httpStatus":200},{"url":"https://medium.com/p/649352e2ae87#3603","alts":[{"type":2,"url":"medium://p/649352e2ae87"},{"type":3,"url":"medium://p/649352e2ae87"}],"httpStatus":200},{"url":"https://medium.com/p/649352e2ae87#f32a","alts":[{"type":3,"url":"medium://p/649352e2ae87"},{"type":2,"url":"medium://p/649352e2ae87"}],"httpStatus":200}],"version":"0.3","generatedAt":1536775457549},"isLockedPreviewOnly":false,"takeoverId":"17eeb3e2ee8e","takeoverGrafs":[{"grafName":"ce83","location":1},{"grafName":"0c1b","location":2}],"metaDescription":"","totalClapCount":258,"sectionCount":1,"readingList":0,"topics":[]},"coverless":true,"slug":"the-definitive-guide-to-express-the-node-js-web-application-framework","translationSourcePostId":"","translationSourceCreatorId":"","isApprovedTranslation":false,"inResponseToPostId":"","inResponseToRemovedAt":0,"isTitleSynthesized":true,"allowResponses":true,"importedUrl":"","importedPublishedAt":0,"visibility":0,"uniqueSlug":"the-definitive-guide-to-express-the-node-js-web-application-framework-649352e2ae87","previewContent":{"bodyModel":{"paragraphs":[{"name":"89cd","type":3,"text":"The definitive guide to Express, the Node.js Web Application Framework","markups":[],"alignment":1},{"name":"8204","type":4,"text":"","markups":[],"layout":9,"metadata":{"id":"1*huCrw2ybIkyg6NzbhvrAeA.jpeg","originalWidth":809,"originalHeight":606}}],"sections":[{"startIndex":0}]},"isFullContent":false,"subtitle":"You can get a PDF, ePub and Mobi version of this page for an easier reference, or to read it on your Kindle or tablet."},"license":0,"inResponseToMediaResourceId":"","canonicalUrl":"https://hackernoon.com/the-definitive-guide-to-express-the-node-js-web-application-framework-649352e2ae87","approvedHomeCollectionId":"3a8144eabfe3","approvedHomeCollection":{"id":"3a8144eabfe3","name":"Hacker Noon","slug":"hacker-daily","tags":["HACKATHONS","HACKING","PROGRAMMING","TECH","HACKER"],"creatorId":"3ba40c3346c4","description":"how hackers start their afternoons.","shortDescription":"how hackers start their afternoons.","image":{"imageId":"1*76XiKOa05Yya6_CdYX8pVg.jpeg","filter":"","backgroundSize":"","originalWidth":8346,"originalHeight":8346,"strategy":"resample","height":0,"width":0},"metadata":{"followerCount":370901,"activeAt":1536830161548},"virtuals":{"permissions":{"canPublish":false,"canPublishAll":false,"canRepublish":false,"canRemove":false,"canManageAll":false,"canSubmit":false,"canEditPosts":false,"canAddWriters":false,"canViewStats":false,"canSendNewsletter":false,"canViewLockedPosts":false,"canViewCloaked":false,"canEditOwnPosts":false,"canBeAssignedAuthor":false,"canEnrollInHightower":false,"canLockPostsForMediumMembers":false,"canLockOwnPostsForMediumMembers":false},"isSubscribed":false,"isNewsletterSubscribed":false,"memberOfMembershipPlanId":"","isEnrolledInHightower":false,"isEligibleForHightower":false},"logo":{"imageId":"1*1HcGNZYjo78mH0faO3BnaQ.png","filter":"","backgroundSize":"","originalWidth":3600,"originalHeight":432,"strategy":"resample","height":0,"width":0},"twitterUsername":"hackernoon","facebookPageName":"hackernoon","publicEmail":"stories@amipublications.com","collectionMastheadId":"628349c2609a","domain":"hackernoon.com","sections":[{"type":2,"collectionHeaderMetadata":{"backgroundImage":{},"logoImage":{"id":"1*1HcGNZYjo78mH0faO3BnaQ@2x.png","originalWidth":3600,"originalHeight":432,"alt":"Hacker Noon"},"alignment":2,"layout":5}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["8a990ecb82a9","18a1a624e3b0"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["649352e2ae87","e4676986c89c"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["d8232bd0f39b","a4c8a2db26ad","be70a760a5f"]}},{"type":1,"postListMetadata":{"source":3,"layout":5,"number":2,"postIds":["469ba77d6c42","76045c58ca55"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["8df8c5a5dcd8","55f1a7cfd596","db8b79cbc4eb","3e783b409e52","3b5c6dc78708"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["5e2d252dbd08","1c4ce5c33d9e","4e2f8fbe87b0"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["636ef725cb1c","352409ad2c0b","e738b9668e94","e2636d9c2fd9","c984b020d186","9467aac7e05","6da90ca32189"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["f8a9df5b7758","ce91d7ab738f"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f2ecad74a597","26e6a27b3a0b","e44aa5373479","892108fd0d","2229a2b3732","7d8d5579a2c3","f012a989113"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["d63286fdbbac","820ae76beb95","f188169e5d3b"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["aae095126cfe","9ccddba55e54","ced61f4ac6"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["930b1b7e960b","f6eb7626ff96","a5b19901056e","ae537fc1a6d","a7112b43f016","f012a989113"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":4,"postIds":["3065028897a3","4440235f2bca","c750f9bf56a0"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["56d301675117","830dd607dad7","3b5c6dc78708","1ec601356af3","e44aa5373479"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"e1bbaf203d83"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"3f7e6af7c199"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["14c1c912e85b","f9bac8e5a1c9","82f98ef4f381","2d19046e90ee","db26cd444f9b","9f926798da29","b885b3a43fb4"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":5,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["4e3efed8649b","406c97cb311","a1ac874710a5","3c3e37f358dc"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["24ffd53c052b","88e77d2b39af","f778555d5a1f"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"7e1ab4bb4c4d"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["b0cd22a4c159","7238d13ebfea","a5792e90c836"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["e1d8cbda8543","2ddaf52ad862","e62ee790238e","399fcd21507e","ac9bfbf2f6b3","469c11b48b8d","4d2ffcaa9d0b"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":2,"layout":3,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["911ac23ab4f5","88113e885f56","3beaf62a01bb","88570ddce7d7","4e5407d0c68"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"e2e8c20bd949"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":9,"postIds":["8d44b54be055","c13cc138378a","b0bdfe028dd2","f52088213026","f778555d5a1f","f93764d64a8c","45004a23e8a7","1332a0877a6a","a1a0c8ea0695"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["a803d05e5ce3","14379e0e23ad"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"206d59e13d50"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["3d38422333b","1b4d29a0d7b4","640a254ee38c"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["fbfaad80aa25","a947404ff36e","86e53392d9bc","68b9b46fd1ab","676de6fb555f","61dfecbe2090","731973698385"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["44f4af1249b1","30cd4b9c6230","604ae27693e8","1021dbe7ecb1","713149eb9a21","7c8de164e423","f1baed075d1b"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["22dab6d98d0e","edea6ff5c5ea","e5ad483f85f2","bb3bcc4b347f","cc7816ff9cd3","f49ca6095054","6329696702a6"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["5a7042ca5fc","9ab9d749eeb1"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["afc5e9248c4c","19a3aa295642"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["f2d443eba35","c70ceac0f264","9df549af73e9","81df3330b938","235b60005d04","ea94805cf05d"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"f25bb1325a64"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"912ab169c2e1"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"3a46abfda389"}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["8efcf6d28322","b1a0733ccc93","2d5eec68f52b"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["81ddaa31de06","a6cd177dacf4"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["3351907ca6cd","dd5feb558e45"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["c38970a181bc","dea6542cdb64","a6824b6dcbd4","d412827a66c9","8a86b749545f"]}},{"type":3,"promoMetadata":{"sectionHeader":"Meet Our Weekly Sponsor!  ","promoId":"7e1e27aac372"}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["89aeed8322dc","fd8548f04777","5d019f4e014a"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f815eb19cd97","24e916ebb4c4","7a9374cbe12e","36a13723a454","fab973708146","a0dca457faef","1eeb6561549d"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"ca7621b9b007"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"dd039baaa823"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"80a850e5020b"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["ac6e9b04fcb6","2836251922e0","1627fa3f6936"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["73fb1b818f35","f3a1c599daef","b976da1ebd35"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["20c134d5050e"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["bdefac3656b7","f561fc21784","3ad489d6ff3f","abf74266c442","65343f18e5e4"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":3,"postIds":["ddb91ecec2e0","448675592803","4ed162db5777"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":1,"postIds":["afc5e9248c4c"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["b93a2b63c1a6","43e7708515ab","9cf0a05e4995","8d7b28133809","b91d3d770366","4a398889fe68"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["b91d3d770366","416b9e0284f3","e3f669d96033"]}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["aeb3e6f02077","e3f669d96033","56ba6335778b","7484fbdbcb31","2f871f298cbb"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["b2ce18d5b054","ee39c9b12ac0","9cc362a1343","cb8c9b016f9d"]}},{"type":3,"promoMetadata":{"sectionHeader":"Meet Our Weekly Sponsor!  ","promoId":"bff30d2f35b4"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["70b4f581ee4e","433171581d01","9241df07c18b","f5205ff483cf","25675234273d","bf398bc0e99b","b0f0ee83c982"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"Meet Our Weekly Sponsor!  ","promoId":"a5b9e0de6107"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["cc749ae14905","798c0ff3d26c"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":6,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["4af75b292135","c4d81adb146d","a756faf1bb03","6d01945ac262","65eb061b907b"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["b4122f657e44","8c305120e06a","9df493a8ce16","58e9ef855d3e","d9bb33bb62ed","c2828693f68f","390680e0e04e"]}},{"type":3,"promoMetadata":{"sectionHeader":"Meet Our Weekly Sponsor!  ","promoId":"65be46fc82ae"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["eea7ccd0eed2","223907ec298b","9a9d8e993be0"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":7,"postIds":["bbf9496b35bb","2d1651dece6f","a4e772c60f5f","44d71313364e","a1f71cc260ce","e127bc7a6fb5","480a90c5e7f9"]}},{"type":3,"promoMetadata":{"sectionHeader":"Meet Our Weekly Sponsor!  ","promoId":"d47cc296aef5"}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["c87cc77d723f","ed253e5b3594"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":8,"postIds":["cd6619cd4d59","52935c848f9c","81938689c79d","be9014a7ba","1136ed550bb2","6967985cc1db","3af569c7ac52","e56863694e1c"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["e7f05d90d961","8429229301ce","aa70fedfb1aa","19370ba1a356","d0b952baccdd","e1d8cbda8543","9832c11cf9b3"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"84c29054e7dd"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"8f2ae56c251c"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"bfd9d5ea6ede"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["1e8b50df3655","76425bef8d6b","ae7e7ebe0996","875cac6c172d","bb5f75d7ef79"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":1,"postIds":["ed253e5b3594"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["6144df75fe03","120132be508","bfdfff86fc5b","9f60e4130b78","6140e1c2a46b","11938fed397b","c6e412d0b9ab"]}},{"type":3,"promoMetadata":{"sectionHeader":"Meet Our Weekly Sponsor!  ","promoId":"711ef50ccbdb"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["2f2c9f9fcdbf","3769c6bde9cb","a4c46a608df8","1cdfaecb4851","c3ed049e8d91","cb9bdcbb5a67","5bbf3874496"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":8,"postIds":["4d0d916b9f78","d5a8b1a98dd8","292fa64bdaef","77de2155ce45","cf41f83de5ec","55d5f5283386","cf3a39aa95de","65cf7cb4c75a"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"3cd9168184aa"}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["8beaa863653b","5c78db3999b2","2cd7248ee623","cdae29f91ba0","4867f66da1e5","e5074b6fe55b"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["684817c8bff2","1f30545af17a","6639f46ba416","c90964a885fc","5c1f2ef18695","1f4c9cc0eca1","316bad449279"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["8067ec4cf7e5","f79f872224ad","e0c457884d2e"],"sectionHeader":"cheers! to independent tech media!!"}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["14060d66027b","582d0b35e2ac","b032e09140f4"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["54e65781acf1","a8b5a3415227","56c2d6689677","95c336f6b747","7915f23339a0","39fa9955e8cf","2a4dd2a62398"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["59164b1d25c9","a4f29c718b57","e011c3cda55e","f873664fce5b","651891ebe1e4","2a9253ccdd6","46e50438ed5b"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["af7a696e02cd","3d2dc4c2e029","a9f343b2239"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["6aae4cb26bbf","890b91e0822","fb35e9fc9b8f"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["77774f7730fe","b644dbeb6a21","f985f1472b9","43fa156719b4","14f7608e743a","856bbcbd8f49","16dbbbcfee9"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"e9e2cb0c807d"}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["540e8f46fbfb","7ac3357dfcab","3b0c9475412d","49c4bdabc0df","82f9c6b4cd6c","cddb29953aee"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["acb0d97c83c8","de5014f2bdf3","79387767830b"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["e9f9b2d4248b","f73ec1d2c70d","b644dbeb6a21","ce56d591af","44abfe48240d","323751799664","b6088f650605"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"cfc4622cb9ef"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"357550d9c823"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["fc6863e41b2a","ce24b611f0f5"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":5,"number":8,"postIds":["6d5034ff1eec","e0c457884d2e","3b5f03cf180f","514d8399b97c","dcb687766b23","40aeb2e4f7fa","fbf14610305","a69091083f91"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["50c161fbdcf6","e9c4b4b7d08f","1efd3a963111","adf61869cd79","9f306e57db8f","7364370b7b95","c7be9b17ae54"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":5,"number":2,"postIds":["36b28417f399","ccc259f2f1a5"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["b497c92d0b49","fbff41c4d5db","f28ff0f1bd8e","a0de334b5e8d","10188479699d","d39cb6f6feaa","b497c92d0b49"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"31a43072dc37"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"49a7eeaf669f"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"a548490580d2"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"e19ad0b082c5"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["128dff535a08","14060d66027b","161f03b04149"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"45b34a100b3e"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":8,"postIds":["6a35bcf34f7f","e8123d6a4199","6a6ca5d3637b","e9526066ddb8","68ff19441599","6213e105b00b","1002449ad474","86d6e55a5b34"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"fd1bd1a10478"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"8663d9e83c0e"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["c545353b7e4c","b520588eb345"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["e9049858f43e","4200c86ba513","8d8a9e7d3bac","57b186769d8f","36209dd6f6a8","d94c88cd4475"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["fd62a9809d94","5471f1935ff3","8b48b2cefc63","4a87ff2509c9","77b78d0a3c34","c20d18ed5b43","293514a516fd"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["330d8202825b","80d71f19dc11","f1efb0b361b"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"fa90a1708db"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"3e591077534d"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"6d9affab575d"}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":4,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["28acd1da0371","7c9ab96a7779","54ec79a47215","e42e49b524c5","e80ae1dc5e82","7c7f39916e","f0c2c5ab9e95"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["bf8ad832e0c8","6c22f14208ba","d3429200a1da","92543078551b","8178f4e058e1","59e593ff9f07","4556e5a9060e"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"e4c58baa5135"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["e2b4bfcd4d7e","30d8b9fd7f6a","ea22b7b7fcaa"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["5bb9a7b7ae11","31882fb6ab9c"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":8,"postIds":["ed99312f3d24","a55e3685f7a2","330d8202825b","574da50e6d88","e19fbe265e03","912301a287e9","d2fae1c68a88","b1d81c02d6cf"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"de8ac0687ae8"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"834a8f38c283"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["5bb9a7b7ae11","f135e2de9a1b","f13025af3ebc"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["a33da2d1f5d1","19af3ffef9e0","5f2c0a0850df","91484ceaf5d5","6b5f836c2b","c06a6b052838","8e532e436402"]}},{"type":1,"postListMetadata":{"source":1,"layout":3,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":1,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["4c5c326ee1a6","2384451f2f5b","3d63213c8370","960f7c987176"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["a08ab06b6ebf","68126944ce1f"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["5af99ff115c9","86ed41383d36","40c5448c066","133320bcb52f","b4010e9b962f","8140d3f7d3a3","2e469b762ba9"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["b0b8a6fda52a","4cae22e22fb","feb51b4bd99c"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["7851d0d77ebc","db3f76d9e9e7","d1aba226da43"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"230369e3cb80"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["35697427960"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["8398548f27be","582d0b35e2ac","8a7afd388bbe","d598e266762d","f27bb956eb8c","7251face1ad2","8ec69749b61b"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["73db0440ad26","4c5c326ee1a6"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"1e01bd79dd04"}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":3,"postIds":[],"tagSlug":"Story Licensing","sectionHeader":"Learn more about our newest digital publishing product: StoryLicensing.com"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["aa35b6e0f405","23d2428afda3","17ad575230a8","51da93530623","bb8512c70857","c0b883a7f460","fe7a98c0759"]}},{"type":1,"postListMetadata":{"source":1,"layout":3,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["a6f8ce6ac0b4","b0ffb26d33ea","66a34985249e"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["b8a451784dab","480072581f1b"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["266c136fc55d","9b759ca21cda","ef937e919ec2","e23df3d2e4be","480072581f1b","f1f203e9a4ef","72c22c75193f"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":5,"postIds":[],"tagSlug":"Github"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["cc8ff4f5199b","8250d69fd079"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["c429327cf577","f8f480448057","1882afc527bf","e5a58ab051e4","39ce7b036da2","fc552254ebf4"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["e3a615747dd5","56171e6e26c3","dc4824795d9"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["b3563722e856","a5c6d9549be2","50813d12aa46","909b48eb318b","706072f301b","a85edaa5e37a"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["6613d33229af","81616ac3e89e","1c93afec3066","2d3146a82c2e","f7e64a650b67","e972134c1cba"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["406445177a80","7cd1123cbdad","7199b686b6c1","3f9ece85983d","9901caca4fd5","bebc0700047c"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"f2d9903b5b4a"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":6,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["4dae4827841b","b42873eba509","f3f365ffca76"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[],"sectionHeader":" The Latest Stories on Hacker Noon:"}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"More of the Latest Hacker Noon stories:"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["2b650b5f4f62","6cbb1f0b6726"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f4d0ce28574f","c1fa8f4260d","c7eaab3511fa","32d018c46b06","23f944203598","3288b789b85d","5b4c28bc8824"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["11dc203890b","11b545c0a3f0","da7fcaad05c9","3fe23be5c19e","6d45fdd26721","79ebf0461b9c","4f82bd3eb62d"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":5,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["d641f1714903","973d904bf28b"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["79ebf0461b9c","59fee84a9ed9","ef3add0fa202","f0702143be08","b69a91598f5a"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"e2b2b6e2e85d"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":1,"postIds":["8142f8277c50"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["216dcba55d35","5ca310455019","6864bed9349f"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["d1bfebcb3a21","f102d0c50a7d","f4f719532b64"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["3fa6ec61fab2","9d440dcec825"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"6d460003f6fb"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["83ef7260cbf1","c42a95a8f884","7cd116cc5347","bc0b08312fa","861990a7320a","be5c30184e13","6fcd1b49cffa"],"sectionHeader":"Tech 101 Stories "}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"d41c74ae0d0a"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["5fef0df0f00d","e95100f7c7b1","2fc7becd6852"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["4f4f2ac214c","de999a41e047","b87cc694ca7d","6394a645478d","df77da680219","d46783a33881","8d33351e59c0"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["6af7ceb0d8a3","16f87f17cb4d"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"82f867b3a9f0"}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["58c0c2da8a7b","4286f6c98cdc","3a0ce661642a"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["6b2677044214","8b9a83f2aa23","e9f0e3ed36a6"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["899949ec555b","1476db95eaab","31afba7fc044","3f174d50708e","117428612f46"]}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":3,"postIds":[],"tagSlug":"Hackernoon Letter"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["9935e1c72019","a278c726315","824ff4b3ea19","5e5023dc1c75","a2cc855ce9ae","d0225be35b53","cd840fe3c79b"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["41562cfe910b","7886aef60b4a","98a93c5cf335"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"793f2cc02d19"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["b5b88baab63b","9abb40005d15","695333d8f92b","84947b6e1854","c320c860019a","6cd6501d261e"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["44f237982d95","9935e1c72019","48eb1b90a834"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"e9784f75d4eb"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["6d36690f511f","243bdfa2c3fc","a278c726315","8918084095a6","6eb87a79b39","cc7ecb8b3e70","bca86435c878"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":6,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"5c287d7d6e2d"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["26588a660afe","680dfa213aa6"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"942c8f6c414"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["6090a9abe813","aeaa1f5eee80","5a329ea6813e","c2b22d7cf95a","188ea18527a2"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["73d60e08b85a","7dd8a85f299b","9e13678041fe","565637747557","d33aee2f699c"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["2a1779c4db7b","8f9e22d49353","6104453bbfdb","907a08a3630","16a96b04125f"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"fe33e0367f6b"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["4b2959c03a35","3b91562c9b3c"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["11abea97a88c","a35ced0d1871","914dd392b33e","72355c1ffc33"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["cdffbb6bd6b9","598988b15748"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":8,"postIds":["fa9f4ce822ed","9c996d352af3","1c298570d191","14379e0e23ad","230fd9bb61f4","806ec0ecd60","21c239c1d5a7","9149e0267e6d"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"2e556522b3e2"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"54b9084a116f"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["5d12f84f9824","d3be086effa0","dad55578062c","e9f2f7b31b0e"],"sectionHeader":"\"Are you raising $$$? We raise $$$ everyday from our customers\" -Sahil Lavingia"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f3073c725232","71c8be58948e","9b9b66a50aac","4c65613c2db9","7addac683285","ccab7b5552de","6a4c5cf3cc89"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"c28219e53f1b"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["4e3efed8649b","de1a3cef2341"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["1f0b2c7370d9","692bf676b05","47b5575d4e20","5c4fa340f2c2","13d92a6df5f3","a56be62b1f95","6e92f79fa66b"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"9a707f3516a4"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["94be921e6354","2d69aebe715b"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["7302bcc3901e","668f97c138b1","1781df7ebdd1"],"sectionHeader":"Recommended Tech Books"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["fb19314afdaa","60edfbe60786","1478c2eafb20","f776080ac8d9","5b485ebbe99c","bb15c6c1e163","c9bb2b6d1acb"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"fad5e7f4d8fa"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["5b13b1ebcd4e","8372628154c3"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["3d7e0d72213f","34c2d8ced7f1","aefb24529c4f","53d4e7ab19cc","6e1379f0caf7","ef54815873f9","7e75481a798c"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["b12e85aa7d17","513d78add55","364bfc96560","15ba02ddf4a3"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["97867fc06f2b","8933fe2ae51c","139c0dcd3245","b85b079ac45f","b80d0f8ae906","f0d27634ef91","8be7577d925"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["d25024db07d5","1b5f53ab69e0"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["9dbc05f2e41f","5b13b1ebcd4e","ab45446edb11"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["502dbcaeabaf","a6640ac69325","109670038859","d8f2d8cc2c15","d20b2dbecc07","9e4c258ec9fb","32aadc8e773a"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["3febe4574467","d61d064f2fc6","3680c4524fbd","865dc2c06528","4b8dcb756937","6dc138061235","67754743d494"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"94fa23e3f13e"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["c1c4ffb4ebf4","c2385e0d2f89","b85b079ac45f"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["bf27e4837151","89170c501e4c","737d2206545a","13b08b512bcd","a6640ac69325"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"684c6c2c49cb"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["f1115739e76b","9a8cb347c5b5","b9224e44d3ad"],"sectionHeader":"Tech can be scary..."}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["117428612f46","837276200b9f","21f9a470160f","af5b9ef41aa","ee81374c01aa","396f6953f844","596ad4d4c085"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":1,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":8,"postIds":["a9664c76336f","3103e26fddd8","e1ef8c98b605","a7b19508d9f4","5a7b2562f3c9","dc8690bf41f7","117428612f46","54d14e279552"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["34bdd3cbec4b","c9146716e0cb","21362adba27a","1227aa782d","a004746d2ff5","f928dbb145eb","95e7256b6854"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["b7c3bbe0b0d7","618282a1a9ec"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["319ae47117e6","60c5b399100e","4e94c8e7e5c1","afc7edfe3913","3e9a7643152b","62ebeb5f39c5"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["692c51030342","eeb07486230b"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"7c637d313bd8"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["6f71868902b7","1851667c726","c8070c5b901f"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"b22fb67c4117"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["c465669cff48","7b42b1033c4e","8804905db43e","5d10d72f14d1","e9d5266d13f7","bd361d0086e","55cf2b8e6fa2"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"1631885336c"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["94be921e6354","2d69aebe715b"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["b8566cc3fe8f","e824e9c2a4ef","1584f19a7eec","74dc65d5d058","8ef06e2b43f7","7dddf8d635e4","5e6de1b61a6b"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"e8740b08c8b1"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["6bd7607d537e"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":8,"postIds":["a1cf2ca834eb","a868606a6f0c","959dc53238b7","aa868bc549e4","4567d67ea773","d2655df479bc"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"937f8dffb138"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["9a8cb347c5b5","844f739659b9"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["47e0aaefd624","b9df618d53b4","862c01d07f30","ac22fbf07e0c","5955b71536d4","c0ace26d21c9","692c51030342"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["a71a6d788ad5","2b06e7ffd843","11b8b360617c"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["d1ce3ab0f047","69a6bd2c6842","2332a29e00a7","cf3fac75dcf7","77c6db5ee192","661de3e32976"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["3d67a3a8be93","94c890a36c0b","e541f1387592","a398a9a029a7"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"ead6f9956e53"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["5db88b79ce61","fce011e7d87","d37207dec27f"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":8,"postIds":["e1c6d3044dae","eb4eb32cc4f8","6d508cfc70c9","ca39c6407d48","7144566c54f9","3e7030748810","499579033214","3878a05713f2"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["644a0d6d048","5beb2cc6bbfa"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"9541290ea94c"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["fccd630d73d1","2ae7c61a6b2b","11f7a1bba400","945f734e43d5","d7ba9c0fffb6"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["ed1ca8c6147","b5e1b5b3dd0f"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["e2e1a1785895","11f7a1bba400","659cc5117f8f","fccd630d73d1","3c359e741d74","600288df98be","4f04261b85f2"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"685b09a42172"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"7972faeb3fa0"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["ecd3e1e2cd7a","fe49c0372a63","a3aca0a4792b","da4dad30d2f6","dba1c7d02dea","8c2508eba4aa","e888ad5a13be"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"493dca7207bb"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["5cc25e808275","53af1f5e2277"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["61a2bf1168a6","b049880df46e","fe49c0372a63","8100b6daa2b5","2f673bf089e3","924e70776c6b","2c9a1b04de78"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"df61911479f0"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["5be295dad17c","6aee4e32ed51","c1baa1c07872"],"sectionHeader":"History of Programming Series"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":4,"postIds":["630c22f5ba58","5cc25e808275","b358a2b97770","176f7e4416d"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":1,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":8,"postIds":["f518edf1e4ee","6267b7fec50d","92c178e2a178","b2bce9fcbb2","4ef1b68aac25","d2e735d8e32e","a09cfcf56aa5","b7c6d3df442c"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"22a76b2145c7"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"4a6ef90d6c0e"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["88c3cfb6a66b","d96808b3344"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["6cec86ca9d73","bee4a9eb3b5f","835128b18816","e42434f722b1","a09cfcf56aa5"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"2a67d05cfb88"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":8,"postIds":["c67f51c2f83e","17c01240266b","1454888f94ef","54544acc69a1","cc94030fba3d","904302498704","603412218c38","4f5470485aca"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["50eedc7762b6","c2771c62d179","ef8380a9f945"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":8,"postIds":["29db8afb9b13","855f378b4176","de36ee5ab474","1781df7ebdd1","eed08acbd6bf","375533b16113","a1f798c10376","2a0741dac17d"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"9802cd10aa6a"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"47481f2ad2"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"8a53e08c8b16"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"173d58c496f1"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"16409e84e618"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"1accb036fbc0"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"b632bc9c9150"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["92ae03ca04ae","67e91f65dd4b","d4f3b3d01b8c"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["5a936313c6a1","f843c48139d6","6c5366985026","e73e0289ad86","60235b40bd77","80d6893602fa","8bb59b243e9c"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["5c6fbbf1f157","e92a1e6dad9e","18cb3bbff17c"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["60da81123306","7ea5ca1c9a6d","95d1ddf176ea","fb22f52da758","8154bd6e2de1","7ca0015a9c75"]}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":3,"postIds":[],"tagSlug":"Facebook"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["1864af02f68b","54f7fb980bd3","c51b5cd6c2ff","e6398984350d","713f5a40949f","c3f3529a0bff","57a864c2d04d"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"681ee5fb34e9"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["558bf6817069","4ef1b68aac25","d447d1b97f62"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["98787d2a2fa0","d9f55aed596d","87615bc0894f","cd1cd3ed58a6","f9a8f162bd3e","3396df9935d4","772d7ec80e4"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["9ceb0ee249a1","c4dfebf66802","49b9e4f37df1"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["74b022f195c1","adf0b97a116c","d09d24992cec","161a693bf74e","2ebffebb362d","a8ccd8e647bd","b16b6d523b83"]}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["b4f590edc8e9","1af2bfcfec78","d9c397b887e4","505f0b61e53b","e1ddd1791450","b7f7b6a1707d","5e0c3b32b3c7"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["731c10a1b98e","d09d24992cec","c3f1e6273262"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["d5ab6899f249","74712f1dd310","4f1aebc444c"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["2bd0d4a9c520","2195359d5d49"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"63b964ee9718"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["4d5a7b7be869","8bca0e20a333","32d0209803a6","47ad79a54519","5a46cf3689f6","afe167c90568","6cc4c0142a12"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["37441c136de7","608c255b3056"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["11ec2f964c72","564fa85e2235","d5f9e8f79ed4"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["fed2341078c8","563e4569086e","20c9947c22d9","7c57a100a12f","938a533b685"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["869241659d84","2176bde2a4d9","655a160d66cb"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["b64684fe2c7","f13108f10ecc","ab95bed3a57f","732017a00a9c","5c119f7f5a72","1cb57e01d40c","f44a2ee30caa"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":2,"layout":3,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["7cfc55e64a15","aab16fcb5b08","a425968c7d4a","c790aead5c1f"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["dc298154fafd","e5e2fce9ccfa","2dd17119c58a","eca57de7d4a2"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"551c3c6a45e"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["d81639d8291c","e8b7cd29d398"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["308a205fdd5f","a3606305321f","cb5a36e91072","332e5c302909","2189ce09940","71a06afce81","52bdc3f05782"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"fc72050a94a6"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["579f9373e24b","9aa7301e41ac","dc298154fafd"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["abe594c49a84","4253b6d12347","de7af7e5a38b","4ed747cf315","a1914dd95c36","7130156f91b2"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["5dc8d705c5dd","ee733224e6f2","b53d36e69400","b6c6b27398f5"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["ed9b009c225","4e57c4e80cac","add1c3274e1f","f9d9c10fd901","d70f8a48d1ce","55590ccb2fd6"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"41877e09353a"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["192d55f26900","6d8bdb7c1697","f937480b941c"]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":4,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["11b304db97c2","33ea51e87f5d","dab606bfc57b","30da79af4712"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"f97a1a229c86"}},{"type":3,"promoMetadata":{"sectionHeader":"Please welcome our weekly sponsor!","promoId":"7298d28f3755"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["c320ce54a4bb","b06a982a2bba","f29257b0dea2"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["a099b228a87b","9dd8760304d8","889df80c8641","e23b4a45be82","947afb25edb4","1f7275e396e","3ec1901ec7ba"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["a41bd309d6ad","74e5f88cbc9","47ad19652eab","6d49b583df42"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["ff7999977e84","c97ff02adda5","1a92e6629842","99a0ecc56f10","92f32a98188b","2796e34673b7"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["1036c6f6b19a","bc829983bddd","4009dd85dfde","ebae43cdf859","b3a1988d5ad3","873cc405d5c2"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"b31e45357c6"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["e212e111c675","b2baee8b8a38","1261b6e18d76","846da334f8fc"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["51cfc3ff53d8","6e94372789af","d8b1d413a477","dd635a054ebf","511fe09a770a","aaaa0f2155c7"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"99f2dfed19ee"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["ce4fc49fa980","923b6008cf7f","2b0aea499f9","b85ee38bcbe2"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["2c87760a2315","41407a8b1a45","9ac524a2612b","78938b37092d","36da9973388e"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"24efbda0c3bf"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"5e5e05f2c01f"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["e9a2ed53b93c","a6c78e0951d8"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["3f93c7fc0390","bd20d3020470","d0415775efd0","37ddca3e63f5","4663e2c80992","62f3e50cd57f","b7696eea52ba"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f1bfc1548c72","7367f04c7037","949de347e5b9","eb9e3b8d6d0b","f018f20656c1"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["55420e2951f5","f406417ca318","eb87ac8c18d3","8554cb526158","2c6cdfbd6809","d333bde82509"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["1a0fee9b4020","54f5a273cebc","4f9620124624"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["3ea6ba22cd71","46957c6aa5b7"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["3a75963317f9","596cf822ef3f"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["f7c3dd65f5c0","af78626730b","804fcecccef8"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["831e74d5c6f8","43fd0e0cc2e6","cf251e123e69","4ea26a0316b2","adc5af474dc9","f3f7dda84bae"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"1624de9e9555"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["7fcdc1ac4a05","b09bbc38e7c3","6b56fd60b7fe"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"c1f408fbb54c"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["cb48be00fda7","8eb217adc3","800dde4978a","c2a2b19cc1e5","d81771539ccc","d533ef6d4862","a761239f6b2d"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["4c2a3bbcd5e5","105372ff599e","92632ff0dcef"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["6bf24e2689e5","e9e45f8c10bf","6eb44bb9ea75","f8b7fc0a89d7","95336b5acbf9","8e713b5053a3","43a03e52ff38"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f68efc61c599","5909d28bf004","170734a98d25","5c5ee713b223","5278e0bc8482","3a75963317f9"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["3fa161f4a546","9e30695e8ae6","e42434f722b1","ac6f8a867fae"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["3d00c92fc746"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["582bea781d55"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"aada577bf9e4"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"a51c0e6c2886"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["2cea7841d444","3d70e4ee6f6c","62bfaec722f1","2cea7841d444","567405045112"]}},{"type":1,"postListMetadata":{"source":2,"layout":3,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["a33f68546f71","5a537033da0a","792653bc3623","281f70322adc","2194640efee","5a71d74edf69","66ceb38b3a9e"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["8bc50c46bf3","2662f5882f9"],"sectionHeader":"HOW HACKERS START THEIR AFTERNOONS."}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["66aa710178fd","6ab8e5a3827b","6e52394c38f1","5a4aa4840135","dbba1f2c0c71","ec4b9d1dbb8b"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["50c1ee5282f7","582bea781d55","57a85d5f8fee","4a38ad02a239","792653bc3623","1bb2bad8960a"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":5,"postIds":["1b39d1581d86","319ae47117e6","d81aae3eb0e3","cef28fed6c50"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["38e51e1bb57e","c5b03d8dc8d7","6470d7945e71"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["1b45e6a3d9ed","69f57804d6f5","732f2a4db512","f6c18a91b232","382e72f7f7f","99add8963a20"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"144cca1fb011"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["3150faf965e4","908a001e15d4"],"sectionHeader":"HOW HACKERS START THEIR AFTERNOON"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["fd73260ffee9"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["99add8963a20","66e27996410a","5c3032328e52","a2d27897b5a4","43e261d03bb3","cc6e6d68661e","d4ff8d9a3fa3"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["dda85b876adf","fd14842794f6","906d3c34893c"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"d7b00b6f98b4"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["1c6493ede120","458f06732dc5"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"b66c4352b8a"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["68e4f907f661","1393ecef76de","4dc743fac5f8","bb1fe996352e","7515fbbc85f","c431564c84a8","b564fe938e8"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"af026da3d06c"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f16643bf325d","98b76e15d44d","b0388beae9b9","5f394fc5ebd0","6f315e4433ae","b19603502103"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f4c71712624c","648990d84dd","7868eb9bfc83","9461dad669db","4be57bcca1c7","8f0da3f22f67"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["2e78dbec87c8","9ebb7ba83a8f","862b90dabae5","673f64f63dd2","3af844f61257"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"bd37d9d1eeed"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["ca5850e8421c","412a24357d76","ae7492fb01a6","dce7624690d3","70ce667c212a","9d5bb83510a5"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["165fa612ab42","92829cb42bb1"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["2f09e925cc06","e5e6289bb8e5","25f2277c73a6","ab0b413e5d2b","2e78dbec87c8","fe17480ed5c6"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"a7a08a8703fc"}},{"type":1,"postListMetadata":{"source":3,"layout":5,"number":2,"postIds":["df4e1905d373"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["2703165f737c","73991f2328b0","d66c3d37ad71","12878a1bd7f6","9101528a7b76","8985a53920b3"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["9ce93184f3dd","1210ab27ebe4","a89c82d1b494","be70a62937ef","4be57bcca1c7","69b96ad943e5","5b47ca1209b3"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["12878a1bd7f6","9c4b84d38ce5","ca01af1a7041"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"7708721caff6"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"4c015e9ea6e4"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"c3628562fbb0"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["308fe7b223f3","3de21282c7ce","50e47dfd95a0","e1b504179848","3d817aa25dff","44c9659c5e75"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["d7b3780920e2","33df51f7367c","b995c5aa7e37","c29cf8bc09b2","9e2f596a050c"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f3f7dda84bae","b669ae467f92","52b1ff18552","37bb2701bd2","2695835f59be","2f6b889dcf6d","281b6abaec5"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["4be57bcca1c7","e464a2dd34f4","64ca9f6f9a69","f7637b80ec26","e541e2a1414d","eb0e20a4a2b","4b4aef907810"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"e526a5db2a99"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":12,"postIds":["b552f584776d","f3f7dda84bae","85258e1bc87","771afebffc0f","256a4781e843","39607104e89e","8e2cbc0ce420","dfdad0a61e99","2cc3fb1fbefc","79da9a941ec1","f19b3f33ea92"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"e6a39af2d128"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["c2f26933db23","213f8a924e89","568be62fdf6d","4a3328a4c50c","7ff89cebf6fd","8ab9c532c500","77b105033d8e"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["e9bbf9675a8b","a0df80914f05","b5698f0e2058","586f09a17fff","2ab1471ff078","ce467aee06c1","a6780d67480"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"c1f8ea66adc"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["d1cd80c26f08","4e292524ff47"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["89fde97b5352","1f17fe30333d","41a11307d075","5f5bae03f113","de9481966b98","27505e7ec03","70e2083f103c"]}},{"type":3,"promoMetadata":{"sectionHeader":"Meet our weekly sponsor","promoId":"4b7a404a6ac8"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["6e97a25e7402","6bcd71794853","3b823e434fc8"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["abc9d709399d","946849c2fbd4","8394d06a0a8d","b9ef59bffe8a","263434c0b8ad"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"2b715129e8a7"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["d4a71f601346","3ae907a5b4a5","defde2a28b51","4710914f1b01","fd2721a00586","99233a415462"]}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["b0a7c743c1c1","6b6f64da07e2","1705df5434ca","5e7e7f7d8914","26582430bf58","16dbbbcfee9"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"b2250ffee70b"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["33ec8c79a8e2","429653de42d3","a04a94ff758e","15384bd30354","77bfa1afd1b2"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["8aae6042fb48","66df47506371","ab1ed50c0e49","2c0b44f57a14","788e94441d60"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"65cd9bbeee53"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["f5ef050c8c92","fbc2712fa322","e56846300025","fcf5fab9cdf1","60ab1e1b50f9"]}},{"type":1,"postListMetadata":{"source":3,"layout":5,"number":2,"postIds":["91c6318a7045"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["7d907f278a4f","d9bc85e1d91f","57cf806d34df","d733cc2c48b0","caf2e2318abb","b8cd3287f9f0","1628d08aa7dd"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["32c35267a585","689157d9d64c","afd0d32ab50","3b4bf96e138f","2c1b96a77cd6","117428612f46","5be456018040"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["65c51e24398e","287ea58a3395","7c5f6d4efbec","da7d04bd7f42","5dd92b533870","f1b6966c7dbc"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["ecffb15fb24e","ba05a84281b6"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["8aae6042fb48","f69206586a7f","a78d320de97f","5c0a454fb278","e4974a8d165a","6bd28795b313","33126a96ee23"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"446a32fc0d24"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"865e00d7a5cc"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["34161bed1775","f85e24733654","24dc08ffe60b","3dde6c77adbb","71b84292bf3a","4991ceff55d7","94abc7f2232d"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["9a8cb347c5b5","94bc09232b9c","69fdf195e47","4f250385673e","38be5bdcf4da","14a3aecbbb98"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["e39f92cf16e1","7b45498cedfb","ba71a5c9c7f6","4f64fb199df3","41ee7c6d032a","5949d21ca5b9","6816b85deb0c"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["1f147b8dfd56","cf54999c097b"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["97a9daaab2ad","ef2aaa069cf7","d52f3413bca7","209358817f9a","4088f2eb01be","ebeff6c34f8b","3e07b02394c"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"a1f1dfd22f1e"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["c674c4b06b3a","b9390c44318b","554e4c586b1b","c10871bea599","a613048959b2"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"689bd0be3c27"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["a316ed3f445f","a154194cbb4f","5c7e7359109","71c602bc1fdc","b9390c44318b","819053c3b2cb","31c809bfc39f"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"f797a76afb45"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f3d47b6686ef","6567cee2bccc","cec76793b6a1","5b7b0da5d4b5","5b578bc5cb7b","dad55578062c","ba71a5c9c7f6"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"9d7a29ed9e19"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"494042c57cb7"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"c2e6b6be8e86"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["27a4a3cc2bb1","d983279dfac6","78197497f95","90c005d2129f","824ba801a51b","530b36147e13"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["67ebb5fc7ae","3abc7e00148e","be4b3e326387"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["e82531365e6d","4f403e96d50c","952b389ad7df","baade68284f8","16d8c81b4077","f94e3929891b"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["214122a8948f","1aec77fbe2fa","a6ab438fe79f"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"47b3ba8e6409"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"9e3d7cfcf2ae"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["235b29ed126b","36584863b0f8","4678b8d231b4"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["2e0ed0638f47","39782417f990","a550fb945e81","560a42d96ba7","713149eb9a21","5405058f36cf","a4ec565b5387"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["d04266844e7","d101995bb843","7a895c3c1b67"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"d0f942e21392"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"389040327ca9"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f2b5521c3f25","b91f4ea3a3c9","beea36ef194e","9f7e3d52941d","44ecf9e8461f","75701ed23f68","94a3aa4c2aab"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"f970499f6f87"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["aa56f4fcdc42","c33c16ea5e88","dedab6afd3f6","119863d5d9f3","806b8ae77fa6","97dbad1ff28c","a1088198874"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":3,"postIds":["3c6116ba30a8","c54ea887598"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["1cb71fc969ff","78f3a69552ac","a8437dd94425"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"25442c821aaa"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["3ab8dbc55eb3","7fe46fc43600","9d65031e7491","5f03eddd3add","3e13008fbef9","85cb43b302a0"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"d9a690308592"}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["2a02c5e8f138","e7dfb9377e28","2ffdbd8a880f","3201917e2ac3","df4804fcfc1","a8437dd94425","98a98e360315"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"d45f1e1b26b5"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"631cbd4d4722"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"37611551a9bd"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["786b0640fe85","dc8c23a52985","4b503e6485db","dacceaff9a13","3eaa4d38da63"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"f96cf948f855"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["8ae5594d7446","218a23186cd7","60839779996b"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["c39aebc25517","beaf3b9a88b0","8d6ac4c17e8c","bbe1016d1f7a","c57acd51846a","5ac67fb138ff","e01c605ec296"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["f2d443eba35","ee98c180100"],"sectionHeader":"On one hand, BLOCKCHAIN! And on the other hand, blockchain... "}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["a9a397af9221","468ae877700f"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f24a206dc467","fe28d4d11c71","2e469b762ba9","85d5881cf163","62a56d8435e4","d575f70b39a0","dbe237c40430"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"7b8579556cc6"}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":3,"postIds":[],"tagSlug":"the next web partnership","sectionHeader":"Hackers on The Next Web [Partnership]"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["87e6426398","413679bb4c3e","d183db1057ea"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["73a93685197a","b338247eed6a","3f05f6cee400","46408cf09734","d575f70b39a0","c229df788439","8b3bbc7ac3c3"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":8,"postIds":["b6aa17eeac20","2e469b762ba9","89985ca2be48","f37cf4c0043","89570568417","ee98c180100"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"1776e09fbee8"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"315d6b101da4"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["8ac9fa893823","133f1c375cd3"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["68750ed16365","c4526d6d3f8"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["ecce0d27e638","1f886fbd3c5c","5597c743cd0a","73caaacfe31b","58884e95c2bd","11e158b734ee"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["fa3bd02101ee","ebb3253e63ce"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"38f55445474d"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"aceba1abaf3c"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["5d3574a3aab6","96e3230782ab","a2eb19a26c32"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["9a8ec4ec7d62","ca553f5a002c","c8b49bfe6e32","e1b3062b9341","d2c79ec43201","e9db73107ebf","2e9c1c685576"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"7f61c3746a72"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["350ba0060fc9","f2d443eba35"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["aeaf126ce979","3d63fe4c5c76","8e59984a491b","c2f491199549","f1f8f63594ee","133f1c375cd3"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["f39a5c778c4c","8ac9fa893823"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["a73122dd23d4","822478b5afbd","96e3230782ab"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["29599a5c78ac","324bac3a0ffc","6f2cb28657cb","1d5f82e4c26f","2b87f63bcbaa"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["62a56d8435e4","e9f0e3ed36a6","4c36ce8d4535","feea7730b20b","4f1872171475","a1d9eecdf8fe","7fab00ee678e"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["3bbaabceadac","657a1a3332e2","d1ae5e562a1","a5b54745eed2","69a6cf68f447","ae58c69b3bf0","de59e6770e9"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["3ba2c770ba98","809672a678a1"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["fa6f28ba0649","a1333072a2e3","f2ffb2810203","b08e9f87052c","6cd9426f0923","684bc0584bb6"]}},{"type":3,"promoMetadata":{"sectionHeader":"We publish 25 tech stories today. Choose a category below:","promoId":"abff68f8f897"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"bfe226690685"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"a598a648231e"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"566ff7dbcbea"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"4f2c7a62f9b8"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["d572bb52e21c","7fab00ee678e","76dfcb33587f"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["f4c7fffc0297","d572bb52e21c"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["dc1a6f725490","d40da0449faf","7b952b8b038e","cecc1ba64506","3de86d22bd6e","5d6396c3a402","8e73903b98fc"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["15f03f5df12","301a96f49c34"],"sectionHeader":"Lets Talk Headware!"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["22e2a52f9c7d","83bdaf2fdf4f","77bf34bec2d1","30a3acbfef13","2ac5d2dd4881"],"sectionHeader":"5 Trending Tech Stories!"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["79956138bea3","6dda57b5b00d","aae9fcc75e94","ece2eaf5bf44","2297730143a5","3216607f63f4"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["652b7055569d","c0b44bf2b17d","6c91a13b6685","bc1ddb91845f","d030804bf358","258ebe9eed1","44d4bd3961b7"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["fe28d4d11c71","2aac943acd97","73bdb49693a","c1c5714f79a0","f6ee15646981","117428612f46","a2b66f0f81fd"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["17c4743b3850","5a0cdeb4d579","2f2b7b3f124","b30494c0e19e","4b066aa6aa9c","9a3e613c833c","d04e0a525779"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["6bd1f401fc3a","bd07b282416f","bc5752187556","a6b2e2859c13","1fe876bcf5aa","bdd44746e83a","b3aeb35ffe31"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["5d41628227e7","f5851848de5"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["e9f0e3ed36a6","d1ae5e562a1"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["9aa32fdef359","4eab513485d1","b5f8f736c79b","94c775f93fd0","c9683fd3295","4437a1aec217","b30494c0e19e"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["6108081dbada","4e7a00eb6196","933b24009e35","9df9db9e7d23","1d0a5fe08183","247a0df25338","ad5946378fb4"]}},{"type":3,"promoMetadata":{"sectionHeader":"meet our weekly sponsor!","promoId":"970992ef0476"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["788fcbdcac2a","69c8b2a55ef9","28e9e2a47eae"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["85d5881cf163","11213600658c","d0787f2abfd","28e9e2a47eae","3121f8d50cf0","c1ea802c353b","92a6b19ede18"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["272ecc0ad370","7412d121798d","67d633ce8ace","e5eca9f0920b","5483362d79b5","5447c641d397"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["475010b26fb4","e9f0e3ed36a6","5bbebddad96b","2f4bb021abc4","6a804f334beb","9534818fb217","f59f92fd8dca"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"cd73f03d69e7"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["7c05361e467d","b280bef441e7","c3e07819c5bb","ea9338cb13ed","8cf194987a50","5447c641d397"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["de2913b04ca4","454fae465d63","ef00e6f3d8a6"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["286aa625e26d","2790fa6c81a1"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["2e6a5b65665b","b9a7f01f84ff","9d6c7b7f9c3b","d9ebca8d370e","31c6858e47b7","f2d443eba35","6c11b6735d10"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["4df003345ccd","75387cbeed3d","d6d9887c494e"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["1f331dd11b1e","87f859f13f75"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["f5838fc27382","c6278cf09e85"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"79b655bd009"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":9,"postIds":["1751bd1212bf","c71fdb07d51c","c54346cd8ca0","c4d02f27dd3","6926df5af0c7","5bb0f9d56801","c5c5b86e9458","bdc5aeaf2d07","68bbccf6885c"]}},{"type":1,"postListMetadata":{"source":1,"layout":3,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"The Latest on Hacker Noon! "}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["b8081402a3d5","8d353abd2f0f","438b51333fa","4409bd8528b0","70e4b8cc72eb","3a5dfc96c355"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Latest Stories on Hacker Noon"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["10b059541894","8f91dad8e4e1","b5caefd995df"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["1788da8a7449","31a88b97b282"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["3229d79ec062"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["6435ad6839be","ee9e7fcb1a51","2a2d627b0202"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"d4039f479491"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"ff71209e861d"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"2e1c6d75c04b"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["d3a272034668","f2dfdfe82de8"],"sectionHeader":"From our new partner, Quora! "}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["467368aad888","68d7bfb37a9e"]}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":2,"postIds":[],"sectionHeader":"Monthly Trending Stories on Hacker Noon"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["60cd8d2713c1","7acd8ea68157","6d82fad147b9","a73af700aee6","79ccfe159d08","eabecd21a365","b3ce3a939b7b"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"31a93c4f45d3"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["46e7f4dc34e6","5a68fe24a849","7a31565e768","5b4be1b7c9b2","fe9f574b3c5e"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Latest on Hacker Noon"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["6bdfa366b899","38d41aff563e","b94973c21784","cb3b1fd04a1c","be5c30184e13"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["5e937707c27b","938cff3a0fcb","bbd5fd790af3","14e46e99942e","873dae511021","35b89e67ce79","9367e620d8cf"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"5bc3d515af98"}},{"type":1,"postListMetadata":{"source":3,"layout":5,"number":2,"postIds":["80704ba39873","9cb62476ef3a"]}},{"type":1,"postListMetadata":{"source":4,"layout":7,"number":7,"postIds":[],"tagSlug":"quora partnership","sectionHeader":"Popular Tech Answers via Our New Partner, Quora"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"f847b2930ad2"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["6dfef764da1f","d4615c12ad09","3fceeae2b21","64be1a7a0264","956cc2edcf9f"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["71098afa07c9","62ecae8fc85d"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"b8617813d6e0"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["40ee1ee9314f","eefbf1a44ae8","49166e1a69de","491703c8277d","7a470cd02e75","c300abe152e5"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["ce82188d0019","3522483fa146"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"5e5af391cd00"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":6,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"5d5b48b7aa50"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["c755838dfc79","a3a35785692b"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["f7fdc7059cf8","dd4ea38b4bfb","52d1cebf0394"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"896d70ab8ca8"}},{"type":1,"postListMetadata":{"source":2,"layout":3,"number":2,"postIds":[],"sectionHeader":"Trending on Hacker Noon"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["91e1a0052c53","785622043b7b","fcdfd9d68ad2","2d6bb6750bb9","c233a0971952","401eb4869012"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"f4db069cfe53"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["3c7ec5664c42","f3ce9500a028"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["984a72d48ebc","db3add166840"]}},{"type":3,"promoMetadata":{"sectionHeader":"Meet our weekly sponsor","promoId":"9e0f29f4dfc1"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["14df8cc1c68a","82fc8a0a1bfe"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["24d184e871a3","d8277a4ba86d","9147f805ef96","f5730fdf19c9","cf28ba9557d1","f322108695c","b6aa17eeac20"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"252741d1ff19"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["635e7ed00fa3","d0e5fa65698e","c84eb94d0a13","9a9a1c9c5c16","f94d0ee13eb9","76ff3b8e92d7","3ef503d93609"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"e42ae0703754"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["4ed049d2b0c0","1e7a97fc1bd"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["2a2d627b0202","6127269ff25f","7b80f8ab7279","3cc2857618d3","bb09192916a3","736feda86507"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"ca296d74fb59"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["ea0330cb69a5","494996b66932"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["3edf51ce448c","1eeeb14f20f8","3ff673a3955"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["8976b6886481","ae9a5752fe82","faf7bcd44c0e","97d0e18a2999"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"396ff1a74de6"}},{"type":1,"postListMetadata":{"source":2,"layout":3,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["27ae935bab1b","7b07c7b57cef","66c75ebf760","f13e89da1432","a7df366d800e"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"2e849410fe12"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["a78e60927042","e11b96e27199","abc0ba7028a4","83f196e6e560","dd9dfe25accb"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"b9fcbbb01e0c"}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f2d443eba35","7b213c1bb867","eace34fcae8a","b17131ec20f4","2bfbe48769cc"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["60f195cabd68","7e75481a798c"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"fbe56cc5bbf3"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["a8fe48feb023","a3ef6f35f0a8","50d3b27f838c","e95f3ce061f3","e8016fcef3b2","2f27a367baa9"]}},{"type":3,"promoMetadata":{"sectionHeader":"Meet our weekly sponsor ","promoId":"7d330af61dc1"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["b5aaf1444d44","97a23092473c"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["464a5797c799","39d6d038e5da"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["5855a7e4aa2c"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"40b8858f2e22"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["643d8ba42ace","fb1380f5cb6c"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["19720a7447d2","3bb9fc924712"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"a1161179b8f7"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["231c7b3d088d","5f7a9ef4cebc","6f67810983aa","34d28430a5a2","fa38e28f2531","e53594aabb47"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["eef7a088a6d9"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["437b852acc0d","a1ac874710a5","11ef078ef5fc","2661580d0b8d","12169dd44a92"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"702fc34c8599"}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["9bdcc60a39c1","3a7287d953a5","e948d3353aa7","fdf45a7b1fbc"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["169c8158ec16","12809d74b6b0"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["67ca0cb88358","6d9da452fa8d","895e006b1bb3"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"6ec02c38218e"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"63b0176ffa0d"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["332f0b76ab4"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["26d87774c011","eca67feb079c","7d5ec4b8c81b","3f816c90ce61","66281760037","77d628ac9518"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"90cbf1a830b6"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"5756aa691588"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["f15edd11505f","9913745d7d8","36af9aecfc47"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["2d06bd7bcf5d","3f3bc80d0c4b","b02c6d7828ab","8e28d94f5f04","d7dd592c39b2","32e783d87210"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"4e24a829bfa3"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":1,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":1,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["b435f98569ab","8e28d94f5f04","b9b6ec034afd","3b03970c8df7","bbeeaa7a5449"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["b441e5ab9e38","efc565f8e8d8"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["a6a5cea6a6c7","a291011a71c5","aaecf2d35312","da90f2a98102"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["485abe0ec522","175f845c2bcf","7c75a30ddd87","3cdd916407cf"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Latest on Hacker Noon"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"35565d881c23"}},{"type":1,"postListMetadata":{"source":3,"layout":5,"number":2,"postIds":["a9d7550c157e","cacd04f916b3"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["800c3b218c15","1fdb7f0c5263","2a2a0614bddf","ce21a989c61d","462fa4bb401e","d52302d270b4","f31332421f31"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"53de142e92fa"}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":2,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"download our weekly sponsor's awesome product benchmarks report ","promoId":"2b2e66625479"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["fcffd87c15a3","9b6fcb668111","ee8a77f7f4c7","20a647b8f39f","d29e3b92495b","93bcb2c7dbb7"]}},{"type":3,"promoMetadata":{"sectionHeader":"The human spirit must prevail over technology.  – Albert Einstein","promoId":"d4dad3e9000f"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["9fe8a468bebc","6640df17e263","2151784eb785","4f31d3063a28","3e69e5323f0","e3a1179883bd"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["1ad7e58a7127","1d707806d66c"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":1,"postIds":["44f260cdeda3"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["f6c904618190"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"a67a450d664a"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"144303e22689"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"1e999a4b2a3"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["2848971a34a0","12809d74b6b0"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"8a32897abd22"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["2980b2e32717","c1802315007f"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"de89d7fed5b8"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"19bc68559507"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"2dc11ae5af0d"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"c21a21cec864"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"fa0faaaf4f9f"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["e10aed48dfeb","17b985271ef9","2235b96d64cf","6f32ea8f5888"],"sectionHeader":"crypto columns"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"b149ae8c197a"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"4fcdd3b69683"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["57fa096c09ab"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["79b46a91ac63","62b66ddd0f89","3ede534ef1ed","fb95dfb7af31","347822f5419f","69f295e63759"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["a1df2eb9e8a9","36ce63b6b4d3"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"c7f4ceefd279"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["355f818161a6","f3178540f5e3"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Latest on Hacker Noon"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["2a2e846ae113","251d19b23597"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["1043c756a221","d794ab48fb82"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["dc9adb4c162b","4c772b7c2642","23049d7209af"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":3,"postIds":["9b0d78585d67","222c02b7b5e2","50fc18cfcebf"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"2e538b9b7158"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["2a2e846ae113","79377c3dca7e","934f1908194b","800cea71b06c"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["b1f30845b43e","5c335b2775b6","a2929b4d8eee"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["2a2e846ae113","eacda5cc41a6","6061d3c93e7","e3f0f882df0d","a65c7bfab490"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"b13aa799f39e"}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":4,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"ef8d38097b3d"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":5,"postIds":["3e432c5e8caa","1fe85ad40e35","2d17db675a1","cce0fe222a71"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"9c5e096897cf"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["e509dd0b6bd4","1ede32aa0711"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["8b03b18b0bd0","a901e1cea549","b3a3b6167566"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["55943d523b56","54e24395243f"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["196ccd9564ce","3d3cc24217f4"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":5,"postIds":["c8037bcacc23","fe70af065a7d","56b573ad010a","e61c7d89bf27"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["6d5c20825e56","e7b5c26b0624"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"meet our weekly sponsor:","promoId":"8e7362b57766"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"a4c96b609aa3"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["70ce98492aed"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["93d73306e0c5","9b5510ca25e3","ac36449ffa10","5169fbb570cc"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":1,"postIds":["ee59ded4602d"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["772d0e6ad322","8b8af8aaffe0"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["8201e7a9003","fb4b0e1752a5","6b76ae597ace"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["fcfa418bfce1","af1fa3dbf7d8","e505c798ce77","8b2e08ebd563"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["ed51207952a8","5169fbb570cc"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["dad83ec3fc23","23d484d8bef8"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["66b4e2043621","4dc566be372e","eed1ed01127f","b5cd7275dc84"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["4a72ce2bb1f3","707c532abbe2","b1d2e93a703"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["f3e0424cf2f0","8b7be39f30fc"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["cdc8aeb5db0b","4c33e9b6bfaa","dbb3f9e2349f"]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":4,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":9,"postIds":["6f0f099850f9","11ccc607c504","71998e2524e7","9070a9800c26","c69443606805","c87be8dc0e47","bdb983bc3e49","3ebc654e0ad6","f75f376f422"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"7ddbb40a1140"}},{"type":1,"postListMetadata":{"source":4,"layout":2,"number":2,"postIds":[],"tagSlug":"Amazon"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["ea94805cf05d","d499c198aec5","23d484d8bef8","ddcab1bb1f75"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":1,"postIds":["5bff38d9a93a"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":1,"postIds":["50246fc36e9e"]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["7aee9c1b566","516da34ce5d6","29a5a754eb1a"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"a18a7026fcbc"}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":1,"postIds":["e8f628d51700"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":1,"postIds":["f4269cb5cc40"],"sectionHeader":"Why does this happen? It’s complicated…"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["c2f0b835ab92","75b84458d86c"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["782efb19d900","d773118420d2","355ff87859f9","a7f5889f81b5","bc8ebe7a84e5"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Latest on Hacker Noon"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["486c31768b97","daff6042413a"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["2e2d261b73ed","38f8b25978c0","f28dc766ef32"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["94470b18156f","84fa910fcd42"]}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["7b39bc404404","c17512a0e2a4","4182f0b00ae7"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":6,"postIds":["7d3fb8667030","d6603a5fc64d","e542606eb67d","9b8865c8e46f","d936a71d0263"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["5cd013f37782","1e82a8bc27f4"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["5ac12ba91f34","b1c89554bcba"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["cdf37b7f6b33"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["aec1c470cf8f","dc2af3ceebad"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["19c0620e4a43","2e4c92b0b80b"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["a0e2011d36","7d571fb5b034","f4c1696e6ffd","b9e0222b5b5e"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["a66a9e01253d","1459d32f3395"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":3,"postIds":["23d484d8bef8","60b296c4c031","6a418db04a21"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["886db508cc31","28c251df4018","a8912a25dc88","19a852fea4ff"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["f0c66cf6fc22","437405a2cdae"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":1,"postIds":["6a007cfb9b97"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["9ebe117b5759"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["b6f8cf612743","c2c9ee8ad201","3b1994a33522"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["fd5124088875","ae9fdc38479f","2cb43946551a","fbe6098de696","b0567f3922cc"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["c6af86023022","faffb6da1371","b5dc6bb92d49","23d484d8bef8","1020969abfcd","bc8eeea54220","8fc6e9ff348b"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["f0f7614cab32","f06c008f8f84"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["bdf48340c1be","8e49b6badaa4"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["345d9f12f40b","cd1f681d4f42"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["b285b070d456","fb002f281102","b5f3d4dff66","42c39fa638f5"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["4fd640698e9b","30ae29add74b","66060f3799e5"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":3,"postIds":["99c07a93c8eb","ebbb98cfb05"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["4db8646cae30","a95f936e8b85"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["177cc115b749","244a412b9455","8f119bd4bc87","f5dbb4ba5fcc"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["3d18be586249"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["e699820c7e9b","d77774802bbd"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["e5080a2be6e4","9430a2dbb895","6c21de7a1f28","5b34614ae69a"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["23d484d8bef8","18f111fcc007"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["b03c707b8f90","91aeb58b4689","34766550f8d7","e97eea715f1c"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["a093b83ac99a","b8a59585a7e0"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":1,"postIds":["fd22d84ae61c"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":4,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["ca7dc80e9d8","49d35ac463b1"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["c774ae5f7d9a","8963863d4a03","bbf941c7f0dc","a9335697163b","7c727a71dda8"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["baf1d1fccb04","cdf37b7f6b33","c65e0d67ac09","c485dd5b8c6c"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["a3b4b39fe0ae","67799886b78f","341f57364481"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["416431539c6","a24ab4bc0d55"]}},{"type":1,"postListMetadata":{"source":4,"layout":2,"number":4,"postIds":[],"tagSlug":"Bitcoin","sectionHeader":"Bitcoin"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["e7253ac24306","83d5ae84fb8e","3909fff55ba3","85eda475f96d","6f25e1f2463c"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":4,"postIds":[]}},{"type":1,"postListMetadata":{"source":2,"layout":2,"number":4,"postIds":[],"sectionHeader":"Trending Stories"}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":10,"postIds":[],"sectionHeader":"Latest Stories"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["3cb7a7d49d95","20ebb37d8a79","6b0031eead87","cab1bfa1615","f32aee3fcbf7","ee1ecd5c9c87"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["98fef71aefcf","729abe42a02f"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["6c8727fefcd2","ac83d2ab567c","39c711d28eb4","72bab45608af","66f590abb7d0","638da7a3dce0"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":3,"postIds":["b34b2247520f","3a093c5ba1a0","9cdaf2ab3d48"],"sectionHeader":"From The Design Director of Unannounced @ Magic Leap."}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":3,"postIds":["9df799984034","d25045cbfa61","d538d1e8f831"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["2a5d78072128","521bae1411f","866c7cec88b0","860c3f25f1fb","afe675c64340"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":3,"postIds":["e75185793aa6","18f111fcc007","7e6321236b8e"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["46c17eb955e6","8bc79eac469d","35e4f9701504","d167302c17f5"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["b7e368cb16df","4269c0bf6c8b"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":4,"postIds":["7cfdaff04b12","491cf55d501b","7781fe0bf7d"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"8c1f297e1d"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["de62c859643","98faa4754fd5","107c9cabc4dc","2801aa031202"]}},{"type":1,"postListMetadata":{"source":4,"layout":2,"number":2,"postIds":[],"tagSlug":"Artificial Intelligence","sectionHeader":"Artificial Intelligence"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"11350928f495"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["93c4f1a30c82","a8cac81cd02f"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["8cbbd31568ec","f1baed075d1b","b8040b1e225f","672b3b81eac9"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["7e2e3723c877","a3ec1644cb0a","705a89fa8978","f15ef317cd6d","9a2b19114520","c2e788290f5f"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["ab424913a4b5","c9155c5f6bdf"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["2bebed57ed64"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["37921874349f","9e029b872304","5d8249407f3a","3ed4cccc669a"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["b3b4cdcfb4f4","501ae81d28aa","7d33811da15"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["43d0c57e3fe6","dc3e0c4410d4","c1025f001e68","10126d988655"]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":1,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["bc0b08312fa","256ac0c2a3ff"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["6b1439a30bd8","647d9314baaa"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":1,"postIds":["e192224c6c3b"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["b52f2265c596"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["55932ecffdd7","7d33811da15"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["badb6b01e53f","14a0575a8be7","d4449920d2","420ff367c5c1"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["cf3a210a36b1","424b6d697e35","fcb2f55088f9"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["96f13a66bb51","adeda8f7f39e","4c7eb541d193","cf953e4ec7e0"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["6dbb5d03ba2a","838024c7bfbf"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["a1efcf97a264","9d5bb83510a5"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":1,"postIds":["db34b9d034a2"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["b4b76e3ecd64","6928db640c42","96f13a66bb51","a84b0737f027","e02bafe9c9f6","dd97420f640e"]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["39e1cf69395f"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["54e84aa7a421"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["a64adc93525a","4703c3f02fbb"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["71449d49b170","385e25c65d33"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["57a46ecd8723","a2be67247969","1da89ba19348"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"More of the Latest on Hacker Noon"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["794e0a4c334f"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["baee5376a6a2","f79d7be702be"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["104f77277297","2f94d313c7e5","4a54857b82ba"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["68c98a8d003a","4ae300cdc220"]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":6,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":6,"postIds":["861990a7320a","ee9c394adf66","44043dc7b3f5","50e3de238376","3bb9d0f76766","582b47774ad9"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["52a8331030f1","7586ca5b7ef8","4a8866be3e14","8e1793ed32be"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["890b868cec06","4433eba0466d","ebd055c2482e","6df85598a444"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["8994061d2176","6aa750cde1a2"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["8d1d57ec6f0c","2db68487f4ba"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["b593e408b643","e2188cc34422"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["64104f59bf5e","f3b3540f8545"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["1da89ba19348"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["3ab23da15e0a","4755649d96ec","58526819f21e","ebd055c2482e"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["aac04ce5dc45","e8eb1e934dc5"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["5cdddc9f674d","ffaf78da36","21e01e1c6154"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"The Latest on Hacker Noon"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["487f8bae4e3"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["5b540cd42cc1","a71a730f1a5d"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["bbc9f66ad8de","cf972744a3e4","f4d7c6fcca26","6b736b01bd23"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["ffaf78da36","1ca17bd97a1a"]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["c90b0151c169","ed365b4af28a","d3be086effa0"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["9b97f3ed4fe5","da994c17d483"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["e28b95dd0a05","3c5b5829d19c","6a729de34a3a","5e9788c30958"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":3,"postIds":["9d2a8867b69b","43cfe5e3b066"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["fef16cdbc7fe","a3ef60225ee3","9b97f3ed4fe5","88333284f8fe"]}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":3,"postIds":[],"tagSlug":"Machine Learning","sectionHeader":"Machine Learning: man made machines make something new. "}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["61d3f64fd397","2df421fa941c"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"4600252e2591"}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"520dda10d047"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"900307ba912c"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["ed2ca00a953","54c569c17a49"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["928208b1978a"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["9c9397b30558","f455e9f6403b"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["70572c6d1c8d","c828187f9084"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["87b663662cea","bc063d0f9a80","9227bb3d46af","bd6c1bb3de2c"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":1,"postIds":[],"sectionHeader":"Learn from Pinterest's engineering team"}},{"type":1,"postListMetadata":{"source":4,"layout":2,"number":2,"postIds":[],"tagSlug":"Kotlin","sectionHeader":"Kotlin"}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":3,"postIds":[],"tagSlug":"React","sectionHeader":"React"}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":1,"postIds":["22673fb56ae8"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["38309f1daee8","269cece92274","41bc9ae947e6","aa411461a7e0","f455e9f6403b","39be653dde9a"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["b4942c6812ad","c16154013e12"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["622aa194787d","18363c040656","b47370c5ab17","1f71ec40de45","c0d2371151d6"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["b1824464dd5f","cd58b7ec2543"]}},{"type":1,"postListMetadata":{"source":3,"layout":5,"number":2,"postIds":["1baedbb71419","840f1c45d7ba"],"sectionHeader":"Learn from a16z's AI Playbook"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"237870dea01"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["4ed31a7304b8","f6fcdea4f521","89e30a6accf4","2f8d287f88c3"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":1,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":3,"postIds":["45f94bb5bfbf","49877739ba0d"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["1f71ec40de45"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":7,"postIds":["6be568a3b7d9","e6bc64754cd4","17a1161e7aa1"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["54c569c17a49","5f0c799c776b"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["3c1d03b90356","8975d5e68879"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["4f2309e6055d","a818dbc25cc6","e45dcddb1bdb"]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":3,"postIds":["414065bf5ec0","b4e4b011616a"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["7456d235abdf","ce57cdc3b206","2dc4a862b47e"]}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":4,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["8c605297aecd","bc914071a155","3b6c56ee938c","78ba605c2ed2"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["6db77ade3c18","446b006675c9","c0a4f614bd09","c2ac7d008591"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":3,"postIds":["209376f69731","d932556ffd8c","35dda19c8a3f"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["6134dce40e7f","62ddb47b9370"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["23049d7209af","6fec9de6765a","d6bf4991dd9","aab8969cef0b"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":1,"postIds":["6e02e7e6c8cb"]}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":5,"postIds":[],"tagSlug":"Artificial Intelligence"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"437cac726b4d"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["d7368c7fe2c2","72a96a43d5d9"]}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["ba7e4f772d78","c966f71a4abc"],"sectionHeader":"Lets Talk Business "}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["a0ff6f2bb6c8","22553abb038b"],"sectionHeader":"Tech's Big Picture"}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["d29cb2cbb637","6d91c6005d40","5bbb5f42914d"],"sectionHeader":"Develop, develop, develop... into what?"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["11f6a5196b00","cec82aea3b81","3ba513df303e","c5e75b2fc1c8"]}},{"type":1,"postListMetadata":{"source":1,"layout":3,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["689c45b57607","e2960d0516a","b9b080ca6ccf"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["cffbd21881bc","5b20f364b216","a146d851f14f"]}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":4,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":6,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["6b5eb6a48356","7190d8a01d09","39a035c33120"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["1844e1a8522d","dcf502bed28a","ca3cbbf4f62f"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["aa8028c99c83","c3707f065069","dc8ece0a8a1b"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["6f93c7e7d702","2a277b6c296c","9389631f05d8"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["8f364119d226","d2b5d665c1c0"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["ad699fffd651","a7c6dc616bff"]}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["bea305e26741","2398b5c3731c"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["3bd60fc1e5cb","1fc3b85ce964"],"sectionHeader":"read some startup $$$ experts: "}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"from our blog network:","promoId":"513b961185f0"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["91177148ec00","a4e273babaea","7190d8a01d09","378e09f469"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":6,"postIds":[],"sectionHeader":"The Latest from Hacker Noon! "}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["2398b5c3731c","a9cf29480a88"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["c2b431bf0ac2","d070ac86d996"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":4,"postIds":[]}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"86226b581199"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["a8d595882a7a","68f92f671378"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["2e2196049547","e9601ace9393"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["7681766b7d79","7ae7b47a8698","6839ba295e9e","c0951613808e","b8945ce095d2","2fcdcd856886"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["f3819a689386","6516bfde9c5c","a254c5b410bc","c226d7ed6d88"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Read the Latest on Hacker Noon"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["4ecc9becad85"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["64cacca3b908","5ad769c4d3c6"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["9fb800eca775","9f54420f683e"],"sectionHeader":"some more \"boring\" articles :-) "}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":6,"postIds":["86d7166911ea","33973645be01","928bc6e9a9a8","2bb0288f05e0","f3eaff55b626","2c1687173c7c"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Read the Latest on Hacker Noon! "}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["bcaa3fda9a31","2c3abb235915","b52c8cb33161"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["116fe6c9ae8b","10068195ea7c","9e3a88a8ec07"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["505a7272e4f0","3e354a2e41cf","a8760c014327"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"The Latest from Hacker Noon"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["aedf4bd4393c","6e02e7e6c8cb"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["2612349105c6","41831d92a446"]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":8,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["fa9eb7c86dbb","3e08b0723d8f","bfd87efa2e5b","9a43fd71457a","7a0f5d1c580a"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["6a0baf5bc31b"]}},{"type":1,"postListMetadata":{"source":2,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["536375023b29","928984c2e36a"]}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["2e1d796704d5","cdbf95288333"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":4,"postIds":["40579cc8ea00","28af584adc0a","68c5167ecfe0","abd73a1aa736"]}},{"type":1,"postListMetadata":{"source":2,"layout":2,"number":6,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":8,"postIds":["73db53b2dea1","1cabea2b8e06","c52d911b62bf","ba9cf8724e57","5ed5265c6547","6543e6b10040","832986551df8"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["1806424e7d40","71ba0c73e34d","82dab4e3e80c","ffde04fbdc08"]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":6,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["4381241a6453","663e5db40707","48cfbbc390b5","cce0fe222a71"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["360fe56b658","b2c5ffaee997","1b7bbbc13b13","d31efbb641b4"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":4,"layout":1,"number":4,"postIds":[],"tagSlug":"cia"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"New Category:","promoId":"168c69de50b9"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["5ff4c1b1a790","f1ec1738cf45"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":6,"postIds":["bf0b2ef0e22e","355cb5944f9c","751387bd0caa","720d4e7c8a14","1c47033900e9","f8a121c3b019"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"How's a Hacker to learn from the news?"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["6fdab1f771ea"],"sectionHeader":"From the Vault! Visit the Archive for more tech history."}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["e0b20cbd7118","f537a2cc7962","233d5d16ab02","f145469a9f1d"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"how's a hacker to better the system?"}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":4,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["39ecf99e4e8c","bad56f28c278","dac99da790ed","7929a0d9010f"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":4,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["ff3548406eb1","1c47033900e9","5fb296b35c0b"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["a253df32a7d1","5dd5f238bc5"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":4,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["1c47033900e9","604e8ced841e","418271194682","285f1988957a"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":4,"postIds":[],"sectionHeader":"Latest !!"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["624d50c76e8e"],"sectionHeader":"Blast from the Past! "}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["82cec422d67d","e06ec40c3f16"],"sectionHeader":"Making Moves! "}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":4,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":2,"postIds":[],"sectionHeader":"Trending"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["99a31cb84065","c0985e261b4f"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":8,"postIds":["720d4e7c8a14","9f831b6d430d","ea221363235d","e4bac1d5c124","e51e5ec3af6"]}},{"type":1,"postListMetadata":{"source":4,"layout":1,"number":2,"postIds":[],"tagSlug":"Startup Scene","sectionHeader":"Startup Scene"}},{"type":1,"postListMetadata":{"source":4,"layout":1,"number":2,"postIds":[],"tagSlug":"Machine Learning","sectionHeader":"Machine Learning"}},{"type":1,"postListMetadata":{"source":4,"layout":1,"number":2,"postIds":[],"tagSlug":"Autonomous Cars","sectionHeader":"Autonomous Cars"}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"More of the Latest From Hacker Noon"}},{"type":1,"postListMetadata":{"source":4,"layout":1,"number":2,"postIds":[],"tagSlug":"Artificial Intelligence","sectionHeader":"can you build a brain better than your brain? "}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"The best sh*t for Hackers at noon."}},{"type":1,"postListMetadata":{"source":4,"layout":1,"number":2,"postIds":[],"tagSlug":"Letters","sectionHeader":"A roundup of the month's top posts."}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":6,"postIds":[],"sectionHeader":"\"I would love to change the world, but they won't give me the source code.\""}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"how's a hacker to change the system ?? "}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"how's a hacker to change the system ?? "}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["b5c64c964faf"]}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":6,"postIds":[],"sectionHeader":"\"don't take the realities of the world for granted.\""}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"The Latest From Hacker Noon"}},{"type":1,"postListMetadata":{"source":2,"layout":7,"number":7,"postIds":[],"sectionHeader":"What's Trending on Hacker Noon"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["8bdfb4b79037"]}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":4,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["4e992a26b711","300cc67ca6ee","4b14b1b2faff","529219a03409"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":2,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":2,"postIds":[],"sectionHeader":"\"Intention is at the heart of this discussion.\" - Kevin Mitnick "}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":4,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":2,"postIds":[],"sectionHeader":"how did you start your afternoon ??"}},{"type":1,"postListMetadata":{"source":4,"layout":1,"number":4,"postIds":[],"tagSlug":"Docker"}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":4,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":2,"layout":7,"number":7,"postIds":[],"sectionHeader":"Trending"}},{"type":1,"postListMetadata":{"source":4,"layout":2,"number":2,"postIds":[],"tagSlug":"Silicon Valley","sectionHeader":"Silicon Valley"}},{"type":1,"postListMetadata":{"source":4,"layout":2,"number":2,"postIds":[],"tagSlug":"JavaScript","sectionHeader":"Javascript"}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":1,"postIds":[],"tagSlug":"Letters","sectionHeader":"Letters"}},{"type":1,"postListMetadata":{"source":2,"layout":2,"number":4,"postIds":[],"sectionHeader":"Trending"}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":2,"layout":2,"number":6,"postIds":[],"sectionHeader":"Trending"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["85fc643ccc2f"]}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":6,"postIds":[],"sectionHeader":"Trending"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["95f87f51d79","8694020b96e8"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["88aabb0d2a7","31529b30d367","a293a4d7d4e7","d49e6bc22936","b3901584d61d"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["7cd00926828","5bd563fbb26e","f44e381951b6","7d20a0e38997","521cb2925155","8e70452f3eed"]}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":5,"postIds":[],"sectionHeader":"whats trending"}}],"tintColor":"#FF00FF00","lightText":false,"favicon":{"imageId":"1*76XiKOa05Yya6_CdYX8pVg.jpeg","filter":"","backgroundSize":"","originalWidth":8346,"originalHeight":8346,"strategy":"resample","height":0,"width":0},"colorPalette":{"defaultBackgroundSpectrum":{"colorPoints":[{"color":"#FF00A600","point":0},{"color":"#FF009A00","point":0.1},{"color":"#FF008E00","point":0.2},{"color":"#FF008100","point":0.3},{"color":"#FF007500","point":0.4},{"color":"#FF006800","point":0.5},{"color":"#FF005A00","point":0.6},{"color":"#FF044D01","point":0.7},{"color":"#FF083F04","point":0.8},{"color":"#FF093005","point":0.9},{"color":"#FF062004","point":1}],"backgroundColor":"#FFFFFFFF"},"tintBackgroundSpectrum":{"colorPoints":[{"color":"#FF00FF00","point":0},{"color":"#FF00F100","point":0.1},{"color":"#FF00E200","point":0.2},{"color":"#FF00D300","point":0.3},{"color":"#FF00C300","point":0.4},{"color":"#FF00B400","point":0.5},{"color":"#FF00A300","point":0.6},{"color":"#FF009200","point":0.7},{"color":"#FF008000","point":0.8},{"color":"#FF006D00","point":0.9},{"color":"#FF005900","point":1}],"backgroundColor":"#FF00FF00"},"highlightSpectrum":{"colorPoints":[{"color":"#FFD3FFC4","point":0},{"color":"#FFCBFFBA","point":0.1},{"color":"#FFC2FFB0","point":0.2},{"color":"#FFB9FFA6","point":0.3},{"color":"#FFB0FF9B","point":0.4},{"color":"#FFA7FF91","point":0.5},{"color":"#FF9DFF86","point":0.6},{"color":"#FF92FF7B","point":0.7},{"color":"#FF87FF70","point":0.8},{"color":"#FF7BFF65","point":0.9},{"color":"#FF6EFF59","point":1}],"backgroundColor":"#FFFFFFFF"}},"navItems":[{"type":4,"title":"Latest","url":"https://hackernoon.com/latest-tech-stories/home","topicId":"ee08869d885a","source":"topicId"},{"type":1,"title":"Dev","tagSlug":"software-development","url":"https://hackernoon.com/tagged/software-development","source":"tagSlug"},{"type":4,"title":"Blockchain","url":"https://hackernoon.com/blockchain/home","topicId":"ee063c681e1e","source":"topicId"},{"type":4,"title":"PM","url":"https://hackernoon.com/product-management-life/home","topicId":"25e9a79e14fe","source":"topicId"},{"type":4,"title":"Crypto Trading","url":"https://hackernoon.com/cryptocurrency-trading-bible/home","topicId":"3cfb1656fc30","source":"topicId"},{"type":4,"title":"AI ","url":"https://hackernoon.com/artificial-intelligence/home","topicId":"cd291aa79e72","source":"topicId"},{"type":3,"title":"Tech Jobs","url":"http://bit.ly/2LLdEDb"}],"colorBehavior":2,"instantArticlesState":0,"acceleratedMobilePagesState":0,"googleAnalyticsId":"UA-65623566-4","collectionFeatures":[13],"ampLogo":{"imageId":"","filter":"","backgroundSize":"","originalWidth":0,"originalHeight":0,"strategy":"resample","height":0,"width":0},"header":{"backgroundImage":{},"logoImage":{"id":"1*1HcGNZYjo78mH0faO3BnaQ@2x.png","originalWidth":3600,"originalHeight":432,"alt":"Hacker Noon"},"alignment":2,"layout":5},"type":"Collection"},"newsletterId":"","webCanonicalUrl":"https://hackernoon.com/the-definitive-guide-to-express-the-node-js-web-application-framework-649352e2ae87","mediumUrl":"https://hackernoon.com/the-definitive-guide-to-express-the-node-js-web-application-framework-649352e2ae87","migrationId":"","notifyFollowers":true,"notifyTwitter":false,"isSponsored":false,"isRequestToPubDisabled":false,"notifyFacebook":false,"responseHiddenOnParentPostAt":0,"isSeries":false,"isSubscriptionLocked":false,"seriesLastAppendedAt":0,"audioVersionDurationSec":0,"sequenceId":"","isNsfw":false,"isEligibleForRevenue":false,"isBlockedFromHightower":false,"deletedAt":0,"lockedPostSource":0,"hightowerMinimumGuaranteeStartsAt":0,"hightowerMinimumGuaranteeEndsAt":0,"featureLockRequestAcceptedAt":0,"featureLockRequestMinimumGuaranteeAmount":0,"isElevate":false,"mongerRequestType":1,"layerCake":0,"socialTitle":"","socialDek":"","editorialPreviewTitle":"","editorialPreviewDek":"","type":"Post"},"mentionedUsers":[],"collaborators":[],"collectionUserRelations":[],"mode":null,"references":{"User":{"fe1c14f6cde":{"userId":"fe1c14f6cde","name":"Flavio Copes","username":"flaviocopes","createdAt":1402434519132,"lastPostCreatedAt":1536402505397,"imageId":"1*EhDax362AQ39b-_vSUMO2Q.jpeg","backgroundImageId":"","bio":"I write tutorials for developers at https://flaviocopes.com","twitterScreenName":"flaviocopes","socialStats":{"userId":"fe1c14f6cde","usersFollowedCount":7,"usersFollowedByCount":4264,"type":"SocialStats"},"social":{"userId":"f829b8959ad2","targetUserId":"fe1c14f6cde","type":"Social"},"facebookAccountId":"","allowNotes":1,"isNsfw":false,"isWriterProgramInvited":false,"isPartnerProgramEnrolled":false,"isWriterProgramEnrolled":false,"isWriterProgramOptedOut":false,"type":"User"}},"Collection":{"3a8144eabfe3":{"id":"3a8144eabfe3","name":"Hacker Noon","slug":"hacker-daily","tags":["HACKATHONS","HACKING","PROGRAMMING","TECH","HACKER"],"creatorId":"3ba40c3346c4","description":"how hackers start their afternoons.","shortDescription":"how hackers start their afternoons.","image":{"imageId":"1*76XiKOa05Yya6_CdYX8pVg.jpeg","filter":"","backgroundSize":"","originalWidth":8346,"originalHeight":8346,"strategy":"resample","height":0,"width":0},"metadata":{"followerCount":370901,"activeAt":1536830161548},"virtuals":{"permissions":{"canPublish":false,"canPublishAll":false,"canRepublish":false,"canRemove":false,"canManageAll":false,"canSubmit":false,"canEditPosts":false,"canAddWriters":false,"canViewStats":false,"canSendNewsletter":false,"canViewLockedPosts":false,"canViewCloaked":false,"canEditOwnPosts":false,"canBeAssignedAuthor":false,"canEnrollInHightower":false,"canLockPostsForMediumMembers":false,"canLockOwnPostsForMediumMembers":false},"isSubscribed":false,"isNewsletterSubscribed":false,"memberOfMembershipPlanId":"","isEnrolledInHightower":false,"isEligibleForHightower":false},"logo":{"imageId":"1*1HcGNZYjo78mH0faO3BnaQ.png","filter":"","backgroundSize":"","originalWidth":3600,"originalHeight":432,"strategy":"resample","height":0,"width":0},"twitterUsername":"hackernoon","facebookPageName":"hackernoon","publicEmail":"stories@amipublications.com","collectionMastheadId":"628349c2609a","domain":"hackernoon.com","sections":[{"type":2,"collectionHeaderMetadata":{"backgroundImage":{},"logoImage":{"id":"1*1HcGNZYjo78mH0faO3BnaQ@2x.png","originalWidth":3600,"originalHeight":432,"alt":"Hacker Noon"},"alignment":2,"layout":5}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["8a990ecb82a9","18a1a624e3b0"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["649352e2ae87","e4676986c89c"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["d8232bd0f39b","a4c8a2db26ad","be70a760a5f"]}},{"type":1,"postListMetadata":{"source":3,"layout":5,"number":2,"postIds":["469ba77d6c42","76045c58ca55"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["8df8c5a5dcd8","55f1a7cfd596","db8b79cbc4eb","3e783b409e52","3b5c6dc78708"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["5e2d252dbd08","1c4ce5c33d9e","4e2f8fbe87b0"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["636ef725cb1c","352409ad2c0b","e738b9668e94","e2636d9c2fd9","c984b020d186","9467aac7e05","6da90ca32189"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["f8a9df5b7758","ce91d7ab738f"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f2ecad74a597","26e6a27b3a0b","e44aa5373479","892108fd0d","2229a2b3732","7d8d5579a2c3","f012a989113"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["d63286fdbbac","820ae76beb95","f188169e5d3b"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["aae095126cfe","9ccddba55e54","ced61f4ac6"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["930b1b7e960b","f6eb7626ff96","a5b19901056e","ae537fc1a6d","a7112b43f016","f012a989113"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":4,"postIds":["3065028897a3","4440235f2bca","c750f9bf56a0"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["56d301675117","830dd607dad7","3b5c6dc78708","1ec601356af3","e44aa5373479"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"e1bbaf203d83"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"3f7e6af7c199"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["14c1c912e85b","f9bac8e5a1c9","82f98ef4f381","2d19046e90ee","db26cd444f9b","9f926798da29","b885b3a43fb4"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":5,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["4e3efed8649b","406c97cb311","a1ac874710a5","3c3e37f358dc"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["24ffd53c052b","88e77d2b39af","f778555d5a1f"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"7e1ab4bb4c4d"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["b0cd22a4c159","7238d13ebfea","a5792e90c836"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["e1d8cbda8543","2ddaf52ad862","e62ee790238e","399fcd21507e","ac9bfbf2f6b3","469c11b48b8d","4d2ffcaa9d0b"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":2,"layout":3,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["911ac23ab4f5","88113e885f56","3beaf62a01bb","88570ddce7d7","4e5407d0c68"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"e2e8c20bd949"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":9,"postIds":["8d44b54be055","c13cc138378a","b0bdfe028dd2","f52088213026","f778555d5a1f","f93764d64a8c","45004a23e8a7","1332a0877a6a","a1a0c8ea0695"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["a803d05e5ce3","14379e0e23ad"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"206d59e13d50"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["3d38422333b","1b4d29a0d7b4","640a254ee38c"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["fbfaad80aa25","a947404ff36e","86e53392d9bc","68b9b46fd1ab","676de6fb555f","61dfecbe2090","731973698385"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["44f4af1249b1","30cd4b9c6230","604ae27693e8","1021dbe7ecb1","713149eb9a21","7c8de164e423","f1baed075d1b"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["22dab6d98d0e","edea6ff5c5ea","e5ad483f85f2","bb3bcc4b347f","cc7816ff9cd3","f49ca6095054","6329696702a6"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["5a7042ca5fc","9ab9d749eeb1"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["afc5e9248c4c","19a3aa295642"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["f2d443eba35","c70ceac0f264","9df549af73e9","81df3330b938","235b60005d04","ea94805cf05d"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"f25bb1325a64"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"912ab169c2e1"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"3a46abfda389"}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["8efcf6d28322","b1a0733ccc93","2d5eec68f52b"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["81ddaa31de06","a6cd177dacf4"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["3351907ca6cd","dd5feb558e45"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["c38970a181bc","dea6542cdb64","a6824b6dcbd4","d412827a66c9","8a86b749545f"]}},{"type":3,"promoMetadata":{"sectionHeader":"Meet Our Weekly Sponsor!  ","promoId":"7e1e27aac372"}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["89aeed8322dc","fd8548f04777","5d019f4e014a"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f815eb19cd97","24e916ebb4c4","7a9374cbe12e","36a13723a454","fab973708146","a0dca457faef","1eeb6561549d"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"ca7621b9b007"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"dd039baaa823"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"80a850e5020b"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["ac6e9b04fcb6","2836251922e0","1627fa3f6936"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["73fb1b818f35","f3a1c599daef","b976da1ebd35"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["20c134d5050e"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["bdefac3656b7","f561fc21784","3ad489d6ff3f","abf74266c442","65343f18e5e4"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":3,"postIds":["ddb91ecec2e0","448675592803","4ed162db5777"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":1,"postIds":["afc5e9248c4c"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["b93a2b63c1a6","43e7708515ab","9cf0a05e4995","8d7b28133809","b91d3d770366","4a398889fe68"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["b91d3d770366","416b9e0284f3","e3f669d96033"]}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["aeb3e6f02077","e3f669d96033","56ba6335778b","7484fbdbcb31","2f871f298cbb"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["b2ce18d5b054","ee39c9b12ac0","9cc362a1343","cb8c9b016f9d"]}},{"type":3,"promoMetadata":{"sectionHeader":"Meet Our Weekly Sponsor!  ","promoId":"bff30d2f35b4"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["70b4f581ee4e","433171581d01","9241df07c18b","f5205ff483cf","25675234273d","bf398bc0e99b","b0f0ee83c982"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"Meet Our Weekly Sponsor!  ","promoId":"a5b9e0de6107"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["cc749ae14905","798c0ff3d26c"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":6,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["4af75b292135","c4d81adb146d","a756faf1bb03","6d01945ac262","65eb061b907b"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["b4122f657e44","8c305120e06a","9df493a8ce16","58e9ef855d3e","d9bb33bb62ed","c2828693f68f","390680e0e04e"]}},{"type":3,"promoMetadata":{"sectionHeader":"Meet Our Weekly Sponsor!  ","promoId":"65be46fc82ae"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["eea7ccd0eed2","223907ec298b","9a9d8e993be0"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":7,"postIds":["bbf9496b35bb","2d1651dece6f","a4e772c60f5f","44d71313364e","a1f71cc260ce","e127bc7a6fb5","480a90c5e7f9"]}},{"type":3,"promoMetadata":{"sectionHeader":"Meet Our Weekly Sponsor!  ","promoId":"d47cc296aef5"}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["c87cc77d723f","ed253e5b3594"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":8,"postIds":["cd6619cd4d59","52935c848f9c","81938689c79d","be9014a7ba","1136ed550bb2","6967985cc1db","3af569c7ac52","e56863694e1c"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["e7f05d90d961","8429229301ce","aa70fedfb1aa","19370ba1a356","d0b952baccdd","e1d8cbda8543","9832c11cf9b3"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"84c29054e7dd"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"8f2ae56c251c"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"bfd9d5ea6ede"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["1e8b50df3655","76425bef8d6b","ae7e7ebe0996","875cac6c172d","bb5f75d7ef79"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":1,"postIds":["ed253e5b3594"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["6144df75fe03","120132be508","bfdfff86fc5b","9f60e4130b78","6140e1c2a46b","11938fed397b","c6e412d0b9ab"]}},{"type":3,"promoMetadata":{"sectionHeader":"Meet Our Weekly Sponsor!  ","promoId":"711ef50ccbdb"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["2f2c9f9fcdbf","3769c6bde9cb","a4c46a608df8","1cdfaecb4851","c3ed049e8d91","cb9bdcbb5a67","5bbf3874496"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":8,"postIds":["4d0d916b9f78","d5a8b1a98dd8","292fa64bdaef","77de2155ce45","cf41f83de5ec","55d5f5283386","cf3a39aa95de","65cf7cb4c75a"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"3cd9168184aa"}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["8beaa863653b","5c78db3999b2","2cd7248ee623","cdae29f91ba0","4867f66da1e5","e5074b6fe55b"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["684817c8bff2","1f30545af17a","6639f46ba416","c90964a885fc","5c1f2ef18695","1f4c9cc0eca1","316bad449279"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["8067ec4cf7e5","f79f872224ad","e0c457884d2e"],"sectionHeader":"cheers! to independent tech media!!"}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["14060d66027b","582d0b35e2ac","b032e09140f4"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["54e65781acf1","a8b5a3415227","56c2d6689677","95c336f6b747","7915f23339a0","39fa9955e8cf","2a4dd2a62398"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["59164b1d25c9","a4f29c718b57","e011c3cda55e","f873664fce5b","651891ebe1e4","2a9253ccdd6","46e50438ed5b"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["af7a696e02cd","3d2dc4c2e029","a9f343b2239"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["6aae4cb26bbf","890b91e0822","fb35e9fc9b8f"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["77774f7730fe","b644dbeb6a21","f985f1472b9","43fa156719b4","14f7608e743a","856bbcbd8f49","16dbbbcfee9"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"e9e2cb0c807d"}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["540e8f46fbfb","7ac3357dfcab","3b0c9475412d","49c4bdabc0df","82f9c6b4cd6c","cddb29953aee"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["acb0d97c83c8","de5014f2bdf3","79387767830b"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["e9f9b2d4248b","f73ec1d2c70d","b644dbeb6a21","ce56d591af","44abfe48240d","323751799664","b6088f650605"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"cfc4622cb9ef"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"357550d9c823"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["fc6863e41b2a","ce24b611f0f5"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":5,"number":8,"postIds":["6d5034ff1eec","e0c457884d2e","3b5f03cf180f","514d8399b97c","dcb687766b23","40aeb2e4f7fa","fbf14610305","a69091083f91"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["50c161fbdcf6","e9c4b4b7d08f","1efd3a963111","adf61869cd79","9f306e57db8f","7364370b7b95","c7be9b17ae54"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":5,"number":2,"postIds":["36b28417f399","ccc259f2f1a5"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["b497c92d0b49","fbff41c4d5db","f28ff0f1bd8e","a0de334b5e8d","10188479699d","d39cb6f6feaa","b497c92d0b49"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"31a43072dc37"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"49a7eeaf669f"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"a548490580d2"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"e19ad0b082c5"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["128dff535a08","14060d66027b","161f03b04149"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"45b34a100b3e"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":8,"postIds":["6a35bcf34f7f","e8123d6a4199","6a6ca5d3637b","e9526066ddb8","68ff19441599","6213e105b00b","1002449ad474","86d6e55a5b34"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"fd1bd1a10478"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"8663d9e83c0e"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["c545353b7e4c","b520588eb345"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["e9049858f43e","4200c86ba513","8d8a9e7d3bac","57b186769d8f","36209dd6f6a8","d94c88cd4475"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["fd62a9809d94","5471f1935ff3","8b48b2cefc63","4a87ff2509c9","77b78d0a3c34","c20d18ed5b43","293514a516fd"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["330d8202825b","80d71f19dc11","f1efb0b361b"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"fa90a1708db"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"3e591077534d"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"6d9affab575d"}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":4,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["28acd1da0371","7c9ab96a7779","54ec79a47215","e42e49b524c5","e80ae1dc5e82","7c7f39916e","f0c2c5ab9e95"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["bf8ad832e0c8","6c22f14208ba","d3429200a1da","92543078551b","8178f4e058e1","59e593ff9f07","4556e5a9060e"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"e4c58baa5135"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["e2b4bfcd4d7e","30d8b9fd7f6a","ea22b7b7fcaa"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["5bb9a7b7ae11","31882fb6ab9c"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":8,"postIds":["ed99312f3d24","a55e3685f7a2","330d8202825b","574da50e6d88","e19fbe265e03","912301a287e9","d2fae1c68a88","b1d81c02d6cf"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"de8ac0687ae8"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"834a8f38c283"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["5bb9a7b7ae11","f135e2de9a1b","f13025af3ebc"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["a33da2d1f5d1","19af3ffef9e0","5f2c0a0850df","91484ceaf5d5","6b5f836c2b","c06a6b052838","8e532e436402"]}},{"type":1,"postListMetadata":{"source":1,"layout":3,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":1,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["4c5c326ee1a6","2384451f2f5b","3d63213c8370","960f7c987176"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["a08ab06b6ebf","68126944ce1f"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["5af99ff115c9","86ed41383d36","40c5448c066","133320bcb52f","b4010e9b962f","8140d3f7d3a3","2e469b762ba9"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["b0b8a6fda52a","4cae22e22fb","feb51b4bd99c"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["7851d0d77ebc","db3f76d9e9e7","d1aba226da43"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"230369e3cb80"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["35697427960"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["8398548f27be","582d0b35e2ac","8a7afd388bbe","d598e266762d","f27bb956eb8c","7251face1ad2","8ec69749b61b"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["73db0440ad26","4c5c326ee1a6"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"1e01bd79dd04"}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":3,"postIds":[],"tagSlug":"Story Licensing","sectionHeader":"Learn more about our newest digital publishing product: StoryLicensing.com"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["aa35b6e0f405","23d2428afda3","17ad575230a8","51da93530623","bb8512c70857","c0b883a7f460","fe7a98c0759"]}},{"type":1,"postListMetadata":{"source":1,"layout":3,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["a6f8ce6ac0b4","b0ffb26d33ea","66a34985249e"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["b8a451784dab","480072581f1b"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["266c136fc55d","9b759ca21cda","ef937e919ec2","e23df3d2e4be","480072581f1b","f1f203e9a4ef","72c22c75193f"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":5,"postIds":[],"tagSlug":"Github"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["cc8ff4f5199b","8250d69fd079"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["c429327cf577","f8f480448057","1882afc527bf","e5a58ab051e4","39ce7b036da2","fc552254ebf4"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["e3a615747dd5","56171e6e26c3","dc4824795d9"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["b3563722e856","a5c6d9549be2","50813d12aa46","909b48eb318b","706072f301b","a85edaa5e37a"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["6613d33229af","81616ac3e89e","1c93afec3066","2d3146a82c2e","f7e64a650b67","e972134c1cba"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["406445177a80","7cd1123cbdad","7199b686b6c1","3f9ece85983d","9901caca4fd5","bebc0700047c"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"f2d9903b5b4a"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":6,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["4dae4827841b","b42873eba509","f3f365ffca76"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[],"sectionHeader":" The Latest Stories on Hacker Noon:"}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"More of the Latest Hacker Noon stories:"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["2b650b5f4f62","6cbb1f0b6726"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f4d0ce28574f","c1fa8f4260d","c7eaab3511fa","32d018c46b06","23f944203598","3288b789b85d","5b4c28bc8824"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["11dc203890b","11b545c0a3f0","da7fcaad05c9","3fe23be5c19e","6d45fdd26721","79ebf0461b9c","4f82bd3eb62d"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":5,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["d641f1714903","973d904bf28b"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["79ebf0461b9c","59fee84a9ed9","ef3add0fa202","f0702143be08","b69a91598f5a"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"e2b2b6e2e85d"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":1,"postIds":["8142f8277c50"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["216dcba55d35","5ca310455019","6864bed9349f"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["d1bfebcb3a21","f102d0c50a7d","f4f719532b64"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["3fa6ec61fab2","9d440dcec825"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"6d460003f6fb"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["83ef7260cbf1","c42a95a8f884","7cd116cc5347","bc0b08312fa","861990a7320a","be5c30184e13","6fcd1b49cffa"],"sectionHeader":"Tech 101 Stories "}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"d41c74ae0d0a"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["5fef0df0f00d","e95100f7c7b1","2fc7becd6852"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["4f4f2ac214c","de999a41e047","b87cc694ca7d","6394a645478d","df77da680219","d46783a33881","8d33351e59c0"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["6af7ceb0d8a3","16f87f17cb4d"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"82f867b3a9f0"}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["58c0c2da8a7b","4286f6c98cdc","3a0ce661642a"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["6b2677044214","8b9a83f2aa23","e9f0e3ed36a6"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["899949ec555b","1476db95eaab","31afba7fc044","3f174d50708e","117428612f46"]}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":3,"postIds":[],"tagSlug":"Hackernoon Letter"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["9935e1c72019","a278c726315","824ff4b3ea19","5e5023dc1c75","a2cc855ce9ae","d0225be35b53","cd840fe3c79b"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["41562cfe910b","7886aef60b4a","98a93c5cf335"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"793f2cc02d19"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["b5b88baab63b","9abb40005d15","695333d8f92b","84947b6e1854","c320c860019a","6cd6501d261e"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["44f237982d95","9935e1c72019","48eb1b90a834"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"e9784f75d4eb"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["6d36690f511f","243bdfa2c3fc","a278c726315","8918084095a6","6eb87a79b39","cc7ecb8b3e70","bca86435c878"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":6,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"5c287d7d6e2d"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["26588a660afe","680dfa213aa6"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"942c8f6c414"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["6090a9abe813","aeaa1f5eee80","5a329ea6813e","c2b22d7cf95a","188ea18527a2"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["73d60e08b85a","7dd8a85f299b","9e13678041fe","565637747557","d33aee2f699c"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["2a1779c4db7b","8f9e22d49353","6104453bbfdb","907a08a3630","16a96b04125f"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"fe33e0367f6b"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["4b2959c03a35","3b91562c9b3c"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["11abea97a88c","a35ced0d1871","914dd392b33e","72355c1ffc33"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["cdffbb6bd6b9","598988b15748"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":8,"postIds":["fa9f4ce822ed","9c996d352af3","1c298570d191","14379e0e23ad","230fd9bb61f4","806ec0ecd60","21c239c1d5a7","9149e0267e6d"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"2e556522b3e2"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"54b9084a116f"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["5d12f84f9824","d3be086effa0","dad55578062c","e9f2f7b31b0e"],"sectionHeader":"\"Are you raising $$$? We raise $$$ everyday from our customers\" -Sahil Lavingia"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f3073c725232","71c8be58948e","9b9b66a50aac","4c65613c2db9","7addac683285","ccab7b5552de","6a4c5cf3cc89"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"c28219e53f1b"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["4e3efed8649b","de1a3cef2341"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["1f0b2c7370d9","692bf676b05","47b5575d4e20","5c4fa340f2c2","13d92a6df5f3","a56be62b1f95","6e92f79fa66b"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"9a707f3516a4"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["94be921e6354","2d69aebe715b"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["7302bcc3901e","668f97c138b1","1781df7ebdd1"],"sectionHeader":"Recommended Tech Books"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["fb19314afdaa","60edfbe60786","1478c2eafb20","f776080ac8d9","5b485ebbe99c","bb15c6c1e163","c9bb2b6d1acb"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"fad5e7f4d8fa"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["5b13b1ebcd4e","8372628154c3"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["3d7e0d72213f","34c2d8ced7f1","aefb24529c4f","53d4e7ab19cc","6e1379f0caf7","ef54815873f9","7e75481a798c"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["b12e85aa7d17","513d78add55","364bfc96560","15ba02ddf4a3"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["97867fc06f2b","8933fe2ae51c","139c0dcd3245","b85b079ac45f","b80d0f8ae906","f0d27634ef91","8be7577d925"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["d25024db07d5","1b5f53ab69e0"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["9dbc05f2e41f","5b13b1ebcd4e","ab45446edb11"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["502dbcaeabaf","a6640ac69325","109670038859","d8f2d8cc2c15","d20b2dbecc07","9e4c258ec9fb","32aadc8e773a"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["3febe4574467","d61d064f2fc6","3680c4524fbd","865dc2c06528","4b8dcb756937","6dc138061235","67754743d494"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"94fa23e3f13e"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["c1c4ffb4ebf4","c2385e0d2f89","b85b079ac45f"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["bf27e4837151","89170c501e4c","737d2206545a","13b08b512bcd","a6640ac69325"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"684c6c2c49cb"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["f1115739e76b","9a8cb347c5b5","b9224e44d3ad"],"sectionHeader":"Tech can be scary..."}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["117428612f46","837276200b9f","21f9a470160f","af5b9ef41aa","ee81374c01aa","396f6953f844","596ad4d4c085"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":1,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":8,"postIds":["a9664c76336f","3103e26fddd8","e1ef8c98b605","a7b19508d9f4","5a7b2562f3c9","dc8690bf41f7","117428612f46","54d14e279552"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["34bdd3cbec4b","c9146716e0cb","21362adba27a","1227aa782d","a004746d2ff5","f928dbb145eb","95e7256b6854"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["b7c3bbe0b0d7","618282a1a9ec"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["319ae47117e6","60c5b399100e","4e94c8e7e5c1","afc7edfe3913","3e9a7643152b","62ebeb5f39c5"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["692c51030342","eeb07486230b"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"7c637d313bd8"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["6f71868902b7","1851667c726","c8070c5b901f"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"b22fb67c4117"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["c465669cff48","7b42b1033c4e","8804905db43e","5d10d72f14d1","e9d5266d13f7","bd361d0086e","55cf2b8e6fa2"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"1631885336c"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["94be921e6354","2d69aebe715b"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["b8566cc3fe8f","e824e9c2a4ef","1584f19a7eec","74dc65d5d058","8ef06e2b43f7","7dddf8d635e4","5e6de1b61a6b"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"e8740b08c8b1"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["6bd7607d537e"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":8,"postIds":["a1cf2ca834eb","a868606a6f0c","959dc53238b7","aa868bc549e4","4567d67ea773","d2655df479bc"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"937f8dffb138"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["9a8cb347c5b5","844f739659b9"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["47e0aaefd624","b9df618d53b4","862c01d07f30","ac22fbf07e0c","5955b71536d4","c0ace26d21c9","692c51030342"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["a71a6d788ad5","2b06e7ffd843","11b8b360617c"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["d1ce3ab0f047","69a6bd2c6842","2332a29e00a7","cf3fac75dcf7","77c6db5ee192","661de3e32976"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["3d67a3a8be93","94c890a36c0b","e541f1387592","a398a9a029a7"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"ead6f9956e53"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["5db88b79ce61","fce011e7d87","d37207dec27f"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":8,"postIds":["e1c6d3044dae","eb4eb32cc4f8","6d508cfc70c9","ca39c6407d48","7144566c54f9","3e7030748810","499579033214","3878a05713f2"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["644a0d6d048","5beb2cc6bbfa"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"9541290ea94c"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["fccd630d73d1","2ae7c61a6b2b","11f7a1bba400","945f734e43d5","d7ba9c0fffb6"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["ed1ca8c6147","b5e1b5b3dd0f"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["e2e1a1785895","11f7a1bba400","659cc5117f8f","fccd630d73d1","3c359e741d74","600288df98be","4f04261b85f2"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"685b09a42172"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"7972faeb3fa0"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["ecd3e1e2cd7a","fe49c0372a63","a3aca0a4792b","da4dad30d2f6","dba1c7d02dea","8c2508eba4aa","e888ad5a13be"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"493dca7207bb"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["5cc25e808275","53af1f5e2277"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["61a2bf1168a6","b049880df46e","fe49c0372a63","8100b6daa2b5","2f673bf089e3","924e70776c6b","2c9a1b04de78"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"df61911479f0"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["5be295dad17c","6aee4e32ed51","c1baa1c07872"],"sectionHeader":"History of Programming Series"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":4,"postIds":["630c22f5ba58","5cc25e808275","b358a2b97770","176f7e4416d"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":1,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":8,"postIds":["f518edf1e4ee","6267b7fec50d","92c178e2a178","b2bce9fcbb2","4ef1b68aac25","d2e735d8e32e","a09cfcf56aa5","b7c6d3df442c"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"22a76b2145c7"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"4a6ef90d6c0e"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["88c3cfb6a66b","d96808b3344"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["6cec86ca9d73","bee4a9eb3b5f","835128b18816","e42434f722b1","a09cfcf56aa5"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"2a67d05cfb88"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":8,"postIds":["c67f51c2f83e","17c01240266b","1454888f94ef","54544acc69a1","cc94030fba3d","904302498704","603412218c38","4f5470485aca"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["50eedc7762b6","c2771c62d179","ef8380a9f945"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":8,"postIds":["29db8afb9b13","855f378b4176","de36ee5ab474","1781df7ebdd1","eed08acbd6bf","375533b16113","a1f798c10376","2a0741dac17d"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"9802cd10aa6a"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"47481f2ad2"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"8a53e08c8b16"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"173d58c496f1"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"16409e84e618"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"1accb036fbc0"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"b632bc9c9150"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["92ae03ca04ae","67e91f65dd4b","d4f3b3d01b8c"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["5a936313c6a1","f843c48139d6","6c5366985026","e73e0289ad86","60235b40bd77","80d6893602fa","8bb59b243e9c"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["5c6fbbf1f157","e92a1e6dad9e","18cb3bbff17c"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["60da81123306","7ea5ca1c9a6d","95d1ddf176ea","fb22f52da758","8154bd6e2de1","7ca0015a9c75"]}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":3,"postIds":[],"tagSlug":"Facebook"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["1864af02f68b","54f7fb980bd3","c51b5cd6c2ff","e6398984350d","713f5a40949f","c3f3529a0bff","57a864c2d04d"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"681ee5fb34e9"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["558bf6817069","4ef1b68aac25","d447d1b97f62"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["98787d2a2fa0","d9f55aed596d","87615bc0894f","cd1cd3ed58a6","f9a8f162bd3e","3396df9935d4","772d7ec80e4"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["9ceb0ee249a1","c4dfebf66802","49b9e4f37df1"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["74b022f195c1","adf0b97a116c","d09d24992cec","161a693bf74e","2ebffebb362d","a8ccd8e647bd","b16b6d523b83"]}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["b4f590edc8e9","1af2bfcfec78","d9c397b887e4","505f0b61e53b","e1ddd1791450","b7f7b6a1707d","5e0c3b32b3c7"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["731c10a1b98e","d09d24992cec","c3f1e6273262"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["d5ab6899f249","74712f1dd310","4f1aebc444c"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["2bd0d4a9c520","2195359d5d49"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"63b964ee9718"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["4d5a7b7be869","8bca0e20a333","32d0209803a6","47ad79a54519","5a46cf3689f6","afe167c90568","6cc4c0142a12"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["37441c136de7","608c255b3056"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["11ec2f964c72","564fa85e2235","d5f9e8f79ed4"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["fed2341078c8","563e4569086e","20c9947c22d9","7c57a100a12f","938a533b685"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["869241659d84","2176bde2a4d9","655a160d66cb"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["b64684fe2c7","f13108f10ecc","ab95bed3a57f","732017a00a9c","5c119f7f5a72","1cb57e01d40c","f44a2ee30caa"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":2,"layout":3,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["7cfc55e64a15","aab16fcb5b08","a425968c7d4a","c790aead5c1f"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["dc298154fafd","e5e2fce9ccfa","2dd17119c58a","eca57de7d4a2"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"551c3c6a45e"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["d81639d8291c","e8b7cd29d398"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["308a205fdd5f","a3606305321f","cb5a36e91072","332e5c302909","2189ce09940","71a06afce81","52bdc3f05782"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"fc72050a94a6"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["579f9373e24b","9aa7301e41ac","dc298154fafd"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["abe594c49a84","4253b6d12347","de7af7e5a38b","4ed747cf315","a1914dd95c36","7130156f91b2"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["5dc8d705c5dd","ee733224e6f2","b53d36e69400","b6c6b27398f5"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["ed9b009c225","4e57c4e80cac","add1c3274e1f","f9d9c10fd901","d70f8a48d1ce","55590ccb2fd6"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"41877e09353a"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["192d55f26900","6d8bdb7c1697","f937480b941c"]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":4,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["11b304db97c2","33ea51e87f5d","dab606bfc57b","30da79af4712"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"f97a1a229c86"}},{"type":3,"promoMetadata":{"sectionHeader":"Please welcome our weekly sponsor!","promoId":"7298d28f3755"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["c320ce54a4bb","b06a982a2bba","f29257b0dea2"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["a099b228a87b","9dd8760304d8","889df80c8641","e23b4a45be82","947afb25edb4","1f7275e396e","3ec1901ec7ba"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["a41bd309d6ad","74e5f88cbc9","47ad19652eab","6d49b583df42"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["ff7999977e84","c97ff02adda5","1a92e6629842","99a0ecc56f10","92f32a98188b","2796e34673b7"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["1036c6f6b19a","bc829983bddd","4009dd85dfde","ebae43cdf859","b3a1988d5ad3","873cc405d5c2"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"b31e45357c6"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["e212e111c675","b2baee8b8a38","1261b6e18d76","846da334f8fc"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["51cfc3ff53d8","6e94372789af","d8b1d413a477","dd635a054ebf","511fe09a770a","aaaa0f2155c7"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"99f2dfed19ee"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["ce4fc49fa980","923b6008cf7f","2b0aea499f9","b85ee38bcbe2"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["2c87760a2315","41407a8b1a45","9ac524a2612b","78938b37092d","36da9973388e"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"24efbda0c3bf"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"5e5e05f2c01f"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["e9a2ed53b93c","a6c78e0951d8"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["3f93c7fc0390","bd20d3020470","d0415775efd0","37ddca3e63f5","4663e2c80992","62f3e50cd57f","b7696eea52ba"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f1bfc1548c72","7367f04c7037","949de347e5b9","eb9e3b8d6d0b","f018f20656c1"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["55420e2951f5","f406417ca318","eb87ac8c18d3","8554cb526158","2c6cdfbd6809","d333bde82509"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["1a0fee9b4020","54f5a273cebc","4f9620124624"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["3ea6ba22cd71","46957c6aa5b7"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["3a75963317f9","596cf822ef3f"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["f7c3dd65f5c0","af78626730b","804fcecccef8"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["831e74d5c6f8","43fd0e0cc2e6","cf251e123e69","4ea26a0316b2","adc5af474dc9","f3f7dda84bae"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"1624de9e9555"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["7fcdc1ac4a05","b09bbc38e7c3","6b56fd60b7fe"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"c1f408fbb54c"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["cb48be00fda7","8eb217adc3","800dde4978a","c2a2b19cc1e5","d81771539ccc","d533ef6d4862","a761239f6b2d"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["4c2a3bbcd5e5","105372ff599e","92632ff0dcef"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["6bf24e2689e5","e9e45f8c10bf","6eb44bb9ea75","f8b7fc0a89d7","95336b5acbf9","8e713b5053a3","43a03e52ff38"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f68efc61c599","5909d28bf004","170734a98d25","5c5ee713b223","5278e0bc8482","3a75963317f9"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["3fa161f4a546","9e30695e8ae6","e42434f722b1","ac6f8a867fae"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["3d00c92fc746"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["582bea781d55"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"aada577bf9e4"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"a51c0e6c2886"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["2cea7841d444","3d70e4ee6f6c","62bfaec722f1","2cea7841d444","567405045112"]}},{"type":1,"postListMetadata":{"source":2,"layout":3,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["a33f68546f71","5a537033da0a","792653bc3623","281f70322adc","2194640efee","5a71d74edf69","66ceb38b3a9e"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["8bc50c46bf3","2662f5882f9"],"sectionHeader":"HOW HACKERS START THEIR AFTERNOONS."}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["66aa710178fd","6ab8e5a3827b","6e52394c38f1","5a4aa4840135","dbba1f2c0c71","ec4b9d1dbb8b"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["50c1ee5282f7","582bea781d55","57a85d5f8fee","4a38ad02a239","792653bc3623","1bb2bad8960a"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":5,"postIds":["1b39d1581d86","319ae47117e6","d81aae3eb0e3","cef28fed6c50"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["38e51e1bb57e","c5b03d8dc8d7","6470d7945e71"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["1b45e6a3d9ed","69f57804d6f5","732f2a4db512","f6c18a91b232","382e72f7f7f","99add8963a20"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"144cca1fb011"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["3150faf965e4","908a001e15d4"],"sectionHeader":"HOW HACKERS START THEIR AFTERNOON"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["fd73260ffee9"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["99add8963a20","66e27996410a","5c3032328e52","a2d27897b5a4","43e261d03bb3","cc6e6d68661e","d4ff8d9a3fa3"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["dda85b876adf","fd14842794f6","906d3c34893c"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"d7b00b6f98b4"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["1c6493ede120","458f06732dc5"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"b66c4352b8a"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["68e4f907f661","1393ecef76de","4dc743fac5f8","bb1fe996352e","7515fbbc85f","c431564c84a8","b564fe938e8"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"af026da3d06c"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f16643bf325d","98b76e15d44d","b0388beae9b9","5f394fc5ebd0","6f315e4433ae","b19603502103"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f4c71712624c","648990d84dd","7868eb9bfc83","9461dad669db","4be57bcca1c7","8f0da3f22f67"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["2e78dbec87c8","9ebb7ba83a8f","862b90dabae5","673f64f63dd2","3af844f61257"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"bd37d9d1eeed"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["ca5850e8421c","412a24357d76","ae7492fb01a6","dce7624690d3","70ce667c212a","9d5bb83510a5"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["165fa612ab42","92829cb42bb1"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["2f09e925cc06","e5e6289bb8e5","25f2277c73a6","ab0b413e5d2b","2e78dbec87c8","fe17480ed5c6"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"a7a08a8703fc"}},{"type":1,"postListMetadata":{"source":3,"layout":5,"number":2,"postIds":["df4e1905d373"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["2703165f737c","73991f2328b0","d66c3d37ad71","12878a1bd7f6","9101528a7b76","8985a53920b3"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["9ce93184f3dd","1210ab27ebe4","a89c82d1b494","be70a62937ef","4be57bcca1c7","69b96ad943e5","5b47ca1209b3"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["12878a1bd7f6","9c4b84d38ce5","ca01af1a7041"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"7708721caff6"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"4c015e9ea6e4"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"c3628562fbb0"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["308fe7b223f3","3de21282c7ce","50e47dfd95a0","e1b504179848","3d817aa25dff","44c9659c5e75"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["d7b3780920e2","33df51f7367c","b995c5aa7e37","c29cf8bc09b2","9e2f596a050c"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f3f7dda84bae","b669ae467f92","52b1ff18552","37bb2701bd2","2695835f59be","2f6b889dcf6d","281b6abaec5"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["4be57bcca1c7","e464a2dd34f4","64ca9f6f9a69","f7637b80ec26","e541e2a1414d","eb0e20a4a2b","4b4aef907810"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"e526a5db2a99"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":12,"postIds":["b552f584776d","f3f7dda84bae","85258e1bc87","771afebffc0f","256a4781e843","39607104e89e","8e2cbc0ce420","dfdad0a61e99","2cc3fb1fbefc","79da9a941ec1","f19b3f33ea92"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"e6a39af2d128"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["c2f26933db23","213f8a924e89","568be62fdf6d","4a3328a4c50c","7ff89cebf6fd","8ab9c532c500","77b105033d8e"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["e9bbf9675a8b","a0df80914f05","b5698f0e2058","586f09a17fff","2ab1471ff078","ce467aee06c1","a6780d67480"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"c1f8ea66adc"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["d1cd80c26f08","4e292524ff47"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["89fde97b5352","1f17fe30333d","41a11307d075","5f5bae03f113","de9481966b98","27505e7ec03","70e2083f103c"]}},{"type":3,"promoMetadata":{"sectionHeader":"Meet our weekly sponsor","promoId":"4b7a404a6ac8"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["6e97a25e7402","6bcd71794853","3b823e434fc8"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["abc9d709399d","946849c2fbd4","8394d06a0a8d","b9ef59bffe8a","263434c0b8ad"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"2b715129e8a7"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["d4a71f601346","3ae907a5b4a5","defde2a28b51","4710914f1b01","fd2721a00586","99233a415462"]}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["b0a7c743c1c1","6b6f64da07e2","1705df5434ca","5e7e7f7d8914","26582430bf58","16dbbbcfee9"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"b2250ffee70b"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["33ec8c79a8e2","429653de42d3","a04a94ff758e","15384bd30354","77bfa1afd1b2"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["8aae6042fb48","66df47506371","ab1ed50c0e49","2c0b44f57a14","788e94441d60"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"65cd9bbeee53"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["f5ef050c8c92","fbc2712fa322","e56846300025","fcf5fab9cdf1","60ab1e1b50f9"]}},{"type":1,"postListMetadata":{"source":3,"layout":5,"number":2,"postIds":["91c6318a7045"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["7d907f278a4f","d9bc85e1d91f","57cf806d34df","d733cc2c48b0","caf2e2318abb","b8cd3287f9f0","1628d08aa7dd"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["32c35267a585","689157d9d64c","afd0d32ab50","3b4bf96e138f","2c1b96a77cd6","117428612f46","5be456018040"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["65c51e24398e","287ea58a3395","7c5f6d4efbec","da7d04bd7f42","5dd92b533870","f1b6966c7dbc"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["ecffb15fb24e","ba05a84281b6"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["8aae6042fb48","f69206586a7f","a78d320de97f","5c0a454fb278","e4974a8d165a","6bd28795b313","33126a96ee23"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"446a32fc0d24"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"865e00d7a5cc"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["34161bed1775","f85e24733654","24dc08ffe60b","3dde6c77adbb","71b84292bf3a","4991ceff55d7","94abc7f2232d"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["9a8cb347c5b5","94bc09232b9c","69fdf195e47","4f250385673e","38be5bdcf4da","14a3aecbbb98"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["e39f92cf16e1","7b45498cedfb","ba71a5c9c7f6","4f64fb199df3","41ee7c6d032a","5949d21ca5b9","6816b85deb0c"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["1f147b8dfd56","cf54999c097b"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["97a9daaab2ad","ef2aaa069cf7","d52f3413bca7","209358817f9a","4088f2eb01be","ebeff6c34f8b","3e07b02394c"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"a1f1dfd22f1e"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["c674c4b06b3a","b9390c44318b","554e4c586b1b","c10871bea599","a613048959b2"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"689bd0be3c27"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["a316ed3f445f","a154194cbb4f","5c7e7359109","71c602bc1fdc","b9390c44318b","819053c3b2cb","31c809bfc39f"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"f797a76afb45"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f3d47b6686ef","6567cee2bccc","cec76793b6a1","5b7b0da5d4b5","5b578bc5cb7b","dad55578062c","ba71a5c9c7f6"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"9d7a29ed9e19"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"494042c57cb7"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"c2e6b6be8e86"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["27a4a3cc2bb1","d983279dfac6","78197497f95","90c005d2129f","824ba801a51b","530b36147e13"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["67ebb5fc7ae","3abc7e00148e","be4b3e326387"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["e82531365e6d","4f403e96d50c","952b389ad7df","baade68284f8","16d8c81b4077","f94e3929891b"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["214122a8948f","1aec77fbe2fa","a6ab438fe79f"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"47b3ba8e6409"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"9e3d7cfcf2ae"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["235b29ed126b","36584863b0f8","4678b8d231b4"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["2e0ed0638f47","39782417f990","a550fb945e81","560a42d96ba7","713149eb9a21","5405058f36cf","a4ec565b5387"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["d04266844e7","d101995bb843","7a895c3c1b67"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"d0f942e21392"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"389040327ca9"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f2b5521c3f25","b91f4ea3a3c9","beea36ef194e","9f7e3d52941d","44ecf9e8461f","75701ed23f68","94a3aa4c2aab"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"f970499f6f87"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["aa56f4fcdc42","c33c16ea5e88","dedab6afd3f6","119863d5d9f3","806b8ae77fa6","97dbad1ff28c","a1088198874"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":3,"postIds":["3c6116ba30a8","c54ea887598"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["1cb71fc969ff","78f3a69552ac","a8437dd94425"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"25442c821aaa"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["3ab8dbc55eb3","7fe46fc43600","9d65031e7491","5f03eddd3add","3e13008fbef9","85cb43b302a0"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"d9a690308592"}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["2a02c5e8f138","e7dfb9377e28","2ffdbd8a880f","3201917e2ac3","df4804fcfc1","a8437dd94425","98a98e360315"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"d45f1e1b26b5"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"631cbd4d4722"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"37611551a9bd"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["786b0640fe85","dc8c23a52985","4b503e6485db","dacceaff9a13","3eaa4d38da63"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"f96cf948f855"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["8ae5594d7446","218a23186cd7","60839779996b"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["c39aebc25517","beaf3b9a88b0","8d6ac4c17e8c","bbe1016d1f7a","c57acd51846a","5ac67fb138ff","e01c605ec296"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["f2d443eba35","ee98c180100"],"sectionHeader":"On one hand, BLOCKCHAIN! And on the other hand, blockchain... "}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["a9a397af9221","468ae877700f"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f24a206dc467","fe28d4d11c71","2e469b762ba9","85d5881cf163","62a56d8435e4","d575f70b39a0","dbe237c40430"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"7b8579556cc6"}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":3,"postIds":[],"tagSlug":"the next web partnership","sectionHeader":"Hackers on The Next Web [Partnership]"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["87e6426398","413679bb4c3e","d183db1057ea"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["73a93685197a","b338247eed6a","3f05f6cee400","46408cf09734","d575f70b39a0","c229df788439","8b3bbc7ac3c3"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":8,"postIds":["b6aa17eeac20","2e469b762ba9","89985ca2be48","f37cf4c0043","89570568417","ee98c180100"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"1776e09fbee8"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"315d6b101da4"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["8ac9fa893823","133f1c375cd3"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["68750ed16365","c4526d6d3f8"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["ecce0d27e638","1f886fbd3c5c","5597c743cd0a","73caaacfe31b","58884e95c2bd","11e158b734ee"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["fa3bd02101ee","ebb3253e63ce"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"38f55445474d"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"aceba1abaf3c"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["5d3574a3aab6","96e3230782ab","a2eb19a26c32"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["9a8ec4ec7d62","ca553f5a002c","c8b49bfe6e32","e1b3062b9341","d2c79ec43201","e9db73107ebf","2e9c1c685576"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"7f61c3746a72"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["350ba0060fc9","f2d443eba35"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["aeaf126ce979","3d63fe4c5c76","8e59984a491b","c2f491199549","f1f8f63594ee","133f1c375cd3"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["f39a5c778c4c","8ac9fa893823"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["a73122dd23d4","822478b5afbd","96e3230782ab"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["29599a5c78ac","324bac3a0ffc","6f2cb28657cb","1d5f82e4c26f","2b87f63bcbaa"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["62a56d8435e4","e9f0e3ed36a6","4c36ce8d4535","feea7730b20b","4f1872171475","a1d9eecdf8fe","7fab00ee678e"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["3bbaabceadac","657a1a3332e2","d1ae5e562a1","a5b54745eed2","69a6cf68f447","ae58c69b3bf0","de59e6770e9"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["3ba2c770ba98","809672a678a1"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["fa6f28ba0649","a1333072a2e3","f2ffb2810203","b08e9f87052c","6cd9426f0923","684bc0584bb6"]}},{"type":3,"promoMetadata":{"sectionHeader":"We publish 25 tech stories today. Choose a category below:","promoId":"abff68f8f897"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"bfe226690685"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"a598a648231e"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"566ff7dbcbea"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"4f2c7a62f9b8"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["d572bb52e21c","7fab00ee678e","76dfcb33587f"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["f4c7fffc0297","d572bb52e21c"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["dc1a6f725490","d40da0449faf","7b952b8b038e","cecc1ba64506","3de86d22bd6e","5d6396c3a402","8e73903b98fc"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["15f03f5df12","301a96f49c34"],"sectionHeader":"Lets Talk Headware!"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["22e2a52f9c7d","83bdaf2fdf4f","77bf34bec2d1","30a3acbfef13","2ac5d2dd4881"],"sectionHeader":"5 Trending Tech Stories!"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["79956138bea3","6dda57b5b00d","aae9fcc75e94","ece2eaf5bf44","2297730143a5","3216607f63f4"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["652b7055569d","c0b44bf2b17d","6c91a13b6685","bc1ddb91845f","d030804bf358","258ebe9eed1","44d4bd3961b7"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["fe28d4d11c71","2aac943acd97","73bdb49693a","c1c5714f79a0","f6ee15646981","117428612f46","a2b66f0f81fd"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["17c4743b3850","5a0cdeb4d579","2f2b7b3f124","b30494c0e19e","4b066aa6aa9c","9a3e613c833c","d04e0a525779"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["6bd1f401fc3a","bd07b282416f","bc5752187556","a6b2e2859c13","1fe876bcf5aa","bdd44746e83a","b3aeb35ffe31"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["5d41628227e7","f5851848de5"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["e9f0e3ed36a6","d1ae5e562a1"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["9aa32fdef359","4eab513485d1","b5f8f736c79b","94c775f93fd0","c9683fd3295","4437a1aec217","b30494c0e19e"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["6108081dbada","4e7a00eb6196","933b24009e35","9df9db9e7d23","1d0a5fe08183","247a0df25338","ad5946378fb4"]}},{"type":3,"promoMetadata":{"sectionHeader":"meet our weekly sponsor!","promoId":"970992ef0476"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["788fcbdcac2a","69c8b2a55ef9","28e9e2a47eae"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["85d5881cf163","11213600658c","d0787f2abfd","28e9e2a47eae","3121f8d50cf0","c1ea802c353b","92a6b19ede18"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["272ecc0ad370","7412d121798d","67d633ce8ace","e5eca9f0920b","5483362d79b5","5447c641d397"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["475010b26fb4","e9f0e3ed36a6","5bbebddad96b","2f4bb021abc4","6a804f334beb","9534818fb217","f59f92fd8dca"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"cd73f03d69e7"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["7c05361e467d","b280bef441e7","c3e07819c5bb","ea9338cb13ed","8cf194987a50","5447c641d397"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["de2913b04ca4","454fae465d63","ef00e6f3d8a6"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["286aa625e26d","2790fa6c81a1"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["2e6a5b65665b","b9a7f01f84ff","9d6c7b7f9c3b","d9ebca8d370e","31c6858e47b7","f2d443eba35","6c11b6735d10"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["4df003345ccd","75387cbeed3d","d6d9887c494e"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["1f331dd11b1e","87f859f13f75"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["f5838fc27382","c6278cf09e85"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"79b655bd009"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":9,"postIds":["1751bd1212bf","c71fdb07d51c","c54346cd8ca0","c4d02f27dd3","6926df5af0c7","5bb0f9d56801","c5c5b86e9458","bdc5aeaf2d07","68bbccf6885c"]}},{"type":1,"postListMetadata":{"source":1,"layout":3,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"The Latest on Hacker Noon! "}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["b8081402a3d5","8d353abd2f0f","438b51333fa","4409bd8528b0","70e4b8cc72eb","3a5dfc96c355"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Latest Stories on Hacker Noon"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["10b059541894","8f91dad8e4e1","b5caefd995df"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["1788da8a7449","31a88b97b282"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["3229d79ec062"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["6435ad6839be","ee9e7fcb1a51","2a2d627b0202"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"d4039f479491"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"ff71209e861d"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"2e1c6d75c04b"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["d3a272034668","f2dfdfe82de8"],"sectionHeader":"From our new partner, Quora! "}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["467368aad888","68d7bfb37a9e"]}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":2,"postIds":[],"sectionHeader":"Monthly Trending Stories on Hacker Noon"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["60cd8d2713c1","7acd8ea68157","6d82fad147b9","a73af700aee6","79ccfe159d08","eabecd21a365","b3ce3a939b7b"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"31a93c4f45d3"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["46e7f4dc34e6","5a68fe24a849","7a31565e768","5b4be1b7c9b2","fe9f574b3c5e"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Latest on Hacker Noon"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["6bdfa366b899","38d41aff563e","b94973c21784","cb3b1fd04a1c","be5c30184e13"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["5e937707c27b","938cff3a0fcb","bbd5fd790af3","14e46e99942e","873dae511021","35b89e67ce79","9367e620d8cf"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"5bc3d515af98"}},{"type":1,"postListMetadata":{"source":3,"layout":5,"number":2,"postIds":["80704ba39873","9cb62476ef3a"]}},{"type":1,"postListMetadata":{"source":4,"layout":7,"number":7,"postIds":[],"tagSlug":"quora partnership","sectionHeader":"Popular Tech Answers via Our New Partner, Quora"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"f847b2930ad2"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["6dfef764da1f","d4615c12ad09","3fceeae2b21","64be1a7a0264","956cc2edcf9f"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["71098afa07c9","62ecae8fc85d"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"b8617813d6e0"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["40ee1ee9314f","eefbf1a44ae8","49166e1a69de","491703c8277d","7a470cd02e75","c300abe152e5"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["ce82188d0019","3522483fa146"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"5e5af391cd00"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":6,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"5d5b48b7aa50"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["c755838dfc79","a3a35785692b"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["f7fdc7059cf8","dd4ea38b4bfb","52d1cebf0394"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"896d70ab8ca8"}},{"type":1,"postListMetadata":{"source":2,"layout":3,"number":2,"postIds":[],"sectionHeader":"Trending on Hacker Noon"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["91e1a0052c53","785622043b7b","fcdfd9d68ad2","2d6bb6750bb9","c233a0971952","401eb4869012"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"f4db069cfe53"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["3c7ec5664c42","f3ce9500a028"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["984a72d48ebc","db3add166840"]}},{"type":3,"promoMetadata":{"sectionHeader":"Meet our weekly sponsor","promoId":"9e0f29f4dfc1"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["14df8cc1c68a","82fc8a0a1bfe"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["24d184e871a3","d8277a4ba86d","9147f805ef96","f5730fdf19c9","cf28ba9557d1","f322108695c","b6aa17eeac20"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"252741d1ff19"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["635e7ed00fa3","d0e5fa65698e","c84eb94d0a13","9a9a1c9c5c16","f94d0ee13eb9","76ff3b8e92d7","3ef503d93609"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"e42ae0703754"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["4ed049d2b0c0","1e7a97fc1bd"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["2a2d627b0202","6127269ff25f","7b80f8ab7279","3cc2857618d3","bb09192916a3","736feda86507"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"ca296d74fb59"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["ea0330cb69a5","494996b66932"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["3edf51ce448c","1eeeb14f20f8","3ff673a3955"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["8976b6886481","ae9a5752fe82","faf7bcd44c0e","97d0e18a2999"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"396ff1a74de6"}},{"type":1,"postListMetadata":{"source":2,"layout":3,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["27ae935bab1b","7b07c7b57cef","66c75ebf760","f13e89da1432","a7df366d800e"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"2e849410fe12"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["a78e60927042","e11b96e27199","abc0ba7028a4","83f196e6e560","dd9dfe25accb"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"b9fcbbb01e0c"}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["f2d443eba35","7b213c1bb867","eace34fcae8a","b17131ec20f4","2bfbe48769cc"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["60f195cabd68","7e75481a798c"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"fbe56cc5bbf3"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["a8fe48feb023","a3ef6f35f0a8","50d3b27f838c","e95f3ce061f3","e8016fcef3b2","2f27a367baa9"]}},{"type":3,"promoMetadata":{"sectionHeader":"Meet our weekly sponsor ","promoId":"7d330af61dc1"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["b5aaf1444d44","97a23092473c"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["464a5797c799","39d6d038e5da"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["5855a7e4aa2c"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"40b8858f2e22"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["643d8ba42ace","fb1380f5cb6c"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["19720a7447d2","3bb9fc924712"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"a1161179b8f7"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["231c7b3d088d","5f7a9ef4cebc","6f67810983aa","34d28430a5a2","fa38e28f2531","e53594aabb47"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["eef7a088a6d9"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["437b852acc0d","a1ac874710a5","11ef078ef5fc","2661580d0b8d","12169dd44a92"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"702fc34c8599"}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["9bdcc60a39c1","3a7287d953a5","e948d3353aa7","fdf45a7b1fbc"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["169c8158ec16","12809d74b6b0"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["67ca0cb88358","6d9da452fa8d","895e006b1bb3"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"6ec02c38218e"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"63b0176ffa0d"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["332f0b76ab4"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["26d87774c011","eca67feb079c","7d5ec4b8c81b","3f816c90ce61","66281760037","77d628ac9518"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"90cbf1a830b6"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"5756aa691588"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["f15edd11505f","9913745d7d8","36af9aecfc47"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["2d06bd7bcf5d","3f3bc80d0c4b","b02c6d7828ab","8e28d94f5f04","d7dd592c39b2","32e783d87210"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"4e24a829bfa3"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":1,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":1,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["b435f98569ab","8e28d94f5f04","b9b6ec034afd","3b03970c8df7","bbeeaa7a5449"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["b441e5ab9e38","efc565f8e8d8"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["a6a5cea6a6c7","a291011a71c5","aaecf2d35312","da90f2a98102"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["485abe0ec522","175f845c2bcf","7c75a30ddd87","3cdd916407cf"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Latest on Hacker Noon"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"35565d881c23"}},{"type":1,"postListMetadata":{"source":3,"layout":5,"number":2,"postIds":["a9d7550c157e","cacd04f916b3"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["800c3b218c15","1fdb7f0c5263","2a2a0614bddf","ce21a989c61d","462fa4bb401e","d52302d270b4","f31332421f31"]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"53de142e92fa"}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":2,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"download our weekly sponsor's awesome product benchmarks report ","promoId":"2b2e66625479"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["fcffd87c15a3","9b6fcb668111","ee8a77f7f4c7","20a647b8f39f","d29e3b92495b","93bcb2c7dbb7"]}},{"type":3,"promoMetadata":{"sectionHeader":"The human spirit must prevail over technology.  – Albert Einstein","promoId":"d4dad3e9000f"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["9fe8a468bebc","6640df17e263","2151784eb785","4f31d3063a28","3e69e5323f0","e3a1179883bd"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["1ad7e58a7127","1d707806d66c"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":1,"postIds":["44f260cdeda3"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["f6c904618190"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"a67a450d664a"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"144303e22689"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"1e999a4b2a3"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["2848971a34a0","12809d74b6b0"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"8a32897abd22"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["2980b2e32717","c1802315007f"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"de89d7fed5b8"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"19bc68559507"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"2dc11ae5af0d"}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"c21a21cec864"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"fa0faaaf4f9f"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["e10aed48dfeb","17b985271ef9","2235b96d64cf","6f32ea8f5888"],"sectionHeader":"crypto columns"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"b149ae8c197a"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"4fcdd3b69683"}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["57fa096c09ab"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["79b46a91ac63","62b66ddd0f89","3ede534ef1ed","fb95dfb7af31","347822f5419f","69f295e63759"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["a1df2eb9e8a9","36ce63b6b4d3"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"c7f4ceefd279"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["355f818161a6","f3178540f5e3"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Latest on Hacker Noon"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["2a2e846ae113","251d19b23597"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["1043c756a221","d794ab48fb82"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["dc9adb4c162b","4c772b7c2642","23049d7209af"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":3,"postIds":["9b0d78585d67","222c02b7b5e2","50fc18cfcebf"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"2e538b9b7158"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["2a2e846ae113","79377c3dca7e","934f1908194b","800cea71b06c"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["b1f30845b43e","5c335b2775b6","a2929b4d8eee"]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["2a2e846ae113","eacda5cc41a6","6061d3c93e7","e3f0f882df0d","a65c7bfab490"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"b13aa799f39e"}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":4,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"ef8d38097b3d"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":5,"postIds":["3e432c5e8caa","1fe85ad40e35","2d17db675a1","cce0fe222a71"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"9c5e096897cf"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["e509dd0b6bd4","1ede32aa0711"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["8b03b18b0bd0","a901e1cea549","b3a3b6167566"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["55943d523b56","54e24395243f"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["196ccd9564ce","3d3cc24217f4"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":5,"postIds":["c8037bcacc23","fe70af065a7d","56b573ad010a","e61c7d89bf27"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["6d5c20825e56","e7b5c26b0624"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"meet our weekly sponsor:","promoId":"8e7362b57766"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"a4c96b609aa3"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["70ce98492aed"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["93d73306e0c5","9b5510ca25e3","ac36449ffa10","5169fbb570cc"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":1,"postIds":["ee59ded4602d"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["772d0e6ad322","8b8af8aaffe0"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["8201e7a9003","fb4b0e1752a5","6b76ae597ace"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["fcfa418bfce1","af1fa3dbf7d8","e505c798ce77","8b2e08ebd563"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["ed51207952a8","5169fbb570cc"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["dad83ec3fc23","23d484d8bef8"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["66b4e2043621","4dc566be372e","eed1ed01127f","b5cd7275dc84"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["4a72ce2bb1f3","707c532abbe2","b1d2e93a703"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["f3e0424cf2f0","8b7be39f30fc"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["cdc8aeb5db0b","4c33e9b6bfaa","dbb3f9e2349f"]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":4,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":9,"postIds":["6f0f099850f9","11ccc607c504","71998e2524e7","9070a9800c26","c69443606805","c87be8dc0e47","bdb983bc3e49","3ebc654e0ad6","f75f376f422"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"7ddbb40a1140"}},{"type":1,"postListMetadata":{"source":4,"layout":2,"number":2,"postIds":[],"tagSlug":"Amazon"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["ea94805cf05d","d499c198aec5","23d484d8bef8","ddcab1bb1f75"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":1,"postIds":["5bff38d9a93a"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":1,"postIds":["50246fc36e9e"]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["7aee9c1b566","516da34ce5d6","29a5a754eb1a"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"a18a7026fcbc"}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":1,"postIds":["e8f628d51700"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":1,"postIds":["f4269cb5cc40"],"sectionHeader":"Why does this happen? It’s complicated…"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["c2f0b835ab92","75b84458d86c"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["782efb19d900","d773118420d2","355ff87859f9","a7f5889f81b5","bc8ebe7a84e5"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Latest on Hacker Noon"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["486c31768b97","daff6042413a"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["2e2d261b73ed","38f8b25978c0","f28dc766ef32"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["94470b18156f","84fa910fcd42"]}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["7b39bc404404","c17512a0e2a4","4182f0b00ae7"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":6,"postIds":["7d3fb8667030","d6603a5fc64d","e542606eb67d","9b8865c8e46f","d936a71d0263"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["5cd013f37782","1e82a8bc27f4"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["5ac12ba91f34","b1c89554bcba"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["cdf37b7f6b33"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["aec1c470cf8f","dc2af3ceebad"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["19c0620e4a43","2e4c92b0b80b"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["a0e2011d36","7d571fb5b034","f4c1696e6ffd","b9e0222b5b5e"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["a66a9e01253d","1459d32f3395"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":3,"postIds":["23d484d8bef8","60b296c4c031","6a418db04a21"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["886db508cc31","28c251df4018","a8912a25dc88","19a852fea4ff"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["f0c66cf6fc22","437405a2cdae"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":1,"postIds":["6a007cfb9b97"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["9ebe117b5759"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["b6f8cf612743","c2c9ee8ad201","3b1994a33522"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["fd5124088875","ae9fdc38479f","2cb43946551a","fbe6098de696","b0567f3922cc"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":7,"number":7,"postIds":["c6af86023022","faffb6da1371","b5dc6bb92d49","23d484d8bef8","1020969abfcd","bc8eeea54220","8fc6e9ff348b"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["f0f7614cab32","f06c008f8f84"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["bdf48340c1be","8e49b6badaa4"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["345d9f12f40b","cd1f681d4f42"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["b285b070d456","fb002f281102","b5f3d4dff66","42c39fa638f5"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["4fd640698e9b","30ae29add74b","66060f3799e5"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":3,"postIds":["99c07a93c8eb","ebbb98cfb05"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["4db8646cae30","a95f936e8b85"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["177cc115b749","244a412b9455","8f119bd4bc87","f5dbb4ba5fcc"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["3d18be586249"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["e699820c7e9b","d77774802bbd"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["e5080a2be6e4","9430a2dbb895","6c21de7a1f28","5b34614ae69a"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["23d484d8bef8","18f111fcc007"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["b03c707b8f90","91aeb58b4689","34766550f8d7","e97eea715f1c"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["a093b83ac99a","b8a59585a7e0"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":1,"postIds":["fd22d84ae61c"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":4,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["ca7dc80e9d8","49d35ac463b1"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["c774ae5f7d9a","8963863d4a03","bbf941c7f0dc","a9335697163b","7c727a71dda8"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["baf1d1fccb04","cdf37b7f6b33","c65e0d67ac09","c485dd5b8c6c"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["a3b4b39fe0ae","67799886b78f","341f57364481"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["416431539c6","a24ab4bc0d55"]}},{"type":1,"postListMetadata":{"source":4,"layout":2,"number":4,"postIds":[],"tagSlug":"Bitcoin","sectionHeader":"Bitcoin"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["e7253ac24306","83d5ae84fb8e","3909fff55ba3","85eda475f96d","6f25e1f2463c"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":4,"postIds":[]}},{"type":1,"postListMetadata":{"source":2,"layout":2,"number":4,"postIds":[],"sectionHeader":"Trending Stories"}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":10,"postIds":[],"sectionHeader":"Latest Stories"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["3cb7a7d49d95","20ebb37d8a79","6b0031eead87","cab1bfa1615","f32aee3fcbf7","ee1ecd5c9c87"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["98fef71aefcf","729abe42a02f"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["6c8727fefcd2","ac83d2ab567c","39c711d28eb4","72bab45608af","66f590abb7d0","638da7a3dce0"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":3,"postIds":["b34b2247520f","3a093c5ba1a0","9cdaf2ab3d48"],"sectionHeader":"From The Design Director of Unannounced @ Magic Leap."}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":3,"postIds":["9df799984034","d25045cbfa61","d538d1e8f831"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["2a5d78072128","521bae1411f","866c7cec88b0","860c3f25f1fb","afe675c64340"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":3,"postIds":["e75185793aa6","18f111fcc007","7e6321236b8e"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["46c17eb955e6","8bc79eac469d","35e4f9701504","d167302c17f5"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["b7e368cb16df","4269c0bf6c8b"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":4,"postIds":["7cfdaff04b12","491cf55d501b","7781fe0bf7d"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"8c1f297e1d"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["de62c859643","98faa4754fd5","107c9cabc4dc","2801aa031202"]}},{"type":1,"postListMetadata":{"source":4,"layout":2,"number":2,"postIds":[],"tagSlug":"Artificial Intelligence","sectionHeader":"Artificial Intelligence"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"11350928f495"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["93c4f1a30c82","a8cac81cd02f"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["8cbbd31568ec","f1baed075d1b","b8040b1e225f","672b3b81eac9"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["7e2e3723c877","a3ec1644cb0a","705a89fa8978","f15ef317cd6d","9a2b19114520","c2e788290f5f"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["ab424913a4b5","c9155c5f6bdf"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["2bebed57ed64"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["37921874349f","9e029b872304","5d8249407f3a","3ed4cccc669a"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["b3b4cdcfb4f4","501ae81d28aa","7d33811da15"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["43d0c57e3fe6","dc3e0c4410d4","c1025f001e68","10126d988655"]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":1,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["bc0b08312fa","256ac0c2a3ff"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["6b1439a30bd8","647d9314baaa"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":1,"postIds":["e192224c6c3b"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["b52f2265c596"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["55932ecffdd7","7d33811da15"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["badb6b01e53f","14a0575a8be7","d4449920d2","420ff367c5c1"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["cf3a210a36b1","424b6d697e35","fcb2f55088f9"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["96f13a66bb51","adeda8f7f39e","4c7eb541d193","cf953e4ec7e0"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["6dbb5d03ba2a","838024c7bfbf"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["a1efcf97a264","9d5bb83510a5"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":1,"postIds":["db34b9d034a2"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["b4b76e3ecd64","6928db640c42","96f13a66bb51","a84b0737f027","e02bafe9c9f6","dd97420f640e"]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["39e1cf69395f"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["54e84aa7a421"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["a64adc93525a","4703c3f02fbb"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["71449d49b170","385e25c65d33"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["57a46ecd8723","a2be67247969","1da89ba19348"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"More of the Latest on Hacker Noon"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["794e0a4c334f"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["baee5376a6a2","f79d7be702be"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["104f77277297","2f94d313c7e5","4a54857b82ba"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["68c98a8d003a","4ae300cdc220"]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":6,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":6,"postIds":["861990a7320a","ee9c394adf66","44043dc7b3f5","50e3de238376","3bb9d0f76766","582b47774ad9"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["52a8331030f1","7586ca5b7ef8","4a8866be3e14","8e1793ed32be"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["890b868cec06","4433eba0466d","ebd055c2482e","6df85598a444"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["8994061d2176","6aa750cde1a2"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["8d1d57ec6f0c","2db68487f4ba"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["b593e408b643","e2188cc34422"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["64104f59bf5e","f3b3540f8545"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["1da89ba19348"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["3ab23da15e0a","4755649d96ec","58526819f21e","ebd055c2482e"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["aac04ce5dc45","e8eb1e934dc5"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["5cdddc9f674d","ffaf78da36","21e01e1c6154"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"The Latest on Hacker Noon"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["487f8bae4e3"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["5b540cd42cc1","a71a730f1a5d"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["bbc9f66ad8de","cf972744a3e4","f4d7c6fcca26","6b736b01bd23"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["ffaf78da36","1ca17bd97a1a"]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["c90b0151c169","ed365b4af28a","d3be086effa0"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["9b97f3ed4fe5","da994c17d483"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["e28b95dd0a05","3c5b5829d19c","6a729de34a3a","5e9788c30958"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":3,"postIds":["9d2a8867b69b","43cfe5e3b066"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["fef16cdbc7fe","a3ef60225ee3","9b97f3ed4fe5","88333284f8fe"]}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":3,"postIds":[],"tagSlug":"Machine Learning","sectionHeader":"Machine Learning: man made machines make something new. "}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["61d3f64fd397","2df421fa941c"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"4600252e2591"}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"520dda10d047"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"900307ba912c"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["ed2ca00a953","54c569c17a49"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["928208b1978a"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["9c9397b30558","f455e9f6403b"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["70572c6d1c8d","c828187f9084"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["87b663662cea","bc063d0f9a80","9227bb3d46af","bd6c1bb3de2c"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":1,"postIds":[],"sectionHeader":"Learn from Pinterest's engineering team"}},{"type":1,"postListMetadata":{"source":4,"layout":2,"number":2,"postIds":[],"tagSlug":"Kotlin","sectionHeader":"Kotlin"}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":3,"postIds":[],"tagSlug":"React","sectionHeader":"React"}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":1,"postIds":["22673fb56ae8"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["38309f1daee8","269cece92274","41bc9ae947e6","aa411461a7e0","f455e9f6403b","39be653dde9a"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["b4942c6812ad","c16154013e12"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["622aa194787d","18363c040656","b47370c5ab17","1f71ec40de45","c0d2371151d6"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["b1824464dd5f","cd58b7ec2543"]}},{"type":1,"postListMetadata":{"source":3,"layout":5,"number":2,"postIds":["1baedbb71419","840f1c45d7ba"],"sectionHeader":"Learn from a16z's AI Playbook"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"237870dea01"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["4ed31a7304b8","f6fcdea4f521","89e30a6accf4","2f8d287f88c3"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":1,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":3,"postIds":["45f94bb5bfbf","49877739ba0d"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["1f71ec40de45"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":7,"postIds":["6be568a3b7d9","e6bc64754cd4","17a1161e7aa1"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["54c569c17a49","5f0c799c776b"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["3c1d03b90356","8975d5e68879"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["4f2309e6055d","a818dbc25cc6","e45dcddb1bdb"]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":3,"postIds":["414065bf5ec0","b4e4b011616a"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["7456d235abdf","ce57cdc3b206","2dc4a862b47e"]}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":4,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["8c605297aecd","bc914071a155","3b6c56ee938c","78ba605c2ed2"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["6db77ade3c18","446b006675c9","c0a4f614bd09","c2ac7d008591"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":3,"postIds":["209376f69731","d932556ffd8c","35dda19c8a3f"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["6134dce40e7f","62ddb47b9370"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["23049d7209af","6fec9de6765a","d6bf4991dd9","aab8969cef0b"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":1,"postIds":["6e02e7e6c8cb"]}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":5,"postIds":[],"tagSlug":"Artificial Intelligence"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"437cac726b4d"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["d7368c7fe2c2","72a96a43d5d9"]}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["ba7e4f772d78","c966f71a4abc"],"sectionHeader":"Lets Talk Business "}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["a0ff6f2bb6c8","22553abb038b"],"sectionHeader":"Tech's Big Picture"}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["d29cb2cbb637","6d91c6005d40","5bbb5f42914d"],"sectionHeader":"Develop, develop, develop... into what?"}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["11f6a5196b00","cec82aea3b81","3ba513df303e","c5e75b2fc1c8"]}},{"type":1,"postListMetadata":{"source":1,"layout":3,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["689c45b57607","e2960d0516a","b9b080ca6ccf"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["cffbd21881bc","5b20f364b216","a146d851f14f"]}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":4,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":6,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["6b5eb6a48356","7190d8a01d09","39a035c33120"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["1844e1a8522d","dcf502bed28a","ca3cbbf4f62f"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["aa8028c99c83","c3707f065069","dc8ece0a8a1b"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["6f93c7e7d702","2a277b6c296c","9389631f05d8"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["8f364119d226","d2b5d665c1c0"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["ad699fffd651","a7c6dc616bff"]}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["bea305e26741","2398b5c3731c"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["3bd60fc1e5cb","1fc3b85ce964"],"sectionHeader":"read some startup $$$ experts: "}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"from our blog network:","promoId":"513b961185f0"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["91177148ec00","a4e273babaea","7190d8a01d09","378e09f469"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":6,"postIds":[],"sectionHeader":"The Latest from Hacker Noon! "}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["2398b5c3731c","a9cf29480a88"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["c2b431bf0ac2","d070ac86d996"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":4,"postIds":[]}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"","promoId":"86226b581199"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["a8d595882a7a","68f92f671378"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["2e2196049547","e9601ace9393"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["7681766b7d79","7ae7b47a8698","6839ba295e9e","c0951613808e","b8945ce095d2","2fcdcd856886"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["f3819a689386","6516bfde9c5c","a254c5b410bc","c226d7ed6d88"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Read the Latest on Hacker Noon"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["4ecc9becad85"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":2,"postIds":["64cacca3b908","5ad769c4d3c6"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["9fb800eca775","9f54420f683e"],"sectionHeader":"some more \"boring\" articles :-) "}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":6,"postIds":["86d7166911ea","33973645be01","928bc6e9a9a8","2bb0288f05e0","f3eaff55b626","2c1687173c7c"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Read the Latest on Hacker Noon! "}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":4,"postIds":["bcaa3fda9a31","2c3abb235915","b52c8cb33161"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["116fe6c9ae8b","10068195ea7c","9e3a88a8ec07"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["505a7272e4f0","3e354a2e41cf","a8760c014327"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"The Latest from Hacker Noon"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["aedf4bd4393c","6e02e7e6c8cb"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["2612349105c6","41831d92a446"]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":8,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":5,"postIds":["fa9eb7c86dbb","3e08b0723d8f","bfd87efa2e5b","9a43fd71457a","7a0f5d1c580a"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["6a0baf5bc31b"]}},{"type":1,"postListMetadata":{"source":2,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["536375023b29","928984c2e36a"]}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["2e1d796704d5","cdbf95288333"]}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":4,"postIds":["40579cc8ea00","28af584adc0a","68c5167ecfe0","abd73a1aa736"]}},{"type":1,"postListMetadata":{"source":2,"layout":2,"number":6,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":8,"postIds":["73db53b2dea1","1cabea2b8e06","c52d911b62bf","ba9cf8724e57","5ed5265c6547","6543e6b10040","832986551df8"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["1806424e7d40","71ba0c73e34d","82dab4e3e80c","ffde04fbdc08"]}},{"type":1,"postListMetadata":{"source":1,"layout":2,"number":6,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["4381241a6453","663e5db40707","48cfbbc390b5","cce0fe222a71"]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":4,"postIds":["360fe56b658","b2c5ffaee997","1b7bbbc13b13","d31efbb641b4"]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":4,"layout":1,"number":4,"postIds":[],"tagSlug":"cia"}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":3,"postIds":[]}},{"type":3,"promoMetadata":{"sectionHeader":"New Category:","promoId":"168c69de50b9"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["5ff4c1b1a790","f1ec1738cf45"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":2,"number":6,"postIds":["bf0b2ef0e22e","355cb5944f9c","751387bd0caa","720d4e7c8a14","1c47033900e9","f8a121c3b019"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"How's a Hacker to learn from the news?"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":2,"postIds":["6fdab1f771ea"],"sectionHeader":"From the Vault! Visit the Archive for more tech history."}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":4,"number":2,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["e0b20cbd7118","f537a2cc7962","233d5d16ab02","f145469a9f1d"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"how's a hacker to better the system?"}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":4,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["39ecf99e4e8c","bad56f28c278","dac99da790ed","7929a0d9010f"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":4,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["ff3548406eb1","1c47033900e9","5fb296b35c0b"]}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["a253df32a7d1","5dd5f238bc5"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":4,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["1c47033900e9","604e8ced841e","418271194682","285f1988957a"]}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":4,"postIds":[],"sectionHeader":"Latest !!"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["624d50c76e8e"],"sectionHeader":"Blast from the Past! "}},{"type":1,"postListMetadata":{"source":3,"layout":3,"number":2,"postIds":["82cec422d67d","e06ec40c3f16"],"sectionHeader":"Making Moves! "}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":4,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":2,"postIds":[],"sectionHeader":"Trending"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["99a31cb84065","c0985e261b4f"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":8,"postIds":["720d4e7c8a14","9f831b6d430d","ea221363235d","e4bac1d5c124","e51e5ec3af6"]}},{"type":1,"postListMetadata":{"source":4,"layout":1,"number":2,"postIds":[],"tagSlug":"Startup Scene","sectionHeader":"Startup Scene"}},{"type":1,"postListMetadata":{"source":4,"layout":1,"number":2,"postIds":[],"tagSlug":"Machine Learning","sectionHeader":"Machine Learning"}},{"type":1,"postListMetadata":{"source":4,"layout":1,"number":2,"postIds":[],"tagSlug":"Autonomous Cars","sectionHeader":"Autonomous Cars"}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"More of the Latest From Hacker Noon"}},{"type":1,"postListMetadata":{"source":4,"layout":1,"number":2,"postIds":[],"tagSlug":"Artificial Intelligence","sectionHeader":"can you build a brain better than your brain? "}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"The best sh*t for Hackers at noon."}},{"type":1,"postListMetadata":{"source":4,"layout":1,"number":2,"postIds":[],"tagSlug":"Letters","sectionHeader":"A roundup of the month's top posts."}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":6,"postIds":[],"sectionHeader":"\"I would love to change the world, but they won't give me the source code.\""}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"how's a hacker to change the system ?? "}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"how's a hacker to change the system ?? "}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["b5c64c964faf"]}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":6,"postIds":[],"sectionHeader":"\"don't take the realities of the world for granted.\""}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"The Latest From Hacker Noon"}},{"type":1,"postListMetadata":{"source":2,"layout":7,"number":7,"postIds":[],"sectionHeader":"What's Trending on Hacker Noon"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":2,"postIds":["8bdfb4b79037"]}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":4,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":3,"layout":1,"number":4,"postIds":["4e992a26b711","300cc67ca6ee","4b14b1b2faff","529219a03409"]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":2,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":2,"postIds":[],"sectionHeader":"\"Intention is at the heart of this discussion.\" - Kevin Mitnick "}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":2,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":4,"postIds":[]}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[]}},{"type":1,"postListMetadata":{"source":2,"layout":1,"number":2,"postIds":[],"sectionHeader":"how did you start your afternoon ??"}},{"type":1,"postListMetadata":{"source":4,"layout":1,"number":4,"postIds":[],"tagSlug":"Docker"}},{"type":1,"postListMetadata":{"source":1,"layout":1,"number":4,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":2,"layout":7,"number":7,"postIds":[],"sectionHeader":"Trending"}},{"type":1,"postListMetadata":{"source":4,"layout":2,"number":2,"postIds":[],"tagSlug":"Silicon Valley","sectionHeader":"Silicon Valley"}},{"type":1,"postListMetadata":{"source":4,"layout":2,"number":2,"postIds":[],"tagSlug":"JavaScript","sectionHeader":"Javascript"}},{"type":1,"postListMetadata":{"source":4,"layout":4,"number":1,"postIds":[],"tagSlug":"Letters","sectionHeader":"Letters"}},{"type":1,"postListMetadata":{"source":2,"layout":2,"number":4,"postIds":[],"sectionHeader":"Trending"}},{"type":1,"postListMetadata":{"source":1,"layout":7,"number":7,"postIds":[],"sectionHeader":"Latest"}},{"type":1,"postListMetadata":{"source":2,"layout":2,"number":6,"postIds":[],"sectionHeader":"Trending"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["85fc643ccc2f"]}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":6,"postIds":[],"sectionHeader":"Trending"}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":[]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":3,"postIds":["95f87f51d79","8694020b96e8"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["88aabb0d2a7","31529b30d367","a293a4d7d4e7","d49e6bc22936","b3901584d61d"]}},{"type":1,"postListMetadata":{"source":3,"layout":4,"number":6,"postIds":["7cd00926828","5bd563fbb26e","f44e381951b6","7d20a0e38997","521cb2925155","8e70452f3eed"]}},{"type":1,"postListMetadata":{"source":2,"layout":4,"number":5,"postIds":[],"sectionHeader":"whats trending"}}],"tintColor":"#FF00FF00","lightText":false,"favicon":{"imageId":"1*76XiKOa05Yya6_CdYX8pVg.jpeg","filter":"","backgroundSize":"","originalWidth":8346,"originalHeight":8346,"strategy":"resample","height":0,"width":0},"colorPalette":{"defaultBackgroundSpectrum":{"colorPoints":[{"color":"#FF00A600","point":0},{"color":"#FF009A00","point":0.1},{"color":"#FF008E00","point":0.2},{"color":"#FF008100","point":0.3},{"color":"#FF007500","point":0.4},{"color":"#FF006800","point":0.5},{"color":"#FF005A00","point":0.6},{"color":"#FF044D01","point":0.7},{"color":"#FF083F04","point":0.8},{"color":"#FF093005","point":0.9},{"color":"#FF062004","point":1}],"backgroundColor":"#FFFFFFFF"},"tintBackgroundSpectrum":{"colorPoints":[{"color":"#FF00FF00","point":0},{"color":"#FF00F100","point":0.1},{"color":"#FF00E200","point":0.2},{"color":"#FF00D300","point":0.3},{"color":"#FF00C300","point":0.4},{"color":"#FF00B400","point":0.5},{"color":"#FF00A300","point":0.6},{"color":"#FF009200","point":0.7},{"color":"#FF008000","point":0.8},{"color":"#FF006D00","point":0.9},{"color":"#FF005900","point":1}],"backgroundColor":"#FF00FF00"},"highlightSpectrum":{"colorPoints":[{"color":"#FFD3FFC4","point":0},{"color":"#FFCBFFBA","point":0.1},{"color":"#FFC2FFB0","point":0.2},{"color":"#FFB9FFA6","point":0.3},{"color":"#FFB0FF9B","point":0.4},{"color":"#FFA7FF91","point":0.5},{"color":"#FF9DFF86","point":0.6},{"color":"#FF92FF7B","point":0.7},{"color":"#FF87FF70","point":0.8},{"color":"#FF7BFF65","point":0.9},{"color":"#FF6EFF59","point":1}],"backgroundColor":"#FFFFFFFF"}},"navItems":[{"type":4,"title":"Latest","url":"https://hackernoon.com/latest-tech-stories/home","topicId":"ee08869d885a","source":"topicId"},{"type":1,"title":"Dev","tagSlug":"software-development","url":"https://hackernoon.com/tagged/software-development","source":"tagSlug"},{"type":4,"title":"Blockchain","url":"https://hackernoon.com/blockchain/home","topicId":"ee063c681e1e","source":"topicId"},{"type":4,"title":"PM","url":"https://hackernoon.com/product-management-life/home","topicId":"25e9a79e14fe","source":"topicId"},{"type":4,"title":"Crypto Trading","url":"https://hackernoon.com/cryptocurrency-trading-bible/home","topicId":"3cfb1656fc30","source":"topicId"},{"type":4,"title":"AI ","url":"https://hackernoon.com/artificial-intelligence/home","topicId":"cd291aa79e72","source":"topicId"},{"type":3,"title":"Tech Jobs","url":"http://bit.ly/2LLdEDb"}],"colorBehavior":2,"instantArticlesState":0,"acceleratedMobilePagesState":0,"googleAnalyticsId":"UA-65623566-4","collectionFeatures":[13],"ampLogo":{"imageId":"","filter":"","backgroundSize":"","originalWidth":0,"originalHeight":0,"strategy":"resample","height":0,"width":0},"header":{"backgroundImage":{},"logoImage":{"id":"1*1HcGNZYjo78mH0faO3BnaQ@2x.png","originalWidth":3600,"originalHeight":432,"alt":"Hacker Noon"},"alignment":2,"layout":5},"type":"Collection"}},"Social":{"fe1c14f6cde":{"userId":"f829b8959ad2","targetUserId":"fe1c14f6cde","type":"Social"}},"SocialStats":{"fe1c14f6cde":{"userId":"fe1c14f6cde","usersFollowedCount":7,"usersFollowedByCount":4264,"type":"SocialStats"}}}})
// ]]></script><div class="surface-scrollOverlay"></div><script charset="UTF-8" src="./The definitive guide to Express, the Node.js Web Application Framework_files/main-common-async.bundle.4bW7T_abyC_4MYqPFTYsYg.js.download"></script><script charset="UTF-8" src="./The definitive guide to Express, the Node.js Web Application Framework_files/main-notes.bundle.rwz5u9E5cbVAaErsvQ4l9g.js.download"></script><script id="parsely-cfg" src="./The definitive guide to Express, the Node.js Web Application Framework_files/p.js.download"></script><script type="text/javascript">(function(b,r,a,n,c,h,_,s,d,k){if(!b[n]||!b[n]._q){for(;s<_.length;)c(h,_[s++]);d=r.createElement(a);d.async=1;d.src="https://cdn.branch.io/branch-latest.min.js";k=r.getElementsByTagName(a)[0];k.parentNode.insertBefore(d,k);b[n]=h}})(window,document,"script","branch",function(b,r){b[r]=function(){b._q.push([r,arguments])}},{_q:[],_v:1},"addListener applyCode autoAppIndex banner closeBanner closeJourney creditHistory credits data deepview deepviewCta first getCode init link logout redeem referrals removeListener sendSMS setBranchViewData setIdentity track validateCode trackCommerceEvent logEvent".split(" "), 0); branch.init('key_live_ofxXr2qTrrU9NqURK8ZwEhknBxiI6KBm', {'no_journeys': true, 'disable_exit_animation': true, 'disable_entry_animation': true}, function(err, data) {});</script></body></html>