{"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","layoutHalves","maxColumns","_ret","_loop","outer","v","max","drawSeats","selector","_ref","segments","labels","center","halfway","description","fullWidth","minSeat","layout","seatSize","Infinity","result","_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","lower","labelTop","lines","anchor","_ref2","placed","_objectSpread","Boolean","centerText","textWidth","node","getComputedTextLength","clearance","pastVacant","vacant","hasSeatsNotUp","republican_not_up_for_election","democrat_not_up_for_election","includes","compact","getZeroUncontested","num","seatText","remove","republican","democrat","safeRepublican","uncontested_republican","safeDemocrat","uncontested_democrat","short","leftLabels","rightLabels","middleLabels","rNotUp","dNotUp","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","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","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","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","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","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","_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","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","generalSlugs","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.bbb11080f9.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// The compact chart's shared \"None uncontested\" label\nconst UNCONTESTED_NONE = '#666';\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  // Two mirrored halves with the same number of columns, so the majority\n  // line falls in the gap between them instead of through a column of seats.\n  // If a half doesn't fill its columns evenly, the short column goes on the\n  // outer edge so the middle stays solid. Uses the fewest rows (at least\n  // minRows) that fit in maxColumns.\n  layoutHalves(total, minRows, maxColumns) {\n    const half = total / 2;\n\n    for (let rows = Math.max(1, minRows); rows <= half; rows++) {\n      const sideColumns = Math.ceil(half / rows);\n      const columns = sideColumns * 2;\n      if (columns > maxColumns) continue;\n\n      // Seats in the outermost column; the rest are full\n      const outer = half - (sideColumns - 1) * rows;\n      const left = d3.range(half).map(i =>\n        i < outer\n          ? { column: 0, row: i }\n          : {\n              column: 1 + Math.floor((i - outer) / rows),\n              row: (i - outer) % rows,\n            }\n      );\n      const right = left\n        .map(seat => ({ column: columns - 1 - seat.column, row: seat.row }))\n        .reverse();\n\n      return { seats: left.concat(right), columns, rows };\n    }\n\n    return null;\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 maxColumns = fullWidth\n        ? Math.max(1, Math.floor(width / seatSize))\n        : Infinity;\n      const minRows = fullWidth ? Math.ceil(total / maxColumns) : 0;\n      const result = this.layoutSeats(total, minRows);\n\n      // With an odd number of columns the majority line would run through\n      // the middle column, so split an even chamber into two halves instead\n      if (halfway && total % 2 == 0 && result.columns % 2 == 1) {\n        return this.layoutHalves(total, result.rows, maxColumns) || result;\n      }\n      return result;\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        // Behind the seats, so it only shows in the gaps between them\n        .lower();\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      // A null line is left blank (its label is in the middle instead)\n      const placed = lines\n        .map((d, i) => d && { ...d, line: i })\n        .filter(Boolean);\n      svg\n        .append('g')\n        .selectAll('text')\n        .data(placed)\n        .enter()\n        .append('text')\n        .attr('class', d => (d.line == 0 ? 'bar-title' : 'bar-title-uncontested'))\n        .attr('text-anchor', anchor)\n        .attr('x', x)\n        .attr('y', d => labelTop + 15 + d.line * labelLineHeight)\n        .style('fill', d => d.color)\n        .text(d => d.text);\n    });\n\n    svg\n      .append('g')\n      .selectAll('text')\n      .data(labels.middle || [])\n      .enter()\n      .append('text')\n      .attr('class', 'bar-title-uncontested')\n      .attr('text-anchor', 'middle')\n      .attr('x', centerX)\n      .attr('y', d => labelTop + 15 + d.line * labelLineHeight)\n      .style('fill', d => d.color)\n      .text(d => d.text);\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    // Chambers with staggered terms (Texas Senate, SBOE) have seats that\n    // aren't on the ballot this year\n    const hasSeatsNotUp =\n      (pastData.republican_not_up_for_election || 0) +\n        (pastData.democrat_not_up_for_election || 0) >\n      0;\n    // No majority line for the U.S. House chart (it's only the Texas\n    // delegation) or the State Board of Education\n    const NO_MAJORITY = ['us-house', 'state-board-of-education'];\n    const halfway = NO_MAJORITY.includes(className) ? null : currentData.halfway;\n    // SBOE's chart is only 5 seats wide, so its labels are abbreviated\n    // (\"4 R\") and a shared \"None uncontested\" goes in the middle\n    const compact = className == 'state-board-of-education';\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: compact ? `${pastData.republican} R` : `${pastData.republican} Republicans`, color: REPUBLICAN }],\n        right: [{ text: compact ? `${pastData.democrat} D` : `${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 = compact || (this.props.fullWidth && width <= SMALL_SCREEN);\n\n    const leftLabels = [\n      { text: short ? `${republican} R` : `${republican} Republicans`, color: REPUBLICAN },\n    ];\n\n    const rightLabels = [\n      { text: short ? `${democrat} D` : `${democrat} Democrats`, color: DEMOCRAT },\n    ];\n\n    // Labels centered under the chart, by line\n    const middleLabels = [];\n\n    // When neither party has an uncontested seat, the compact chart says so\n    // once in the middle instead of on both sides\n    if (\n      compact &&\n      !currentData.uncontested_republican &&\n      !currentData.uncontested_democrat\n    ) {\n      middleLabels.push({ text: 'None uncontested', color: UNCONTESTED_NONE, line: 1 });\n      leftLabels.push(null);\n      rightLabels.push(null);\n    } else {\n      leftLabels.push({\n        text: `${getZeroUncontested(currentData.uncontested_republican)} uncontested`,\n        color: SAFE_REPUBLICAN,\n      });\n      rightLabels.push({\n        text: `${getZeroUncontested(currentData.uncontested_democrat)} uncontested`,\n        color: SAFE_DEMOCRAT,\n      });\n    }\n\n    if (hasSeatsNotUp && compact) {\n      // Too narrow to put these side by side, so they stack in the middle\n      const rNotUp = pastData.republican_not_up_for_election;\n      const dNotUp = pastData.democrat_not_up_for_election;\n      middleLabels.push(\n        {\n          text: `${rNotUp} GOP seat${rNotUp == 1 ? '' : 's'} not up for election`,\n          color: SAFE_REPUBLICAN,\n          line: leftLabels.length,\n        },\n        {\n          text: `${dNotUp} Dem. seat${dNotUp == 1 ? '' : 's'} not up for election`,\n          color: SAFE_DEMOCRAT,\n          line: leftLabels.length + 1,\n        }\n      );\n      leftLabels.push(null, null);\n      rightLabels.push(null, null);\n    } else if (hasSeatsNotUp) {\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 = hasSeatsNotUp\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, middle: middleLabels },\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 when the seat also\n  // has a general election (the special winner won't be in power for long).\n  // A special with no general for the seat (like SBOE District 4) fills the\n  // rest of the term, so it counts.\n  const generalSlugs = new Set(\n    data\n      .filter((race) => race.election_type == 'general')\n      .map((race) => race.office_slug)\n  );\n\n  let data_wo_special = data.filter(\n    (race) =>\n      race.election_type == 'general' || !generalSlugs.has(race.office_slug)\n  )\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":""}