{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./submodules/UTILS/index.js","webpack:///./submodules/UI-js/element/index.js","webpack:///./src/index.js","webpack:///./src/abx.js","webpack:///./src/data/abx-data-2020.csv","webpack:///./src/views/viz-view/index.js","webpack:///./src/views/viz-view/styles.scss?f87c","webpack:///./src/views/visually-hidden/index.js","webpack:///./submodules/PCTApp-js/index.js","webpack:///./submodules/ROUTR/index.js","webpack:///./src/partials/sections.html","webpack:///./src/partials/intro.md","webpack:///./src/partials/notes.md"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","0","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","GTMPush","eventLabel","dataLayer","publishWindowResize","S","resizeTimeout","addEventListener","setTimeout","setState","document","documentElement","clientWidth","clientHeight","FadeInText","HTMLElement","fadeOutContent","this","classList","add","fadeInContent","content","durationS","style","transition","Promise","resolve","durationStr","getComputedStyle","getPropertyValue","duration","parseFloat","innerHTML","remove","StringHelpers","String","cleanString","replace","toLowerCase","removeUnderscores","undoCamelCase","trunc","useWordBoundary","subString","substr","lastIndexOf","hashCode","hash","charCodeAt","DOMHelpers","indexOf","classStrings","match","idString","elString","el","createElement","forEach","klass","setAttribute","q","querySelector","qa","querySelectorAll","Element","selector","options","model","parent","renderToSelector","container","$d","children","rerender","rerenderOnDataMismatch","isMismatched","prerender","arguments","isReady","reject","existing","prerendered","App","ABXApp","needsRouter","IS_PRERENDERING","init","views","getRuntimeData","publicPath","PUBLICPATH","appContainer","Papa","parse","download","dynamicTyping","header","fastMode","skipEmptyLines","beforeFirstChunk","chunk","dataHash","toString","getAttribute","complete","response","years","loopWhile","index","unnestedData","nestedByYear","map","year","values","phase","filter","parseInt","activeLengths","discontinuedLengths","drug","isNaN","charAt","maxActive","Math","max","maxDiscontinued","createComponent","VizView","VisuallyHidden","error","insertAdjacentHTML","sections","intro","notes","then","view","appendChild","PCTApp","headers","_dataLayer","minUnitDimension","headerHeight","unitPadding","heightNeeded","renderColumns","cont","column","placeholderNumber","activeContainer","placeholder","drugEmpty","controlContainer","playButton","type","title","yearButton","yearButtonActive","textContent","inputWrapper","input","id","label","inputLabel","headerContainer","headerDiv","phaseFull","toUpperCase","phaseAbbr","discontinuedContainer","PS","setSubs","checkHeight","update","columns","active","discontinued","positionMap","initializeYearButtons","initializeAnimateOnOff","initializePlayButton","approvedSpan","discontinuedSpan","totals","replayBind","replay","pausePlayBind","pausePlay","source","animateYears","handlerBind","checked","playYearsBind","playYears","playBind","play","playBtn","button","_this","showPlayOption","currentYear","getState","blur","disablePlayButton","removeReplayOption","yearButtons","btn","removeAttribute","replayBtn","removeEventListener","pause","willPause","removePlayOption","removePauseOption","drugs","requestAnimationFrame","array","domDrug","gramNegative","novel","urgent","isDiscontinued","company","setTippys","resolvePlaceDrugs","movedDrugs","moved","totalDelay","_duration","keptSameStatus","__duration","isEntering","transitionDuration","popperXYZ","transform","_tippy","show","isMoving","popper","split","xy","transitionTimingFunction","deltaX","deltaY","hide","isTranslated","innerHeight","body","squat","root","activeMax","floor","setProperty","previousSlot","slot","phaseIndex","previousScreenPosition","movedFromProcessedColumn","movedFromSamePhase","previousMapPosition","resolveClear","Array","from","drugNode","className","destroy","enteringDrugs","resolveEntering","top","left","mapPositions","placeDrugs","sort","sortBySlot","sortByPhase","h","isAnimating","resolveInvert","filtered","currentScreenPosition","getBoundingClientRect","opacity","_placeholder","isBackward","invertDrugs","addIdsAndClasses","animateDrugs","showPauseOption","event","resolvePlayYears","showReplayOption","typeMatches","phaseMatches","k","updateText","parentElement","removeChild","e","arrow","distance","a","b","resolveYear","previousYear","getPreviousState","disableYearButtons","includes","iteratePhaseBind","highlightColumn","resolvePhase","iterateTypeBind","resolveType","drugsThatMove","drugsThatStay","_previousYear","recordScreenPosition","recordMapPosition","newType","newPhaseIndex","reverse","clearPhase","enterDrugs","removeTemporaryPlaceholders","clearAddedDrugAttributes","enableYearButtons","enablePlayButton","msg","observation","observation0","observation1","populateInitialDrugs","switchYears","totalNonzero","totalActive","totalDiscontinued","heading","subheading","status","statusLabel","list","item","keys","option","routerOptions","router","Router","disableHoverOnTouch","hasHoverClass","lastTouchTime","enableHover","Date","component","_options","undefined","encode","decode","isArray","stateObj","hashState","decodeHash","viewPromises","each","all","subscriptions","hashChange","setStateObj","replaceState","history","hashString"],"mappings":"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","file":"js/index-2021.js?v=8f1792","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t0: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([5,1]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","/* global dataLayer */\nexport function GTMPush(eventLabel) {\n    if (dataLayer) {\n        dataLayer.push({ 'event': 'Interactive Click', 'eventData': eventLabel });\n    }\n}\nexport function publishWindowResize(S) { // need to pass in the StateModule\n    window.addEventListener(\"resize\", resizeThrottler, false);\n\n    var resizeTimeout;\n\n    function resizeThrottler() { // adapted from https://developer.mozilla.org/en-US/docs/Web/Events/resize#setTimeout\n        // ignore resize events as long as an actualResizeHandler execution is in the queue\n        if (!resizeTimeout) {\n            resizeTimeout = setTimeout(function() {\n                actualResizeHandler();\n                resizeTimeout = null;\n            }, 350);\n        }\n    }\n\n    function actualResizeHandler() {\n        \n        S.setState('resize', [document.documentElement.clientWidth, document.documentElement.clientHeight]);\n    }\n}\nexport const FadeInText = (function(){\n    HTMLElement.prototype.fadeOutContent = function(){\n         this.classList.add('no-opacity');\n    };\n    HTMLElement.prototype.fadeInContent = function(content, s){\n        var durationS = s || 0;\n        if ( s ){\n            this.style.transition = 'opacity ' + s + 's ease-in-out';\n        }\n        return new Promise((resolve) => {\n            var durationStr = window.getComputedStyle(this).getPropertyValue('transition-duration') || durationS,\n                duration = parseFloat(durationStr) * 1000;\n            this.fadeOutContent();\n            setTimeout(() => {\n                this.innerHTML = content;\n                this.classList.remove('no-opacity');\n                resolve(true);\n            }, duration);\n        });\n    };\n})();\nexport const StringHelpers = (function(){\n    String.prototype.cleanString = function() { // lowercase and remove punctuation and replace spaces with hyphens; delete punctuation\n        return this.replace(/[ /]/g,'-').replace(/['\"”’“‘,.!?;()&:]/g,'').toLowerCase();\n    };\n\n    String.prototype.removeUnderscores = function() { \n        return this.replace(/_/g,' ');\n    };\n\n    String.prototype.undoCamelCase = function() {\n        return this.replace(/([A-Z])/g, ' $1').toLowerCase();\n    };\n\n    String.prototype.trunc = String.prototype.trunc || // ht https://stackoverflow.com/a/1199420\n         function( n, useWordBoundary ){\n             if (this.length <= n) { return this; }\n             var subString = this.substr(0, n-1);\n             return (useWordBoundary \n                ? subString.substr(0, subString.lastIndexOf(' ')) \n                : subString) + \"...\";\n          };\n\n    String.prototype.hashCode = function() {\n      var hash = 0, i, chr;\n      if (this.length === 0) return hash;\n      for (i = 0; i < this.length; i++) {\n        chr   = this.charCodeAt(i);\n        hash  = ((hash << 5) - hash) + chr;\n        hash |= 0; // Convert to 32bit integer\n      }\n      return hash;\n    };\n})()\n\nexport const DOMHelpers = {\n c:  (s) => {\n     \n     if ( s.indexOf('.') !== -1 || s.indexOf('#') !== -1 ){\n         let classStrings = s.match(/\\.([^#.]*)/g) || [];\n         let idString = s.match(/#([^.]*)/);\n         let elString = s.match(/^([^.#]+)/);\n         \n         \n         let el = document.createElement(elString[0]);\n         classStrings.forEach(klass => {\n            el.classList.add(klass.replace('.',''));\n         });\n         if ( idString !== null ){\n            el.setAttribute('id', idString[1]);\n         }\n         return el;\n     }\n     return document.createElement(s);\n },\n q:  (s) => document.querySelector(s),\n qa: (s) => document.querySelectorAll(s)\n}\n","import { DOMHelpers as $d } from '@Utils';\nexport default class Element {\n    constructor(selector, options){\n        if ( typeof selector !== 'string' ){\n            throw `First parameter must be a string referencing the CSS-like selector of the element to be created \n                    (\"div#divID.divClass\").`;\n        } \n        this.selector = selector;\n        this.model = options.model;\n        this.parent = options.parent; // parent is a JS object\n        this.renderToSelector = options.renderToSelector;\n        this.container = $d.q(this.renderToSelector);\n        this.children = options.children;\n        this.rerender = ( options.rerenderOnDataMismatch && options.model.isMismatched );\n        this.data = options.data;\n        \n        this.el = this.prerender(arguments); // will call the instance's prerender\n        this.isReady = new Promise((resolve, reject) => {\n            this.resolve = resolve;\n            this.reject = reject;\n        });\n        \n    }\n    prerender(){\n        \n        var existing = $d.q(this.selector);\n        if ( existing && !this.rerender ) {\n                // ie is existing and no need to rerender\n            this.prerendered = true;\n            \n            return existing;\n        } else if ( existing ) { // ie is existing but there is a need to rerender\n            \n            existing.innerHTML = '';\n            return existing;\n        }\n        var el = $d.c(this.selector);\n        return el;\n    }\n    init(){\n        \n    }\n}","/* global process */\n/*eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"StringHelpers|FadeInText\" }]*/ //allow StringHelpers to be iported (defined) and not being explicitly called\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// without triggering eslint error\nimport { StringHelpers, FadeInText } from '@Utils'; // string helpers is an IIFE\nimport ABXApp from './abx.js';\nimport './css/styles.scss';\n\n\nconst container = '#pew-app';\nconst App = new ABXApp(container, { // StateDebt extends PCTApp-js. PCTApp-js's constructor method is called, p1 contaiuner, p2 options\n\tneedsRouter: false\n});\nif ( process.env.NODE_ENV === 'development' || window.IS_PRERENDERING ){ // process development means using WebPack dev server. window is prerendering means in\n\tApp.prerender();\n}\nApp.init();","/* global PUBLICPATH process */\n//utils\n//import * as d3 from 'd3-collection';\nimport Papa from 'papaparse';\nimport { stateModule as S } from 'stateful-dead';\n//import PS from 'pubsub-setter';\nimport { publishWindowResize } from '@Utils';\n\n//data ( CSVs loaded by file-loader for use by Papaparse at build and runtime. that's set in webpack.common.js )\nimport data from './data/abx-data-2020.csv';\n\n//views\nimport VizView from './views/viz-view/';\nimport VisuallyHidden from './views/visually-hidden/';\n//import FiftyStateView from './views/fifty-state/';\n\n// app prototype\nimport PCTApp from '@App';\n\n//static content\nimport sections from './partials/sections.html';\nimport intro from './partials/intro.md';\nimport notes from './partials/notes.md';\n\npublishWindowResize(S); // initialize publish window resize with StateMOdule as param/\n\nconst model = {\n    \n    // any static data should be made properties of the model now\n    \n};\n\nconst views = []; // views get push  nly after model is fully ready, with any runtime data loaded\nconst startYear = 2014;\n\nfunction getRuntimeData(){\n    var publicPath = '';\n    if ( process.env.NODE_ENV === 'production' && !window.IS_PRERENDERING ){ // production build needs to know the public path of assets\n                                                                             // for dev and preview, assets are a child of root; for build they\n                                                                             // are in some distant path on sitecore\n        publicPath = PUBLICPATH; // TODO: set PUBLICPATH using define plugin in webpack.build.js\n    }\n    return new Promise((resolve, reject) => {\n        var appContainer = this.el;\n        Papa.parse(publicPath + data, {\n            download: true,\n            dynamicTyping: true,\n            header: true,\n            fastMode: false, // string escapes needed to parse sringified arrays with commas\n            skipEmptyLines: true,\n            beforeFirstChunk(chunk){ // on prerender, do simple hash of CSV contents and append as attribute of the app container\n                                     // at runtime, do same hash of csv contents and compare to original. if hashes match, app will\n                                     // continue normally. if mismatched, app will rerender all components based on the new data.\n                                     // this allows for `hot` updating of the main data file without rebuilding the dist/ folder.\n                                     // `model.isMismatch` will be set to `true` and the prerendering functions will check that value\n                                     // and respond accordingly\n\n                var dataHash = chunk.hashCode(); // hashCode is helper function from utils, imported and IIFE'd in index.js\n                if ( window.IS_PRERENDERING ){\n                    appContainer.setAttribute('data-data-hash', dataHash);\n                } else if ( process.env.NODE_ENV !== 'development' && dataHash.toString() !== appContainer.getAttribute('data-data-hash') ){\n                    appContainer.setAttribute('data-data-mismatch',true);\n                    \n                    model.isMismatched = true; // set so that components can access this value \n                }\n            },\n            complete: response => { // arrow function here to keep `this` context as StateDebt\n                views.length = 0;  \n                model.years = [];\n                // find number of years in data. relies on all rows having the same number\n                var loopWhile = true,\n                index = 0;\n\n                // create array of years present in the data, starting with startYear defined above\n                while ( loopWhile ){\n                    if ( response.data[0].hasOwnProperty(startYear + index) ) {\n                        model.years.push(startYear + index);   \n                    } else {\n                        loopWhile = false;\n                    }\n                    index++\n                }\n                model.unnestedData = response.data;\n                model.nestedByYear = model.years.map(year => {\n                    return {\n                        year,\n                        values: [1, 2, 3, 4, 5].map(phase => {\n                            return {\n                                phase,\n                                values: model.unnestedData.filter(d => parseInt(d[year]) == phase)\n                            };\n                        })\n                    };\n                });\n                const activeLengths =       [1,2,3,4,5].map(() => model.years.map(() => 0));\n                const discontinuedLengths = [1,2,3,4,5].map(() => model.years.map(() => 0));\n                \n                model.unnestedData.forEach(drug => {\n                    model.years.forEach((year, i) => {\n                        var phase = parseInt(drug[year]);\n                        if ( isNaN(drug[year]) && drug[year].charAt(1) === 'd' ){\n                            discontinuedLengths[phase - 1][i]++;\n                        } else if ( drug[year] !== 0 ){\n                            activeLengths[phase - 1][i]++;\n                        }\n                    });\n                });\n                \n                // find the maximum number of nondiscontinued drugs in one column at any time. side effect pushes \n                // number of discontinued drugs to array for max tbd later\n                // these values will be used to determine when stacked drugs need to be collapsed down\n                // for smaller screens\n\n              /*  model.data.forEach(d => {\n                    d.observations.forEach((obs,i) => {\n                        obs.forEach(phase => {\n                            activeLengths.push(phase.values.filter(drug => drug[d.year][i].isDiscontinued !== true).length);\n                            discontinuedLengths.push(phase.values.filter(drug => drug[d.year][i].isDiscontinued === true).length);\n                        });\n                    });\n                });*/\n                model.maxActive = Math.max(...activeLengths.map(d => Math.max(...d))) + 4;\n                model.maxDiscontinued = Math.max(...discontinuedLengths.map(d => Math.max(...d)));\n                \n               \n                /* push views now that model is complete */\n                \n                views.push(\n                   this.createComponent(model, VizView, 'div#viz-view', {renderToSelector: '#abx-visualization', rerenderOnDataMismatch: true, parent: this}),\n                   this.createComponent(model, VisuallyHidden, 'div#visually-hidden-view', {renderToSelector: '#visually-hidden-container', rerenderOnDataMismatch: true, parent: this})\n                   // this.createComponent(model, FiftyStateView, 'div#fifty-state-view', {renderToSelector: '#section-states .js-inner-content', rerenderOnDataMismatch: true, parent: this})  \n                );\n                \n                resolve(true);\n            },\n            error: function(error){\n                reject(error);\n            }\n        });\n    });\n}\n\nexport default class ABXApp extends PCTApp {\n    prerender(){\n\n        //indsert any static content here\n        this.el.insertAdjacentHTML('beforeend', sections);\n        document.querySelector('#intro').insertAdjacentHTML('afterbegin', intro );\n        document.querySelector('#abx-notes').insertAdjacentHTML('afterbegin', notes );\n        //this.wasPrerendered = false;\n        getRuntimeData.call(this).then(() => { // bind StateDebt as context `this` for getRuntimeData so that it can acceess this.el, etc\n            \n            views.forEach(view => {\n                \n          /* ? */      view.container.appendChild(view.el); // different here from CapeTown: views aren't appended to app container; some static content\n                                                     // is present already. views appended to *their* containers\n            });\n            //this.container.classList.add('rendered');\n        });\n    }\n    init(){\n        super.init();\n       // this.attachSectionOpenClose();\n        getRuntimeData.call(this).then(() => {\n            views.forEach(view => {\n               view.init(this);                    \n            });\n        });                                \n\n/*        if ( module.hot ){\n            let that = this;\n            module.hot.accept('./views/state-comparison', () => {\n                \n                document.querySelector('#section-comparison .js-inner-content').innerHTML = '';\n                var replacement = that.createComponent(model, ComparisonView, 'div#comparison-view', {renderToSelector: '#section-comparison .js-inner-content', rerenderOnDataMismatch: true});\n                \n                replacement.container.appendChild(replacement.el);\n\n            });\n        } */\n    }\n}","module.exports = __webpack_public_path__ + \"data-2021/abx-data-2020.csv?v=edfef6\";","import Element from '@UI/element';\nimport s from './styles.scss';\nimport { stateModule as S } from 'stateful-dead';\nimport PS from 'pubsub-setter';\nimport tippy from 'tippy.js';\nimport './tippy-styles.scss';\nimport { GTMPush } from '@Utils';\n\nconst minUnitDimension = 30; // minimum px height/width accepted for touchable element\nconst headerHeight = 1.5 * minUnitDimension; // the height of the phase-heading bars relative to minUnitDimension\nconst unitPadding = 2;\nconst headers = [\n    ['Phase 1', 'P1'],\n    ['Phase 2', 'P2'],\n    ['Phase 3', 'P3'],\n    ['Application', 'NDA'],\n    ['Approved', '&#x2713']\n];\n\nconst duration = 1200;\nconst shortDuration = 100;\n\nconst _dataLayer = window.dataLayer || null;\n\nexport default class VizView extends Element {\n    prerender() { // this prerender is called as part of the super constructor\n        /* any children need to be instatiated here */\n\n        this.minUnitDimension = minUnitDimension;\n        this.headerHeight = headerHeight;\n        this.unitPadding = unitPadding;\n        this.headers = headers;\n\n        this.heightNeeded = (this.model.maxActive + this.model.maxDiscontinued + 1) * (this.minUnitDimension + this.unitPadding) + this.headerHeight + this.unitPadding + 200;\n        //container\n        var view = super.prerender();\n        if (this.prerendered && !this.rerender) {\n            return view; // if prerendered and no need to render (no data mismatch)\n        }\n        function renderColumns(cont) {\n            for (let i = 0; i < 5; i++) {\n                let column = document.createElement('div');\n                column.classList.add(s.column);\n                let placeholderNumber = cont.name === s.activeContainer ? this.model.maxActive : this.model.maxDiscontinued;\n                for (let j = 0; j < placeholderNumber; j++) {\n                    let placeholder = document.createElement('div');\n                    placeholder.classList.add(s.drug, s.drugEmpty);\n                    column.appendChild(placeholder);\n                }\n                cont.appendChild(column);\n            }\n        }\n\n        // controls\n        var controlContainer = document.createElement('div');\n        controlContainer.classList.add(s.controlContainer);\n\n        // playButton\n        var playButton = document.createElement('button');\n        playButton.classList.add(s.playButton);\n        playButton.type = \"button\";\n        playButton.title = 'Play';\n        controlContainer.appendChild(playButton);\n\n        //years\n        this.model.years.forEach((year, i) => {\n            var yearButton = document.createElement('button');\n            yearButton.classList.add(s.yearButton, `${ i === 0 ? s.yearButtonActive : 'nope'}`);\n            yearButton.type = \"button\";\n            yearButton.value = year;\n            yearButton.textContent = year;\n            controlContainer.appendChild(yearButton);\n        });\n\n        //animate on/off\n        var inputWrapper = document.createElement('div');\n        inputWrapper.classList.add(s.inputWrapper);\n\n        var input = document.createElement('input');\n        input.classList.add('js-animate-checkbox');\n        input.setAttribute('type', 'checkbox');\n        input.setAttribute('checked', 'checked');\n        input.id = 'toggle-animate-on-off';\n\n        var label = document.createElement('label');\n        label.classList.add(s.inputLabel);\n        label.setAttribute('for', 'toggle-animate-on-off');\n        label.textContent = 'Animate change';\n\n        inputWrapper.appendChild(input);\n        inputWrapper.appendChild(label);\n        controlContainer.appendChild(inputWrapper);\n\n        view.appendChild(controlContainer);\n\n        // container\n        var container = document.createElement('div');\n        container.classList.add(s.container);\n        view.appendChild(container);\n\n        // active container\n        var activeContainer = document.createElement('div');\n        activeContainer.classList.add(s.activeContainer);\n        activeContainer.name = s.activeContainer;\n        container.appendChild(activeContainer);\n\n        // header container\n        var headerContainer = document.createElement('div');\n        headerContainer.classList.add(s.headerContainer);\n        headerContainer.name = s.headerContainer;\n        headers.forEach(phase => {\n            var headerDiv = document.createElement('div');\n            headerDiv.classList.add(s.headerDiv);\n            headerDiv.innerHTML = `<span class=\"${s.phaseFull}\">${phase[0].toUpperCase()}</span><span class=\"${s.phaseAbbr}\">${phase[1]}</span>`;\n            headerContainer.appendChild(headerDiv);\n        });\n        container.appendChild(headerContainer);\n\n        // discontinued container\n        var discontinuedContainer = document.createElement('div');\n        discontinuedContainer.classList.add(s.discontinuedContainer);\n        discontinuedContainer.name = s.discontinuedContainer;\n        container.appendChild(discontinuedContainer);\n\n        // columns\n        renderColumns.call(this, activeContainer);\n        renderColumns.call(this, discontinuedContainer);\n\n        return view;\n    }\n    init() {\n        PS.setSubs([\n            ['resize', this.checkHeight.bind(this)],\n            ['year', this.update.bind(this)],\n        ]);\n        this.columns = {};\n        this.columns.active = document.querySelector('.' + s.activeContainer).querySelectorAll('.' + s.column);\n        this.columns.discontinued = document.querySelector('.' + s.discontinuedContainer).querySelectorAll('.' + s.column);\n        this.headers = document.querySelectorAll('.' + s.headerDiv);\n        this.positionMap = {\n            active: headers.map(() => []),\n            discontinued: headers.map(() => [])\n        };\n        this.checkHeight();\n        this.initializeYearButtons();\n        this.initializeAnimateOnOff();\n        this.initializePlayButton();\n        this.approvedSpan = document.querySelector('#total-approved');\n        this.discontinuedSpan = document.querySelector('#total-discontinued');\n        this.totals = document.querySelector('#abx-totals');\n        this.container = document.querySelector('.' + s.container);\n        this.replayBind = this.replay.bind(this);\n        this.pausePlayBind = this.pausePlay.bind(this);\n        S.setState('year', { year: this.model.years[0], source: 'load' });\n    }\n\n    // *********  subsequent inits and show/remove methods\n\n    initializeAnimateOnOff() {\n        this.animateYears = true;\n\n        function handler(el) {\n            if (el.checked) {\n                if (_dataLayer){\n                    GTMPush('ABXAnimation|ToggleAnimation|On');\n                }\n                this.animateYears = true;\n                //this.enablePlayButton();\n            } else {\n                if (_dataLayer){\n                    GTMPush('ABXAnimation|ToggleAnimation|Off');\n                }\n                this.animateYears = false;\n                // this.disablePlayButton();\n            }\n            \n        }\n        var input = document.querySelector('.js-animate-checkbox');\n        var handlerBind = handler.bind(this);\n        input.addEventListener('change', function() {\n            handlerBind(this);\n        });\n    }\n    initializePlayButton() {\n        this.playYearsBind = this.playYears.bind(this);\n        this.playBind = this.play.bind(this);\n        var playButton = document.querySelector('.' + s.playButton);\n        playButton.addEventListener('click', this.playBind);\n        this.playBtn = playButton;\n    }\n    initializeYearButtons() {\n        document.querySelectorAll('.' + s.yearButton).forEach(button => {\n\n            var _this = this;\n            button.addEventListener('click', function() {\n                _this.showPlayOption();\n                var currentYear = S.getState('year')[0];\n                if (currentYear != this.value) { // is not the already selected button\n                    if (_dataLayer){\n                        GTMPush('ABXAnimation|Year|' + this.value);\n                    }\n                    S.setState('isPaused', false);\n                    this.blur();\n                    _this.disablePlayButton();\n                    _this.removeReplayOption();\n                    if (+this.value > +currentYear) {\n                        S.setState('isBackward', false);\n                        new Promise(() => {\n                            S.setState('year', { year: this.value, resolve: null, source: 'yearButton' });\n                        });\n                    } else {\n                        S.setState('isBackward', true);\n                        new Promise(() => {\n                            S.setState('year', { year: this.value, resolve: null, source: 'yearButton' });\n                        })\n                    }\n                }\n            });\n        });\n    }\n\n    //  ********** remove methods should only remove; add methods should call them; add methods should only add\n    disableYearButtons() {\n        this.yearButtons = this.yearButtons || document.querySelectorAll('.' + s.yearButton);\n        this.yearButtons.forEach(function(btn) {\n            btn.setAttribute('disabled', 'disabled');\n        });\n    }\n    disablePlayButton() {\n        this.playBtn = this.playBtn || document.querySelector('.' + s.playButton);\n        this.playBtn.setAttribute('disabled', 'disabled');\n    }\n    enablePlayButton() {\n        this.playBtn = this.playBtn || document.querySelector('.' + s.playButton);\n        this.playBtn.removeAttribute('disabled');\n    }\n    enableYearButtons() {\n        this.yearButtons = this.yearButtons || document.querySelectorAll('.' + s.yearButton);\n        this.yearButtons.forEach(function(btn) {\n            btn.removeAttribute('disabled');\n        });\n    }\n    removePauseOption() {\n        this.replayBtn = this.replayBtn || document.querySelector('.' + s.playButton);\n        this.replayBtn.removeEventListener('click', this.pausePlayBind);\n        this.replayBtn.classList.remove(s.pause);\n        this.replayBtn.classList.remove(s.willPause);\n    }\n    removePlayOption() {\n        this.replayBtn = this.replayBtn || document.querySelector('.' + s.playButton);\n        this.replayBtn.removeEventListener('click', this.playBind);\n    }\n    removeReplayOption() {\n        this.replayBtn = this.replayBtn || document.querySelector('.' + s.playButton);\n        this.replayBtn.classList.remove(s.replay);\n        this.replayBtn.removeEventListener('click', this.replayBind);\n    }\n    showPauseOption() {\n        this.replayBtn = this.replayBtn || document.querySelector('.' + s.playButton);\n        this.removeReplayOption();\n        this.removePlayOption();\n        this.replayBtn.addEventListener('click', this.pausePlayBind);\n        this.replayBtn.classList.add(s.pause);\n        this.replayBtn.title = \"Pause\";\n    }\n    showPlayOption() {\n        this.replayBtn = this.replayBtn || document.querySelector('.' + s.playButton);\n        this.removeReplayOption();\n        this.removePauseOption();\n        this.replayBtn.addEventListener('click', this.playBind);\n        this.replayBtn.title = 'Play';\n    }\n    showReplayOption() {\n        this.replayBtn = this.replayBtn || document.querySelector('.' + s.playButton);\n        this.removePauseOption();\n        this.removePlayOption();\n        this.replayBtn.addEventListener('click', this.replayBind);\n        this.replayBtn.classList.add(s.replay);\n        this.replayBtn.title = \"Replay\";\n    }\n\n    \n    // *********** other \n\n\n    addIdsAndClasses(drugs, year) {\n        return new Promise(resolve => {\n            requestAnimationFrame(() => {\n                drugs.forEach((drug, i, array) => {\n                    drug.domDrug.id = 'drug-' + drug.id;\n                    drug.domDrug.classList.remove(s.drugEmpty);\n                    drug.domDrug.classList.add(`${ drug.gramNegative ? s.gramNegative : 'nope' }`, `${ drug.novel ? s.novel : 'nope' }`, `${ drug.urgent ? s.urgent : 'nope' }`); //, `${ previousStatuses && previousStatuses[drug.id] && previousStatuses[drug.id].isDiscontinued && !drug[model.years[yearIndex]].isDiscontinued ? s.wasDiscontinued : 'nope'}`);\n                    if (isNaN(drug[year])) {\n                        drug.domDrug.classList.add(s.isDiscontinued);\n                    }\n                    drug.domDrug.setAttribute('data-tippy-content', `<strong>${drug.name}</strong><br />${drug.company}`);\n                   // drug.domDrug.innerHTML = `<span style=\"position:absolute;\">${drug.id}</span>`;\n                    this.setTippys(drug.domDrug);\n                    if (i == array.length - 1) {\n                        setTimeout(() => {\n                            resolve(true);\n                        });\n                    }\n                });\n            });\n        });\n    }\n    animateDrugs(drugs, resolvePlaceDrugs) {\n        var movedDrugs = drugs.filter(d => d.moved);\n        var totalDelay = 0;\n        if (movedDrugs.length > 0) {\n            movedDrugs.forEach((drug, i, array) => {\n                var _duration = drug.keptSameStatus ? shortDuration : duration;\n                var __duration = drug.keptSameStatus ? _duration / 4 : drug.isEntering ? _duration / 6 : _duration; // use a smaller figure for to add to totalDelay for drugs the keep the same status\n                // so that one doesn't have to wait for the previous to finish before it starts moving\n                drug.domDrug.style.transitionDuration = _duration + 'ms';\n                setTimeout(() => {\n                    requestAnimationFrame(() => {\n                        var popperXYZ;\n                        if (!drug.keptSameStatus && !drug.isEntering) {\n                            drug.domDrug._tippy.show();\n                            drug.domDrug.classList.add(s.isMoving);\n                            setTimeout(() => {\n                                popperXYZ = drug.domDrug._tippy.popper.style\n                                    .transform.match(/translate3d\\((.*?)\\)/)[1]\n                                    .split(',').map(xy => parseInt(xy));\n                                drug.domDrug._tippy.popper.style.transitionDuration = _duration + 'ms';\n                                drug.domDrug._tippy.popper.style.transitionTimingFunction = 'ease-in-out';\n                                drug.domDrug._tippy.popper.style.transform = `translate3d(${popperXYZ[0] - drug.deltaX}px, ${popperXYZ[1] - drug.deltaY}px, ${popperXYZ[2]}px)`;\n                                drug.domDrug.style.transform = 'translate(0, 0)';\n                            });\n                        } else {\n                            drug.domDrug.style.transform = 'translate(0, 0)';\n                        }\n                        setTimeout(() => {\n                            drug.domDrug._tippy.hide();\n                            drug.domDrug.classList.remove(s.isTranslated);\n                            drug.domDrug.classList.remove(s.isMoving);\n                            if (i == array.length - 1) {\n                                resolvePlaceDrugs(true);\n                            }\n                        }, _duration);\n                    });\n                }, totalDelay);\n                totalDelay += __duration;\n            });\n        } else {\n            resolvePlaceDrugs(true);\n        }\n    }\n    checkHeight() {\n\n        if (window.innerHeight < this.heightNeeded) {\n            document.body.classList.add(s.squat);\n        } else {\n            document.body.classList.remove(s.squat);\n        }\n\n        function adjustCSSVariables() {\n            var root = document.documentElement;\n            var activeMax = Math.floor((this.heightNeeded - this.unitPadding - this.headerHeight) * (this.maxActive / (this.maxActive + this.maxDiscontinued)));\n            root.style.setProperty('--unit-dimension', this.minUnitDimension + 'px');\n            root.style.setProperty('--header-height', this.headerHeight + 'px');\n            root.style.setProperty('--max-container-height', this.heightNeeded + 'px');\n            root.style.setProperty('--active-max-height', activeMax + 'px');\n            root.style.setProperty('--discontinued-max-height', Math.floor(this.heightNeeded - activeMax - this.headerHeight) + 'px');\n\n        }\n        adjustCSSVariables.call(this);\n    }\n    clearAddedDrugAttributes() {\n        this.model.unnestedData.forEach(drug => {\n            delete drug.previousSlot;\n            delete drug.slot;\n            delete drug.phaseIndex;\n            delete drug.moved;\n            delete drug.previousScreenPosition;\n            delete drug.movedFromProcessedColumn;\n            delete drug.movedFromSamePhase;\n            delete drug.previousMapPosition;\n            delete drug.deltaX;\n            delete drug.deltaY;\n            delete drug.isEntering;\n            delete drug.keptSameStatus;\n        });\n    }\n    clearPhase(phaseIndex, type) {\n        return new Promise(resolveClear => {\n            Array.from(this.columns[type][phaseIndex].children).forEach((drugNode, i, array) => {\n                drugNode.className = `${s.drug} ${s.drugEmpty}`;\n                drugNode.id = '';\n                drugNode.removeAttribute('data-tippy-content');\n                drugNode.innerHTML = '';\n                if (drugNode._tippy) {\n                    drugNode.removeAttribute('tabindex');\n                    drugNode._tippy.destroy();\n                }\n                if (i == array.length - 1) {\n                    resolveClear(true);\n                }\n            });\n        });\n    }\n\n    enterDrugs(enteringDrugs, year, resolveEntering) {\n        enteringDrugs.forEach(drug => {\n            var type = isNaN(drug[year]) ? 'discontinued' : 'active';\n            var phaseIndex = parseInt(drug[year]) - 1;\n            var slot = this.positionMap[type][phaseIndex].length;\n            drug.phaseIndex = phaseIndex;\n            drug.type = type;\n            drug.previousScreenPosition = { top: -3000, left: -3000 };\n            drug.moved = true;\n            drug.slot = slot;\n            drug.isEntering = true;\n            this.mapPositions({ type, phaseIndex, slot, drug });\n        });\n        this.placeDrugs(enteringDrugs.sort(this.sortBySlot).sort(this.sortByPhase), resolveEntering, year);\n    }\n    highlightColumn(i) {\n        this.headers.forEach(h => {\n            h.classList.remove(s.isAnimating);\n        });\n        if (typeof i == 'number') {\n            this.headers[i].classList.add(s.isAnimating);\n        }\n    }\n    invertDrugs(drugs) {\n        return new Promise(resolveInvert => {\n            var filtered = drugs.filter(d => d.moved);\n            if (filtered.length == 0) {\n                resolveInvert(true);\n            }\n            for (let i = 0; i < filtered.length; i++) {\n                filtered[i].domDrug.classList.add(s.isTranslated);\n                filtered[i].domDrug.style.transitionDuration = '0s';\n                let currentScreenPosition = filtered[i].domDrug.getBoundingClientRect();\n                filtered[i].deltaY = filtered[i].previousScreenPosition.top - currentScreenPosition.top;\n                filtered[i].deltaX = filtered[i].previousScreenPosition.left - currentScreenPosition.left;\n            }\n            for (let i = 0; i < filtered.length; i++) {\n                requestAnimationFrame(() => {\n                    filtered[i].domDrug.style.transform = `translate(${filtered[i].deltaX}px, ${filtered[i].deltaY}px)`;\n                    /* need to toggle display of the drugs from none back to block to force browsers to repaint them. otherwise \n                    the invertion doens't appear correctly and drugs will appear to start their animations from the wrong spot */\n                    filtered[i].domDrug.style.opacity = 0.99;\n                    requestAnimationFrame(() => {\n                        filtered[i].domDrug.style.opacity = 1;\n                        if (i == filtered.length - 1) {\n                            resolveInvert(true);\n                        }\n                    });\n                });\n            }\n        });\n    }\n    mapPositions({ type, phaseIndex, slot, drug }) {\n        this.positionMap[type][phaseIndex][slot] = drug;\n    }\n    pausePlay() {\n        if (_dataLayer){\n            GTMPush('ABXAnimation|Pause');\n        }\n        this.playBtn.blur();\n        this.playBtn.removeEventListener('click', this.pausePlayBind);\n        S.setState('isPaused', true);\n        this.playBtn.classList.add(s.willPause);\n    }\n    placeDrugs(drugs, resolvePlaceDrugs, year) {\n        if (drugs.length == 0) {\n            resolvePlaceDrugs(true);\n            return;\n        }\n        for (let i = 0; i < drugs.length; i++) {\n            let slot = this.positionMap[drugs[i].type][drugs[i].phaseIndex].indexOf(drugs[i]);\n            let placeholder = this.columns[drugs[i].type][drugs[i].phaseIndex].children[slot];\n            if (!placeholder) { // new method of moving drugs one column at a time may result in interim state of\n                // a column having to many drugs, ie more than the number of placeholders calculated when the \n                // app first start. here, if placeholder is undefined, create and insert it.\n                let _placeholder = document.createElement('div');\n                _placeholder.classList.add(s.drug, s.drugEmpty);\n                _placeholder.setAttribute('tabindex', 0);\n                _placeholder.setAttribute('data-temporary', true);\n                this.columns[drugs[i].type][drugs[i].phaseIndex].appendChild(_placeholder);\n                placeholder = _placeholder;\n            }\n            drugs[i].domDrug = placeholder;\n        }\n        if (this.animateYears && !this.isBackward) {\n            this.invertDrugs(drugs).then(() => {\n                this.addIdsAndClasses(drugs, year).then(() => {\n                    this.animateDrugs(drugs, resolvePlaceDrugs);\n                });\n            });\n        } else {\n            this.addIdsAndClasses(drugs, year).then(() => {\n                resolvePlaceDrugs(true);\n            });\n        }\n    }\n    play() {\n        this.showPauseOption();\n        this.playYearsBind();\n    }\n    playYears(event, type) {\n\n        if (event == 'replay') {\n            if (_dataLayer){\n                GTMPush('ABXAnimation|Replay');\n            }\n        } else {\n            if (_dataLayer){\n                GTMPush('ABXAnimation|Play');\n            }\n        }\n        new Promise(resolvePlayYears => {\n            var currentYear = type == 'replay' ? this.model.years[0] - 1 : S.getState('year').year;\n            if (+currentYear < this.model.years[this.model.years.length - 1] && !S.getState('isPaused')) {\n                S.setState('year', { year: +currentYear + 1, source: type || 'play' });\n            } else {\n                this.removePauseOption();\n                if (currentYear == this.model.years[this.model.years.length - 1]) {\n                    this.showReplayOption();\n                } else {\n                    this.showPlayOption();\n                }\n                S.setState('isPaused', false);\n                resolvePlayYears(true);\n            }\n        });\n    }\n    populateInitialDrugs(year) {\n        ['active', 'discontinued'].forEach((type, i) => {\n            var typeMatches = i === 0 ? this.model.unnestedData.filter(d => !isNaN(d[year])) : this.model.unnestedData.filter(d => isNaN(d[year]));\n            headers.forEach((phase, j) => {\n                var phaseMatches = typeMatches.filter(d => parseInt(d[year]) === j + 1);\n                phaseMatches.forEach((drug, k) => {\n                    drug.domDrug = this.columns[type][j].children[k];\n                    this.mapPositions({ type, phaseIndex: j, slot: k, drug });\n                });\n                this.addIdsAndClasses(phaseMatches, year);\n            });\n        });\n        //  this.setTippys();\n        this.updateText(year);\n    }\n    recordMapPosition({ type, phaseIndex, slot, drug }) {\n        drug.previousMapPosition = `${type}-${phaseIndex}-${slot}`;\n    }\n    recordScreenPosition(drug) {\n        if (!this.isBackward && this.animateYears) {\n            drug.previousScreenPosition = drug.domDrug.getBoundingClientRect();\n        }\n    }\n    removeTemporaryPlaceholders() {\n        document.querySelectorAll('[data-temporary]').forEach(el => {\n            el.parentElement.removeChild(el);\n        });\n    }\n    replay(e) {\n        this.showPauseOption();\n        this.playYearsBind(e, 'replay');\n    }\n    setTippys(drug = '[data-tippy-content]') {\n        tippy(drug, {\n            arrow: true,\n            distance: 3\n        });\n    }\n    sortBySlot(a, b) {\n        return a.slot - b.slot;\n    }\n    sortByPhase(a, b) {\n        return a.phaseIndex - b.phaseIndex;\n    }\n    switchYears({ year, source }) {\n        return new Promise(resolveYear => {\n            var phaseIndex = headers.length - 1;\n            var previousYear = S.getPreviousState('year').year;\n            this.isBackward = (+previousYear > year);\n            this.disableYearButtons();\n            if (!['play', 'replay'].includes(source)) {\n                this.disablePlayButton();\n            }\n\n            function iteratePhase() {\n                //set up a promise for each phase. this way we can pass the resolve function around and resolve it later,\n                // after animation has finish or sooner if there is no animation\n                this.highlightColumn(phaseIndex);\n                new Promise(resolvePhase => {\n                    // TO DO : need to animate each type separately, resolve a promise when done\n                    function iterateType(type) {\n                        new Promise(resolveType => {\n                            var drugsThatMove = [];\n                            var drugsThatStay = [];\n                            var length = this.positionMap[type][phaseIndex].length;\n                            for (let i = length - 1; i >= 0; i--) {\n                                let drug = this.positionMap[type][phaseIndex][i];\n                                // if the drug being handled now was just moved from another column during the same round\n                                // we don't want to do anything to it again. set _previousYear to year so that it's treated as\n                                // a drug that stays\n                                drug.previousSlot = i;\n                                let _previousYear = drug.movedFromProcessedColumn ? year : previousYear;\n                                \n                                if (drug[year] != drug[_previousYear] && drug[year] != 0) {\n                                    // if drug moves columns, record its position on screen\n                                    this.recordScreenPosition(drug);\n                                    this.recordMapPosition({ type, phaseIndex, slot: i, drug });\n                                    let newType = isNaN(drug[year]) ? 'discontinued' : 'active';\n                                    let newPhaseIndex = parseInt(drug[year]) - 1;\n                                    // add some attributes to the drug\n                                    // put the drug in its new position in the positionMap, ie, the first empty slot of the relevant \"column\"\n                                    this.mapPositions({ type: newType, phaseIndex: newPhaseIndex, slot: this.positionMap[newType][newPhaseIndex].length, drug });\n                                    // remove the drug from the original position. should be ok bc we are looping in reverse. shouldn't leave gaps\n                                    this.positionMap[type][phaseIndex].splice(i, 1);\n                                    \n                                    drug.movedFromProcessedColumn = true;\n                                    drug.moved = true;\n\n                                    // need to mark drugs that move from one type to another but within same phase. ie phase 2 to 2d (discontinued)\n                                    // bc we need to exclude that drug from being processed again in the same phase loop\n                                    drug.movedFromSamePhase = parseInt(drug[year]) === parseInt(drug[_previousYear]);\n\n                                    drugsThatMove.push(drug);\n                                } else if (drug[year] != 0) {\n                                    // may not need to record its position on screen. expensive computation\n                                    drugsThatStay.push(drug);\n                                    this.recordMapPosition({ type, phaseIndex, slot: i, drug });\n                                } else { // phase value for the drug this year is zero. ie, moving backward in years\n                                    // TO DO : also put in another place \"exiting\"\n                                    this.recordMapPosition({ type, phaseIndex, slot: i, drug });\n                                    this.positionMap[type][phaseIndex].splice(i, 1);\n                                    //this.clearAddedDrugAttributes(drug);\n                                }\n\n                                drug.phaseIndex = parseInt(drug[year]) - 1;\n                                drug.type = isNaN(drug[year]) ? 'discontinued' : 'active';\n                            }\n                            // drugs that stay (in a column) may still moved, ie, change slots.\n                            // compare their previous slot with their new one\n                            drugsThatStay.reverse().forEach((drug, i) => {\n                                if (drug.previousSlot != i) {\n                                    drug.moved = true;\n                                    drug.keptSameStatus = true;\n                                    this.recordScreenPosition(drug);\n                                } else {\n                                    drug.moved = false;\n                                }\n                            });\n                            drugsThatStay.reverse();\n                            this.clearPhase(phaseIndex, type).then(() => {\n                                this.placeDrugs([...drugsThatMove, ...drugsThatStay.reverse()], resolveType, year);\n                            });\n                        }).then(() => {\n                            if (type == 'active') {\n                                type = 'discontinued';\n                                iterateTypeBind(type);\n                            } else {\n                                resolvePhase(true);\n                            }\n                        }); // end Promise resolveType\n                    } // end fn iterateType\n                    var iterateTypeBind = iterateType.bind(this);\n                    iterateTypeBind('active');\n                }).then(() => {\n                    if (phaseIndex > 0) {\n                        phaseIndex--;\n                        iteratePhaseBind();\n                    } else {\n                        //gone through the phases and need to place entering drugs\n                        let enteringDrugs = this.model.unnestedData.filter(d => d[previousYear] == 0 && d[year] != 0);\n                        \n                        new Promise(resolveEntering => {\n                            this.enterDrugs(enteringDrugs, year, resolveEntering)\n                        }).then(() => {\n                            //this.setTippys();\n                            this.updateText(year);\n                            this.removeTemporaryPlaceholders();\n                            this.clearAddedDrugAttributes();\n                            setTimeout(() => {\n                                resolveYear(true);\n                                this.highlightColumn();\n                            }, year == this.model.years[0] && source == 'replay' ? 500 : 0);\n                        });\n                    }\n                }); // end Promise resolvePhase\n\n            } // end iteratePhase\n            var iteratePhaseBind = iteratePhase.bind(this);\n            //setTimeout(() => {\n            iteratePhaseBind();\n            // }, source == 'replay' ? 2000 : 0);\n        }).then(() => {\n            this.enableYearButtons();\n            // this.showPlayOption();\n            this.enablePlayButton();\n        });\n    }\n    update(msg, data) { // here data is an array. [0]: year; [1]: null or `resolve` from the Promise. needs to resolve true when all transitions of current update are finished . 3. observation index\n        S.setState('isPaused', false);\n        // find btn to be deselected and change its appearance\n        var toBeDeselectedActive = document.querySelector('.' + s.yearButtonActive); //observationToCheckAgainst = !S.getState('isBackward') ? 0 : 1;\n        toBeDeselectedActive.classList.remove(s.yearButtonActive, s.observation, s.observation0, s.observation1)\n\n        // find button that matches new selection and change its appearance\n        var btn = document.querySelector('button[value=\"' + data.year + '\"]');\n\n        //toggle observation 0 or observation 1\n        btn.classList.add(s.yearButtonActive);\n\n        if (data.source === 'load') {\n            this.populateInitialDrugs(data.year);\n        }\n        if (data.source === 'yearButton') {\n            this.switchYears(data);\n        }\n        if (['play', 'replay'].includes(data.source)) {\n            this.switchYears(data).then(() => {\n                setTimeout(() => {\n                    this.playYears();\n                }, 500);\n            });\n        }\n    }\n    updateText(year) {\n        var totalNonzero = this.model.unnestedData.filter(d => parseInt(d[year]) !== 0),\n            totalActive = totalNonzero.filter(d => d[year] == 5).length,\n            totalDiscontinued = totalNonzero.filter(d => isNaN(d[year])).length;\n\n        if (+year > this.model.years[0]) {\n            this.totals.classList.add('is-subsequent');\n        } else {\n            this.totals.classList.remove('is-subsequent');\n        }\n        if (this.approvedSpan.innerHTML != totalActive) {\n            document.querySelector('#total-approved').fadeInContent(totalActive);\n        }\n        if (this.discontinuedSpan.innerHTML != totalDiscontinued) {\n            document.querySelector('#total-discontinued').fadeInContent(totalDiscontinued);\n        }\n    }\n}","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"src-views-viz-view--container\",\"superSquat\":\"src-views-viz-view--superSquat\",\"activeContainer\":\"src-views-viz-view--activeContainer\",\"headerContainer\":\"src-views-viz-view--headerContainer\",\"squat\":\"src-views-viz-view--squat\",\"column\":\"src-views-viz-view--column\",\"discontinuedContainer\":\"src-views-viz-view--discontinuedContainer\",\"drug\":\"src-views-viz-view--drug\",\"drugEmpty\":\"src-views-viz-view--drugEmpty\",\"isTranslated\":\"src-views-viz-view--isTranslated\",\"novel\":\"src-views-viz-view--novel\",\"urgent\":\"src-views-viz-view--urgent\",\"gramNegative\":\"src-views-viz-view--gramNegative\",\"wasDiscontinued\":\"src-views-viz-view--wasDiscontinued\",\"isMoving\":\"src-views-viz-view--isMoving\",\"headerDiv\":\"src-views-viz-view--headerDiv\",\"isAnimating\":\"src-views-viz-view--isAnimating\",\"phaseFull\":\"src-views-viz-view--phaseFull\",\"phaseAbbr\":\"src-views-viz-view--phaseAbbr\",\"controlContainer\":\"src-views-viz-view--controlContainer\",\"playButton\":\"src-views-viz-view--playButton\",\"yearButton\":\"src-views-viz-view--yearButton\",\"inputWrapper\":\"src-views-viz-view--inputWrapper\",\"pause\":\"src-views-viz-view--pause\",\"replay\":\"src-views-viz-view--replay\",\"willPause\":\"src-views-viz-view--willPause\",\"pauseSpinner\":\"src-views-viz-view--pauseSpinner\",\"yearButtonActive\":\"src-views-viz-view--yearButtonActive\",\"inputLabel\":\"src-views-viz-view--inputLabel\"};","import Element from '@UI/element';\n\n\nexport default class VisuallyHidden extends Element {\n    \n    prerender(){\n         //container\n        var view = super.prerender();\n        this.name = 'VisuallyHidden';\n        if ( this.prerendered && !this.rerender) {\n            return view; // if prerendered and no need to render (no data mismatch)\n        }\n        view.classList.add('visually-hidden');\n        this.model.nestedByYear.forEach(year => {\n            var heading = document.createElement('h2');\n            view.appendChild(heading);\n            heading.textContent = year.year;\n            year.values.forEach(phase => {\n                var subheading = document.createElement('h3');\n                subheading.textContent = phase.phase === 4 ? 'New drug application' : phase.phase === 5 ? 'Approved' : 'Phase ' + phase.phase;\n                view.appendChild(subheading);\n                ['Active','Inactive'].forEach((status,i) => {\n                    var statusLabel = document.createElement('h4');\n                    statusLabel.textContent = status;\n                    view.appendChild(statusLabel);\n                    var list = document.createElement('ul');\n                    var matches = phase.values.filter(d => {\n                        if ( i == 0 ){\n                            return !isNaN(d[year.year]);\n                        }\n                        return isNaN(d[year.year]);\n                    });\n                    matches.forEach(drug => {\n                        var item = document.createElement('li');\n                        item.textContent = `${drug.name} (${drug.company})`;\n                        list.appendChild(item);\n                    });\n                    view.appendChild(list);\n                });\n            });\n\n        });\n        return view;\n    }\n    init(){\n    }\n}","import Router from '@Router';\nexport default class PCTApp {\n    constructor(container, options){\n        this.container = container;\n        this.el = document.querySelector(container);\n        Object.keys(options).forEach(option => {\n            this[option] = options[option];\n        });\n    }\n    init(routerOptions){\n        if ( this.needsRouter ){ // comes from options object\n            this.router = new Router();\n            this.router.init(routerOptions);\n        }\n        this.disableHoverOnTouch();\n    }\n    disableHoverOnTouch(){\n    // HT: https://stackoverflow.com/a/30303898\n        var hasHoverClass = false;\n        var container = document.body;\n        var lastTouchTime = 0;\n\n        function enableHover() {\n            // filter emulated events coming from touch events\n            if (new Date() - lastTouchTime < 500) return;\n            if (hasHoverClass) return;\n\n            container.classList.add('has-hover');\n            hasHoverClass = true;\n        }\n\n        function disableHover() {\n            if (!hasHoverClass) return;\n            container.classList.remove('has-hover');\n            hasHoverClass = false;\n        }\n\n        function updateLastTouchTime() {\n            lastTouchTime = new Date();\n        }\n\n        document.addEventListener('touchstart', updateLastTouchTime, true);\n        document.addEventListener('touchstart', disableHover, true);\n        document.addEventListener('mousemove', enableHover, true);\n\n        enableHover();\n    }\n    createComponent(model, component, selector, _options){ \n        var options = Object.create({\n            children: [],\n            data: null,\n            model,\n            parent: null,\n            rerenderOnDataMismatch: false\n        });\n        if ( _options !== null && typeof _options === 'object' ){\n            for ( let key in _options ){\n                if ( _options.hasOwnProperty(key) ){\n                    options[key] = _options[key];\n                }\n            }\n        }\n        \n        return new component(selector, options);\n    }\n}","export default class Router { // this could be integrated with stateful dead\n    /*\n    Router offers basic shared functions for all routers. Methods for updating  history state and updating the hash url. Array of subscriptions\n    that affect the url is passed in. The PubSub module is passed in. setHash and decodeHash functions are passed in bc they will be diff\n    for each app. views are passed in so that the resolutions of their promises can be tracked and acted upon (ie router decodes only after \n    all views are ready)\n    */\n    init(routerOptions){\n        \n        if ( routerOptions === undefined || typeof routerOptions !== 'object' ){\n            throw 'router.init method requires a config object as parameter 1'\n        }\n        if ( typeof routerOptions.encode !== 'function' || typeof routerOptions.decode !== 'function' || !Array.isArray(routerOptions.views) || typeof routerOptions.PS !== 'object' ){\n            throw 'routerOptions object needs encode, decode, views, and PS properties. encode and decode must be functions; views is an array of views from the app; PS needs to be the PubSub setter.'\n        }\n        this.stateObj = {};\n        this.hashState = routerOptions.encode;\n        this.decodeHash = routerOptions.decode;\n        this.viewPromises = routerOptions.views.map(each => each.isReady); // view.isReady is a promised resolved true after the view is rendered\n        this.PS = routerOptions.PS;\n        \n        Promise.all(this.viewPromises).then(() => {\n            \n            this.decodeHash();\n        });\n        this.PS.setSubs(routerOptions.subscriptions.map(each => { // subscriptions that matter for router are made to trigger hashChange method when published\n            var arr = [each, (msg,data) => {\n                this.hashChange.call(this,msg,data);\n            }];\n            \n            return arr;\n        }));\n    }\n    hashChange(msg,data){\n        this.setStateObj(msg,data);\n        this.hashState();\n        this.replaceState();\n    }\n    setStateObj(msg, data){\n        this.stateObj[msg] = data;\n        \n    }\n    replaceState(){    \n        window.history.replaceState(this.stateObj,'',this.hashString)\n    }\n\n}","module.exports = \"<section id=\\\"intro\\\">\\n    <div class=\\\"js-inner-content\\\">\\n    </div>\\n</section>\\n<section id=\\\"section-comparison\\\">\\n    <div class=\\\"js-inner-content\\\">\\n        <h2>Antibiotics in Development Since 2014</h2>\\n        <div class=\\\"abx-legend\\\">\\n            <div class=\\\"abx-legend--wrapper\\\">\\n                <p class=\\\"abx-legend--item abx-legend--item--abx\\\">Antibiotic</p>\\n                <p class=\\\"abx-legend--item abx-legend--item--urgent\\\">Expected to treat CDC urgent pathogen</p>\\n            </div>\\n            <div class=\\\"abx-legend--wrapper\\\">\\n                <p class=\\\"abx-legend--item abx-legend--item--novel\\\">Novel antibiotics</p>\\n                <p class=\\\"abx-legend--item abx-legend--item--gram\\\">Expected to treat Gram-negative ESKAPE pathogens</p>\\n            </div>\\n        </div>\\n        <div id=\\\"abx-visualization\\\">\\n        </div>\\n        <div id=\\\"abx-totals\\\">\\n            <p>Total <strong>approved</strong> antibiotics <span class=\\\"since-2014\\\">since 2014</span>: <span id=\\\"total-approved\\\" class=\\\"total-span\\\"></span></p>\\n            <p>Total <strong>discontinued</strong> antibiotics <span class=\\\"since-2014\\\">since 2014</span>: <span id=\\\"total-discontinued\\\" class=\\\"total-span\\\"></span></p>\\n        </div>\\n        <a name=\\\"summary\\\" id=\\\"summary\\\"></a>\\n        <div id=visually-hidden-container>\\n\\n        </div>\\n    </div>\\n</section>\\n<div id=\\\"abx-notes\\\"></div>\\n<footer class=\\\"download-resources\\\">\\n    <div>\\n        <p class=\\\"flex\\\"><strong>Resources: </strong>\\n            <span class=\\\"flex\\\">\\n                <a class=\\\"pct-download\\\" href=\\\"https://www.pewtrusts.org/en/research-and-analysis/issue-briefs/2020/04/tracking-the-global-pipeline-of-antibiotics-in-development\\\">Methodology</a>\\n                <a class=\\\"pct-download\\\" href=\\\"https://www.pewtrusts.org/en/research-and-analysis/data-visualizations/2014/antibiotics-currently-in-clinical-development\\\">Report</a>\\n            </span>\\n        </p>\\n    </div>\\n</footer>\";","module.exports = \"<p>The Pew Charitable Trusts has tracked the pipeline of antibiotics in clinical development since 2014 and has aggregated updates into an interactive tool that illustrates trends in the pipeline—as drugs are either approved, discontinued from development, or remain stagnant. This longitudinal assessment underscores the long-standing concerns of scientists, doctors, public health officials, and other stakeholders regarding the dangerously low number of antibiotics in development to address current and future patient needs, particularly for treating the most urgent bacterial threats, such as Gram-negative pathogens, and those prioritized by the <a href=\\\"https://www.cdc.gov/drugresistance/biggest_threats.html\\\">Centers for Disease Control and Prevention</a> and the <a href=\\\"https://www.who.int/news-room/detail/27-02-2017-who-publishes-list-of-bacteria-for-which-new-antibiotics-are-urgently-needed\\\">World Health Organization</a>.</p>\\n<p>Click the play button to see the evolution of the antibiotic pipeline since 2014, or click on an individual year to see the status of the pipeline at a particular point in time. (To view without animation, uncheck the “animate change” box.) To see additional information about each drug, hover over or tap any of the rectangles.</p>\\n<p class=\\\"visually-hidden\\\">Visually impaired users may wish to skip to <a href=\\\"#summary\\\">the summary of the content</a>.</p>\";","module.exports = \"<p><strong>Notes:</strong> Candidates included in this data visualization are consistent with Pew’s methodology for tracking antibiotics in clinical development. The analysis captures the status of antibiotics in the pipeline beginning in 2014, including those approved by the FDA and other regulatory agencies that year. More information about methodology and the full underlying data can be found in <a href=\\\"https://www.pewtrusts.org/en/research-and-analysis/data-visualizations/2014/antibiotics-currently-in-clinical-development\\\">Pew’s latest pipeline analysis</a>. This interactive tool is updated annually. </p>\\n\";"],"sourceRoot":""}