{"version":3,"file":"home.9b33781d.js","mappings":"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","sources":["webpack://@finviz/website/./js/app/charts-lib.ts","webpack://@finviz/website/./js/app/home/market_sentiment.tsx","webpack://@finviz/website/./js/app/home/refresh.ts","webpack://@finviz/website/./js/app/home/indices-data.ts","webpack://@finviz/website/./js/app/home/index.tsx","webpack://@finviz/website/./js/app/maps/types.ts","webpack://@finviz/website/./js/app/shared/chartLayoutConfig.ts","webpack://@finviz/website/./js/app/shared/ready.ts","webpack://@finviz/website/../node_modules/flux/index.js","webpack://@finviz/website/../node_modules/flux/lib/Dispatcher.js","webpack://@finviz/website/../node_modules/flux/lib/invariant.js","webpack://@finviz/website/../node_modules/keymirror/index.js"],"sourcesContent":["import React from 'react'\r\n\r\nexport enum SettingsTab {\r\n Chart = 'chart',\r\n Colors = 'colors',\r\n}\r\n\r\nexport type ChartLayoutProps = {\r\n config: object\r\n onRegisterChartLayoutModel?: (chartLayout: any) => void\r\n shouldResize?: boolean\r\n parentElement?: HTMLElement\r\n}\r\n\r\nexport type ChartLayoutHeaderProps = {\r\n model: any\r\n onSettingsOpen: () => void\r\n hasPublish: boolean\r\n}\r\n\r\ninterface ChartsLib {\r\n FREE_DATE_RANGES: string[]\r\n ChartLayout: React.FC\r\n ChartLayoutHeader: React.FC\r\n ChartLayoutWithGlobalState: React.FC\r\n\r\n ChartSettings: React.FC<{\r\n onClose: () => void\r\n onActiveSettingsTabChange?: (settingsComponent: SettingsTab) => void\r\n activeSettingsTab?: SettingsTab\r\n }>\r\n\r\n PreventClosingUnsavedChanges: React.FC<{\r\n onHide: () => void\r\n children: (props: { checkForUnsavedChangesAndClose: () => void }) => React.ReactElement\r\n }>\r\n\r\n useChartLayoutGlobalModel: () => {\r\n chartLayoutModel: any | null\r\n chartLayoutModelConfigSnapshot: Record | null\r\n lastGlobalRerender: number\r\n setChartLayoutModel: (chartLayoutModel: any) => void\r\n getChartLayoutModelConfig: (props: { fallback: Record }) => Record\r\n forceGlobalRerender: () => void\r\n generateNewLayoutModelConfigSnapshot: () => void\r\n }\r\n\r\n StockDetailTimeframeBar: React.FC<{\r\n isDateRangeAvailable: boolean\r\n isPremium: boolean\r\n isLoadingOverride?: boolean\r\n }>\r\n\r\n Quote: {\r\n create(quote: any): any\r\n select: (query: (quote: any) => boolean) => any\r\n deleteAll: () => void\r\n findByAttribute: (attribute: string, value: any) => any\r\n getAll: (tickersAndTimeframes: any) => any\r\n }\r\n\r\n Settings: {\r\n MarketSentiment: any\r\n Indicator: any\r\n Chart: any\r\n Thumb: any\r\n Element: any\r\n Colors: string[]\r\n updateColors: (type: string, name: string, theme: 'light' | 'dark', value: string) => void\r\n }\r\n\r\n Utils: {\r\n dateFromUnixTimestamp: (date: string) => Date\r\n }\r\n\r\n convertTa: {\r\n getPanes: (taConfig: any) => any\r\n }\r\n\r\n useModelState: (\r\n model: Model | null,\r\n options: { watchProperties?: Array; listenOnEvents?: string[] }\r\n ) => Model | null\r\n}\r\n\r\n// @ts-ignore\r\nconst chartsLib = (window.FLibs.Charts as ChartsLib) ?? {}\r\n\r\nexport const FREE_DATE_RANGES = chartsLib.FREE_DATE_RANGES\r\nexport const ChartLayout = chartsLib.ChartLayout\r\nexport const ChartLayoutWithGlobalState = chartsLib.ChartLayoutWithGlobalState\r\nexport const ChartLayoutHeader = chartsLib.ChartLayoutHeader\r\nexport const ChartSettings = chartsLib.ChartSettings\r\nexport const PreventClosingUnsavedChanges = chartsLib.PreventClosingUnsavedChanges\r\nexport const useChartLayoutGlobalModel = chartsLib.useChartLayoutGlobalModel\r\nexport const StockDetailTimeframeBar = chartsLib.StockDetailTimeframeBar\r\nexport const Quote = chartsLib.Quote\r\nexport const Settings = chartsLib.Settings\r\nexport const Utils = chartsLib.Utils\r\nexport const convertTa = chartsLib.convertTa\r\nexport const useModelState = chartsLib.useModelState\r\n","import { Component, MouseEvent } from 'react'\r\nimport ReactDOM from 'react-dom'\r\n\r\nimport { CancelablePromise, apiRequest } from '../../main/services/api'\r\nimport { ChartLayout, Quote } from '../charts-lib'\r\n\r\nconst ticker = 'market_sentiment'\r\n\r\ninterface MarketSentimentProps {}\r\ninterface MarketSentimentState {\r\n loading: boolean\r\n enabled: boolean\r\n chartConfig: { layout: string } | null\r\n}\r\n\r\nconst MARKET_SENTIMENT_WIDTH_PX = 160\r\nconst MARKET_SENTIMENT_HEIGHT_PX = 40\r\nconst marketSentimentChartConfig = {\r\n layout: '1h1v',\r\n width: MARKET_SENTIMENT_WIDTH_PX,\r\n height: MARKET_SENTIMENT_HEIGHT_PX,\r\n scrollable: false,\r\n editable: false,\r\n cross: false,\r\n charts: [\r\n {\r\n height: MARKET_SENTIMENT_HEIGHT_PX,\r\n timeframe: 'i3',\r\n scale: 'linear',\r\n ticker: ticker,\r\n instrument: 'market_sentiment',\r\n refreshData: false,\r\n stretch: true,\r\n panes: [\r\n {\r\n height: MARKET_SENTIMENT_HEIGHT_PX,\r\n elements: [\r\n {\r\n type: 'charts/market_sentiment',\r\n overlays: [],\r\n },\r\n ],\r\n },\r\n ],\r\n },\r\n ],\r\n}\r\n\r\nclass MarketSentiment extends Component {\r\n state: MarketSentimentState = {\r\n loading: true,\r\n enabled: false,\r\n chartConfig: null,\r\n }\r\n\r\n _timer: number | null = null\r\n _lastRequest: CancelablePromise | null = null\r\n\r\n componentDidMount() {\r\n this._fetchData('', () => {\r\n this.setState({ chartConfig: marketSentimentChartConfig })\r\n })\r\n }\r\n\r\n componentWillUnmount() {\r\n if (this._timer !== null) {\r\n this._lastRequest?.cancel?.()\r\n clearTimeout(this._timer)\r\n }\r\n }\r\n\r\n render() {\r\n const { loading, enabled, chartConfig } = this.state\r\n return (\r\n \r\n \r\n \r\n Click BULL for positive market sentiment
Click BEAR for negative market sentiment] offsetx=[-200] offsety=[20] delay=[100]\">\r\n {chartConfig && (\r\n
\r\n \r\n
\r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n _vote(e: MouseEvent, sentiment: string) {\r\n e.preventDefault()\r\n this.setState({ enabled: false })\r\n this._fetchData('?b=' + sentiment, undefined, false)\r\n }\r\n\r\n _fetchData = async (urlQuery = '', callback?: Function, setTimer = true) => {\r\n if (setTimer && this._timer !== null) clearTimeout(this._timer)\r\n\r\n if (document.hidden) {\r\n // console.log(`${+new Date()} Document is hidden, canceling refresh`)\r\n if (setTimer) this._timer = window.setTimeout(() => this._fetchData(urlQuery, callback), 1000)\r\n return\r\n }\r\n\r\n // console.log(`${+new Date()} Document is visible, refreshing`)\r\n\r\n this._lastRequest = apiRequest(`/api/market_sentiment.ashx${urlQuery}`)\r\n const json = await this._lastRequest\r\n if (json) {\r\n const quoteData = getData(json)\r\n const quote = Quote.findByAttribute('ticker', ticker)\r\n if (quote) {\r\n Quote.findByAttribute('ticker', ticker).updateAttributes(getData(json))\r\n } else {\r\n Quote.create(quoteData).save()\r\n }\r\n callback?.()\r\n\r\n this.setState({\r\n loading: false,\r\n enabled: json.enabled,\r\n })\r\n }\r\n\r\n if (setTimer) {\r\n this._timer = window.setTimeout(() => this._fetchData(urlQuery, callback), (json?.refresh ?? 30) * 1000)\r\n }\r\n }\r\n}\r\n\r\ninterface QuoteData {\r\n refresh: number\r\n enabled: boolean\r\n sum: number[]\r\n weight: number[]\r\n time: string\r\n visibleMinutes: number\r\n}\r\n\r\nfunction getData(data: QuoteData) {\r\n return {\r\n close: data.sum,\r\n volume: data.weight,\r\n date: Array.from('1'.repeat(data.sum.length)).map((x) => parseInt(x, 10)),\r\n ticker: ticker,\r\n timeframe: 'i3',\r\n instrument: 'market_sentiment',\r\n premarket: false,\r\n aftermarket: false,\r\n afterChange: null,\r\n afterClose: null,\r\n drawMinutesPerDay: data.visibleMinutes,\r\n marketStartMinutes: 570,\r\n premarketLengthMinutes: 0,\r\n aftermarketLengthMinutes: 0,\r\n }\r\n}\r\n\r\nfunction mount() {\r\n const el = document.getElementById('js-market-sentiment')\r\n if (el) {\r\n ReactDOM.render(, el)\r\n }\r\n}\r\n\r\nfunction unmount() {\r\n const el = document.getElementById('js-market-sentiment')\r\n if (el) {\r\n ReactDOM.unmountComponentAtNode(el)\r\n }\r\n}\r\n\r\nmount()\r\n\r\nexport { mount, unmount }\r\n","import { ContentType, apiRequest } from '../../main/services/api'\r\nimport mapActionCreators from '../maps/store/action-creators'\r\nimport { Indices, updateIndices } from './indices-data'\r\n\r\nlet homepageRefresh: number\r\n\r\nif (FinvizHomepageRefreshInterval) {\r\n HomepageRefreshInit(FinvizHomepageRefreshInterval)\r\n}\r\n\r\nfunction HomepageRefreshInit(refresh: number) {\r\n homepageRefresh = refresh * 1000\r\n setTimeout(HomepageRefresh, homepageRefresh)\r\n}\r\n\r\nfunction getSignalsTableStart(id: string) {\r\n return ``\r\n}\r\n\r\nfunction getDataFromStartEndChar(str: string, startStr: string, endStr: string) {\r\n let start = str.indexOf(startStr)\r\n if (start < 0) return\r\n start += startStr.length\r\n const end = str.indexOf(endStr, start)\r\n if (end < 0) return\r\n\r\n return str.substring(start, end)\r\n}\r\n\r\nfunction getDataFromVariableName(str: string, variableName: string) {\r\n const value = getDataFromStartEndChar(str, `var ${variableName} = `, ';')\r\n\r\n if (!value) return\r\n\r\n return JSON.parse(value)\r\n}\r\n\r\nfunction OnHomepageRefresh(result: string) {\r\n // Check indexVersion and reload if it’s different. `FinvizIndexVersion` is\r\n // defined in index.cs\r\n const indexVersion = getDataFromStartEndChar(result, 'var FinvizIndexVersion=\"', '\"')\r\n if (indexVersion !== FinvizIndexVersion) {\r\n window.location.reload()\r\n }\r\n\r\n // Check userId and do not continue if it changed. `userId` is defined in index.cs\r\n const userIdNew = getDataFromStartEndChar(result, 'var userId=\"', '\"')\r\n if (userIdNew !== userId) {\r\n return\r\n }\r\n\r\n // Replace left signals table\r\n const signals1El = document.getElementById('signals_1')\r\n const signals1 = getDataFromStartEndChar(result, getSignalsTableStart('signals_1'), '
')\r\n if (signals1El && signals1) {\r\n signals1El.innerHTML = signals1\r\n }\r\n\r\n // Replace right signals table\r\n const signals2El = document.getElementById('signals_2')\r\n const signals2 = getDataFromStartEndChar(result, getSignalsTableStart('signals_2'), '')\r\n if (signals2El && signals2) {\r\n signals2El.innerHTML = signals2\r\n }\r\n\r\n // Replace right signals table\r\n const homepageBottomEl = document.getElementById('homepage_bottom')\r\n const homepageBottom = getDataFromStartEndChar(result, '
', '
\\n')\r\n if (homepageBottomEl && homepageBottom) {\r\n homepageBottomEl.innerHTML = homepageBottom\r\n }\r\n\r\n // Update indices\r\n const indicesData = getDataFromStartEndChar(result, '')\r\n updateIndices(JSON.parse(indicesData!) as Indices)\r\n\r\n // Render maps\r\n const perfDataSec = getDataFromVariableName(result, 'perfDataSec')\r\n const perfDataGeo = getDataFromVariableName(result, 'perfDataGeo')\r\n\r\n try {\r\n mapActionCreators.updatePerfData(window.FinvizIndexSecMap, perfDataSec)\r\n mapActionCreators.updatePerfData(window.FinvizIndexGeoMap, perfDataGeo)\r\n } catch {}\r\n\r\n /**\r\n * Re-render recent quotes. The script (recent_quotes.js) is only included for premium users\r\n * so we need to check if it's defined\r\n */\r\n if (typeof window['RenderRecentQuotes'] === 'function') {\r\n RenderRecentQuotes()\r\n }\r\n\r\n // Send refresh event to google analytics\r\n window.gtag?.('event', 'refresh', { event_category: 'page' })\r\n // Refresh any ads that might be on the page\r\n if (window.finvizBannersLoaded === true) {\r\n window.initFinvizBanners?.()\r\n } else if (typeof window.refreshAds === 'function') {\r\n window.refreshAds('#homepage_bottom [id*=IC_D_]')\r\n }\r\n}\r\n\r\nasync function HomepageRefresh() {\r\n const data = await apiRequest(window.location.pathname, {\r\n headers: { 'Content-Type': ContentType.Html },\r\n })\r\n if (data) {\r\n OnHomepageRefresh(data)\r\n }\r\n setTimeout(HomepageRefresh, homepageRefresh)\r\n}\r\n","import { Quote } from '../charts-lib'\r\nimport './market_sentiment'\r\nimport './refresh'\r\n\r\ninterface Index {\r\n ticker: string\r\n timeframe: string\r\n volume: number[]\r\n date: number[]\r\n open: number[]\r\n high: number[]\r\n low: number[]\r\n close: number[]\r\n lastOpen: null\r\n lastHigh: null\r\n lastLow: null\r\n lastClose: number\r\n lastVolume: null\r\n lastDate: number\r\n prevClose: number\r\n afterClose: null\r\n afterChange: null\r\n relativeVolume: number\r\n}\r\n\r\nexport type Indices = Record\r\n\r\nexport function getData(index: string, ticker: string, indices: Indices) {\r\n return {\r\n ...indices[index],\r\n ticker: ticker, // use text?\r\n timeframe: 'i10',\r\n instrument: 'stock',\r\n premarket: false,\r\n aftermarket: false,\r\n afterChange: null,\r\n afterClose: null,\r\n drawMinutesPerDay: 390,\r\n marketStartMinutes: 570,\r\n premarketLengthMinutes: 0,\r\n aftermarketLengthMinutes: 0,\r\n }\r\n}\r\n\r\nexport function updateIndices(indices: Indices) {\r\n Quote.findByAttribute('ticker', 'DOW').updateAttributes(getData('^DJI', 'DOW', indices))\r\n Quote.findByAttribute('ticker', 'NASDAQ').updateAttributes(getData('^IXIC', 'NASDAQ', indices))\r\n Quote.findByAttribute('ticker', 'S&P 500').updateAttributes(getData('^GSPC', 'S&P 500', indices))\r\n}\r\n","import ReactDOM from 'react-dom'\r\n\r\nimport { ChartLayout, Quote } from '../charts-lib'\r\nimport { SpecificChartFunctionality, getCustomColorsFromCookies } from '../shared/chartLayoutConfig'\r\nimport { ready } from '../shared/ready'\r\nimport { getData } from './indices-data'\r\nimport type { Indices } from './indices-data'\r\nimport './market_sentiment'\r\nimport './refresh'\r\n\r\nfunction getChartConfig(ticker: string) {\r\n return {\r\n layout: '1h1v',\r\n width: 320,\r\n height: 190,\r\n barWidth: 3,\r\n barMargin: 1,\r\n scrollable: false,\r\n editable: false,\r\n cross: false,\r\n colors: getCustomColorsFromCookies(),\r\n specificChartFunctionality: SpecificChartFunctionality.smallIndex,\r\n charts: [\r\n {\r\n height: 190,\r\n timeframe: 'i10',\r\n scale: 'linear',\r\n ticker: ticker,\r\n // leftOffset: 0,\r\n instrument: 'stock',\r\n refreshData: false,\r\n // stretch: true,\r\n panes: [\r\n {\r\n height: 190,\r\n elements: [\r\n {\r\n type: 'charts/candle_stick',\r\n overlays: [],\r\n },\r\n ],\r\n },\r\n ],\r\n },\r\n ],\r\n }\r\n}\r\n\r\nfunction renderChart({ ticker, element }: { ticker: string; element: HTMLElement | null }) {\r\n if (element) {\r\n ReactDOM.render(, element)\r\n }\r\n}\r\n\r\nready(function () {\r\n const indicesText = document.getElementById('js-indices')!.textContent\r\n const indices = JSON.parse(indicesText!) as Indices\r\n\r\n Quote.create(getData('^DJI', 'DOW', indices)).save()\r\n Quote.create(getData('^IXIC', 'NASDAQ', indices)).save()\r\n Quote.create(getData('^GSPC', 'S&P 500', indices)).save()\r\n\r\n renderChart({ ticker: 'DOW', element: document.getElementById('dow') })\r\n renderChart({ ticker: 'NASDAQ', element: document.getElementById('nasdaq') })\r\n renderChart({ ticker: 'S&P 500', element: document.getElementById('sp500') })\r\n})\r\n","import { ReactNode } from 'react'\r\n\r\nexport enum MapTypeId {\r\n Sector = 'sec',\r\n World = 'geo',\r\n SectorFull = 'sec_all',\r\n ETF = 'etf',\r\n Screener = 'screener',\r\n Portfolio = 'portfolio',\r\n}\r\n\r\nexport enum MapSubtypeId {\r\n DayPerf = 'd1',\r\n WeekPerf = 'w1',\r\n MonthPerf = 'w4',\r\n ThreeMonthPerf = 'w13',\r\n SixMonthPerf = 'w26',\r\n YearPerf = 'w52',\r\n YearToDatePerf = 'ytd',\r\n RelativeVolume = 'relvol',\r\n PriceToEarnings = 'pe',\r\n ForwardPriceToEearnings = 'fpe',\r\n PriceEarningsToGrowth = 'peg',\r\n PriceToSellsRatio = 'ps',\r\n PriceToBookRatio = 'pb',\r\n DividendYield = 'div',\r\n EPSGrowth5y = 'eps5y',\r\n FloatShort = 'short',\r\n AnalystRecommendation = 'rec',\r\n EarningsPerf = 'earnperf',\r\n EarningsDate = 'earndate',\r\n // Portfolio\r\n PortfolioGainPct = 'portfolioGainPct',\r\n PortfolioGainUsd = 'portfolioGainUsd',\r\n PortfolioChangePct = 'portfolioChangePct',\r\n PortfolioChangeUsd = 'portfolioChangeUsd',\r\n}\r\n\r\nexport enum ScaleId {\r\n DayPerf = 'default',\r\n WeekPerf = '_5',\r\n MonthPerf = '_10',\r\n ThreeMonthPerf = '_15',\r\n SixMonthPerf = '_20',\r\n YearPerf = '_25',\r\n RelativeVolume = '_relvol',\r\n PriceToEarnings = '_pe',\r\n ForwardPriceToEearnings = '_fpe',\r\n PriceEarningsToGrowth = '_peg',\r\n PriceToSellsRatio = '_ps',\r\n PriceToBookRatio = '_pb',\r\n DividendYield = '_div',\r\n EPSGrowth5y = '_eps5y',\r\n FloatShort = '_short',\r\n AnalystRecommendation = '_rec',\r\n EarningsDate = '_earndate',\r\n // Portfolio\r\n PortfolioPct = '_portfolioPct',\r\n PortfolioUsd = '_portfolioUsd',\r\n}\r\n\r\nexport const enum NodeDepth {\r\n Root,\r\n Sector,\r\n Industry,\r\n Node,\r\n}\r\n\r\nexport interface MapDataRow {\r\n name: string\r\n perf?: number\r\n x: number\r\n y: number\r\n dx: number\r\n dy: number\r\n data: any\r\n depth: NodeDepth\r\n}\r\n\r\nexport interface MapDataRoot {\r\n name: 'Root'\r\n children: MapDataSector[]\r\n duplicateTickers: number\r\n}\r\n\r\nexport interface MapDataSector extends MapDataRow {\r\n children: MapDataIndustry[]\r\n parent: MapDataRoot\r\n}\r\n\r\nexport interface MapDataIndustry extends MapDataRow {\r\n children: MapDataNode[]\r\n parent: MapDataSector\r\n}\r\n\r\nexport interface MapDataNode extends MapDataRow {\r\n parent: MapDataIndustry\r\n additional?: string\r\n description: string\r\n perfText: string\r\n value: number\r\n}\r\n\r\nexport interface MapData {\r\n sectors: MapDataSector[]\r\n industries: MapDataIndustry[]\r\n nodes: MapDataNode[]\r\n}\r\n\r\nexport type PerfData = {\r\n nodes: Record | Array\r\n additional: Record\r\n version: number\r\n}\r\n\r\nexport interface MapSubtype {\r\n id: MapSubtypeId\r\n name: string\r\n scaleId: ScaleId\r\n tooltip: string\r\n countIndustryPerf: boolean\r\n countSectorPerf: boolean\r\n}\r\n\r\nexport interface MapType {\r\n name: string\r\n pageTitle: string\r\n nameShort?: string\r\n description: string\r\n type: MapTypeId\r\n subtypes: MapSubtype[]\r\n}\r\n\r\nexport interface Scale {\r\n name: string\r\n tooltip: ReactNode\r\n id: ScaleId\r\n}\r\n","import { getParsedCookies } from './cookie'\r\n\r\ninterface PaneElementProps {\r\n type: string\r\n label?: string\r\n fromDate?: string\r\n toDate?: string\r\n min?: number\r\n tickers: string[]\r\n overlays: string[]\r\n}\r\n\r\nexport enum SpecificChartFunctionality {\r\n default = 'default',\r\n quotePage = 'quotePage',\r\n chartPage = 'chartPage',\r\n smallIndex = 'smallIndex',\r\n offScreen = 'offScreen',\r\n forexPage = 'forexPage',\r\n featuresPage = 'featuresPage',\r\n cryptoPage = 'cryptoPage',\r\n}\r\n\r\ninterface StaticChartConfigProps {\r\n ticker: string\r\n timeframe: string\r\n paneElements: PaneElementProps[]\r\n specificChartFunctionality?: SpecificChartFunctionality\r\n colorsOverride?: Array\r\n}\r\n\r\nexport function getStaticChartConfig({\r\n ticker,\r\n timeframe,\r\n paneElements,\r\n specificChartFunctionality = SpecificChartFunctionality.default,\r\n colorsOverride,\r\n}: StaticChartConfigProps) {\r\n return {\r\n layout: '1h1v',\r\n width: 800,\r\n height: 400,\r\n barWidth: 1,\r\n barMargin: 0,\r\n scrollable: false,\r\n editable: false,\r\n specificChartFunctionality,\r\n colorsOverride,\r\n colors: getCustomColorsFromCookies(),\r\n charts: [\r\n {\r\n height: 400,\r\n timeframe,\r\n scale: 'linear',\r\n ticker: ticker,\r\n leftOffset: 0,\r\n instrument: 'stock',\r\n refreshData: false,\r\n stretch: true,\r\n panes: [\r\n {\r\n height: 400,\r\n elements: paneElements,\r\n },\r\n ],\r\n },\r\n ],\r\n }\r\n}\r\n\r\nexport function getCustomColorsFromCookies() {\r\n try {\r\n return JSON.parse(getParsedCookies('customColors') as string)\r\n } catch {\r\n return undefined\r\n }\r\n}\r\n","export function ready(fn: (ev?: Event) => any) {\r\n if (document.readyState !== 'loading') {\r\n fn()\r\n return\r\n }\r\n\r\n document.addEventListener('DOMContentLoaded', fn)\r\n}\r\n","/**\n * Copyright (c) 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\nmodule.exports.Dispatcher = require('./lib/Dispatcher')\n","/*\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule Dispatcher\n * @typechecks\n */\n\n\"use strict\";\n\nvar invariant = require('./invariant');\n\nvar _lastID = 1;\nvar _prefix = 'ID_';\n\n/**\n * Dispatcher is used to broadcast payloads to registered callbacks. This is\n * different from generic pub-sub systems in two ways:\n *\n * 1) Callbacks are not subscribed to particular events. Every payload is\n * dispatched to every registered callback.\n * 2) Callbacks can be deferred in whole or part until other callbacks have\n * been executed.\n *\n * For example, consider this hypothetical flight destination form, which\n * selects a default city when a country is selected:\n *\n * var flightDispatcher = new Dispatcher();\n *\n * // Keeps track of which country is selected\n * var CountryStore = {country: null};\n *\n * // Keeps track of which city is selected\n * var CityStore = {city: null};\n *\n * // Keeps track of the base flight price of the selected city\n * var FlightPriceStore = {price: null}\n *\n * When a user changes the selected city, we dispatch the payload:\n *\n * flightDispatcher.dispatch({\n * actionType: 'city-update',\n * selectedCity: 'paris'\n * });\n *\n * This payload is digested by `CityStore`:\n *\n * flightDispatcher.register(function(payload) {\n * if (payload.actionType === 'city-update') {\n * CityStore.city = payload.selectedCity;\n * }\n * });\n *\n * When the user selects a country, we dispatch the payload:\n *\n * flightDispatcher.dispatch({\n * actionType: 'country-update',\n * selectedCountry: 'australia'\n * });\n *\n * This payload is digested by both stores:\n *\n * CountryStore.dispatchToken = flightDispatcher.register(function(payload) {\n * if (payload.actionType === 'country-update') {\n * CountryStore.country = payload.selectedCountry;\n * }\n * });\n *\n * When the callback to update `CountryStore` is registered, we save a reference\n * to the returned token. Using this token with `waitFor()`, we can guarantee\n * that `CountryStore` is updated before the callback that updates `CityStore`\n * needs to query its data.\n *\n * CityStore.dispatchToken = flightDispatcher.register(function(payload) {\n * if (payload.actionType === 'country-update') {\n * // `CountryStore.country` may not be updated.\n * flightDispatcher.waitFor([CountryStore.dispatchToken]);\n * // `CountryStore.country` is now guaranteed to be updated.\n *\n * // Select the default city for the new country\n * CityStore.city = getDefaultCityForCountry(CountryStore.country);\n * }\n * });\n *\n * The usage of `waitFor()` can be chained, for example:\n *\n * FlightPriceStore.dispatchToken =\n * flightDispatcher.register(function(payload) {\n * switch (payload.actionType) {\n * case 'country-update':\n * flightDispatcher.waitFor([CityStore.dispatchToken]);\n * FlightPriceStore.price =\n * getFlightPriceStore(CountryStore.country, CityStore.city);\n * break;\n *\n * case 'city-update':\n * FlightPriceStore.price =\n * FlightPriceStore(CountryStore.country, CityStore.city);\n * break;\n * }\n * });\n *\n * The `country-update` payload will be guaranteed to invoke the stores'\n * registered callbacks in order: `CountryStore`, `CityStore`, then\n * `FlightPriceStore`.\n */\n\n function Dispatcher() {\n this.$Dispatcher_callbacks = {};\n this.$Dispatcher_isPending = {};\n this.$Dispatcher_isHandled = {};\n this.$Dispatcher_isDispatching = false;\n this.$Dispatcher_pendingPayload = null;\n }\n\n /**\n * Registers a callback to be invoked with every dispatched payload. Returns\n * a token that can be used with `waitFor()`.\n *\n * @param {function} callback\n * @return {string}\n */\n Dispatcher.prototype.register=function(callback) {\n var id = _prefix + _lastID++;\n this.$Dispatcher_callbacks[id] = callback;\n return id;\n };\n\n /**\n * Removes a callback based on its token.\n *\n * @param {string} id\n */\n Dispatcher.prototype.unregister=function(id) {\n invariant(\n this.$Dispatcher_callbacks[id],\n 'Dispatcher.unregister(...): `%s` does not map to a registered callback.',\n id\n );\n delete this.$Dispatcher_callbacks[id];\n };\n\n /**\n * Waits for the callbacks specified to be invoked before continuing execution\n * of the current callback. This method should only be used by a callback in\n * response to a dispatched payload.\n *\n * @param {array} ids\n */\n Dispatcher.prototype.waitFor=function(ids) {\n invariant(\n this.$Dispatcher_isDispatching,\n 'Dispatcher.waitFor(...): Must be invoked while dispatching.'\n );\n for (var ii = 0; ii < ids.length; ii++) {\n var id = ids[ii];\n if (this.$Dispatcher_isPending[id]) {\n invariant(\n this.$Dispatcher_isHandled[id],\n 'Dispatcher.waitFor(...): Circular dependency detected while ' +\n 'waiting for `%s`.',\n id\n );\n continue;\n }\n invariant(\n this.$Dispatcher_callbacks[id],\n 'Dispatcher.waitFor(...): `%s` does not map to a registered callback.',\n id\n );\n this.$Dispatcher_invokeCallback(id);\n }\n };\n\n /**\n * Dispatches a payload to all registered callbacks.\n *\n * @param {object} payload\n */\n Dispatcher.prototype.dispatch=function(payload) {\n invariant(\n !this.$Dispatcher_isDispatching,\n 'Dispatch.dispatch(...): Cannot dispatch in the middle of a dispatch.'\n );\n this.$Dispatcher_startDispatching(payload);\n try {\n for (var id in this.$Dispatcher_callbacks) {\n if (this.$Dispatcher_isPending[id]) {\n continue;\n }\n this.$Dispatcher_invokeCallback(id);\n }\n } finally {\n this.$Dispatcher_stopDispatching();\n }\n };\n\n /**\n * Is this Dispatcher currently dispatching.\n *\n * @return {boolean}\n */\n Dispatcher.prototype.isDispatching=function() {\n return this.$Dispatcher_isDispatching;\n };\n\n /**\n * Call the callback stored with the given id. Also do some internal\n * bookkeeping.\n *\n * @param {string} id\n * @internal\n */\n Dispatcher.prototype.$Dispatcher_invokeCallback=function(id) {\n this.$Dispatcher_isPending[id] = true;\n this.$Dispatcher_callbacks[id](this.$Dispatcher_pendingPayload);\n this.$Dispatcher_isHandled[id] = true;\n };\n\n /**\n * Set up bookkeeping needed when dispatching.\n *\n * @param {object} payload\n * @internal\n */\n Dispatcher.prototype.$Dispatcher_startDispatching=function(payload) {\n for (var id in this.$Dispatcher_callbacks) {\n this.$Dispatcher_isPending[id] = false;\n this.$Dispatcher_isHandled[id] = false;\n }\n this.$Dispatcher_pendingPayload = payload;\n this.$Dispatcher_isDispatching = true;\n };\n\n /**\n * Clear bookkeeping used for dispatching.\n *\n * @internal\n */\n Dispatcher.prototype.$Dispatcher_stopDispatching=function() {\n this.$Dispatcher_pendingPayload = null;\n this.$Dispatcher_isDispatching = false;\n };\n\n\nmodule.exports = Dispatcher;\n","/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule invariant\n */\n\n\"use strict\";\n\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar invariant = function(condition, format, a, b, c, d, e, f) {\n if (false) {\n if (format === undefined) {\n throw new Error('invariant requires an error message argument');\n }\n }\n\n if (!condition) {\n var error;\n if (format === undefined) {\n error = new Error(\n 'Minified exception occurred; use the non-minified dev environment ' +\n 'for the full error message and additional helpful warnings.'\n );\n } else {\n var args = [a, b, c, d, e, f];\n var argIndex = 0;\n error = new Error(\n 'Invariant Violation: ' +\n format.replace(/%s/g, function() { return args[argIndex++]; })\n );\n }\n\n error.framesToPop = 1; // we don't care about invariant's own frame\n throw error;\n }\n};\n\nmodule.exports = invariant;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\n\"use strict\";\n\n/**\n * Constructs an enumeration with keys equal to their value.\n *\n * For example:\n *\n * var COLORS = keyMirror({blue: null, red: null});\n * var myColor = COLORS.blue;\n * var isColorValid = !!COLORS[myColor];\n *\n * The last line could not be performed if the values of the generated enum were\n * not equal to their keys.\n *\n * Input: {key1: val1, key2: val2}\n * Output: {key1: key1, key2: key2}\n *\n * @param {object} obj\n * @return {object}\n */\nvar keyMirror = function(obj) {\n var ret = {};\n var key;\n if (!(obj instanceof Object && !Array.isArray(obj))) {\n throw new Error('keyMirror(...): Argument must be an object.');\n }\n for (key in obj) {\n if (!obj.hasOwnProperty(key)) {\n continue;\n }\n ret[key] = key;\n }\n return ret;\n};\n\nmodule.exports = keyMirror;\n"],"names":["SettingsTab","chartsLib","window","FLibs","Charts","FREE_DATE_RANGES","ChartLayout","ChartLayoutWithGlobalState","ChartLayoutHeader","ChartSettings","PreventClosingUnsavedChanges","useChartLayoutGlobalModel","StockDetailTimeframeBar","Quote","Utils","Settings","convertTa","useModelState","ticker","marketSentimentChartConfig","layout","width","height","scrollable","editable","cross","charts","timeframe","scale","instrument","refreshData","stretch","panes","elements","type","overlays","MarketSentiment","Component","loading","enabled","chartConfig","async","urlQuery","callback","setTimer","_timer","clearTimeout","document","hidden","setTimeout","_fetchData","_lastRequest","apiRequest","json","quoteData","getData","updateAttributes","save","setState","refresh","componentDidMount","this","componentWillUnmount","cancel","render","state","cellPadding","cellSpacing","border","style","visibility","id","config","valign","disabled","onClick","e","_vote","src","alt","display","sentiment","preventDefault","undefined","data","close","sum","volume","weight","date","Array","from","repeat","length","map","x","parseInt","premarket","aftermarket","afterChange","afterClose","drawMinutesPerDay","visibleMinutes","marketStartMinutes","premarketLengthMinutes","aftermarketLengthMinutes","el","getElementById","ReactDOM","mount","homepageRefresh","getSignalsTableStart","getDataFromStartEndChar","str","startStr","endStr","start","indexOf","end","substring","getDataFromVariableName","variableName","value","JSON","parse","OnHomepageRefresh","result","FinvizIndexVersion","location","reload","userId","signals1El","signals1","innerHTML","signals2El","signals2","homepageBottomEl","homepageBottom","indicesData","indices","perfDataSec","perfDataGeo","mapActionCreators","FinvizIndexSecMap","FinvizIndexGeoMap","RenderRecentQuotes","gtag","event_category","finvizBannersLoaded","initFinvizBanners","refreshAds","HomepageRefresh","pathname","headers","ContentType","index","getChartConfig","barWidth","barMargin","colors","getCustomColorsFromCookies","specificChartFunctionality","SpecificChartFunctionality","renderChart","element","FinvizHomepageRefreshInterval","ready","indicesText","textContent","MapTypeId","MapSubtypeId","ScaleId","NodeDepth","getStaticChartConfig","paneElements","default","colorsOverride","leftOffset","getParsedCookies","fn","readyState","addEventListener","module","exports","Dispatcher","invariant","_lastID","$Dispatcher_callbacks","$Dispatcher_isPending","$Dispatcher_isHandled","$Dispatcher_isDispatching","$Dispatcher_pendingPayload","prototype","register","unregister","waitFor","ids","ii","$Dispatcher_invokeCallback","dispatch","payload","$Dispatcher_startDispatching","$Dispatcher_stopDispatching","isDispatching","condition","format","a","b","c","d","f","error","Error","args","argIndex","replace","framesToPop","obj","key","ret","Object","isArray","hasOwnProperty"],"sourceRoot":""}