{"version":3,"file":"home.ddba84f7.js","mappings":"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","sources":["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/signals-switch/types.ts","webpack://@finviz/website/./js/app/home/signals-switch/EliteSwitch.tsx","webpack://@finviz/website/./js/app/home/signals-switch/FreeSwitch.tsx","webpack://@finviz/website/./js/app/home/signals-switch/index.tsx","webpack://@finviz/website/./js/app/home/index.tsx","webpack://@finviz/website/./js/app/maps/services/api.ts","webpack://@finviz/website/./js/app/maps/store/action-creators.ts","webpack://@finviz/website/./js/app/maps/store/appDispatcher.ts","webpack://@finviz/website/./js/app/maps/store/constants.ts","webpack://@finviz/website/./js/app/maps/store/store.ts","webpack://@finviz/website/./js/app/maps/store/mapStore.ts","webpack://@finviz/website/./js/app/shared/chartLayoutConfig.ts","webpack://@finviz/website/./js/app/shared/parseJSONFromScript.ts","webpack://@finviz/website/../charts/app/constants/common.ts","webpack://@finviz/website/../charts/app/utils.ts","webpack://@finviz/website/../charts/app/utils/helpers.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 { Component, MouseEvent } from 'react'\r\nimport ReactDOM from 'react-dom/client'\r\n\r\nimport { CancelablePromise, apiRequest } from '../../main/services/api'\r\nimport { Instrument } from '../../main/types'\r\nimport {\r\n ChartElementType,\r\n ChartLayout,\r\n LayoutType,\r\n Quote,\r\n RootChartConfigObject,\r\n ScaleType,\r\n TIMEFRAME,\r\n Theme,\r\n} from '../charts-lib'\r\n\r\nconst ticker = 'market_sentiment'\r\n\r\nconst MARKET_SENTIMENT_WIDTH_PX = 160\r\nconst MARKET_SENTIMENT_HEIGHT_PX = 40\r\nconst marketSentimentChartConfig: RootChartConfigObject = {\r\n layout: LayoutType['1h1v'],\r\n theme: FinvizSettings.hasDarkTheme ? Theme.dark : Theme.light,\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 width: MARKET_SENTIMENT_WIDTH_PX,\r\n height: MARKET_SENTIMENT_HEIGHT_PX,\r\n timeframe: TIMEFRAME.i3,\r\n scale: ScaleType.Linear,\r\n ticker: ticker,\r\n instrument: Instrument.MarketSentiment,\r\n refreshData: false,\r\n premarket: false,\r\n aftermarket: false,\r\n dateRange: null,\r\n stretch: true,\r\n panes: [\r\n {\r\n height: MARKET_SENTIMENT_HEIGHT_PX,\r\n elements: [\r\n {\r\n type: ChartElementType.MarketSentiment,\r\n overlays: [],\r\n },\r\n ],\r\n },\r\n ],\r\n },\r\n ],\r\n}\r\n\r\ninterface MarketSentimentState {\r\n loading: boolean\r\n enabled: boolean\r\n chartConfig: RootChartConfigObject | null\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\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 this._vote(e, 'bull')}\r\n >\r\n Bull\r\n \r\n \r\n this._vote(e, 'bear')}\r\n >\r\n Bear\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?: () => void, 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\nlet root: ReactDOM.Root\r\nfunction mount() {\r\n const rootEl = document.getElementById('js-market-sentiment')\r\n root = ReactDOM.createRoot(rootEl!)\r\n root.render()\r\n}\r\n\r\nfunction unmount() {\r\n root.unmount?.()\r\n}\r\n\r\nmount()\r\n\r\nexport { mount, unmount }\r\n","import { ContentType, apiRequest } from '../../main/services/api'\r\nimport { mapPerf } from '../maps/services/api'\r\nimport mapActionCreators from '../maps/store/action-creators'\r\nimport { MapSubtypeId, MapTypeId } from '../maps/types'\r\nimport { getMapsRefreshInterval } from '../maps/utils'\r\nimport { intervalCallbackOnWindowVisible } from '../shared/documentVisibility'\r\nimport { isStockFastRefreshAvailable } from '../shared/isStockFastRefreshAvailable'\r\nimport { parseJSONFromScript } from '../shared/parseJSONFromScript'\r\nimport { Indices, updateIndices } from './indices-data'\r\n\r\ninterface RefreshInfo {\r\n userId: string\r\n version: number\r\n interval: number\r\n hasGeoMaps: boolean\r\n}\r\n\r\nconst refreshInfo = parseJSONFromScript('refresh-init')\r\n\r\nfunction refreshPage(newDocument: Document) {\r\n // Replace market stats\r\n const oldMarketStats = document.getElementsByClassName('market-stats')\r\n const newMarketStats = newDocument.getElementsByClassName('market-stats')\r\n if (oldMarketStats.length === newMarketStats.length) {\r\n Array.from(oldMarketStats).forEach((_, index) => {\r\n const oldElement = oldMarketStats.item(index)\r\n const newElement = newMarketStats.item(index)\r\n if (oldElement && newElement) {\r\n oldElement.innerHTML = newElement.innerHTML\r\n }\r\n })\r\n }\r\n\r\n replaceSignalTables(newDocument)\r\n\r\n // Replace bottom\r\n const oldHomepageBottom = document.getElementById('js-homepage_bottom')\r\n const newHomepageBottom = newDocument.getElementById('js-homepage_bottom')\r\n if (oldHomepageBottom && newHomepageBottom) {\r\n oldHomepageBottom.innerHTML = newHomepageBottom.innerHTML\r\n }\r\n\r\n if (FinvizSettings.hasUserPremium || FinvizSettings.hasRedesignEnabled) {\r\n import(/* webpackChunkName: \"recent_quotes\" */ '../shared/recent_quotes').then(({ RenderRecentQuotes }) => {\r\n RenderRecentQuotes()\r\n })\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('#js-homepage_bottom [id*=IC_D_]')\r\n }\r\n}\r\n\r\nexport function replaceSignalTables(newDocument: Document) {\r\n // Replace left signals table\r\n const oldSignalsLeft = document.getElementById('js-signals_1')\r\n const newSignalsLeft = newDocument.getElementById('js-signals_1')\r\n if (oldSignalsLeft && newSignalsLeft) {\r\n oldSignalsLeft.innerHTML = newSignalsLeft.innerHTML\r\n }\r\n\r\n // Replace right signals table\r\n const oldSignalsRight = document.getElementById('js-signals_2')\r\n const newSignalsRight = newDocument.getElementById('js-signals_2')\r\n if (oldSignalsRight && newSignalsRight) {\r\n oldSignalsRight.innerHTML = newSignalsRight.innerHTML\r\n }\r\n}\r\n\r\nexport async function getRefreshData() {\r\n const data = await apiRequest(window.location.pathname, {\r\n headers: {\r\n 'Content-Type': ContentType.Html,\r\n 'X-Is-Ajax-Request': 'true',\r\n 'X-Theme': FinvizSettings.hasDarkTheme ? 'dark' : FinvizSettings.hasRedesignEnabled ? 'light' : 'legacy',\r\n },\r\n })\r\n\r\n if (!data) return undefined\r\n\r\n const newDocument = new DOMParser().parseFromString(data, 'text/html')\r\n const newRefreshInfo = parseJSONFromScript('refresh-init', newDocument)\r\n\r\n if (!refreshInfo || !newRefreshInfo || refreshInfo.userId !== newRefreshInfo.userId) return undefined\r\n\r\n if (refreshInfo.version !== newRefreshInfo.version) {\r\n window.location.reload()\r\n }\r\n\r\n return newDocument\r\n}\r\n\r\nfunction initRefresh(interval: number) {\r\n intervalCallbackOnWindowVisible({ interval }, async function handleRefresh() {\r\n const newDocument = await getRefreshData()\r\n\r\n if (newDocument) {\r\n refreshPage(newDocument)\r\n }\r\n })\r\n}\r\n\r\nenum IndicesPollingIntervalInMs {\r\n Default = 3000,\r\n Reduced = 60000,\r\n Free = 180000,\r\n}\r\n\r\nif (refreshInfo?.interval) {\r\n initRefresh(refreshInfo.interval * 1000)\r\n\r\n function getIndicesRefreshInterval() {\r\n if (!FinvizSettings.hasUserPremium) {\r\n return IndicesPollingIntervalInMs.Free\r\n }\r\n if (!isStockFastRefreshAvailable(false, false)) {\r\n return IndicesPollingIntervalInMs.Reduced\r\n }\r\n\r\n return IndicesPollingIntervalInMs.Default\r\n }\r\n\r\n intervalCallbackOnWindowVisible({ interval: getIndicesRefreshInterval }, async function handleRefresh() {\r\n const newIndicesData = await apiRequest('/api/indices_data.ashx')\r\n\r\n if (newIndicesData) {\r\n updateIndices(newIndicesData)\r\n }\r\n })\r\n\r\n intervalCallbackOnWindowVisible({ interval: getMapsRefreshInterval }, async function handleRefresh() {\r\n const perfDataSecReq = mapPerf(MapTypeId.Sector, MapSubtypeId.DayPerf)\r\n const perfDataGeoReq = refreshInfo.hasGeoMaps ? mapPerf(MapTypeId.World, MapSubtypeId.DayPerf) : null\r\n\r\n const [perfDataSec, perfDataGeo] = await Promise.all([perfDataSecReq, perfDataGeoReq])\r\n\r\n try {\r\n if (perfDataSec) {\r\n if (window.FinvizIndexSecMap.version !== perfDataSec.version) {\r\n window.location.reload()\r\n }\r\n mapActionCreators.updatePerfData(window.FinvizIndexSecMap, perfDataSec)\r\n }\r\n\r\n if (perfDataGeo) {\r\n if (window.FinvizIndexGeoMap.version !== perfDataGeo.version) {\r\n window.location.reload()\r\n }\r\n mapActionCreators.updatePerfData(window.FinvizIndexGeoMap, perfDataGeo)\r\n }\r\n } catch {}\r\n })\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 hasChartEvents: 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 const dowQ = Quote.findByAttribute('ticker', 'DOW')\r\n if (dowQ) dowQ.updateAttributes(getData('^DJI', 'DOW', indices))\r\n\r\n const nasdaqQ = Quote.findByAttribute('ticker', 'NASDAQ')\r\n if (nasdaqQ) nasdaqQ.updateAttributes(getData('^IXIC', 'NASDAQ', indices))\r\n\r\n const sap500Q = Quote.findByAttribute('ticker', 'S&P 500')\r\n if (sap500Q) sap500Q.updateAttributes(getData('^GSPC', 'S&P 500', indices))\r\n\r\n const rutQ = Quote.findByAttribute('ticker', 'RUSSELL 2000')\r\n if (rutQ) rutQ.updateAttributes(getData('^RUT', 'RUSSELL 2000', indices))\r\n\r\n if (!dowQ || !nasdaqQ || !sap500Q || !rutQ) {\r\n // Temporary code below\r\n // additional info gaining for https://finvizcom.sentry.io/issues/3963831382/?project=33153&referrer=issue-stream&statsPeriod=14d&stream_index=0\r\n window.Sentry?.captureMessage('indices-data.ts updateIndices', {\r\n extra: {\r\n allAvailableTickers: Quote.all()\r\n .reduce((acc: string[], cur: { ticker: string }) => {\r\n acc.push(cur.ticker)\r\n return acc\r\n }, [])\r\n .join(','),\r\n },\r\n })\r\n }\r\n}\r\n","export enum HPSignalInterval {\r\n intraday = 'intraday',\r\n daily = 'daily',\r\n}\r\n\r\nexport const HP_SIGNAL_LABELS: Record = {\r\n [HPSignalInterval.intraday]: 'Intraday',\r\n [HPSignalInterval.daily]: 'Daily',\r\n}\r\nexport const HP_SIGNAL_COOKIE = 'signalsInterval'\r\nexport const HP_SIGNAL_SWITCH_RENDER_SELECTOR = 'js-switches-root'\r\n","import classNames from 'classnames'\r\n\r\nimport { Icon, Select, SelectOption } from '../../../main/components'\r\nimport { HPSignalInterval, HP_SIGNAL_LABELS } from './types'\r\n\r\nconst IS_REDESIGN = FinvizSettings.hasRedesignEnabled\r\nconst OPTIONS = Object.entries(HP_SIGNAL_LABELS).map(([value, label]) => ({ value: value as HPSignalInterval, label }))\r\nconst ROUNDING = IS_REDESIGN ? undefined : 'none'\r\n\r\ntype EliteSwitchProps = {\r\n isLoading: boolean\r\n signal: HPSignalInterval\r\n onSignalChange: (signals: HPSignalInterval) => void\r\n}\r\n\r\nexport default function EliteSwitch({ isLoading, signal, onSignalChange }: EliteSwitchProps) {\r\n return (\r\n option.value === signal)}\r\n rightContent={}\r\n onChange={({ value }) => {\r\n onSignalChange(value)\r\n }}\r\n placement=\"bottom-end\"\r\n orientation=\"horizontal\"\r\n isLoading={isLoading}\r\n disabled={isLoading}\r\n gutter={IS_REDESIGN ? 0 : 1}\r\n // override height defined by button to not stretch old hp signal tables\r\n style={IS_REDESIGN ? undefined : { height: 'auto' }}\r\n >\r\n {OPTIONS.map((item) => (\r\n \r\n {item.label}\r\n \r\n ))}\r\n \r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { Button, Icon, Paragraph } from '../../../main/components'\r\nimport { Popover, PopoverTrigger, usePopoverState } from '../../../main/components/popover'\r\nimport { HPSignalInterval, HP_SIGNAL_LABELS } from './types'\r\n\r\nconst IS_REDESIGN = FinvizSettings.hasRedesignEnabled\r\n\r\nexport default function FreeSwitch() {\r\n const state = usePopoverState({ placement: 'bottom-end' })\r\n const isOpen = state.useState('open')\r\n\r\n return (\r\n <>\r\n {IS_REDESIGN ? (\r\n \r\n {HP_SIGNAL_LABELS[HPSignalInterval.daily]}\r\n \r\n ) : (\r\n \r\n {HP_SIGNAL_LABELS[HPSignalInterval.daily]}\r\n \r\n \r\n )}\r\n \r\n
\r\n \r\n Get access to intraday data with Finviz*Elite.\r\n \r\n \r\n Subscribe\r\n \r\n
\r\n \r\n \r\n )\r\n}\r\n","import React from 'react'\r\nimport * as ReactDOM from 'react-dom'\r\n\r\nimport { setCookieRequest } from '../../../main/services/api'\r\nimport { getCookie } from '../../shared/cookie'\r\nimport { getRefreshData, replaceSignalTables } from '../refresh'\r\nimport EliteSwitch from './EliteSwitch'\r\nimport FreeSwitch from './FreeSwitch'\r\nimport { HPSignalInterval, HP_SIGNAL_COOKIE } from './types'\r\n\r\nconst HEADER_SWITCH_SELECTOR = '.js-signal-switch'\r\nconst SWITCH_BUTTON_SELECTOR = '.js-signal-switch-button'\r\nconst signalSwitchesElements = Array.from(document.querySelectorAll(HEADER_SWITCH_SELECTOR))\r\n\r\nfunction getSignalsCookie() {\r\n const value = getCookie(HP_SIGNAL_COOKIE)\r\n let signal = HPSignalInterval.daily\r\n const castedValue = value as HPSignalInterval\r\n\r\n if (FinvizSettings.hasUserPremium && !!castedValue) signal = castedValue\r\n return signal\r\n}\r\n\r\nasync function handleSignalIntervalChange() {\r\n const newDocument = await getRefreshData()\r\n if (newDocument) {\r\n replaceSignalTables(newDocument)\r\n } else {\r\n document.location.reload()\r\n }\r\n}\r\n\r\nexport default function HomepageSignals() {\r\n const [signal, setSignal] = React.useState(getSignalsCookie())\r\n const [isLoading, setIsLoading] = React.useState(false)\r\n\r\n React.useEffect(() => {\r\n // remove inlined buttons from html template\r\n document.querySelectorAll(SWITCH_BUTTON_SELECTOR).forEach((element) => {\r\n element.remove()\r\n })\r\n }, [])\r\n\r\n const handleSignalChange = async (changedSignal: HPSignalInterval) => {\r\n if (changedSignal !== signal) {\r\n setSignal(changedSignal)\r\n setIsLoading(true)\r\n try {\r\n await setCookieRequest(HP_SIGNAL_COOKIE, changedSignal)\r\n await handleSignalIntervalChange().catch()\r\n } catch {\r\n setSignal(signal)\r\n }\r\n setIsLoading(false)\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n {signalSwitchesElements.map((element) =>\r\n ReactDOM.createPortal(\r\n FinvizSettings.hasUserPremium ? (\r\n \r\n ) : (\r\n \r\n ),\r\n element\r\n )\r\n )}\r\n \r\n )\r\n}\r\n","import ReactDOMClient from 'react-dom/client'\r\n\r\nimport { SpecificChartFunctionality } from '../../main/constants'\r\nimport {\r\n ChartElementType,\r\n ChartLayout,\r\n Instrument,\r\n LayoutType,\r\n Quote,\r\n ScaleType,\r\n TIMEFRAME,\r\n Theme,\r\n} from '../charts-lib'\r\nimport { getCustomColorsFromCookies } from '../shared/chartLayoutConfig'\r\nimport { parseJSONFromScript } from '../shared/parseJSONFromScript'\r\nimport { ready } from '../shared/ready'\r\nimport type { Indices } from './indices-data'\r\nimport { getData } from './indices-data'\r\nimport './market_sentiment'\r\nimport './refresh'\r\nimport SignalIntervalSwitch from './signals-switch'\r\nimport { HP_SIGNAL_SWITCH_RENDER_SELECTOR } from './signals-switch/types'\r\n\r\nif (FinvizSettings.hasUserPremium || FinvizSettings.hasRedesignEnabled) {\r\n import(/* webpackChunkName: \"recent_quotes\" */ '../shared/recent_quotes').then(({ RenderRecentQuotes }) => {\r\n RenderRecentQuotes()\r\n })\r\n}\r\n\r\nfunction getChartConfig(ticker: string) {\r\n return {\r\n layout: LayoutType['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 theme: FinvizSettings.hasDarkTheme ? Theme.dark : Theme.light,\r\n charts: [\r\n {\r\n width: 0,\r\n premarket: false,\r\n aftermarket: false,\r\n dateRange: null,\r\n height: 190,\r\n timeframe: TIMEFRAME.i10,\r\n scale: ScaleType.Linear,\r\n ticker: ticker,\r\n // leftOffset: 0,\r\n instrument: 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: ChartElementType.CandleStick,\r\n overlays: [],\r\n },\r\n ],\r\n },\r\n ],\r\n },\r\n ],\r\n }\r\n}\r\n\r\nfunction renderSignalIntervalSwitch() {\r\n const signalSwitches = document.getElementById(HP_SIGNAL_SWITCH_RENDER_SELECTOR)\r\n\r\n if (signalSwitches) {\r\n const root = ReactDOMClient.createRoot(signalSwitches)\r\n root.render()\r\n }\r\n}\r\n\r\nready(function () {\r\n const indices = parseJSONFromScript('js-indices')!\r\n const root = ReactDOMClient.createRoot(document.getElementById('home_indexes')!)\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 Quote.create(getData('^RUT', 'RUSSELL 2000', indices)).save()\r\n\r\n root.render(\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 renderSignalIntervalSwitch()\r\n})\r\n","import { ContentType, apiRequest } from '../../../main/services/api'\r\nimport { MapSubtypeId, MapTypeId, PerfData } from '../types'\r\n\r\nexport function mapPerf(type: MapTypeId, subtype: MapSubtypeId) {\r\n return apiRequest(`/api/map_perf.ashx`, { query: { t: type, st: subtype } })\r\n}\r\n\r\nexport function mapPerfScreener(query = window.location.search) {\r\n return apiRequest(`/api/map_perf_screener.ashx${query}`)\r\n}\r\n\r\nexport interface UploadMapResponse {\r\n imgUrl: string\r\n shareUrl: string\r\n}\r\n\r\nexport function uploadMap({ type, subtype, data }: { type: MapTypeId; subtype: MapSubtypeId; data: string }) {\r\n return apiRequest(`/publish_map_submit.ashx`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': ContentType.FormUrlEncoded,\r\n },\r\n body: new URLSearchParams({\r\n file: data.replace('data:image/png;base64,', ''),\r\n type,\r\n subtype,\r\n }),\r\n })\r\n}\r\n","import debounce from 'lodash.debounce'\r\n\r\nimport { CancelablePromise, apiRequest } from '../../../main/services/api'\r\nimport Treemap from '../treemap'\r\nimport { MapData, MapDataNode, MapTypeId, PerfData, Scale } from '../types'\r\nimport { getVisibleTooltipNodes } from '../utils'\r\nimport AppDispatcher from './appDispatcher'\r\nimport { ActionTypes } from './constants'\r\nimport mapStore from './mapStore'\r\n\r\nvar _targetScale = 1\r\nfunction zoomIn(treemap: Treemap, scale: number, tx: number, ty: number) {\r\n _targetScale = scale\r\n animate()\r\n function animate() {\r\n treemap.zoom.scale(+(treemap.zoom.scale() + 0.05).toFixed(2), { x: tx, y: ty })\r\n AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n if (treemap.zoom.scale() + 0.05 < _targetScale + 0.00001) {\r\n requestAnimationFrame(animate)\r\n }\r\n }\r\n}\r\n\r\nfunction zoomOut(treemap: Treemap, scale: number, tx: number, ty: number) {\r\n _targetScale = scale\r\n animate()\r\n function animate() {\r\n treemap.zoom.scale(+(treemap.zoom.scale() - 0.05).toFixed(2), { x: tx, y: ty })\r\n AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n if (treemap.zoom.scale() - 0.05 > _targetScale - 0.00001) {\r\n requestAnimationFrame(animate)\r\n }\r\n }\r\n}\r\n\r\nfunction updateVisibleSparklines(treemap: Treemap) {\r\n const hoveredNode = mapStore.getHoveredNode(treemap.mapNodeId)\r\n const visibleNodes = getVisibleTooltipNodes(hoveredNode)\r\n\r\n if (!visibleNodes.length) return\r\n\r\n const tickersToLoad = visibleNodes.map((node) => node!.name)\r\n if (hoveredNode && !tickersToLoad.includes(hoveredNode?.name)) {\r\n tickersToLoad.push(hoveredNode.name)\r\n }\r\n\r\n debouncedLoadSparklines(tickersToLoad, treemap.type)\r\n}\r\n\r\nlet _lastSparklinesRequest: CancelablePromise | null = null\r\nasync function loadSparklines(tickers: string[], mapType: string) {\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.LOAD_SPARKLINES_STARTED,\r\n })\r\n _lastSparklinesRequest?.cancel?.()\r\n _lastSparklinesRequest = apiRequest(\r\n '/api/map_sparklines.ashx',\r\n { query: { t: tickers.join(','), ty: mapType } },\r\n true\r\n )\r\n\r\n try {\r\n const data = await _lastSparklinesRequest\r\n AppDispatcher.handleServerAction({\r\n type: ActionTypes.LOAD_SPARKLINES_COMPLETED,\r\n data: data,\r\n })\r\n } catch (error) {\r\n // This just means we canceled the previous request\r\n if (_lastSparklinesRequest.aborted) return\r\n\r\n AppDispatcher.handleServerAction({\r\n type: ActionTypes.LOAD_SPARKLINES_FAILED,\r\n error,\r\n })\r\n }\r\n}\r\n\r\nconst debouncedLoadSparklines = debounce(loadSparklines, 200, { trailing: true })\r\n\r\nconst actions = {\r\n setHoveredNode(mapNodeId: string, node: MapDataNode | undefined) {\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.SET_HOVERED_NODE,\r\n node,\r\n mapNodeId,\r\n })\r\n },\r\n\r\n loadSparklineData(tickers: string[], mapType: MapTypeId) {\r\n if (tickers.length > 0) {\r\n debouncedLoadSparklines(tickers, mapType)\r\n }\r\n },\r\n\r\n loadSparklinesCancel() {\r\n _lastSparklinesRequest?.cancel?.()\r\n },\r\n\r\n resetSparklineData() {\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.RESET_SPARKLINE_DATA,\r\n })\r\n },\r\n\r\n changeTranslate(treemap: Treemap, tx: number, ty: number) {\r\n treemap.zoom.translate([tx, ty])\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.CHANGE_TRANSLATE,\r\n })\r\n },\r\n\r\n zoom(treemap: Treemap, direction: number, offsetX: number, offsetY: number) {\r\n if (direction > 0) {\r\n const zoomLevel = treemap.getNextZoomLevel()\r\n if (zoomLevel !== treemap.zoom.scale()) {\r\n zoomIn(treemap, zoomLevel, offsetX, offsetY)\r\n }\r\n } else {\r\n const zoomLevel = treemap.getPreviousZoomLevel()\r\n if (zoomLevel !== treemap.zoom.scale()) {\r\n zoomOut(treemap, zoomLevel, offsetX, offsetY)\r\n }\r\n }\r\n },\r\n\r\n render() {\r\n AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n },\r\n\r\n zoomAndTranslate(treemap: Treemap, scale: number, tx: number, ty: number) {\r\n treemap.zoom.scale(1, { x: tx, y: ty })\r\n treemap.zoom.scale(scale, { x: tx, y: ty })\r\n AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n },\r\n\r\n updateLayout(\r\n treemap: Treemap,\r\n props: { width: number; height: number; data: MapData; scale: Scale; dataHash: string }\r\n ) {\r\n treemap.updateData(props)\r\n treemap.zoom.updateDimensions(props)\r\n AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n\r\n // Update hovered node if any\r\n const hoveredNode = mapStore.getHoveredNode(treemap.mapNodeId)\r\n if (hoveredNode) {\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.SET_HOVERED_NODE,\r\n node: treemap.nodes.find((node) => node.name === hoveredNode.name),\r\n mapNodeId: treemap.mapNodeId,\r\n })\r\n updateVisibleSparklines(treemap)\r\n }\r\n },\r\n\r\n updatePerfData(treemap?: Treemap, data?: PerfData) {\r\n if (!treemap || !data) return\r\n\r\n treemap.updatePerf(data)\r\n AppDispatcher.handleServerAction({ type: ActionTypes.UPDATE_DATA, version: data.version })\r\n\r\n updateVisibleSparklines(treemap)\r\n },\r\n\r\n _setOnPublish(getPublishCanvas: () => HTMLCanvasElement) {\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.SET_PUBLISH_CANVAS,\r\n getPublishCanvas,\r\n })\r\n },\r\n\r\n setupWidget() {\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.SET_WIDGET,\r\n isWidget: true,\r\n })\r\n },\r\n}\r\n\r\nexport default actions\r\n","import { Dispatcher } from 'flux'\r\n\r\nimport { PayloadSources } from './constants'\r\n\r\nclass AppDispatcher extends Dispatcher {\r\n handleServerAction(action: any) {\r\n var payload = {\r\n source: PayloadSources.SERVER_ACTION,\r\n action: action,\r\n }\r\n //console.log(action, payload);\r\n this.dispatch(payload)\r\n }\r\n\r\n handleViewAction(action: any) {\r\n var payload = {\r\n source: PayloadSources.VIEW_ACTION,\r\n action: action,\r\n }\r\n //console.log(action, payload);\r\n this.dispatch(payload)\r\n }\r\n}\r\n\r\nconst dispatcher = new AppDispatcher()\r\nexport default dispatcher\r\n","import keyMirror from 'keymirror'\r\n\r\nconst ActionTypes = keyMirror({\r\n RENDER_TREEMAP: null,\r\n CHANGE_TRANSLATE: null,\r\n SET_HOVERED_NODE: null,\r\n\r\n LOAD_SPARKLINES_STARTED: null,\r\n LOAD_SPARKLINES_COMPLETED: null,\r\n LOAD_SPARKLINES_FAILED: null,\r\n RESET_SPARKLINE_DATA: null,\r\n\r\n INIT_STARTED: null,\r\n INIT_FAILED: null,\r\n\r\n UPDATE_DATA: null,\r\n\r\n SET_PUBLISH_CANVAS: null,\r\n\r\n SET_WIDGET: null,\r\n})\r\n\r\nconst PayloadSources = keyMirror({\r\n SERVER_ACTION: null,\r\n VIEW_ACTION: null,\r\n})\r\n\r\nexport { ActionTypes, PayloadSources }\r\n","import { EventEmitter } from 'events'\r\n\r\nclass Store extends EventEmitter {\r\n static CHANGE_EVENT = 'change'\r\n\r\n emitChange() {\r\n this.emit(Store.CHANGE_EVENT)\r\n }\r\n\r\n addChangeListener(callback: (...args: any[]) => void) {\r\n this.on(Store.CHANGE_EVENT, callback)\r\n }\r\n\r\n removeChangeListener(callback: (...args: any[]) => void) {\r\n this.removeListener(Store.CHANGE_EVENT, callback)\r\n }\r\n}\r\n\r\nexport default Store\r\n","import { MapDataNode } from '../types'\r\nimport AppDispatcher from './appDispatcher'\r\nimport { ActionTypes } from './constants'\r\nimport Store from './store'\r\n\r\nlet _hoveredNode: MapDataNode\r\nlet _mapNodeId: string\r\nlet _sparklinesData: Record = {}\r\nlet _dataVersion: number\r\nlet _isWidget = false\r\nlet _getPublishCanvas: () => HTMLCanvasElement\r\n\r\nclass MapStore extends Store {\r\n getHoveredNode(mapNodeId: string) {\r\n if (mapNodeId === _mapNodeId) return _hoveredNode\r\n return undefined\r\n }\r\n\r\n getSparklines() {\r\n return _sparklinesData\r\n }\r\n\r\n getDataVersion() {\r\n return _dataVersion\r\n }\r\n\r\n isWidget() {\r\n return _isWidget\r\n }\r\n\r\n getPublishCanvas() {\r\n return _getPublishCanvas()\r\n }\r\n}\r\n\r\nvar mapStore = new MapStore()\r\n\r\n// @ts-ignore\r\nmapStore.dispatchToken = AppDispatcher.register(function (payload: any) {\r\n var action = payload.action\r\n\r\n switch (action.type) {\r\n case ActionTypes.RENDER_TREEMAP:\r\n mapStore.emitChange()\r\n break\r\n\r\n case ActionTypes.SET_HOVERED_NODE:\r\n if (action.node !== _hoveredNode) {\r\n _hoveredNode = action.node\r\n _mapNodeId = action.mapNodeId\r\n mapStore.emitChange()\r\n }\r\n break\r\n\r\n case ActionTypes.CHANGE_TRANSLATE:\r\n // @ts-ignore\r\n _hoveredNode = undefined\r\n mapStore.emitChange()\r\n break\r\n\r\n case ActionTypes.LOAD_SPARKLINES_STARTED:\r\n mapStore.emitChange()\r\n break\r\n\r\n case ActionTypes.LOAD_SPARKLINES_COMPLETED:\r\n _sparklinesData = { ..._sparklinesData, ...action.data }\r\n mapStore.emitChange()\r\n break\r\n\r\n case ActionTypes.RESET_SPARKLINE_DATA:\r\n case ActionTypes.LOAD_SPARKLINES_FAILED:\r\n _sparklinesData = {}\r\n mapStore.emitChange()\r\n break\r\n\r\n case ActionTypes.UPDATE_DATA:\r\n _dataVersion = action.version\r\n mapStore.emitChange()\r\n break\r\n\r\n case ActionTypes.SET_PUBLISH_CANVAS:\r\n _getPublishCanvas = action.getPublishCanvas\r\n mapStore.emitChange()\r\n break\r\n\r\n case ActionTypes.SET_WIDGET:\r\n _isWidget = action.isWidget\r\n mapStore.emitChange()\r\n break\r\n }\r\n})\r\n\r\nexport default mapStore\r\n","import { SpecificChartFunctionality } from '../../main/constants'\r\nimport { ChartConfigChartPaneElement, Instrument, LayoutType, ScaleType, TIMEFRAME, Theme } from '../charts-lib'\r\nimport { getParsedCookies } from './cookie'\r\n\r\ninterface PaneElementProps extends ChartConfigChartPaneElement {\r\n label?: string\r\n fromDate?: string\r\n toDate?: string\r\n min?: number\r\n tickers: string[]\r\n}\r\n\r\ninterface StaticChartConfigProps {\r\n width?: number\r\n height?: number\r\n ticker: string\r\n timeframe: TIMEFRAME\r\n paneElements: PaneElementProps[]\r\n specificChartFunctionality?: SpecificChartFunctionality\r\n colorsOverride?: Array\r\n theme?: Theme\r\n colors?: ReturnType\r\n refreshData?: boolean\r\n}\r\n\r\nexport function getStaticChartConfig({\r\n width = 800,\r\n height = 400,\r\n ticker,\r\n timeframe,\r\n paneElements,\r\n specificChartFunctionality = SpecificChartFunctionality.default,\r\n colorsOverride,\r\n theme,\r\n colors = getCustomColorsFromCookies(),\r\n refreshData = false,\r\n}: StaticChartConfigProps) {\r\n return {\r\n layout: LayoutType['1h1v'],\r\n width,\r\n height,\r\n barWidth: 1,\r\n barMargin: 0,\r\n scrollable: false,\r\n editable: false,\r\n specificChartFunctionality,\r\n colorsOverride,\r\n theme,\r\n colors,\r\n charts: [\r\n {\r\n width: 0,\r\n premarket: false,\r\n aftermarket: false,\r\n dateRange: null,\r\n height,\r\n timeframe,\r\n scale: ScaleType.Linear,\r\n ticker: ticker,\r\n leftOffset: 0,\r\n instrument: Instrument.Stock,\r\n refreshData,\r\n stretch: true,\r\n panes: [\r\n {\r\n height,\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 parseJSONFromScript(id: string, doc: Document = document): T | null {\r\n const el = doc.getElementById(id)\r\n const isValidElement = el && el.tagName === 'SCRIPT' && el.getAttribute('type') === 'application/json'\r\n\r\n if (!isValidElement) {\r\n window.Sentry?.captureMessage('parseJSONFromScript', {\r\n extra: {\r\n el: el ? 'yes' : 'no',\r\n tagName: el?.tagName,\r\n type: el?.getAttribute('type'),\r\n },\r\n })\r\n }\r\n\r\n if (!isValidElement) return null\r\n\r\n try {\r\n return JSON.parse(el.textContent!)\r\n } catch (e) {\r\n Sentry.captureException(e)\r\n return null\r\n }\r\n}\r\n","export const FONT_SIZE = {\r\n XXS: 5,\r\n XS: 7,\r\n S: 8,\r\n M: 10,\r\n L: 11,\r\n XXL: 18,\r\n XXXL: 23,\r\n}\r\nexport const LINE_HEIGHT = {\r\n XS: 7,\r\n S: 8,\r\n M: 10,\r\n}\r\nexport const PADDING = {\r\n XXXS: 1,\r\n XXS: 2,\r\n XS: 3,\r\n S: 5,\r\n}\r\nexport const MARGIN = {\r\n XS: 4,\r\n}\r\nexport const CHART_MARGIN = {\r\n S: 15,\r\n M: 30,\r\n L: 35,\r\n XL: 38,\r\n XXL: 48,\r\n}\r\nexport const SETTINGS_HEIGHT = 44\r\nexport const TICKER_TIMEFRAME_CHANGE_HEIGHT = 20\r\nexport const OFFSET = {\r\n XXS: 2,\r\n XS: 4,\r\n S: 6,\r\n M: 8,\r\n XXL: 20,\r\n}\r\nexport const MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\r\n\r\nexport enum ChartEditorEnum {\r\n publish = 'publish',\r\n tools = 'tools',\r\n ideas = 'ideas',\r\n settings = 'settings',\r\n timeframe = 'timeframe',\r\n}\r\n\r\nexport enum LayoutType {\r\n '1h1v' = '1h1v',\r\n '1h2v' = '1h2v',\r\n '1h3v' = '1h3v',\r\n '2h1v' = '2h1v',\r\n '2h2v' = '2h2v',\r\n '3h1v' = '3h1v',\r\n '3h2v' = '3h2v',\r\n '1l2r' = '1l2r',\r\n '1t2b' = '1t2b',\r\n}\r\n\r\nexport enum CanvasElementType {\r\n element = 'canvas/element',\r\n arrow = 'canvas/arrow',\r\n brushV1 = 'canvas/brush/brush_v1',\r\n curve = 'canvas/curve',\r\n ellipse = 'canvas/ellipse',\r\n fibonacciRetracements = 'canvas/fibonacci_retracements',\r\n horizontalLine = 'canvas/horizontal_line',\r\n line = 'canvas/line',\r\n measure = 'canvas/measure',\r\n pitchforkV1 = 'canvas/pitchfork/pitchfork_v1',\r\n polygon = 'canvas/polygon',\r\n position = 'canvas/position',\r\n rectangle = 'canvas/rectangle',\r\n rotatedRectangle = 'canvas/rotated_rectangle',\r\n scaledLine = 'canvas/scaled_line',\r\n scaledText = 'canvas/scaled_text',\r\n symbol = 'canvas/symbol',\r\n text = 'canvas/text',\r\n triangle = 'canvas/triangle',\r\n verticalLine = 'canvas/vertical_line',\r\n xabcd = 'canvas/xabcd',\r\n calloutV1 = 'canvas/callout/callout_v1',\r\n elliottWaves = 'canvas/elliott_waves/elliott_waves',\r\n ellipseV1 = 'canvas/ellipse/ellipse_v1',\r\n rotatedRectangleV1 = 'canvas/rotated_rectangle/rotated_rectangle_v1',\r\n}\r\n\r\nexport enum ChartElementType {\r\n CandleStick = 'charts/candle_stick',\r\n HeikinAshi = 'charts/heikin_ashi',\r\n HollowCandleStick = 'charts/candle_stick_hollow',\r\n LineChart = 'charts/line_chart',\r\n OhlcChart = 'charts/ohlc_chart',\r\n MarketSentiment = 'charts/market_sentiment',\r\n MultiLineChart = 'charts/multi_line_chart',\r\n PerfChart = 'charts/perf_chart',\r\n}\r\n\r\nexport enum IndicatorType {\r\n Indicator = 'indicators/indicator',\r\n None = 'indicators/none',\r\n Adx = 'indicators/adx',\r\n Aro = 'indicators/aro',\r\n Aroosc = 'indicators/aroosc',\r\n Atr = 'indicators/atr',\r\n Cci = 'indicators/cci',\r\n Cot = 'indicators/cot',\r\n Fi = 'indicators/fi',\r\n Macd = 'indicators/macd',\r\n Mfi = 'indicators/mfi',\r\n Obv = 'indicators/obv',\r\n Perf = 'indicators/perf',\r\n Rmi = 'indicators/rmi',\r\n Roc = 'indicators/roc',\r\n Rsi = 'indicators/rsi',\r\n Rvol = 'indicators/rvol',\r\n Rwi = 'indicators/rwi',\r\n Stofa = 'indicators/stofa',\r\n Stofu = 'indicators/stofu',\r\n Stosl = 'indicators/stosl',\r\n Trix = 'indicators/trix',\r\n Ult = 'indicators/ult',\r\n Vol = 'indicators/vol',\r\n Wr = 'indicators/wr',\r\n Shrtfl = 'indicators/shrtfl',\r\n Shrtra = 'indicators/shrtra',\r\n}\r\n\r\nexport enum OverlayType {\r\n Overlay = 'overlays/overlay',\r\n None = 'overlays/none',\r\n Bb = 'overlays/bb',\r\n Dch = 'overlays/dch',\r\n Ema = 'overlays/ema',\r\n Ema2 = 'overlays/ema2',\r\n Hilo = 'overlays/hilo',\r\n Hline = 'overlays/hline',\r\n Ic = 'overlays/ic',\r\n Icf = 'overlays/icf',\r\n Kch = 'overlays/kch',\r\n Patterns = 'overlays/patterns',\r\n Pp = 'overlays/pp',\r\n Sar = 'overlays/sar',\r\n Sma = 'overlays/sma',\r\n Sma2 = 'overlays/sma2',\r\n Str = 'overlays/str',\r\n Vp = 'overlays/vp',\r\n Vwap = 'overlays/vwap',\r\n}\r\n\r\nexport enum ChartEventDbType {\r\n Dividends = 'chartEvent/dividends',\r\n Split = 'chartEvent/split',\r\n Earnings = 'chartEvent/earnings',\r\n}\r\n\r\nexport enum ChartEventType {\r\n ChartEvent = 'chartEvent/chartEvent',\r\n Dividends = 'chartEvent/dividends',\r\n Split = 'chartEvent/split',\r\n Earnings = 'chartEvent/earnings',\r\n}\r\n\r\nexport enum ChartEventBadgeType {\r\n Dividends = 'chartEvent/dividends',\r\n Split = 'chartEvent/split',\r\n EarningsPositive = 'chartEvent/earnings',\r\n EarningsNegative = 'chartEvent/earningsNegative',\r\n EarningsNeutral = 'chartEvent/earningsNeutral',\r\n EarningsFuture = 'chartEvent/earningsFuture',\r\n}\r\n\r\nexport const ChartEventLabels: Record = {\r\n [ChartEventBadgeType.Dividends]: 'Dividends',\r\n [ChartEventBadgeType.Split]: 'Split',\r\n [ChartEventBadgeType.EarningsPositive]: 'Earnings & Revenue',\r\n [ChartEventBadgeType.EarningsNegative]: 'Earnings & Revenue',\r\n [ChartEventBadgeType.EarningsNeutral]: 'Earnings & Revenue',\r\n [ChartEventBadgeType.EarningsFuture]: 'Earnings & Revenue',\r\n}\r\n\r\ninterface LayoutRule {\r\n columns: number\r\n rows: number\r\n count: number\r\n gridAreas?: string[]\r\n}\r\n\r\nexport const LAYOUTS: Record = {\r\n '1h1v': { columns: 1, rows: 1, count: 1 },\r\n '1h2v': { columns: 1, rows: 2, count: 2 },\r\n '1h3v': { columns: 1, rows: 3, count: 3 },\r\n '2h1v': { columns: 2, rows: 1, count: 2 },\r\n '2h2v': { columns: 2, rows: 2, count: 4 },\r\n '3h1v': { columns: 3, rows: 1, count: 3 },\r\n '3h2v': { columns: 3, rows: 2, count: 6 },\r\n '1l2r': {\r\n columns: 2,\r\n rows: 2,\r\n count: 3,\r\n gridAreas: ['1 / 1 / 3 / 2', '1 / 2 / 2 / 3', '2 / 2 / 3 / 3'],\r\n },\r\n '1t2b': {\r\n columns: 2,\r\n rows: 2,\r\n count: 3,\r\n gridAreas: ['1 / 1 / 2 / 3', '2 / 1 / 3 / 2', '2 / 2 / 3 / 3'],\r\n },\r\n}\r\n\r\nexport const SORT_DIRECTION = {\r\n ASC: 'ASC',\r\n DESC: 'DESC',\r\n}\r\n\r\nexport const ICON_SIZE = {\r\n L: 32,\r\n}\r\n\r\n// Keep in sync with the copy in Website repo - Website/js/main/constants.ts\r\nexport enum TIMEFRAME {\r\n i1 = 'i1',\r\n i2 = 'i2',\r\n i3 = 'i3',\r\n i5 = 'i5',\r\n i10 = 'i10',\r\n i15 = 'i15',\r\n i30 = 'i30',\r\n h = 'h',\r\n h2 = 'h2',\r\n h4 = 'h4',\r\n d = 'd',\r\n w = 'w',\r\n m = 'm',\r\n}\r\n\r\nexport type TimeframeAndIntradayType = TIMEFRAME | 'intraday'\r\n\r\nexport const TIMEFRAMES_WITH_PRE_MARKET = [TIMEFRAME.i1, TIMEFRAME.i2, TIMEFRAME.i3, TIMEFRAME.i5]\r\n\r\nexport const IntradayTimeframeInterval = {\r\n [TIMEFRAME.i1]: 1,\r\n [TIMEFRAME.i2]: 2,\r\n [TIMEFRAME.i3]: 3,\r\n [TIMEFRAME.i5]: 5,\r\n [TIMEFRAME.i10]: 10,\r\n [TIMEFRAME.i15]: 15,\r\n [TIMEFRAME.i30]: 30,\r\n [TIMEFRAME.h]: 60,\r\n [TIMEFRAME.h2]: 120,\r\n [TIMEFRAME.h4]: 240,\r\n}\r\n\r\nexport const TimeframeLabelShort = {\r\n [TIMEFRAME.i1]: '1M',\r\n [TIMEFRAME.i2]: '2M',\r\n [TIMEFRAME.i3]: '3M',\r\n [TIMEFRAME.i5]: '5M',\r\n [TIMEFRAME.i10]: '10M',\r\n [TIMEFRAME.i15]: '15M',\r\n [TIMEFRAME.i30]: '30M',\r\n [TIMEFRAME.h]: '1H',\r\n [TIMEFRAME.h2]: '2H',\r\n [TIMEFRAME.h4]: '4H',\r\n [TIMEFRAME.d]: 'D',\r\n [TIMEFRAME.w]: 'W',\r\n [TIMEFRAME.m]: 'M',\r\n}\r\n\r\nexport enum DateRangeType {\r\n d1 = 'd1',\r\n d5 = 'd5',\r\n m1 = 'm1',\r\n m3 = 'm3',\r\n m6 = 'm6',\r\n ytd = 'ytd',\r\n y1 = 'y1',\r\n y2 = 'y2',\r\n y5 = 'y5',\r\n max = 'max',\r\n}\r\n\r\nexport enum QuoteFinancialAttachment {\r\n shortInterest = 'shortInterest',\r\n}\r\n\r\nexport const TIMEFRAME_SECONDS = {\r\n [TIMEFRAME.i1]: 60,\r\n [TIMEFRAME.i2]: 120,\r\n [TIMEFRAME.i3]: 180,\r\n [TIMEFRAME.i5]: 300,\r\n [TIMEFRAME.i10]: 600,\r\n [TIMEFRAME.i15]: 900,\r\n [TIMEFRAME.i30]: 1800,\r\n [TIMEFRAME.h]: 3600,\r\n [TIMEFRAME.h2]: 7200,\r\n [TIMEFRAME.h4]: 14400,\r\n [TIMEFRAME.d]: 86400,\r\n [TIMEFRAME.w]: 604800,\r\n [TIMEFRAME.m]: 2592000,\r\n}\r\n\r\nexport const CRYPTOS = {\r\n // USD pairs\r\n BTCUSD: 'BTCUSD',\r\n ETHUSD: 'ETHUSD',\r\n BNBUSD: 'BNBUSD',\r\n SOLUSD: 'SOLUSD',\r\n XRPUSD: 'XRPUSD',\r\n DOGEUSD: 'DOGEUSD',\r\n ADAUSD: 'ADAUSD',\r\n TRXUSD: 'TRXUSD',\r\n AVAXUSD: 'AVAXUSD',\r\n DOTUSD: 'DOTUSD',\r\n BCHUSD: 'BCHUSD',\r\n NEARUSD: 'NEARUSD',\r\n LTCUSD: 'LTCUSD',\r\n APTUSD: 'APTUSD',\r\n XLMUSD: 'XLMUSD',\r\n LINKUSD: 'LINKUSD',\r\n ETCUSD: 'ETCUSD',\r\n UNIUSD: 'UNIUSD',\r\n EGLDUSD: 'EGLDUSD',\r\n FTMUSD: 'FTMUSD',\r\n OPUSD: 'OPUSD',\r\n SUIUSD: 'SUIUSD',\r\n\r\n // EUR pairs\r\n BTCEUR: 'BTCEUR',\r\n ETHEUR: 'ETHEUR',\r\n BNBEUR: 'BNBEUR',\r\n SOLEUR: 'SOLEUR',\r\n XRPEUR: 'XRPEUR',\r\n DOGEEUR: 'DOGEEUR',\r\n ADAEUR: 'ADAEUR',\r\n TRXEUR: 'TRXEUR',\r\n AVAXEUR: 'AVAXEUR',\r\n DOTEUR: 'DOTEUR',\r\n BCHEUR: 'BCHEUR',\r\n NEAREUR: 'NEAREUR',\r\n LTCEUR: 'LTCEUR',\r\n ICPEUR: 'ICPEUR',\r\n APTEUR: 'APTEUR',\r\n XLMEUR: 'XLMEUR',\r\n LINKEUR: 'LINKEUR',\r\n SHIBEUR: 'SHIBEUR',\r\n EGLDEUR: 'EGLDEUR',\r\n FTMEUR: 'FTMEUR',\r\n OPEUR: 'OPEUR',\r\n SUIEUR: 'SUIEUR',\r\n\r\n // USDT pairs\r\n BTCUSDT: 'BTCUSDT',\r\n ETHUSDT: 'ETHUSDT',\r\n BNBUSDT: 'BNBUSDT',\r\n SOLUSDT: 'SOLUSDT',\r\n XRPUSDT: 'XRPUSDT',\r\n DOGEUSDT: 'DOGEUSDT',\r\n ADAUSDT: 'ADAUSDT',\r\n TRXUSDT: 'TRXUSDT',\r\n AVAXUSDT: 'AVAXUSDT',\r\n DOTUSDT: 'DOTUSDT',\r\n BCHUSDT: 'BCHUSDT',\r\n NEARUSDT: 'NEARUSDT',\r\n LTCUSDT: 'LTCUSDT',\r\n ICPUSDT: 'ICPUSDT',\r\n FETUSDT: 'FETUSDT',\r\n ETCUSDT: 'ETCUSDT',\r\n APTUSDT: 'APTUSDT',\r\n XLMUSDT: 'XLMUSDT',\r\n LINKUSDT: 'LINKUSDT',\r\n SHIBUSDT: 'SHIBUSDT',\r\n UNIUSDT: 'UNIUSDT',\r\n EGLDUSDT: 'EGLDUSDT',\r\n FTMUSDT: 'FTMUSDT',\r\n OPUSDT: 'OPUSDT',\r\n SUIUSDT: 'SUIUSDT',\r\n\r\n // BTC pairs\r\n ETHBTC: 'ETHBTC',\r\n BNBBTC: 'BNBBTC',\r\n SOLBTC: 'SOLBTC',\r\n XRPBTC: 'XRPBTC',\r\n DOGEBTC: 'DOGEBTC',\r\n ADABTC: 'ADABTC',\r\n TRXBTC: 'TRXBTC',\r\n AVAXBTC: 'AVAXBTC',\r\n DOTBTC: 'DOTBTC',\r\n BCHBTC: 'BCHBTC',\r\n NEARBTC: 'NEARBTC',\r\n LTCBTC: 'LTCBTC',\r\n ICPBTC: 'ICPBTC',\r\n FETBTC: 'FETBTC',\r\n ETCBTC: 'ETCBTC',\r\n APTBTC: 'APTBTC',\r\n XLMBTC: 'XLMBTC',\r\n LINKBTC: 'LINKBTC',\r\n UNIBTC: 'UNIBTC',\r\n EGLDBTC: 'EGLDBTC',\r\n FTMBTC: 'FTMBTC',\r\n OPBTC: 'OPBTC',\r\n SUIBTC: 'SUIBTC',\r\n} as const\r\n\r\nexport enum SpecificChartFunctionality {\r\n default = 'default',\r\n quotePage = 'quotePage',\r\n quotePerf = 'quotePerf',\r\n quoteFinancials = 'quoteFinancials',\r\n chartPage = 'chartPage',\r\n smallIndex = 'smallIndex',\r\n offScreen = 'offScreen',\r\n forexPage = 'forexPage',\r\n futuresPage = 'futuresPage',\r\n cryptoPage = 'cryptoPage',\r\n}\r\n\r\nexport enum TextAlign {\r\n left = 'left',\r\n right = 'right',\r\n center = 'center',\r\n start = 'start',\r\n end = 'end',\r\n}\r\n\r\nexport enum TextBaseline {\r\n top = 'top',\r\n hanging = 'hanging',\r\n middle = 'middle',\r\n alphabetic = 'alphabetic',\r\n ideographic = 'ideographic',\r\n bottom = 'bottom',\r\n}\r\n\r\nexport enum ScaleType {\r\n Linear = 'linear',\r\n Percentage = 'percentage',\r\n Logarithmic = 'logarithmic',\r\n}\r\n\r\nexport enum QuotePollingIntervalInMs {\r\n Default = 2000,\r\n Free = 180000,\r\n Elite = Default,\r\n EliteStocksReduced = 60000,\r\n}\r\n\r\nexport const EXTRA_MARKET_BUFFER_MINUTES = 30\r\n\r\nexport const ScaleLabel = {\r\n [ScaleType.Linear]: 'Linear',\r\n [ScaleType.Percentage]: 'Percentage',\r\n [ScaleType.Logarithmic]: 'Logarithmic',\r\n}\r\n\r\nexport const PANE_HEIGHT_DEFAULT = {\r\n chart: 400,\r\n indicator: 120,\r\n}\r\n\r\nexport const INDICATOR_LABEL_HEIGHT = 24\r\n\r\nexport const MOBILE_BARS_TO_VIEW = 150 // 5 months of daily bars\r\n\r\nexport const MOBILE_VIEW_BREAKPOINT_WIDTH = 768\r\n\r\nexport const FREE_DATE_RANGES = ['m1', 'm3', 'm6', 'ytd', 'y1', 'y2', 'y5', 'max']\r\n\r\nexport const getTimeframeLabel = (timeframe: string) => {\r\n switch (timeframe) {\r\n case TIMEFRAME.i1:\r\n return '1 MIN'\r\n case TIMEFRAME.i2:\r\n return '2 MIN'\r\n case TIMEFRAME.i3:\r\n return '3 MIN'\r\n case TIMEFRAME.i5:\r\n return '5 MIN'\r\n case TIMEFRAME.i10:\r\n return '10 MIN'\r\n case TIMEFRAME.i15:\r\n return '15 MIN'\r\n case TIMEFRAME.i30:\r\n return '30 MIN'\r\n case TIMEFRAME.h:\r\n return '1 HR'\r\n case TIMEFRAME.h2:\r\n return '2 HR'\r\n case TIMEFRAME.h4:\r\n return '4 HR'\r\n case TIMEFRAME.d:\r\n return 'DAILY'\r\n case TIMEFRAME.w:\r\n return 'WEEKLY'\r\n case TIMEFRAME.m:\r\n return 'MONTHLY'\r\n default:\r\n return ''\r\n }\r\n}\r\n\r\nexport type ChartsPageQueryParams = {\r\n p: string\r\n t: string\r\n l: string\r\n r?: string\r\n i?: string\r\n sidebar?: string\r\n}\r\n\r\nexport type QuotePageQueryParams = {\r\n p?: string\r\n t: string\r\n r?: string\r\n i?: string\r\n ty?: QuotePageQueryChartTypes\r\n}\r\n\r\nexport enum QuotePageQueryChartTypes {\r\n l = 'l',\r\n c = 'c',\r\n cs = 'cs',\r\n hc = 'hc',\r\n ha = 'ha',\r\n o = 'o',\r\n p = 'p',\r\n}\r\n\r\nexport type ChartsOrQuotePageQueryParams = ChartsPageQueryParams | QuotePageQueryParams\r\n\r\nexport enum MacroTimeframe {\r\n // seconds = 'seconds',\r\n minutes = 'minutes',\r\n hours = 'hours',\r\n days = 'days',\r\n weeks = 'weeks',\r\n months = 'months',\r\n}\r\n\r\nexport const MicroMacroTimeframe = {\r\n [TIMEFRAME.i1]: {\r\n micro: 1,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i2]: {\r\n micro: 2,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i3]: {\r\n micro: 3,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i5]: {\r\n micro: 5,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i10]: {\r\n micro: 10,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i15]: {\r\n micro: 15,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i30]: {\r\n micro: 30,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.h]: {\r\n micro: 1,\r\n macro: MacroTimeframe.hours,\r\n },\r\n [TIMEFRAME.h2]: {\r\n micro: 2,\r\n macro: MacroTimeframe.hours,\r\n },\r\n [TIMEFRAME.h4]: {\r\n micro: 4,\r\n macro: MacroTimeframe.hours,\r\n },\r\n [TIMEFRAME.d]: {\r\n micro: 1,\r\n macro: MacroTimeframe.days,\r\n },\r\n [TIMEFRAME.w]: {\r\n micro: 1,\r\n macro: MacroTimeframe.weeks,\r\n },\r\n [TIMEFRAME.m]: {\r\n micro: 1,\r\n macro: MacroTimeframe.months,\r\n },\r\n}\r\n\r\nexport const MicroTimeframeRange = (Object.keys(MicroMacroTimeframe) as TIMEFRAME[]).reduce(\r\n (prev, curr) => ({\r\n ...prev,\r\n [MicroMacroTimeframe[curr].macro]: prev[MicroMacroTimeframe[curr].macro]\r\n ? [...prev[MicroMacroTimeframe[curr].macro], MicroMacroTimeframe[curr].micro]\r\n : [MicroMacroTimeframe[curr].micro],\r\n }),\r\n {} as { [key in MacroTimeframe]: number[] }\r\n)\r\n\r\ntype IRange = {\r\n from?: number\r\n to?: number\r\n}\r\n\r\nexport type IVisibility = {\r\n [key in MacroTimeframe]?: IRange\r\n}\r\n\r\nexport enum SetVisibilityTo {\r\n currentAndAbove,\r\n currentAndBelow,\r\n currentOnly,\r\n all,\r\n}\r\n\r\nexport const QUOTE_FETCH_EVENT = 'quoteFetchEvent'\r\n\r\n// Keep in sync with the clone in Website repo in shared/is-stock-fast-refresh-available.ts\r\nexport const PREMARKET_AFTERMARKET_HOURS = 2.5\r\n\r\nexport const CHART_ELEMENT_ID = 'chart'\r\n\r\nexport const CHART_SETTINGS_DIALOG_TEST_ID = 'chart-settings-dialog'\r\n","import {\r\n MOBILE_VIEW_BREAKPOINT_WIDTH,\r\n PREMARKET_AFTERMARKET_HOURS,\r\n SpecificChartFunctionality,\r\n} from './constants/common'\r\nimport { captureException, getIsSSr } from './utils/helpers'\r\n\r\nexport { getSanitizedTicker } from './utils/ticker-sanitizer'\r\n\r\nfunction getIsDstInNy(date: Date) {\r\n const dayNumber = date.getDate()\r\n const monthIndex = date.getMonth()\r\n const dayOfWeek = date.getDay()\r\n const previousSunday = dayNumber - dayOfWeek\r\n if (monthIndex < 2 || monthIndex > 10) {\r\n return false\r\n }\r\n if (monthIndex > 2 && monthIndex < 10) {\r\n return true\r\n }\r\n return monthIndex === 2 ? previousSunday >= 8 : previousSunday <= 0\r\n}\r\n\r\nclass Utils {\r\n static min(...args: T[]): number {\r\n if (typeof args[0] === 'number') {\r\n return args[0] < +args[1] ? args[0] : (args[1] as number)\r\n }\r\n let min = args[0][0]\r\n for (const arg of args) {\r\n for (const el of arg as number[]) {\r\n if (el < min) {\r\n min = el\r\n }\r\n }\r\n }\r\n return min\r\n }\r\n\r\n static max(...args: T[]): number {\r\n if (typeof args[0] === 'number') {\r\n return args[0] > +args[1] ? args[0] : (args[1] as number)\r\n }\r\n let max = args[0][0]\r\n for (const arg of args) {\r\n for (const el of arg as number[]) {\r\n if (el > max) {\r\n max = el\r\n }\r\n }\r\n }\r\n return max\r\n }\r\n\r\n static minMax(...args: number[][]) {\r\n let max\r\n let min = (max = args[0][0] as number)\r\n for (const arg of args) {\r\n for (const el of arg) {\r\n if (el < min) {\r\n min = el\r\n }\r\n if (el > max) {\r\n max = el\r\n }\r\n }\r\n }\r\n return [min, max]\r\n }\r\n\r\n static getScaleRatio() {\r\n return (typeof window !== 'undefined' && window.devicePixelRatio) || 1\r\n }\r\n\r\n static setSizeOnCanvasElement({\r\n canvasElement,\r\n width,\r\n height,\r\n ratio = Utils.getScaleRatio(),\r\n }: {\r\n canvasElement: HTMLCanvasElement | null\r\n width: number\r\n height: number\r\n ratio?: number\r\n }) {\r\n if (canvasElement) {\r\n canvasElement.width = width * ratio\r\n canvasElement.height = height * ratio\r\n canvasElement.style.width = width + 'px'\r\n canvasElement.style.height = height + 'px'\r\n }\r\n }\r\n\r\n static getQuoteDateTimestampOffsetInSeconds(referenceDate?: Date) {\r\n const date = referenceDate || new Date()\r\n const dateAsNY = new Date(\r\n date.getUTCFullYear(),\r\n date.getUTCMonth(),\r\n date.getUTCDate(),\r\n date.getUTCHours() - 5,\r\n date.getUTCMinutes(),\r\n date.getUTCSeconds()\r\n )\r\n const isDst = getIsDstInNy(dateAsNY)\r\n return (isDst ? 4 : 5) * 60 * 60\r\n }\r\n\r\n static convertLocalToNyTime(referenceDate: Date, addOffset: boolean) {\r\n const date = new Date(referenceDate)\r\n const quoteDateTimeOffsetInMs = Utils.getQuoteDateTimestampOffsetInSeconds(date) * 1000\r\n const localTimeOffsetInMs = date.getTimezoneOffset() * 60 * 1000\r\n const offsetDirectionCoefficient = addOffset ? 1 : -1\r\n date.setTime(date.getTime() + (localTimeOffsetInMs - quoteDateTimeOffsetInMs) * offsetDirectionCoefficient)\r\n return date\r\n }\r\n\r\n // Keep in sync with the clone in Website repo in shared/isStockFastRefreshAvailable.ts\r\n static isStockFastRefreshAvailable(hasPremarket = true, hasAftermarket = true, bufferMinutes = 30) {\r\n const MARKET_START = { hours: 9, minutes: 30 }\r\n const MARKET_END = { hours: 16, minutes: 0 }\r\n const getMinutes = ({ hours, minutes }: { hours: number; minutes: number }) => hours * 60 + minutes\r\n\r\n const date = convertLocalToNyTime(new Date(), true)\r\n const dayOfWeek = date.getDay()\r\n const currentDayMinutes = date.getHours() * 60 + date.getMinutes()\r\n\r\n const premarketMinutes = hasPremarket ? PREMARKET_AFTERMARKET_HOURS * 60 : 0\r\n const aftermarketMinutes = hasAftermarket ? PREMARKET_AFTERMARKET_HOURS * 60 : 0\r\n\r\n const isWeekend = dayOfWeek === 0 || dayOfWeek === 6\r\n const isOpen = getMinutes(MARKET_START) - premarketMinutes - bufferMinutes <= currentDayMinutes\r\n const isClosed = getMinutes(MARKET_END) + aftermarketMinutes + bufferMinutes <= currentDayMinutes\r\n return !isWeekend && isOpen && !isClosed\r\n }\r\n\r\n static dateFromUnixTimestamp(timestamp: number) {\r\n /*\r\n * Passing 0 as a param is needed in order to setUTCSeconds work properly.\r\n * The function adds seconds to the date instance if it exceeds 60.\r\n * For more info see the docs https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCSeconds\r\n * */\r\n const date = new Date(0)\r\n date.setUTCSeconds(timestamp)\r\n return Utils.convertLocalToNyTime(date, true)\r\n }\r\n\r\n static dateStringFromDate(date: Date) {\r\n return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(\r\n 2,\r\n '0'\r\n )}`\r\n }\r\n\r\n static dateFromDateString(dateString: string) {\r\n const [yyyy, mm, dd] = dateString.split('-')\r\n\r\n const date = new Date(Number.parseInt(yyyy), Number.parseInt(mm) - 1, Number.parseInt(dd))\r\n if (Number.isNaN(date.getTime())) {\r\n captureException(new Error('Invalid Date'), { extra: { date, dateString } })\r\n }\r\n\r\n return date\r\n }\r\n\r\n static isMobile(testTouchPoints?: boolean) {\r\n if (getIsSSr()) return false\r\n let isMobileOs = false\r\n\r\n // New iOS versions no longer report iPad in user agent\r\n if (navigator.userAgent.indexOf('Macintosh') > -1) {\r\n try {\r\n document.createEvent('TouchEvent')\r\n isMobileOs = true\r\n } catch {}\r\n } else {\r\n isMobileOs = !!navigator.userAgent.match(\r\n /\\b(Android|webOS|i(?:Phone|Pad|Pod)|BlackBerry|Windows (?:Phone|Mobile))\\b/i\r\n )\r\n }\r\n\r\n if (testTouchPoints) {\r\n try {\r\n return (\r\n isMobileOs &&\r\n (window.navigator.msMaxTouchPoints ||\r\n window.navigator.maxTouchPoints ||\r\n 'ontouchstart' in document.createElement('div'))\r\n )\r\n } catch {}\r\n }\r\n\r\n return isMobileOs\r\n }\r\n\r\n static isIPad() {\r\n const matchesIPad = navigator.userAgent.match(/iPad/i)\r\n const matchesIPhone = navigator.userAgent.match(/iPhone/i)\r\n const matchesIPod = navigator.userAgent.match(/iPod/i)\r\n const matchesIOSLike = navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints > 0\r\n\r\n return (matchesIOSLike && !matchesIPhone && !matchesIPod) || matchesIPad\r\n }\r\n\r\n static getCookie(name: string) {\r\n const re = new RegExp('(?:(?:^|.*;\\\\s*)' + name + '\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$')\r\n return document.cookie.replace(re, '$1')\r\n }\r\n\r\n static setCookie(name: string, value: string, expires: Date) {\r\n let cookie = name + '=' + value + '; expires=' + expires.toUTCString()\r\n if (document.location.hostname !== 'localhost') {\r\n cookie += '; domain=.finviz.com'\r\n }\r\n document.cookie = cookie\r\n }\r\n}\r\n\r\nexport default Utils\r\nexport const convertLocalToNyTime = Utils.convertLocalToNyTime\r\nexport const dateFromUnixTimestamp = Utils.dateFromUnixTimestamp\r\nexport const dateStringFromDate = Utils.dateStringFromDate\r\nexport const dateFromDateString = Utils.dateFromDateString\r\n\r\nexport function getFullscreenStatus(): boolean {\r\n return (\r\n document.fullscreenElement ??\r\n document.webkitFullscreenElement ??\r\n document.mozFullScreenElement ??\r\n document.msFullscreenElement ??\r\n false\r\n )\r\n}\r\n\r\nexport function getRequestFullscreen(element: HTMLElement) {\r\n return (\r\n element.requestFullscreen ??\r\n element.webkitRequestFullScreen ??\r\n element.mozRequestFullScreen ??\r\n element.msRequestFullscreen\r\n )\r\n}\r\n\r\nexport function getExitFullscreen() {\r\n return (\r\n document.exitFullscreen ?? document.webkitExitFullscreen ?? document.mozExitFullScreen ?? document.msExitFullscreen\r\n )\r\n}\r\n\r\nexport function ready(fn: () => void) {\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\r\nexport function getChartsDimensions(chartElementId: string) {\r\n const PADDING = 2 // Border widths\r\n const containerElement = document.getElementById(chartElementId)\r\n\r\n const box = containerElement?.getBoundingClientRect()\r\n\r\n return {\r\n width: Math.max((box?.width ?? 0) - PADDING, 0),\r\n height: Math.max((box?.height ?? 0) - PADDING, 0),\r\n }\r\n}\r\n\r\nexport function getIsMobileScreenSize() {\r\n return window.innerWidth < MOBILE_VIEW_BREAKPOINT_WIDTH\r\n}\r\n\r\nexport function getIsMobilePortrait(isMobile?: boolean) {\r\n if (isMobile ?? Utils.isMobile()) {\r\n return window.orientation % 180 === 0\r\n }\r\n return false\r\n}\r\n\r\nexport function numberToStringWithUnitsSuffix(value: number) {\r\n let suffix = ''\r\n if (value >= 1000000000) {\r\n value /= 1000000000\r\n suffix = 'B'\r\n } else if (value >= 1000000) {\r\n value /= 1000000\r\n suffix = 'M'\r\n } else if (value >= 1000) {\r\n value /= 1000\r\n suffix = 'K'\r\n }\r\n\r\n return value.toFixed(2) + suffix\r\n}\r\n\r\nexport function isRedesignEnabled() {\r\n return typeof window !== 'undefined' && window.FinvizSettings?.hasRedesignEnabled\r\n}\r\n\r\nexport function isRedesignedPage(\r\n obj: { specificChartFunctionality?: SpecificChartFunctionality | null },\r\n matchingPages = [\r\n SpecificChartFunctionality.forexPage,\r\n SpecificChartFunctionality.futuresPage,\r\n SpecificChartFunctionality.cryptoPage,\r\n ]\r\n) {\r\n const isQuotePage = obj.specificChartFunctionality === SpecificChartFunctionality.quotePage\r\n const isQuoteFinancials = obj.specificChartFunctionality === SpecificChartFunctionality.quoteFinancials\r\n\r\n return (\r\n (isRedesignEnabled() && matchingPages.includes(obj.specificChartFunctionality!)) ||\r\n // Legacy design on quote uses redesigned elements (page header + chart controls)\r\n isQuotePage ||\r\n isQuoteFinancials\r\n )\r\n}\r\n","import { EmptyObject, ObjectHash } from '../../types/shared'\r\n\r\nexport function getRoundedString({ number, numOfDecimalPlaces }: { number: number; numOfDecimalPlaces: number }) {\r\n const precision = Math.pow(10, numOfDecimalPlaces)\r\n return String(Math.round(number * precision) / precision)\r\n}\r\n\r\nexport function getIsSSr() {\r\n return typeof process !== 'undefined' && !!process?.env.IS_OFFSCREEN_RENDERER\r\n}\r\n\r\nexport function isValidHexColor(color: string) {\r\n const regex = /^#([\\da-f]{3}){1,2}$|^#([\\da-f]{4}){1,2}$/i\r\n return !!color && regex.test(color)\r\n}\r\n\r\nexport function getParsedIntegersFromPeriodString(periodString: string) {\r\n const periodParts = periodString.split(',')\r\n return periodParts.map((part) => Number.parseInt(part, 10))\r\n}\r\n\r\nexport function captureException(exception: Error, captureContext?: { extra: ObjectHash }) {\r\n if (process.env.NODE_ENV === 'development' || process.env.IS_E2E_TESTING) {\r\n console.error(exception)\r\n } else if (process.env.IS_OFFSCREEN_RENDERER) {\r\n import('@sentry/node').then((client) => {\r\n client.captureException(exception, captureContext)\r\n })\r\n } else {\r\n window.Sentry.captureException(exception, captureContext)\r\n }\r\n}\r\n\r\nexport function isPositiveFloat(value: string | number) {\r\n const parsedNumber = Number.parseFloat(`${value}`)\r\n return !Number.isNaN(parsedNumber) && isFinite(parsedNumber) && parsedNumber > 0\r\n}\r\n\r\nexport function isPositiveInteger(value: string | number) {\r\n const string = `${value}`\r\n return isPositiveFloat(value) && Number.parseInt(string, 10) === Number.parseFloat(string)\r\n}\r\n\r\nexport function isInRange({\r\n value,\r\n min = Number.MIN_SAFE_INTEGER,\r\n max = Number.MAX_SAFE_INTEGER,\r\n}: {\r\n value: string | number\r\n min?: number\r\n max?: number\r\n}) {\r\n const parsedNumber = Number.parseFloat(`${value}`)\r\n return !Number.isNaN(parsedNumber) && parsedNumber >= min && parsedNumber <= max\r\n}\r\n\r\nexport function tryJsonParse(json: string | null = '') {\r\n try {\r\n return JSON.parse(json ?? '') as Result\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\nexport function getValueInRange({ value, min, max }: { value: number; min: number; max: number }) {\r\n return Math.min(Math.max(value, min), max)\r\n}\r\n\r\nexport function isPrimaryClick(e: React.Touch | React.TouchEvent | React.MouseEvent) {\r\n // cypress trigger mouseevent has button: undefined if button option isn't explicitly specified\r\n // as cy.get('.target').trigger('mousedown', { button: 0 })\r\n if (e.hasOwnProperty('button') && (e as unknown as MouseEvent).button !== undefined) {\r\n return (e as unknown as MouseEvent).button === 0\r\n } else {\r\n return true\r\n }\r\n}\r\n\r\n// this function is used to fix the issue with circular reference when stringifying an object using JSON.stringify\r\nexport function getJSONReplacerFunc() {\r\n const visited = new WeakSet()\r\n return (key: string, value: any) => {\r\n if (typeof value === 'object' && value !== null) {\r\n if (visited.has(value)) {\r\n return\r\n }\r\n visited.add(value)\r\n }\r\n return value\r\n }\r\n}\r\n\r\n// This is a duplicate from Website repo which is accessible on window.FLibs but this doesn't work on SSR charts\r\nexport const formatDateToStringUS = (date: Date, options?: Intl.DateTimeFormatOptions | undefined) =>\r\n date.toLocaleDateString('en-US', {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n ...options,\r\n })\r\n\r\n// randomUUID source: https://stackoverflow.com/questions/105034/how-do-i-create-a-guid-uuid/2117523#2117523\r\nexport function randomUUID() {\r\n return `${1e7}-${1e3}-${4e3}-${8e3}-${1e11}`.replace(/[018]/g, (substring) => {\r\n const c = Number(substring)\r\n return (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16)\r\n })\r\n}\r\n\r\nexport function getUuid() {\r\n return window.crypto?.randomUUID?.() ?? randomUUID()\r\n}\r\n\r\n// duplicate from Website/js/main/util.ts, to be refactored\r\nexport function getEarningsDateSuffix(date: Date) {\r\n const hours = date.getHours()\r\n\r\n if (hours <= 9) {\r\n return 'BMO'\r\n } else if (hours >= 16) {\r\n return 'AMC'\r\n }\r\n\r\n return ''\r\n}\r\n\r\nexport function isValidTickerString(ticker: string) {\r\n const regex = /^@?[a-z0-9](?:[a-z0-9]*[-_]?[a-z0-9]+)?$/\r\n return regex.test(ticker.toLowerCase())\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":["ticker","marketSentimentChartConfig","layout","LayoutType","theme","FinvizSettings","hasDarkTheme","Theme","dark","light","width","height","scrollable","editable","cross","charts","timeframe","TIMEFRAME","i3","scale","ScaleType","Linear","instrument","Instrument","MarketSentiment","refreshData","premarket","aftermarket","dateRange","stretch","panes","elements","type","ChartElementType","overlays","Component","state","loading","enabled","chartConfig","_timer","_lastRequest","componentDidMount","this","_fetchData","setState","componentWillUnmount","cancel","clearTimeout","render","_jsx","cellPadding","cellSpacing","border","style","visibility","children","_jsxs","id","ChartLayout","config","valign","className","disabled","onClick","e","_vote","src","alt","display","hasRedesignEnabled","sentiment","preventDefault","undefined","_this","async","urlQuery","arguments","length","callback","setTimer","document","hidden","window","setTimeout","apiRequest","json","quoteData","getData","Quote","findByAttribute","updateAttributes","create","save","refresh","data","close","sum","volume","weight","date","Array","from","repeat","map","x","parseInt","afterChange","afterClose","drawMinutesPerDay","visibleMinutes","marketStartMinutes","premarketLengthMinutes","aftermarketLengthMinutes","root","rootEl","getElementById","ReactDOM","mount","refreshInfo","parseJSONFromScript","replaceSignalTables","newDocument","oldSignalsLeft","newSignalsLeft","innerHTML","oldSignalsRight","newSignalsRight","getRefreshData","location","pathname","headers","ContentType","Html","DOMParser","parseFromString","newRefreshInfo","userId","version","reload","interval","IndicesPollingIntervalInMs","getIndicesRefreshInterval","hasUserPremium","isStockFastRefreshAvailable","Default","Reduced","Free","intervalCallbackOnWindowVisible","oldMarketStats","getElementsByClassName","newMarketStats","forEach","_","index","oldElement","item","newElement","oldHomepageBottom","newHomepageBottom","then","_ref","RenderRecentQuotes","gtag","event_category","finvizBannersLoaded","initFinvizBanners","refreshAds","refreshPage","newIndicesData","indices","dowQ","nasdaqQ","sap500Q","rutQ","Sentry","captureMessage","extra","allAvailableTickers","all","reduce","acc","cur","push","join","updateIndices","getMapsRefreshInterval","perfDataSecReq","mapPerf","MapTypeId","Sector","MapSubtypeId","DayPerf","perfDataGeoReq","hasGeoMaps","World","perfDataSec","perfDataGeo","Promise","FinvizIndexSecMap","mapActionCreators","updatePerfData","FinvizIndexGeoMap","hasChartEvents","HPSignalInterval","HP_SIGNAL_LABELS","intraday","daily","HP_SIGNAL_COOKIE","IS_REDESIGN","OPTIONS","Object","entries","value","label","ROUNDING","EliteSwitch","_ref2","isLoading","signal","onSignalChange","Select","size","rounding","classNames","find","option","rightContent","Icon","name","onChange","_ref3","placement","orientation","gutter","SelectOption","activeTheme","active","FreeSwitch","usePopoverState","isOpen","useState","_Fragment","Button","as","PopoverTrigger","title","fontSize","contentClass","Popover","Paragraph","href","leftContent","SWITCH_BUTTON_SELECTOR","signalSwitchesElements","querySelectorAll","HomepageSignals","setSignal","React","getCookie","castedValue","getSignalsCookie","setIsLoading","element","remove","handleSignalChange","changedSignal","setCookieRequest","handleSignalIntervalChange","catch","getChartConfig","barWidth","barMargin","colors","getCustomColorsFromCookies","specificChartFunctionality","SpecificChartFunctionality","smallIndex","i10","Stock","CandleStick","ready","ReactDOMClient","signalSwitches","SignalIntervalSwitch","renderSignalIntervalSwitch","subtype","query","t","st","mapPerfScreener","search","uploadMap","method","FormUrlEncoded","body","URLSearchParams","file","replace","_targetScale","updateVisibleSparklines","treemap","hoveredNode","mapStore","getHoveredNode","mapNodeId","visibleNodes","getVisibleTooltipNodes","tickersToLoad","node","includes","debouncedLoadSparklines","_lastSparklinesRequest","debounce","tickers","mapType","AppDispatcher","handleViewAction","ActionTypes","LOAD_SPARKLINES_STARTED","ty","handleServerAction","LOAD_SPARKLINES_COMPLETED","error","aborted","LOAD_SPARKLINES_FAILED","trailing","setHoveredNode","SET_HOVERED_NODE","loadSparklineData","loadSparklinesCancel","resetSparklineData","RESET_SPARKLINE_DATA","changeTranslate","tx","zoom","translate","CHANGE_TRANSLATE","direction","offsetX","offsetY","zoomLevel","getNextZoomLevel","animate","toFixed","y","RENDER_TREEMAP","requestAnimationFrame","zoomIn","getPreviousZoomLevel","zoomOut","zoomAndTranslate","updateLayout","props","updateData","updateDimensions","nodes","updatePerf","UPDATE_DATA","_setOnPublish","getPublishCanvas","SET_PUBLISH_CANVAS","setupWidget","SET_WIDGET","isWidget","Dispatcher","action","payload","source","PayloadSources","SERVER_ACTION","dispatch","VIEW_ACTION","keyMirror","INIT_STARTED","INIT_FAILED","Store","EventEmitter","static","emitChange","emit","CHANGE_EVENT","addChangeListener","on","removeChangeListener","removeListener","_hoveredNode","_mapNodeId","_dataVersion","_getPublishCanvas","_sparklinesData","_isWidget","getSparklines","getDataVersion","dispatchToken","register","getStaticChartConfig","paneElements","default","colorsOverride","leftOffset","JSON","parse","getParsedCookies","el","isValidElement","tagName","getAttribute","textContent","captureException","FONT_SIZE","XXS","XS","S","M","L","XXL","XXXL","LINE_HEIGHT","PADDING","XXXS","MARGIN","CHART_MARGIN","XL","SETTINGS_HEIGHT","TICKER_TIMEFRAME_CHANGE_HEIGHT","OFFSET","MONTHS","ChartEditorEnum","CanvasElementType","IndicatorType","OverlayType","ChartEventDbType","ChartEventType","ChartEventBadgeType","ChartEventLabels","Dividends","Split","EarningsPositive","EarningsNegative","EarningsNeutral","EarningsFuture","LAYOUTS","columns","rows","count","gridAreas","SORT_DIRECTION","ASC","DESC","TIMEFRAMES_WITH_PRE_MARKET","i1","i2","i5","IntradayTimeframeInterval","i15","i30","h","h2","h4","TimeframeLabelShort","d","w","m","DateRangeType","QuoteFinancialAttachment","TIMEFRAME_SECONDS","CRYPTOS","BTCUSD","ETHUSD","BNBUSD","SOLUSD","XRPUSD","DOGEUSD","ADAUSD","TRXUSD","AVAXUSD","DOTUSD","BCHUSD","NEARUSD","LTCUSD","APTUSD","XLMUSD","LINKUSD","ETCUSD","UNIUSD","EGLDUSD","FTMUSD","OPUSD","SUIUSD","BTCEUR","ETHEUR","BNBEUR","SOLEUR","XRPEUR","DOGEEUR","ADAEUR","TRXEUR","AVAXEUR","DOTEUR","BCHEUR","NEAREUR","LTCEUR","ICPEUR","APTEUR","XLMEUR","LINKEUR","SHIBEUR","EGLDEUR","FTMEUR","OPEUR","SUIEUR","BTCUSDT","ETHUSDT","BNBUSDT","SOLUSDT","XRPUSDT","DOGEUSDT","ADAUSDT","TRXUSDT","AVAXUSDT","DOTUSDT","BCHUSDT","NEARUSDT","LTCUSDT","ICPUSDT","FETUSDT","ETCUSDT","APTUSDT","XLMUSDT","LINKUSDT","SHIBUSDT","UNIUSDT","EGLDUSDT","FTMUSDT","OPUSDT","SUIUSDT","ETHBTC","BNBBTC","SOLBTC","XRPBTC","DOGEBTC","ADABTC","TRXBTC","AVAXBTC","DOTBTC","BCHBTC","NEARBTC","LTCBTC","ICPBTC","FETBTC","ETCBTC","APTBTC","XLMBTC","LINKBTC","UNIBTC","EGLDBTC","FTMBTC","OPBTC","SUIBTC","TextAlign","TextBaseline","QuotePollingIntervalInMs","EXTRA_MARKET_BUFFER_MINUTES","ScaleLabel","Percentage","Logarithmic","PANE_HEIGHT_DEFAULT","chart","indicator","INDICATOR_LABEL_HEIGHT","MOBILE_BARS_TO_VIEW","MOBILE_VIEW_BREAKPOINT_WIDTH","FREE_DATE_RANGES","getTimeframeLabel","QuotePageQueryChartTypes","MacroTimeframe","MicroMacroTimeframe","micro","macro","minutes","hours","days","weeks","months","MicroTimeframeRange","keys","prev","curr","SetVisibilityTo","QUOTE_FETCH_EVENT","PREMARKET_AFTERMARKET_HOURS","CHART_ELEMENT_ID","CHART_SETTINGS_DIALOG_TEST_ID","Utils","min","_len","args","_key","arg","max","_len2","_key2","minMax","_len3","_key3","getScaleRatio","devicePixelRatio","setSizeOnCanvasElement","canvasElement","ratio","getQuoteDateTimestampOffsetInSeconds","referenceDate","Date","dayNumber","getDate","monthIndex","getMonth","previousSunday","getDay","getIsDstInNy","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","convertLocalToNyTime","addOffset","quoteDateTimeOffsetInMs","localTimeOffsetInMs","getTimezoneOffset","offsetDirectionCoefficient","setTime","getTime","hasPremarket","hasAftermarket","bufferMinutes","getMinutes","dayOfWeek","currentDayMinutes","getHours","premarketMinutes","aftermarketMinutes","isWeekend","isClosed","dateFromUnixTimestamp","timestamp","setUTCSeconds","dateStringFromDate","getFullYear","String","padStart","dateFromDateString","dateString","yyyy","mm","dd","split","Number","isNaN","Error","isMobile","testTouchPoints","getIsSSr","isMobileOs","navigator","userAgent","indexOf","createEvent","match","msMaxTouchPoints","maxTouchPoints","createElement","isIPad","matchesIPad","matchesIPhone","matchesIPod","re","RegExp","cookie","setCookie","expires","toUTCString","hostname","getFullscreenStatus","fullscreenElement","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement","getRequestFullscreen","requestFullscreen","webkitRequestFullScreen","mozRequestFullScreen","msRequestFullscreen","getExitFullscreen","exitFullscreen","webkitExitFullscreen","mozExitFullScreen","msExitFullscreen","fn","readyState","addEventListener","getChartsDimensions","chartElementId","containerElement","box","getBoundingClientRect","Math","getIsMobileScreenSize","innerWidth","getIsMobilePortrait","numberToStringWithUnitsSuffix","suffix","isRedesignEnabled","isRedesignedPage","obj","matchingPages","forexPage","futuresPage","cryptoPage","isQuotePage","quotePage","isQuoteFinancials","quoteFinancials","getRoundedString","number","numOfDecimalPlaces","precision","pow","round","process","getParsedIntegersFromPeriodString","periodString","part","exception","captureContext","isPositiveFloat","parsedNumber","parseFloat","isFinite","isPositiveInteger","string","isInRange","MIN_SAFE_INTEGER","MAX_SAFE_INTEGER","getValueInRange","isPrimaryClick","hasOwnProperty","button","getJSONReplacerFunc","visited","WeakSet","key","has","add","formatDateToStringUS","options","toLocaleDateString","day","month","year","getUuid","crypto","randomUUID","substring","c","getRandomValues","Uint8Array","toString","getEarningsDateSuffix","module","exports","invariant","_lastID","$Dispatcher_callbacks","$Dispatcher_isPending","$Dispatcher_isHandled","$Dispatcher_isDispatching","$Dispatcher_pendingPayload","prototype","unregister","waitFor","ids","ii","$Dispatcher_invokeCallback","$Dispatcher_startDispatching","$Dispatcher_stopDispatching","isDispatching","condition","format","a","b","f","argIndex","framesToPop","ret","isArray"],"sourceRoot":""}