{"version":3,"sources":["webpack:///./node_modules/topojson-client/src/identity.js","webpack:///./node_modules/topojson-client/src/transform.js","webpack:///./node_modules/topojson-client/src/feature.js","webpack:///./node_modules/topojson-client/src/reverse.js","webpack:///./app/scripts/colors.ts","webpack:///./app/scripts/components/BalancePower.js","webpack:///./app/scripts/components/OtherCandidate.js","webpack:///./app/scripts/utils/competitive.ts","webpack:///./app/scripts/components/Contest.tsx","webpack:///./app/scripts/components/AnimatedNumber.tsx","webpack:///./app/scripts/components/TinyMap.tsx","webpack:///./app/scripts/utils/tooltip-html.ts","webpack:///./node_modules/d3-jetpack/src/translate-selection.js","webpack:///./node_modules/d3-jetpack/src/parseAttributes.js","webpack:///./node_modules/d3-jetpack/src/insert.js","webpack:///./node_modules/d3-jetpack/src/at.js","webpack:///./node_modules/d3-jetpack/src/st.js","webpack:///./node_modules/d3-jetpack/src/wordwrap.js","webpack:///./node_modules/d3-jetpack/node_modules/d3-array/src/sum.js","webpack:///./node_modules/d3-jetpack/index.js","webpack:///./node_modules/d3-jetpack/src/append.js","webpack:///./node_modules/d3-jetpack/src/parent.js","webpack:///./node_modules/d3-jetpack/src/selectAppend.js","webpack:///./node_modules/d3-jetpack/src/tspans.js","webpack:///./node_modules/d3-jetpack/src/appendMany.js","webpack:///./app/scripts/utils/format-numbers.js","webpack:///./app/scripts/components/MiniBarChart.js","webpack:///./app/scripts/components/AnalysisTableRow.tsx","webpack:///./app/scripts/components/AnalysisTable.tsx","webpack:///./app/scripts/components/FramesChild.js","webpack:///./app/scripts/components/HeadshotCandidateRow.tsx","webpack:///./app/scripts/components/AsyncComponent.js","webpack:///./app/scripts/vendor/flatqueue.js","webpack:///./app/scripts/vendor/flatbush.js","webpack:///./app/scripts/utils/prepare-topojson.ts","webpack:///./app/scripts/components/MapTypeButtons.tsx","webpack:///./app/scripts/utils/format-percent.ts","webpack:///./config/modern-polyfills.js","webpack:///./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","webpack:///./node_modules/@babel/runtime/helpers/esm/slicedToArray.js","webpack:///./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","webpack:///./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js","webpack:///./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","webpack:///./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","webpack:///./app/scripts/components/PctChange.tsx","webpack:///./app/scripts/utils/winner-class.ts","webpack:///../../index.ts","webpack:///./app/scripts/endpoints.ts","webpack:///./app/scripts/utils/load-json-script.js","webpack:///./app/scripts/utils/sum-values.js","webpack:///./app/scripts/components/CandidateRow.tsx","webpack:///./app/scripts/components/VoteBar.tsx","webpack:///./app/scripts/constants.ts","webpack:///./app/scripts/EmbedApp.tsx","webpack:///./app/scripts/packs/embed.tsx","webpack:///./app/scripts/election-utils.ts","webpack:///./app/scripts/utils/get-json.js","webpack:///./app/scripts/utils/shallow-equal.ts","webpack:///./app/scripts/components/PureComponent.tsx","webpack:///../src/utils.mjs","webpack:///../src/constants.mjs","webpack:///../src/framer.mjs","webpack:///../src/frames.mjs","webpack:///./app/scripts/utils/find.ts","webpack:///./app/scripts/components/PartyPill.tsx"],"names":["x","transform","identity","x0","y0","kx","scale","ky","dx","translate","dy","input","i","j","n","length","output","Array","topology","o","objects","type","features","geometries","map","feature","id","bbox","properties","geometry","object","transformPoint","arcs","arc","points","pop","a","k","push","array","t","reverse","point","p","line","ring","polygon","coordinates","GOVERNOR","name","color","lean_color","rgbaColor","SENATE","RAILROAD","LIEUTENANT_GOVERNOR","partyColor","party","Republican","Democrat","Libertarian","Green","ATTORNEY_GENERAL","COMPTROLLER","LAND_COMMISSIONER","AGRICULTURE_COMMISSIONER","SHOWCASE_COLORS","Governor","Comptroller","REPUBLICAN","DEMOCRAT","NEUTRAL","TIE","UNKNOWN_SEAT","stroke","BalancePower","Component","constructor","super","this","state","width","bodyWidth","createGraphic","bind","redrawGraphic","getContainerWidth","componentDidMount","_this$props","props","className","pastData","currentData","window","addEventListener","componentDidUpdate","_this$props2","layoutSeats","total","minRows","arguments","undefined","defaultRows","rowOptions","evenRows","find","option","seats","d3","column","Math","floor","row","columns","rows","half","sideColumns","ceil","hasMiddleSeat","left","right","seat","middle","concat","fullRows","extra","forEach","height","drawSeats","selector","_ref","segments","labels","center","halfway","description","fullWidth","minSeat","layout","seatSize","max","_layout","marginTop","aboveSeats","labelRows","centerLine","labelsHeight","cell","min","chartRoom","getChartRoom","seatsRoom","size","optionCell","dotRadius","chartWidth","chartBottom","centerX","chartLeft","container","empty","majorityText","svg","append","attr","style","unknown","d","seatSegments","segment","middleIndex","findIndex","isLeft","indexOf","indexes","filter","sort","b","inColumn","some","open","selectAll","data","enter","text","labelTop","lines","anchor","_ref2","centerText","textWidth","node","getComputedTextLength","clearance","pastVacant","vacant","isSenate","getZeroUncontested","num","seatText","remove","republican","democrat","safeRepublican","uncontested_republican","republican_not_up_for_election","safeDemocrat","uncontested_democrat","democrat_not_up_for_election","short","leftLabels","rightLabels","safeName","currentOnly","body","document","getComputedStyle","minHeight","parseFloat","used","paddingTop","paddingBottom","borderTopWidth","borderBottomWidth","from","children","child","position","getBoundingClientRect","room","offsetWidth","_this$props3","_this$getContainerWid2","setState","componentWillUnmount","removeEventListener","render","_this$props4","chamber","h","class","chamberText","OtherCandidate","isViewable","candidateCount","embedType","onClick","classes","cx","xlinkHref","competitiveSlugs","isCompetitive","contest","Set","loadJsonScript","election_type","has","office_slug","PLAIN_SPECIAL_ELECTIONS","WINNER_BOX_CLASSES","rep","dem","lib","ind","gre","withCandidateKey","candidate","key","attributes","_objectSpread","COMPETITIVE_NOTE","competitive_note","block","value","join","Contest","viewAllCandidates","onViewableToggle","prevState","directory_slug","contestTitle","columnCount","isShowcaseRace","renderCandidate","annotations","notes","tableHeader","isHomepage","asOf","feedSource","source","candidatesRender","showRedrawn","converter","PreactHTMLConverter","shouldDisplayResult","contest_result","get_directory_slug","office","getDistrictNum","division_type","office_division","candidates","totalVotes","sumValues","candidacies","uncontested","sort_candidates_by_party","sort_candidates_by_votes","pct_votes","formatPercent","estimated_votes_mid","eevp","pct_votes_turnout","pct_votes_turnout_zero_winner","pct_votes_turnout_w_uncontested","text_conditionals","pct_votes_explain","text_conditional_winner_zero","ManualoverrideSource","showcaseClass","seat__races","seat__highlight_races","hasSpecialStyling","includes","raceClass","seatClass","klaxon","alert_winners","alert_conditionals","hasTurnoutmodel","winner","is_winner","winnerColorClass","winnerClass","winnerCheckClass","isUncontestedResult","boxWinner","showWinnerBox","winnerCustomColor","isArray","c","winnerBoxClass","slice","toLowerCase","contestMetricsClass","homepage__metrics","precinctsClass","IsAnnotations","IsNoted","target","href","title","rel","aria-hidden","isCanvass","intcomma","pollinglocationsreporting","total_pollinglocations","pollinglocations_reporting_percent","toFixed","convert","idx","visibleCandidatesCount","defaultProps","includeCountyRundown","Odometer","options","auto","AnimatedNumber","odometerFormat","odometerEl","createElement","el","appendChild","odometer","format","theme","duration","precision","formatDigits","digits","wholePart","split","digit","addDigit","getFractionalDigitCount","_len","values","_key","apply","keepTrailingZeros","shouldComponentUpdate","nextProps","update","srEl","textContent","ref","TinyMap","_defineProperty","createMap","redrawMap","findLeading","setUpCandidateMap","candidateMap","setUpCountyMap","counties","countyMap","fips","category","fillStyle","county","get","total_votes","sortedResults","entries","results","leader","second","leadingId","cand","geos","prepareTopoJSON","projection","reflectY","fitSize","collection","pathGenerator","g_tinymap","inCategory","foundCounty","countiesData","shaded","Number","fill","tooltipHTML","html","linkBase","replace","xy","dim","getBBox","call","parts","shift","tag","constantNull","camelCaseAttrs","test","addStyle","sel","wrapPx","addPx","match","fn","val","CHAR_W","A","B","C","D","E","e","F","f","G","g","H","I","J","K","L","l","M","m","N","O","P","Q","q","R","r","S","s","T","U","u","V","v","W","w","X","Y","y","Z","z","maxCharactersPerLine","minCharactersPerLine","monospace","w1","maxChars","minChars","maxLineW","minLineW","words","w2","lw","round","ww","valueof","sum","index","char_w","selection","prototype","translateSelection","transition","create","parseAttributes","creator","select","insert","before","insertBefore","parent","parents","parentNode","selectAppend","tspans","lh","appendMany","console","warn","temp","at","st","prop","property","customNumFormat","intword","MiniBarChart","breakPoint","onResize","resizeFrame","categoryNumbers","officeSlug","maxNum","_this$getContainerWid","_this$state","newcand","obj","last_name","category_votes","labelWidth","measureLabels","margin","top","bottom","showPrecinctsReporting","diagonalStripePattern","localeCompare","range","domain","isNaN","entry","padding","bandwidth","ticks","tickFormat","tickSize","wordwrap","nodes","foundCandidate","customBarNumFormat","axis","longest","grid","base","parentElement","closest","querySelector","gap","columnGap","tinyMap","firstElementChild","clientWidth","_this$getContainerWid3","requestAnimationFrame","cancelAnimationFrame","AnalysisTableRow","categoryClass","categoryLabel","geocategories","category_text","capfirst","categoryExplain","geocategories_explain","category_explain","categoryTooltip","geocategories_tooltip","category_tooltip","tooltipId","aria-label","aria-describedby","role","dangerouslySetInnerHTML","__html","AnalysisTable","result","arr","criteria","newObj","summedEntries","arrayByCategories","reduce","acc","currentValue","Object","item","totals","arrayToGetMost","votes_still_to_count","estimated_votes","largest_number","createArray","findCounties","findCounties2","APTotalVotesToCount","arrayCounties","keys","parseInt","objectCategories","arrayToGetLargest","context","categories_headline","regions_tooltip","categories","FramesChild","createRef","polling","initFrameAndPoll","sendFrameHeight","klass","formatVotes","formatPct","pctValue","votes","HeadshotCandidateRow","PureComponent","getColor","ballotName","contestIsCalled","candidateId","contestResult","isIncumbent","isWinner","totalVotesInContest","candidateColors","divStyle","checkStyle","IsAsterisk","rowClass","checkClass","PartyPill","VoteBar","PctChange","isCalled","Header","colSpan","asyncComponent","importComponent","PreactComponent","component","then","default","FlatQueue","ids","clear","pos","parentValue","halfLength","bestIndex","bestValue","rightValue","peek","peekValue","ARRAY_TYPES","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","Flatbush","ArrayBuffer","Error","_Uint8Array","_Uint8Array2","_slicedToArray","magic","versionAndType","_Uint16Array","nodeSize","_Uint32Array","numItems","ArrayType","numNodes","_levelBounds","IndexArrayType","arrayTypeIndex","nodesByteSize","BYTES_PER_ELEMENT","_boxes","_indices","_pos","minX","minY","maxX","maxY","Infinity","set","_queue","add","finish","hilbertValues","hilbert","boxes","indices","pivot","swap","end","nodeMinX","nodeMinY","nodeMaxX","nodeMaxY","nodeIndex","search","filterFn","level","queue","neighbors","maxResults","maxDistance","maxDistSquared","upperBound","axisDist","dist","i0","i1","roadsObject","placesObject","urbanAreasObject","roads","places","urban_areas","bounds","heightRatio","MAP_TYPES","label","MapTypeButtons","active","onSelect","require","_arrayLikeToArray","Symbol","iterator","next","done","toString","TypeError","PARTY_CLASSES","rounded","direction","changeCount","componentWillReceiveProps","prev","clearTimeout","timer","setTimeout","partyClass","PI","geom","feat","isNumber","lineString","isObject","HOMEPAGE_URL","STORY_API_URL","showBubbleMap","showCategoriesMap","RESULTS_IN_USE","elementId","element","getElementById","getAttribute","JSON","parse","CandidateRow","candidatesNum","candidateColor","isMapRow","countyHeader","coordEach","geojson","callback","excludeWrapCoord","stopG","coords","geometryMaybeCollection","isGeometryCollection","wrapShrink","coordIndex","isFeatureCollection","isFeature","stop","featureIndex","geomIndex","multiFeatureIndex","geometryIndex","geomType","index_default","recompute","coord","LENGTH_OF_CHECK_INTERVAL","LayeredMap","pastPowerBalance","analysisData","SENATE_RACE","slug","GOVERNOR_RACE","SWITCHER_SETS","RESULTS_PAGE_URL","BALANCE_TITLES","OFFICE_ANCHORS","MapSwitcher","updateResultsLink","link","race","races","setAttribute","renderMap","aria-selected","BalanceEmbed","pass","App","contests","mapTypes","geoIdentity","fetchData","getJSONWithLastModified","lastModified","lastUpdatedFormat","Date","startTimer","clearTimer","useButtonLink","_link$parentElement","items","buttonLink","hasMap","_ref3","classList","_this","_ref4","_loop","_ref6","findContests","specialSlug","matches","general","annotationType","renderTable","determineDistrictTitle","partyName","_ref7","is_called","is_incumbent","candidatesRenderFor","renderMapTable","showLastUpdated","_this$props5","determineContestTitle","_ref8","sizerContests","mapId","typeMap","other","typeRace","precinctsReporting","precincts_reporting","minLegendRows","most","renderCategories","renderSwitcher","sizerSlugs","raceSlug","Boolean","renderBalance","chamberContests","prepareBalanceData","total_current","_ref9","EMBED_TYPES","TYPE_ALIASES","region","params","URLSearchParams","location","EmbedApp","journalize","date","time","aptime","toUpperCase","toDateString","apdate","chunk","_","delay","ms","NaN","PARTY_SORT_ORDER","PARTY_SORT_ORDER_TOP","TT_directory_slugs","vote_pct","cand_num","label_conditionals","winner_conditionals","trim","division_number","determineContestTitleYourRaces","jsonResponse","res","ok","status","statusText","json","getJSON","init","fetch","header","headers","getTime","hOP","hasOwnProperty","is","shallowEqual","objA","objB","keysA","keysB","allowfullscreen","referrerpolicy","sandbox","src","documentElement","offsetHeight","postMessage","sentinel","setInterval","removeChild","iframe","contentWindow","predicate","excludeInitial","partyPrefix","partyInitial","memoize"],"mappings":"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","file":"embed.b048dcf127.mjs","sourcesContent":["export default function(x) {\n  return x;\n}\n","import identity from \"./identity.js\";\n\nexport default function(transform) {\n  if (transform == null) return identity;\n  var x0,\n      y0,\n      kx = transform.scale[0],\n      ky = transform.scale[1],\n      dx = transform.translate[0],\n      dy = transform.translate[1];\n  return function(input, i) {\n    if (!i) x0 = y0 = 0;\n    var j = 2, n = input.length, output = new Array(n);\n    output[0] = (x0 += input[0]) * kx + dx;\n    output[1] = (y0 += input[1]) * ky + dy;\n    while (j < n) output[j] = input[j], ++j;\n    return output;\n  };\n}\n","import reverse from \"./reverse.js\";\nimport transform from \"./transform.js\";\n\nexport default function(topology, o) {\n  if (typeof o === \"string\") o = topology.objects[o];\n  return o.type === \"GeometryCollection\"\n      ? {type: \"FeatureCollection\", features: o.geometries.map(function(o) { return feature(topology, o); })}\n      : feature(topology, o);\n}\n\nfunction feature(topology, o) {\n  var id = o.id,\n      bbox = o.bbox,\n      properties = o.properties == null ? {} : o.properties,\n      geometry = object(topology, o);\n  return id == null && bbox == null ? {type: \"Feature\", properties: properties, geometry: geometry}\n      : bbox == null ? {type: \"Feature\", id: id, properties: properties, geometry: geometry}\n      : {type: \"Feature\", id: id, bbox: bbox, properties: properties, geometry: geometry};\n}\n\nexport function object(topology, o) {\n  var transformPoint = transform(topology.transform),\n      arcs = topology.arcs;\n\n  function arc(i, points) {\n    if (points.length) points.pop();\n    for (var a = arcs[i < 0 ? ~i : i], k = 0, n = a.length; k < n; ++k) {\n      points.push(transformPoint(a[k], k));\n    }\n    if (i < 0) reverse(points, n);\n  }\n\n  function point(p) {\n    return transformPoint(p);\n  }\n\n  function line(arcs) {\n    var points = [];\n    for (var i = 0, n = arcs.length; i < n; ++i) arc(arcs[i], points);\n    if (points.length < 2) points.push(points[0]); // This should never happen per the specification.\n    return points;\n  }\n\n  function ring(arcs) {\n    var points = line(arcs);\n    while (points.length < 4) points.push(points[0]); // This may happen if an arc has only two points.\n    return points;\n  }\n\n  function polygon(arcs) {\n    return arcs.map(ring);\n  }\n\n  function geometry(o) {\n    var type = o.type, coordinates;\n    switch (type) {\n      case \"GeometryCollection\": return {type: type, geometries: o.geometries.map(geometry)};\n      case \"Point\": coordinates = point(o.coordinates); break;\n      case \"MultiPoint\": coordinates = o.coordinates.map(point); break;\n      case \"LineString\": coordinates = line(o.arcs); break;\n      case \"MultiLineString\": coordinates = o.arcs.map(line); break;\n      case \"Polygon\": coordinates = polygon(o.arcs); break;\n      case \"MultiPolygon\": coordinates = o.arcs.map(polygon); break;\n      default: return null;\n    }\n    return {type: type, coordinates: coordinates};\n  }\n\n  return geometry(o);\n}\n","export default function(array, n) {\n  var t, j = array.length, i = j - n;\n  while (i < --j) t = array[i], array[i++] = array[j], array[j] = t;\n}\n","// This is where we set up the custom colors for the maps\n\nlet opacity = '0.4';\n\nconst GOVERNOR = [\n  {\n    name: 'Greg Abbott',\n    color: '#EF564A',\n    lean_color: '#F6A79D',\n    rgbaColor: 'rgba(239,86,74,' + opacity + ')',\n  },\n  {\n    name: \"Gina Hinojosa\",\n    color: '#1755c5',\n    lean_color: '#6DACD3',\n    rgbaColor: 'rgba(23,85,194,' + opacity + ')',\n  },\n  {\n    name: 'Pat Dixon',\n    color: '#be9304',\n    lean_color: '#edc74a',\n    rgbaColor: 'rgba(190, 147, 4,' + opacity + ')',\n  },\n];\n\nconst SENATE = [\n  {\n    name: 'Ken Paxton',\n    color: '#EF564A',\n    lean_color: '#F6A79D',\n    rgbaColor: 'rgba(239,86,74,' + opacity + ')',\n  },\n  {\n    name: 'James Talarico',\n    color: '#1755c5',\n    lean_color: '#6DACD3',\n    rgbaColor: 'rgba(23,85,194,' + opacity + ')',\n  },\n  {\n    name: 'Ted Brown',\n    color: '#be9304',\n    lean_color: '#edc74a',\n    rgbaColor: 'rgba(190, 147, 4,' + opacity + ')',\n  },\n];\n\nconst RAILROAD = [\n  {\n    name: 'Bo French',\n    color: '#EF564A',\n    lean_color: '#F6A79D',\n    rgbaColor: 'rgba(239,86,74,' + opacity + ')',\n  },\n  {\n    name: 'Jon Rosenthal',\n    color: '#1755c5',\n    lean_color: '#6DACD3',\n    rgbaColor: 'rgba(23,85,194,' + opacity + ')',\n  },\n  {\n    name: 'Arthur DiBianca',\n    color: '#be9304',\n    lean_color: '#edc74a',\n    rgbaColor: 'rgba(190, 147, 4,' + opacity + ')',\n  },\n];\n\nconst LIEUTENANT_GOVERNOR = [\n  {\n    name: 'Dan Patrick',\n    color: '#EF564A',\n    lean_color: '#F6A79D',\n    rgbaColor: 'rgba(239,86,74,' + opacity + ')',\n  },\n  {\n    name: 'Vikki Goodwin',\n    color: '#1755c5',\n    lean_color: '#6DACD3',\n    rgbaColor: 'rgba(23,85,194,' + opacity + ')',\n  },\n  {\n    name: 'Anthony Cristo',\n    color: '#be9304',\n    lean_color: '#edc74a',\n    rgbaColor: 'rgba(190, 147, 4,' + opacity + ')',\n  },\n  {\n    // Same green as the Green Party pill ($color-green)\n    name: 'Kevin McCormick',\n    color: '#4f7d5a',\n    lean_color: '#91ba9b',\n    rgbaColor: 'rgba(79, 125, 90,' + opacity + ')',\n  },\n];\n\n// Party colors for the other statewide races' maps, same as the races above\nconst partyColor = (name: string, party: string) =>\n  ({\n    Republican: {\n      name,\n      color: '#EF564A',\n      lean_color: '#F6A79D',\n      rgbaColor: 'rgba(239,86,74,' + opacity + ')',\n    },\n    Democrat: {\n      name,\n      color: '#1755c5',\n      lean_color: '#6DACD3',\n      rgbaColor: 'rgba(23,85,194,' + opacity + ')',\n    },\n    Libertarian: {\n      name,\n      color: '#be9304',\n      lean_color: '#edc74a',\n      rgbaColor: 'rgba(190, 147, 4,' + opacity + ')',\n    },\n    Green: {\n      name,\n      color: '#4f7d5a',\n      lean_color: '#91ba9b',\n      rgbaColor: 'rgba(79, 125, 90,' + opacity + ')',\n    },\n  }[party]);\n\nconst ATTORNEY_GENERAL = [\n  partyColor('Mayes Middleton', 'Republican'),\n  partyColor('Nathan Johnson', 'Democrat'),\n  partyColor('Tom Oxford', 'Libertarian'),\n];\n\nconst COMPTROLLER = [\n  partyColor('Don Huffines', 'Republican'),\n  partyColor('Sarah Eckhardt', 'Democrat'),\n  partyColor('V. Alonzo Echavarria-Garza', 'Libertarian'),\n  partyColor('Shehla Faizi', 'Green'),\n];\n\nconst LAND_COMMISSIONER = [\n  partyColor('Dawn Buckingham', 'Republican'),\n  partyColor('Benjamin Flores', 'Democrat'),\n  partyColor('Neill Snider', 'Libertarian'),\n];\n\nconst AGRICULTURE_COMMISSIONER = [\n  partyColor('Nate Sheets', 'Republican'),\n  partyColor('Clayton Tucker', 'Democrat'),\n  partyColor('Austin R. Kelly', 'Libertarian'),\n];\n\n// Map colors for each showcase race, keyed by contest office\nconst SHOWCASE_COLORS: { [office: string]: typeof GOVERNOR } = {\n  Governor: GOVERNOR,\n  'U.S. Senate': SENATE,\n  'Texas Railroad Commission': RAILROAD,\n  'Lieutenant Governor': LIEUTENANT_GOVERNOR,\n  'Attorney General': ATTORNEY_GENERAL,\n  Comptroller: COMPTROLLER,\n  'Land Commissioner': LAND_COMMISSIONER,\n  'Agriculture Commissioner': AGRICULTURE_COMMISSIONER,\n};\n\nconst OTHER = '#888888';\n\nconst REPUBLICAN = '#EF564A'\nconst DEMOCRAT = '#1755c5'\nconst DEMOCRAT_LEAN = '#6DACD3'\nconst REPUBLICAN_LEAN = '#F6A79D';\n\nconst NEUTRAL = '#F2F2F2';\nconst TIE = '#8264B0';\n\nexport { GOVERNOR, SENATE, RAILROAD, SHOWCASE_COLORS, NEUTRAL, TIE, OTHER, REPUBLICAN, DEMOCRAT, DEMOCRAT_LEAN, REPUBLICAN_LEAN };","import * as d3 from 'd3';\nimport { Component, h } from 'preact';\n\nimport { DEMOCRAT, REPUBLICAN } from '../colors';\n\nconst VACANT = '#d9d9d9';\nconst UP_FOR_GRABS = '#bdbdbd';\nconst SAFE_REPUBLICAN = '#ab261b';\nconst SAFE_DEMOCRAT = '#113a85';\n// Drawn as an empty outline\nconst UNKNOWN_SEAT = { name: 'Unknown', color: '#fff', stroke: '#8c8c8c' };\nconst MIN_EMBED_SEAT = 22;\nconst MIN_EMBED_SEAT_NARROW = 28;\nconst NARROW_SCREEN = 480;\nconst MIN_EMBED_SEAT_LARGE_CHAMBER = 18;\nconst SMALL_SCREEN = 300;\n\nclass BalancePower extends Component {\n  constructor() {\n    super();\n\n    this.state = {\n      width: null,\n      bodyWidth: null,\n    };\n\n    this.createGraphic = this.createGraphic.bind(this);\n    this.redrawGraphic = this.redrawGraphic.bind(this);\n    this.getContainerWidth = this.getContainerWidth.bind(this);\n  }\n\n  // Draw once the containers from render() are in the page\n  componentDidMount() {\n    const { className, pastData, currentData } = this.props;\n\n    window.addEventListener('resize', this.redrawGraphic);\n    this.createGraphic(className, pastData, currentData);\n  }\n\n  componentDidUpdate() {\n    const { className, pastData, currentData } = this.props;\n\n    this.createGraphic(className, pastData, currentData);\n  }\n\n  layoutSeats(total, minRows = 0) {\n    const defaultRows = total >= 100 ? [5, 4, 6] : [3, 2, 4];\n    const rowOptions =\n      minRows > defaultRows[0] ? [minRows, minRows + 1] : defaultRows;\n    const evenRows = rowOptions.find(\n      option => option >= minRows && total % option == 0\n    );\n\n    if (evenRows) {\n      const seats = d3.range(total).map(i => ({\n        column: Math.floor(i / evenRows),\n        row: i % evenRows,\n      }));\n\n      return { seats, columns: total / evenRows, rows: evenRows };\n    }\n\n    \n    if (minRows <= defaultRows[0]) {\n      const rows = rowOptions[0];\n      const half = Math.floor(total / 2);\n      const sideColumns = Math.ceil(half / rows);\n      const hasMiddleSeat = total % 2 == 1;\n      const columns = sideColumns * 2 + (hasMiddleSeat ? 1 : 0);\n\n      const left = d3.range(half).map(i => ({\n        column: Math.floor(i / rows),\n        row: i % rows,\n      }));\n\n      const right = left\n        .map(seat => ({ column: columns - 1 - seat.column, row: seat.row }))\n        .reverse();\n\n      const middle = hasMiddleSeat\n        ? [{ column: sideColumns, row: Math.floor(rows / 2) }]\n        : [];\n\n      return { seats: left.concat(middle, right), columns, rows };\n    }\n\n\n    const columns = Math.ceil(total / rowOptions[0]);\n    const fullRows = Math.floor(total / columns);\n    const extra = total % columns;\n    const rows = fullRows + (extra ? 1 : 0);\n\n    const seats = [];\n    d3.range(columns).forEach(column => {\n      const height = fullRows + (column < extra ? 1 : 0);\n      d3.range(height).forEach(row => seats.push({ column, row }));\n    });\n\n    return { seats, columns, rows };\n  }\n\n  \n  drawSeats(selector, { width, total, segments, labels, center, halfway, description, fullWidth }) {\n    // Embeds wrap onto as many rows as they need to keep the dots big\n    let minSeat = MIN_EMBED_SEAT;\n    if (total >= 100) {\n      if (width <= SMALL_SCREEN) minSeat = MIN_EMBED_SEAT_LARGE_CHAMBER;\n    } else if (width <= NARROW_SCREEN) {\n      minSeat = MIN_EMBED_SEAT_NARROW;\n    }\n    const layout = seatSize => {\n      const minRows = fullWidth\n        ? Math.ceil(total / Math.max(1, Math.floor(width / seatSize)))\n        : 0;\n      return this.layoutSeats(total, minRows);\n    };\n    let { seats, columns, rows } = layout(minSeat);\n\n    // Room above the seats for the majority number and the label over the seats\n    const marginTop = halfway || (center && center.aboveSeats) ? 24 : 4;\n    const labelLineHeight = 20;\n    const labelRows = Math.max(labels.left.length, labels.right.length);\n    const centerLine = center && !center.aboveSeats ? center.line : 0;\n    const labelsHeight =\n      6 + Math.max(labelRows, centerLine + 1) * labelLineHeight;\n\n    // Embeds fill their container; on the results page the chart is capped\n    let cell = fullWidth\n      ? width / columns\n      : Math.min(width / columns, 500 / columns, 36);\n\n    // On small screens, use the biggest dots that keep the chart within the\n    // height of the tallest results table, even if it leaves the chart a\n    // little narrower than the embed\n    const chartRoom = fullWidth && width <= SMALL_SCREEN && this.getChartRoom();\n    if (chartRoom) {\n      const seatsRoom = chartRoom - marginTop - labelsHeight;\n      cell = Math.min(cell, seatsRoom / rows);\n      for (let size = Math.floor(width); size >= 1; size--) {\n        const option = layout(size);\n        const optionCell = Math.min(\n          width / option.columns,\n          seatsRoom / option.rows\n        );\n        if (optionCell > cell) {\n          ({ seats, columns, rows } = option);\n          cell = optionCell;\n        }\n      }\n    }\n    const dotRadius = cell * 0.42;\n    const chartWidth = cell * columns;\n    const chartBottom = marginTop + cell * rows;\n    const height = chartBottom + labelsHeight;\n    const centerX = width / 2;\n    const chartLeft = centerX - chartWidth / 2;\n\n    const container = d3.select(selector);\n    if (container.empty()) return;\n\n    const svg = container\n      .append('svg')\n      .attr('width', width)\n      .attr('height', height)\n      .attr('role', 'img')\n      .attr('aria-label', description)\n      // Inline, it'd add a line's descender below the room it was sized for\n      .style('display', chartRoom ? 'block' : null);\n\n    // If the counts fall short of the chamber, the seats nobody accounts for\n    // are left empty in the middle so both parties stay pinned to their edges\n    const unknown = Math.max(0, total - d3.sum(segments, d => d.seats));\n    const seatSegments = [];\n    segments.forEach(segment => {\n      for (let i = 0; i < segment.seats; i++) seatSegments.push(segment);\n      if (segment.middle) {\n        for (let i = 0; i < unknown; i++) seatSegments.push(UNKNOWN_SEAT);\n      }\n    });\n\n    // When the open seats are labeled from above, move them to the top of\n    // their column so the label sits right over them. Any seats from the\n    // left-hand party that share the column drop to the bottom of it. If\n    // both parties share the column, the open seats go between them instead,\n    // with the right-hand party on top.\n    if (center && center.aboveSeats) {\n      const middleIndex = segments.findIndex(segment => segment.middle);\n      const isLeft = segment => segments.indexOf(segment) < middleIndex;\n\n      d3.range(columns).forEach(column => {\n        const indexes = d3\n          .range(seatSegments.length)\n          .filter(i => seats[i] && seats[i].column == column)\n          .sort((a, b) => seats[a].row - seats[b].row);\n        const inColumn = indexes.map(i => seatSegments[i]);\n\n        if (!inColumn.some(segment => segment.middle)) return;\n\n        const open = inColumn.filter(segment => segment.middle);\n        const right = inColumn.filter(\n          segment => !segment.middle && !isLeft(segment)\n        );\n        const left = inColumn.filter(segment => isLeft(segment));\n\n        (left.length && right.length\n          ? right.concat(open, left)\n          : open.concat(right, left)\n        ).forEach((segment, i) => (seatSegments[indexes[i]] = segment));\n      });\n    }\n\n    svg\n      .append('g')\n      .selectAll('circle')\n      .data(seats.filter((seat, i) => seatSegments[i]))\n      .enter()\n      .append('circle')\n      .attr('class', 'balance-seat')\n      .attr('cx', d => chartLeft + cell * (d.column + 0.5))\n      .attr('cy', d => marginTop + cell * (d.row + 0.5))\n      .attr('r', dotRadius)\n      .attr('fill', (d, i) => seatSegments[i].color)\n      .attr('stroke', (d, i) => seatSegments[i].stroke || 'none')\n      .append('title')\n      .text((d, i) => seatSegments[i].name);\n\n    // Whichever party's seats cross the middle of the chart has the majority\n    let majorityText;\n\n    if (halfway) {\n      majorityText = svg\n        .append('text')\n        .attr('class', 'text-majority')\n        .attr('text-anchor', 'middle')\n        .attr('x', centerX)\n        .attr('y', 14)\n        .style('fill', '#000')\n        .text(halfway);\n\n      svg\n        .append('line')\n        .attr('class', 'annotation-line')\n        .attr('x1', centerX)\n        .attr('x2', centerX)\n        .attr('y1', 19)\n        .attr('y2', chartBottom + 2);\n    }\n\n    const labelTop = chartBottom + 6;\n\n    [\n      { lines: labels.left, x: chartLeft, anchor: 'start' },\n      { lines: labels.right, x: chartLeft + chartWidth, anchor: 'end' },\n    ].forEach(({ lines, x, anchor }) => {\n      svg\n        .append('g')\n        .selectAll('text')\n        .data(lines)\n        .enter()\n        .append('text')\n        .attr('class', (d, i) => (i == 0 ? 'bar-title' : 'bar-title-uncontested'))\n        .attr('text-anchor', anchor)\n        .attr('x', x)\n        .attr('y', (d, i) => labelTop + 15 + i * labelLineHeight)\n        .style('fill', d => d.color)\n        .text(d => d.text);\n    });\n\n    if (!center) return;\n\n    const centerText = svg\n      .append('text')\n      .attr('class', 'balance-center-label')\n      .attr('text-anchor', 'middle')\n      .attr('x', centerX)\n      .text(center.text);\n\n    // Centered on its own line under the party labels\n    if (!center.aboveSeats) {\n      centerText.attr('y', labelTop + 15 + center.line * labelLineHeight);\n      return;\n    }\n\n    // Above the chart, starting at the left edge of its seats\n    const textWidth = centerText.node().getComputedTextLength();\n\n    let x =\n      d3.min(\n        seats.filter((seat, i) => seatSegments[i] && seatSegments[i].middle),\n        d => chartLeft + cell * (d.column + 0.5)\n      ) - dotRadius;\n\n    // Keep it inside the chart and clear of the majority number\n    x = Math.max(chartLeft, Math.min(x, chartLeft + chartWidth - textWidth));\n\n    if (majorityText) {\n      const clearance = majorityText.node().getComputedTextLength() / 2 + 8;\n\n      if (x < centerX + clearance && x + textWidth > centerX - clearance) {\n        x =\n          x + textWidth / 2 < centerX\n            ? centerX - clearance - textWidth\n            : centerX + clearance;\n      }\n    }\n\n    centerText.attr('text-anchor', 'start').attr('x', x).attr('y', 14);\n  }\n\n  createGraphic(className, pastData, currentData) {\n    let { width } = this.getContainerWidth(className);\n\n    const pastVacant = pastData.vacant || 0;\n    const isSenate = className == 'texas-senate';\n    // The U.S. House chart is only the Texas delegation, so it has no majority\n    const halfway = className != 'us-house' ? currentData.halfway : null;\n\n    function getZeroUncontested(num) {\n      return num > 0 ? num : 'None';\n    }\n\n    function seatText(num) {\n      return `${num} seat${num == 1 ? '' : 's'}`;\n    }\n\n    d3.selectAll(`.${className}-graphic-previous svg`).remove();\n\n    d3.selectAll(`.${className}-graphic-current svg`).remove();\n\n    // Currently vacant seats sit between Republicans and Democrats\n    this.drawSeats(`.${className}-graphic-previous`, {\n      width,\n      total: pastData.total,\n      halfway,\n      segments: [\n        { name: 'Republican', seats: pastData.republican, color: REPUBLICAN },\n        { name: 'Vacant', seats: pastVacant, color: VACANT, middle: true },\n        { name: 'Democrat', seats: pastData.democrat, color: DEMOCRAT },\n      ],\n      labels: {\n        left: [{ text: `${pastData.republican} Republicans`, color: REPUBLICAN }],\n        right: [{ text: `${pastData.democrat} Democrats`, color: DEMOCRAT }],\n      },\n      center: pastVacant > 0 && {\n        text: `${pastVacant} vacant`,\n        aboveSeats: true,\n      },\n      description: `${pastData.republican} Republicans, ${pastData.democrat} Democrats and ${seatText(pastVacant)} vacant`,\n    });\n\n    // Seats that weren't in play (uncontested or not up for election) sit on\n    // the outside in a darker shade, with the undecided seats in the middle\n    const safeRepublican =\n      currentData.uncontested_republican +\n      pastData.republican_not_up_for_election;\n    const safeDemocrat =\n      currentData.uncontested_democrat + pastData.democrat_not_up_for_election;\n    const republican = currentData.republican + safeRepublican;\n    const democrat = currentData.democrat + safeDemocrat;\n\n    // Small embeds abbreviate the parties (\"X R\") so the labels fit\n    const short = this.props.fullWidth && width <= SMALL_SCREEN;\n\n    const leftLabels = [\n      { text: short ? `${republican} R` : `${republican} Republicans`, color: REPUBLICAN },\n      {\n        text: `${getZeroUncontested(currentData.uncontested_republican)} uncontested`,\n        color: SAFE_REPUBLICAN,\n      },\n    ];\n\n    const rightLabels = [\n      { text: short ? `${democrat} D` : `${democrat} Democrats`, color: DEMOCRAT },\n      {\n        text: `${getZeroUncontested(currentData.uncontested_democrat)} uncontested`,\n        color: SAFE_DEMOCRAT,\n      },\n    ];\n\n    if (isSenate) {\n      leftLabels.push({\n        text: `${pastData.republican_not_up_for_election} not up for election`,\n        color: SAFE_REPUBLICAN,\n      });\n      rightLabels.push({\n        text: `${pastData.democrat_not_up_for_election} not up for election`,\n        color: SAFE_DEMOCRAT,\n      });\n    }\n\n    const safeName = isSenate\n      ? 'uncontested or not up for election'\n      : 'uncontested';\n\n    this.drawSeats(`.${className}-graphic-current`, {\n      width,\n      fullWidth: this.props.fullWidth,\n      total: currentData.total,\n      halfway,\n      segments: [\n        { name: `Republican, ${safeName}`, seats: safeRepublican, color: SAFE_REPUBLICAN },\n        { name: 'Republican', seats: currentData.republican, color: REPUBLICAN },\n        { name: 'Up for grabs', seats: currentData.vacant, color: UP_FOR_GRABS, middle: true },\n        { name: 'Democrat', seats: currentData.democrat, color: DEMOCRAT },\n        { name: `Democrat, ${safeName}`, seats: safeDemocrat, color: SAFE_DEMOCRAT },\n      ],\n      labels: { left: leftLabels, right: rightLabels },\n      // On its own line so it can't run into the labels on either side. The\n      // embeds show it under the title instead.\n      center: !this.props.currentOnly && currentData.vacant > 0 && {\n        text: `${currentData.vacant} up for grabs`,\n        line: leftLabels.length,\n      },\n      description: `${republican} Republicans, ${democrat} Democrats and ${seatText(currentData.vacant)} still up for grabs`,\n    });\n  }\n\n  // Height the embed's min-height (the tallest results table, in\n  // _embed.scss) leaves for this chart, measured while the chart is removed\n  getChartRoom() {\n    const body = document.body;\n    const style = getComputedStyle(body);\n    const minHeight = parseFloat(style.minHeight);\n    if (!minHeight) return null;\n\n    let used =\n      parseFloat(style.paddingTop) +\n      parseFloat(style.paddingBottom) +\n      parseFloat(style.borderTopWidth) +\n      parseFloat(style.borderBottomWidth);\n    Array.from(body.children).forEach(child => {\n      if (getComputedStyle(child).position != 'absolute') {\n        used += child.getBoundingClientRect().height;\n      }\n    });\n\n    const room = minHeight - used;\n    return room > 0 ? room : null;\n  }\n\n  getContainerWidth(className) {\n    let base;\n\n    const body = d3.select('body');\n\n    base = d3.select(`.${className}-balance-graphic`);\n\n    const width = base.node().offsetWidth;\n    const bodyWidth = body.node().offsetWidth;\n\n    return { width, bodyWidth };\n  }\n\n  redrawGraphic() {\n    const { className, pastData, currentData } = this.props;\n\n    d3.selectAll(`.${className}-graphic-previous svg`).remove();\n    d3.selectAll(`.${className}-graphic-current svg`).remove();\n\n    let { width, bodyWidth } = this.getContainerWidth(className);\n\n    this.setState({ width: width, bodyWidth: bodyWidth });\n    this.createGraphic(className, pastData, currentData);\n  }\n\n  componentWillUnmount() {\n    window.removeEventListener('resize', this.redrawGraphic);\n  }\n\n  render() {\n    const { className, chamber, currentOnly, currentData } = this.props;\n\n    // Embeds show only the current breakdown, without the narrative text\n    if (currentOnly) {\n      return (\n        <div id=\"balance-graphics\">\n          {currentData.vacant > 0 && (\n            <p class=\"embed-balance__up-for-grabs\">\n              {`${currentData.vacant} up for grabs`}\n            </p>\n          )}\n          <div class={`${className}-graphic-current`}></div>\n        </div>\n      );\n    }\n\n    const chamberText =\n      chamber == 'U.S. House'\n        ? 'the Texas delegation in'\n        : 'the balance of power in';\n\n    return (\n      <div id=\"balance-graphics\">\n        <p class=\"t-copy copy--narrative\">\n          {`Going into the November election, ${chamberText} the ${chamber} was broken down like this: `}\n        </p>\n        <div class={`${className}-graphic-previous`}></div>\n        <p class=\"t-copy copy--narrative\">\n          {`Here how it'll look starting in January:`}\n        </p>\n        <div class={`${className}-graphic-current`}></div>\n      </div>\n    );\n  }\n}\n\nexport default BalancePower;\n","import cx from 'classnames';\nimport { h } from 'preact';\n\nfunction OtherCandidate({ isViewable, candidateCount, embedType, onClick }) {\n  const classes = cx('candidate race__candidate-row', {\n    'race__candidate-row--hidden': !isViewable,\n  });\n\n  return (\n    <tr class={classes}>\n      <td\n        class=\"candidate__cell candidate__party t-align-center\"\n        onClick={onClick}\n      >\n        <svg class=\"icon icon-angle-down\">\n          <use xlinkHref=\"#icon-angle-down\" />\n        </svg>\n      </td>\n      <th class=\"candidate__cell candidate__name\">\n        <button class={embedType} onClick={onClick}>\n          Show All ({candidateCount}){' '}\n        </button>\n      </th>\n      <th class=\"candidate__cell candidate__votes\"></th>\n      <th class=\"candidate__cell candidate__pct\"></th>\n    </tr>\n  );\n}\n\nexport default OtherCandidate;","import loadJsonScript from './load-json-script';\n\n// Office slugs of the races the hotlist sheet rates competitive (\"hot\"), from\n// the `competitive_data` script in index.html (see competitiveSlugs in\n// project.config.js). Missing on pages that don't embed it, like embeds.\nlet competitiveSlugs: Set<string> | null = null;\n\nfunction isCompetitive(contest: { office_slug: string; election_type: string }) {\n  if (!competitiveSlugs) {\n    competitiveSlugs = new Set(loadJsonScript('competitive_data') || []);\n  }\n\n  // The hotlist rates the general election seats, not special elections\n  return (\n    contest.election_type !== 'special' &&\n    competitiveSlugs.has(contest.office_slug)\n  );\n}\n\nexport default isCompetitive;\n","import cx from 'classnames';\nimport { intcomma } from 'journalize';\nimport { Component, h } from 'preact';\n\nimport OtherCandidate from './OtherCandidate';\nimport { PreactHTMLConverter } from 'preact-html-converter';\n\n// internal\nimport {\n  sort_candidates_by_party,\n  sort_candidates_by_votes,\n  alert_conditionals,\n  alert_winners,\n  text_conditionals,\n  text_conditional_winner_zero,\n  get_directory_slug,\n  getDistrictNum\n} from '../election-utils';\nimport sumValues from '../utils/sum-values';\nimport formatPercent from '../utils/format-percent';\nimport winnerClass from '../utils/winner-class';\nimport isCompetitive from '../utils/competitive';\nimport text from 'Data/text.json';\n\nimport { isCanvass, visibleCandidatesCount } from '../endpoints';\n\nconst PLAIN_SPECIAL_ELECTIONS: string[] = [];\n\n// Spelled out in full so PurgeCSS (config/tasks/unused-css.js) keeps them.\n// Same party colors as the PartyPill circles.\nconst WINNER_BOX_CLASSES: { [prefix: string]: string } = {\n  rep: 'winner-box--rep',\n  dem: 'winner-box--dem',\n  lib: 'winner-box--lib',\n  ind: 'winner-box--ind',\n  gre: 'winner-box--gre',\n};\n\n\n\nfunction withCandidateKey(row: any, candidate: any) {\n  if (row && row.key == null && candidate.id != null) {\n    row.key = candidate.id;\n    row.attributes = { ...row.attributes, key: candidate.id };\n  }\n  return row;\n}\n\n// From the text doc's [+competitive_note]; may contain a link\nconst COMPETITIVE_NOTE = (text.competitive_note || [])\n  .map((block) => block.value)\n  .join(' ');\n\ntype Props = {\n  contest: { [key: string]: any };\n  columnCount: number;\n  contestTitle: string;\n  includeCountyRundown?: boolean;\n  isShowcaseRace?: boolean;\n  renderParty: any;\n  renderCandidate: any;\n  candidatesRender: any;\n  showRedrawn?: boolean;\n  embedType: string;\n  broadcastHeaderImage: string;\n  activeContestId: string;\n  tableHeader: JSX.Element;\n  annotations: { [key: string]: any };\n  notes: { [key: string]: any };\n  isHomepage?: boolean;\n  asOf: string;\n  source: string;\n};\n\nclass Contest extends Component<Props> {\n  constructor() {\n    super();\n\n    this.state = {\n      viewAllCandidates: false,\n    };\n    this.onViewableToggle = this.onViewableToggle.bind(this);\n  }\n\n  onViewableToggle() {\n    this.setState(prevState => ({\n      viewAllCandidates: !prevState.viewAllCandidates, \n    }));\n  }\n  render() {\n    const {\n      contest,\n      columnCount,\n      contestTitle,\n      isShowcaseRace,\n      renderCandidate,\n      annotations,\n      notes,\n      tableHeader,\n      isHomepage,\n      asOf,\n      source: feedSource,\n      embedType,\n      candidatesRender,\n      showRedrawn,\n    } = this.props;\n\n    \n    const source = feedSource || 'Associated Press';\n\n    const { viewAllCandidates } = this.state;\n\n    const converter = PreactHTMLConverter();\n\n    const shouldDisplayResult = contest.contest_result !== 'not called';\n\n    let directory_slug, district_num;\n\n    if (contest) {\n      directory_slug = get_directory_slug(contest.office);\n      district_num = getDistrictNum(contest.division_type, contest.office_division)\n    }\n\n    const totalVotes = sumValues(contest.candidacies, 'votes');\n\n    let candidates;\n\n    candidates =\n      totalVotes == 0\n        ? sort_candidates_by_party(contest.candidacies, 'table')\n        : sort_candidates_by_votes(contest.candidacies);\n\n    const uncontested = candidates.length == 1;\n\n    const pct_votes = source == 'Decision Desk HQ' ? formatPercent(\n      totalVotes,\n      contest.estimated_votes_mid\n    )  : contest.eevp\n\n    const pct_votes_turnout =\n      pct_votes < 100\n        ? `An estimated ${pct_votes}% of votes have been counted, according to the ${source}.`\n        : `An estimated >99% of votes have been counted, according to the ${source}.`;\n\n\n    const pct_votes_turnout_zero_winner = \n    pct_votes == 0 && shouldDisplayResult \n    ? ``\n    : pct_votes_turnout;\n\n    const pct_votes_turnout_w_uncontested =\n        (uncontested == true)\n           ? text_conditionals(pct_votes, contest.candidacies.length) :\n           pct_votes_turnout_zero_winner\n\n    const pct_votes_explain = !shouldDisplayResult && !uncontested\n      ? text_conditionals(pct_votes, contest.candidacies.length)\n      : text_conditional_winner_zero(pct_votes, contest.candidacies.length);\n\n    let firstShowcaseRace;\n\n    let embedTypeUsable = 'none';\n\n    if (typeof embedType !== 'undefined') {\n      embedTypeUsable = embedType;\n    }\n\n\n    const showcaseClass = cx({\n      seat__races: !isShowcaseRace,\n      seat__highlight_races: isShowcaseRace,\n    });\n\n\n    const hasSpecialStyling =\n      contest.election_type == 'special' &&\n      !PLAIN_SPECIAL_ELECTIONS.includes(contest.office_slug);\n\n    let raceClass = cx('seat__race', {\n      'special-election': hasSpecialStyling,\n      'general-seat-before-special': (contest.office_slug == 'us-house-district-18') || (contest.office_slug == 'texas-house-district-56'),\n    })\n\n    let seatClass = cx('seat',  {\n      'special-election__grid': hasSpecialStyling,\n    })\n\n    const klaxon_sos = 'Race has been declared'; // if we switch sources to TX SOS and someone else has declared the winner\n\n    const klaxon = shouldDisplayResult\n      ? source == 'Decision Desk HQ' || source == 'Associated Press'\n        ? alert_winners(contest.contest_result, contest.office)\n        : klaxon_sos\n      : alert_conditionals(pct_votes, contest.candidacies.length);\n\n    const checkmark = '\\u2713';\n\n    let hasTurnoutmodel = (source == 'Decision Desk HQ' || source == 'Associated Press')? true : false;\n\n    // Color the checkmark by the winner's party\n    const winner = candidates.find((candidate: any) => candidate.is_winner);\n    const winnerColorClass =\n      shouldDisplayResult && hasTurnoutmodel && winner\n        ? winnerClass(winner.party, contest.contest_result)\n        : '';\n    const winnerCheckClass = cx('check', winnerColorClass);\n\n    // Box above the table once the AP calls the race, in the winner's pill color.\n    // Uncontested races get it too, for their only candidate\n    const isUncontestedResult =\n      contest.contest_result == 'uncontested' && uncontested;\n    const boxWinner = isUncontestedResult ? candidates[0] : winner;\n    const showWinnerBox =\n      (contest.contest_result == 'winner' &&\n        source == 'Associated Press' &&\n        winner) ||\n      isUncontestedResult;\n    const winnerCustomColor =\n      showWinnerBox && Array.isArray(candidatesRender)\n        ? (candidatesRender.find((c: any) => c.name == boxWinner.name) || {}).color\n        : undefined;\n    const winnerBoxClass = cx(\n      'winner-box',\n      showWinnerBox &&\n        !winnerCustomColor &&\n        WINNER_BOX_CLASSES[(boxWinner.party || '').slice(0, 3).toLowerCase()]\n    );\n\n\n    const contestMetricsClass = cx('contest__metrics', {\n      homepage__metrics: isHomepage,\n      'non-homepage__metrics': !isHomepage,\n    });\n\n\n    const precinctsClass = cx('contest__precincts');\n\n    let ManualoverrideSource;\n\n\n    ManualoverrideSource = '';\n\n    const IsAnnotations =\n      annotations && annotations.length > 0 && annotations[0].value != ''\n        ? true\n        : false;\n\n    const IsNoted = notes && notes.length > 0 ? true : false;\n\n    return (\n      <div class={seatClass}>\n        <div class={showcaseClass}>\n          <div class={raceClass}>\n          {!isShowcaseRace && (\n              <h3 class=\"seat__title\">\n                <span>{contest.election_type == 'special' && (\n                <div class=\"special-election__title\">Special Election</div>\n              )}{contestTitle}</span>\n                {directory_slug[0] != null && (\n              <a class=\"t-links-unset\"\n                target=\"_blank\"\n                href={`https://directory.texastribune.org/districts/${directory_slug[0]['directory-slug']}/${contest['office_division']}/`}\n              >\n                <span class=\"icon-div\" title=\"Click to learn more about this district\">\n                  <svg class=\"icon icon-info\">\n                    <use xlinkHref=\"#icon-info\"></use>\n                  </svg>\n                </span>\n              </a>\n            )}\n                {/* Texas' congressional map was redrawn mid-decade in 2025.\n                Only shown where asked for (the U.S. House section and the\n                personalized results). */}\n                {showRedrawn && contest.office === 'U.S. House' && (\n                  <span class=\"term-limit seat__redrawn\">Redrawn in <a href=\"https://www.texastribune.org/2025/08/18/texas-redistricting-maps-charts-analysis/\" target=\"_blank\" rel=\"noopener noreferrer\">2025</a></span>\n                )}\n              </h3>\n            )}\n            <div class=\"race\">\n              {embedType == 'homepage' && (\n                <span>\n                  <div class=\"office__title\">{contestTitle}</div>\n                </span>\n              )}\n              {/* {embedType == 'internal' && (\n                <span>\n                  <h2 class=\"office__title\">{contestTitle}</h2>\n                </span>\n              )} */}\n\n              <div class={contestMetricsClass}>\n                {/* Once the AP calls the race, the winner box replaces the\n                    \"projected a winner\" line */}\n                {showWinnerBox && (\n                  <div\n                    class={winnerBoxClass}\n                    style={\n                      winnerCustomColor\n                        ? { 'background-color': winnerCustomColor }\n                        : undefined\n                    }\n                  >\n                    <span class=\"winner-box__check\" aria-hidden=\"true\">\n                      {checkmark}\n                    </span>\n                    <span class=\"winner-box__text\">{boxWinner.name}</span>\n                    <span class=\"winner-box__source\">\n                      {isUncontestedResult ? 'Uncontested' : 'AP projection'}\n                    </span>\n                  </div>\n                )}\n                {!showWinnerBox && isCanvass == false && (\n                  <h4 class=\"klaxon__text\">\n                    {shouldDisplayResult && (source == 'Decision Desk HQ' || source == 'Associated Press') ? (\n                      <span class={winnerCheckClass}>{checkmark}</span>\n                    ) : (\n                      ''\n                    )}\n                    {klaxon}\n                  </h4>\n                )}\n                {ManualoverrideSource == '' && isCanvass == false && (\n                  <p class={precinctsClass}>\n                    {source == 'Texas Secretary of State'\n                      ? `${intcomma(\n                          contest.pollinglocationsreporting\n                        )} of ${intcomma(\n                          contest.total_pollinglocations\n                        )} polling locations reporting (${contest.pollinglocations_reporting_percent.toFixed(\n                          1\n                        )}%).`\n                      : pct_votes_turnout_w_uncontested}{' '}\n                    {converter.convert(pct_votes_explain)}\n                  </p>\n                )}\n                {\n                  (ManualoverrideSource =! '' &&\n                    source != 'Texas Secretary of State' &&\n                    source != 'Decision Desk HQ' &&\n                    source != 'Associated Press' &&\n                    isCanvass == false && (\n                      <p class={precinctsClass}>\n                        {`${intcomma(\n                          contest.pollinglocationsreporting\n                        )} of ${intcomma(\n                          contest.total_pollinglocations\n                        )} polling locations reporting (${contest.pollinglocations_reporting_percent.toFixed(\n                          1\n                        )}%).`}\n\n                        {/* <span class=\"source\">{` Source: ${ManualoverrideSource}`}</span> */}\n                      </p>\n                    ))\n                }\n              </div>\n\n              <table class=\"race__candidates\">\n                {tableHeader}\n                <tbody>\n                  {isShowcaseRace &&\n                    candidates.map((candidate: any, idx: any) =>\n                      withCandidateKey(\n                        renderCandidate(\n                          candidate,\n                          idx,\n                          candidatesRender,\n                          viewAllCandidates,\n                          { totalVotes }\n                        ),\n                        candidate\n                      )\n                    )}\n\n                  {!isShowcaseRace &&\n                    candidates.map((candidate: any, idx: any) =>\n                      withCandidateKey(\n                        renderCandidate(candidate, idx, viewAllCandidates, {\n                          totalVotes,\n                        }),\n                        candidate\n                      )\n                    )}\n                  {candidates.length > visibleCandidatesCount && (\n                    <OtherCandidate\n                      isViewable={!viewAllCandidates}\n                      candidateCount={candidates.length}\n                      embedType={embedType}\n                      onClick={() => {\n                        this.onViewableToggle();\n                      }}\n                    />\n                  )}\n                </tbody>\n                {candidates.length > visibleCandidatesCount &&\n                  viewAllCandidates && (\n                    <tr class=\"candidate race__candidate-row\">\n                      <td\n                        class=\"candidate__cell candidate__party t-align-center\"\n                        onClick={() => {\n                          this.onViewableToggle();\n                        }}\n                      >\n                        <svg class=\"icon icon-angle-up\">\n                          <use xlinkHref=\"#icon-angle-up\" />\n                        </svg>\n                      </td>\n                      <th class=\"candidate__cell candidate__name\">\n                        <button\n                          class={embedType}\n                          onClick={() => {\n                            this.onViewableToggle();\n                          }}\n                        >\n                          Show fewer ({visibleCandidatesCount})\n                        </button>\n                      </th>\n                      <th class=\"candidate__cell candidate__votes\"></th>\n                      <th class=\"candidate__cell candidate__pct\"></th>\n                    </tr>\n                  )}\n              </table>\n              {isCompetitive(contest) && (\n                <div class=\"competitive-note\">\n                  <svg class=\"icon competitive-note__icon\" aria-hidden=\"true\">\n                    <use xlinkHref=\"#icon-fire\" />\n                  </svg>\n                  <p class=\"competitive-note__text\">\n                    {converter.convert(COMPETITIVE_NOTE)}\n                  </p>\n                </div>\n              )}\n              {IsNoted == true && (\n                <div class=\"anno-text notes-annotations\">\n                  <span class=\"is-sr-only\">Note:</span>\n                  <svg class=\"icon note-icon anno-div\" aria-hidden=\"true\">\n                    <use xlinkHref=\"#note-icon\" />\n                  </svg>\n                  <p class=\"note__text\">{converter.convert(notes[0].value)}</p>\n                </div>\n              )}\n              {IsAnnotations == true && (\n                <div class=\"anno-text notes-annotations t-wrap-balance\">\n                  <span class=\"is-sr-only\">Note:</span>\n                  <svg class=\"icon note-icon anno-div\" aria-hidden=\"true\">\n                    <use xlinkHref=\"#note-icon\" />\n                  </svg>\n\n                  <p class=\"annotations t-links-underlined\">\n                    <span class=\"font-weight-bold\">Noteworthy: </span>\n                    {converter.convert(annotations[0].value)}\n                  </p>\n                </div>\n              )}\n\n              {/* Source on every card; last updated only on homepage and internal embeds */}\n\n              <div class=\"below-races\">\n                <div class=\"source\">{` Source: ${source}`}</div>\n                {(embedType == 'homepage' || embedType == 'internal') && (\n                  <div class=\"countdown\">\n                    <span class=\"counter-homepage\">LAST UPDATED {asOf}</span>\n                  </div>\n                )}\n              </div>\n\n            </div>\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n\nContest.defaultProps = {\n  isShowcaseRace: false,\n  includeCountyRundown: false,\n};\n\nexport default Contest;","// packages\nimport Odometer from 'odometer';\nimport { Component, h } from 'preact';\n\n\nOdometer.options.auto = false;\n\ninterface Props {\n  value: number;\n  format: (n: number) => string;\n  odometerFormat?: string;\n}\n\n// Odometer drops trailing zeros after the decimal point so this fixes it\nfunction keepTrailingZeros(odometer: any) {\n  const { precision } = odometer.format;\n  if (!precision) return;\n\n  odometer.formatDigits = function (value: number) {\n    this.digits = [];\n    let wholePart = false;\n    value\n      .toFixed(precision)\n      .split('')\n      .reverse()\n      .forEach((digit: string) => {\n        if (digit === '.') wholePart = true;\n        this.addDigit(digit, wholePart);\n      });\n  };\n\n  const getFractionalDigitCount = odometer.getFractionalDigitCount;\n  odometer.getFractionalDigitCount = function (...values: number[]) {\n    return Math.max(precision, getFractionalDigitCount.apply(this, values));\n  };\n\n  // Redraw the initial value with the tweaked formatting\n  odometer.render();\n}\n\n// Rolling number powered by the odometer library\nclass AnimatedNumber extends Component<Props> {\n  el: HTMLElement;\n  srEl: HTMLElement;\n  odometer: any;\n\n  componentDidMount() {\n    const { value, odometerFormat } = this.props;\n\n    // Preact 8 can recycle the DOM of an unmounted AnimatedNumber (e.g. when\n    // the embed switcher swaps races). Odometer hands back the old instance\n    // for an element that already has one, which leaves the number blank, so\n    // always give it a brand-new element.\n    const odometerEl = document.createElement('span');\n    this.el.appendChild(odometerEl);\n\n    this.odometer = new Odometer({\n      el: odometerEl,\n      value,\n      format: odometerFormat || '(,ddd)',\n      theme: 'plain',\n      duration: 1200,\n    });\n\n    keepTrailingZeros(this.odometer);\n  }\n\n  shouldComponentUpdate(nextProps: Props) {\n    if (nextProps.value !== this.props.value) {\n      this.odometer.update(nextProps.value);\n      this.srEl.textContent = nextProps.format(nextProps.value);\n    }\n\n    return false;\n  }\n\n  render({ value, format }: Props) {\n    return (\n      <span class=\"animated-number\">\n        <span class=\"is-sr-only\" ref={(el) => (this.srEl = el)}>\n          {format(value)}\n        </span>\n        <span aria-hidden=\"true\" ref={(el) => (this.el = el)} />\n      </span>\n    );\n  }\n}\n\nexport default AnimatedNumber;\n","import * as d3 from 'd3';\nimport { Component, h } from 'preact';\n\nimport { entries, map, Map } from 'd3-collection';\n\nimport topology from 'Assets/geography/texas_urban.json';\n\nimport countiesData from 'Data/data.json';\n\nimport prepareTopoJSON from '../utils/prepare-topojson';\n\nimport { TIE } from '../colors';\n\ninterface Props {\n  category: string;\n  contest: { [key: string]: any };\n  candidatesRender: any;\n}\n\nclass TinyMap extends Component<Props> {\n  candidateMap!: Map<any>;\n  countyMap!: Map<any>;\n\n  constructor() {\n    super();\n\n    this.createMap = this.createMap.bind(this);\n    this.redrawMap = this.redrawMap.bind(this);\n    this.findLeading = this.findLeading.bind(this);\n  }\n\n  setUpCandidateMap(candidates: any) {\n    this.candidateMap = map(candidates, (d) => d.id);\n  }\n\n  setUpCountyMap(counties: any) {\n    this.countyMap = map(counties, (d) => d.fips);\n  }\n\n  componentDidMount() {\n    const { category, contest } = this.props;\n\n    this.setUpCandidateMap(contest.candidacies);\n    this.setUpCountyMap(contest.counties);\n\n    this.createMap(contest, category);\n\n    window.addEventListener('resize', () => {\n      this.redrawMap();\n    });\n  }\n\n  componentDidUpdate() {\n    const { category, contest } = this.props;\n\n    this.setUpCandidateMap(contest.candidacies);\n    this.setUpCountyMap(contest.counties);\n\n    this.createMap(contest, category);\n  }\n\n  findLeading(fips) {\n    const { candidatesRender } = this.props;\n\n    const county = this.countyMap.get(fips);\n\n    let fillStyle;\n\n    if (county.total_votes <= 0) {\n      fillStyle = '#666';\n    } else {\n      const sortedResults = entries(county.results).sort(\n        (a, b) => b.value - a.value\n      );\n\n      const leader = sortedResults[0];\n      const second = sortedResults[1];\n\n      if (leader.value === second.value) {\n        fillStyle = TIE;\n      } else {\n        const leadingId = leader.key;\n\n        const { id } = this.candidateMap.get(leadingId);\n        const result = candidatesRender.filter((cand) => cand.id == id);\n        fillStyle = result[0]['color'];\n      }\n    }\n\n    return fillStyle;\n  }\n\n  createMap(contest, category) {\n    d3.selectAll(`.${category}-${contest.office_slug} svg`).remove();\n\n    const container = d3.select(`.${category}-${contest.office_slug}`);\n\n    const geos = prepareTopoJSON(topology);\n\n    let projection = d3\n      .geoIdentity()\n      .reflectY(true)\n      .fitSize([75, 75], geos.collection);\n\n    let pathGenerator = d3.geoPath().projection(projection);\n\n    let tinymap = container\n      .append('svg')\n      .attr('id', 'tinymap')\n      .attr('role', 'presentation')\n      .attr('width', 75)\n      .attr('height', 75);\n\n    let g_tinymap = tinymap\n      .append('g')\n      .attr('class', 'tinymap')\n      .attr('width', 75)\n      .attr('height', 75);\n\n    const inCategory = (d) => {\n      let foundCounty = countiesData.counties.find(\n        (a) => a.county == d.properties.name\n      );\n      return foundCounty && foundCounty.category == category;\n    };\n\n    // Draw the gray counties first so their outlines can't paint over the\n    // edges of the shaded ones\n    const features = geos.collection.features\n      .map((d) => ({ d, shaded: inCategory(d) }))\n      .sort((a, b) => Number(a.shaded) - Number(b.shaded));\n\n    const fill = ({ d, shaded }) =>\n      shaded ? this.findLeading(d.properties.fips) : '#d0d0d0';\n\n    let tinycounties = g_tinymap\n      .selectAll('.tinycounties')\n      .data(features)\n      .enter()\n      .append('path')\n      .attr('d', ({ d }) => pathGenerator(d))\n      // A thin outline in the fill color just closes the hairline gaps\n      // between counties; at this size a 1px one is wider than many counties\n      .attr('stroke', fill)\n      .attr('stroke-width', '0.3')\n      .attr('stroke-linejoin', 'round')\n      .attr('class', 'tinycounties')\n      .attr('fill', fill);\n  }\n\n  redrawMap() {\n    const { category, contest } = this.props;\n\n    d3.selectAll(`.${category}-${contest.office_slug} svg`).remove();\n    this.createMap(contest, category);\n  }\n\n  render() {\n    const { category, contest } = this.props;\n\n    return (\n      <div\n        id='tinymapcontainer'\n        class={`${category}-${contest.office_slug}`}\n      ></div>\n    );\n  }\n}\n\nexport default TinyMap;","// In an embed (linkBase set), tooltip links that jump to a section of the\n// results page (\"#about-the-data\") need the page's URL, and every link opens\n// in a new tab instead of inside the iframe\nexport default function tooltipHTML(html: string, linkBase?: string) {\n  if (!linkBase) return html;\n  return html\n    .replace(/href=\"#/g, `href=\"${linkBase}#`)\n    .replace(/<a /g, '<a target=\"_blank\" rel=\"noopener noreferrer\" ');\n}\n","export default function(xy, dim) {\n  var node = this.node()\n  return !node ? this : node.getBBox ?\n    this.attr('transform', function(d,i) {\n      var p = typeof xy == 'function' ? xy.call(this, d,i) : xy;\n      if (dim === 0) p = [p, 0]; else if (dim === 1) p = [0, p];\n      return 'translate(' + p[0] +','+ p[1]+')';\n    }) :\n    this.style('transform', function(d,i) {\n      var p = typeof xy == 'function' ? xy.call(this, d,i) : xy;\n      if (dim === 0) p = [p, 0]; else if (dim === 1) p = [0, p];\n      return 'translate(' + p[0] +'px,'+ p[1]+'px)';\n    });\n}\n","export default function(name) {\n  if (typeof name === \"string\") {\n    var attr = {},\n      parts = name.split(/([\\.#])/g), p;\n      name = parts.shift();\n    while ((p = parts.shift())) {\n      if (p == '.') attr['class'] = attr['class'] ? attr['class'] + ' ' + parts.shift() : parts.shift();\n      else if (p == '#') attr.id = parts.shift();\n    }\n    return {tag: name, attr: attr};\n  }\n  return name;\n}\n","import {creator, selector} from \"d3-selection\";\nimport parseAttributes from \"./parseAttributes.js\";\n\nfunction constantNull() {\n  return null;\n}\n\nexport default function(name, before) {\n  var n = parseAttributes(name),\n      create = creator(n.tag),\n      select = before == null ? constantNull : typeof before === \"function\" ? before : selector(before);\n\n  var s = this.select(function() {\n    return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);\n  });\n\n\n  //attrs not provided by default in v4\n  for (var key in n.attr) { s.attr(key, n.attr[key]); }\n  return s;\n}","const camelCaseAttrs = /^(allowReorder|attributeName|attributeType|autoReverse|baseFrequency|baseProfile|calcMode|clipPathUnits|contentScriptType|contentStyleType|diffuseConstant|edgeMode|externalResourcesRequired|filterRes|filterUnits|glyphRef|gradientTransform|gradientUnits|kernelMatrix|kernelUnitLength|keyPoints|keySplines|keyTimes|lengthAdjust|limitingConeAngle|markerHeight|markerUnits|markerWidth|maskContentUnits|maskUnits|numOctaves|pathLength|patternContentUnits|patternTransform|patternUnits|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|referrerPolicy|refX|refY|repeatCount|repeatDur|requiredExtensions|requiredFeatures|specularConstant|specularExponent|spreadMethod|startOffset|stdDeviation|stitchTiles|surfaceScale|systemLanguage|tableValues|targetX|targetY|textLength|viewBox|viewTarget|xChannelSelector|yChannelSelector|zoomAndPan)$/;\n\nexport default function(name, value) {\n  if (typeof(name) == 'object'){\n    for (var key in name){\n      this.attr(camelCaseAttrs.test(key) ? key : key.replace(/([a-z\\d])([A-Z])/g, '$1-$2').toLowerCase(), name[key]);\n    }\n    return this;\n  } else{\n    return arguments.length == 1 ? this.attr(name) : this.attr(name, value);\n  }\n}\n","import ƒ from \"./f.js\";\n\nexport default function(name, value) {\n  if (typeof(name) == 'object'){\n    for (var key in name){\n      addStyle(this, key, name[key]);\n    }\n    return this;\n  } else {\n    return arguments.length == 1 ? this.style(name) : addStyle(this, name, value);\n  }\n\n\n  function addStyle(sel, style, value){\n    style = style.replace(/([a-z\\d])([A-Z])/g, '$1-$2').toLowerCase();\n\n    var pxStyles = 'top left bottom right padding-top padding-left padding-bottom padding-right border-top b-width border-left-width border-botto-width m border-right-width margin-top margin-left margin-bottom margin-right font-size width stroke-width line-height margin padding border border-radius max-width min-width max-height min-height';\n\n    if (~pxStyles.indexOf(style) ){\n      sel.style(style, typeof value == 'function' ? wrapPx(value) : addPx(value));\n    } else{\n      sel.style(style, value);\n    }\n\n    return sel;\n  }\n\n  function addPx(d){ return d.match ? d : d + 'px'; }\n  function wrapPx(fn){\n    return function(){\n      var val = fn.apply(this, arguments)\n      return addPx(val)\n    }\n\n  }\n}\n","import {sum} from 'd3-array';\n\n// while this might not be reprentative for all fonts, it is\n// still better than assuming every character has the same width\n// (set monospace=true if you want to bypass this)\nvar CHAR_W = {\n    A:7,a:7,B:8,b:7,C:8,c:6,D:9,d:7,E:7,e:7,F:7,f:4,G:9,g:7,H:9,h:7,I:3,i:3,J:5,j:3,K:8,k:6,L:7,l:3,M:11,\n    m:11,N:9,n:7,O:9,o:7,P:8,p:7,Q:9,q:7,R:8,r:4,S:8,s:6,T:7,t:4,U:9,u:7,V:7,v:6,W:11,w:9,X:7,x:6,Y:7,y:6,Z:7,z:5,\n    '.':2,',':2,':':2,';':2\n};\n\nexport default function(line, maxCharactersPerLine, minCharactersPerLine, monospace) {\n    var l, lines = [], w = [], words = [], w1, maxChars, minChars, maxLineW, minLineW;\n    w1 = line.split(' ');\n    w1.forEach(function(s, i) {\n        var w2 = s.split('-');\n        var lw = (i < w1.length - 1 ? ' ' : '');\n        if (w2.length > 1) {\n            w2.forEach(function(t, j) {\n                w.push(t + (j < w2.length - 1 ? '-' : lw));\n            });\n        } else {\n            w.push(s + lw);\n        }\n    });\n    maxChars = maxCharactersPerLine || 40;\n    minChars = minCharactersPerLine || Math.max(3, Math.min(maxChars * 0.5, 0.75 * w.map(word_len).sort(num_asc)[Math.round(w.length / 2)]));\n    maxLineW = maxChars * CHAR_W.a;\n    minLineW = minChars * CHAR_W.a;\n    l = 0;\n    w.forEach(function(d) {\n        var ww = sum(d.split('').map(char_w));\n        if (l + ww > maxLineW && l > minLineW) {\n            lines.push(words.join(''));\n            words.length = 0;\n            l = 0;\n        }\n        l += ww;\n        return words.push(d);\n    });\n    if (words.length) {\n        lines.push(words.join(''));\n    }\n    return lines.filter(function(d) {\n        return d !== '';\n    });\n    function char_w(c) { return !monospace && CHAR_W[c] || CHAR_W.a; }\n    function word_len(d) { return d.length; }\n    function num_asc(a, b) { return a - b; }\n}\n\n","export default function sum(values, valueof) {\n  let sum = 0;\n  if (valueof === undefined) {\n    for (let value of values) {\n      if (value = +value) {\n        sum += value;\n      }\n    }\n  } else {\n    let index = -1;\n    for (let value of values) {\n      if (value = +valueof(value, ++index, values)) {\n        sum += value;\n      }\n    }\n  }\n  return sum;\n}\n","import {selection} from \"d3-selection\";\nimport {transition} from \"d3-transition\";\n\nimport translateSelection from \"./src/translate-selection.js\";\nimport append from \"./src/append.js\";\nimport insert from \"./src/insert.js\";\nimport parent from \"./src/parent.js\";\nimport selectAppend from \"./src/selectAppend.js\";\nimport tspans from \"./src/tspans.js\";\nimport appendMany from \"./src/appendMany.js\";\nimport at from \"./src/at.js\";\nimport st from \"./src/st.js\";\n\nselection.prototype.translate = translateSelection;\ntransition.prototype.translate = translateSelection;\nselection.prototype.append = append;\nselection.prototype.insert = insert;\nselection.prototype.parent = parent;\nselection.prototype.selectAppend = selectAppend;\nselection.prototype.tspans = tspans;\nselection.prototype.appendMany = appendMany;\nselection.prototype.at = at;\nselection.prototype.st = st;\ntransition.prototype.at = at;\ntransition.prototype.st = st;\nselection.prototype.prop = selection.prototype.property;\n\nexport {default as wordwrap} from \"./src/wordwrap.js\";\nexport {default as parseAttributes} from \"./src/parseAttributes.js\";\nexport {default as f} from \"./src/f.js\";\nexport {default as ascendingKey} from \"./src/ascendingKey.js\";\nexport {default as descendingKey} from \"./src/descendingKey.js\";\nexport {default as conventions} from \"./src/conventions.js\";\nexport {default as drawAxis} from \"./src/drawAxis.js\";\nexport {default as attachTooltip} from \"./src/attachTooltip.js\";\nexport {default as loadData} from \"./src/loadData.js\";\nexport {default as nestBy} from \"./src/nestBy.js\";\nexport {default as round} from \"./src/round.js\";\nexport {default as clamp} from \"./src/clamp.js\";\nexport {default as polygonClip} from \"./src/polygonClip.js\";\nexport {default as timer} from \"./src/timer.js\";\nexport {default as interval} from \"./src/interval.js\";\nexport {default as timeout} from \"./src/timeout.js\";\n","import {creator} from \"d3-selection\";\nimport parseAttributes from \"./parseAttributes.js\";\n\nexport default function(name) {\n  var create, n;\n\n  if (typeof name === \"function\"){\n    create = name;\n  } else {\n    n = parseAttributes(name)\n    create = creator(n.tag);\n  }\n  var sel = this.select(function(){\n    return this.appendChild(create.apply(this, arguments));\n  });\n\n  if (n) for (var key in n.attr) { sel.attr(key, n.attr[key]); }\n  return sel;\n}\n\n","import {creator} from \"d3-selection\";\n\nexport default function() {\n  var parents = [];\n  return this.filter(function() {\n    if (parents.indexOf(this.parentNode) > -1) return false;\n    parents.push(this.parentNode);\n    return true;\n  }).select(function() {\n    return this.parentNode;\n  });\n}\n","import {selector} from \"d3-selection\";\nimport {creator} from \"d3-selection\";\nimport parseAttributes from \"./parseAttributes.js\";\n\nexport default function(name) {\n  var select = selector(name),\n     n = parseAttributes(name), s;\n\n  name = creator(n.tag);\n\n  s = this.select(function() {\n    return select.apply(this, arguments) ||\n        this.appendChild(name.apply(this, arguments));\n  });\n\n  //attrs not provided by default in v4\n  for (var key in n.attr) { s.attr(key, n.attr[key]); }\n  return s;\n}\n","export default function(lines, lh) {\n  return this.selectAll('tspan')\n      .data(function(d, i) {\n        return (typeof(lines) === 'function' ? lines.call(this, d, i) : lines)\n          .map(function(l) {\n            return { line: l, parent: d };\n          });\n      })\n      .enter()\n    .append('tspan')\n      .text(function(d) { return d.line; })\n      .attr('x', 0)\n      .attr('dy', function(d, i) { return i ? (typeof(lh) === 'function' ? lh.call(this, d.parent, d.line, i) : lh) || 15 : 0; });\n}\n","export default function(name, data){\n  if (typeof(data) == 'string'){\n    console.warn(\"DEPRECATED: jetpack's appendMany order of arguments has changed. It's appendMany('div', data) from now on\")\n    var temp = data\n    data = name\n    name = temp\n  }\n\n  return this.selectAll(null).data(data).enter().append(name);\n}\n","import { intword, intcomma } from 'journalize';\nimport * as d3 from 'd3';\n\nexport function customNumFormat(d, i) {\n  if (i == 0) {\n    return ``;\n  } else if (i == 1) {\n    return `${d3.format('~s')(d)}`;\n  } else if (i == 2) {\n    return `${intcomma(intword(d)).replace(' million', 'M')}`;\n  } else if (i == 3) {\n    return `${intcomma(intword(d)).replace(' million', 'M')}`;\n  }\n}\n\nexport function customNumFormatMini(d, i) {\n  if (i == 0) {\n    return ``;\n  } else if (i == 1) {\n    return `${d3.format('~s')(d)}`;\n  } else if (i == 2) {\n    return `${intcomma(intword(d)).replace(' million', 'M')}`;\n  }\n}\n\nexport function customBarNumFormat(d) {\n  return `${intcomma(intword(d)).replace(' million', 'M')}`;\n}","import * as d3 from 'd3';\nimport { Component, h } from 'preact';\nimport { wordwrap } from 'd3-jetpack';\n\nimport { showPrecinctsReporting } from '../endpoints';\n\nimport { customNumFormat, customBarNumFormat } from '../utils/format-numbers';\n\nclass MiniBarChart extends Component {\n  constructor() {\n    super();\n\n    this.state = {\n      width: null,\n      height: 90,\n      bodyWidth: null,\n      breakPoint: 768,\n    };\n\n    this.createGraphic = this.createGraphic.bind(this);\n    this.redrawGraphic = this.redrawGraphic.bind(this);\n    this.getContainerWidth = this.getContainerWidth.bind(this);\n    this.onResize = this.onResize.bind(this);\n    this.resizeFrame = null;\n  }\n\n  componentDidMount() {\n    const {\n      className,\n      categoryNumbers,\n      candidatesRender,\n      candidates,\n      officeSlug,\n      maxNum,\n    } = this.props;\n    let { width, bodyWidth } = this.getContainerWidth(officeSlug);\n\n    this.setState({ width: width, bodyWidth: bodyWidth }, () => {\n      this.createGraphic(\n        className,\n        categoryNumbers,\n        candidatesRender,\n        candidates,\n        officeSlug,\n        maxNum\n      );\n    });\n\n    window.addEventListener('resize', this.onResize);\n  }\n\n  componentDidUpdate() {\n    const {\n      className,\n      categoryNumbers,\n      candidatesRender,\n      candidates,\n      officeSlug,\n      maxNum,\n    } = this.props;\n\n    this.createGraphic(\n      className,\n      categoryNumbers,\n      candidatesRender,\n      candidates,\n      officeSlug,\n      maxNum\n    );\n  }\n\n  createGraphic(\n    className,\n    categoryNumbers,\n    candidatesRender,\n    candidates,\n    officeSlug,\n    maxNum\n  ) {\n    let { width, bodyWidth } = this.getContainerWidth(officeSlug);\n\n    let { height, breakPoint } = this.state;\n\n    d3.selectAll(`.bar-chart-${className}-${officeSlug} svg`).remove();\n\n    const container = d3.select(`.bar-chart-${className}-${officeSlug}`);\n\n    let newcand = candidates.map((obj) => ({\n      ...obj,\n      last_name: obj.name.split(' ').slice(-1).join(' '),\n      category_votes: categoryNumbers[1][0][obj.id],\n    }));\n\n    // chart setup\n    // Widen the left margin when a name label (like \"Rosenthal\") is longer\n    // than the default leaves room for; 12 is the label's gap from the bars\n    const labelWidth = this.measureLabels(container, newcand);\n    let margin = {\n      top: 0,\n      bottom: 20,\n      right: 30,\n      left: Math.max(70, Math.ceil(labelWidth) + 12),\n    };\n\n    (width = width - margin.left - margin.right),\n      (height =\n        categoryNumbers[1][0]['votes_still_to_count'] > 0 && showPrecinctsReporting ==  true\n          ? 90 - margin.top - margin.bottom\n          : 68 - margin.top - margin.bottom);\n\n    const isMobile = bodyWidth < breakPoint;\n\n    let svg = container\n      .append('svg')\n      .attr('width', width + margin.left + margin.right)\n      .attr('height', height + margin.top + margin.bottom);\n\n    let diagonalStripePattern = svg\n      .append('defs')\n      .append('pattern')\n      .attr('id', 'diagonal-stripe')\n      .attr('patternUnits', 'userSpaceOnUse')\n      .attr('patternTransform', 'rotate(45 0 0)')\n      .attr('width', 6)\n      .attr('height', 6);\n\n    diagonalStripePattern\n      .append('rect')\n      .attr('width', 6)\n      .attr('height', 6)\n      .style('fill', '#d9d9d9');\n\n    diagonalStripePattern\n      .append('line')\n      .attr('x1', 0)\n      .attr('y1', 0)\n      .attr('x2', 0)\n      .attr('y2', 6)\n      .style('stroke', 'black')\n      .style('stroke-width', 0.5);\n\n    let g = svg\n      .append('g')\n      .attr('class', `bar-chart-${className}-${officeSlug}-group`)\n      .attr('width', width)\n      .attr('transform', `translate(${margin.left},${margin.top})`);\n\n    // if (categoryNumbers[1][0]['votes_still_to_count'] > 0 && showPrecinctsReporting == true && isNaN(categoryNumbers[1][0]['votes_still_to_count']) == false) {\n    //   newcand.push({\n    //     category_votes: categoryNumbers[1][0]['votes_still_to_count'],\n    //     last_name: 'Votes left to count',\n    //     party: 'A-Votes',\n    //   });\n    // }\n\n    newcand = newcand.sort(function (a, b) {\n      return a.party.localeCompare(b.party);\n    });\n\n    let altMaxNum = 2963326;\n\n    var x = d3.scaleLinear().range([0, width]).domain([0, isNaN(maxNum) == true ? altMaxNum : maxNum]);\n\n    var y = d3\n      .scaleBand()\n      .domain(\n        newcand.map(function (entry) {\n          return entry.last_name;\n        })\n      )\n      .range([height, 0])\n      .padding(0.4);\n\n    // light gray bar underneath\n    let graybars = g\n      .selectAll('.bar-gray')\n      .data(newcand)\n      .enter()\n      .append('rect')\n      .attr('class', 'bar-light-gray')\n      .attr('fill', '#F5F5F5')\n      .attr('width', x(isNaN(maxNum) == true ? altMaxNum : maxNum))\n      .attr('y', (d) => y(d.last_name))\n      .attr('height', y.bandwidth());\n\n    // add the x Axis\n    g.append('g')\n      .attr('transform', 'translate(0,' + height + ')')\n      .call(\n        d3.axisBottom(x).ticks(3).tickFormat(customNumFormat).tickSize(-height)\n      )\n      .attr('class', 'axis axis--x')\n      .selectAll('text')\n      .attr('dy', '0.99em');\n\n    // add the y Axis\n    g.append('g')\n      .attr('class', 'axis axis--y')\n      .style('text-anchor', 'end')\n      .call(d3.axisLeft(y))\n      .selectAll('text')\n      .attr('y', 5)\n      .attr('x', -5)\n      .attr('text-anchor', 'end')\n      .text('')\n      .tspans((d) => wordwrap(d, 10))\n      .attr('x', -12);\n\n    d3.selectAll('tspan')\n      .nodes()\n      .forEach((d) => {\n        if (d.textContent == 'Votes left ') {\n          d.textContent = d.textContent.replace(/[ \\t]+$/g, '');\n        }\n      });\n\n    // append the rectangles for the bar chart\n    let bars = g\n      .selectAll('.bar')\n      .data(newcand)\n      .enter()\n      .append('rect')\n      .attr('class', 'bar-category')\n      .attr('fill', (d) => {\n        let foundCandidate = candidatesRender.find((a) => a.id == d.id);\n        if (foundCandidate) return foundCandidate.color;\n        else return '#bdbdbd';\n      })\n      .attr('width', (d) => x(d.category_votes))\n      .attr('y', (d) => y(d.last_name))\n      .attr('height', y.bandwidth());\n\n    g.selectAll('.bar')\n      .data(newcand)\n      .enter()\n      .append('text')\n      .attr('x', (d) => x(d.category_votes) + 3)\n      .attr('text-anchor', 'start')\n      .attr('y', (d) => y(d.last_name) + y.bandwidth() / 2)\n      .attr('dy', '.35em')\n      .text((d) => customBarNumFormat(d.category_votes));\n  }\n\n\n  // Width of the longest y-axis label line, measured in a throwaway axis group\n  // so it picks up the same .axis--y font styles as the real labels\n  measureLabels(container, candidates) {\n    const svg = container.append('svg');\n    const axis = svg.append('g').attr('class', 'axis axis--y');\n    let longest = 0;\n\n    candidates.forEach((d) => {\n      wordwrap(d.last_name, 10).forEach((line) => {\n        const text = axis.append('text').text(line).node();\n        longest = Math.max(longest, text.getComputedTextLength());\n      });\n    });\n\n    svg.remove();\n    return longest;\n  }\n\n  getContainerWidth(office_slug) {\n    const bodyWidth = document.body.offsetWidth;\n    const grid = this.base && this.base.parentElement.closest('.category-inline-grid');\n\n    if (!grid) {\n      const showcase = document.querySelector('.contest-showcase__contest');\n      return { width: showcase.offsetWidth - 80, bodyWidth };\n    }\n\n    const gap = parseFloat(getComputedStyle(grid).columnGap) || 0;\n    const tinyMap = grid.firstElementChild;\n    const width = Math.floor(\n      grid.parentElement.clientWidth - tinyMap.offsetWidth - gap\n    );\n\n    return { width, bodyWidth };\n  }\n\n  redrawGraphic() {\n    const { officeSlug } = this.props;\n    let { width, bodyWidth } = this.getContainerWidth(officeSlug);\n\n    this.setState({ width: width, bodyWidth: bodyWidth });\n  }\n\n  onResize() {\n    if (this.resizeFrame) return;\n\n    this.resizeFrame = window.requestAnimationFrame(() => {\n      this.resizeFrame = null;\n      this.redrawGraphic();\n    });\n  }\n\n  componentWillUnmount() {\n    window.removeEventListener('resize', this.onResize);\n    if (this.resizeFrame) window.cancelAnimationFrame(this.resizeFrame);\n  }\n\n  render() {\n    const { className, officeSlug } = this.props;\n\n    return (\n      <div\n        class={`category-bar-chart bar-chart-${className}-${officeSlug}`}\n      ></div>\n    );\n  }\n}\n\nexport default MiniBarChart;","import cx from 'classnames';\nimport { capfirst } from 'journalize';\nimport { Component, h } from 'preact';\n\nimport TinyMap from './TinyMap';\nimport tooltipHTML from '../utils/tooltip-html';\n\nimport text from 'Data/text.json';\nimport MiniBarChart from './MiniBarChart';\n\ninterface Props {\n  category: string;\n  maxNum: number;\n  categoryNumbers: { [key: string]: any };\n  contest: { [key: string]: any };\n  candidates: { [key: string]: any };\n  candidatesRender: any;\n  linkBase?: string;\n}\n\nclass AnalysisTableRow extends Component {\n  constructor() {\n    super();\n  }\n\n  render() {\n    const {\n      category,\n      categoryNumbers,\n      candidatesRender,\n      contest,\n      maxNum,\n      candidates,\n      linkBase,\n    } = this.props;\n\n    let categoryClass = cx(\n      'category-bar-chart-' + category + '-' + contest.office_slug\n    );\n\n    // Labels come from the text doc; fall back to the sheet's category name so\n    // a category missing from the doc doesn't break the whole graphic\n    const categoryLabel = (text.geocategories || []).find(\n      (a) => a.type == category\n    );\n    const category_text = categoryLabel\n      ? categoryLabel['value']\n      : capfirst(category);\n\n    const categoryExplain = (text.geocategories_explain || []).find(\n      (a) => a.type == category\n    );\n    const category_explain = categoryExplain ? categoryExplain['value'] : '';\n\n    const categoryTooltip = (text.geocategories_tooltip || []).find(\n      (a) => a.type == category\n    );\n    const category_tooltip = categoryTooltip ? categoryTooltip['value'] : '';\n    const tooltipId = `category-info-tooltip-${category}-${contest.office_slug}`;\n\n    return (\n      <div class='category-grid t-sans'>\n        <h4 class='map__title'>\n          {category_text}\n          {category_tooltip && (\n            <span class='category__info'>\n              <button\n                type='button'\n                class='category__info-pill'\n                aria-label={`About ${category_text.toLowerCase()}`}\n                aria-describedby={tooltipId}\n              >\n                <svg class='icon icon-info' aria-hidden='true'>\n                  <use xlinkHref='#icon-info'></use>\n                </svg>\n              </button>\n              <span\n                id={tooltipId}\n                role='tooltip'\n                class='category__info-tooltip'\n                dangerouslySetInnerHTML={{\n                  __html: tooltipHTML(category_tooltip, linkBase),\n                }}\n              />\n            </span>\n          )}\n        </h4>\n        {category_explain && (\n          <p\n            class='map__explain'\n            dangerouslySetInnerHTML={{ __html: category_explain }}\n          />\n        )}\n        <div class='category-inline-grid'>\n          <TinyMap\n            contest={contest}\n            category={category}\n            candidatesRender={candidatesRender}\n          />\n          <div class={categoryClass}>\n            <MiniBarChart\n              className={category}\n              maxNum={maxNum}\n              officeSlug={contest.office_slug}\n              categoryNumbers={categoryNumbers}\n              candidatesRender={candidatesRender}\n              candidates={candidates}\n            />\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n\nexport default AnalysisTableRow;","import { Component, h } from 'preact';\n\nimport AnalysisTableRow from './AnalysisTableRow';\n\nimport { APTotalVotesToCount } from '../election-utils';\nimport tooltipHTML from '../utils/tooltip-html';\n\nimport { SENATE, SHOWCASE_COLORS } from '../colors';\n\nimport { showPrecinctsReporting } from '../endpoints';\n\nimport countiesData from 'Data/data.json';\nimport context from 'Data/text.json';\n\ntype Props = {\n  contest: { [key: string]: any },\n};\n\nclass AnalysisTable extends Component<Props> {\n  constructor() {\n    super();\n  }\n\n  render() {\n    const { contest, candidates, counties, linkBase } = this.props;\n\n    let candidatesRender, sourceMap;\n\n    if (contest) {\n      let candidates = contest.candidacies;\n\n\n      candidatesRender = (SHOWCASE_COLORS[contest.office] || SENATE).map((object) => {\n        const result = candidates\n          .filter((obj) => obj.name == object.name)\n          .map((obj) => obj.id);\n        return { ...object, id: result[0] };\n      });\n\n      sourceMap = contest.source;\n    }\n\n\n    function groupBy(arr, criteria) {\n      const newObj = arr.reduce(function (acc, currentValue) {\n        if (!acc[currentValue[criteria]]) {\n          acc[currentValue[criteria]] = [];\n        }\n        const findCounties = counties\n          .filter((county) => county.county == currentValue['county'])\n          .map((obj) => obj.results)[0];\n        const findCounties2 = counties\n          .filter((county) => county.county == currentValue['county'])\n          .map((obj) => APTotalVotesToCount(obj['eevp'], obj['total_votes']))[0];\n        let arrayCounties = {\n          ...currentValue,\n          ...findCounties,\n          estimated_votes: findCounties2,\n        };\n\n        acc[currentValue[criteria]].push(arrayCounties);\n        return acc;\n      }, {});\n\n      const summedEntries = [];\n\n      Object.entries(newObj).forEach(function (val, idx) {\n        const result = val[1].reduce((r, e, i, a) => {\n          const candidateIds = Object.keys(e);\n          candidateIds.forEach((k) => (r[k] = (r[k] || 0) + parseInt(e[k])));\n\n          if (!a[i + 1])\n            Object.keys(e)\n              .filter((k) => typeof e[k] == 'string')\n              .forEach((k) => (r[k] /= val[1].length));\n          r['category'] = e.category;\n          delete r['county'];\n          delete r['county_CAPS'];\n\n          return r;\n        });\n\n        summedEntries.push(result);\n      });\n      return summedEntries;\n    }\n\n\n\n\n\n    function createArray(arr, criteria) {\n      const newObj = arr.reduce(function (acc, currentValue) {\n        if (!acc[currentValue[criteria]]) {\n          acc[currentValue[criteria]] = [];\n        }\n        acc[currentValue[criteria]].push(currentValue);\n        return acc;\n      }, []);\n\n      Object.entries(newObj).forEach(function (item, idx) {\n        function sum(obj) {\n          var sum = 0;\n          var arrayToGetMost = [];\n          for (var el in obj) {\n            if (el !== 'category' && el !== 'estimated_votes') {\n              sum += parseFloat(obj[el]);\n              arrayToGetMost.push(obj[el]);\n            }\n          }\n          return [sum, arrayToGetMost];\n        }\n        var totals = sum(item[1][0]);\n        item[1][0].total_votes = totals[0];\n        item[1][0].votes_still_to_count =\n          item[1][0].estimated_votes - totals[0];\n        totals[1].push(item[1][0].estimated_votes - totals[0]);\n        item[1][0].largest_number = Math.max(...totals[1]);\n        delete item[1][0].category;\n      });\n      return newObj;\n    }\n\n    const countiesByCategory = groupBy(countiesData.counties, 'category');\n\n    const arrayByCategories = createArray(countiesByCategory, 'category');\n\n\n    const objectCategories = Object.entries(arrayByCategories);\n\n\n    let arrayToGetLargest = [];\n\n    var sumofVotesLeftToCount = 0;\n\n    objectCategories.forEach((item) => {\n      arrayToGetLargest.push(item[1][0].largest_number);\n      sumofVotesLeftToCount += item[1][0].votes_still_to_count;\n    });\n\n\n    return (\n      <span>\n        <h3 class='category__title t-sans'>\n          {context.categories_headline}\n          <span class='category__info'>\n            <button\n              type='button'\n              class='category__info-pill'\n              aria-label='How we define these regions'\n              aria-describedby='category-info-tooltip'\n            >\n              ?\n            </button>\n            {context.regions_tooltip && (\n              <span\n                id='category-info-tooltip'\n                role='tooltip'\n                class='category__info-tooltip'\n                dangerouslySetInnerHTML={{\n                  __html: tooltipHTML(\n                    context.regions_tooltip\n                      .map((item) => item.value)\n                      .join(' '),\n                    linkBase\n                  ),\n                }}\n              />\n            )}\n          </span>\n        </h3>\n        <div class='category-grids t-sans'>\n          {objectCategories && objectCategories.map((categories) => (\n            <AnalysisTableRow\n              contest={contest}\n              category={categories[0]}\n              maxNum={Math.max(...arrayToGetLargest)}\n              categoryNumbers={categories}\n              candidates={candidates}\n              candidatesRender={candidatesRender}\n              linkBase={linkBase}\n            />\n          ))}\n        </div>\n        {/* {sumofVotesLeftToCount > 0 && showPrecinctsReporting == true && (\n          <ul class='graphic-footer'>\n            <li data-note>Note: {context.categories_notes}</li>\n          </ul>\n        )} */}\n      </span>\n    );\n  }\n}\n\nexport default AnalysisTable;","import { Component, h, createRef } from 'preact';\nimport { initFrameAndPoll, sendFrameHeight } from '@newswire/frames';\n\nclass FramesChild extends Component {\n  constructor(props) {\n    super(props);\n    this.ref = createRef();\n\n    const { polling } = this.props;\n\n    let opts = {};\n    if (polling) opts.polling = polling;\n  }\n\n  componentDidMount() {\n    const { polling } = this.props;\n\n    initFrameAndPoll(polling);\n  }\n\n  componentDidUpdate() {\n    sendFrameHeight();\n  }\n\n  render({ class: klass }) {\n    return (\n      <div class={klass} ref={this.ref}>\n        {this.props.children}\n      </div>\n    );\n  }\n}\n\nexport default FramesChild;","import cx from 'classnames';\nimport { intcomma } from 'journalize';\nimport { h, VNode } from 'preact';\n\nimport PureComponent from './PureComponent';\n\nimport winnerClass from '../utils/winner-class';\nimport AnimatedNumber from './AnimatedNumber';\nimport PctChange from './PctChange';\nimport PartyPill from './PartyPill';\nimport VoteBar from './VoteBar';\n\ninterface Props {\n  ballotName: string;\n  candidateId: string;\n  contestIsCalled: boolean;\n  contestResult: string;\n  isIncumbent: boolean;\n  isWinner: boolean;\n  candidateColors: { [key: string]: any };\n  party: string;\n  totalVotesInContest: number;\n  votes: number;\n}\n\nconst formatVotes = (n: number) => intcomma(Math.round(n));\nconst formatPct = (n: number) => n.toFixed(1);\nconst pctValue = (votes: number, total: number) =>\n  total == null || total <= 0 ? 0 : (votes / total) * 100;\n\nclass HeadshotCandidateRow extends PureComponent<Props> {\n  static columnCount: number;\n  static Header: VNode;\n\n  render() {\n    const {\n      ballotName,\n      candidateId,\n      contestIsCalled,\n      contestResult,\n      isIncumbent,\n      isWinner,\n      party,\n      isViewable,\n      totalVotesInContest,\n      candidateColors,\n      votes,\n    } = this.props;\n\n    let getColor;\n\n    if (candidateColors) {\n      getColor = candidateColors\n        .filter(obj => obj.name == ballotName)\n        .map(obj => obj.color);\n    } else {\n      getColor = ['#777777'];\n    }\n\n    const divStyle = {\n      'background-color': getColor[0],\n    };\n\n    const checkStyle = {\n      color: getColor[0],\n    };\n\n    const IsAsterisk = ballotName == 'Rick Perry' ? true : false;\n\n    let rowClass = cx(\n      'candidate',\n      'contest__candidate-row',\n      'contest__candidate-row--headshot',\n      {\n        'contest__candidate-row--winner dem--border':\n          contestIsCalled && isWinner && party == 'Democrat',\n        'contest__candidate-row--winner rep--border':\n          contestIsCalled && isWinner && party == 'Republican',\n      }\n    );\n\n    const checkClass = cx('check', winnerClass(party, contestResult));\n\n    if (!isViewable) {\n      rowClass += ' race__candidate-row--hidden';\n    }\n\n    const checkmark = '\\u2713';\n\n    return (\n      <tr class={rowClass}>\n        <td class=\"candidate__cell candidate__party\">\n            <PartyPill party={party} style={divStyle} />\n        </td>\n        <th class=\"candidate__cell candidate__name\">\n          <span class=\"candidate__name-line\">\n            {contestIsCalled && isWinner && contestResult != 'runoff' && (\n              <span class={checkClass} style={checkStyle}>\n                {checkmark}\n              </span>\n            )}\n            {contestIsCalled && isWinner && contestResult == 'runoff' && (\n              <span class={checkClass}>{checkmark}</span>\n            )}\n            {contestIsCalled && isWinner && contestResult != 'runoff' ? (\n              <span class={checkClass}>{ballotName}</span>\n            ) : (\n              ballotName\n            )}\n            {IsAsterisk && <span class=\"asterisk\">*</span>}{' '}\n            {isIncumbent && (\n              <span class=\"pill pill--basic\" title=\"Currently holds this seat\">\n                Incumbent\n              </span>\n            )}\n          </span>\n          <VoteBar\n            value={pctValue(votes, totalVotesInContest)}\n            party={party}\n            color={getColor[0]}\n          />\n        </th>\n        <td class=\"candidate__cell candidate__votes\"><AnimatedNumber value={votes} format={formatVotes} /></td>\n        <td class=\"candidate__cell candidate__pct\">\n          <PctChange value={pctValue(votes, totalVotesInContest)} party={party} />\n          <AnimatedNumber\n            value={pctValue(votes, totalVotesInContest)}\n            format={formatPct}\n            odometerFormat=\"(,ddd).d\"\n          />\n          <span class=\"candidate__pct-symbol\">%</span>\n        </td>\n      </tr>\n    );\n  }\n}\n\nHeadshotCandidateRow.defaultProps = {\n  isIncumbent: false,\n  isCalled: false,\n  isWinner: false,\n  isViewable: true,\n};\n\nHeadshotCandidateRow.Header = (\n  <thead>\n    <tr>\n      <th class=\"contest__candidate-header\" colSpan={2}>\n        Candidates\n      </th>\n      <th class=\"contest__candidate-header contest__candidate-header--numeric\">\n        Votes\n      </th>\n      <th class=\"contest__candidate-header contest__candidate-header--numeric\">\n        Pct.\n        <span class=\"candidate__pct-symbol\">%</span>\n      </th>\n    </tr>\n  </thead>\n);\n\nHeadshotCandidateRow.columnCount = 6;\n\nexport default HeadshotCandidateRow;","import { Component as PreactComponent, h } from 'preact';\n\nfunction resolve(m) {\n  return m && m.default ? m.default : m;\n}\n\nfunction asyncComponent(importComponent) {\n  return class extends PreactComponent {\n    constructor() {\n      super();\n\n      this.state = { component: null };\n    }\n\n    componentDidMount() {\n      importComponent().then(component =>\n        this.setState({ component: resolve(component) })\n      );\n    }\n\n    render() {\n      const { component: Component } = this.state;\n\n      return Component ? <Component {...this.props} /> : null;\n    }\n  };\n}\n\nexport default asyncComponent;\n","export default class FlatQueue {\n  constructor() {\n    this.ids = [];\n    this.values = [];\n    this.length = 0;\n  }\n\n  clear() {\n    this.length = this.ids.length = this.values.length = 0;\n  }\n\n  push(id, value) {\n    this.ids.push(id);\n    this.values.push(value);\n\n    let pos = this.length++;\n    while (pos > 0) {\n      const parent = (pos - 1) >> 1;\n      const parentValue = this.values[parent];\n      if (value >= parentValue) break;\n      this.ids[pos] = this.ids[parent];\n      this.values[pos] = parentValue;\n      pos = parent;\n    }\n\n    this.ids[pos] = id;\n    this.values[pos] = value;\n  }\n\n  pop() {\n    if (this.length === 0) return undefined;\n\n    const top = this.ids[0];\n    this.length--;\n\n    if (this.length > 0) {\n      const id = (this.ids[0] = this.ids[this.length]);\n      const value = (this.values[0] = this.values[this.length]);\n      const halfLength = this.length >> 1;\n      let pos = 0;\n\n      while (pos < halfLength) {\n        let left = (pos << 1) + 1;\n        const right = left + 1;\n        let bestIndex = this.ids[left];\n        let bestValue = this.values[left];\n        const rightValue = this.values[right];\n\n        if (right < this.length && rightValue < bestValue) {\n          left = right;\n          bestIndex = this.ids[right];\n          bestValue = rightValue;\n        }\n        if (bestValue >= value) break;\n\n        this.ids[pos] = bestIndex;\n        this.values[pos] = bestValue;\n        pos = left;\n      }\n\n      this.ids[pos] = id;\n      this.values[pos] = value;\n    }\n\n    this.ids.pop();\n    this.values.pop();\n\n    return top;\n  }\n\n  peek() {\n    return this.ids[0];\n  }\n\n  peekValue() {\n    return this.values[0];\n  }\n}","import FlatQueue from './flatqueue';\n\nconst ARRAY_TYPES = [\n  Int8Array,\n  Uint8Array,\n  Uint8ClampedArray,\n  Int16Array,\n  Uint16Array,\n  Int32Array,\n  Uint32Array,\n  Float32Array,\n  Float64Array,\n];\n\nconst VERSION = 3; // serialized format version\n\nexport default class Flatbush {\n  static from(data) {\n    if (!(data instanceof ArrayBuffer)) {\n      throw new Error('Data must be an instance of ArrayBuffer.');\n    }\n    const [magic, versionAndType] = new Uint8Array(data, 0, 2);\n    if (magic !== 0xfb) {\n      throw new Error('Data does not appear to be in a Flatbush format.');\n    }\n    if (versionAndType >> 4 !== VERSION) {\n      throw new Error(\n        `Got v${versionAndType >> 4} data when expected v${VERSION}.`\n      );\n    }\n    const [nodeSize] = new Uint16Array(data, 2, 1);\n    const [numItems] = new Uint32Array(data, 4, 1);\n\n    return new Flatbush(\n      numItems,\n      nodeSize,\n      ARRAY_TYPES[versionAndType & 0x0f],\n      data\n    );\n  }\n\n  constructor(numItems, nodeSize = 16, ArrayType = Float64Array, data) {\n    if (numItems === undefined)\n      throw new Error('Missing required argument: numItems.');\n    if (isNaN(numItems) || numItems <= 0)\n      throw new Error(`Unpexpected numItems value: ${numItems}.`);\n\n    this.numItems = +numItems;\n    this.nodeSize = Math.min(Math.max(+nodeSize, 2), 65535);\n\n    // calculate the total number of nodes in the R-tree to allocate space for\n    // and the index of each tree level (used in search later)\n    let n = numItems;\n    let numNodes = n;\n    this._levelBounds = [n * 4];\n    do {\n      n = Math.ceil(n / this.nodeSize);\n      numNodes += n;\n      this._levelBounds.push(numNodes * 4);\n    } while (n !== 1);\n\n    this.ArrayType = ArrayType || Float64Array;\n    this.IndexArrayType = numNodes < 16384 ? Uint16Array : Uint32Array;\n\n    const arrayTypeIndex = ARRAY_TYPES.indexOf(this.ArrayType);\n    const nodesByteSize = numNodes * 4 * this.ArrayType.BYTES_PER_ELEMENT;\n\n    if (arrayTypeIndex < 0) {\n      throw new Error(`Unexpected typed array class: ${ArrayType}.`);\n    }\n\n    if (data && data instanceof ArrayBuffer) {\n      this.data = data;\n      this._boxes = new this.ArrayType(this.data, 8, numNodes * 4);\n      this._indices = new this.IndexArrayType(\n        this.data,\n        8 + nodesByteSize,\n        numNodes\n      );\n\n      this._pos = numNodes * 4;\n      this.minX = this._boxes[this._pos - 4];\n      this.minY = this._boxes[this._pos - 3];\n      this.maxX = this._boxes[this._pos - 2];\n      this.maxY = this._boxes[this._pos - 1];\n    } else {\n      this.data = new ArrayBuffer(\n        8 + nodesByteSize + numNodes * this.IndexArrayType.BYTES_PER_ELEMENT\n      );\n      this._boxes = new this.ArrayType(this.data, 8, numNodes * 4);\n      this._indices = new this.IndexArrayType(\n        this.data,\n        8 + nodesByteSize,\n        numNodes\n      );\n      this._pos = 0;\n      this.minX = Infinity;\n      this.minY = Infinity;\n      this.maxX = -Infinity;\n      this.maxY = -Infinity;\n\n      new Uint8Array(this.data, 0, 2).set([\n        0xfb,\n        (VERSION << 4) + arrayTypeIndex,\n      ]);\n      new Uint16Array(this.data, 2, 1)[0] = nodeSize;\n      new Uint32Array(this.data, 4, 1)[0] = numItems;\n    }\n\n    // a priority queue for k-nearest-neighbors queries\n    this._queue = new FlatQueue();\n  }\n\n  add(minX, minY, maxX, maxY) {\n    const index = this._pos >> 2;\n    this._indices[index] = index;\n    this._boxes[this._pos++] = minX;\n    this._boxes[this._pos++] = minY;\n    this._boxes[this._pos++] = maxX;\n    this._boxes[this._pos++] = maxY;\n\n    if (minX < this.minX) this.minX = minX;\n    if (minY < this.minY) this.minY = minY;\n    if (maxX > this.maxX) this.maxX = maxX;\n    if (maxY > this.maxY) this.maxY = maxY;\n  }\n\n  finish() {\n    if (this._pos >> 2 !== this.numItems) {\n      throw new Error(\n        `Added ${this._pos >> 2} items when expected ${this.numItems}.`\n      );\n    }\n\n    const width = this.maxX - this.minX;\n    const height = this.maxY - this.minY;\n    const hilbertValues = new Uint32Array(this.numItems);\n    const hilbertMax = (1 << 16) - 1;\n\n    // map item centers into Hilbert coordinate space and calculate Hilbert values\n    for (let i = 0; i < this.numItems; i++) {\n      let pos = 4 * i;\n      const minX = this._boxes[pos++];\n      const minY = this._boxes[pos++];\n      const maxX = this._boxes[pos++];\n      const maxY = this._boxes[pos++];\n      const x = Math.floor(\n        (hilbertMax * ((minX + maxX) / 2 - this.minX)) / width\n      );\n      const y = Math.floor(\n        (hilbertMax * ((minY + maxY) / 2 - this.minY)) / height\n      );\n      hilbertValues[i] = hilbert(x, y);\n    }\n\n    // sort items by their Hilbert value (for packing later)\n    sort(hilbertValues, this._boxes, this._indices, 0, this.numItems - 1);\n\n    // generate nodes at each tree level, bottom-up\n    for (let i = 0, pos = 0; i < this._levelBounds.length - 1; i++) {\n      const end = this._levelBounds[i];\n\n      // generate a parent node for each block of consecutive <nodeSize> nodes\n      while (pos < end) {\n        let nodeMinX = Infinity;\n        let nodeMinY = Infinity;\n        let nodeMaxX = -Infinity;\n        let nodeMaxY = -Infinity;\n        const nodeIndex = pos;\n\n        // calculate bbox for the new node\n        for (let i = 0; i < this.nodeSize && pos < end; i++) {\n          const minX = this._boxes[pos++];\n          const minY = this._boxes[pos++];\n          const maxX = this._boxes[pos++];\n          const maxY = this._boxes[pos++];\n          if (minX < nodeMinX) nodeMinX = minX;\n          if (minY < nodeMinY) nodeMinY = minY;\n          if (maxX > nodeMaxX) nodeMaxX = maxX;\n          if (maxY > nodeMaxY) nodeMaxY = maxY;\n        }\n\n        // add the new node to the tree data\n        this._indices[this._pos >> 2] = nodeIndex;\n        this._boxes[this._pos++] = nodeMinX;\n        this._boxes[this._pos++] = nodeMinY;\n        this._boxes[this._pos++] = nodeMaxX;\n        this._boxes[this._pos++] = nodeMaxY;\n      }\n    }\n  }\n\n  search(minX, minY, maxX, maxY, filterFn) {\n    if (this._pos !== this._boxes.length) {\n      throw new Error('Data not yet indexed - call index.finish().');\n    }\n\n    let nodeIndex = this._boxes.length - 4;\n    let level = this._levelBounds.length - 1;\n    const queue = [];\n    const results = [];\n\n    while (nodeIndex !== undefined) {\n      // find the end index of the node\n      const end = Math.min(\n        nodeIndex + this.nodeSize * 4,\n        this._levelBounds[level]\n      );\n\n      // search through child nodes\n      for (let pos = nodeIndex; pos < end; pos += 4) {\n        const index = this._indices[pos >> 2];\n\n        // check if node bbox intersects with query bbox\n        if (maxX < this._boxes[pos]) continue; // maxX < nodeMinX\n        if (maxY < this._boxes[pos + 1]) continue; // maxY < nodeMinY\n        if (minX > this._boxes[pos + 2]) continue; // minX > nodeMaxX\n        if (minY > this._boxes[pos + 3]) continue; // minY > nodeMaxY\n\n        if (nodeIndex < this.numItems * 4) {\n          if (filterFn === undefined || filterFn(index)) {\n            results.push(index); // leaf item\n          }\n        } else {\n          queue.push(index); // node; add it to the search queue\n          queue.push(level - 1);\n        }\n      }\n\n      level = queue.pop();\n      nodeIndex = queue.pop();\n    }\n\n    return results;\n  }\n\n  neighbors(x, y, maxResults = Infinity, maxDistance = Infinity, filterFn) {\n    if (this._pos !== this._boxes.length) {\n      throw new Error('Data not yet indexed - call index.finish().');\n    }\n\n    let nodeIndex = this._boxes.length - 4;\n    const q = this._queue;\n    const results = [];\n    const maxDistSquared = maxDistance * maxDistance;\n\n    while (nodeIndex !== undefined) {\n      // find the end index of the node\n      const end = Math.min(\n        nodeIndex + this.nodeSize * 4,\n        upperBound(nodeIndex, this._levelBounds)\n      );\n\n      // add child nodes to the queue\n      for (let pos = nodeIndex; pos < end; pos += 4) {\n        const index = this._indices[pos >> 2];\n\n        const dx = axisDist(x, this._boxes[pos], this._boxes[pos + 2]);\n        const dy = axisDist(y, this._boxes[pos + 1], this._boxes[pos + 3]);\n        const dist = dx * dx + dy * dy;\n\n        if (nodeIndex < this.numItems * 4) {\n          // leaf node\n          if (filterFn === undefined || filterFn(index)) {\n            // put a negative index if it's an item rather than a node, to recognize later\n            q.push(-index - 1, dist);\n          }\n        } else {\n          q.push(index, dist);\n        }\n      }\n\n      // pop items from the queue\n      while (q.length && q.peek() < 0) {\n        const dist = q.peekValue();\n        if (dist > maxDistSquared) {\n          q.clear();\n          return results;\n        }\n        results.push(-q.pop() - 1);\n\n        if (results.length === maxResults) {\n          q.clear();\n          return results;\n        }\n      }\n\n      nodeIndex = q.pop();\n    }\n\n    q.clear();\n    return results;\n  }\n}\n\nfunction axisDist(k, min, max) {\n  return k < min ? min - k : k <= max ? 0 : k - max;\n}\n\n// binary search for the first value in the array bigger than the given\nfunction upperBound(value, arr) {\n  let i = 0;\n  let j = arr.length - 1;\n  while (i < j) {\n    const m = (i + j) >> 1;\n    if (arr[m] > value) {\n      j = m;\n    } else {\n      i = m + 1;\n    }\n  }\n  return arr[i];\n}\n\n// custom quicksort that sorts bbox data alongside the hilbert values\nfunction sort(values, boxes, indices, left, right) {\n  if (left >= right) return;\n\n  const pivot = values[(left + right) >> 1];\n  let i = left - 1;\n  let j = right + 1;\n\n  while (true) {\n    do i++;\n    while (values[i] < pivot);\n    do j--;\n    while (values[j] > pivot);\n    if (i >= j) break;\n    swap(values, boxes, indices, i, j);\n  }\n\n  sort(values, boxes, indices, left, j);\n  sort(values, boxes, indices, j + 1, right);\n}\n\n// swap two values and two corresponding boxes\nfunction swap(values, boxes, indices, i, j) {\n  const temp = values[i];\n  values[i] = values[j];\n  values[j] = temp;\n\n  const k = 4 * i;\n  const m = 4 * j;\n\n  const a = boxes[k];\n  const b = boxes[k + 1];\n  const c = boxes[k + 2];\n  const d = boxes[k + 3];\n  boxes[k] = boxes[m];\n  boxes[k + 1] = boxes[m + 1];\n  boxes[k + 2] = boxes[m + 2];\n  boxes[k + 3] = boxes[m + 3];\n  boxes[m] = a;\n  boxes[m + 1] = b;\n  boxes[m + 2] = c;\n  boxes[m + 3] = d;\n\n  const e = indices[i];\n  indices[i] = indices[j];\n  indices[j] = e;\n}\n\n// Fast Hilbert curve algorithm by http://threadlocalmutex.com/\n// Ported from C++ https://github.com/rawrunprotected/hilbert_curves (public domain)\nfunction hilbert(x, y) {\n  let a = x ^ y;\n  let b = 0xffff ^ a;\n  let c = 0xffff ^ (x | y);\n  let d = x & (y ^ 0xffff);\n\n  let A = a | (b >> 1);\n  let B = (a >> 1) ^ a;\n  let C = (c >> 1) ^ (b & (d >> 1)) ^ c;\n  let D = (a & (c >> 1)) ^ (d >> 1) ^ d;\n\n  a = A;\n  b = B;\n  c = C;\n  d = D;\n  A = (a & (a >> 2)) ^ (b & (b >> 2));\n  B = (a & (b >> 2)) ^ (b & ((a ^ b) >> 2));\n  C ^= (a & (c >> 2)) ^ (b & (d >> 2));\n  D ^= (b & (c >> 2)) ^ ((a ^ b) & (d >> 2));\n\n  a = A;\n  b = B;\n  c = C;\n  d = D;\n  A = (a & (a >> 4)) ^ (b & (b >> 4));\n  B = (a & (b >> 4)) ^ (b & ((a ^ b) >> 4));\n  C ^= (a & (c >> 4)) ^ (b & (d >> 4));\n  D ^= (b & (c >> 4)) ^ ((a ^ b) & (d >> 4));\n\n  a = A;\n  b = B;\n  c = C;\n  d = D;\n  C ^= (a & (c >> 8)) ^ (b & (d >> 8));\n  D ^= (b & (c >> 8)) ^ ((a ^ b) & (d >> 8));\n\n  a = C ^ (C >> 1);\n  b = D ^ (D >> 1);\n\n  let i0 = x ^ y;\n  let i1 = b | (0xffff ^ (i0 | a));\n\n  i0 = (i0 | (i0 << 8)) & 0x00ff00ff;\n  i0 = (i0 | (i0 << 4)) & 0x0f0f0f0f;\n  i0 = (i0 | (i0 << 2)) & 0x33333333;\n  i0 = (i0 | (i0 << 1)) & 0x55555555;\n\n  i1 = (i1 | (i1 << 8)) & 0x00ff00ff;\n  i1 = (i1 | (i1 << 4)) & 0x0f0f0f0f;\n  i1 = (i1 | (i1 << 2)) & 0x33333333;\n  i1 = (i1 | (i1 << 1)) & 0x55555555;\n\n  return ((i1 << 1) | i0) >>> 0;\n}","import { feature, mesh } from 'topojson-client';\nimport getBBox from '@turf/bbox';\n\nimport Flatbush from '../vendor/flatbush';\n\nconst innerCompare = (a: TopoJSON.GeometryObject, b: TopoJSON.GeometryObject) =>\n  a !== b;\nconst outerCompare = (a: TopoJSON.GeometryObject, b: TopoJSON.GeometryObject) =>\n  a === b;\n\nfunction prepareTopoJSON(topology: TopoJSON.Topology, key?: string) {\n  const object = topology.objects[\n    key || Object.keys(topology.objects)[0]\n  ] as TopoJSON.GeometryCollection;\n  const roadsObject = topology.objects['roads'] as TopoJSON.GeometryCollection;\n  const placesObject = topology.objects[\n    'places'\n  ] as TopoJSON.GeometryCollection;\n  const urbanAreasObject = topology.objects[\n    'urban_areas'\n  ] as TopoJSON.GeometryCollection;\n\n  const collection = feature(topology, object);\n  const roads = feature(topology, roadsObject);\n  const places = feature(topology, placesObject);\n  const urban_areas = feature(topology, urbanAreasObject);\n  // const innerlines = mesh(topology, object, innerCompare);\n  // const outerlines = mesh(topology, object, outerCompare);\n  const bbox = topology.bbox || getBBox(collection);\n\n  const index = new Flatbush(collection.features.length);\n  collection.features.forEach(feature => {\n    const bounds = getBBox(feature);\n    index.add(...bounds);\n  });\n  index.finish();\n\n  const heightRatio = (bbox[3] - bbox[1]) / (bbox[2] - bbox[0]);\n\n  return {\n    collection,\n    // features,\n    // innerlines,\n    // outerlines,\n    bbox,\n    heightRatio,\n    index,\n    roads,\n    places,\n    urban_areas,\n  };\n}\n\nexport default prepareTopoJSON;","import { h } from 'preact';\n\nconst MAP_TYPES = [\n  { type: 'categorical', label: 'By candidate' },\n  { type: 'breakdown', label: 'Breakdown' },\n];\n\n// Toggle between the county map (\"By candidate\") and the pie cartogram\nconst MapTypeButtons = ({ active, onSelect }) => (\n  <div class=\"map-btn-group\">\n    {MAP_TYPES.map(({ type, label }) => (\n      <button\n        className={\n          active === type ? 'map-button map-button--active' : 'map-button'\n        }\n        onClick={() => onSelect(type)}\n      >\n        {label}\n      </button>\n    ))}\n  </div>\n);\n\nexport default MapTypeButtons;\n","function formatPercent(n: number, d: number): string {\n  if (d == null || d <= 0) return '0.0';\n\n  return ((n / d) * 100).toFixed(1);\n}\n\nexport default formatPercent;","'use strict';\n\n// We depend on intersection-observer enough that it should just be assumed as necessary\nrequire('intersection-observer');\n","function _arrayLikeToArray(r, a) {\n  (null == a || a > r.length) && (a = r.length);\n  for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];\n  return n;\n}\nexport { _arrayLikeToArray as default };","import arrayWithHoles from \"./arrayWithHoles.js\";\nimport iterableToArrayLimit from \"./iterableToArrayLimit.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableRest from \"./nonIterableRest.js\";\nfunction _slicedToArray(r, e) {\n  return arrayWithHoles(r) || iterableToArrayLimit(r, e) || unsupportedIterableToArray(r, e) || nonIterableRest();\n}\nexport { _slicedToArray as default };","function _arrayWithHoles(r) {\n  if (Array.isArray(r)) return r;\n}\nexport { _arrayWithHoles as default };","function _iterableToArrayLimit(r, l) {\n  var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n  if (null != t) {\n    var e,\n      n,\n      i,\n      u,\n      a = [],\n      f = !0,\n      o = !1;\n    try {\n      if (i = (t = t.call(r)).next, 0 === l) {\n        if (Object(t) !== t) return;\n        f = !1;\n      } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);\n    } catch (r) {\n      o = !0, n = r;\n    } finally {\n      try {\n        if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return;\n      } finally {\n        if (o) throw n;\n      }\n    }\n    return a;\n  }\n}\nexport { _iterableToArrayLimit as default };","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nfunction _unsupportedIterableToArray(r, a) {\n  if (r) {\n    if (\"string\" == typeof r) return arrayLikeToArray(r, a);\n    var t = {}.toString.call(r).slice(8, -1);\n    return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? arrayLikeToArray(r, a) : void 0;\n  }\n}\nexport { _unsupportedIterableToArray as default };","function _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nexport { _nonIterableRest as default };","import { Component, h } from 'preact';\n\n\ninterface Props {\n  value: number;\n  party?: string;\n  // Custom candidate color, used in place of the party color when set\n  color?: string;\n}\n\ninterface State {\n  direction: 'up' | 'down' | null;\n  // Bumped on each change so the fade animation restarts\n  changeCount: number;\n}\n\n// How long the arrow stays up, including its fade out (see .pct-change__arrow)\nconst VISIBLE_MS = 5000;\n\n// Spelled out in full so PurgeCSS (config/tasks/unused-css.js) keeps them.\n// Same party colors as the PartyPill circles.\nconst PARTY_CLASSES: { [prefix: string]: string } = {\n  rep: 'pct-change--rep',\n  dem: 'pct-change--dem',\n  lib: 'pct-change--lib',\n  ind: 'pct-change--ind',\n  gre: 'pct-change--gre',\n};\n\n// Compare what readers see, so tiny shifts that round away don't flip the arrow\nconst rounded = (n: number) => Math.round(n * 10) / 10;\n\n// Arrow that briefly shows whether a percent rose or fell in a results refresh\nclass PctChange extends Component<Props, State> {\n  state: State = { direction: null, changeCount: 0 };\n  timer: number;\n\n  componentWillReceiveProps(nextProps: Props) {\n    const prev = rounded(this.props.value);\n    const next = rounded(nextProps.value);\n\n    if (next !== prev) {\n      window.clearTimeout(this.timer);\n      this.setState({\n        direction: next > prev ? 'up' : 'down',\n        changeCount: this.state.changeCount + 1,\n      });\n      this.timer = window.setTimeout(\n        () => this.setState({ direction: null }),\n        VISIBLE_MS\n      );\n    }\n  }\n\n  componentWillUnmount() {\n    window.clearTimeout(this.timer);\n  }\n\n  render({ party, color }: Props, { direction, changeCount }: State) {\n    const partyClass = party && PARTY_CLASSES[party.slice(0, 3).toLowerCase()];\n\n    return (\n      <span\n        class={partyClass ? `pct-change ${partyClass}` : 'pct-change'}\n        style={color ? { color } : undefined}\n      >\n        {direction && (\n          <span key={changeCount} class=\"pct-change__arrow\">\n            <svg aria-hidden=\"true\">\n              <use\n                xlinkHref={direction === 'up' ? '#icon-up-arrow' : '#icon-down-arrow'}\n              />\n            </svg>\n            <span class=\"is-sr-only\">{direction === 'up' ? 'Up' : 'Down'}</span>\n          </span>\n        )}\n      </span>\n    );\n  }\n}\n\nexport default PctChange;\n","// Maps a winner's party to its color class (.dem-winner, .rep-winner,\n// .lib-winner, .gre-winner, .ind-winner). Uses the same three-letter prefix\n// as PartyPill, so it doesn't depend on exact party spellings.\nfunction winnerClass(party: string, contestResult?: string): string {\n  if (contestResult == 'runoff') return 'runoff-winner';\n  if (!party) return '';\n\n  return `${party.slice(0, 3).toLowerCase()}-winner`;\n}\n\nexport default winnerClass;\n","import { BBox } from \"geojson\";\nimport { AllGeoJSON } from \"@turf/helpers\";\nimport { coordEach } from \"@turf/meta\";\n\n/**\n * Calculates the bounding box for any GeoJSON object, including FeatureCollection.\n * Uses geojson.bbox if available and options.recompute is not set.\n *\n * @function\n * @param {GeoJSON} geojson any GeoJSON object\n * @param {Object} [options={}] Optional parameters\n * @param {boolean} [options.recompute] Whether to ignore an existing bbox property on geojson\n * @returns {BBox} bbox extent in [minX, minY, maxX, maxY] order\n * @example\n * var line = turf.lineString([[-74, 40], [-78, 42], [-82, 35]]);\n * var bbox = turf.bbox(line);\n * var bboxPolygon = turf.bboxPolygon(bbox);\n *\n * //addToMap\n * var addToMap = [line, bboxPolygon]\n */\nfunction bbox(\n  geojson: AllGeoJSON,\n  options: {\n    recompute?: boolean;\n  } = {}\n): BBox {\n  if (geojson.bbox != null && true !== options.recompute) {\n    return geojson.bbox;\n  }\n  const result: BBox = [Infinity, Infinity, -Infinity, -Infinity];\n  coordEach(geojson, (coord) => {\n    if (result[0] > coord[0]) {\n      result[0] = coord[0];\n    }\n    if (result[1] > coord[1]) {\n      result[1] = coord[1];\n    }\n    if (result[2] < coord[0]) {\n      result[2] = coord[0];\n    }\n    if (result[3] < coord[1]) {\n      result[3] = coord[1];\n    }\n  });\n  return result;\n}\n\nexport { bbox };\nexport default bbox;\n","// Live results being updated by Republic\nconst FLAT_RESULTS_URL =\n  'https://s3.amazonaws.com/sos-test-2.texastribune.org/2026_general/republic_json/results_FLAT.json';\n\n// This has emptied out results i.e. is static\nconst STATIC_FLAT_RESULTS_URL =\n  'https://s3.amazonaws.com/sos-test-2.texastribune.org/2026_general/republic_json/results_static_FLAT.json';\n\n// This has the final certified results and is static\nconst FINAL_RESULTS_URL =\n  'https://s3.amazonaws.com/sos-test-2.texastribune.org/2024_general/republic_json/results_FLAT_FINAL_RESULTS.json'\n\n// Includes fake results data for testing\nconst FAKE_RESULTS_URL =\n  'https://s3.us-east-1.amazonaws.com/sos-test-2.texastribune.org/2024_general/republic_json/results_FLAT_COMPLETE_TEST.json';\n\nconst FAKE_RESULTS_URL_TWO =\n  'https://s3.amazonaws.com/sos-test-2.texastribune.org/2024_general/republic_json/results_FLAT_AP_test.json';\n\n// Used for homepage takeover\nconst HOMEPAGE_URL =\n  'https://s3.amazonaws.com/sos-test-2.texastribune.org/2024_general/homepage_takeover/2024-general.json';\n\n// Calls TT stories using the API\nconst STORY_API_URL = (id: number): string =>\n  `https://www.texastribune.org/api/v2/articles/${id}/?format=json&fields=sitewide_image,summary,authors,url,pub_date,updated_date,homepage_headline`;\n\n// This is for the other candidates for the hide/show toggle\nconst visibleCandidatesCount = 6;\n\n// This is for the other candidates for the hide/show toggle just in the homepage\nconst visibleCandidatesCountHomepage = 2;\n\n// Show bubble map toggle option. Set to false if we want to hide it.\nconst showBubbleMap = true;\n\n// Show categories map toggle option. Set to false if we want to hide it.\nconst showCategoriesMap = true;\n\n// Show precincts or estimated votes still being counted text\nconst showPrecinctsReporting = false;\n\n// Adds the checkmark if this is the final official results from local canvass\nconst isCanvass = false;\n\n// Show last updated timestamp, set to true to last updated text\nconst showLastUpdated = false;\n\n// What we are using across the ap\n// will be used on the results page, in the homepage takeover\n// and in the embeds\nconst RESULTS_IN_USE = FLAT_RESULTS_URL;\n\nexport {\n  RESULTS_IN_USE,\n  HOMEPAGE_URL,\n  STORY_API_URL,\n  visibleCandidatesCount,\n  visibleCandidatesCountHomepage,\n  showPrecinctsReporting,\n  isCanvass,\n  showLastUpdated,\n  showBubbleMap,\n  showCategoriesMap,\n};","/**\n * Grabs the contents of a `jsonScript` created JSON inline string and returns\n * it as a JSON object. If the element does not exist, or if the script\n * element does not have the JSON MIME type, null is returned instead.\n *\n * @param  {String} elementId the ID of the JSON script element\n * @return {Object|null}\n */\nexport default function loadJsonScript(elementId) {\n  const element = document.getElementById(elementId);\n\n  if (element && element.getAttribute('type') === 'application/json') {\n    return JSON.parse(element.textContent);\n  } else {\n    return null;\n  }\n}\n","/**\n * Sums up values of a property across objects in an array.\n *\n * @param {Array} arr An array of objects.\n * @param {String} key The property to sum across objects.\n * @return {Number}\n */\nexport default function sumValues(arr, key) {\n  return arr.reduce((acc, obj) => acc + obj[key], 0);\n}\n","import cx from 'classnames';\nimport { intcomma } from 'journalize';\nimport { Component, h, VNode } from 'preact';\n\nimport AnimatedNumber from './AnimatedNumber';\nimport PartyPill from './PartyPill';\nimport PctChange from './PctChange';\nimport PureComponent from './PureComponent';\nimport VoteBar from './VoteBar';\n\nimport winnerClass from '../utils/winner-class';\n\n\ninterface Props {\n  ballotName: string;\n  candidateId: string;\n  contestIsCalled: boolean;\n  contestResult: string;\n  isIncumbent: boolean;\n  isWinner: boolean;\n  isMapRow: boolean;\n  party: string;\n  totalVotesInContest: number;\n  votes: number;\n}\n\n\nconst formatVotes = (n: number) => intcomma(Math.round(n));\nconst formatPct = (n: number) => n.toFixed(1);\nconst pctValue = (votes: number, total: number) =>\n  total == null || total <= 0 ? 0 : (votes / total) * 100;\n\nclass CandidateRow extends Component<Props> {\n  static Header: VNode;\n  static countyHeader: VNode;\n  static columnCount: number;\n\n  render() {\n    const {\n      ballotName,\n      contestIsCalled,\n      contestResult,\n      isIncumbent,\n      isWinner,\n      isViewable,\n      candidatesNum,\n      candidateColor,\n      isMapRow,\n      party,\n      totalVotesInContest,\n      votes,\n    } = this.props;\n\n    let divStyle;\n\n    let checkStyle;\n\n    if (candidateColor) {\n      divStyle = {\n        'background-color': candidateColor,\n      };\n      checkStyle = {\n        color: candidateColor,\n      };\n    }\n\n    const uncontested = candidatesNum == 1;\n\n    let rowClass = cx('candidate', 'contest__candidate-row', {\n      'contest__candidate-row--winner dem--border':\n        contestIsCalled && isWinner && party == 'Democrat',\n      'contest__candidate-row--winner rep--border':\n        contestIsCalled && isWinner && party == 'Republican',\n      'contest__candidate-row--winner gre--border':\n        contestIsCalled && isWinner && party == 'Green',\n      'contest__candidate-row--winner lib--border':\n        contestIsCalled && isWinner && party == 'Libertarian',\n    });\n\n    const checkClass = cx('check', winnerClass(party, contestResult));\n\n    if (!isViewable) {\n      rowClass += ' race__candidate-row--hidden';\n    }\n\n    const checkmark = '\\u2713';\n\n    // const IsAsterisk =\n    // context['asterisks'].filter(candidate => candidate.value == ballotName).length > 0\n    //     ? true\n    //     : false;\n\n    return (\n      <tr class={rowClass}>\n        <td class=\"candidate__cell candidate__party\">\n          {!candidateColor && <PartyPill party={party} />}\n          {candidateColor && <PartyPill party={party} style={divStyle} />}\n        </td>\n        <th class=\"candidate__cell candidate__name\">\n          <span class=\"candidate__name-line\">\n            {/* The feed can flag is_winner before the race is called, so only\n                style a winner once it is (same as HeadshotCandidateRow) */}\n            {contestIsCalled && isWinner &&\n              (contestResult == 'winner' || contestResult == 'uncontested') && (\n                <span class={checkClass}>{checkmark}</span>\n              )}\n            {contestIsCalled && isWinner && contestResult == 'runoff' && (\n              <span class={checkClass}>{checkmark}</span>\n            )}\n            {contestIsCalled && isWinner && !isMapRow && contestResult != 'runoff' ? (\n              <span class={checkClass}>{ballotName}</span>\n            ) : (\n              ballotName\n            )}\n            {/* {IsAsterisk && <span class=\"asterisk_out\">*</span>}{' '} */}\n            {isIncumbent && (\n              <span class=\"pill pill--basic\" title=\"Currently holds this seat\">\n                Incumbent\n              </span>\n            )}\n          </span>\n          {!uncontested && (\n            <VoteBar\n              value={pctValue(votes, totalVotesInContest)}\n              party={party}\n              color={candidateColor}\n            />\n          )}\n        </th>\n        <td class=\"candidate__cell candidate__votes\">{uncontested == false ? (\n          isMapRow ? (\n            formatVotes(votes)\n          ) : (\n            <AnimatedNumber value={votes} format={formatVotes} />\n          )\n        ) : '—'}</td>\n        <td class=\"candidate__cell candidate__pct\">\n        {uncontested == false ? (\n          isMapRow ? (\n            formatPct(pctValue(votes, totalVotesInContest))\n          ) : (\n            <span>\n              <PctChange\n                value={pctValue(votes, totalVotesInContest)}\n                party={party}\n                color={candidateColor}\n              />\n              <AnimatedNumber\n                value={pctValue(votes, totalVotesInContest)}\n                format={formatPct}\n                odometerFormat=\"(,ddd).d\"\n              />\n            </span>\n          )\n        ) : '—'}\n          <span class=\"candidate__pct-symbol\">%</span>\n        </td>\n      </tr>\n    );\n  }\n}\n\nCandidateRow.defaultProps = {\n  contestIsCalled: false,\n  isViewable: true,\n};\n\nCandidateRow.Header = (\n  <thead>\n    <tr>\n      <th class=\"contest__candidate-header\" colSpan={2}>\n        Candidates\n      </th>\n      <th class=\"contest__candidate-header contest__candidate-header--numeric\">\n        Votes\n      </th>\n      <th class=\"contest__candidate-header contest__candidate-header--numeric\">\n        Pct.\n        <span class=\"candidate__pct-symbol\">%</span>\n      </th>\n    </tr>\n  </thead>\n);\n\nCandidateRow.countyHeader = (\n  <thead>\n    <tr>\n      <th class=\"contest__candidate-header\" colSpan={2}>\n        Candidates\n      </th>\n      <th class=\"contest__candidate-header contest__candidate-header--numeric\">\n        Votes\n      </th>\n      <th class=\"contest__candidate-header contest__candidate-header--numeric\">\n        Pct.\n        <span class=\"candidate__pct-symbol\">%</span>\n      </th>\n    </tr>\n  </thead>\n);\n\nCandidateRow.columnCount = 4;\n\nexport default CandidateRow;","import { h } from 'preact';\n\n\ninterface Props {\n  // Percent of the vote, 0-100\n  value: number;\n  party?: string;\n  // Custom candidate color, used in place of the party color when set\n  color?: string;\n}\n\n// Spelled out in full so PurgeCSS (config/tasks/unused-css.js) keeps them.\n// Same party colors as the PartyPill circles.\nconst PARTY_CLASSES: { [prefix: string]: string } = {\n  rep: 'vote-bar__fill--rep',\n  dem: 'vote-bar__fill--dem',\n  lib: 'vote-bar__fill--lib',\n  ind: 'vote-bar__fill--ind',\n  gre: 'vote-bar__fill--gre',\n};\n\n// Thin bar under a candidate's name showing their share of the vote\nfunction VoteBar({ value, party, color }: Props) {\n  const partyClass = party && PARTY_CLASSES[party.slice(0, 3).toLowerCase()];\n  const width = Math.max(0, Math.min(100, value || 0));\n\n  const style: { [key: string]: string } = { width: `${width}%` };\n  if (color) style['background-color'] = color;\n\n  return (\n    <span class=\"vote-bar\" aria-hidden=\"true\">\n      <span\n        class={partyClass ? `vote-bar__fill ${partyClass}` : 'vote-bar__fill'}\n        style={style}\n      />\n    </span>\n  );\n}\n\nexport default VoteBar;\n","const LENGTH_OF_CHECK_INTERVAL = 1000 * 60 * 2; // 2 minutes\nconst TIMERS_SHOULD_RUN = false;\n\nexport { LENGTH_OF_CHECK_INTERVAL, TIMERS_SHOULD_RUN };","// packages\nimport { geoIdentity } from 'd3-geo';\nimport { Component, h } from 'preact';\n\n// components\nimport AnalysisTable from './components/AnalysisTable';\nimport asyncComponent from './components/AsyncComponent';\nimport BalancePower from './components/BalancePower';\nimport CandidateRow from './components/CandidateRow';\nimport Contest from './components/Contest';\nimport FramesChild from './components/FramesChild';\nimport HeadshotCandidateRow from './components/HeadshotCandidateRow';\nimport MapTypeButtons from './components/MapTypeButtons';\n\n// internal\nimport { getJSONWithLastModified } from './utils/get-json';\nimport {\n  determineContestTitle,\n  determineDistrictTitle,\n  lastUpdatedFormat,\n  prepareBalanceData,\n} from './election-utils';\nimport {\n  RESULTS_IN_USE,\n  showBubbleMap,\n  visibleCandidatesCount,\n} from './endpoints';\nimport { SENATE, SHOWCASE_COLORS } from './colors';\nimport { LENGTH_OF_CHECK_INTERVAL } from './constants';\n\nimport analysisData from 'Data/data.json';\nimport topology from 'Assets/geography/texas_urban.json';\n\nconst LayeredMap = asyncComponent(() =>\n  import(/* webpackChunkName: \"LayeredMap\" */ './components/LayeredMap')\n);\n\nconst pastPowerBalance = analysisData['past_balance_of_power'];\n\n// anchor: the race's id on the results page\nconst SENATE_RACE = {\n  slug: 'us-senate-class-2',\n  label: 'U.S. Senate',\n  anchor: 'us-senate',\n};\nconst GOVERNOR_RACE = { slug: 'governor', label: 'Governor', anchor: 'governor' };\n\n// Races in the map switcher, picked by the mapswitch slug\n// (?mapswitch=lieutenant-governor). A blank or unknown slug gets the default.\nconst SWITCHER_SETS = {\n  default: [\n    SENATE_RACE,\n    GOVERNOR_RACE,\n    {\n      slug: 'texas-railroad-commission-seat-2',\n      label: 'Railroad Commission',\n      anchor: 'railroad-commission-of-texas',\n    },\n  ],\n  'lieutenant-governor': [\n    SENATE_RACE,\n    GOVERNOR_RACE,\n    {\n      slug: 'lieutenant-governor',\n      label: 'Lieutenant Governor',\n      anchor: 'lieutenant-governor',\n    },\n  ],\n};\n\n// Where the switcher's \"All races\" tab goes\nconst RESULTS_PAGE_URL =\n  'https://apps.texastribune.org/features/2026/texas-general-election-live-results-2026/';\n\n// Balance of power embed titles that differ from the chamber name\nconst BALANCE_TITLES: { [chamber: string]: string } = {\n  'U.S. House': 'Texas’ delegation in the U.S. House',\n};\n\n// Each office's section id on the results page (index.html), so \"View\n// results\" can jump straight to it\nconst OFFICE_ANCHORS: { [office: string]: string } = {\n  'U.S. Senate': 'us-senate',\n  Governor: 'governor',\n  'Texas Railroad Commission': 'railroad-commission-of-texas',\n  'Lieutenant Governor': 'lieutenant-governor',\n  'Attorney General': 'attorney-general',\n  Comptroller: 'comptroller',\n  'Land Commissioner': 'land-commissioner',\n  'Agriculture Commissioner': 'agriculture-commissioner',\n  'U.S. House': 'us-house',\n  'State Board of Education': 'state-board-of-education',\n  'Texas Supreme Court': 'texas-supreme-court',\n  'Texas Court of Criminal Appeals': 'texas-court-of-criminal-appeals',\n  'Texas Fifteenth Court of Appeals': 'fifteenth-court-of-appeals',\n  'Texas Senate': 'texas-senate',\n  'Texas House': 'texas-house',\n};\n\nclass MapSwitcher extends Component<any, { active: number }> {\n  state = { active: 0 };\n\n  componentDidMount() {\n    this.updateResultsLink();\n  }\n\n  componentDidUpdate() {\n    this.updateResultsLink();\n  }\n\n  // Point the page's \"View full results\" button (if it has one) at this race\n  updateResultsLink() {\n    const link = document.getElementById('results-link');\n    const race = this.props.races[this.state.active];\n    if (link && race) link.setAttribute('href', `${RESULTS_PAGE_URL}#${race.anchor}`);\n  }\n\n  render() {\n    const { races, renderMap } = this.props;\n    const active = races[this.state.active] ? this.state.active : 0;\n\n    return (\n      <div class=\"embed-switcher\">\n        <div class=\"embed-switcher__tabs\" role=\"tablist\">\n          {races.map(({ label }, idx) => (\n            <button\n              type=\"button\"\n              role=\"tab\"\n              aria-selected={idx === active}\n              class={\n                idx === active\n                  ? 'embed-switcher__tab embed-switcher__tab--active'\n                  : 'embed-switcher__tab'\n              }\n              onClick={() => this.setState({ active: idx })}\n            >\n              {label}\n            </button>\n          ))}\n          <a\n            class=\"embed-switcher__tab embed-switcher__tab--link\"\n            href={RESULTS_PAGE_URL}\n          >\n            All races\n            <span class=\"c-icon c-icon--baseline\">\n              <svg aria-hidden=\"true\">\n                <use xlinkHref=\"#long-arrow-right\"></use>\n              </svg>\n            </span>\n          </a>\n        </div>\n        {renderMap(races[active].contest)}\n      </div>\n    );\n  }\n}\n\n\nclass BalanceEmbed extends Component<any, { pass: number }> {\n  state = { pass: 0 };\n\n  componentDidMount() {\n    this.setState({ pass: 1 });\n  }\n\n  componentDidUpdate() {\n    if (this.state.pass === 1) this.setState({ pass: 2 });\n  }\n\n  render() {\n    const { pastData, currentData } = this.props;\n\n    return (\n      <div class={`embed-balance ${pastData.className}-balance-graphic`}>\n        {/* Same title style as the results table embeds */}\n        <h3 class=\"seat__title embed-balance__title\">\n          {BALANCE_TITLES[pastData.chamber] || pastData.chamber}\n        </h3>\n        <div class=\"balance-of-power-container\">\n          {this.state.pass > 0 && (\n            <BalancePower\n              pastData={pastData}\n              chamber={pastData.chamber}\n              className={pastData.className}\n              currentData={currentData}\n              currentOnly\n              fullWidth\n            />\n          )}\n        </div>\n      </div>\n    );\n  }\n}\n\nclass App extends Component<any, any> {\n  timer!: number;\n\n  constructor() {\n    super();\n\n    // mapTypes: \"By candidate\"/\"Breakdown\" choice for each map, by map id\n    this.state = { contests: [], asOf: null, mapTypes: {} };\n\n    this.projection = geoIdentity().reflectY(true);\n    this.fetchData = this.fetchData.bind(this);\n  }\n\n  fetchData() {\n    // \"Last updated\" is when the results file last changed\n    getJSONWithLastModified(RESULTS_IN_USE).then(\n      ({ data: contests, lastModified }) => {\n        const asOf = lastUpdatedFormat(lastModified || new Date());\n        this.setState({ contests, asOf }, this.startTimer);\n      }\n    );\n  }\n\n  startTimer() {\n    this.timer = window.setTimeout(this.fetchData, LENGTH_OF_CHECK_INTERVAL);\n  }\n\n  clearTimer() {\n    window.clearTimeout(this.timer);\n  }\n\n  componentDidMount() {\n    this.useButtonLink();\n    this.fetchData();\n  }\n\n  componentDidUpdate() {\n    this.updateResultsLink();\n  }\n\n  componentWillUnmount() {\n    this.clearTimer();\n  }\n\n  // Map embeds, and embeds built with ?button=1, get the gray \"View results\"\n  // button, like the homepage embed, instead of the text link\n  useButtonLink() {\n    const { items, buttonLink } = this.props;\n    const link = document.getElementById('results-link');\n    const hasMap = items.some(\n      ({ type }) => type === 'map' || type === 'mapswitch' || type === 'category'\n    );\n    if (!link || !(hasMap || buttonLink)) return;\n\n    link.className =\n      'c-button c-button--standard c-button--partner-embeds l-display-block';\n    link.textContent = 'View results';\n    link.parentElement?.classList.add('results-link--button');\n  }\n\n  // Point the page's \"View results\" link at the results page section for the\n  // first thing this embed shows. The map switcher sets its own link.\n  updateResultsLink() {\n    const { items } = this.props;\n    const link = document.getElementById('results-link');\n    if (!link || items.some(({ type }) => type === 'mapswitch')) return;\n\n    let office;\n    for (const { type, slug } of items) {\n      if (type === 'balance') {\n        const pastData = pastPowerBalance.find(item => item.className === slug);\n        office = pastData && pastData.chamber;\n      } else {\n        const contest = this.findContests(slug)[0];\n        office = contest && contest.office;\n      }\n      if (office) break;\n    }\n\n    const anchor = office && OFFICE_ANCHORS[office];\n    link.setAttribute(\n      'href',\n      anchor ? `${RESULTS_PAGE_URL}#${anchor}` : RESULTS_PAGE_URL\n    );\n  }\n\n  // Seats with both a special and a general election (like HD-93) share an\n  // office_slug. \"<slug>-special\" picks the special; the plain slug picks the\n  // general (or the special, if that's the only race for the seat).\n  findContests(slug) {\n    const { contests } = this.state;\n    const specialSlug = slug.replace(/-special$/, '');\n    if (specialSlug !== slug) {\n      return contests.filter(\n        contest =>\n          contest.office_slug === specialSlug &&\n          contest.election_type === 'special'\n      );\n    }\n\n    const matches = contests.filter(contest => contest.office_slug === slug);\n    const general = matches.filter(\n      contest => contest.election_type !== 'special'\n    );\n    return general.length ? general : matches;\n  }\n\n  // Annotations and notes for a special election use \"<slug>-special\"\n  annotationType(contest) {\n    return contest.election_type == 'special'\n      ? contest.office_slug + '-special'\n      : contest.office_slug;\n  }\n\n  renderTable(contest) {\n    const { notes, annotations, embedType } = this.props;\n    const { asOf } = this.state;\n\n    return (\n      <Contest\n        key={contest.id}\n        contest={contest}\n        columnCount={CandidateRow.columnCount}\n        contestTitle={determineDistrictTitle(contest)}\n        embedType={embedType}\n        partyName={contest.party}\n        tableHeader={HeadshotCandidateRow.Header}\n        asOf={asOf}\n        annotations={annotations.filter(\n          item => item.type === this.annotationType(contest)\n        )}\n        notes={notes.filter(item => item.type === this.annotationType(contest))}\n        source={contest.source}\n        renderCandidate={(\n          candidate,\n          idx,\n          viewAllCandidates,\n          { totalVotes }\n        ) => (\n          <CandidateRow\n            key={candidate.id}\n            ballotName={candidate.name}\n            candidateId={candidate.id}\n            contestIsCalled={contest.is_called}\n            contestResult={contest.contest_result}\n            isIncumbent={candidate.is_incumbent}\n            isWinner={candidate.is_winner}\n            isViewable={viewAllCandidates || idx < visibleCandidatesCount}\n            party={candidate.party}\n            totalVotesInContest={totalVotes}\n            votes={candidate.votes}\n          />\n        )}\n      />\n    );\n  }\n\n  // Map colors for each candidate in a showcase race\n  candidatesRenderFor(contest) {\n    return (SHOWCASE_COLORS[contest.office] || SENATE).map(object => {\n      const match = contest.candidacies.find(c => c.name == object.name);\n      return { ...object, id: match && match.id };\n    });\n  }\n\n  // Results table that sits above the map\n  renderMapTable(contest, showLastUpdated) {\n    const { notes, annotations, embedType } = this.props;\n    const { asOf } = this.state;\n    const candidatesRender = this.candidatesRenderFor(contest);\n\n    return (\n      <Contest\n        contest={contest}\n        contestTitle={determineContestTitle(contest)}\n        isShowcaseRace\n        candidatesRender={candidatesRender}\n        annotations={annotations.filter(\n          item => item.type === this.annotationType(contest)\n        )}\n        notes={notes.filter(item => item.type === this.annotationType(contest))}\n        asOf={asOf}\n        embedType={showLastUpdated ? embedType : undefined}\n        source={contest.source}\n        tableHeader={HeadshotCandidateRow.Header}\n        columnCount={HeadshotCandidateRow.columnCount}\n        renderCandidate={(\n          candidate,\n          idx,\n          candidatesRender,\n          viewAllCandidates,\n          { totalVotes }\n        ) => (\n          <HeadshotCandidateRow\n            key={candidate.id}\n            ballotName={candidate.name}\n            candidateId={candidate.id}\n            contestIsCalled={contest.is_called}\n            contestResult={contest.contest_result}\n            isIncumbent={candidate.is_incumbent}\n            isWinner={candidate.is_winner}\n            isViewable={viewAllCandidates || idx < visibleCandidatesCount}\n            party={candidate.party}\n            candidateColors={candidatesRender}\n            totalVotesInContest={totalVotes}\n            votes={candidate.votes}\n          />\n        )}\n      />\n    );\n  }\n\n  // showLastUpdated: show the \"Last updated\" time under the table (the\n  // three-race switcher does; single map embeds don't)\n  // sizerContests: other races whose tables are drawn invisibly in the same\n  // spot, so the table area is as tall as the tallest of them and the map\n  // doesn't jump when switching races\n  renderMap(contest, showLastUpdated = false, sizerContests = []) {\n    const candidatesRender = this.candidatesRenderFor(contest);\n\n    const mapId = `map-${contest.office_slug}`;\n    const { mapTypes } = this.state;\n    const typeMap = mapTypes[mapId] || 'categorical';\n\n    return (\n      <div class=\"embed-map\" key={mapId}>\n        <div class=\"embed-map__header\">\n          {/* Other races' titles sit invisibly in the same spot, so a title\n              that wraps to two lines reserves that room on every race */}\n          <h3 class=\"embed-map__title\">\n            <span>{contest.office}</span>\n            {sizerContests\n              .filter(other => other.id !== contest.id)\n              .map(other => (\n                <span\n                  key={`title-sizer-${other.id}`}\n                  class=\"embed-map__title-sizer\"\n                  aria-hidden=\"true\"\n                >\n                  {other.office}\n                </span>\n              ))}\n          </h3>\n        </div>\n        {/* Results table first, then the map type toggle and the map */}\n        <div class=\"embed-map__table\">\n          <div key={`table-${contest.id}`}>\n            {this.renderMapTable(contest, showLastUpdated)}\n          </div>\n          {sizerContests\n            .filter(other => other.id !== contest.id)\n            .map(other => (\n              <div\n                key={`sizer-${other.id}`}\n                class=\"embed-map__table-sizer\"\n                aria-hidden=\"true\"\n              >\n                {this.renderMapTable(other, showLastUpdated)}\n              </div>\n            ))}\n        </div>\n        {/* Map type toggle sits right above the map it switches */}\n        {showBubbleMap && (\n          <div class=\"embed-map__controls\">\n            <MapTypeButtons\n              active={typeMap}\n              onSelect={type =>\n                this.setState({ mapTypes: { ...mapTypes, [mapId]: type } })\n              }\n            />\n          </div>\n        )}\n        <div id={mapId} class=\"embed-map__map\">\n          <LayeredMap\n            typeMap={typeMap}\n            topology={topology}\n            projection={this.projection}\n            candidates={contest.candidacies}\n            candidatesRender={candidatesRender}\n            source={contest.source}\n            counties={contest.counties}\n            typeRace={mapId}\n            precinctsReporting={contest.precincts_reporting}\n            totalVotes={contest.total_votes}\n            minLegendRows={sizerContests.reduce(\n              (most, other) => Math.max(most, other.candidacies.length),\n              0\n            )}\n          />\n        </div>\n      </div>\n    );\n  }\n\n  // Regional breakdown grids (tiny maps + bar charts) from the results page\n  renderCategories(contest) {\n    if (!contest.counties || !contest.counties.length) return null;\n\n    // Same candidates the results page charts: just the Republican and the\n    // Democrat (the showcase colors also include third parties for the map)\n    return (\n      <div class=\"embed-categories\" key={`category-${contest.office_slug}`}>\n        <h3 class=\"embed-map__title\">{contest.office}</h3>\n        <AnalysisTable\n          contest={contest}\n          candidates={contest.candidacies.filter(candidate =>\n            ['Republican', 'Democrat'].includes(candidate.party)\n          )}\n          counties={contest.counties}\n          linkBase={RESULTS_PAGE_URL}\n        />\n      </div>\n    );\n  }\n\n  renderSwitcher(slug) {\n    const races = (SWITCHER_SETS[slug] || SWITCHER_SETS.default).map(race => ({\n      ...race,\n      contest: this.findContests(race.slug)[0],\n    })).filter(race => race.contest);\n\n    if (!races.length) return null;\n\n    // Size the table to the tallest race in any switcher (Lieutenant Governor\n    // has an extra candidate), so every switcher embed is the same height\n    const sizerSlugs: string[] = [];\n    Object.keys(SWITCHER_SETS).forEach(key =>\n      SWITCHER_SETS[key].forEach(race => {\n        if (sizerSlugs.indexOf(race.slug) === -1) sizerSlugs.push(race.slug);\n      })\n    );\n    const sizerContests = sizerSlugs\n      .map(raceSlug => this.findContests(raceSlug)[0])\n      .filter(Boolean);\n\n    return (\n      <MapSwitcher\n        key=\"mapswitch\"\n        races={races}\n        renderMap={contest => this.renderMap(contest, true, sizerContests)}\n      />\n    );\n  }\n\n  renderBalance(className) {\n    const pastData = pastPowerBalance.find(\n      item => item.className === className\n    );\n    if (!pastData) return null;\n\n    const chamberContests = this.state.contests.filter(\n      contest => contest.office === pastData.chamber\n    );\n\n    return (\n      <BalanceEmbed\n        key={`balance-${className}`}\n        pastData={pastData}\n        currentData={prepareBalanceData(\n          chamberContests,\n          pastData.className,\n          pastData.chamber,\n          pastData.total_current,\n          pastData.halfway\n        )}\n      />\n    );\n  }\n\n  render() {\n    const { items } = this.props;\n    const { contests } = this.state;\n\n    if (!contests.length) return <FramesChild class=\"embed\" polling={500} />;\n\n    return (\n      <FramesChild class=\"embed\" polling={500}>\n        <div class=\"seat__race_wrapper\">\n          {items.map(({ type, slug }) => {\n            if (type === 'balance') return this.renderBalance(slug);\n            if (type === 'mapswitch') return this.renderSwitcher(slug);\n\n            \n            const matches = this.findContests(slug);\n            if (!matches.length) return null;\n\n            if (type === 'category') return this.renderCategories(matches[0]);\n\n            return type === 'map'\n              ? this.renderMap(matches[0])\n              : matches.map(contest => this.renderTable(contest));\n          })}\n        </div>\n      </FramesChild>\n    );\n  }\n}\n\nexport default App;\n","import { render, h } from 'preact';\n\nimport loadJsonScript from '../utils/load-json-script';\n\nimport EmbedApp from '../EmbedApp';\n\nconst EMBED_TYPES = ['map', 'mapswitch', 'contest', 'balance', 'category'];\n\n// Other names that work in the URL (?region= is the regional breakdown)\nconst TYPE_ALIASES: { [alias: string]: string } = { region: 'category' };\n\nconst params = new URLSearchParams(location.search);\n\n// Keep the order the embeds were checked in the builder, across all types\nconst items = Array.from(params)\n  .map(([type, slug]) => ({ type: TYPE_ALIASES[type] || type, slug }))\n  .filter(({ type }) => EMBED_TYPES.indexOf(type) >= 0);\n\n// Pages like the homepage embed can set what shows when the URL picks nothing\nif (!items.length) items.push(...(loadJsonScript('default_embed_items') || []));\n\n// ?button=1 swaps the \"View results\" text link for the gray button\nconst buttonLink = params.has('button');\n\nconst annotations = loadJsonScript('annotations_data');\n\nconst notes = loadJsonScript('notes_data');\n\nrender(\n  <EmbedApp\n    items={items}\n    annotations={annotations}\n    notes={notes}\n    buttonLink={buttonLink}\n    embedType={'internal'}\n  />,\n  document.getElementById('app')\n);\n","var journalize = require('journalize');\n\nimport { capfirst } from 'journalize';\n\nimport context from 'Data/text.json';\n\nimport find from './utils/find';\n\n// AP-style time with uppercase meridiem, like \"9:42 P.M.\" (or \"NOON\"), with\n// the date in front (\"Nov. 3, 2026, 9:42 P.M.\") when it wasn't today\nexport function lastUpdatedFormat(date) {\n  const time = journalize.aptime(date).toUpperCase();\n\n  return date.toDateString() === new Date().toDateString()\n    ? time\n    : `${journalize.apdate(date)}, ${time}`;\n}\n\nexport function format(num) {\n  return num < 10 ? '0' + num : num;\n}\n\nexport const chunk = (arr, size) =>\n  arr.reduce((acc, _, i) => {\n    if (i % size === 0) acc.push(arr.slice(i, i + size));\n    return acc;\n  }, []);\n\nexport const delay = (function() {\n  var timer = 0;\n  return function(callback, ms) {\n    clearTimeout(timer);\n    timer = setTimeout(callback, ms);\n  };\n})();\n\nexport function APTotalVotesToCount(eevp, total_votes) {\n  return eevp > 0 ? Math.round((100 * total_votes)/eevp) : NaN\n}\n\nconst PARTY_SORT_ORDER = [\n  'Republican',\n  'Democrat',\n  'Libertarian',\n  'Green',\n  'Independent',\n  'Write-in',\n];\n// This is just the order for the top page\nconst PARTY_SORT_ORDER_TOP = [\n  'Democrat',\n  'Republican',\n  'Libertarian',\n  'Green',\n  'Independent',\n  'Write-in',\n];\n\n// If we need light blue #99d2da; background-color:rgba(153, 210, 218, .1)\n// If we need dark blue #325ba8; background-color:rgba(90, 137, 204, .1)\n\nconst TT_directory_slugs = [\n  { office: 'Texas House', 'directory-slug': 'tx-house' },\n  { office: 'Texas Senate', 'directory-slug': 'tx-senate' },\n  { office: 'U.S. House', 'directory-slug': 'us-house' },\n  { office: 'State Board of Education', 'directory-slug': 'sboe' },\n];\n\nexport function get_directory_slug(office) {\n  return TT_directory_slugs.filter(slug => slug.office == office);\n}\n\nexport function sort_candidates_by_party(candidates, type) {\n  // Headshot graphics at the top of the results page: Democrat first\n  if (type == 'top_races')\n  {\n    return candidates.sort(\n      (a, b) =>\n        PARTY_SORT_ORDER_TOP.indexOf(a.party) -\n        PARTY_SORT_ORDER_TOP.indexOf(b.party)\n    );\n  }\n\n  else {\n    return candidates.sort(\n      (a, b) =>\n        PARTY_SORT_ORDER.indexOf(a.party) - PARTY_SORT_ORDER.indexOf(b.party)\n    );\n  }\n \n}\n\nexport function sort_candidates_by_votes(candidates) {\n  return candidates.sort(\n    (a, b) =>\n      b.votes - a.votes\n  );\n}\n\nexport function alert_conditionals(vote_pct, cand_num) {\n  if (vote_pct == 0 && cand_num > 1) {\n    return context.label_conditionals['zero-results'];\n  } else if (vote_pct > 0 && vote_pct <= 50 && cand_num > 1) {\n    return context.label_conditionals['more-than-0-less-than-50'];\n  } else if (vote_pct > 50 && vote_pct < 90 && cand_num > 1) {\n    return context.label_conditionals['more-than-50-no-winner'];\n  } else if (vote_pct >= 90 && cand_num > 1) {\n    return context.label_conditionals['all-results-in-no-winner'];\n  } else if (cand_num == 1) {\n    return context.label_conditionals['uncontested'];\n  }\n}\n\nexport function alert_winners(result, office) {\n  if (result == 'winner' && office != 'President') {\n    return context.winner_conditionals['winner'];\n  } else if (result == 'winner' && office == 'President') {\n    return context.winner_conditionals['winner_prez'];\n  } else if (result == 'uncontested') {\n    return context.winner_conditionals['uncontested'];\n  } else if (result == 'runoff') {\n    return context.winner_conditionals['runoff'];\n  }\n}\n\nexport function text_conditionals(vote_pct, cand_num) {\n  if (vote_pct == 0 && cand_num > 1) {\n    return context.text_conditionals['zero-results'];\n  } else if (vote_pct > 1 && vote_pct <= 50 && cand_num > 1) {\n    return context.text_conditionals['more-than-0-less-than-50'];\n  } else if (vote_pct > 50 && vote_pct < 90 && cand_num > 1) {\n    return context.text_conditionals['more-than-50-no-winner'];\n  } else if (vote_pct >= 90 && cand_num > 1) {\n    return context.text_conditionals['all-results-in-no-winner'];\n  } else if (cand_num == 1) {\n    return context.text_conditionals['uncontested'];\n  }\n}\n\nexport function text_conditional_winner_zero(vote_pct, cand_num) {\n  if (vote_pct == 0 && cand_num > 1) {\n    return context.text_conditionals['zero-results_winner'];\n  } else {\n    return ``;\n  }\n}\n\nexport function determineDistrictTitle(contest) {\n  return `${contest.office} ${\n    contest.office === 'President' ||\n    contest.division_type === 'class' ||\n    contest.division_type === 'statewide'\n      ? ''\n      : contest.division_type === 'place' && contest.office_division === 1\n      ? 'Chief Justice'\n      : capfirst(contest.division_type) + ' ' + contest.office_division\n  }`.trim();\n}\n\nexport function getDistrictNum(division_type, division_number) {\n  return capfirst(division_type) + ' ' + division_number\n}\n\nexport function determineContestTitle(contest) {\n  if (contest.division_type === 'statewide' || contest.division_type === 'seat')\n    return '';\n\n  return determineDistrictTitle(contest);\n}\n\nexport function determineContestTitleYourRaces(contest) {\n  return determineDistrictTitle(contest);\n}\n\n// Seat counts for the balance of power chart. Shared by the results page and embeds.\nexport function prepareBalanceData(data, className, chamber, total, halfway) {\n  let republican = 0,\n    democrat = 0,\n    vacant = 0,\n    uncontested_republican = 0,\n    uncontested_democrat = 0;\n\n  // Filter out special elections from the balance of power (they won't be in power for long)\n\n  let data_wo_special = data.filter((race) => race.election_type == 'general')\n\n  data_wo_special.forEach((contest) => {\n    if (\n      contest.contest_result == 'not called' &&\n      contest.candidacies.length > 1\n    ) {\n      vacant++;\n    } else if (\n      (contest.contest_result == 'not called' ||\n        contest.contest_result == 'uncontested') &&\n      contest.candidacies.length == 1 &&\n      contest.candidacies[0].party == 'Republican'\n    ) {\n      uncontested_republican++;\n    } else if (\n      (contest.contest_result == 'not called' ||\n        contest.contest_result == 'uncontested') &&\n      contest.candidacies.length == 1 &&\n      contest.candidacies[0].party == 'Democrat'\n    ) {\n      uncontested_democrat++;\n    } else if (\n      contest.contest_result == 'winner' &&\n      contest.candidacies.length > 1 &&\n      find(contest.candidacies, (candidate) => candidate.is_winner === true) && \n      find(contest.candidacies, (candidate) => candidate.is_winner === true)\n        .party == 'Republican'\n    ) {\n      republican++;\n    } else if (\n      contest.contest_result == 'winner' &&\n      contest.candidacies.length > 1 &&\n      find(contest.candidacies, (candidate) => candidate.is_winner === true) && \n      find(contest.candidacies, (candidate) => candidate.is_winner === true)\n        .party == 'Democrat'\n    ) {\n      democrat++;\n    }\n  });\n\n  return {\n    chamber: chamber,\n    className: className,\n    republican: republican,\n    democrat: democrat,\n    vacant: vacant,\n    halfway: halfway,\n    total: total,\n    uncontested_republican: uncontested_republican,\n    uncontested_democrat: uncontested_democrat,\n  };\n}\n","/**\n * A wrapper for the initial response from a fetch call that funnels to\n * res.json().\n *\n * @private\n * @param {Response} res\n * @returns {Promise}\n */\nfunction jsonResponse(res) {\n  if (!res.ok) throw new Error(`${res.status}: ${res.statusText}`);\n\n  return res.json();\n}\n\n/**\n * A light wrapper around fetch that assumes you're seeking a JSON response.\n *\n * @param {String|Request} input\n * @param {Object} init\n * @returns {Promise}\n */\nexport default function getJSON(input, init) {\n  return fetch(input, init).then(jsonResponse);\n}\n\n/**\n * Like getJSON, but also returns when the file was last modified (from the\n * Last-Modified header S3 sends), so \"last updated\" reflects the data itself.\n * lastModified is null if the header is missing.\n *\n * @param {String|Request} input\n * @param {Object} init\n * @returns {Promise<{data: any, lastModified: Date|null}>}\n */\nexport function getJSONWithLastModified(input, init) {\n  return fetch(input, init).then(res => {\n    const header = res.headers.get('Last-Modified');\n    const lastModified = header ? new Date(header) : null;\n\n    return jsonResponse(res).then(data => ({\n      data,\n      lastModified:\n        lastModified && !isNaN(lastModified.getTime()) ? lastModified : null,\n    }));\n  });\n}\n","const hOP = Object.prototype.hasOwnProperty;\n\n/**\n * inlined Object.is polyfill to avoid requiring consumers ship their own\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n */\nfunction is(x: any, y: any): boolean {\n  // SameValue algorithm\n  if (x === y) {\n    // Steps 1-5, 7-10\n    // Steps 6.b-6.e: +0 != -0\n    // Added the nonzero y check to make Flow happy, but it is redundant\n    return x !== 0 || y !== 0 || 1 / x === 1 / y;\n  }\n  // Step 6.a: NaN == NaN\n  return x !== x && y !== y;\n}\n\n/**\n * Performs equality by iterating through keys on an object and returning false\n * when any key has values which are not strictly equal between the arguments.\n * Returns true when the values of all keys are strictly equal.\n */\nfunction shallowEqual(objA: object, objB: object): boolean {\n  if (is(objA, objB)) {\n    return true;\n  }\n\n  if (\n    typeof objA !== 'object' ||\n    objA === null ||\n    typeof objB !== 'object' ||\n    objB === null\n  ) {\n    return false;\n  }\n\n  const keysA = Object.keys(objA);\n  const keysB = Object.keys(objB);\n\n  if (keysA.length !== keysB.length) {\n    return false;\n  }\n\n  // Test for A's keys different from B.\n  for (let i = 0; i < keysA.length; i++) {\n    if (!hOP.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nexport default shallowEqual;","// packages\nimport { Component } from 'preact';\n\n// internal\nimport shallowEqual from '../utils/shallow-equal';\n\nabstract class PureComponent<P = {}, S = {}> extends Component<P, S> {\n  shouldComponentUpdate(props, state) {\n    const check =\n      shallowEqual(props, this.props) && shallowEqual(state, this.state);\n    // if (props.projection)\n    //   console.log(\n    //     'projection check:',\n    //     props.projection === this.props.projection,\n    //     !check\n    //   );\n    return !check;\n  }\n}\n\nexport default PureComponent;","/**\n * A white-list of attributes to consider booleans for our purposes. Because\n * iframe attributes like \"sandbox\" actually mean something when they're an\n * empty string, we can't assume that means \"true\" across the board.\n *\n * @private\n * @type {Array}\n */\nconst booleans = ['allowfullscreen'];\n\n/**\n * Searches an element's attributes and returns an Object of all the ones that\n * begin with a specified prefix. Each matching attribute name is returned\n * without the prefix.\n *\n * @private\n * @param  {Element} element\n * @param  {string} prefix\n * @return {object}\n */\nfunction getMatchingAttributes(element, prefix) {\n  // prepare the object to return\n  const attrs = {};\n\n  // grab all the attributes off the element\n  const map = element.attributes;\n\n  // get a count of the number of attributes\n  const length = map.length;\n\n  // get the prefix's length\n  const prefixLength = prefix.length;\n\n  // loop through the attributes\n  for (let i = 0; i < length; i++) {\n    // get each attribute key\n    const key = map[i].name;\n\n    // continue if the key begins with supplied prefix\n    if (key.substr(0, prefixLength) === prefix) {\n      // slice off the prefix to get the bare field key\n      const field = key.slice(prefixLength);\n\n      // grab the value associated with the key\n      let value = map[i].value;\n\n      if (booleans.indexOf(field) > -1) {\n        value = true;\n      }\n\n      // add matching key to object\n      attrs[field] = value;\n    }\n  }\n\n  return attrs;\n}\n\nfunction extend(obj, props) {\n  for (let i in props) obj[i] = props[i];\n  return obj;\n}\n\nexport { extend, getMatchingAttributes };\n","const EMBED_SIZE = 'embed-size';\nconst AMP_SENTINEL = 'amp';\nconst FRAME_PREFIX = 'data-frame-';\nconst FRAME_AUTO_INITIALIZED_ATTRIBUTE = `${FRAME_PREFIX}auto-initialized`;\nconst FRAME_SRC_ATTRIBUTE = `${FRAME_PREFIX}src`;\n\nexport {\n  AMP_SENTINEL,\n  EMBED_SIZE,\n  FRAME_PREFIX,\n  FRAME_AUTO_INITIALIZED_ATTRIBUTE,\n  FRAME_SRC_ATTRIBUTE,\n};\n","import { extend, getMatchingAttributes } from './utils.mjs';\nimport {\n  AMP_SENTINEL,\n  EMBED_SIZE,\n  FRAME_PREFIX,\n  FRAME_AUTO_INITIALIZED_ATTRIBUTE,\n  FRAME_SRC_ATTRIBUTE,\n} from './constants.mjs';\n\n/**\n * The Framer object to be called in the host page. Effectively a wrapper around\n * interactions with an embedded iframe.\n *\n * @param {object} options options used to prepare the iframe\n * @param {Element} options.container the containing DOM element for the iframe\n * @param {string} options.src the URL to set as the `src` of the iframe\n * @param {boolean} [options.allowfullscreen] toggles the `allowfullscreen` attribute\n * @param {string} [options.name] sets the `name` attribute\n * @param {string} [options.referrerpolicy] sets the `referrerpolicy` attribute\n * @param {string} [options.sandbox] sets the `sandbox` attribute\n * @param {string} [options.title] sets the `title` attribute\n */\nclass Framer {\n  constructor({\n    allowfullscreen = false,\n    container,\n    name,\n    referrerpolicy,\n    sandbox = 'allow-scripts',\n    src,\n    title,\n  }) {\n    this.container = container;\n    this.src = src;\n    this.allowfullscreen = allowfullscreen;\n    this.name = name;\n    this.referrerpolicy = referrerpolicy;\n    this.sandbox = sandbox;\n    this.title = title;\n\n    this.processMessage_ = this.processMessage_.bind(this);\n    window.addEventListener('message', this.processMessage_, false);\n\n    this.createIframe_();\n  }\n\n  /**\n   * Removes event listeners and removes the iframe from the container.\n   *\n   * @returns {void}\n   * @example\n   *\n   * const framer = new Framer(...);\n   * // tears down the Framer\n   * framer.remove();\n   */\n  remove() {\n    window.removeEventListener('message', this.processMessage_, false);\n    this.container.removeChild(this.iframe);\n    // important to de-reference the iframe so it can be GC'ed\n    this.iframe = null;\n  }\n\n  /**\n   * Creates the iframe element and sets the source of the iframe.\n   *\n   * @private\n   * @returns {void}\n   */\n  createIframe_() {\n    const iframe = (this.iframe = document.createElement('iframe'));\n\n    iframe.setAttribute('src', this.src);\n    iframe.setAttribute('width', '100%');\n    iframe.setAttribute('scrolling', 'no');\n    iframe.setAttribute('marginheight', '0');\n    iframe.setAttribute('frameborder', '0');\n\n    if (this.allowfullscreen) {\n      iframe.setAttribute('allowfullscreen', '');\n    }\n\n    if (this.name) {\n      iframe.setAttribute('name', name);\n    }\n\n    if (this.referrerpolicy) {\n      iframe.setAttribute('referrerpolicy', this.referrerpolicy);\n    }\n\n    iframe.setAttribute('sandbox', this.sandbox);\n\n    if (this.title) {\n      iframe.setAttribute('title', this.title);\n    }\n\n    this.container.appendChild(iframe);\n  }\n\n  /**\n   * Receives a message from the frame. Checks to make sure it is only listening\n   * to the iframe it created, and that the sentinel value and type matches.\n   *\n   * @private\n   * @param {Event} event\n   * @returns {void}\n   */\n  processMessage_(event) {\n    // this message isn't from our created frame, stop here\n    if (event.source !== this.iframe.contentWindow) return;\n\n    const { data } = event;\n\n    // if the sentinel and type matches, update our height\n    if (data.sentinel === AMP_SENTINEL && data.type === EMBED_SIZE) {\n      this.setIframeHeight_(data.height);\n    }\n  }\n\n  /**\n   * Sets the iframe's height.\n   *\n   * @private\n   * @param {number} height\n   * @returns {void}\n   */\n  setIframeHeight_(height) {\n    this.iframe.setAttribute('height', height);\n  }\n}\n\n/**\n * Automatically initializes any frames that have not already been\n * auto-activated.\n *\n * @returns {Array} An array of all the created Framers\n * @example\n *\n * // sets up all frames that have not been initialized yet\n * autoInitFrames();\n */\nfunction autoInitFrames() {\n  const elements = document.querySelectorAll(\n    `[${FRAME_SRC_ATTRIBUTE}]:not([${FRAME_AUTO_INITIALIZED_ATTRIBUTE}])`\n  );\n\n  const activated = [];\n\n  for (let i = 0; i < elements.length; i++) {\n    const container = elements[i];\n\n    const attributes = getMatchingAttributes(container, FRAME_PREFIX);\n    container.setAttribute(FRAME_AUTO_INITIALIZED_ATTRIBUTE, '');\n\n    activated.push(\n      new Framer(\n        extend(\n          {\n            container,\n          },\n          attributes\n        )\n      )\n    );\n  }\n\n  return activated;\n}\n\nexport { autoInitFrames, Framer };\n","// internal\nimport { AMP_SENTINEL, EMBED_SIZE } from './constants.mjs';\nimport { extend } from './utils.mjs';\n\n/**\n * A wrapper around postMessage to normalize the message body. Automatically\n * includes the AMP sentinel value.\n *\n * @private\n * @param {string} type Type of message being sent\n * @param {Object} [data] Any additional data to send\n * @returns {void}\n */\nfunction sendMessage(type, data = {}) {\n  window.parent.postMessage(\n    extend({ sentinel: AMP_SENTINEL, type }, data),\n    '*'\n  );\n}\n\n/**\n * Gets the height of the current document's body. Uses offsetHeight to ensure\n * that margins are accounted for.\n *\n * @private\n * @returns {number}\n */\nfunction getDocumentHeight() {\n  return document.documentElement.offsetHeight;\n}\n\n/**\n * Sends the current document's height or provided value to the host window\n * using postMessage.\n *\n * @param {number} [height] The height to pass to the host page, is determined automatically if not passed\n * @returns {void}\n * @example\n *\n * // Uses the document's height to tell the host page\n * sendFrameHeight();\n *\n * // Pass a height you've determined in another way\n * sendFrameHeight(500);\n *\n */\nfunction sendFrameHeight(height = getDocumentHeight()) {\n  sendMessage(EMBED_SIZE, { height });\n}\n\n/**\n * Sets up an event listener for the load event that sends the new frame\n * height to the host. Automatically removes itself once fired.\n *\n * @returns {void}\n * @example\n *\n * // once the frame's load event is fired, tell the host page its new height\n * sendHeightOnLoad();\n */\nfunction sendHeightOnLoad() {\n  window.addEventListener('load', function cb() {\n    sendFrameHeight();\n\n    window.removeEventListener('load', cb);\n  });\n}\n\n/**\n * Sets up an event listener for the resize event that sends the new frame\n * height to the host.\n *\n * @returns {void}\n * @example\n *\n * // every time the frame is resized, tell the host page what its new height is\n * sendHeightOnResize();\n */\nfunction sendHeightOnResize() {\n  window.addEventListener('resize', () => sendFrameHeight());\n}\n\n/**\n * Sends height updates to the host page on an interval.\n *\n * @param {number} [delay] How long to set the interval\n * @returns {void}\n * @example\n *\n * // will call sendFrameHeight every 300ms\n * sendHeightOnPoll();\n *\n * // will call sendFrameHeight every 150ms\n * sendHeightOnPoll(150);\n */\nfunction sendHeightOnPoll(delay = 300) {\n  setInterval(sendFrameHeight, delay);\n}\n\n/**\n * A helper for running the standard functions for setting up a frame.\n *\n * Automatically calls an sendFrameHeight, sendHeightOnLoad and sendHeightOnResize.\n *\n * @returns {void}\n * @example\n *\n * initFrame();\n */\nfunction initFrame() {\n  sendFrameHeight();\n  sendHeightOnLoad();\n  sendHeightOnResize();\n}\n\n/**\n * Initializes a frame, then sets up a poll to continue to update on an interval.\n *\n * @param {number} [delay] An optional custom delay to pass to sendHeightOnPoll\n * @returns {void}\n * @example\n *\n * // calls initFrame, then calls sendHeightOnPoll\n * initFrameAndPoll();\n */\nfunction initFrameAndPoll(delay) {\n  initFrame();\n  sendHeightOnPoll(delay);\n}\n\nexport {\n  initFrame,\n  initFrameAndPoll,\n  sendFrameHeight,\n  sendHeightOnLoad,\n  sendHeightOnPoll,\n  sendHeightOnResize,\n};\n","/**\n * A for-loop version of Array.prototype.find so IE and friends can play.\n *\n * @private\n * @param  {Array} arr\n * @param  {Function} predicate\n * @return {*|undefined}\n * @throws {TypeError} Argument predicate must be a function\n */\nexport default function find(\n  arr: Array<any>,\n  predicate: Function\n): any | undefined {\n  if (typeof predicate !== 'function') {\n    throw new TypeError('predicate must be a function');\n  }\n\n  for (let i = 0; i < arr.length; i++) {\n    if (predicate(arr[i], i, arr)) {\n      return arr[i];\n    }\n  }\n\n  return undefined;\n}","// packages\nimport cx from 'classnames';\nimport { capfirst } from 'journalize';\nimport memoize from 'lodash/memoize';\nimport { h } from 'preact';\n\ntype Props = {\n  excludeInitial?: boolean;\n  party: string;\n  style: string;\n};\n\nfunction PartyPill({ excludeInitial, party, style }: Props) {\n  const partyPrefix = party.slice(0, 3).toLowerCase();\n  const partyInitial = party[0].toUpperCase();\n\n  const classes = cx('circle-pill', `pill--${partyPrefix}`);\n\n  return (\n    <span class={classes} style={style} title={capfirst(party)}>\n      {!excludeInitial && partyInitial}\n    </span>\n  );\n}\n\nPartyPill.defaultProps = {\n  excludeInitial: false,\n};\n\nexport default memoize(PartyPill, ({ party, style }) => ({\n  party: party,\n  style: style,\n}));"],"sourceRoot":""}