@tradecanvas/chart 1.52.0 → 1.53.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Chart.d.ts +104 -7
- package/dist/Chart.d.ts.map +1 -1
- package/dist/HistoryPager.d.ts +12 -2
- package/dist/HistoryPager.d.ts.map +1 -1
- package/dist/{LayoutSession-4SLt8-0u.js → LayoutSession-D7uQq3jX.js} +805 -315
- package/dist/LayoutSession-D7uQq3jX.js.map +1 -0
- package/dist/LayoutSession-nlhT-EH7.cjs +2 -0
- package/dist/LayoutSession-nlhT-EH7.cjs.map +1 -0
- package/dist/SeriesStore.d.ts +27 -4
- package/dist/SeriesStore.d.ts.map +1 -1
- package/dist/{i18n-C7b-2BJ5.js → i18n-CwCzRLKW.js} +21 -1
- package/dist/i18n-CwCzRLKW.js.map +1 -0
- package/dist/i18n-D7B7uFrN.cjs +2 -0
- package/dist/i18n-D7B7uFrN.cjs.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +29 -29
- package/dist/replay/ReplayStepLoader.d.ts +52 -0
- package/dist/replay/ReplayStepLoader.d.ts.map +1 -0
- package/dist/replay/intrabarPath.d.ts +44 -0
- package/dist/replay/intrabarPath.d.ts.map +1 -0
- package/dist/replay/replayStep.d.ts +18 -0
- package/dist/replay/replayStep.d.ts.map +1 -0
- package/dist/widget/ChartWidget.d.ts +91 -4
- package/dist/widget/ChartWidget.d.ts.map +1 -1
- package/dist/widget/ChartWidgetGrid.d.ts.map +1 -1
- package/dist/widget/WidgetHotkeySheet.d.ts.map +1 -1
- package/dist/widget/WidgetReplayBar.d.ts +101 -23
- package/dist/widget/WidgetReplayBar.d.ts.map +1 -1
- package/dist/widget/index.cjs +298 -157
- package/dist/widget/index.cjs.map +1 -1
- package/dist/widget/index.js +1734 -1422
- package/dist/widget/index.js.map +1 -1
- package/dist/widget/locales/ar.d.ts.map +1 -1
- package/dist/widget/locales/cs.d.ts.map +1 -1
- package/dist/widget/locales/da.d.ts.map +1 -1
- package/dist/widget/locales/de.d.ts.map +1 -1
- package/dist/widget/locales/el.d.ts.map +1 -1
- package/dist/widget/locales/en.d.ts +11 -0
- package/dist/widget/locales/en.d.ts.map +1 -1
- package/dist/widget/locales/es.d.ts.map +1 -1
- package/dist/widget/locales/et.d.ts.map +1 -1
- package/dist/widget/locales/fa.d.ts.map +1 -1
- package/dist/widget/locales/fr.d.ts.map +1 -1
- package/dist/widget/locales/he.d.ts.map +1 -1
- package/dist/widget/locales/hu.d.ts.map +1 -1
- package/dist/widget/locales/id.d.ts.map +1 -1
- package/dist/widget/locales/index.cjs +1 -1
- package/dist/widget/locales/index.cjs.map +1 -1
- package/dist/widget/locales/index.js +281 -1
- package/dist/widget/locales/index.js.map +1 -1
- package/dist/widget/locales/it.d.ts.map +1 -1
- package/dist/widget/locales/ja.d.ts.map +1 -1
- package/dist/widget/locales/ko.d.ts.map +1 -1
- package/dist/widget/locales/ms.d.ts.map +1 -1
- package/dist/widget/locales/nb.d.ts.map +1 -1
- package/dist/widget/locales/nl.d.ts.map +1 -1
- package/dist/widget/locales/pl.d.ts.map +1 -1
- package/dist/widget/locales/pt.d.ts.map +1 -1
- package/dist/widget/locales/ro.d.ts.map +1 -1
- package/dist/widget/locales/ru.d.ts.map +1 -1
- package/dist/widget/locales/sk.d.ts.map +1 -1
- package/dist/widget/locales/sv.d.ts.map +1 -1
- package/dist/widget/locales/th.d.ts.map +1 -1
- package/dist/widget/locales/tr.d.ts.map +1 -1
- package/dist/widget/locales/vi.d.ts.map +1 -1
- package/dist/widget/locales/zh.d.ts.map +1 -1
- package/dist/widget/locales/zhHant.d.ts.map +1 -1
- package/dist/widget/types.d.ts +15 -0
- package/dist/widget/types.d.ts.map +1 -1
- package/package.json +3 -3
- package/dist/LayoutSession-4SLt8-0u.js.map +0 -1
- package/dist/LayoutSession-BOtFzvMm.cjs +0 -2
- package/dist/LayoutSession-BOtFzvMm.cjs.map +0 -1
- package/dist/i18n-BjW5GVrO.cjs +0 -2
- package/dist/i18n-BjW5GVrO.cjs.map +0 -1
- package/dist/i18n-C7b-2BJ5.js.map +0 -1
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
let e=require(`@tradecanvas/commons`),t=require(`@tradecanvas/core`);var n=864e5,r=10;function i(i,a){let o=(0,e.symbolTimeZone)(i);if(!o||!(0,e.isValidTimeZone)(o)||a.length<2)return null;let s=(i?.sessions??[]).flatMap(t=>{let n=(0,e.sessionMinute)(t.start),r=(0,e.sessionMinute)(t.end);return n===null||r===null?[]:[{startMinute:n,endMinute:r}]});if(s.length===0)return null;let c=(0,e.barTimeUnit)(a),l=1/0;for(let e=Math.max(1,a.length-r);e<a.length;e++){let t=(a[e].time-a[e-1].time)*c;t>0&&t<l&&(l=t)}if(!(l<n))return null;let u={timeZone:o,windows:s,startMinute:s[0].startMinute,endMinute:s[s.length-1].endMinute};return e=>(0,t.isRegularSession)(e*c,u)}var a={role:`chart`,summary:`{what}. Last price {close}.`,empty:`Chart, no data.`,view:`Showing {count} bars, {from} to {to}. High {high}, low {low}.`,bar:`{time}: open {open}, high {high}, low {low}, close {close}, volume {volume}.`,keys:`Arrow keys scroll and zoom, Home and End go to the start and the end. Comma and period read the bars one at a time.`},o=(e,t)=>e.replace(/\{(\w+)\}/g,(e,n)=>n in t?String(t[n]):e),s=[`role`,`aria-roledescription`,`aria-label`,`aria-describedby`],c=400,l=1e3,u=class{live;help;labels;cursor=null;viewTimer=null;before=new Map;summaryAt=0;summaryTimer=null;onBlur=()=>{this.cursor=null,this.source.showBar(null)};constructor(e,t,n={}){this.container=e,this.source=t,this.labels={...a,...n};for(let t of s)this.before.set(t,e.getAttribute(t));e.setAttribute(`role`,`application`),this.help=d(`div`,`tc-sr-only`),this.help.id=`tc-chart-keys-${Math.random().toString(36).slice(2,10)}`,e.setAttribute(`aria-describedby`,this.help.id),this.live=d(`div`,`tc-sr-only tc-sr-live`),this.live.setAttribute(`aria-live`,`polite`),this.live.setAttribute(`aria-atomic`,`true`),e.append(this.help,this.live),e.addEventListener(`blur`,this.onBlur),this.applyLabels()}setLabels(e){this.labels={...a,...e},this.applyLabels()}refresh(e=!1){let t=l-(Date.now()-this.summaryAt);if(e||t<=0||this.container.getAttribute(`aria-label`)===this.labels.empty){this.summaryTimer&&clearTimeout(this.summaryTimer),this.summaryTimer=null,this.summaryAt=Date.now(),this.container.setAttribute(`aria-label`,this.summary());return}this.summaryTimer??=setTimeout(()=>{this.summaryTimer=null,this.refresh(!0)},t)}viewMoved(){this.cursor=null,this.viewTimer&&clearTimeout(this.viewTimer),this.viewTimer=setTimeout(()=>{this.viewTimer=null,this.say(this.viewText())},c)}readBar(e){let t=this.source.bars();if(t.length===0){this.say(this.labels.empty);return}let{to:n}=this.source.visibleRange(),r=Math.max(0,Math.min(t.length-1,Math.floor(n)));this.cursor=this.cursor===null?r:Math.max(0,Math.min(t.length-1,this.cursor+e));let i=t[this.cursor];this.source.showBar(i.time);let a=this.source.formatPrice;this.say(o(this.labels.bar,{time:this.source.formatTime(i.time),open:a(i.open),high:a(i.high),low:a(i.low),close:a(i.close),volume:f(i.volume??0)}))}destroy(){this.viewTimer&&clearTimeout(this.viewTimer),this.summaryTimer&&clearTimeout(this.summaryTimer),this.container.removeEventListener(`blur`,this.onBlur);for(let[e,t]of this.before)t===null?this.container.removeAttribute(e):this.container.setAttribute(e,t);this.help.remove(),this.live.remove()}applyLabels(){this.container.setAttribute(`aria-roledescription`,this.labels.role),this.help.textContent=this.labels.keys,this.refresh(!0)}summary(){let e=this.source.bars();if(e.length===0)return this.labels.empty;let t=this.source.chartType(),n=[this.source.symbol(),this.labels.typeName?this.labels.typeName(t):t,this.source.timeframe()].filter(Boolean).join(`, `);return o(this.labels.summary,{what:n,close:this.source.formatPrice(e[e.length-1].close)})}viewText(){let e=this.source.bars();if(e.length===0)return this.labels.empty;let t=this.source.visibleRange(),n=Math.max(0,Math.min(e.length-1,Math.ceil(t.from))),r=Math.max(n,Math.min(e.length-1,Math.floor(t.to))),i=-1/0,a=1/0;for(let t=n;t<=r;t++)i=Math.max(i,e[t].high),a=Math.min(a,e[t].low);return o(this.labels.view,{count:r-n+1,from:this.source.formatTime(e[n].time),to:this.source.formatTime(e[r].time),high:this.source.formatPrice(i),low:this.source.formatPrice(a)})}say(e){this.live.textContent=e}};function d(e,t){let n=document.createElement(e);return n.className=t,Object.assign(n.style,{position:`absolute`,width:`1px`,height:`1px`,margin:`-1px`,padding:`0`,overflow:`hidden`,clip:`rect(0 0 0 0)`,whiteSpace:`nowrap`,border:`0`}),n}function f(e){return Number.isInteger(e)?String(e):e.toFixed(2)}function p(e,t,n,r){let i=Object.keys(n||t).map(e=>t[e]).filter(e=>typeof e==`number`&&Number.isFinite(e)).slice(0,3).map(e=>String(Number(e.toFixed(4)))),a=typeof t.symbol==`string`&&t.symbol?[t.symbol]:[];return[e===`spread`&&t.mode===`ratio`?`Ratio`:r??e.toUpperCase(),...a,...i].join(` `)}function m(e){switch(e){case`candlestick`:case`heikinAshi`:case`lineBreak`:case`rangeBars`:return new t.CandlestickRenderer;case`line`:return new t.LineRenderer;case`area`:return new t.AreaRenderer;case`bar`:return new t.BarRenderer;case`hollowCandle`:return new t.HollowCandleRenderer;case`baseline`:return new t.BaselineRenderer;case`renko`:return new t.RenkoRenderer;case`kagi`:return new t.KagiRenderer;case`pointAndFigure`:return new t.PointAndFigureRenderer;case`volumeCandles`:return new t.VolumeCandleRenderer;case`equivolume`:return new t.EquivolumeRenderer;case`hlcArea`:return new t.HLCAreaRenderer;case`stepLine`:return new t.StepLineRenderer;case`lineWithMarkers`:return new t.LineWithMarkersRenderer;case`hiLo`:return new t.HiLoRenderer;default:return new t.CandlestickRenderer}}function h(e,n,r={},i,a){if(n.length===0)return n;switch(e){case`heikinAshi`:return(0,t.toHeikinAshi)(n);case`renko`:{let e=r.renko?.boxSize;return typeof e==`number`?(0,t.toRenko)(n,{brickSize:e},a):(0,t.toRenko)(n,{brickSize:0,useATR:!0,atrPeriod:r.renko?.atrPeriod??14},a)}case`lineBreak`:return(0,t.toLineBreak)(n,r.lineBreak?.lines??3);case`kagi`:return(0,t.toKagi)(n,r.kagi?.reversal??4,r.kagi?.reversalType??`percent`,a);case`pointAndFigure`:return v(n,r,a).columns;case`rangeBars`:return(0,t.toRangeBars)(n,{rangeSize:oe(n,r,i),includeForming:!0},a);default:return n}}function g(e){switch(e){case`heikinAshi`:case`renko`:case`lineBreak`:case`kagi`:case`pointAndFigure`:case`rangeBars`:return!0;default:return!1}}function _(e){return e!==`heikinAshi`&&g(e)}function v(e,n={},r){let i=n.pointAndFigure?.boxSize;return(0,t.pointAndFigureColumns)(e,typeof i==`number`?i:ee(e)*.01,n.pointAndFigure?.reversal??3,r)}function ee(e){let t=0;for(let n of e)t+=n.close;return t/e.length}var te=100,ne=3,re=.01,ie=15,ae=e=>Number(e.toPrecision(ie));function oe(t,n={},r){let i=n.rangeBars?.range;if(typeof i==`number`)return i;let a=t.length>=ne?ce(t):0,o=Math.abs(t[t.length-1]?.close??0);return de(ae((0,e.niceNumber)(a>0?a:o*re||1,!0)),r)}function se(e){let t=e.length-1;return{from:Math.max(0,t-te),end:t}}function ce(e){let{from:t,end:n}=se(e),r=0;for(let i=t;i<n;i++){let{high:t,low:n}=e[i],a=i>0?e[i-1].close:n;r+=Math.max(t-n,Math.abs(t-a),Math.abs(n-a))}return n>t?r/(n-t):0}function le(e,t){let{from:n,end:r}=se(e);if(r<=n)return t(e[e.length-1]?.close??0);let i=-1/0,a=1/0;for(let t=n;t<r;t++)i=Math.max(i,e[t].high),a=Math.min(a,e[t].low);return ue(t(i),t(a))}function ue(e,t){return e===void 0?t:t===void 0?e:Math.max(e,t)}function de(e,t){return t===void 0||!(t>0)?e:ae(Math.max(1,Math.round(e/t))*t)}function fe(e,t){let n=t?.(e);return n?n.createRenderer():m(e)}function pe(e,t,n,r,i,a){if(t.length===0)return t;let o=n?.(e);return o?.transform?o.transform(t):h(e,t,r,i,a)}var me=class{timer=null;delayMs=0;key=null;constructor(e){this.save=e}enable(e,t){this.key=e,this.delayMs=t}disable(){this.key=null,this.delayMs=0,this.cancel()}schedule(){this.delayMs<=0||!this.key||(this.timer&&clearTimeout(this.timer),this.timer=setTimeout(()=>{this.timer=null,this.key&&this.save(this.key)},this.delayMs))}cancel(){this.timer&&=(clearTimeout(this.timer),null)}isEnabled(){return this.delayMs>0&&this.key!==null}hasPending(){return this.timer!==null}};function y(e){if(!e||typeof e.time!=`number`||!Number.isFinite(e.time))return!1;let{open:t,high:n,low:r,close:i}=e;return!(!isFinite(t)||!isFinite(n)||!isFinite(r)||!isFinite(i)||t<0||n<0||r<0||i<0||n<r||e.volume!==void 0&&(!isFinite(e.volume)||e.volume<0))}function he(e){return e.volume!==void 0&&e.high>=e.open&&e.high>=e.close&&e.low<=e.open&&e.low<=e.close}function b(e){return{...e,high:Math.max(e.open,e.high,e.low,e.close),low:Math.min(e.open,e.high,e.low,e.close),volume:e.volume===void 0?0:Math.max(0,e.volume)}}function x(e,t){return e===t||e.time===t.time&&e.open===t.open&&e.high===t.high&&e.low===t.low&&e.close===t.close&&e.volume===t.volume}function ge(e,t){for(let n=e.length-1;n>=0;n--){if(e[n].time===t)return n;if(e[n].time<t)return-1}return-1}var _e={index:-1,changed:!1};function S(t,n){if(t.length===0)return n;let r=(0,e.normalizeBarTime)(n);return(0,e.barTimeUnit)(t)===1?r:r/1e3}function ve(e,t){let n=S(e,t.time);return n===t.time?t:{...t,time:n}}var C=class{data=[];withSeriesTime(e){return ve(this.data,e)}getData(){return this.data}setData(e){let t=[];for(let n=0;n<e.length;n++){let r=e[n];y(r)&&t.push(he(r)?r:b(r))}this.data=t}prependBars(e){let t=this.data.length>0?this.data[0].time:1/0,n=[];for(let r=0;r<e.length;r++){if(!y(e[r]))continue;let i=this.withSeriesTime(e[r]);i.time>=t||n.push(he(i)?i:b(i))}if(n.length===0)return 0;n.sort((e,t)=>e.time-t.time);let r=0;for(let e=0;e<n.length;e++)r>0&&n[r-1].time===n[e].time||(n[r++]=n[e]);return n.length=r,this.data=n.concat(this.data),r}appendBar(e){y(e)&&this.data.push(b(this.withSeriesTime(e)))}updateLastBar(e){if(!y(e))return;let t=b(this.withSeriesTime(e));if(this.data.length===0){this.data.push(t);return}this.data[this.data.length-1]=t}replaceBar(e){if(!y(e))return _e;let t=this.withSeriesTime(e),n=ge(this.data,t.time);if(n<0)return _e;let r=b(t);return x(this.data[n],r)?{index:n,changed:!1}:(this.data[n]=r,{index:n,changed:!0})}updateLastBarFromTick(t){this.data.length!==0&&(!isFinite(t.price)||t.price<0||t.volume!==void 0&&(!isFinite(t.volume)||t.volume<0)||(this.data[this.data.length-1]=(0,e.mergeBar)(this.data[this.data.length-1],this.withSeriesTime(t))))}getLength(){return this.data.length}clear(){this.data=[]}},w={to:`none`,index:-1,changed:!1};function T(t,n){let r=t[t.length-1];if(!r)return`append`;let i=(0,e.normalizeBarTime)(n.time),a=(0,e.normalizeBarTime)(r.time);return i>a?`append`:i===a?`update`:`stale`}function ye(e){return[e.time,e.open,e.high,e.low,e.close].every(Number.isFinite)}var be=class{shown=new C;whole=null;aside=null;shownRevision=0;constructor(e){this.hoursFilter=e}bars(){return this.shown.getData()}length(){return this.shown.getLength()}revision(){return this.shownRevision}liveBars(){return this.aside?.getData()??this.whole??this.shown.getData()}load(e){this.shown.setData(this.regularOnly(e))}prepend(e){let t=null,n=e;if(this.whole){let r=this.whole[0]?.time,i=new Set,a=e.filter(ye).map(e=>this.inSeriesUnit(e)).filter(e=>(r===void 0||e.time<r)&&!i.has(e.time)&&i.add(e.time)).sort((e,t)=>e.time-t.time);this.whole=[...a,...this.whole];let o=this.hoursFilter(this.whole);t=a.length,n=o?a.filter(e=>o(e.time)):a}let r=this.shown.prependBars(n);return{added:r,taken:t??r}}mergeSnapshot(e){let t=this.whole??this.shown.getData(),n=e[0]?.time,r=0;for(;n!==void 0&&r<t.length&&t[r].time<n;)r++;return r===0||r===t.length?!1:(this.shown.setData(this.regularOnly(t.slice(0,r).concat(e))),!0)}refilter(){if(this.aside)return!1;let e=this.whole??this.shown.getData().slice();return!this.whole&&!this.hoursFilter(e)?!1:(this.shown.setData(this.regularOnly(e)),!0)}append(e){if(this.aside)return this.aside.appendBar(e),this.wrote(`aside`,!1);let t=this.inSeriesUnit(e),n=this.startWholeSeries(t,`append`);if(!this.take(t,`append`))return this.wrote(`hidden`,n);let r=this.shown.getLength();return this.shown.appendBar(t),{to:`shown`,before:r,refiltered:n}}appendMany(e){if(this.aside){for(let t of e)this.aside.appendBar(t);return{shown:0,before:this.shown.getLength(),refiltered:!1,aside:!0}}let t=!1,n=[];for(let r of e){let e=this.inSeriesUnit(r);t=this.startWholeSeries(e,`append`)||t,this.take(e,`append`)&&n.push(e)}let r=this.shown.getLength();for(let e of n)this.shown.appendBar(e);return{shown:n.length,before:r,refiltered:t,aside:!1}}updateLast(e){if(this.aside)return this.aside.updateLastBar(e),this.wrote(`aside`,!1);let t=this.inSeriesUnit(e),n=this.startWholeSeries(t,`update`);if(!this.take(t,`update`))return this.wrote(`hidden`,n);let r=this.shown.getLength();return this.shown.updateLastBar(t),{to:`shown`,before:r,refiltered:n}}mergeTick(e){if(this.aside)return this.aside.updateLastBarFromTick(e),this.wrote(`aside`,!1);let t=this.whole?this.hoursFilter(this.whole):null;if(t&&this.whole&&!t(S(this.whole,e.time)))return this.wrote(`hidden`,!1);let n=this.shown.getLength();this.shown.updateLastBarFromTick(e);let r=this.whole,i=this.shown.getData()[this.shown.getLength()-1];return r&&i&&r.length>0&&r[r.length-1].time===i.time&&(r[r.length-1]=i),{to:`shown`,before:n,refiltered:!1}}placeStreamBar(e){if(this.aside){let t=T(this.aside.getData(),e);return t===`append`?this.aside.appendBar(e):t===`update`&&this.aside.updateLastBar(e),this.wrote(t===`stale`?`none`:`aside`,!1)}let t=this.inSeriesUnit(e),n=T(this.whole??this.shown.getData(),t);if(n===`stale`)return this.wrote(`none`,!1);let r=this.startWholeSeries(t,n);if(!this.take(t,n))return this.wrote(`hidden`,r);let i=this.shown.getLength(),a=T(this.shown.getData(),t);return a===`stale`?{to:`none`,before:i,refiltered:r}:(a===`append`?this.shown.appendBar(t):this.shown.updateLastBar(t),{to:`shown`,before:i,refiltered:r})}replace(e){if(this.aside){let{index:t,changed:n}=this.aside.replaceBar(e);return t<0?w:{to:`aside`,index:-1,changed:n}}if(!y(e))return w;let t=this.inSeriesUnit(e),n=this.whole,r=n?ge(n,t.time):-1;if(n){if(r<0||!y(n[r]))return w;let e=this.hoursFilter(n);if(e&&!e(t.time))return this.replaceHidden(n,r,t)}let{index:i,changed:a}=this.shown.replaceBar(t);return i<0?w:(a&&(n&&(n[r]=this.shown.getData()[i]),this.shownRevision++),{to:`shown`,index:i,changed:a})}loadAside(e){this.aside?.setData(e)}beginReplay(){this.aside||(this.aside=new C,this.aside.setData(this.whole??this.shown.getData()))}endReplay(){let e=this.aside;return this.aside=null,e?e.getData():null}inHoursShown(e){let t=this.hoursFilter(e);return t?e.filter(e=>t(e.time)):e.slice()}showReplayed(e){this.shown.setData(e)}appendReplayed(e){this.shown.appendBar(e)}updateReplayed(e){this.shown.updateLastBar(e)}inSeriesUnit(e){return ve(this.whole??this.shown.getData(),e)}replaceHidden(e,t,n){let r=b(n),i=!x(e[t],r);return i&&(e[t]=r),{to:`hidden`,index:-1,changed:i}}wrote(e,t){return{to:e,before:this.shown.getLength(),refiltered:t}}regularOnly(e){let t=this.hoursFilter(e);return this.whole=t?e.slice():null,t?e.filter(e=>t(e.time)):e}startWholeSeries(e,t){if(this.whole)return!1;let n=this.shown.getData(),r=n.slice(-12),i=t===`append`||r.length===0?[...r,e]:[...r.slice(0,-1),e];if(!this.hoursFilter(i))return!1;this.whole=n.slice();let a=this.hoursFilter(this.whole.length>1?this.whole:i);return!a||!n.some(e=>!a(e.time))?!1:(this.shown.setData(n.filter(e=>a(e.time))),!0)}take(e,t){let n=this.whole;if(!n)return!0;t===`append`||n.length===0?n.push(e):n[n.length-1]=e;let r=this.hoursFilter(n);return!r||r(e.time)}},E=5e3,xe=6e4,Se=500,Ce=class{loader=null;pageSize=500;loading=!1;exhausted=!1;failures=0;retryAt=0;seq=0;constructor(e){this.host=e}setLoader(e,t=500){this.loader=e,this.pageSize=Math.max(1,Math.floor(t)),this.reset()}hasLoader(){return this.loader!==null}reset(){this.seq++,this.loading=!1,this.exhausted=!1,this.failures=0,this.retryAt=0}isLoading(){return this.loading}hasMore(){return!this.exhausted}maybeLoad(e,t){e>=t||!this.canLoad()||this.failures>=5||this.now()<this.retryAt||this.loadMore()}async loadMore(){let e=this.loader,t=this.host.oldestTime();if(!e||!this.canLoad()||t===null)return 0;let n=this.seq;this.loading=!0,this.emit({state:`loading`,count:0});let r;try{r=await e(t,this.pageSize)}catch(e){return n===this.seq?(this.loading=!1,this.failures++,this.retryAt=this.now()+Math.min(xe,E*2**(this.failures-1)),this.emit({state:`error`,count:0,error:e instanceof Error?e.message:String(e)}),0):0}if(n!==this.seq)return 0;this.loading=!1,this.failures=0,this.retryAt=0;let i=this.host.prepend(r);return i===0?(this.exhausted=!0,this.emit({state:`end`,count:0})):this.emit({state:`loaded`,count:i}),i}canLoad(){return this.loader!==null&&!this.loading&&!this.exhausted}emit(e){try{this.host.emit(e)}catch(e){console.error(`[TradeCanvas] A historyLoad listener threw:`,e)}}now(){return this.host.now?this.host.now():Date.now()}};function we(e,t){return e.family===t.family&&e.sizeSmall===t.sizeSmall&&e.sizeMedium===t.sizeMedium&&e.sizeLarge===t.sizeLarge}var D=class t{base;shape=null;font=null;themeFont;chartType=`candlestick`;host={};user=new Map;effective=null;constructor(e){this.base=t.read(e),this.themeFont=this.base.font}static read(t){if(!t||t===`dark`)return{...e.DARK_THEME};if(t===`light`)return{...e.LIGHT_THEME};let{style:n,...r}=t;return r}getTheme(){return this.effective??=(0,e.resolveChartTheme)(this.base,this.chartType,this.merged()),this.effective}getBaseTheme(){return this.base}setTheme(e){let n=t.read(e),r=this.font!==null&&we(n.font,this.base.font);this.base=n,r||(this.themeFont=n.font),this.shape&&(this.base={...this.base,shape:{...this.base.shape,...this.shape}}),this.font&&(this.base={...this.base,font:{...this.themeFont,...this.font}}),this.effective=null}setFont(e){this.font=e?{...this.font,...e}:null,this.base={...this.base,font:this.font?{...this.themeFont,...this.font}:this.themeFont},this.effective=null}setShape(e){this.shape=e?{...e}:null,this.base={...this.base,shape:e?{...this.base.shape,...e}:this.base.shape},this.effective=null}setChartType(e){e!==this.chartType&&(this.chartType=e,this.effective=null)}applyOverrides(e,t){let n={...this.layer(t)};for(let[t,r]of Object.entries(e))r==null?delete n[t]:n[t]=r;return this.setLayer(t,n)}setOverrides(e,t){return this.setLayer(t,{...e})}resetOverrides(e,t){if(!t)return this.setLayer(e,{});let n={...this.layer(e)};for(let e of t)delete n[e];return this.setLayer(e,n)}getOverrides(e){return{...this.layer(e)}}getUserOverrides(){let e={};for(let[t,n]of this.user)Object.keys(n).length>0&&(e[t]={...n});return e}setUserOverrides(e){return JSON.stringify(e)===JSON.stringify(this.getUserOverrides())?!1:(this.user=new Map(Object.entries(e).map(([e,t])=>[e,{...t}])),this.effective=null,!0)}getStyleValue(t){return(0,e.chartStyleValue)(this.base,this.merged(),t,this.chartType)}layer(e){return e===`host`?this.host:this.user.get(this.base.name)??{}}setLayer(e,t){return JSON.stringify(t)===JSON.stringify(this.layer(e))?!1:(e===`host`?this.host=t:Object.keys(t).length>0?this.user.set(this.base.name,t):this.user.delete(this.base.name),this.effective=null,!0)}merged(){return{...this.host,...this.user.get(this.base.name)}}};function O(e,t){return t?{...t.visible===void 0?{}:{[`crosshair.${e}.visible`]:t.visible},...t.color===void 0?{}:{[`crosshair.${e}.color`]:t.color},...t.style===void 0?{}:{[`crosshair.${e}.style`]:t.style},...t.width===void 0?{}:{[`crosshair.${e}.width`]:t.width}}:{}}function Te(e){let{grid:t,crosshair:n}=e,r=n?.vLine?.labelBackground??n?.hLine?.labelBackground;return{...t?.hLineColor===void 0?{}:{"grid.horizontal.color":t.hLineColor},...t?.hLineStyle===void 0?{}:{"grid.horizontal.style":t.hLineStyle},...t?.vLineColor===void 0?{}:{"grid.vertical.color":t.vLineColor},...t?.vLineStyle===void 0?{}:{"grid.vertical.style":t.vLineStyle},...O(`horizontal`,n?.hLine),...O(`vertical`,n?.vLine),...r===void 0?{}:{"crosshair.labelBackground":r},...e.overrides}}var k=200,A=80,j=e=>e.position===`top`||e.position===`bottom`,M=class{panels=[];containerWidth=0;containerHeight=0;priceAxisWidth=e.PRICE_AXIS_WIDTH;leftAxisWidth=0;maximized=null;resize(e,t){this.containerWidth=e,this.containerHeight=t}addPanel(t,n=`bottom`,r){this.maximized=null;let i=n===`left`||n===`right`;this.panels.push({id:t,position:n,size:r??(i?k:e.DEFAULT_PANEL_HEIGHT),minSize:i?A:e.MIN_PANEL_HEIGHT,content:{type:`indicator`,indicatorInstanceId:t}})}renamePanel(e,t){let n=this.panels.find(t=>t.id===e);n&&(n.id=t,n.content={...n.content,indicatorInstanceId:t},this.maximized===e&&(this.maximized=t))}removePanel(e){this.panels=this.panels.filter(t=>t.id!==e),this.maximized===e&&(this.maximized=null)}setPanelCollapsed(e,t){let n=this.panels.find(t=>t.id===e);return!n||!j(n)||this.maximized===null&&!!n.collapsed===t?!1:(this.maximized=null,n.collapsed=t||void 0,!0)}isPanelCollapsed(e){return!!this.panels.find(t=>t.id===e)?.collapsed}isPanelShownCollapsed(e){let t=this.panels.find(t=>t.id===e);return!t||!j(t)?!1:this.maximized===null?!!t.collapsed:this.maximized!==e}setPanelScale(e,t){let n=this.panels.find(t=>t.id===e);if(!n)return!1;let r=!1;return t.log!==void 0&&!!n.logScale!==t.log&&(n.logScale=t.log||void 0,r=!0),t.invert!==void 0&&!!n.invertScale!==t.invert&&(n.invertScale=t.invert||void 0,r=!0),t.percent!==void 0&&!!n.percentScale!==t.percent&&(n.percentScale=t.percent||void 0,r=!0),r}canMovePanel(e,t){let n=this.panels.find(t=>t.id===e);if(!n)return!1;let r=this.panels.filter(e=>e.position===n.position);return r[r.indexOf(n)+t]!==void 0}setMaximizedPanel(e){let t=e===null?null:this.panels.find(t=>t.id===e);return e!==null&&(!t||!j(t))||this.maximized===e?!1:(this.maximized=e,t&&(t.collapsed=void 0),!0)}getMaximizedPanel(){return this.maximized}movePanel(e,t){let n=this.panels.find(t=>t.id===e);if(!n)return!1;let r=this.panels.filter(e=>e.position===n.position),i=r[r.indexOf(n)+t];if(!i)return!1;let a=this.panels.indexOf(n),o=this.panels.indexOf(i),s=[...this.panels];return s[a]=i,s[o]=n,this.panels=s,!0}orderPanels(e){let t=t=>{let n=e.indexOf(t.id);return n<0?e.length+this.panels.indexOf(t):n};this.panels=[...this.panels].sort((e,n)=>t(e)-t(n))}shownSize(e,t){return j(e)?this.maximized?e.id===this.maximized?t:20:e.collapsed?20:e.size:e.size}setPanelPosition(t,n){let r=this.panels.find(e=>e.id===t);if(r){let i=r.position===`left`||r.position===`right`,a=n===`left`||n===`right`;r.position=n,i!==a&&(r.size=a?k:e.DEFAULT_PANEL_HEIGHT,r.minSize=a?A:e.MIN_PANEL_HEIGHT),a&&(r.collapsed=void 0,this.maximized===t&&(this.maximized=null))}}setPanelSize(t,n){let r=this.panels.find(e=>e.id===t);if(r){let t=j(r)?this.containerHeight-e.TIME_AXIS_HEIGHT-48:this.containerWidth/2,i=t>r.minSize?Math.min(n,t):n;r.size=Math.max(r.minSize,i),r.collapsed=void 0,this.maximized=null}}setPriceAxisWidth(e){this.priceAxisWidth=e}setLeftAxisWidth(e){this.leftAxisWidth=Math.max(0,e)}getPanels(){return this.panels}resolve(){let t=this.panels.filter(e=>e.position===`left`),n=this.panels.filter(e=>e.position===`right`),r=this.panels.filter(e=>e.position===`top`),i=this.panels.filter(e=>e.position===`bottom`),a=(r.length+i.length-1)*20,o=this.maximized?this.panels.find(e=>e.id===this.maximized):void 0,s=Math.max(o?.minSize??0,this.containerHeight-e.TIME_AXIS_HEIGHT-48-a),c=e=>this.shownSize(e,s),l=t.reduce((e,t)=>e+t.size,0),u=n.reduce((e,t)=>e+t.size,0),d=r.reduce((e,t)=>e+c(t),0),f=i.reduce((e,t)=>e+c(t),0),p=l+this.leftAxisWidth,m={x:p,y:d,width:Math.max(0,this.containerWidth-p-u-this.priceAxisWidth),height:Math.max(0,this.containerHeight-d-f-e.TIME_AXIS_HEIGHT)},h=[],g=[],_=0;for(let n of t)h.push({config:n,rect:{x:_,y:0,width:n.size,height:this.containerHeight-e.TIME_AXIS_HEIGHT}}),g.push({panelId:n.id,rect:{x:_+n.size-2,y:0,width:4,height:this.containerHeight},orientation:`vertical`}),_+=n.size;let v=0;for(let e of r){let t=c(e);h.push({config:e,rect:{x:p,y:v,width:m.width,height:t}}),g.push({panelId:e.id,rect:{x:p,y:v+t-2,width:m.width,height:4},orientation:`horizontal`}),v+=t}v=m.y+m.height;for(let e of i){let t=c(e);h.push({config:e,rect:{x:p,y:v,width:m.width,height:t}}),g.push({panelId:e.id,rect:{x:p,y:v-2,width:m.width,height:4},orientation:`horizontal`}),v+=t}_=p+m.width+this.priceAxisWidth;for(let t of n)h.push({config:t,rect:{x:_,y:0,width:t.size,height:this.containerHeight-e.TIME_AXIS_HEIGHT}}),g.push({panelId:t.id,rect:{x:_-2,y:0,width:4,height:this.containerHeight},orientation:`vertical`}),_+=t.size;return{mainChartRect:m,panels:h,dividers:g}}getMainChartRect(){return this.resolve().mainChartRect}},Ee=14,De=14,Oe=22,N=4;function P(t){let{min:n,max:r,lastPrice:i,locale:a,fontFamily:o,fontSizeSmall:s,measure:c}=t,l=t.tagPrecision??(0,e.autoPricePrecision)(n,r),u=l,d=i===null?[n,r]:[n,r,i],f=e.PRICE_AXIS_WIDTH;for(let n of d){if(!Number.isFinite(n))continue;let r=t.scaleLabel?t.scaleLabel(n):t.format?t.format(n):(0,e.formatPrice)(n,l,a),i=t.format?r:(0,e.formatPrice)(n,u,a);f=Math.max(f,c(r,`500 ${s}px ${o}`)+Ee,c(i,`bold 11px ${o}`)+De,c(i,`600 ${s}px ${o}`)+Oe)}return f<=e.PRICE_AXIS_WIDTH?e.PRICE_AXIS_WIDTH:Math.ceil(f/N)*N}function F(e,t){return t>e||t<=e-12?t:e}var ke=512,Ae=class{widths=new Map;fonts;forget=()=>this.widths.clear();constructor(){this.fonts=typeof document<`u`?document.fonts??null:null,this.fonts?.addEventListener(`loadingdone`,this.forget)}get(e,t,n){let r=`${t}\n${e}`,i=this.widths.get(r);if(i!==void 0)return i;let a=n();return this.widths.size>=ke&&this.widths.clear(),this.widths.set(r,a),a}destroy(){this.fonts?.removeEventListener(`loadingdone`,this.forget),this.widths.clear()}},je=class{netY=0;travelX=0;engaged=!1;reset(){this.netY=0,this.travelX=0,this.engaged=!1}step(e,t,n){if(this.engaged)return!0;if(this.netY+=t,this.travelX+=Math.abs(e),!n)this.engaged=!0;else{let e=Math.abs(this.netY);this.engaged=e>24&&e>=this.travelX*.5}return this.engaged}},Me=1;function I(e,t){return e.filter(e=>e.enabled!==!1&&(e.descriptor.layer??`overlay`)===t)}function L(e){switch(e.kind){case`indicator`:return`indicator:${e.plugin.descriptor.id}`;case`drawing`:return`drawing:${e.plugin.descriptor.type}`;case`chartType`:return`chartType:${e.plugin.descriptor.type}`;case`overlay`:return`overlay:${e.plugin.descriptor.id}`}}var R=new Map;function Ne(e){R.set(L(e),e)}function Pe(e){return R.delete(e)}function z(){return[...R.values()]}function Fe(){R.clear()}var B=class{plugins=new Map;constructor(e,t={}){if(this.indicatorEngine=e,t.inheritGlobal!==!1)for(let e of z())this.add(e);for(let e of t.plugins??[])this.add(e)}register(e){this.add(e)}unregister(e){return this.plugins.delete(e)}list(){return[...this.plugins.values()]}registerIndicator(e){this.add({kind:`indicator`,plugin:e})}getChartType(e){let t=this.plugins.get(`chartType:${e}`);return t?.kind===`chartType`?t.plugin:void 0}getOverlays(){let e=[];for(let t of this.plugins.values())t.kind===`overlay`&&e.push(t.plugin);return e}add(e){this.plugins.set(L(e),e),e.kind===`indicator`&&this.indicatorEngine.register(e.plugin)}},V={orderPlace:(e,t)=>e.placeOrder(t),orderModify:(e,t)=>e.modifyOrder(t),orderCancel:(e,t)=>e.cancelOrder(t),positionModify:(e,t)=>e.modifyPosition(t),positionClose:(e,t)=>e.closePosition(t),positionReverse:(e,t,n)=>Ie(e,t,n)};async function Ie(e,t,n){let{reversing:r}=n;if(!r.has(t.positionId)){r.add(t.positionId);try{if(e.reversePosition){await e.reversePosition(t);return}let r=n.positions().find(e=>e.id===t.positionId);if(!r)throw Error(`No position ${t.positionId} to reverse`);let i=r.quantity-(r.closedQuantity??0);if(!(i>0))throw Error(`Position ${t.positionId} has nothing open to reverse`);await e.closePosition({positionId:r.id});try{await e.placeOrder({side:r.side===`buy`?`sell`:`buy`,type:`market`,price:r.entryPrice,quantity:i})}catch(e){throw Error(`Position ${t.positionId} was closed, but the order the other way failed`,{cause:e})}}finally{r.delete(t.positionId)}}}function Le(e,t){let n=[],r=null,i={positions:()=>r??t.getPositions?.()??[],reversing:new Set},a=e=>t.setOrders(e.data??[]),o=e=>{r=e.data??[],t.setPositions([...r])},s=e=>t.onError(e.data??{message:`Execution error`}),c=e=>{e.data&&t.onFill?.(e.data)};e.on(`orders`,a),e.on(`positions`,o),e.on(`error`,s),e.on(`fill`,c),n.push(()=>e.off(`orders`,a),()=>e.off(`positions`,o),()=>e.off(`error`,s),()=>e.off(`fill`,c));for(let r of Object.keys(V)){let a=V[r],o=t.onIntent(r,n=>{Promise.resolve(a(e,n,i)).catch(e=>t.onError({message:`Execution command failed: ${r}`,cause:e}))});n.push(o)}return()=>{for(let e of n)e()}}var Re={min:0,max:100},H=`exchange`,ze=H;function U(t){if(typeof t==`string`&&t!==`exchange`&&!(0,e.isValidTimeZone)(t))throw RangeError(`Unknown time zone: ${t}`);if(typeof t==`number`&&!Number.isFinite(t))throw RangeError(`Invalid UTC offset: ${t}`)}function W(t,n){let{timeZone:r,timezone:i}=t,a=r!==void 0&&i!==void 0&&r!==i&&r===n?i:(0,e.symbolTimeZone)(t);return a===void 0?t:{...t,timeZone:a,timezone:a}}var G=.08,Be=e.PHI**-7,Ve=800,He=20,Ue=8,We=new Set([`horizontalLine`,`crossLine`]),Ge=new Set([`verticalLine`,`crossLine`]),Ke=class{static version=`1.52.0`;engine;viewport;series=new be(e=>this.sessionKeep(e));themeManager;layoutManager;pluginManager;indicatorEngine;drawingManager;drawingRenderer;tradingManager;tradingRenderer;eventBus;streamManager=null;executionAdapter=null;execTeardown=null;autoScrollOnNewBar=!0;displayDataCache=null;reshapeMemo=new t.ReshapeMemo;displayDataStep;indicatorUpdateFrom=null;resolvedLayoutCache=null;panelInfoCache=null;paneStyles=new Map;lastBackground=null;renderScheduled=!1;renderDeferred=!1;priceAxisWidth=e.PRICE_AXIS_WIDTH;measureCtx;labelWidths=new Ae;containerSizeCache=null;containerSizeCacheTime=0;lastEmittedRange=null;lastEmittedPriceRange=null;lastEmittedBarWidth=null;chartLegend;watermark;barCountdown;unrestoredIndicators=[];indicatorHistoryDepth=0;indicatorEdit=null;removedDrawingAlerts=new Map;zoomAreaMode=!1;priceAxisAddButton=new t.PriceAxisAddButton;displayTz=null;timeZoneSetting=null;symbolInfo=null;symbolInfoSeq=0;studyZoneHeld=!1;studyZone=null;studyZoneTimer=null;studyZoneReleaseQueued=!1;sessionBreaks;sessionShading;hostSessionHours={...t.DEFAULT_SESSION_HOURS};compareRenderer;countdownInterval=null;pausedFor={host:!1,page:!1,offscreen:!1};stopWatchingVisibility=null;volumeRenderer;volumeProfile;marketProfile;depthHeatmap;periodLevels;pivotMarkers;alertManager;signalMarkerManager;tradeZoneManager;measureOverlay;selectionBoxOverlay=new t.SelectionBoxOverlay;replayManager;replayBarUnsub=null;replaySeeking=!1;replaySession=null;replayStepsSeries=null;replayCoarse=null;replayRevealMarks=!0;replayOffset=0;undoRedoManager;autoSaveScheduler=new me(e=>this.saveState(e));animator;crosshairTooltip;pinnedTooltip;interactionManager;crosshairHandler;chartRenderer;rendererToken=0;stopWaitingForGpu=null;disposed=!1;chartTypeOptions={};mainSeriesVisible=!0;priceLines=new t.PriceLines;symbolSeries=new t.SymbolSeriesStore;extendedHours=!0;replayRestarting=!1;requestedSymbols=new Set;gridRenderer;priceAxis;leftPriceAxis=new t.PriceAxis;leftScaleRequested=!1;leftAxisWidth=e.PRICE_AXIS_WIDTH;leftViewport=null;timeAxis;options;features;marketConfig=null;container;currentPriceLine;numberLocale;marketPricePrecision=null;priceFormatter=null;priceUnit=null;paneTitles=!0;defaultAutoScale;priceFitPending=!0;seriesArriving=!0;keyboardHandler=null;a11y=null;onWindowKeyDown=null;currentSymbol=``;streamTimeframe=null;tickStream=!1;announcedSymbol=null;announcedTimeframe=null;streamAdapter=null;history;historyFromStream=!1;hostHistoryLoader=!1;snapshotKey=null;historyCheckQueued=!1;constructor(n,r){r.timeZone!=null&&U(r.timeZone),this.container=n,this.options={...r,chartType:r.chartType??`candlestick`},this.numberLocale=r.numberLocale??`en-US`,this.defaultAutoScale=r.autoScale!==!1;let i=r.features??{};this.features={drawings:i.drawings??!0,drawingTools:i.drawingTools??[],drawingMagnet:i.drawingMagnet??!0,drawingUndoRedo:i.drawingUndoRedo??!0,trading:i.trading??!0,tradingContextMenu:i.tradingContextMenu??!1,priceAxisAddButton:i.priceAxisAddButton??!1,indicators:i.indicators??!0,indicatorIds:i.indicatorIds??[],panning:i.panning??!0,zooming:i.zooming??!0,crosshair:i.crosshair??!0,crosshairTooltip:i.crosshairTooltip??!0,keyboard:i.keyboard??!0,priceAxis:i.priceAxis??!0,timeAxis:i.timeAxis??!0,grid:i.grid??r.grid?.visible??!0,legend:i.legend??!0,indicatorValueLabels:i.indicatorValueLabels??!1,volume:i.volume??!0,watermark:i.watermark??!0,saveLoad:i.saveLoad??!0,screenshot:i.screenshot??!0,alerts:i.alerts??!0,replay:i.replay??!0,sessionBreaks:i.sessionBreaks??!0,barCountdown:i.barCountdown??!0,compareSymbols:i.compareSymbols??!0,dataExport:i.dataExport??!0,logScale:i.logScale??!0,timeframes:i.timeframes??[],defaultTimeframeFavorites:i.defaultTimeframeFavorites??[]},n.style.position=`relative`,n.style.overflow=`hidden`,n.tabIndex=0,n.style.outline=`none`,n.style.userSelect=`none`,n.style.webkitUserSelect=`none`,this.history=new Ce({oldestTime:()=>this.series.bars()[0]?.time??null,prepend:e=>this.prependBars(e),emit:e=>this.eventBus.emit(`historyLoad`,e)}),this.themeManager=new D(r.theme),this.themeManager.setChartType(this.options.chartType??`candlestick`),this.applyStyle(Te(r),`host`,!1),this.layoutManager=new M,this.indicatorEngine=new t.IndicatorEngine,this.pluginManager=new B(this.indicatorEngine,{plugins:r.plugins}),this.eventBus=new t.EventBus,(0,t.registerBuiltInIndicators)(this.indicatorEngine),this.indicatorEngine.register(new t.CompareSymbolIndicator(this.symbolSeries)),this.indicatorEngine.register(new t.SpreadIndicator(this.symbolSeries)),this.indicatorEngine.register(new t.CorrelationCoefficientIndicator(this.symbolSeries)),this.indicatorEngine.register(new t.CorrelationLogIndicator(this.symbolSeries)),this.drawingManager=new t.DrawingManager,(0,t.registerBuiltInDrawingTools)(this.drawingManager),this.drawingRenderer=new t.DrawingRenderer(this.drawingManager),this.drawingManager.setRequestRender(()=>{this.syncRenderContext(),this.engine.requestRender(e.LayerType.Overlay),this.scheduleAutoSave()}),this.drawingManager.setEventCallback((e,t)=>{this.followDrawingAlerts(e,t?.id),this.eventBus.emit(e,t),(e===`drawingCreate`||e===`drawingUpdate`||e===`drawingRemove`)&&this.announceStateChange()}),this.drawingManager.setToolFilter(e=>this.features.drawings&&(this.features.drawingTools.length===0||this.features.drawingTools.includes(e))),this.undoRedoManager=new t.UndoRedoManager;let a=``;this.undoRedoManager.setOnChange(()=>{let{canUndo:e,canRedo:t}=this.undoRedoManager.getState(),n=`${e}|${t}`;n!==a&&(a=n,this.eventBus.emit(`historyChange`,{canUndo:e,canRedo:t}))}),this.drawingManager.setUndoRedoManager(this.undoRedoManager),this.drawingManager.setSelectionListener(e=>this.eventBus.emit(`drawingSelect`,{ids:e,primary:e[0]??null})),this.drawingManager.setForeignHistory((e,t)=>{e.type===`custom`?e.custom?.[t]():this.applyIndicatorStep(e,t)}),this.drawingManager.setDataGetter(()=>this.series.bars(),()=>this.series.revision()),this.drawingManager.setDisplayDataGetter(()=>this.getDisplayData()),r.crosshair?.mode===`magnet`&&this.features.drawingMagnet&&this.drawingManager.setMagnetMode(`magnet`),this.tradingManager=new t.TradingManager({enabled:this.features.trading,contextMenu:{enabled:this.features.tradingContextMenu}}),this.tradingRenderer=new t.TradingRenderer(this.tradingManager),this.tradingManager.setContainer(n),this.tradingManager.setRequestRender(()=>this.engine.requestRender(e.LayerType.Overlay)),this.tradingManager.setEventCallback((e,t)=>{this.eventBus.emit(e,t)}),this.engine=new t.RenderEngine(n,r.maxPixelRatio);let o=this.engine.dprManager.getContainerSize();if(this.viewport=new t.Viewport(o.width,o.height,r.minBarSpacing??2,r.maxBarSpacing??30,r.rightMargin??5),r.barLayout&&this.viewport.setBarLayout(r.barLayout),this.viewport.setPanLimits({freePan:r.freePan??!0,minVisibleBars:r.panLimits?.minVisibleBars??3}),r.minBarUnit!==void 0&&this.viewport.setMinBarUnit(r.minBarUnit),this.layoutManager.resize(o.width,o.height),this.engine.onContainerResize=e=>{if(e.width<=0||e.height<=0)return;let t=this.viewport.isAtEnd();this.viewport.resize(e.width,e.height),this.layoutManager.resize(e.width,e.height),this.updateViewportAndRender(t)},this.chartRenderer=this.createChartRenderer(this.options.chartType),this.gridRenderer=new t.GridRenderer,r.grid?.visible===!1&&this.gridRenderer.setVisible(!1),this.priceAxis=new t.PriceAxis,this.priceAxis.setLocale(this.numberLocale),this.leftPriceAxis.setLocale(this.numberLocale),this.viewport.setNumberLocale(this.numberLocale),this.timeAxis=new t.TimeAxis,this.timeAxis.setLocale(this.numberLocale),this.crosshairHandler=new t.CrosshairHandler,this.crosshairHandler.setLocale(this.numberLocale),this.applyTimeSpacing(),r.crosshair?.mode&&this.crosshairHandler.setMode(r.crosshair.mode),this.crosshairHandler.setDataSource(()=>this.crosshairSeries()),this.crosshairHandler.setCallback((n,r)=>{if(n!==null&&r){let i=this.crosshairSeries(),a=n>=0&&n<i.length?i[n]:void 0;this.chartLegend.setHoverBar(a??null,n>0?i[n-1]??null:null);let o=this.viewport.getState(),s=r.y>=o.chartRect.y&&r.y<=o.chartRect.y+o.chartRect.height;a&&s&&this.features.crosshairTooltip?this.crosshairTooltip.show(r,a,this.themeManager.getTheme(),this.cachedContainerSize(),{prevClose:n>0?i[n-1]?.close:void 0,priceRange:o.priceRange,plot:o.chartRect,barStepMs:(0,t.barTimeStepMs)(i),timeUnit:(0,e.barTimeUnit)(i)}):this.crosshairTooltip.hide(),this.pinnedTooltip.isPinned()&&this.pinnedTooltip.reposition(this.viewport.getState(),a??null,n,this.themeManager.getTheme()),this.eventBus.emit(`crosshairMove`,{point:r,bar:a,barIndex:n})}else this.crosshairTooltip.hide(),this.chartLegend.setHoverBar(null),this.eventBus.emit(`crosshairLeave`,{})}),this.chartLegend=new t.ChartLegend,this.chartLegend.setChartType(this.options.chartType),this.chartLegend.setLocale(this.numberLocale),this.watermark=new t.Watermark,r.watermark&&this.watermark.setConfig(r.watermark),this.volumeRenderer=new t.VolumeRenderer,this.volumeProfile=new t.VolumeProfileRenderer,this.marketProfile=new t.MarketProfileRenderer,this.depthHeatmap=new t.DepthHeatmapRenderer,this.periodLevels=new t.PeriodLevelsRenderer,this.pivotMarkers=new t.PivotMarkersRenderer,this.barCountdown=new t.BarCountdown,this.barCountdown.setVisible(this.features.barCountdown),this.sessionBreaks=new t.SessionBreaks,this.sessionShading=new t.SessionShading,this.compareRenderer=new t.CompareRenderer,r.sessionBreaks?this.sessionBreaks.setConfig({visible:r.sessionBreaks.visible??!0,color:r.sessionBreaks.color,lineStyle:r.sessionBreaks.lineStyle,lineWidth:r.sessionBreaks.lineWidth}):r.features?.sessionBreaks!==!1&&this.sessionBreaks.setVisible(!0),r.logScale&&this.features.logScale&&this.viewport.setLogScale(!0),this.animator=new t.Animator,this.crosshairTooltip=new t.CrosshairTooltip,this.crosshairTooltip.create(n),this.crosshairTooltip.setLocale(this.numberLocale),this.pinnedTooltip=new t.PinnedTooltip,this.pinnedTooltip.create(n),this.pinnedTooltip.setLocale(this.numberLocale),r.priceFormat&&this.applyPriceFormat(r.priceFormat),r.chartTypeOptions&&(this.chartTypeOptions=(0,e.readChartTypeOptions)(r.chartTypeOptions)),r.highLowLines&&this.priceLines.setHighLow(!0),r.shapes&&this.themeManager.setShape(Qe(r.shapes)),r.font&&this.themeManager.setFont(Ze(r.font)),this.priceLines.setPriceText(e=>this.formatPrice(e)),r.extendedHours===!1&&(this.extendedHours=!1),r.timeFormatter&&this.applyTimeFormatter(r.timeFormatter),this.keyboardHandler=new t.KeyboardHandler({scrollBars:e=>{let t=this.viewport.getState().barWidth+this.viewport.getState().barSpacing;this.viewport.scrollBy(e*t),this.updateViewportAndRender()},zoom:e=>{let t=this.viewport.getState().chartRect.width;this.viewport.zoom(e,t/2),this.updateViewportAndRender()},goToStart:()=>{this.viewport.scrollBy(-1/0),this.updateViewportAndRender()},goToEnd:()=>{this.viewport.scrollToEnd(),this.updateViewportAndRender()},fitContent:()=>this.fitContent()}),this.keyboardHandler.setEnabled(this.features.keyboard),r.a11y!==!1){this.a11y=new u(n,{symbol:()=>this.currentSymbol||this.symbolInfo?.symbol||``,timeframe:()=>this.streamTimeframe??``,chartType:()=>this.options.chartType??`candlestick`,bars:()=>this.getDisplayData(),visibleRange:()=>this.viewport.getState().visibleRange,formatPrice:e=>this.formatPrice(e),formatTime:e=>this.spokenBarTime(e),showBar:e=>this.setCrosshairTime(e)},r.a11y?.labels);for(let e of[`dataUpdate`,`chartTypeChange`,`symbolChange`,`timeframeChange`])this.eventBus.on(e,()=>this.a11y?.refresh(e!==`dataUpdate`))}if(this.onWindowKeyDown=e=>{if(!this.keyboardHandler)return;let t=document.activeElement;if(!(t&&t!==this.container&&!this.container.contains(t))&&!(t&&(t.tagName===`INPUT`||t.tagName===`TEXTAREA`||t.isContentEditable))&&!(t&&t!==this.container&&t.matches(`button, a[href], select, [role="button"], [role="menuitem"]`))){if(this.a11y&&this.features.keyboard&&(e.key===`,`||e.key===`.`)&&!e.ctrlKey&&!e.metaKey&&!e.altKey){e.preventDefault(),this.a11y.readBar(e.key===`.`?1:-1);return}this.keyboardHandler.handleKey(e)&&(e.preventDefault(),this.a11y?.viewMoved())}},window.addEventListener(`keydown`,this.onWindowKeyDown),this.currentPriceLine=new t.CurrentPriceLine,this.currentPriceLine.setLocale(this.numberLocale),this.priceAxis.setReservedPriceProvider(()=>this.currentPriceLine.isVisible()?this.currentPriceLine.getPrice():null),this.alertManager=new t.AlertManager,this.alertManager.setDrawingLevels(e=>this.drawingLevelsNow(e)),this.alertManager.setRequestRender(()=>this.engine.requestRender(e.LayerType.Overlay)),this.compareRenderer.setReservedLevels(()=>this.alertManager.getAlerts().filter(t.isPriceLevelAlert).map(e=>e.price)),this.alertManager.on(`triggered`,e=>{this.eventBus.emit(`alertTriggered`,K(e)),this.eventBus.emit(`dataUpdate`,{kind:`alert`,alert:`triggered`,alertId:e.id,price:e.price,message:e.message})}),this.alertManager.on(`added`,e=>{this.eventBus.emit(`alertAdd`,K(e))}),this.alertManager.on(`removed`,e=>{this.eventBus.emit(`alertRemove`,{id:e})}),this.alertManager.on(`expired`,e=>{this.eventBus.emit(`alertExpired`,K(e))}),this.alertManager.on(`updated`,e=>{this.eventBus.emit(`alertUpdate`,K(e))}),this.signalMarkerManager=new t.SignalMarkerManager,this.signalMarkerManager.setRequestRender(()=>this.engine.requestRender(e.LayerType.Overlay)),this.signalMarkerManager.setDataGetter(()=>this.series.bars()),this.signalMarkerManager.on(`added`,e=>{this.eventBus.emit(`signalMarkerAdd`,{id:e.id,source:e.source,direction:e.direction})}),this.signalMarkerManager.on(`removed`,e=>{this.eventBus.emit(`signalMarkerRemove`,{id:e})}),this.tradeZoneManager=new t.TradeZoneManager,this.tradeZoneManager.setRequestRender(()=>this.engine.requestRender(e.LayerType.Overlay)),this.tradeZoneManager.setDataGetter(()=>this.series.bars()),this.tradeZoneManager.on(`added`,e=>{this.eventBus.emit(`tradeZoneAdd`,{id:e.id,direction:e.direction})}),this.tradeZoneManager.on(`removed`,e=>{this.eventBus.emit(`tradeZoneRemove`,{id:e})}),this.replayManager=new t.ReplayManager,this.replayManager.on(`complete`,()=>{let e=this.getReplayBarIndex(),t=this.replayCoarse?.[e];t&&this.eventBus.emit(`replayComplete`,{barIndex:e,time:t.time})}),this.replayManager.on(`stateChange`,e=>{this.replayRestarting||this.eventBus.emit(`replayState`,{state:e})}),this.measureOverlay=new t.MeasureOverlay,this.interactionManager=new t.InteractionManager(n),this.features.panning){let e=new je;this.interactionManager.setPanHandler(new t.PanHandler((t,n)=>{t&&this.viewport.scrollBy(t),e.step(t,n,this.options.autoScale!==!1)&&n&&(this.holdPriceScale(),this.viewport.panPriceRange(n)),this.updateViewportAndRender()},()=>e.reset()))}if(this.interactionManager.setAxisStrips(()=>({plot:this.viewport.getState().chartRect,timeAxisTop:this.timeAxisTop(),left:{width:this.isLeftPriceScaleShown()?this.leftAxisWidth:0,scales:!this.indicatorEngine.hasLeftScaleOverlays()}})),this.features.zooming){this.interactionManager.setZoomHandler(new t.ZoomHandler((e,t)=>{this.viewport.zoom(e,t-this.viewport.getState().chartRect.x),this.updateViewportAndRender()}));let e=new t.AxisDragHandler(e=>{this.holdPriceScale(),this.viewport.scalePriceRange(e),this.syncRenderContext(),this.engine.requestRender(),this.emitViewportEvents()},e=>{let t=this.viewport.getState().chartRect.width;this.viewport.zoom(1/e-1,t/2),this.updateViewportAndRender()});this.interactionManager.setAxisDragHandler(e,()=>this.viewport.getState(),e=>{e===`price`?(this.options.autoScale=!0,this.updateViewportAndRender()):this.fitContent()})}if(this.features.crosshair&&this.interactionManager.setCrosshairHandler(this.crosshairHandler),this.features.drawings&&(this.interactionManager.setDrawingManager(this.drawingManager,()=>({...this.viewport.getState(),data:this.getDisplayData()})),this.interactionManager.setDrawingDoubleClick(e=>this.eventBus.emit(`drawingDoubleClick`,{id:e})),this.interactionManager.setDrawingContextMenu((e,t)=>{this.drawingManager.select(e)&&this.eventBus.emit(`drawingContextMenu`,{id:e,x:t.x,y:t.y})})),this.interactionManager.setChartContextMenu((e,t)=>this.eventBus.hasListeners(`chartContextMenu`)?(this.eventBus.emit(`chartContextMenu`,this.contextAt(e,t)),!0):!1),this.priceAxisAddButton.setEnabled(this.features.priceAxisAddButton&&this.features.crosshair),this.interactionManager.setPriceAxisAddButton(this.priceAxisAddButton,e=>{let n=(0,t.yToPrice)(e.y,this.viewport.getState());Number.isFinite(n)&&this.eventBus.emit(`priceAxisAdd`,{price:n,x:e.x,y:e.y})}),this.features.trading&&this.interactionManager.setTradingManager(this.tradingManager,()=>({...this.viewport.getState(),data:this.getDisplayData()})),this.features.alerts){let e=new t.AlertDragHandler(this.alertManager,()=>this.viewport.getState());this.interactionManager.setAlertDragHandler(e)}let s=new t.PaneResizeHandler;s.configure(()=>this.getResolvedLayout(),(e,t)=>this.setPanelSize(e,t)),this.interactionManager.setPaneResizeHandler(s),this.interactionManager.setAltClickHandler(t=>{let n=this.getDisplayData();if(n.length===0)return;let r=this.viewport.getState(),i=r.barWidth+r.barSpacing,a=Math.round((r.offset+t.x)/i);a<0||a>=n.length||(this.pinnedTooltip.isPinned()&&this.pinnedTooltip.getPinnedIndex()===a?this.pinnedTooltip.unpin():this.pinnedTooltip.pin(n[a],a,this.themeManager.getTheme(),(0,e.barTimeUnit)(n),(0,e.barsAreDaily)(n)===!0),this.pinnedTooltip.reposition(this.viewport.getState(),this.series.bars()[a]??null,a,this.themeManager.getTheme()),this.engine.requestRender(e.LayerType.Overlay))}),this.interactionManager.setSignalMarkerHitTest(e=>this.eventBus.hasListeners(`signalMarkerHover`)||this.eventBus.hasListeners(`signalMarkerClick`)?this.signalMarkerManager.markerAt(e,this.viewport.getState()):null,(e,t)=>this.eventBus.emit(`signalMarkerHover`,{marker:e,x:t.x,y:t.y}),()=>this.eventBus.hasListeners(`signalMarkerClick`)),this.interactionManager.setClickHandler(e=>{let n=this.getDisplayData(),r=this.eventBus.hasListeners(`signalMarkerClick`)?this.signalMarkerManager.markerAt(e,this.viewport.getState()):null;if(r){this.eventBus.emit(`signalMarkerClick`,{marker:r,x:e.x,y:e.y});return}if(this.eventBus.emit(`click`,{x:e.x,y:e.y}),n.length===0)return;let i=(0,t.xToBarIndex)(e.x,this.viewport.getState());i<0||i>=n.length||this.eventBus.emit(`barClick`,{bar:n[i],barIndex:i,point:e})}),this.interactionManager.setEscapeHandler(()=>{if(this.zoomAreaMode){this.setZoomAreaMode(!1);return}if(this.features.trading&&this.tradingManager.isBracketActive()){this.tradingManager.cancelBracket(),this.eventBus.emit(`dataUpdate`,{kind:`bracket`,bracket:`cancelled`});return}this.pinnedTooltip.isPinned()&&(this.pinnedTooltip.unpin(),this.engine.requestRender(e.LayerType.Overlay))}),this.interactionManager.setConfirmHandler(()=>this.features.trading&&this.tradingManager.isBracketActive()?(this.tradingManager.confirmBracket(),!0):!1),this.interactionManager.setMeasureHandlers({begin:e=>{this.measureOverlay.begin(e,this.viewport.getState(),this.getDisplayData())},move:e=>{this.measureOverlay.update(e,this.viewport.getState(),this.getDisplayData())},end:()=>{this.measureOverlay.end()}});let c=e=>{let t=this.viewport.getState().chartRect;return{x:Math.max(t.x,Math.min(t.x+t.width,e.x)),y:Math.max(t.y,Math.min(t.y+t.height,e.y))}};this.interactionManager.setBoxSelectHandlers({begin:e=>this.selectionBoxOverlay.begin(c(e)),move:e=>this.selectionBoxOverlay.update(c(e)),end:()=>{let t=this.selectionBoxOverlay.end();if(t&&this.zoomAreaMode){if(t.x1-t.x0<Ue)return;this.zoomToBox(t),this.setZoomAreaMode(!1);return}if(!t||!this.features.drawings)return;let n={...this.viewport.getState(),data:this.getDisplayData()};t.isClick?this.drawingManager.toggleSelectionAt({x:t.x1,y:t.y1},n):this.drawingManager.selectInRect(t,n),this.engine.requestRender(e.LayerType.Overlay)},cancel:()=>{this.selectionBoxOverlay.cancel(),this.setZoomAreaMode(!1)}}),this.interactionManager.setOverlayDirtyCallback(t=>{this.engine.requestRender(t?e.LayerType.Hover:e.LayerType.Overlay)}),this.interactionManager.setPageScroll(r.pageScroll??!1),this.interactionManager.attach(),r.timeZone!==void 0&&r.timeZone!==null&&this.setTimeZone(r.timeZone),r.leftPriceScale&&(this.leftScaleRequested=!0),this.syncRenderContext(),this.engine.start(),this.watchVisibility(n,r.pauseWhenHidden!==!1),this.engine.onGpuLost=()=>this.eventBus.emit(`rendererChange`,{renderer:`canvas`,reason:`contextLost`}),this.engine.onGpuRestored=()=>this.eventBus.emit(`rendererChange`,{renderer:`webgl`,reason:`contextRestored`}),this.options.renderer&&this.options.renderer!==`canvas`&&this.setRenderer(this.options.renderer)}setData(e){this.loadSeries(e,!1)}loadSeries(e,t){this.snapshotKey=null,this.endReplaySession(),this.history.reset(),this.series.load(e),this.crosshairHandler.setData(this.series.bars()),this.displayDataCache=null,this.reshapeMemo.clear(),this.sessionBreaks.invalidateCache(),this.options.autoScale=this.defaultAutoScale,this.priceFitPending=!0;let n=this.series.bars();this.seriesArriving=n.length===0;let r=n[n.length-1];t||(this.alertManager.clearLastValues(),r&&this.alertManager.seedLastValue(`price`,r.close)),this.recalcIndicators(n),r&&this.currentPriceLine.setPrice(r.close),this.updateViewportAndRender(!0),this.emitBars(n.length)}prependBars(e){if(this.replaySession)return 0;let n=this.getDisplayData(),r=Math.max(0,Math.min(n.length-1,Math.floor(this.viewport.getState().visibleRange.from))),i=n[r]?.time,{added:a,taken:o}=this.series.prepend(e);if(a===0)return o;let s=this.series.bars();if(this.crosshairHandler.setData(s),this.displayDataCache=null,this.reshapeMemo.clear(),this.sessionBreaks.invalidateCache(),this.pinnedTooltip.isPinned()&&this.pinnedTooltip.unpin(),this.measureOverlay.end(),this.recalcIndicators(s),i!==void 0){let e=Math.round((0,t.timestampToBarIndex)(i,this.getDisplayData()));this.viewport.prependBars(e-r)}return this.updateViewportAndRender(),o}mergeSnapshot(e){let t=this.viewport.isAtEnd();if(!this.series.mergeSnapshot(e)){this.setData(e);return}let n=this.series.bars();this.crosshairHandler.setData(n),this.displayDataCache=null,this.reshapeMemo.clear(),this.sessionBreaks.invalidateCache(),this.recalcIndicators(n),n.length>0&&this.currentPriceLine.setPrice(n[n.length-1].close),this.updateViewportAndRender(t),this.emitBars(n.length)}setHistoryLoader(e,t){this.historyFromStream=!1,this.hostHistoryLoader=e!==null,this.history.setLoader(e,t?.pageSize),this.checkHistory()}loadMoreHistory(){return this.replaySession?Promise.resolve(0):this.history.loadMore()}hasMoreHistory(){return this.history.hasLoader()&&this.history.hasMore()}isLoadingHistory(){return this.history.isLoading()}checkHistory(){this.historyCheckQueued||!this.history.hasLoader()||(this.historyCheckQueued=!0,queueMicrotask(()=>{if(this.historyCheckQueued=!1,this.replaySession||!this.history.hasLoader()||_(this.options.chartType))return;let{visibleRange:e,chartRect:t}=this.viewport.getState();if(t.width<=0)return;let{from:n,to:r}=e;this.history.maybeLoad(Math.max(0,Math.floor(n)),Math.max(He,r-n))}))}useStreamHistory(n,r){if(this.hostHistoryLoader)return;let i=(0,t.withResampling)(n),a=i.fetchHistoryBefore,o=this.streamTimeframe;if(!a||o===null||(0,e.tickBarCount)(o)!==null){this.historyFromStream&&this.history.setLoader(null),this.historyFromStream=!1;return}let s=this.currentSymbol;this.history.setLoader((e,t)=>a.call(i,s,o,e,t),r),this.historyFromStream=!0,this.checkHistory()}appendBar(e){if(!y(e))return;let t=this.series.append(e);if(t.refiltered&&(this.displayDataCache=null),t.to!==`shown`){this.takeLivePrice(e.close),t.to===`hidden`&&this.scheduleRender();return}let n=this.autoScrollOnNewBar&&this.viewport.isAtEnd(),r=t.before,i=this.series.bars();this.crosshairHandler.setData(i),this.displayDataCache=null,this.recalcIndicatorsFrom(i,i.length-2),this.currentPriceLine.setPrice(e.close,i[i.length-2]?.close),this.updateViewportAndRender(n),i.length!==r&&this.emitBars(i.length),this.followLivePrice(e.close)}appendBars(e){if(e=e.filter(y),e.length===0)return;let t=e[e.length-1].close,n=this.series.appendMany(e);if(n.refiltered&&(this.displayDataCache=null),n.shown===0){this.takeLivePrice(t),n.aside||this.scheduleRender();return}let r=this.autoScrollOnNewBar&&this.viewport.isAtEnd(),i=n.before;this.displayDataCache=null;let a=this.series.bars();this.recalcIndicatorsFrom(a,i-1),this.crosshairHandler.setData(a),this.currentPriceLine.setPrice(t,a[a.length-2]?.close),this.updateViewportAndRender(r),a.length!==i&&this.emitBars(a.length),this.followLivePrice(t)}updateLastBar(e){if(!y(e))return;let t=this.series.updateLast(e);if(t.refiltered&&(this.displayDataCache=null),t.to!==`shown`){this.takeLivePrice(e.close),t.to===`hidden`&&this.scheduleRender();return}this.currentPriceLine.setPrice(e.close),this.options.chartType!==`candlestick`&&this.options.chartType!==`line`&&this.options.chartType!==`area`&&this.options.chartType!==`bar`&&this.options.chartType!==`hollowCandle`&&(this.displayDataCache=null);let n=this.series.bars();this.recalcIndicatorsFrom(n,n.length-1),this.followLivePrice(e.close),this.scheduleRender()}updateLastBarFromTick(e){if(!Number.isFinite(e.price)||e.price<0||e.volume!==void 0&&!(Number.isFinite(e.volume)&&e.volume>=0))return;let t=this.series.mergeTick(e);if(t.to!==`shown`){this.takeLivePrice(e.price),t.to===`hidden`&&this.scheduleRender();return}this.currentPriceLine.setPrice(e.price),this.options.chartType!==`candlestick`&&this.options.chartType!==`line`&&this.options.chartType!==`area`&&this.options.chartType!==`bar`&&this.options.chartType!==`hollowCandle`&&(this.displayDataCache=null);let n=this.series.bars();this.recalcIndicatorsFrom(n,n.length-1),this.followLivePrice(e.price),this.scheduleRender()}updateBar(e){if(!y(e))return!1;let t=this.series.replace(e);return t.to===`none`?!1:(t.to===`shown`&&t.changed&&this.showCorrection(t.index),!0)}showCorrection(e){let t=this.series.bars(),n=t[e];this.displayDataCache=null,this.reshapeMemo.clear(),this.indicatorEngine.deferRecalculateFrom(t,e),this.announceIndicatorUpdate(e),e===t.length-1&&(this.currentPriceLine.setPrice(n.close,t[e-1]?.close),this.alertManager.seedLastValue(`price`,n.close)),this.refreshShownBar(e),this.eventBus.emit(`dataUpdate`,{kind:`correction`,time:n.time,index:e}),this.scheduleRender()}refreshShownBar(t){let n=this.pinnedTooltip.isPinned()?this.pinnedTooltip.getPinnedIndex():-1,r=this.crosshairHandler.getReportedBarIndex();if(n<t&&r===null)return;let i=this.isTimeAligned();if(i&&n>=t){let t=this.getDisplayData();t[n]&&this.pinnedTooltip.pin(t[n],n,this.themeManager.getTheme(),(0,e.barTimeUnit)(t),(0,e.barsAreDaily)(t)===!0)}r!==null&&(!i||r===t||r===t+1)&&this.crosshairHandler.refresh()}getChartType(){return this.options.chartType??`candlestick`}setChartType(e){let t=this.options.chartType??`candlestick`;this.options.chartType=e,this.themeManager.setChartType(e),this.chartRenderer=this.createChartRenderer(e),this.chartLegend.setChartType(e),this.displayDataCache=null,this.applyTimeSpacing(),this.updateViewportAndRender(!0),this.markStateChanged(),e!==t&&this.eventBus.emit(`chartTypeChange`,{type:e,previous:t})}applyTimeSpacing(){let e=!this.tickStream&&!_(this.options.chartType);this.timeAxis.setTimesPastData(e),this.crosshairHandler.setTimesPastData(e)}setChartTypeOptions(t){this.chartTypeOptions={...this.chartTypeOptions,...(0,e.readChartTypeOptions)(t)},this.displayDataCache=null,this.updateViewportAndRender(!0),this.a11y?.refresh(!0),this.markStateChanged()}getChartTypeOptions(){return(0,e.readChartTypeOptions)(this.chartTypeOptions)}setExtendedHours(e){e!==this.extendedHours&&(this.extendedHours=e,this.reapplyExtendedHours(),this.markStateChanged())}isExtendedHoursVisible(){return this.extendedHours}sessionKeep(e){return this.extendedHours?null:i(this.symbolInfo,e)}reapplyExtendedHours(){if(!this.series.refilter())return;let e=this.series.bars();this.crosshairHandler.setData(e),this.displayDataCache=null,this.reshapeMemo.clear(),this.sessionBreaks.invalidateCache(),this.recalcIndicators(e),this.updateViewportAndRender(!0),this.emitBars(e.length)}quoteLines(){return this.priceLines.setQuoteShown(this.replaySession===null),this.priceLines}setShapes(e){let t=Qe(e);t.tagRadius!==void 0&&(this.themeManager.setShape({...this.themeManager.getTheme().shape,...t}),this.syncRenderContext(),this.engine.requestRender())}getShapes(){return{...this.themeManager.getTheme().shape}}setFont(e){if(e===null)this.themeManager.setFont(null);else{let t=Ze(e);if(Object.keys(t).length===0)return;this.themeManager.setFont(t)}this.updateViewportAndRender()}getFont(){return{...this.themeManager.getTheme().font}}setBarLayout(e){e!==`golden`&&e!==`classic`||e===this.viewport.getBarLayout()||(this.viewport.setBarLayout(e),this.updateViewportAndRender())}getBarLayout(){return this.viewport.getBarLayout()}setMainSeriesVisible(e){this.mainSeriesVisible=e,this.syncRenderContext(),this.engine.requestRender()}isMainSeriesVisible(){return this.mainSeriesVisible}setHighLowLines(e){this.priceLines.setHighLow(e),this.engine.requestRender()}isHighLowLinesVisible(){return this.priceLines.isHighLowVisible()}setBidAsk(t){this.priceLines.setBidAsk(t),this.engine.requestRender(e.LayerType.Overlay)}getBidAsk(){return this.priceLines.getBidAsk()}addIndicator(e,t,n=`bottom`,r={}){return this.recordIndicators(void 0,()=>this.addIndicatorNow(e,t??{},n,r))}addIndicatorNow(e,t,n,r){if(!this.isIndicatorAllowed(e))return null;let i=this.indicatorEngine.getAvailableIndicators().find(t=>t.id===e),a=i?this.paneFor(i,t,r.pane):null,o=this.indicatorEngine.addIndicator(e,t,this.series.bars(),{...a?{pane:a}:{},...r.scale===`left`?{scale:`left`}:{},...r.instanceId?{instanceId:r.instanceId}:{}});return i?.placement===`panel`&&!a&&this.layoutManager.addPanel(o,n),this.updateViewportAndRender(),this.eventBus.emit(`indicatorAdd`,{instanceId:o,id:e}),this.markStateChanged(),this.requestMissingSymbols(o),o}setSymbolSeries(e,n){e=e.trim(),this.symbolSeries.set(e,n),this.requestedSymbols.delete(e);let r=this.series.bars(),i=!1;for(let n of this.indicatorEngine.getActiveIndicators())!t.SYMBOL_INDICATOR_IDS.has(n.id)||String(n.params.symbol??``).trim()!==e.trim()||(this.indicatorEngine.updateIndicator(n.instanceId,{},r),i=!0);i&&(this.announceIndicatorUpdate(0),this.updateViewportAndRender())}forgetUnreadSymbols(){let e=new Set(this.getRequiredSymbols());for(let t of this.requestedSymbols)e.has(t)||this.requestedSymbols.delete(t)}getSymbolSeries(e){return this.symbolSeries.get(e)??null}getRequiredSymbols(){let e=new Set;for(let n of this.indicatorEngine.getActiveIndicators()){let r=n.params.symbol;t.SYMBOL_INDICATOR_IDS.has(n.id)&&typeof r==`string`&&r.trim()&&e.add(r.trim())}return[...e]}requestMissingSymbols(e){this.forgetUnreadSymbols();let n=this.indicatorEngine.getIndicatorConfig(e),r=n&&t.SYMBOL_INDICATOR_IDS.has(n.id)&&typeof n.params.symbol==`string`?n.params.symbol.trim():``;!r||this.symbolSeries.has(r)||this.requestedSymbols.has(r)||(this.requestedSymbols.add(r),this.eventBus.emit(`symbolSeriesRequest`,{symbol:r}))}updateIndicator(e,t){this.recordIndicators(e,()=>this.updateIndicatorNow(e,t))}updateIndicatorNow(n,r){let i=this.indicatorEngine.getIndicatorDescriptor(n),a=i?(0,t.sourceParam)(i):null,o=a?this.indicatorEngine.getIndicatorConfig(n)?.params[a]:void 0;this.indicatorEngine.updateIndicator(n,r,this.series.bars()),this.announceIndicatorUpdate(0),this.markStateChanged(),this.eventBus.emit(`indicatorChange`,{instanceId:n,change:`params`}),this.requestMissingSymbols(n);let s=this.indicatorEngine.getIndicatorConfig(n);if(i?.placement===`overlay`&&s&&a&&s.params[a]!==o){let t=(0,e.parseIndicatorSource)(s.params[a]),r=t?this.paneHostOf(t.instanceId,n):(0,e.parseIndicatorSource)(o)?null:s.pane??null;(r??void 0)!==s.pane&&(this.indicatorEngine.setPane(n,r),this.eventBus.emit(`indicatorChange`,{instanceId:n,change:`pane`}))}this.updateViewportAndRender()}paneFor(n,r,i,a){if(i)return this.paneHostOf(i,a);if(n.placement!==`overlay`)return null;let o=(0,t.sourceParam)(n),s=o?(0,e.parseIndicatorSource)(r[o]):null;return s?this.paneHostOf(s.instanceId,a):null}paneHostOf(e,t){if(e===t)return null;if(this.layoutManager.getPanels().some(t=>t.id===e))return e;let n=this.indicatorEngine.getIndicatorConfig(e)?.pane;return n&&n!==t?n:null}getIndicatorLevels(e){return this.indicatorEngine.getLevels(e)}setIndicatorScale(e,t){return this.recordIndicators(e,()=>this.setIndicatorScaleNow(e,t))}setIndicatorScaleNow(e,t){return this.indicatorEngine.setScale(e,t)?(this.updateViewportAndRender(),this.markStateChanged(),this.eventBus.emit(`indicatorChange`,{instanceId:e,change:`scale`}),!0):!1}getIndicatorScale(e){return this.indicatorEngine.getIndicatorConfig(e)?.scale===`left`?`left`:`right`}setLeftPriceScaleVisible(e){this.leftScaleRequested=e,this.updateViewportAndRender()}isLeftPriceScaleVisible(){return this.leftScaleRequested}isLeftPriceScaleShown(){return this.features.priceAxis!==!1&&(this.leftScaleRequested||this.indicatorEngine.hasLeftScaleOverlays())}getLeftPriceRange(){return this.leftViewport?{...this.leftViewport.priceRange}:null}computeLeftViewport(){if(!this.isLeftPriceScaleShown())return null;let e=this.viewport.getState();if(!this.indicatorEngine.hasLeftScaleOverlays())return e;let t=this.indicatorEngine.getOverlayPriceRange(e.visibleRange.from,e.visibleRange.to,`left`);if(!t)return e;let n=t.max-t.min||Math.abs(t.max)||1;return{...e,priceRange:{min:t.min-n*G,max:t.max+n*G},logScale:!1,scaleMode:`regular`,invertScale:!1,formatPrice:void 0,pricePrecision:void 0,priceUnit:void 0}}setIndicatorLevels(e,t){this.recordIndicators(e,()=>this.setIndicatorLevelsNow(e,t))}setIndicatorLevelsNow(e,t){this.indicatorEngine.setLevels(e,t)&&(this.updateViewportAndRender(),this.markStateChanged(),this.eventBus.emit(`indicatorChange`,{instanceId:e,change:`levels`}))}removeIndicator(e){this.recordIndicators(void 0,()=>this.removeIndicatorNow(e))}removeIndicators(e){this.recordIndicators(void 0,()=>{for(let t of e)this.removeIndicatorNow(t)})}removeIndicatorNow(e){if(!this.indicatorEngine.getIndicatorConfig(e))return;let t=[e,...this.indicatorEngine.getDependents(e)];for(let e of t.reverse())this.detachIndicator(e);this.markStateChanged(),this.updateViewportAndRender()}detachIndicator(e){if(!this.indicatorEngine.getIndicatorConfig(e))return;let t=this.layoutManager.getPanels().find(t=>t.id===e),n=this.indicatorEngine.getPaneMembers(e),r=t?n.find(e=>this.indicatorEngine.getIndicatorDescriptor(e)?.placement===`panel`)??null:null;this.indicatorEngine.removeIndicator(e);let i=this.paneStyles.get(e);this.paneStyles.delete(e),r?(this.indicatorEngine.setPane(r,null),this.layoutManager.renamePanel(e,r),i&&this.paneStyles.set(r,i)):this.layoutManager.removePanel(e);for(let e of n)e!==r&&this.indicatorEngine.setPane(e,r),this.eventBus.emit(`indicatorChange`,{instanceId:e,change:`pane`});this.eventBus.emit(`indicatorRemove`,{instanceId:e}),this.forgetUnreadSymbols()}getIndicatorStyle(e){return this.indicatorEngine.getIndicatorStyle(e)}setIndicatorDefaults(t,n){if(!n){this.indicatorEngine.setStyleDefaults(t,null);return}let{plots:r,...i}=n,a=r===void 0?void 0:(0,e.readIndicatorPlotStyles)(r);this.indicatorEngine.setStyleDefaults(t,{...i,...a?{plots:a}:{}})}setPaneStyle(t,n){let r=this.paneOf(t);this.layoutManager.getPanels().some(e=>e.id===r)&&this.recordIndicators(r,()=>this.setPaneStyleNow(r,n?(0,e.readPaneStyle)(n):null))}setPaneStyleNow(e,t){JSON.stringify(t)!==JSON.stringify(this.paneStyles.get(e)??null)&&(t?this.paneStyles.set(e,t):this.paneStyles.delete(e),this.panelInfoCache=null,this.syncRenderContext(),this.engine.requestRender(),this.markStateChanged())}getPaneStyle(e){let t=this.paneStyles.get(this.paneOf(e));return t?{...t}:null}getIndicatorOutput(e){return this.indicatorEngine.getOutput(e)}registerIndicator(e){this.pluginManager.registerIndicator(e)}get plugins(){return this.pluginManager}static indicators(){let e=new t.IndicatorEngine;return(0,t.registerBuiltInIndicators)(e),e.getAvailableIndicators()}setPanelPosition(e,t){this.layoutManager.setPanelPosition(e,t),this.updateViewportAndRender(),this.eventBus.emit(`indicatorChange`,{instanceId:e,change:`pane`})}setPanelSize(e,t){this.layoutManager.setPanelSize(e,t),this.updateViewportAndRender(),this.eventBus.emit(`paneResize`,{instanceId:e,size:t}),this.markStateChanged()}moveIndicatorToPane(e,t){return this.recordIndicators(e,()=>this.moveIndicatorToPaneNow(e,t))}canMoveIndicatorToPane(e,t){return this.paneMoveHost(e,t)!==void 0}paneMoveHost(n,r){let i=this.indicatorEngine.getIndicatorConfig(n),a=this.indicatorEngine.getIndicatorDescriptor(n);if(!i||!a)return;let o=(0,t.sourceParam)(a);if(a.placement===`overlay`&&o&&(0,e.parseIndicatorSource)(i.params[o]))return;if(r===`price`)return a.placement===`overlay`&&i.pane?null:void 0;if(r===`new`){let e=this.layoutManager.getPanels().some(e=>e.id===n);return a.placement===`panel`&&!e?null:void 0}let s=this.paneHostOf(r,n);return s&&s!==i.pane&&s!==n?s:void 0}moveIndicatorToPaneNow(e,t){let n=this.paneMoveHost(e,t),r=this.indicatorEngine.getIndicatorConfig(e);if(n===void 0||!r)return!1;let i=r.pane,a=this.layoutManager.getPanels().some(t=>t.id===e),o=new Set([e]);if(a){let t=this.indicatorEngine.getPaneMembers(e),r=new Set(this.indicatorEngine.getDependents(e)),i=t.filter(e=>!r.has(e)),a=i.find(e=>this.indicatorEngine.getIndicatorDescriptor(e)?.placement===`panel`)??null,s=this.paneStyles.get(e);if(this.paneStyles.delete(e),a){this.indicatorEngine.setPane(a,null),this.layoutManager.renamePanel(e,a),s&&this.paneStyles.set(a,s);for(let e of i)e!==a&&this.indicatorEngine.setPane(e,a)}else{this.layoutManager.removePanel(e);for(let e of i)this.indicatorEngine.setPane(e,null)}this.panelInfoCache=null;for(let i of t)r.has(i)&&this.indicatorEngine.setPane(i,n??e),o.add(i)}if(this.indicatorEngine.setPane(e,n),t===`new`){this.layoutManager.addPanel(e,`bottom`);for(let t of this.indicatorEngine.getDependents(e))this.indicatorEngine.getIndicatorConfig(t)?.pane===i&&(this.indicatorEngine.setPane(t,e),o.add(t))}for(let e of o)this.eventBus.emit(`indicatorChange`,{instanceId:e,change:`pane`});return this.updateViewportAndRender(),this.markStateChanged(),!0}setPaneCollapsed(e,t){let n=this.paneOf(e);return this.recordIndicators(n,()=>this.paneChange(n,`collapsed`,()=>this.layoutManager.setPanelCollapsed(n,t)))}isPaneCollapsed(e){return this.layoutManager.isPanelShownCollapsed(this.paneOf(e))}setMaximizedPane(e){let t=e===null?null:this.paneOf(e),n=t??this.layoutManager.getMaximizedPanel()??``;return this.recordIndicators(n,()=>this.paneChange(n,`maximized`,()=>this.layoutManager.setMaximizedPanel(t)))}getMaximizedPane(){return this.layoutManager.getMaximizedPanel()}setPaneScale(e,t){let n=this.paneOf(e);return this.recordIndicators(n,()=>this.paneChange(n,`scale`,()=>this.layoutManager.setPanelScale(n,t)))}getPaneScale(e){let t=this.layoutManager.getPanels().find(t=>t.id===this.paneOf(e));return{log:!!t?.logScale,invert:!!t?.invertScale,percent:!!t?.percentScale}}paneBaseline(e,t,n){let r=this.indicatorEngine.getOutput(e)?.series,i=this.indicatorEngine.getIndicatorDescriptor(e);if(!r||!i)return;let a=i.plots?.[0]?.key;for(let e=Math.max(0,t);e<=n&&e<r.length;e++){let t=r[e];if(!t)continue;let n=a===void 0?Object.values(t).find(e=>typeof e==`number`&&Number.isFinite(e)):t[a];if(typeof n==`number`&&Number.isFinite(n)&&n!==0)return n}}movePane(e,t){let n=this.paneOf(e);return this.recordIndicators(n,()=>this.paneChange(n,`order`,()=>this.layoutManager.movePanel(n,t)))}canMovePane(e,t){return this.layoutManager.canMovePanel(this.paneOf(e),t)}paneOf(e){return this.indicatorEngine.getIndicatorConfig(e)?.pane??e}paneChange(e,t,n){return n()?(this.updateViewportAndRender(),this.eventBus.emit(`paneChange`,{instanceId:e,change:t}),this.markStateChanged(),!0):!1}getIndicatorPanes(){return this.buildPanelRenderInfos().map(e=>({instanceId:e.instanceId,instanceIds:[e.instanceId,...e.members??[]],rect:{...e.rect}}))}setIndicatorValueLabelsVisible(e){this.features.indicatorValueLabels=e,this.syncRenderContext(),this.engine.requestRender()}isIndicatorValueLabelsVisible(){return this.features.indicatorValueLabels}setPaneTitlesVisible(e){this.paneTitles=e,this.engine.requestRender()}getLegendBottom(){let e=this.viewport.getState().chartRect.y;return this.features.legend?e+this.chartLegend.getHeight():e}isTimeAligned(){return _(this.options.chartType)?!1:this.getDisplayData().length===this.series.length()}roundPrice(t){if(!Number.isFinite(t))return t;let n=this.stepAt(t);if(n!==void 0)return Number((Math.round(t/n)*n).toFixed((0,e.stepDecimals)(n)));let{min:r,max:i}=this.viewport.getState().priceRange;return Number(t.toFixed(this.marketPricePrecision??(0,e.autoPricePrecision)(r,i)))}lastClose(){let e=this.series.bars();return e[e.length-1]?.close??0}stepAt(t){let n=this.symbolInfo?.minTick??this.priceUnit??void 0;return n!==void 0&&n>0?n:this.marketConfig?(0,e.priceStepAt)(t,this.marketConfig):void 0}getPriceStep(t){let n=this.stepAt(t??this.lastClose());if(n!==void 0)return n;let{min:r,max:i}=this.viewport.getState().priceRange,a=this.marketPricePrecision??(0,e.autoPricePrecision)(r,i);return Number((10**-a).toFixed(a))}setPriceFormat(e){this.applyPriceFormat(e),this.updateViewportAndRender()}getPriceFormatter(){return this.priceFormatter}applyPriceFormat(t){this.priceFormatter=(0,e.priceFormatterFor)(t),this.priceUnit=t&&typeof t!=`function`?(0,e.fractionTick)(t):null,this.viewport.setPriceFormat(this.priceFormatter,this.priceUnit),this.crosshairTooltip.setPriceFormatter(this.priceFormatter),this.pinnedTooltip.setPriceFormatter(this.priceFormatter)}setTimeFormatter(e){this.applyTimeFormatter(e),this.engine.requestRender()}applyTimeFormatter(e){this.timeAxis.setTimeFormatter(e),this.crosshairHandler.setTimeFormatter(e),this.crosshairTooltip.setTimeFormatter(e)}formatPrice(t){if(this.priceFormatter)return this.priceFormatter(t);let{min:n,max:r}=this.viewport.getState().priceRange;return(0,e.formatPrice)(t,this.marketPricePrecision??(0,e.autoPricePrecision)(n,r),this.numberLocale)}setDrawingTool(e){this.features.drawings&&(e&&this.features.drawingTools.length>0&&!this.features.drawingTools.includes(e)||(e&&this.setZoomAreaMode(!1),this.drawingManager.setActiveTool(e)))}getDrawingTool(){return this.drawingManager.getActiveTool()}setStayInDrawingMode(e){this.drawingManager.setStayInDrawingMode(e)}isStayInDrawingMode(){return this.drawingManager.isStayInDrawingMode()}copyDrawings(){return this.drawingManager.copySelection()}pasteDrawings(){return this.features.drawings?this.drawingManager.paste():[]}canPasteDrawings(){return this.features.drawings!==!1&&this.drawingManager.canPaste()}setDrawingStyle(e){this.drawingManager.setStyle(e)}getDrawingStyle(){return this.drawingManager.getActiveStyle()}getSelectedDrawingId(){return this.drawingManager.getSelectedDrawingId()}setSelectedDrawingStyle(e,t){return this.drawingManager.setSelectedDrawingStyle(e,t)}getDrawings(){return this.drawingManager.getDrawings()}setDrawings(e){this.drawingManager.setDrawings(e),this.dropOrphanDrawingAlerts(),this.announceStateChange()}addDrawing(e){if(!this.features.drawings)return null;let t=this.drawingManager.addDrawing(e);return this.markStateChanged(),t}autoFib(){if(!this.features.drawings)return null;let e=this.getDisplayData(),n=this.viewport.getState(),r=(0,t.findDominantSwing)(e,n.visibleRange.from,n.visibleRange.to);return r?this.addDrawing({type:`fibRetracement`,anchors:[r[0],r[1]]}):null}removeDrawing(e){this.drawingManager.removeDrawing(e)}removeDrawings(e){return this.drawingManager.removeDrawings(e)}getDrawingToolDescriptor(e){let t=this.drawingManager.getDescriptor(e);return t?structuredClone(t):null}getDrawingOptionDefs(e){return this.drawingManager.getOptionDefs(e)}getDrawingOptions(e){return this.drawingManager.getDrawingOptions(e)}setDrawingOptions(e,t){return this.updateDrawing(e,{options:t})}updateDrawing(e,t){let n=this.drawingManager.updateDrawing(e,t);return n&&this.markStateChanged(),n}isDrawingShown(e){return this.drawingManager.isShown(e)}beginDrawingEdit(e){return this.drawingManager.beginEdit(e)}endDrawingEdit(e,t={}){this.drawingManager.endEdit(e,t),this.markStateChanged()}setDrawingToolDefaults(e,t){this.drawingManager.setToolDefaults(e,t)}getDrawingToolDefaults(e){return this.drawingManager.getToolDefaults(e)}setDrawingVisible(e,t){this.drawingManager.setDrawingVisible(e,t)}setDrawingLocked(e,t){this.drawingManager.setDrawingLocked(e,t)}setDrawingsVisible(e,t){this.drawingManager.setDrawingsVisible(e,t)}setDrawingsLocked(e,t){this.drawingManager.setDrawingsLocked(e,t)}clearDrawings(){this.drawingManager.clearDrawings(),this.dropOrphanDrawingAlerts()}registerDrawingTool(e){this.drawingManager.register(e)}undo(){return this.features.drawingUndoRedo?this.drawingManager.undo():!1}redo(){return this.features.drawingUndoRedo?this.drawingManager.redo():!1}selectDrawing(e){let t=this.drawingManager.select(e);return t&&this.engine.requestRender(),t}getUndoRedoState(){return this.undoRedoManager.getState()}recordUndo(e){if(!this.features.drawingUndoRedo||typeof e?.undo!=`function`||typeof e.redo!=`function`)return;let t=performance.now(),n=this.undoRedoManager.last();if(e.subject!==void 0&&n?.type===`custom`&&n.custom?.subject===e.subject&&t-n.custom.at<Ve){this.undoRedoManager.replaceLast({...n,custom:{undo:n.custom.undo,redo:e.redo,subject:e.subject,at:t}});return}this.undoRedoManager.push({type:`custom`,before:null,after:null,custom:{undo:e.undo,redo:e.redo,subject:e.subject,at:t}})}setDrawingMagnet(e){this.setDrawingMagnetMode(e?`weak`:`off`)}getDrawingMagnet(){return this.drawingManager.getMagnetMode()!==`none`}setDrawingMagnetMode(e){let t=this.features.drawingMagnet&&e!==`off`;this.drawingManager.setMagnetMode(t?e===`strong`?`strong`:`magnet`:`none`)}getDrawingMagnetMode(){let e=this.drawingManager.getMagnetMode();return e===`none`?`off`:e===`strong`?`strong`:`weak`}contextAt(e,n){let r={...this.viewport.getState(),data:this.getDisplayData()},i={area:e,x:n.x,y:n.y};if((e===`plot`||e===`priceAxis`)&&(i.price=(0,t.yToPrice)(n.y,r)),(e===`plot`||e===`timeAxis`)&&r.data.length>0&&(i.time=(0,t.xToTime)(n.x,r)),e===`pane`){let e=this.getIndicatorPanes().find(e=>n.y>=e.rect.y&&n.y<=e.rect.y+e.rect.height);e&&(i.pane=e.instanceId)}return i}setPriceAxisAddButton(t){this.features.priceAxisAddButton=t,this.priceAxisAddButton.setEnabled(t&&this.features.crosshair),this.engine.requestRender(e.LayerType.Overlay)}setEraserMode(e){e&&this.setZoomAreaMode(!1),this.drawingManager.setEraser(e&&this.features.drawings)}isEraserMode(){return this.drawingManager.isEraser()}setZoomAreaMode(e){e!==this.zoomAreaMode&&(this.zoomAreaMode=e,e&&(this.drawingManager.setEraser(!1),this.drawingManager.setActiveTool(null)),this.interactionManager?.setZoomAreaMode(e),this.eventBus.emit(`toolModeChange`,{zoomArea:e}))}isZoomAreaMode(){return this.zoomAreaMode}zoomToBox(e){let n={...this.viewport.getState(),data:this.getDisplayData()};this.setVisibleRange((0,t.xToTime)(e.x0,n),(0,t.xToTime)(e.x1,n))}lockAllDrawings(){this.drawingManager.lockAllDrawings()}unlockAllDrawings(){this.drawingManager.unlockAllDrawings()}hideAllDrawings(){this.drawingManager.hideAllDrawings()}showAllDrawings(){this.drawingManager.showAllDrawings()}duplicateDrawing(e){let t=e??this.drawingManager.getSelectedDrawingId();return t?this.drawingManager.duplicateDrawing(t):null}exportVisibleData(e=`csv`,t,n={}){this.features.dataExport&&this.download(e,t,{...n,range:`visible`})}exportAllData(e=`csv`,t,n={}){this.features.dataExport&&this.download(e,t,{...n,range:`all`})}getExportData(e={}){let t=this.series.bars(),n=0,r=t.length-1;if(e.range===`visible`){let{visibleRange:e}=this.viewport.getState();n=Math.max(0,e.from),r=Math.min(t.length-1,e.to)}let i=t.slice(n,r+1);if(e.indicators===!1)return{bars:i,columns:[]};let a=[];for(let e of this.indicatorEngine.getActiveIndicators()){let t=this.indicatorEngine.getOutput(e.instanceId)?.series;if(!t)continue;let r=p(e.id,e.params,e.descriptor.defaultConfig,e.descriptor.shortName),o=e.descriptor.plots??Object.keys(t.find(e=>e)??{}).map(e=>({key:e,title:e}));for(let e of o){let s=o.length>1?` ${e.title??e.key}`:``;a.push({name:`${r}${s}`,values:i.map((r,i)=>t[n+i]?.[e.key]??null)})}}let o=new Map;for(let e of a){let t=(o.get(e.name)??0)+1;o.set(e.name,t),t>1&&(e.name=`${e.name} (${t})`)}return{bars:i,columns:a}}getExportText(e=`csv`,n={}){let{bars:r,columns:i}=this.getExportData(n);return e===`json`?t.DataExporter.toJSON(r,i):t.DataExporter.toCSV(r,i)}download(e,n,r){let i=this.getExportText(e,r);e===`json`?t.DataExporter.download(i,n??`chart-data.json`,`application/json`):t.DataExporter.download(i,n??`chart-data.csv`,`text/csv`)}setAutoSave(e,t=5e3){this.autoSaveScheduler.enable(e,t)}disableAutoSave(){this.autoSaveScheduler.disable()}scheduleAutoSave(){this.autoSaveScheduler.schedule()}markStateChanged(){this.scheduleAutoSave(),this.announceStateChange()}announceStateChange(){this.eventBus.hasListeners(`stateChange`)&&this.eventBus.emit(`stateChange`,{})}getAvailableIndicators(){return this.indicatorEngine.getAvailableIndicators()}getIndicatorInputs(e){let t=this.indicatorEngine.getAvailableIndicators().find(t=>t.id===e);return t?{id:t.id,params:t.defaultConfig}:null}getActiveIndicators(){return this.indicatorEngine.getActiveIndicators()}setIndicatorVisible(e,t){this.recordIndicators(e,()=>this.setIndicatorVisibleNow(e,t))}setIndicatorVisibleNow(e,t){this.indicatorEngine.setVisible(e,t)!==null&&(this.updateViewportAndRender(),this.markStateChanged(),this.eventBus.emit(`indicatorChange`,{instanceId:e,change:`visible`}))}setIndicatorIntervals(e,t){this.recordIndicators(e,()=>this.setIndicatorIntervalsNow(e,t))}setIndicatorIntervalsNow(e,t){this.indicatorEngine.setIntervals(e,t)&&(this.updateViewportAndRender(),this.markStateChanged(),this.eventBus.emit(`indicatorChange`,{instanceId:e,change:`intervals`}))}getIndicatorIntervals(e){return this.indicatorEngine.getIntervals(e)}getIndicatorConfig(e){let t=this.indicatorEngine.getIndicatorConfig(e);return t?{id:t.id,params:{...t.params}}:null}updateIndicatorStyle(e,t){this.recordIndicators(e,()=>this.updateIndicatorStyleNow(e,t))}updateIndicatorStyleNow(t,n){let{plots:r,...i}=n,a=r===void 0?void 0:(0,e.readIndicatorPlotStyles)(r);this.indicatorEngine.updateIndicatorStyle(t,{...i,...a?{plots:a}:{}}),this.engine.requestRender(),this.markStateChanged(),this.eventBus.emit(`indicatorChange`,{instanceId:t,change:`style`})}setOrders(e){this.features.trading&&(this.tradingManager.setOrders(e),this.eventBus.emit(`ordersChange`,{orders:e}))}startBracket(e,t){if(!this.features.trading)return!1;let n=this.series.bars(),r=t??(n.length>0?n[n.length-1].close:null);return r===null?!1:(this.tradingManager.startBracket(e,r),!0)}cancelBracket(){this.features.trading&&this.tradingManager.cancelBracket()}confirmBracket(){return this.features.trading?this.tradingManager.confirmBracket():!1}isBracketActive(){return this.features.trading&&this.tradingManager.isBracketActive()}startOrderDraft(e,t){if(!this.features.trading)return!1;let n=this.series.bars(),r=t??(n.length>0?n[n.length-1].close:null);return r===null?!1:(this.tradingManager.startOrderDraft(e,r),!0)}cancelOrderDraft(){this.features.trading&&this.tradingManager.cancelOrderDraft()}confirmOrderDraft(){return this.features.trading?this.tradingManager.confirmOrderDraft():!1}isOrderDraftActive(){return this.features.trading&&this.tradingManager.isOrderDraftActive()}placeOrderIntent(e){this.features.trading&&this.eventBus.emit(`orderPlace`,e)}setPositions(e){this.features.trading&&(this.tradingManager.setPositions(e),this.eventBus.emit(`positionsChange`,{positions:e}))}getOrders(){return this.tradingManager.getOrders()}getPositions(){return this.tradingManager.getPositions()}getFills(){return this.tradingManager.getFills()}getRealisedPnl(){return this.tradingManager.getRealisedPnl()}addFill(e){this.features.trading&&(this.tradingManager.addFill(e),this.eventBus.emit(`executionFill`,e))}clearFills(){this.tradingManager.setFills([])}cancelOrderIntent(e){this.features.trading&&this.eventBus.emit(`orderCancel`,{orderId:e})}closePositionIntent(e){this.features.trading&&this.eventBus.emit(`positionClose`,{positionId:e})}reversePositionIntent(e){this.features.trading&&this.eventBus.emit(`positionReverse`,{positionId:e})}modifyPositionIntent(e){this.features.trading&&this.eventBus.emit(`positionModify`,e)}setDepthData(e){this.features.trading&&this.tradingManager.setDepthData(e)}setCurrentPrice(e,t){this.followLivePrice(e),this.replaySession?this.replaySession.price={price:e}:(this.currentPriceLine.setPrice(e),this.scheduleRender())}replayTrades(){return this.replaySession!==null&&this.executionAdapter?.setMarkPrice!==void 0}takeLivePrice(e){this.followLivePrice(e),this.replaySession?this.replaySession.price={price:e}:this.currentPriceLine.setPrice(e)}emitBars(e){this.eventBus.emit(`dataUpdate`,{kind:`bars`,length:e})}followLivePrice(e){this.replayTrades()||this.tradingManager.setCurrentPrice(e),this.features.alerts&&this.checkAlerts(e)}checkAlerts(e){let t=this.replaySession?this.series.liveBars():this.series.bars();this.alertManager.setBarTime(t.length>0?t[t.length-1].time:null);let n=new Map([[`price`,e]]);this.replaySession||this.collectIndicatorValues(n),this.alertManager.checkChannels(n,{together:!0}),this.alertManager.checkDrawings(e)}collectIndicatorValues(e){let t=this.series.bars();if(t.length===0)return;let n=t.length-1,r=this.alertManager.getAlerts().flatMap(e=>e.target?[e.channel,e.target]:[e.channel]);for(let t of r){if(e.has(t))continue;let r=t.indexOf(`:`);if(r<0)continue;let i=this.indicatorEngine.getOutput(t.slice(0,r))?.series?.[n]?.[t.slice(r+1)];typeof i==`number`&&Number.isFinite(i)&&e.set(t,i)}}setTradingConfig(e){this.features.trading&&this.tradingManager.setConfig(e)}async connect(n){if(!(0,t.servesTimeframe)(n.adapter,n.timeframe))throw RangeError(`${n.adapter.name} cannot serve the ${n.timeframe} timeframe`);this.snapshotKey=null,this.replayStop(),this.disconnectStream(),this.streamManager=new t.StreamManager,this.streamManager.setTimeZone(this.studyZoneHeld?this.studyZone:this.getExchangeTimeZone()),this.streamManager.on(`snapshot`,e=>{let t=this.streamSeriesKey(n.adapter);this.replaySession?this.series.loadAside(e):t===this.snapshotKey&&this.series.length()>0?this.mergeSnapshot(e):this.setData(e),this.snapshotKey=t,this.useStreamHistory(n.adapter,n.historyPageSize)}),this.streamManager.on(`barClose`,e=>{if(!y(e))return;let t=this.series.placeStreamBar(e);if(t.refiltered&&(this.displayDataCache=null),t.to===`none`){this.updateBar(e);return}if(t.to===`aside`&&this.followLivePrice(e.close),t.to!==`shown`)return;let n=this.autoScrollOnNewBar&&this.viewport.isAtEnd(),r=t.before,i=this.series.bars();this.crosshairHandler.setData(i),this.displayDataCache=null,this.recalcIndicatorsFrom(i,i.length-2),this.updateViewportAndRender(n),i.length!==r&&this.emitBars(i.length),this.followLivePrice(e.close)}),this.streamManager.on(`barCorrection`,e=>{this.updateBar(e)}),this.streamManager.on(`barUpdate`,e=>{if(!y(e))return;let t=this.series.placeStreamBar(e);if(t.refiltered&&(this.displayDataCache=null),t.to===`none`||(this.replaySession||this.currentPriceLine.setPrice(e.close),this.replaySession))return;let n=t.before;if(t.to!==`shown`){this.scheduleRender();return}let r=this.series.bars();this.indicatorEngine.deferRecalculateFrom(r,r.length-1),this.announceIndicatorUpdate(r.length-1),r.length!==n&&this.emitBars(r.length),this.scheduleRender()}),this.setBidAsk(null),this.streamManager.on(`quote`,e=>{let t=this.priceLines.getBidAsk();this.setBidAsk({bid:e.bid??t?.bid,ask:e.ask??t?.ask})}),this.streamManager.on(`priceChange`,({price:t,previousClose:n})=>{if(!(!Number.isFinite(t)||t<0)){if(this.followLivePrice(t),this.replaySession){this.replaySession.price={price:t,previousClose:n??void 0};return}this.currentPriceLine.setPrice(t,n??void 0),this.engine.requestRender(e.LayerType.Overlay)}}),this.streamManager.on(`connectionChange`,e=>{this.eventBus.emit(`dataUpdate`,{kind:`connection`,connection:e})}),this.streamManager.on(`error`,e=>{this.eventBus.emit(`dataUpdate`,{kind:`error`,error:e.message})}),this.streamManager.on(`symbolInfo`,e=>this.applyFeedSymbolInfo(e)),this.autoScrollOnNewBar=n.autoScroll!==!1,this.setStreamTarget(n.symbol,n.timeframe),this.streamAdapter=n.adapter;let r=this.streamManager;if(this.resolveStreamSymbol(n.adapter,n.symbol),await r.connect(n),this.streamManager!==r)return;let i=(0,e.timeframeToMs)(n.timeframe);this.barCountdown.setTimeframeMs(i),this.countdownInterval&&clearInterval(this.countdownInterval),this.countdownInterval=setInterval(()=>{this.barCountdown.isVisible()&&this.engine.requestRender(e.LayerType.Hover)},1e3)}streamSeriesKey(e){let n=(0,t.withResampling)(e),r=this.streamTimeframe,i=n instanceof t.ResamplingAdapter&&r!==null?n.bucketFor(this.currentSymbol,r):null;return`${this.currentSymbol}|${r}|${i?.timeZone??``}`}setStreamTarget(t,n){let r=this.announcedSymbol;this.currentSymbol=t,this.streamTimeframe=n,this.tickStream=(0,e.tickBarCount)(n)!==null,this.applyTimeSpacing(),t!==r&&this.chartLegend.setSymbol(t),t!==r&&(this.announcedSymbol=t,this.eventBus.emit(`symbolChange`,{symbol:t,previous:r})),this.useTimeframe(n)}setDataTimeframe(t){this.streamManager||(this.useTimeframe(t),this.engine.requestRender(e.LayerType.Hover))}useTimeframe(e){let t=this.announcedTimeframe;this.chartLegend.setTimeframe(e??``),this.indicatorEngine.setTimeframe(e)&&this.updateViewportAndRender(),this.drawingManager.setTimeframe(e),e!==t&&(this.announcedTimeframe=e,e&&this.eventBus.emit(`timeframeChange`,{timeframe:e,previous:t}))}async switchStream(n,r){if(!this.streamManager)return;let i=this.streamAdapter;if(i&&!(0,t.servesTimeframe)(i,r))throw RangeError(`${i.name} cannot serve the ${r} timeframe`);this.setStreamTarget(n,r),this.historyFromStream&&this.history.setLoader(null),this.barCountdown.setTimeframeMs((0,e.timeframeToMs)(r)),i&&this.resolveStreamSymbol(i,n),await this.streamManager.switchTo(n,r)}isIndicatorAllowed(e){let t=this.features.indicatorIds;return this.features.indicators&&(t.length===0||t.includes(e))}isTimeframeAllowed(e){let t=this.features.timeframes;return t.length===0||t.includes(e)}async setTimeframe(e){if(!this.streamManager)throw Error(`No active stream. Call connect() first.`);this.isTimeframeAllowed(e)&&await this.switchStream(this.currentSymbol,e)}disconnectStream(){this.symbolInfoSeq++,this.releaseStudyZoneAfterCaller(),this.priceLines.setBidAsk(null),this.streamManager&&=(this.streamManager.dispose(),null),this.historyFromStream&&=(this.history.setLoader(null),!1),this.streamAdapter=null,this.tickStream=!1,this.applyTimeSpacing()}connectExecution(e,t={}){if(!this.features.trading)throw Error(`connectExecution requires features.trading to be enabled`);this.disconnectExecution(),this.executionAdapter=e,this.execTeardown=Le(e,{onIntent:(e,t)=>{let n=e=>t(e.payload);return this.eventBus.on(e,n),()=>this.eventBus.off(e,n)},setOrders:e=>this.setOrders(e),setPositions:e=>this.setPositions(e),onError:e=>this.eventBus.emit(`executionError`,e),onFill:e=>{this.tradingManager.addFill(e),this.eventBus.emit(`executionFill`,e)},getPositions:()=>this.tradingManager.getPositions()}),Promise.resolve(e.connect(t)).catch(e=>this.eventBus.emit(`executionError`,{message:`Execution connect failed`,cause:e}))}disconnectExecution(){this.returnMarkToLive(),this.execTeardown&&=(this.execTeardown(),null),this.executionAdapter&&=(this.executionAdapter.disconnect(),null)}getExecutionAdapter(){return this.executionAdapter}setBarCountdownVisible(t){this.barCountdown.setVisible(t&&this.features.barCountdown),this.engine.requestRender(e.LayerType.Hover)}isBarCountdownVisible(){return this.barCountdown.isVisible()}setSessionBreaksVisible(t){this.sessionBreaks.setVisible(t),this.engine.requestRender(e.LayerType.Background)}addCompareSymbol(e,t,n,r){this.features.compareSymbols&&(this.compareRenderer.addSymbol({id:e,label:t,data:n,color:r,visible:!0}),this.updateViewportAndRender(),this.eventBus.emit(`compareChange`,{id:e,change:`add`}))}removeCompareSymbol(e){this.compareRenderer.removeSymbol(e),this.updateViewportAndRender(),this.eventBus.emit(`compareChange`,{id:e,change:`remove`})}updateCompareData(e,t){this.compareRenderer.setSymbolData(e,t),this.updateViewportAndRender(),this.eventBus.emit(`compareChange`,{id:e,change:`data`})}setCompareMode(e){this.compareRenderer.setMode(e),this.updateViewportAndRender()}setCompareVisible(e,t){this.compareRenderer.setSymbolVisible(e,t),this.updateViewportAndRender(),this.eventBus.emit(`compareChange`,{id:e,change:`visible`})}getCompareValues(e){if(!this.comparesDrawn()){let e=this.series.bars();return this.compareRenderer.valuesAt(e,null,e.length-1)}let t=this.getDisplayData();return this.compareRenderer.valuesAt(t,this.viewport.getState(),e??t.length-1)}comparesDrawn(){return this.isTimeAligned()}clearCompareSymbols(){let e=this.compareRenderer.getSymbols().map(e=>e.id);this.compareRenderer.clear(),this.updateViewportAndRender();for(let t of e)this.eventBus.emit(`compareChange`,{id:t,change:`remove`})}setLogScale(e){e&&!this.features.logScale||(this.viewport.setLogScale(e),this.updateViewportAndRender())}isLogScale(){return this.viewport.isLogScale()}setInvertScale(e){this.viewport.setInvertScale(e),this.updateViewportAndRender()}isInvertScale(){return this.viewport.isInvertScale()}setScaleMode(e){e===`logarithmic`&&!this.features.logScale||(this.viewport.setScaleMode(e),this.updateViewportAndRender())}getScaleMode(){return this.viewport.getScaleMode()}setSessionBreaksConfig(t){this.sessionBreaks.setConfig(t),this.engine.requestRender(e.LayerType.Background)}getConnectionState(){return this.streamManager?.getConnectionState()??`disconnected`}getConnectionInfo(){return this.streamManager?.getConnectionInfo()??{state:`disconnected`}}setAutoScroll(e){this.autoScrollOnNewBar=e}scrollTo(e){let t=this.series.bars();for(let n=0;n<t.length;n++)if(t[n].time>=e){let e=this.viewport.getState().barWidth+this.viewport.getState().barSpacing;this.viewport.scrollBy(n*e-this.viewport.getState().offset),this.updateViewportAndRender();return}}goToTime(e){let n=this.getDisplayData();if(n.length===0||!Number.isFinite(e))return-1;let r=Math.max(0,Math.min(n.length-1,Math.floor((0,t.timestampToBarIndex)(e,n)))),i=this.viewport.getState(),a=r*(i.barWidth+i.barSpacing)+i.barWidth/2-i.chartRect.width/2;return this.viewport.scrollBy(a-i.offset),this.updateViewportAndRender(),r}setVisibleRangePreset(n){let r=this.getDisplayData();if(r.length===0)return;let i=r.length-1,a=(0,e.barTimeUnit)(r),o=(0,t.rangePresetStart)(n,r[i].time*a,this.displayTz),s=o===null?null:o/a;if(s===null||s<r[0].time){this.fitContent();return}let c=(0,t.timestampToBarIndex)(s,r),l=Math.min(i,n===`YTD`?Math.ceil(c):Math.floor(c)+1);this.viewport.zoomToBarRange(l,i+this.viewport.getRightMargin()),this.viewport.scrollToEnd(),this.updateViewportAndRender()}scrollToEnd(){this.viewport.scrollToEnd(),this.updateViewportAndRender()}scrollBars(e){if(!Number.isFinite(e)||e===0)return;let{barWidth:t,barSpacing:n}=this.viewport.getState();this.viewport.scrollBy(e*(t+n)),this.updateViewportAndRender()}getVisibleTimeRange(){let e=this.getDisplayData();if(e.length===0)return null;let{offset:t,barWidth:n,barSpacing:r,chartRect:i}=this.viewport.getState(),a=n+r;if(a<=0)return null;let o=Math.ceil((t-n/2)/a),s=Math.floor((t+i.width-n/2)/a),c=t=>e[Math.max(0,Math.min(e.length-1,t))].time;return{from:c(o),to:c(Math.max(o,s))}}setVisibleRange(e,n){let r=this.getDisplayData();if(r.length===0)return;let i=(0,t.timestampToBarIndex)(Math.min(e,n),r),a=(0,t.timestampToBarIndex)(Math.max(e,n),r);this.viewport.zoomToBarRange(i,a),this.updateViewportAndRender()}suspend(){this.setPaused(`host`,!0)}resume(){this.setPaused(`host`,!1)}isSuspended(){return this.pausedFor.host||this.pausedFor.page||this.pausedFor.offscreen}setPaused(e,t){let n=this.isSuspended();this.pausedFor={...this.pausedFor,[e]:t};let r=this.isSuspended();if(!(n===r||this.disposed)){if(r){this.engine.renderLoop.pause();return}this.renderDeferred&&(this.renderDeferred=!1,this.scheduleRender()),this.engine.renderLoop.resume()}}watchVisibility(e,t){let n=[];if(t&&typeof IntersectionObserver<`u`){let t=new IntersectionObserver(e=>{let t=e[e.length-1];t&&this.setPaused(`offscreen`,!t.isIntersecting)});t.observe(e),n.push(()=>t.disconnect())}if(typeof document<`u`){let e=()=>{t&&this.setPaused(`page`,document.hidden),document.hidden||this.streamManager?.wake(`visible`)};document.addEventListener(`visibilitychange`,e),n.push(()=>document.removeEventListener(`visibilitychange`,e)),t&&document.hidden&&this.setPaused(`page`,!0)}if(typeof window<`u`){let e=()=>this.streamManager?.wake(`online`);window.addEventListener(`online`,e),n.push(()=>window.removeEventListener(`online`,e))}this.stopWatchingVisibility=()=>n.forEach(e=>e())}setPageScroll(e){this.options.pageScroll=e,this.interactionManager.setPageScroll(e)}getPageScroll(){return this.options.pageScroll??!1}setMaxPixelRatio(e){this.engine.dprManager.setMaxPixelRatio(e)}getMaxPixelRatio(){return this.engine.dprManager.getMaxPixelRatio()}setMinBarUnit(e){this.viewport.setMinBarUnit(e),this.updateViewportAndRender()}getMinBarUnit(){return this.viewport.getMinBarUnit()}setPanLimits(e){this.viewport.setPanLimits(e),this.updateViewportAndRender()}zoomIn(){let e=this.viewport.getState().chartRect.width;this.viewport.zoom(.2,e/2),this.updateViewportAndRender()}zoomOut(){let e=this.viewport.getState().chartRect.width;this.viewport.zoom(-.2,e/2),this.updateViewportAndRender()}fitContent(){let e=this.getDisplayData().length;e!==0&&(this.viewport.zoomToBarRange(0,e-1+this.viewport.getRightMargin()),this.viewport.scrollToEnd(),this.updateViewportAndRender())}on(e,t){this.eventBus.on(e,t)}off(e,t){this.eventBus.off(e,t)}enableTauriBridge(e){this.eventBus.enableTauriBridge({enabled:!0,...e})}disableTauriBridge(){this.eventBus.disableTauriBridge()}setTheme(e){this.themeManager.setTheme(e),this.syncRenderContext(),this.container.style.backgroundColor=this.themeManager.getTheme().background,this.lastBackground=this.themeManager.getTheme().background,this.engine.requestRender(),this.eventBus.emit(`themeChange`,{theme:e}),this.markStateChanged()}getTheme(){return this.themeManager.getBaseTheme()}applyOverrides(e,t={}){this.applyStyle(e,t.layer??`host`,!0)}setOverrides(t,n={}){let r=n.layer??`host`,{overrides:i,rejected:a}=(0,e.readChartStyleOverrides)(t);a.length>0&&console.warn(`Style overrides left out (unknown key or value): ${a.join(`, `)}`);let o=Object.fromEntries(Object.entries(i).filter(([,e])=>e!==null));this.themeManager.setOverrides(o,r)&&this.styleChanged(r)}resetOverrides(e,t={}){let n=t.layer??`host`;this.themeManager.resetOverrides(n,e)&&this.styleChanged(n)}getOverrides(e={}){return this.themeManager.getOverrides(e.layer??`host`)}getStyle(){return this.themeManager.getTheme().style}getStyleValue(e){return this.themeManager.getStyleValue(e)}applyStyle(t,n,r){let{overrides:i,rejected:a}=(0,e.readChartStyleOverrides)(t);a.length>0&&console.warn(`Style overrides left out (unknown key or value): ${a.join(`, `)}`),this.themeManager.applyOverrides(i,n)&&r&&this.styleChanged(n)}styleChanged(e){this.syncRenderContext();let t=this.themeManager.getTheme().background;t!==this.lastBackground&&(this.container.style.backgroundColor=t,this.lastBackground=t),this.engine.requestRender(),this.eventBus.emit(`styleChange`,{layer:e}),e===`user`&&this.markStateChanged()}setWatermark(t,n){this.watermark.setConfig({text:t,...n}),this.engine.requestRender(e.LayerType.Background)}setAutoScale(e){this.options.autoScale=e,this.defaultAutoScale=e,!e&&this.series.length()>0&&(this.seriesArriving=!1),this.updateViewportAndRender()}holdPriceScale(){this.options.autoScale=!1,this.priceFitPending=!1}isAutoScale(){return this.options.autoScale!==!1}setCrosshairMode(t){this.crosshairHandler.setMode(t),this.engine.requestRender(e.LayerType.Hover)}getCrosshairMode(){return this.crosshairHandler.getMode()}setCrosshairPosition(t){t?this.crosshairHandler.onPointerMove(t):this.crosshairHandler.onPointerLeave(),this.engine.requestRender(e.LayerType.Hover)}setCrosshairTime(n){let r=this.getDisplayData(),i=n===null||r.length===0?null:Math.floor((0,t.timestampToBarIndex)(n,r));i!==this.crosshairHandler.getSyncedSlot()&&(this.crosshairHandler.setSyncedSlot(i),this.engine.requestRender(e.LayerType.Hover))}getData(){return this.series.bars()}setGridVisible(t){this.gridRenderer.setVisible(t),this.engine.requestRender(e.LayerType.Background)}isGridVisible(){return this.gridRenderer.isVisible()}setVolumeVisible(e){this.volumeRenderer.setVisible(e),this.updateViewportAndRender()}isVolumeVisible(){return this.features.volume&&this.volumeRenderer.isVisible()}setVolumeProfileVisible(t){this.volumeProfile.setVisible(t),this.engine.requestRender(e.LayerType.Main)}isVolumeProfileVisible(){return this.volumeProfile.isVisible()}setVolumeProfileConfig(t){t.buckets!==void 0&&this.volumeProfile.setBuckets(t.buckets),t.widthRatio!==void 0&&this.volumeProfile.setWidthRatio(t.widthRatio),t.opacity!==void 0&&this.volumeProfile.setOpacity(t.opacity),t.highlightPoC!==void 0&&this.volumeProfile.setHighlightPoC(t.highlightPoC),this.engine.requestRender(e.LayerType.Main)}setMarketProfileVisible(t){this.marketProfile.setVisible(t),this.engine.requestRender(e.LayerType.Main)}isMarketProfileVisible(){return this.marketProfile.isVisible()}setMarketProfileConfig(t){t.buckets!==void 0&&this.marketProfile.setBuckets(t.buckets),t.widthRatio!==void 0&&this.marketProfile.setWidthRatio(t.widthRatio),t.opacity!==void 0&&this.marketProfile.setOpacity(t.opacity),t.valueAreaPct!==void 0&&this.marketProfile.setValueAreaPct(t.valueAreaPct),t.highlightPoC!==void 0&&this.marketProfile.setHighlightPoC(t.highlightPoC),t.showStats!==void 0&&this.marketProfile.setShowStats(t.showStats),t.splitBySession!==void 0&&this.marketProfile.setSplitBySession(t.splitBySession),t.letters!==void 0&&this.marketProfile.setLetters(t.letters),this.engine.requestRender(e.LayerType.Main)}getMarketProfileConfig(){return this.marketProfile.getConfig()}getMarketProfileStats(){return this.marketProfile.getStats()}setDepthHeatmapVisible(t){this.depthHeatmap.setVisible(t),this.engine.requestRender(e.LayerType.Main)}isDepthHeatmapVisible(){return this.depthHeatmap.isVisible()}setDepthHeatmapConfig(t){t.opacity!==void 0&&this.depthHeatmap.setOpacity(t.opacity),t.capacity!==void 0&&this.depthHeatmap.setCapacity(t.capacity),this.engine.requestRender(e.LayerType.Main)}getDepthHeatmapConfig(){return this.depthHeatmap.getConfig()}pushDepthSnapshot(t,n){let r=this.series.bars(),i=n??r[r.length-1]?.time;i===void 0||!Number.isFinite(i)||(this.depthHeatmap.push(i,t),this.depthHeatmap.isVisible()&&this.engine.requestRender(e.LayerType.Main))}clearDepthHeatmap(){this.depthHeatmap.clear(),this.engine.requestRender(e.LayerType.Main)}setPeriodLevelsVisible(t){this.periodLevels.setVisible(t),this.engine.requestRender(e.LayerType.Main)}isPeriodLevelsVisible(){return this.periodLevels.isVisible()}setPeriodLevelsPeriod(t){this.periodLevels.setPeriod(t),this.engine.requestRender(e.LayerType.Main)}getPeriodLevelsPeriod(){return this.periodLevels.getPeriod()}setTimeZone(e){U(e),this.timeZoneSetting=e,this.applyTimeZone()}getTimeZone(){return this.timeZoneSetting}getEffectiveTimeZone(){return this.displayTz}getExchangeTimeZone(){return[(0,e.symbolTimeZone)(this.symbolInfo),this.marketConfig?.timeZone].find(t=>t&&(0,e.isValidTimeZone)(t))??null}setTimezone(e){this.setTimeZone(e)}getTimezone(){return this.getTimeZone()}getEffectiveTimezone(){return this.getEffectiveTimeZone()}getExchangeTimezone(){return this.getExchangeTimeZone()}setTimezoneOffset(e){this.setTimeZone(e)}applyExchangeZone(){let e=this.getExchangeTimeZone();this.timeAxis.setExchangeTimeZone(e),this.crosshairHandler.setExchangeTimeZone(e),this.crosshairTooltip.setExchangeTimeZone(e),this.pinnedTooltip.setExchangeTimeZone(e),this.studyZoneHeld||this.applyStudyZone(e)}applyStudyZone(e){this.studyZone=e,this.streamManager?.setTimeZone(e),this.periodLevels.setExchangeTimeZone(e),this.marketProfile.setExchangeTimeZone(e);let t=this.series.bars();this.indicatorEngine.setExchangeTimeZone(e,t.length>0?t:void 0)&&t.length>0&&this.announceIndicatorUpdate(0)}holdStudyZone(){this.endStudyZoneWait(),this.studyZoneHeld=!0,this.studyZoneTimer=setTimeout(()=>this.releaseStudyZone(),t.SYMBOL_ZONE_WAIT_MS)}endStudyZoneWait(){this.studyZoneReleaseQueued=!1,this.studyZoneTimer!==null&&(clearTimeout(this.studyZoneTimer),this.studyZoneTimer=null)}releaseStudyZone(){this.endStudyZoneWait(),this.studyZoneHeld&&(this.studyZoneHeld=!1,this.applyStudyZone(this.getExchangeTimeZone()),this.disposed||this.updateViewportAndRender())}releaseStudyZoneAfterCaller(){this.studyZoneHeld&&(this.endStudyZoneWait(),this.studyZoneReleaseQueued=!0,queueMicrotask(()=>{!this.studyZoneReleaseQueued||this.disposed||this.releaseStudyZone()}))}spokenBarTime(t){let n=this.getDisplayData(),r=t*(0,e.barTimeUnit)(n),i=this.numberLocale||`en-US`;return(0,e.barsAreDaily)(n)===!0?(0,e.zonedDateFormatter)(i,{dateStyle:`medium`},(0,e.barDateZone)(r,this.displayTz,this.getExchangeTimeZone()))(r):(0,e.zonedDateFormatter)(i,{dateStyle:`medium`,timeStyle:`short`},this.displayTz)(r)}applyTimeZone(){let e=this.timeZoneSetting===`exchange`?this.getExchangeTimeZone()??`UTC`:this.timeZoneSetting;this.displayTz=e,this.timeAxis.setTimezoneOffset(e),this.crosshairHandler.setTimezoneOffset(e),this.crosshairTooltip.setTimezoneOffset(e),this.pinnedTooltip.setTimezone(e),this.sessionBreaks.setTimezone(e),this.engine.requestRender()}setSymbolInfo(e){this.studyZoneHeld=!1,this.endStudyZoneWait(),this.useSymbolInfo(e)}useSymbolInfo(t){let n=t&&this.symbolInfo?.symbol===t.symbol?(0,e.symbolTimeZone)(this.symbolInfo):void 0;this.symbolInfo=t?W({...t,sessions:t.sessions?.map(e=>({...e}))},n):null,this.chartLegend.setExchange(this.symbolInfo?.exchange??``),this.engine.requestRender(e.LayerType.Hover),this.priceAxis.setPriceTick(this.symbolInfo?.minTick??null),this.marketConfig?.pricePrecision===void 0&&this.applyPricePrecision(this.symbolInfo?.pricePrecision??null);let r=(this.symbolInfo?.sessions??[]).flatMap(t=>{let n=(0,e.sessionMinute)(t.start),r=(0,e.sessionMinute)(t.end);return n===null||r===null?[]:[{startMinute:n,endMinute:r}]}),i=(0,e.symbolTimeZone)(this.symbolInfo);this.sessionShading.replaceConfig(r.length>0&&i&&(0,e.isValidTimeZone)(i)?{timeZone:i,windows:r,startMinute:r[0].startMinute,endMinute:r[r.length-1].endMinute}:this.hostSessionHours),this.timeZoneSetting===`exchange`&&this.applyTimeZone(),this.applyExchangeZone(),this.reapplyExtendedHours(),this.updateViewportAndRender(),this.eventBus.emit(`symbolInfoChange`,{info:this.symbolInfo})}getSymbolInfo(){return this.symbolInfo}applyFeedSymbolInfo(t){if(!t||typeof t!=`object`)return;let n=this.currentSymbol,r=e=>!e||e.toUpperCase()===n.toUpperCase();if(!r(t.symbol))return;let i=this.symbolInfo&&r(this.symbolInfo.symbol)?this.symbolInfo:null,a=W({...i,...t,symbol:t.symbol||i?.symbol||n},(0,e.symbolTimeZone)(i));i&&JSON.stringify(a)===JSON.stringify(i)||(this.symbolInfoSeq++,this.setSymbolInfo(a))}resolveStreamSymbol(e,n){let r=(0,t.withResampling)(e),i=r.resolveSymbol?.bind(r);if(this.symbolInfo&&this.symbolInfo.symbol!==n?(i?this.holdStudyZone():this.studyZoneHeld=!1,this.useSymbolInfo(null)):i&&this.studyZoneHeld&&this.holdStudyZone(),!i){this.releaseStudyZone();return}let a=++this.symbolInfoSeq;Promise.resolve().then(()=>i(n)).then(e=>{a===this.symbolInfoSeq&&(e&&this.currentSymbol===n?this.setSymbolInfo(e):this.releaseStudyZone())},e=>{a===this.symbolInfoSeq&&(this.releaseStudyZone(),console.warn(`No symbol info for "${n}":`,e))})}setPivotMarkersVisible(t){this.pivotMarkers.setVisible(t),this.engine.requestRender(e.LayerType.Overlay)}isPivotMarkersVisible(){return this.pivotMarkers.isVisible()}setPivotMarkersConfig(t){(t.left!==void 0||t.right!==void 0)&&this.pivotMarkers.setStrength(t.left??5,t.right??t.left??5),t.showLabels!==void 0&&this.pivotMarkers.setShowLabels(t.showLabels),t.structureLabels!==void 0&&this.pivotMarkers.setStructureLabels(t.structureLabels),this.engine.requestRender(e.LayerType.Overlay)}getPivotMarkersConfig(){return this.pivotMarkers.getConfig()}setSessionShadingVisible(t){this.sessionShading.setVisible(t),this.engine.requestRender(e.LayerType.Background)}isSessionShadingVisible(){return this.sessionShading.isVisible()}setSessionShadingConfig(n){this.hostSessionHours=(0,t.mergeSessionHours)(this.hostSessionHours,n),this.sessionShading.replaceConfig(this.hostSessionHours),this.engine.requestRender(e.LayerType.Background)}setTooltipVisible(e){e||this.crosshairTooltip.hide()}setLegend(t){this.chartLegend.setConfig(t),this.engine.requestRender(e.LayerType.Hover)}isLegendVisible(){return this.features.legend&&this.chartLegend.getConfig().visible}setSymbolName(t){this.chartLegend.setSymbol(t),this.engine.requestRender(e.LayerType.Hover)}setStatusText(t){this.chartLegend.setStatusText(t),this.engine.requestRender(e.LayerType.Hover)}async setRenderer(e){let t=++this.rendererToken;return this.waitForGpu(null),e===`canvas`?(this.applyRenderer(null),`canvas`):this.engine.getGpu()?`webgl`:this.takeGpu(e,t,!0)}async takeGpu(e,n,r){let{gpu:i,reason:a}=await(0,t.loadWebGL)(e);return n!==this.rendererToken||this.disposed?(i?.destroy(),this.getRenderer()):a===`limit`?(0,t.gpuContextsLeft)()>0?this.takeGpu(e,n,r):(this.waitForGpu(()=>void this.takeGpu(e,n,!1)),r&&this.applyRenderer(null,`limit`),this.getRenderer()):((i||r)&&this.applyRenderer(i,a),this.getRenderer())}waitForGpu(e){this.stopWaitingForGpu?.(),this.stopWaitingForGpu=e?(0,t.whenGpuContextFree)(e):null}getRenderer(){return this.engine.getGpu()?`webgl`:`canvas`}applyRenderer(e,t){let n=this.getRenderer();e?this.engine.attachGpu(e):this.engine.detachGpu();let r=this.getRenderer();(r!==n||t)&&this.eventBus.emit(`rendererChange`,t?{renderer:r,reason:t}:{renderer:r})}freshFrame(){if(this.isSuspended()){this.renderDeferred&&(this.renderDeferred=!1,this.refitForTick()),this.engine.renderNow();return}this.engine.getGpu()&&this.engine.renderNow()}screenshot(e){this.features.screenshot&&(this.freshFrame(),t.Screenshot.download(this.container,e,this.themeManager.getTheme().background))}async copyScreenshot(){if(!this.features.screenshot)return!1;let e=globalThis.ClipboardItem,n=typeof navigator>`u`?void 0:navigator.clipboard;if(!n?.write||!e)return!1;try{this.freshFrame();let r=t.Screenshot.toBlob(this.container,this.themeManager.getTheme().background).then(e=>{if(!e)throw Error(`No chart image to copy`);return e});r.catch(()=>{});let i;try{i=new e({"image/png":r})}catch(t){if(!(t instanceof TypeError))throw t;i=new e({"image/png":await r})}return await n.write([i]),!0}catch{return!1}}screenshotDataURL(){return this.features.screenshot?(this.freshFrame(),t.Screenshot.toDataURL(this.container,this.themeManager.getTheme().background)):null}async screenshotBlob(){return this.features.screenshot?(this.freshFrame(),t.Screenshot.toBlob(this.container,this.themeManager.getTheme().background)):null}addAlert(e,t=`crossing`,n,r=`price`,i,a={}){if(!this.features.alerts)return null;let o=this.alertManager.addAlert(e,t,n,!1,r,i,a);return this.markStateChanged(),o}removeAlert(e){this.alertManager.removeAlert(e),this.markStateChanged()}getSelectedDrawingIds(){return this.drawingManager.getSelectedDrawingIds()}moveDrawing(e,t){let n=this.drawingManager.moveDrawing(e,t);return n&&this.markStateChanged(),n}groupDrawings(e,t){let n=this.drawingManager.groupDrawings(e,t);return n&&this.markStateChanged(),n}ungroupDrawings(e){return this.afterDrawingChange(this.drawingManager.ungroup(e))}renameDrawingGroup(e,t){return this.afterDrawingChange(this.drawingManager.renameGroup(e,t))}setDrawingGroupVisible(e,t){return this.afterDrawingChange(this.drawingManager.setGroupVisible(e,t))}setDrawingGroupLocked(e,t){return this.afterDrawingChange(this.drawingManager.setGroupLocked(e,t))}getDrawingGroups(){return this.drawingManager.getGroups()}afterDrawingChange(e){return e&&this.markStateChanged(),e}canAddDrawingAlert(e){return this.features.alerts&&this.drawingLevelsNow(e)!==null}drawingLevelsNow(e){let t=this.replaySession?this.series.liveBars():this.getDisplayData();if(t.length===0)return null;let n={...this.viewport.getState(),data:t};return this.drawingManager.priceAt(e,t[t.length-1].time,n)}followDrawingAlerts(e,t){if(!(!t||!this.alertManager)){if(e===`drawingRemove`){let e=this.alertManager.takeDrawingAlerts(t);e.length>0&&this.removedDrawingAlerts.set(t,e)}else if(e===`drawingCreate`){let e=this.removedDrawingAlerts.get(t);if(!e)return;this.removedDrawingAlerts.delete(t),this.alertManager.restoreAlerts(e)}}}dropOrphanDrawingAlerts(){this.removedDrawingAlerts.clear(),this.alertManager&&this.alertManager.pruneDrawingAlerts(new Set(this.drawingManager.getDrawings().map(e=>e.id)))>0&&this.markStateChanged()}addDrawingAlert(e,t={}){if(!this.canAddDrawingAlert(e))return null;let n=this.alertManager.addDrawingAlert(e,t.condition??`crossing`,t.message,t.repeating??!1,t.label);return this.markStateChanged(),n}getAlerts(){return this.alertManager.getAlerts()}clearAlerts(){this.alertManager.clearAlerts(),this.markStateChanged()}saveAlerts(e){this.alertManager.saveToStorage(e)}loadAlerts(t){this.alertManager.loadFromStorage(t),this.alertManager.pruneDrawingAlerts(new Set(this.drawingManager.getDrawings().map(e=>e.id))),this.engine.requestRender(e.LayerType.Overlay)}addSignalMarker(e){return this.signalMarkerManager.addMarker(e)}removeSignalMarker(e){this.signalMarkerManager.removeMarker(e)}getSignalMarkers(){return this.signalMarkerManager.getMarkers()}setSignalMarkers(e){this.signalMarkerManager.setMarkers(e)}clearSignalMarkers(){this.signalMarkerManager.clearMarkers()}setSignalMarkerStyle(e){this.signalMarkerManager.setStyle(e)}addTradeZone(e){return this.tradeZoneManager.addZone(e)}updateTradeZone(e,t){this.tradeZoneManager.updateZone(e,t)}removeTradeZone(e){this.tradeZoneManager.removeZone(e)}getTradeZones(){return this.tradeZoneManager.getZones()}setTradeZones(e){this.tradeZoneManager.setZones(e)}clearTradeZones(){this.tradeZoneManager.clearZones()}setTradeZoneStyle(e){this.tradeZoneManager.setStyle(e)}replayStart(e){if(!this.features.replay)return;this.history.reset();let t=this.replaySession?this.replayOffset:0;if(!this.replaySession){if(this.series.length()===0)return;this.series.beginReplay(),this.replaySession={price:null,fedTime:null}}let{steps:n,startTime:r,hideHistory:i,revealMarks:a,...o}=e??{},s=this.series.inHoursShown(this.series.liveBars()),c=t>0&&r===void 0&&i!==!1,l=o.startIndex;r!==void 0&&l===void 0?l=nt(s,r):c&&l!==void 0&&(l+=t);let u=c?t:i&&l!==void 0&&l>0?Math.min(Math.floor(l),s.length-1):0,d=u>0?s.slice(u):s;l!==void 0&&(o.startIndex=l-u),this.replayOffset=u,this.replayRevealMarks=a!==!1;let f=n?ot(n,d):null;this.replayStepsSeries=f,this.replayCoarse=d,this.options.autoScale=!0,this.replayRestarting=!0;try{this.replayManager.load(f??d)}finally{this.replayRestarting=!1}f&&o.startIndex!==void 0&&(o.startIndex=ct(f,d,o.startIndex)),this.replayBarUnsub?.();let p=-1,m=-1,h=null,g=f??d;this.replayBarUnsub=this.replayManager.on(`bar`,({index:e})=>{let t=e,n=d[e];if(f){let r=f[e];t=st(d,r.time),h=h!==null&&m===e-1&&t===p-1&&h?ut(h,r):lt(d[t],f,e),n=h}m=e;let r=t+1,i=p>0&&r>=p&&this.series.length()===p,a=!(i&&!this.replaySeeking)||this.autoScrollOnNewBar&&this.viewport.isAtEnd();if(i){f&&r>p&&this.series.updateReplayed(d[p-1]);for(let e=p;e<r-1;e++)this.series.appendReplayed(d[e]);r>p?this.series.appendReplayed(n):this.series.updateReplayed(n),this.recalcIndicatorsFrom(this.series.bars(),Math.max(0,p-1))}else this.series.showReplayed([...d.slice(0,t),n]),this.recalcIndicators(this.series.bars());p=r,this.currentPriceLine.setPrice(n.close,t>0?d[t-1].close:void 0),this.crosshairHandler.setData(this.series.bars());let o=g[e+1]?.time??g[e].time+(e>0?g[e].time-g[e-1].time:1);this.replayRevealMarks&&this.revealReplayMarks(o),this.displayDataCache=null,this.reshapeMemo.clear(),this.updateViewportAndRender(a),this.feedReplaySteps(g,e),this.eventBus.emit(`replayStep`,{barIndex:t,time:d[t].time,until:o,total:d.length})});let _=g[Math.max(0,Math.min(Math.floor(Number(o.startIndex??0))||0,g.length-1))];this.revealReplayMarks(this.replayRevealMarks?_?.time??null:null),!o.paused&&o.startIndex!==void 0&&o.startIndex>=1&&this.replaySeek(o.startIndex-1),this.replayManager.play(o)}revealReplayMarks(e){let t=e!==null&&this.replayOffset>0?this.replayCoarse?.[0]?.time??-1/0:-1/0;this.signalMarkerManager.setRevealUntil(e,t),this.tradeZoneManager.setRevealUntil(e,t)}replaySeekToTime(e){if(!this.replaySession||!this.replayCoarse)return;let t=this.replayStepsSeries??this.replayCoarse,n=0,r=t.length-1;for(;n<r;){let i=n+r+1>>1;t[i].time<e?n=i:r=i-1}this.replaySeek(n)}feedReplayPrice(e,t){let n=this.executionAdapter;n?.setMarkPrice&&(n.setMarkPrice(e,t),this.tradingManager.setCurrentPrice(e))}returnMarkToLive(){let e=this.replaySession;if(!e||!this.replayTrades())return;let t=this.series.liveBars(),n=e.price?.price??t[t.length-1]?.close;n!==void 0&&this.feedReplayPrice(n)}feedReplaySteps(e,t){let n=this.replaySession,r=this.executionAdapter,i=e[t];if(!n||!r?.setMarkPrice||!i)return;if(n.fedTime===null){n.fedTime=i.time,this.feedReplayPrice(i.close,i.time);return}if(i.time<=n.fedTime)return;let a=e.slice(rt(e,n.fedTime),t+1);n.fedTime=i.time;let o=Math.ceil(a.length/tt);for(let e=0;e<a.length;e+=o)for(let[t,n]of it(a.slice(e,e+o)))r.setMarkPrice(t,n);this.tradingManager.setCurrentPrice(i.close)}getReplayBarIndex(){if(!this.replaySession)return-1;let{current:e}=this.replayManager.getProgress(),t=this.replayStepsSeries;return t&&this.replayCoarse?st(this.replayCoarse,t[e]?.time??-1/0):e}replaySeekToBar(e){let t=this.replayStepsSeries;this.replaySeek(t&&this.replayCoarse?ct(t,this.replayCoarse,e):e)}replayPause(){this.replayManager.pause()}replayResume(){this.replayManager.resume()}replayStop(){let e=this.replaySession,t=this.endReplaySession();!e||!t||(this.loadSeries(t,!0),e.price&&this.currentPriceLine.setPrice(e.price.price,e.price.previousClose))}isReplayActive(){return this.replaySession!==null}getPlotRect(){let{x:e,y:t,width:n,height:r}=this.viewport.getState().chartRect;return{x:e,y:t,width:n,height:r}}getDrawingRect(e){let n=this.drawingManager.getDrawings().find(t=>t.id===e);if(!n||!this.drawingManager.isShown(e)||n.anchors.length===0)return null;let r={...this.viewport.getState(),data:this.getDisplayData()},i=r.chartRect,a=1/0,o=-1/0,s=1/0,c=-1/0;for(let e of n.anchors){let n=(0,t.timeToX)(e.time,r),i=(0,t.priceToY)(e.price,r);a=Math.min(a,n),o=Math.max(o,n),s=Math.min(s,i),c=Math.max(c,i)}return We.has(n.type)?[a,o]=[i.x,i.x+i.width]:n.type===`horizontalRay`&&(o=i.x+i.width),Ge.has(n.type)&&([s,c]=[i.y,i.y+i.height]),a=Math.max(a,i.x),o=Math.min(o,i.x+i.width),s=Math.max(s,i.y),c=Math.min(c,i.y+i.height),a<=o&&s<=c?{x:a,y:s,width:o-a,height:c-s}:null}endReplaySession(){if(!this.replaySession)return null;this.returnMarkToLive();let e=this.series.endReplay();return this.replaySession=null,this.replayStepsSeries=null,this.replayCoarse=null,this.replayBarUnsub?.(),this.replayBarUnsub=null,this.replayManager.stop(),this.replayOffset=0,this.revealReplayMarks(null),e}replaySeek(e){this.replaySeeking=!0;try{this.replayManager.seekTo(e)}finally{this.replaySeeking=!1}}setReplaySpeed(e){this.replayManager.setSpeed(e)}getReplayState(){return this.replayManager.getState()}getReplayProgress(){return this.replayManager.getProgress()}captureSnapshot(){return t.ChartStateManager.capture({getDrawings:()=>this.getDrawings(),getTheme:()=>this.themeManager.getBaseTheme(),getAlerts:()=>this.getAlerts(),getIndicators:()=>this.getIndicatorSetup(),getOverrides:()=>this.themeManager.getUserOverrides()},{chartType:this.options.chartType,chartTypeOptions:this.getChartTypeOptions(),symbol:this.currentSymbol||void 0})}restoreIndicators(t,n){let r=qe(t),i=new Map;this.unrestoredIndicators=[];let a=new Set(this.indicatorEngine.getAvailableIndicators().map(e=>e.id)),o=[],s=new Set;if(n){let e=new Map(r.map(e=>[e.instanceId,e])),t=this.getIndicatorSetup();for(let n of t){let t=e.get(n.instanceId);t&&Je(n,t)&&s.add(n.instanceId)}for(let e of t)s.has(e.instanceId)||this.removeIndicator(e.instanceId);for(let e of[...s])this.indicatorEngine.getIndicatorConfig(e)||s.delete(e)}else for(let e of this.indicatorEngine.getActiveIndicators())this.removeIndicator(e.instanceId);let c=t=>{let n={...t};for(let[t,r]of Object.entries(n)){let a=(0,e.parseIndicatorSource)(r),o=a&&i.get(a.instanceId);o&&(n[t]=(0,e.indicatorSource)(o,a.key))}return n};for(let e of r){let t=null;if(s.has(e.instanceId)){t=e.instanceId;let n=this.indicatorEngine.getIndicatorConfig(t)?.params??{},r={};for(let[t,i]of Object.entries(c(e.params)))n[t]!==i&&(r[t]=i);Object.keys(r).length>0&&this.updateIndicator(t,r)}else{let r=[`top`,`bottom`,`left`,`right`].find(t=>t===e.position)??`bottom`;try{if(!a.has(e.id))throw Error(`no such indicator is registered`);let o=e.pane?i.get(e.pane):void 0;t=this.addIndicatorNow(e.id,c(e.params),r,{...o?{pane:o}:{},...e.scale===`left`?{scale:`left`}:{},...n?{instanceId:e.instanceId}:{}})}catch(t){console.warn(`Layout indicator "${e.id}" kept but not shown:`,t)}}if(!t){this.unrestoredIndicators.push(e);continue}i.set(e.instanceId,t),o.push([e,t]),this.restoreLooks(t,e)}return this.restorePanes(o),this.updateViewportAndRender(),i}restoreLooks(t,n){let{plots:r,...i}=this.indicatorEngine.getIndicatorStyle(t)??{colors:[],lineWidths:[],opacity:1},{plots:a,...o}=n.style??{};n.style&&JSON.stringify({...i,...o})!==JSON.stringify(i)&&this.updateIndicatorStyle(t,o),JSON.stringify(a??{})!==JSON.stringify(r??{})&&(this.indicatorEngine.setPlotStyles(t,a??null),this.engine.requestRender());let s=this.indicatorEngine.getIndicatorConfig(t);(n.visible??!0)!==(s?.visible??!0)&&this.setIndicatorVisible(t,n.visible??!0);let c=n.levels??null;JSON.stringify(c)!==JSON.stringify(s?.levels??null)&&this.setIndicatorLevels(t,c);let l=n.intervals??null;JSON.stringify(l)!==JSON.stringify(s?.intervals??null)&&this.setIndicatorIntervalsNow(t,l),this.setPaneStyleNow(t,n.paneStyle?(0,e.readPaneStyle)(n.paneStyle):null)}restorePanes(e){for(let[t,n]of e)t.paneSize!==void 0&&this.layoutManager.setPanelSize(n,t.paneSize),(t.paneSize!==void 0||t.paneCollapsed)&&this.layoutManager.setPanelCollapsed(n,!!t.paneCollapsed),t.paneSize!==void 0&&this.layoutManager.setPanelScale(n,{log:!!t.paneLog,invert:!!t.paneInvert,percent:!!t.panePercent});let t=e.filter(([e])=>e.paneOrder!==void 0).sort(([e],[t])=>(e.paneOrder??0)-(t.paneOrder??0)).map(([,e])=>e);t.length>1&&this.layoutManager.orderPanels(t);let n=e.find(([e])=>e.paneMaximized);this.layoutManager.setMaximizedPanel(n?n[1]:null)}getIndicatorSetup(){let e=this.layoutManager.getPanels(),t=this.layoutManager.getMaximizedPanel();return[...this.indicatorEngine.getActiveIndicators().map(n=>{let r=e.find(e=>e.id===n.instanceId),i=this.indicatorEngine.getIndicatorConfig(n.instanceId);return{id:n.id,instanceId:n.instanceId,params:{...n.params},position:r?.position,style:this.indicatorEngine.getIndicatorStyle(n.instanceId)??void 0,visible:n.visible,levels:i?.levels?.slice(),pane:n.pane,scale:i?.scale,...i?.intervals?{intervals:this.indicatorEngine.getIntervals(n.instanceId)??void 0}:{},...r&&this.paneStyles.has(n.instanceId)?{paneStyle:{...this.paneStyles.get(n.instanceId)}}:{},...r?{paneSize:r.size,paneOrder:e.indexOf(r),...r.collapsed?{paneCollapsed:!0}:{},...t===n.instanceId?{paneMaximized:!0}:{},...r.logScale?{paneLog:!0}:{},...r.invertScale?{paneInvert:!0}:{},...r.percentScale?{panePercent:!0}:{}}:{}}}),...this.unrestoredIndicators]}applyIndicatorSetup(e){this.features.indicators&&this.recordIndicators(void 0,()=>{let t=new Map(this.indicatorEngine.getActiveIndicators().map(e=>[e.instanceId,e.id])),n=this.withoutIndicatorHistory(()=>this.restoreIndicators(e,!1));this.followIndicatorAlerts(t,[...n.values()]),this.markStateChanged()})}followIndicatorAlerts(e,t){if(!this.features.alerts)return;let n=n=>{let r=n.indexOf(`:`);if(r<=0)return null;let i=n.slice(0,r),a=e.get(i);if(!a||this.indicatorEngine.getIndicatorConfig(i))return null;let o=t.filter(e=>this.indicatorEngine.getIndicatorConfig(e)?.id===a);return o.length===1?o[0]+n.slice(r):null};for(let e of this.alertManager.getAlerts()){let t=n(e.channel),r=e.target?n(e.target):null;if(!t&&!r)continue;let{target:i,percent:a,bars:o,onBarClose:s,expiresAt:c}=e;this.alertManager.removeAlert(e.id),this.alertManager.addAlert(e.price,e.condition,e.message,e.repeating,t??e.channel,e.label,{...e.target?{target:r??e.target}:{},...a===void 0?{}:{percent:a},...o===void 0?{}:{bars:o},...s?{onBarClose:s}:{},...c===void 0?{}:{expiresAt:c}})}}beginIndicatorEdit(e){this.endIndicatorEdit(),this.features.drawingUndoRedo&&(this.indicatorEdit={subject:e,before:this.getIndicatorSetup()},this.indicatorHistoryDepth++)}endIndicatorEdit(){let e=this.indicatorEdit;if(!e)return;this.indicatorEdit=null,this.indicatorHistoryDepth--;let t=this.getIndicatorSetup();JSON.stringify(t)!==JSON.stringify(e.before)&&this.undoRedoManager.push({type:`indicators`,before:null,after:null,indicators:{before:e.before,after:t,subject:e.subject,at:performance.now()}})}withoutIndicatorHistory(e){this.indicatorHistoryDepth++;try{return e()}finally{this.indicatorHistoryDepth--}}recordIndicators(e,t){if(this.indicatorHistoryDepth>0||!this.features.drawingUndoRedo)return t();let n=this.getIndicatorSetup(),r=this.withoutIndicatorHistory(t),i=this.getIndicatorSetup();if(JSON.stringify(n)===JSON.stringify(i))return r;let a=performance.now(),o=this.undoRedoManager.last(),s=e!==void 0&&o?.type===`indicators`&&o.indicators?.subject===e&&a-(o.indicators.at??0)<Ve&&JSON.stringify(o.indicators.after)===JSON.stringify(n),c={type:`indicators`,before:null,after:null};return s&&o?.indicators?JSON.stringify(o.indicators.before)===JSON.stringify(i)?this.undoRedoManager.dropLast():this.undoRedoManager.replaceLast({...c,indicators:{...o.indicators,after:i,at:a}}):this.undoRedoManager.push({...c,indicators:{before:n,after:i,subject:e,at:a}}),r}applyIndicatorStep(e,t){let n=e.indicators;n&&(this.withoutIndicatorHistory(()=>this.restoreIndicators(t===`undo`?n.before:n.after,!0)),this.markStateChanged())}saveState(e){if(!this.features.saveLoad)return null;let n=this.captureSnapshot(),r=t.ChartStateManager.serialize(n);return e&&t.ChartStateManager.saveToStorage(e,n),r}loadState(e){if(!this.features.saveLoad)return;let n=t.ChartStateManager.deserialize(e);this.chartTypeOptions=n.chartTypeOptions??{},this.displayDataCache=null,this.reshapeMemo.clear(),n.chartType&&this.setChartType(n.chartType),n.drawings&&this.setDrawings(n.drawings),(n.theme===`dark`||n.theme===`light`)&&this.setTheme(n.theme),n.version>=3&&this.themeManager.setUserOverrides(n.overrides??{})&&this.styleChanged(`user`);let r=n.version>=2&&this.features.indicators?this.withoutIndicatorHistory(()=>this.restoreIndicators(n.indicators,!1)):new Map;if(this.undoRedoManager.clear(),n.alerts&&this.features.alerts){this.alertManager.clearAlerts();for(let e of n.alerts){if(e.triggered&&!e.repeating)continue;let n=e=>{let t=e.indexOf(`:`),n=t>0?r.get(e.slice(0,t)):void 0;return n?n+e.slice(t):e},i=n(e.channel),a={...(0,t.readAlertOptions)(e),...e.target?{target:n(e.target)}:{}};if(!e.expired){if(e.drawingId){this.drawingManager.hasPriceLevels(e.drawingId)&&(e.condition===`crossing`||e.condition===`crossingUp`||e.condition===`crossingDown`)&&this.alertManager.addDrawingAlert(e.drawingId,e.condition,e.message,e.repeating,e.label);continue}try{this.alertManager.addAlert(e.price,e.condition,e.message,e.repeating,i,e.label,a)}catch(e){console.warn(`Layout alert left out:`,e)}}}}this.markStateChanged()}loadStateFromStorage(e){if(!this.features.saveLoad)return!1;let n=t.ChartStateManager.loadFromStorage(e);return n?(this.loadState(t.ChartStateManager.serialize(n)),!0):!1}downloadState(e){this.features.saveLoad&&t.ChartStateManager.downloadFile(this.captureSnapshot(),e)}async loadStateFromFile(){if(!this.features.saveLoad)return;let e=await t.ChartStateManager.loadFromFile();this.loadState(t.ChartStateManager.serialize(e))}setLocale(t){(0,e.setLocale)(t),this.engine.requestRender()}setNumberLocale(e){this.numberLocale=e,this.viewport.setNumberLocale(e),this.priceAxis.setLocale(e),this.leftPriceAxis.setLocale(e),this.crosshairHandler.setLocale(e),this.timeAxis.setLocale(e),this.chartLegend.setLocale(e),this.crosshairTooltip.setLocale(e),this.pinnedTooltip.setLocale(e),this.currentPriceLine.setLocale(e),this.updateViewportAndRender()}getNumberLocale(){return this.numberLocale}setMarket(e){if(this.marketConfig=e,this.studyZoneHeld=!1,this.endStudyZoneWait(),this.timeZoneSetting===`exchange`&&this.applyTimeZone(),this.applyExchangeZone(),e.colorScheme){let t={...this.themeManager.getBaseTheme(),candleUp:e.colorScheme.up,candleDown:e.colorScheme.down,candleUpWick:e.colorScheme.up,candleDownWick:e.colorScheme.down};this.themeManager.setTheme(t)}e.pricePrecision!==void 0&&this.applyPricePrecision(e.pricePrecision),this.updateViewportAndRender(),this.eventBus.emit(`marketChange`,{market:e})}applyPricePrecision(e){this.marketPricePrecision=e,this.viewport.setPricePrecision(e),this.pinnedTooltip.setPricePrecision(e),this.priceAxis.setPricePrecision(e),this.tradingManager.setConfig({pricePrecision:e??void 0}),this.alertManager.setPricePrecision(e),this.tradeZoneManager.setPricePrecision(e),this.streamManager?.priceLine.setPricePrecision(e),this.currentPriceLine.setPricePrecision(e),this.crosshairHandler.setPricePrecision(e),this.chartLegend.setPricePrecision(e),this.crosshairTooltip.setPricePrecision(e)}getMarket(){return this.marketConfig}getPriceLimits(){let t=this.marketConfig;return!t?.priceLimits?.enabled||!t.priceLimits.referencePrice?null:(0,e.computePriceLimits)(t.priceLimits.referencePrice,t)}setPriceLimits(e){this.marketConfig?.priceLimits&&(this.marketConfig={...this.marketConfig,priceLimits:{...this.marketConfig.priceLimits,referencePrice:e}},this.engine.requestRender())}getFeatures(){return this.features}setFeatures(t){Object.assign(this.features,t),(t.crosshair===!1||t.crosshairTooltip===!1)&&this.crosshairTooltip.hide(),t.grid!==void 0&&this.engine.requestRender(e.LayerType.Background),t.volume!==void 0&&(this.volumeRenderer.setVisible(t.volume),this.updateViewportAndRender()),t.drawings===!1&&this.drawingManager.setActiveTool(null),t.trading===!1&&(this.tradingManager.setOrders([]),this.tradingManager.setPositions([])),t.keyboard!==void 0&&this.keyboardHandler?.setEnabled(t.keyboard),this.engine.requestRender()}resize(){let e=this.engine.dprManager.readContainerSize();if(e.width<=0||e.height<=0)return;this.containerSizeCache=e,this.containerSizeCacheTime=Date.now();let t=this.engine.dprManager.getDpr();this.engine.layerManager.resize(e,t);let n=this.viewport.isAtEnd();this.viewport.resize(e.width,e.height),this.layoutManager.resize(e.width,e.height),this.updateViewportAndRender(n),this.eventBus.emit(`resize`,e)}destroy(){this.disposed=!0,this.stopWatchingVisibility?.(),this.stopWatchingVisibility=null,this.waitForGpu(null),this.countdownInterval&&clearInterval(this.countdownInterval),this.history.setLoader(null),this.disableAutoSave(),this.disconnectStream(),this.disconnectExecution(),this.onWindowKeyDown&&=(window.removeEventListener(`keydown`,this.onWindowKeyDown),null),this.keyboardHandler=null,this.a11y?.destroy(),this.a11y=null,this.interactionManager.detach(),this.tradingManager.destroy(),this.animator.dispose(),this.crosshairTooltip.destroy(),this.pinnedTooltip.destroy(),this.replayRestarting=!0,this.replayManager.dispose(),this.alertManager.dispose(),this.undoRedoManager.clear(),this.engine.destroy(),this.eventBus.destroy(),this.labelWidths.destroy(),this.container.innerHTML=``}createChartRenderer(e){let n=fe(e,e=>this.pluginManager.getChartType(e));return n instanceof t.HiLoRenderer&&n.setPriceText(e=>this.formatPrice(e)),n}crosshairSeries(){return this.isTimeAligned()?this.series.bars():this.getDisplayData()}getDisplayData(){let e=this.series.bars(),t=this.options.chartType===`rangeBars`?le(e,e=>this.stepAt(e)):void 0;if(this.displayDataCache&&t===this.displayDataStep)return this.displayDataCache;if(e.length===0)return e;let n=this.displaySeries(e,t);return this.displayDataCache=n,this.displayDataStep=t,n}displaySeries(e,n){let r=this.options.chartType,i=e=>this.pluginManager.getChartType(e);if(r!==`pointAndFigure`||i(r))return pe(r,e,i,this.chartTypeOptions,n,this.reshapeMemo);let{columns:a,boxSize:o}=v(e,this.chartTypeOptions,this.reshapeMemo);return this.chartRenderer instanceof t.PointAndFigureRenderer&&this.chartRenderer.setBoxSize(o),a}recalcIndicatorsFrom(e,t){this.indicatorEngine.recalculateFrom(e,t),this.announceIndicatorUpdate(t)}recalcIndicators(e){this.indicatorEngine.recalculateAll(e),this.announceIndicatorUpdate(0)}announceIndicatorUpdate(e){if(this.indicatorUpdateFrom!==null){this.indicatorUpdateFrom=Math.min(this.indicatorUpdateFrom,e);return}this.indicatorUpdateFrom=e,queueMicrotask(()=>{let e=this.indicatorUpdateFrom;this.indicatorUpdateFrom=null,e!==null&&this.eventBus.emit(`indicatorUpdate`,{from:e})})}requestRender(){this.scheduleRender()}scheduleRender(){if(!(this.renderScheduled||this.disposed)){if(this.isSuspended()){this.renderDeferred=!0;return}this.renderScheduled=!0,requestAnimationFrame(()=>{if(this.renderScheduled=!1,!this.disposed){if(this.isSuspended()){this.renderDeferred=!0;return}this.refitForTick()}})}}refitForTick(){this.panelInfoCache=null,this.fitDataAndAxes(),this.syncRenderContext(),this.engine.requestRender(),this.emitViewportEvents()}applyDataToViewport(e=!1){let t=this.getDisplayData(),n=this.options.autoScale!==!1||this.priceFitPending;this.viewport.updateData(t,!1),e&&(this.viewport.scrollToEnd(),this.viewport.updateData(t,!1));let r=this.viewport.getState();if(t.length>0){let e=Math.max(0,Math.min(r.visibleRange.from,t.length-1));this.viewport.setScaleBaseline(t[e]?.close)}return n&&this.fitPriceScale(t,this.viewport.getState()),t}fitPriceScale(n,r){if(n.length===0)return;let i=Math.max(0,r.visibleRange.from),a=Math.min(r.visibleRange.to,n.length-1),o=et(et((0,e.computePriceRange)(n,i,a,0),this.indicatorEngine.getOverlayPriceRange(i,a)),this.features.compareSymbols&&this.comparesDrawn()?this.compareRenderer.getPriceRange(n,r):null),s=this.features.volume&&this.volumeRenderer.isVisible()&&$e(n,i,a)?this.volumeRenderer.getHeightRatio()+Be:t.PRICE_SCALE_MARGIN;this.viewport.setScaleMargins(this.viewport.isInvertScale()?{top:s,bottom:t.PRICE_SCALE_MARGIN}:{top:t.PRICE_SCALE_MARGIN,bottom:s}),this.viewport.fitToPrices(o.min,o.max)}updateViewportAndRender(e=!1){this.resolvedLayoutCache=null,this.panelInfoCache=null,this.layoutManager.setLeftAxisWidth(this.isLeftPriceScaleShown()?this.leftAxisWidth:0);let t=this.getResolvedLayout();this.viewport.setChartRect(t.mainChartRect),this.fitDataAndAxes(e),this.syncRenderContext(),this.engine.requestRender(),this.emitViewportEvents()}fitDataAndAxes(e=!1){let t=this.applyDataToViewport(e),n=this.fitPriceAxisWidth();this.leftViewport=this.computeLeftViewport(),(this.fitLeftAxisWidth()||n)&&this.applyDataToViewport(e),this.priceFitPending&&this.priceFitDone(t)&&(this.priceFitPending=!1)}priceFitDone(e){let{chartRect:t,offset:n,barWidth:r,barSpacing:i}=this.viewport.getState();if(e.length===0||t.width<=0)return!1;let a=n<=0&&e.length*(r+i)-n<=t.width;return!(this.seriesArriving&&a)}fitLeftAxisWidth(){let e=this.leftViewport;if(!e)return!1;let t=this.themeManager.getTheme(),n=P({min:e.priceRange.min,max:e.priceRange.max,lastPrice:null,tagPrecision:null,locale:this.numberLocale,fontFamily:t.font.family,fontSizeSmall:t.font.sizeSmall,measure:(e,t)=>this.measureText(e,t)}),r=F(this.leftAxisWidth,n);return r===this.leftAxisWidth?!1:(this.leftAxisWidth=r,this.layoutManager.setLeftAxisWidth(r),this.resolvedLayoutCache=null,this.panelInfoCache=null,this.viewport.setChartRect(this.getResolvedLayout().mainChartRect),!0)}fitPriceAxisWidth(){if(!this.features.priceAxis)return!1;let{priceRange:e}=this.viewport.getState(),t=this.themeManager.getTheme(),n=P({min:e.min,max:e.max,lastPrice:this.currentPriceLine.getPrice(),tagPrecision:this.marketPricePrecision,locale:this.numberLocale,format:this.priceFormatter,scaleLabel:e=>this.priceAxis.labelText(e,this.viewport.getState()),fontFamily:t.font.family,fontSizeSmall:t.font.sizeSmall,measure:(e,t)=>this.measureText(e,t)}),r=F(this.priceAxisWidth,n);return r===this.priceAxisWidth?!1:(this.priceAxisWidth=r,this.layoutManager.setPriceAxisWidth(r),this.viewport.setPriceAxisWidth(r),this.resolvedLayoutCache=null,this.panelInfoCache=null,this.viewport.setChartRect(this.getResolvedLayout().mainChartRect),!0)}measureText(t,n){let r=this.engine.layerManager.getLayer(e.LayerType.Main)?.ctx;if(r?.canvas.isConnected)return this.labelWidths.get(t,n,()=>Ye(r,t,n));let i=r??this.detachedMeasureContext();return i?Ye(i,t,n):t.length*7}detachedMeasureContext(){return this.measureCtx===void 0&&(this.measureCtx=typeof document<`u`?document.createElement(`canvas`).getContext(`2d`):null),this.measureCtx}emitViewportEvents(){let e=this.viewport.getState(),t=Math.max(0,Math.floor(e.visibleRange.from)),n=Math.max(t,Math.ceil(e.visibleRange.to));(!this.lastEmittedRange||this.lastEmittedRange.from!==t||this.lastEmittedRange.to!==n)&&(this.lastEmittedRange={from:t,to:n},this.eventBus.emit(`visibleRangeChange`,{from:t,to:n}));let{min:r,max:i}=e.priceRange;(!this.lastEmittedPriceRange||this.lastEmittedPriceRange.min!==r||this.lastEmittedPriceRange.max!==i)&&(this.lastEmittedPriceRange={min:r,max:i},this.eventBus.emit(`priceRangeChange`,{min:r,max:i})),this.lastEmittedBarWidth!==e.barWidth&&(this.lastEmittedBarWidth=e.barWidth,this.eventBus.emit(`zoomChange`,{barWidth:e.barWidth})),this.checkHistory()}getResolvedLayout(){return this.resolvedLayoutCache||(this.resolvedLayoutCache=this.layoutManager.resolve(),this.syncCrosshairBounds(this.resolvedLayoutCache)),this.resolvedLayoutCache}syncCrosshairBounds(e){let t=e.mainChartRect,n=t.y,r=t.y+t.height;for(let t of e.panels)t.config.position!==`top`&&t.config.position!==`bottom`||(n=Math.min(n,t.rect.y),r=Math.max(r,t.rect.y+t.rect.height));this.crosshairHandler.setReportBounds({top:n,bottom:r})}cachedContainerSize(){let e=Date.now();return(!this.containerSizeCache||e-this.containerSizeCacheTime>500)&&(this.containerSizeCache=this.engine.dprManager.getContainerSize(),this.containerSizeCacheTime=e),this.containerSizeCache}buildPanelRenderInfos(){if(this.panelInfoCache)return this.panelInfoCache;let e=this.getResolvedLayout(),t=this.viewport.getState(),{from:n,to:r}=t.visibleRange,i=e.panels.map(e=>{let i=e.config.logScale?this.indicatorEngine.getPaneValueRange(e.config.id,n,r,!0):null,a=i??this.indicatorEngine.getPaneValueRange(e.config.id,n,r)??{...Re},o={x:e.rect.x,y:e.rect.y+20,width:e.rect.width,height:Math.max(0,e.rect.height-20)},s=this.paneStyles.get(e.config.id);return{instanceId:e.config.id,members:this.indicatorEngine.getPaneMembers(e.config.id),...s?{style:s}:{},rect:e.rect,viewport:{...t,chartRect:o,priceRange:a,logScale:i!==null,scaleMode:e.config.percentScale?`percentage`:`regular`,scaleBaseline:e.config.percentScale?this.paneBaseline(e.config.id,n,r):void 0,formatPrice:void 0,pricePrecision:void 0,priceUnit:void 0,invertScale:!!e.config.invertScale}}});return this.panelInfoCache=i,i}timeAxisTop(){let e=this.getResolvedLayout(),t=e.panels.filter(e=>e.config.position===`bottom`).reduce((e,t)=>e+t.rect.height,0);return e.mainChartRect.y+e.mainChartRect.height+t}syncRenderContext(){this.pinnedTooltip.isPinned()&&this.pinnedTooltip.reposition(this.viewport.getState(),null,null,this.themeManager.getTheme());let e=this.features.indicators?this.buildPanelRenderInfos():[],t=this.timeAxisTop(),n=this.getDisplayData();this.leftViewport=this.computeLeftViewport(),this.engine.setRenderContext({leftViewport:this.leftViewport,leftPriceAxis:this.leftPriceAxis,leftAxisWidth:this.leftAxisWidth,chartRenderer:this.mainSeriesVisible?this.chartRenderer:null,priceLines:this.quoteLines(),gridRenderer:this.features.grid?this.gridRenderer:null,priceAxis:this.features.priceAxis?this.priceAxis:null,timeAxis:this.features.timeAxis?this.timeAxis:null,crosshairHandler:this.features.crosshair?this.crosshairHandler:null,indicatorEngine:this.features.indicators?this.indicatorEngine:null,drawingRenderer:this.features.drawings?this.drawingRenderer:null,tradingRenderer:this.features.trading?this.tradingRenderer:null,currentPriceLine:this.currentPriceLine,chartLegend:this.features.legend?this.chartLegend:null,volumeRenderer:this.features.volume?this.volumeRenderer:null,volumeProfile:this.volumeProfile,marketProfile:this.marketProfile,depthHeatmap:this.depthHeatmap,periodLevels:this.periodLevels,pivotMarkers:this.pivotMarkers,watermark:this.features.watermark?this.watermark:null,barCountdown:this.barCountdown,sessionBreaks:this.sessionBreaks,sessionShading:this.sessionShading,compareRenderer:this.comparesDrawn()?this.compareRenderer:null,alertManager:this.features.alerts?this.alertManager:null,measureOverlay:this.measureOverlay,selectionBoxOverlay:this.selectionBoxOverlay,priceAxisAddButton:this.priceAxisAddButton,signalMarkerManager:this.signalMarkerManager,tradeZoneManager:this.tradeZoneManager,panels:e,priceLimits:this.buildPriceLimits(),timeAxisY:t,viewport:{...this.viewport.getState(),data:n},theme:this.themeManager.getTheme(),data:n,seriesRevision:this.series.revision(),numberLocale:this.numberLocale,paneTitles:this.paneTitles,indicatorValueLabels:this.features.indicatorValueLabels,formatPrice:e=>this.formatPrice(e),renderOverlayPlugins:(e,t)=>this.drawOverlayPlugins(e,t)})}drawOverlayPlugins(e,t){let n=I(this.pluginManager.getOverlays(),t);if(n.length===0)return;let r={viewport:this.viewport.getState(),data:this.getDisplayData(),theme:this.themeManager.getTheme()};for(let t of n)t.render(e,r)}buildPriceLimits(){let e=this.getPriceLimits();return!e||!this.marketConfig?null:{...e,colors:this.marketConfig.colorScheme?{ceiling:this.marketConfig.colorScheme.ceiling,floor:this.marketConfig.colorScheme.floor,reference:this.marketConfig.colorScheme.reference}:void 0}}};function qe(t){let n=new Map(t.map(e=>[e.instanceId,e])),r=[],i=new Set,a=new Set,o=t=>{if(i.has(t.instanceId)||a.has(t.instanceId))return;a.add(t.instanceId);let s=[t.pane,...Object.values(t.params).map(t=>(0,e.parseIndicatorSource)(t)?.instanceId)];for(let e of s){let t=e?n.get(e):void 0;t&&o(t)}a.delete(t.instanceId),i.add(t.instanceId),r.push(t)};for(let e of t)o(e);return r}function Je(e,t){return e.id===t.id&&(e.pane??null)===(t.pane??null)&&(e.scale??null)===(t.scale??null)&&e.position===void 0==(t.position===void 0)}function Ye(e,t,n){let r=e.font;e.font=n;let i=e.measureText(t).width;return e.font=r,i}var Xe=300;function Ze(e){let t={},n=e.family;typeof n==`string`&&n.trim()!==``&&n.length<=Xe&&!/[;{}<>\\]|\/\*/.test(n)&&(t.family=n);for(let n of[`sizeSmall`,`sizeMedium`,`sizeLarge`]){let r=e[n];typeof r==`number`&&Number.isFinite(r)&&r>0&&(t[n]=r)}return t}function Qe(e){let t=e.tagRadius;return typeof t==`number`&&Number.isFinite(t)&&t>=0?{tagRadius:Math.min(t,999)}:{}}function $e(e,t,n){for(let r=t;r<=n;r++)if(e[r].volume>0)return!0;return!1}function et(e,t){return e?t?{min:Math.min(e.min,t.min),max:Math.max(e.max,t.max)}:e:t}function K(e){return{id:e.id,price:e.price,condition:e.condition,message:e.message,triggered:e.triggered,channel:e.channel,label:e.label,target:e.target,drawingId:e.drawingId,percent:e.percent,bars:e.bars}}var tt=500;function nt(e,t){let n=0,r=e.length;for(;n<r;){let i=n+r>>1;e[i].time<t?n=i+1:r=i}return n}function rt(e,t){let n=0,r=e.length;for(;n<r;){let i=n+r>>1;e[i].time<=t?n=i+1:r=i}return n}function it(e){let t=0,n=0;for(let r=1;r<e.length;r++)e[r].low<e[t].low&&(t=r),e[r].high>e[n].high&&(n=r);let r=[e[t].low,e[t].time],i=[e[n].high,e[n].time],a=t===n?e[t].close>=e[t].open:t<n,o=e[e.length-1];return[...a?[r,i]:[i,r],[o.close,o.time]]}function at(e){let t=0;for(let n=Math.max(1,e.length-10);n<e.length;n++)t=Math.max(t,e[n].time-e[n-1].time);return t>0?t:1/0}function ot(e,t){if(t.length===0)return null;let n=t[t.length-1].time+at(t),r=e.filter(e=>ye(e)&&e.time>=t[0].time&&e.time<n).sort((e,t)=>e.time-t.time),i=[];for(let e of r)(i.length===0||i[i.length-1].time!==e.time)&&i.push(e);if(i.length===0)return null;let a=t.findIndex(e=>e.time>=i[0].time);if(a<0)return null;let o=t.slice(0,a),s=i.filter(e=>e.time>=t[a].time);return[...o,...s]}function st(e,t){let n=0,r=e.length-1;for(;n<r;){let i=n+r+1>>1;e[i].time<=t?n=i:r=i-1}return n}function ct(e,t,n){let r=Math.max(0,Math.min(Math.floor(Number.isFinite(n)?n:0),t.length-1)),i=r+1<t.length?t[r+1].time:1/0,a=-1;for(let t=0;t<e.length&&e[t].time<i;t++)a=t;return Math.max(0,a)}function lt(e,t,n){let r=n;for(;r>0&&t[r-1].time>=e.time;)r--;let i={...t[r],time:e.time};for(let e=r+1;e<=n;e++)i=ut(i,t[e]);return i}function ut(e,t){return{time:e.time,open:e.open,high:Math.max(e.high,t.high),low:Math.min(e.low,t.low),close:t.close,volume:(e.volume??0)+(t.volume??0)}}var dt=[`time`,`timestamp`,`date`,`datetime`,`t`],ft=[`open`,`o`],pt=[`high`,`h`],mt=[`low`,`l`],ht=[`close`,`c`],gt=[`volume`,`vol`,`v`];function _t(e){let t=e.trim();return t?t[0]===`[`||t[0]===`{`?vt(t):yt(t):{data:[],rowCount:0,skipped:0}}function vt(e){let t;try{t=JSON.parse(e)}catch(e){throw Error(`Invalid JSON: ${e.message}`)}if(!Array.isArray(t))throw Error(`Expected a JSON array of OHLCV rows`);let n=[],r=0;for(let e of t){let t=Array.isArray(e)?wt(e):Ct(e);t?n.push(t):r++}return Tt(n,t.length,r)}function yt(e){let t=e.split(/\r?\n/).filter(e=>e.trim().length>0);if(t.length===0)return{data:[],rowCount:0,skipped:0};let n=bt(t[0]),r=xt(t[0],n).map(e=>e.trim().toLowerCase()),i=r.some(e=>isNaN(Number(e))&&e.length>0),a=i?St(r):{time:0,open:1,high:2,low:3,close:4,volume:5};if(a.time<0||a.open<0||a.high<0||a.low<0||a.close<0)throw Error(`CSV is missing required column(s): time, open, high, low, close`);let o=[],s=0;for(let e=+!!i;e<t.length;e++){let r=xt(t[e],n),i=J(r[a.time]),c=q(r[a.open]),l=q(r[a.high]),u=q(r[a.low]),d=q(r[a.close]),f=a.volume>=0?Number(r[a.volume]):0;if(i===null||![c,l,u,d].every(Number.isFinite)){s++;continue}o.push({time:i,open:c,high:l,low:u,close:d,volume:Number.isFinite(f)?f:0})}return Tt(o,t.length-+!!i,s)}function bt(e){let t={",":0,";":0," ":0,"|":0};for(let n of e)n in t&&t[n]++;let n=`,`,r=0;for(let[e,i]of Object.entries(t))i>r&&(n=e,r=i);return n}function xt(e,t){let n=[],r=``,i=!1;for(let a=0;a<e.length;a++){let o=e[a];o===`"`?i&&e[a+1]===`"`?(r+=`"`,a++):i=!i:o===t&&!i?(n.push(r),r=``):r+=o}return n.push(r),n}function St(e){let t=t=>e.findIndex(e=>t.includes(e));return{time:t(dt),open:t(ft),high:t(pt),low:t(mt),close:t(ht),volume:t(gt)}}function Ct(e){let t=t=>{for(let n of t){if(e[n]!==void 0)return e[n];let t=n.toUpperCase();if(e[t]!==void 0)return e[t]}},n=J(String(t(dt)??``)),r=Number(t(ft)),i=Number(t(pt)),a=Number(t(mt)),o=Number(t(ht)),s=Number(t(gt)??0);return n===null||![r,i,a,o].every(Number.isFinite)?null:{time:n,open:r,high:i,low:a,close:o,volume:Number.isFinite(s)?s:0}}function wt(e){if(e.length<5)return null;let t=J(String(e[0])),n=Number(e[1]),r=Number(e[2]),i=Number(e[3]),a=Number(e[4]),o=e.length>=6?Number(e[5]):0;return t===null||![n,r,i,a].every(Number.isFinite)?null:{time:t,open:n,high:r,low:i,close:a,volume:Number.isFinite(o)?o:0}}function q(e){return e===void 0||e.trim()===``?NaN:Number(e)}function J(t){let n=t.trim();if(!n)return null;let r=Number(n);if(Number.isFinite(r)&&r>0)return(0,e.normalizeBarTime)(r);let i=Date.parse(n);return Number.isFinite(i)?i:null}function Tt(e,t,n){e.sort((e,t)=>e.time-t.time);let r=[];for(let t of e)r.length>0&&r[r.length-1].time===t.time?r[r.length-1]=t:r.push(t);return{data:r,rowCount:t,skipped:n}}var Et=class{host;overlay=null;callbacks;bound;depth=0;constructor(e,t){this.host=e,this.callbacks=t,this.bound={dragenter:e=>this.onDragEnter(e),dragover:e=>this.onDragOver(e),dragleave:e=>this.onDragLeave(e),drop:e=>this.onDrop(e)}}attach(){this.host.addEventListener(`dragenter`,this.bound.dragenter),this.host.addEventListener(`dragover`,this.bound.dragover),this.host.addEventListener(`dragleave`,this.bound.dragleave),this.host.addEventListener(`drop`,this.bound.drop)}detach(){this.host.removeEventListener(`dragenter`,this.bound.dragenter),this.host.removeEventListener(`dragover`,this.bound.dragover),this.host.removeEventListener(`dragleave`,this.bound.dragleave),this.host.removeEventListener(`drop`,this.bound.drop),this.hideOverlay()}onDragEnter(e){Y(e)&&(e.preventDefault(),this.depth++,this.showOverlay())}onDragOver(e){Y(e)&&(e.preventDefault(),e.dataTransfer&&(e.dataTransfer.dropEffect=`copy`))}onDragLeave(e){Y(e)&&(this.depth=Math.max(0,this.depth-1),this.depth===0&&this.hideOverlay())}async onDrop(e){e.preventDefault(),this.depth=0,this.hideOverlay();let t=e.dataTransfer?.files?.[0];if(t)try{let e=_t(await t.text());if(e.data.length===0)throw Error(`No valid OHLCV rows found in "${t.name}"`);this.callbacks.onData(e.data,e,t)}catch(e){this.callbacks.onError?.(e,t)}}showOverlay(){this.overlay||(this.overlay=document.createElement(`div`),Object.assign(this.overlay.style,{position:`absolute`,inset:`8px`,zIndex:`90`,pointerEvents:`none`,borderRadius:`10px`,border:`2px dashed var(--tcw-accent, #f2a93b)`,background:`rgba(79, 136, 255, 0.06)`,display:`flex`,alignItems:`center`,justifyContent:`center`,color:`var(--tcw-accent, #f2a93b)`,fontSize:`14px`,fontWeight:`600`,letterSpacing:`-0.005em`,fontFamily:`inherit`,backdropFilter:`blur(2px)`}),this.overlay.textContent=`Drop CSV or JSON to load chart data`,getComputedStyle(this.host).position===`static`&&(this.host.style.position=`relative`),this.host.appendChild(this.overlay))}hideOverlay(){this.overlay?.remove(),this.overlay=null}};function Y(e){return e.dataTransfer?.types?.includes(`Files`)??!1}function X(e){let t={id:e.id,name:e.name,updatedAt:e.updatedAt};return e.symbol!==void 0&&(t.symbol=e.symbol),e.timeframe!==void 0&&(t.timeframe=e.timeframe),e.kind!==void 0&&(t.kind=e.kind),t}var Dt=(e,t)=>t.updatedAt-e.updatedAt;function Z(e){if(typeof e!=`object`||!e)return null;let t=e;return typeof t.id!=`string`||!t.id||typeof t.name!=`string`||typeof t.updatedAt!=`number`||!Number.isFinite(t.updatedAt)?null:X({id:t.id,name:t.name,updatedAt:t.updatedAt,symbol:typeof t.symbol==`string`?t.symbol:void 0,timeframe:typeof t.timeframe==`string`?t.timeframe:void 0,kind:typeof t.kind==`string`?t.kind:void 0})}function Ot(e){let t=Z(e),n=t?e.content:void 0;return t&&typeof n==`string`?{...t,content:n}:null}function kt(e=[]){let t=new Map(e.map(e=>[e.id,{...e}]));return{list:()=>[...t.values()].map(X).sort(Dt),load:e=>{let n=t.get(e);return n?{...n}:null},save:e=>{t.set(e.id,{...e})},remove:e=>{t.delete(e)}}}function At(e=`tcw:layouts:`){let t=`${e}index`,n=t=>`${e}item:${t}`,r=()=>{let e;try{e=JSON.parse(localStorage.getItem(t)??`[]`)}catch{return[]}return Array.isArray(e)?e.map(Z).filter(e=>e!==null):[]},i=e=>localStorage.setItem(t,JSON.stringify(e));return{list:()=>r().sort(Dt),load:e=>{let t=r().find(t=>t.id===e),i=t?localStorage.getItem(n(e)):null;return t&&i!==null?{...t,content:i}:null},save:e=>{localStorage.setItem(n(e.id),e.content),i([...r().filter(t=>t.id!==e.id),X(e)])},remove:e=>{i(r().filter(t=>t.id!==e)),localStorage.removeItem(n(e))}}}var jt=80;function Q(e){return e.replace(/\s+/g,` `).trim().slice(0,80).trim()||null}function Mt(){return globalThis.crypto?.randomUUID?.()??`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,10)}`}function $(e){let{id:t,name:n,symbol:r,timeframe:i,updatedAt:a,kind:o}=e;return{id:t,name:n,...r===void 0?{}:{symbol:r},...i===void 0?{}:{timeframe:i},updatedAt:a,...o===void 0?{}:{kind:o}}}var Nt=class{currentLayout=null;savedContent=null;dirty=!1;autoSave;debounceMs;kind;timer=null;applying=0;busy=0;changedWhileBusy=!1;tail=Promise.resolve();destroyed=!1;now;newId;constructor(e,t,n={}){this.storage=e,this.host=t,this.options=n,this.autoSave=n.autoSave??!0,this.debounceMs=n.debounceMs??1500,this.kind=n.kind??`chart`,this.now=n.now??Date.now,this.newId=n.newId??Mt}current(){return this.currentLayout}isDirty(){return this.dirty}isAutoSave(){return this.autoSave}setAutoSave(e){this.autoSave!==e&&(this.autoSave=e,this.notify(),e&&this.dirty&&this.changed())}async list(){let e=await this.storage.list();return Array.isArray(e)?e.map(Z).filter(e=>e!==null&&(e.kind??`chart`)===this.kind).sort((e,t)=>t.updatedAt-e.updatedAt):[]}save(){return this.queue(()=>{let e=this.currentLayout;return e?this.write(e.id,e.name):null})}saveAs(e){let t=Q(e);return t?this.queue(()=>this.write(this.newId(),t)):Promise.reject(Error(`A layout needs a name`))}open(e){return this.queue(async()=>{let t=Ot(await this.storage.load(e));if(!t||t.id!==e||(t.kind??`chart`)!==this.kind||this.destroyed)return!1;this.cancelTimer(),this.applying++;try{await this.host.apply(t)}catch(e){throw this.forget(),e}finally{this.applying--}return this.cancelTimer(),this.currentLayout=$(t),this.savedContent=this.host.capture().content,this.dirty=!1,this.notify(),!0})}rename(e,t){let n=Q(t);return n?this.queue(async()=>{let t=Ot(await this.storage.load(e));!t||t.id!==e||(await this.storage.save({...t,name:n}),this.currentLayout?.id===e&&(this.currentLayout={...this.currentLayout,name:n}),this.notify())}):Promise.reject(Error(`A layout needs a name`))}remove(e){return this.queue(async()=>{await this.storage.remove(e),this.currentLayout?.id===e&&this.forget()})}changed(){if(!(this.destroyed||this.applying>0)){if(!this.currentLayout){this.busy>0&&(this.changedWhileBusy=!0);return}this.cancelTimer(),this.timer=setTimeout(()=>{this.timer=null,this.queue(()=>this.settle())},this.debounceMs)}}destroy(){if(this.destroyed)return;let e=this.timer!==null;this.cancelTimer();let t=this.currentLayout;if(e&&t&&this.autoSave){let e=null;try{e=this.host.capture()}catch(e){this.options.onError?.(e)}if(e&&e.content!==this.savedContent){let n=e;this.queue(()=>this.write(t.id,t.name,n)).catch(e=>this.options.onError?.(e))}}this.destroyed=!0}async settle(){let e=this.currentLayout;if(this.destroyed||!e)return;let t;try{t=this.host.capture()}catch(e){this.options.onError?.(e);return}let n=t.content!==this.savedContent;if(n&&this.autoSave){try{await this.write(e.id,e.name,t)}catch(e){this.dirty=!0,this.notify(),this.options.onError?.(e)}return}n!==this.dirty&&(this.dirty=n,this.notify())}async write(e,t,n=this.host.capture()){this.cancelTimer();let r={id:e,name:t,...n.symbol===void 0?{}:{symbol:n.symbol},...n.timeframe===void 0?{}:{timeframe:n.timeframe},updatedAt:this.now(),kind:this.kind,content:n.content};await this.storage.save(r);let i=$(r);return this.currentLayout=i,this.savedContent=n.content,this.dirty=!1,this.notify(),i}forget(){this.cancelTimer(),this.currentLayout=null,this.savedContent=null,this.dirty=!1,this.notify()}queue(e){this.busy++;let t=this.tail.then(e).finally(()=>{this.busy--,this.busy===0&&this.changedWhileBusy&&(this.changedWhileBusy=!1,this.changed())});return this.tail=t.catch(()=>void 0),t}cancelTimer(){this.timer&&=(clearTimeout(this.timer),null)}notify(){this.destroyed||this.options.onChange?.()}};Object.defineProperty(exports,`C`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`E`,{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`T`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return kt}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return Ke}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return B}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return Fe}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return Me}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return Pe}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return At}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return ze}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return Ne}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return jt}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return Et}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return z}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return Q}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return _t}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return Nt}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return H}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`w`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return Se}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return M}});
|
|
2
|
-
//# sourceMappingURL=LayoutSession-BOtFzvMm.cjs.map
|