openalgo-charts
Version:
From-scratch, dependency-free canvas charting engine for OpenAlgo: professional-grade interactive rendering, advanced on-chart trading, and a one-call widget tier that adds the toolbar, drawing rail, dialogs and shortcuts.
3 lines • 340 kB
JavaScript
var OpenAlgoCharts=function(e){"use strict";const t="2.3.2";const i={None:0,Cursor:1,Light:2,Full:3};class s{constructor(e=i.None){Object.defineProperty(this,"_globalLevel",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_panes",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"_timeScaleOps",{enumerable:!0,configurable:!0,writable:!0,value:[]}),this._globalLevel=e}get globalLevel(){return this._globalLevel}invalidateGlobal(e){e>this._globalLevel&&(this._globalLevel=e)}invalidatePane(e,t){var i,s;this._panes.set(e,(i=this._panes.get(e),s=t,void 0===i?{...s}:{level:Math.max(i.level,s.level),autoScale:i.autoScale||s.autoScale}))}paneInvalidation(e){return this._panes.get(e)}panes(){return this._panes}addTimeScaleOp(e){this._timeScaleOps.push(e)}timeScaleOps(){return this._timeScaleOps}isEmpty(){return this._globalLevel===i.None&&0===this._panes.size&&0===this._timeScaleOps.length}merge(e){this.invalidateGlobal(e._globalLevel);for(const[t,i]of e._panes)this.invalidatePane(t,i);e._timeScaleOps.length>0&&(this._timeScaleOps=this._timeScaleOps.concat(e._timeScaleOps))}}const r=()=>{};class n{constructor(e,t,i){if(Object.defineProperty(this,"_onFrame",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_schedule",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_cancel",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_handle",{enumerable:!0,configurable:!0,writable:!0,value:null}),this._onFrame=e,t)this._schedule=t,this._cancel=i??r;else{const e="function"==typeof requestAnimationFrame?{schedule:e=>requestAnimationFrame(e),cancel:e=>cancelAnimationFrame(e)}:{schedule:e=>setTimeout(e,16),cancel:e=>clearTimeout(e)};this._schedule=e.schedule,this._cancel=e.cancel}}get scheduled(){return null!==this._handle}requestFrame(){if(null!==this._handle)return;this._handle=-1;const e=this._schedule(()=>{this._handle=null,this._onFrame()});null!==this._handle&&(this._handle=e)}stop(){null!==this._handle&&(this._cancel(this._handle),this._handle=null)}}function o(e,t,i){return{width:Math.round(e*i),height:Math.round(t*i)}}function a(e,t){return Math.round(e*t)/t}class l{constructor(e,t){Object.defineProperty(this,"element",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"ctx",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_mediaWidth",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_mediaHeight",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_dpr",{enumerable:!0,configurable:!0,writable:!0,value:1}),this.element=e.createElement("canvas");const i=this.element.getContext("2d");if(null===i)throw new Error("openalgo-charts: 2D canvas context is not available");this.ctx=i;const s=this.element.style;s.position="absolute",s.top="0",s.left="0",s.width="100%",s.height="100%",s.zIndex=String(t)}get mediaWidth(){return this._mediaWidth}get mediaHeight(){return this._mediaHeight}get pixelRatio(){return this._dpr}resize(e,t,i){if(e===this._mediaWidth&&t===this._mediaHeight&&i===this._dpr)return;this._mediaWidth=e,this._mediaHeight=t,this._dpr=i;const s=o(e,t,i);this.element.width=s.width,this.element.height=s.height,this.element.style.width=`${e}px`,this.element.style.height=`${t}px`}clearBitmap(){this.ctx.setTransform(1,0,0,1,0,0),this.ctx.clearRect(0,0,this.element.width,this.element.height)}}function h(e,t,i){return e<t?t:e>i?i:e}function c(e){const t=Math.floor(Math.log10(e)),i=e/Math.pow(10,t);for(const e of[1,2,2.5,5])if(e>i*(1+1e-9))return e*Math.pow(10,t);return 10*Math.pow(10,t)}function u(e,t,i){const s=Math.ceil(e/i)*i,r=Math.floor(t/i)*i;return Math.round((r-s)/i)+1}function d(e,t,i=6){if(!isFinite(e)||!isFinite(t)||t<=e)return[Number.isFinite(e)?e:0];let s=function(e){if(e<=0)return 0;const t=Math.floor(Math.log10(e)),i=e/Math.pow(10,t);let s;return s=i<1.5?1:i<3?2:i<7?5:10,s*Math.pow(10,t)}((t-e)/Math.max(1,i-1));if(!(s>0))return[e];for(let r=0;r<20&&u(e,t,s)>i;r++)s=c(s);const r=Math.ceil(e/s)*s,n=Math.floor(t/s)*s,o=[],a=Math.round((n-r)/s)+1;for(let e=0;e<a&&e<1e3;e++){const t=r+e*s;o.push(Math.abs(t)<s/1e6?0:t)}return o}function _(e){return e<=0||!isFinite(e)?2:e>=1?0:Math.min(8,Math.ceil(-Math.log10(e)))}function b(e){return"percentage"===e||"indexed-to-100"===e}const p={marginTop:.1,marginBottom:.1,minMove:0,minPrecision:0,mode:"linear",inverted:!1};function f(e,t,i,s){if(!isFinite(e)||!isFinite(t))return{min:0,max:1};if(t<=e){const i=Math.abs(t)>0?.05*Math.abs(t):.5;return{min:e-i,max:t+i}}const r=(t-e)/Math.max(1-i-s,.01);return{min:e-r*s,max:t+r*i}}class m{constructor(e={}){Object.defineProperty(this,"_options",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_height",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_min",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_max",{enumerable:!0,configurable:!0,writable:!0,value:1}),Object.defineProperty(this,"_autoScale",{enumerable:!0,configurable:!0,writable:!0,value:!0}),Object.defineProperty(this,"_scaled",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"_baseline",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_fixedRange",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_priceFormatter",{enumerable:!0,configurable:!0,writable:!0,value:null}),this._options={...p,...e}}get options(){return this._options}setOptions(e){this._options={...this._options,...e},b(this._options.mode)||(this._baseline=null)}setHeight(e){this._height=e}get height(){return this._height}setPriceRange(e){this._min=e.min,this._max=e.max,this._scaled=!0}get scaled(){return this._scaled}setBaseline(e){this._baseline=e}get baseline(){return this._baseline}priceRange(){return{min:this._min,max:this._max}}get autoScale(){return this._autoScale}setAutoScale(e){e&&null!==this._fixedRange?this.setPriceRange(this._fixedRange):this._autoScale=e}setFixedRange(e){this._fixedRange=null===e?null:{...e},null!==e&&(this._autoScale=!1,this.setPriceRange(e))}get fixedRange(){return null===this._fixedRange?null:{...this._fixedRange}}reset(){this._autoScale&&(this._min=0,this._max=1,this._scaled=!1,this._baseline=null)}scaleAroundCenter(e){const t=(this._min+this._max)/2,i=(this._max-this._min)/2*e;this._min=t-i,this._max=t+i,this._autoScale=!1}scaleAtY(e,t){if(!this._scaled||this._height<=0||!Number.isFinite(t)||t<=0)return;const i=this._t(this._min),s=this._t(this._max),r=this._t(this.yToPrice(e)),n=this._tInv(r+(i-r)*t),o=this._tInv(r+(s-r)*t);Number.isFinite(n)&&Number.isFinite(o)&&o>n&&(this.setPriceRange({min:n,max:o}),this._autoScale=!1)}panByPixels(e){if(this._height<=0||0===e)return;const t=this._t(this._min),i=this._t(this._max),s=i-t;if(!(s>0))return;const r=s*((this._options.inverted?-e:e)/this._height);this._min=this._tInv(t+r),this._max=this._tInv(i+r),this._autoScale=!1}autoscale(e,t,i=1){if(null!==this._fixedRange)return this.setPriceRange(this._fixedRange),!1;const s=f(e,t,this._options.marginTop,this._options.marginBottom),r=this._t(this._min),n=this._t(this._max),o=this._t(s.min),a=this._t(s.max),l=n-r,c=a-o,u=Math.max(Math.abs((o-r)/l),Math.abs((a-n)/l))*this._height;if(!this._scaled||i>=1||!Number.isFinite(i)||!(l>0)||!(c>0)||u<.1)return this.setPriceRange(s),!1;const d=h(i,0,1),_=(1-d)/l+d/c,b=((1-d)*r/l+d*o/c)/_;return this.setPriceRange({min:this._tInv(b),max:this._tInv(b+1/_)}),!0}_rebase(){const e=this._options.mode;if("percentage"!==e&&"indexed-to-100"!==e)return null;const t=this._baseline;return null!==t&&isFinite(t)&&t>0?t:null}_t(e){if("logarithmic"===this._options.mode)return Math.log10(Math.max(1e-10,e));const t=this._rebase();if(null===t)return e;const i=e/t*100;return"percentage"===this._options.mode?i-100:i}_tInv(e){if("logarithmic"===this._options.mode)return Math.pow(10,e);const t=this._rebase();return null===t?e:("percentage"===this._options.mode?e+100:e)*t/100}priceToY(e){const t=this._t(this._min),i=this._t(this._max)-t;if(i<=0)return this._height/2;const s=(this._t(e)-t)/i;return this._options.inverted?this._height*s:this._height*(1-s)}yToPrice(e){const t=this._t(this._min),i=this._t(this._max)-t,s=this._options.inverted?e/this._height:1-e/this._height;return this._tInv(t+s*i)}precision(){if(null!==this._rebase())return Math.max(2,_((this._t(this._max)-this._t(this._min))/100));if(this._options.minMove>0)return _(this._options.minMove);const e=_((this._max-this._min)/100),t=Math.max(Math.abs(this._min),Math.abs(this._max));return!Number.isFinite(t)||t>=1e4?e:Math.max(this._options.minPrecision,e)}ticks(e=6){return null===this._rebase()?d(this._min,this._max,e):d(this._t(this._min),this._t(this._max),e).map(e=>this._tInv(e))}snapToTick(e){const t=this._options.minMove;return t<=0?e:Math.round(e/t)*t}setPriceFormatter(e){this._priceFormatter=e}format(e){if(null!==this._rebase()){const t=this.precision(),i=this._t(e);if("indexed-to-100"===this._options.mode)return i.toFixed(t);const s=Number(i.toFixed(t));return`${s>0?"+":""}${(0===s?0:i).toFixed(t)}%`}return null!==this._priceFormatter?this._priceFormatter(e):e.toFixed(this.precision())}clampY(e){return h(e,0,this._height)}}const g={barSpacing:8,minBarSpacing:1,maxBarSpacing:80,rightOffset:4};class v{constructor(e={}){Object.defineProperty(this,"_barSpacing",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_rightOffset",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_minBarSpacing",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_maxBarSpacing",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_width",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_baseIndex",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_onChange",{enumerable:!0,configurable:!0,writable:!0,value:null});const t={...g,...e};this._barSpacing=t.barSpacing,this._rightOffset=t.rightOffset,this._minBarSpacing=t.minBarSpacing,this._maxBarSpacing=t.maxBarSpacing}setWidth(e){this._width=e}get width(){return this._width}get barSpacing(){return this._barSpacing}setBarSpacing(e){this._barSpacing=this.constrainBarSpacing(e)}constrainBarSpacing(e){return h(e,this._minBarSpacing,this._maxBarSpacing)}get rightOffset(){return this._rightOffset}setRightOffset(e){this._rightOffset=e}setBaseIndex(e){this._baseIndex=e}_rightEdgeIndex(){return this._baseIndex+this._rightOffset}indexToX(e){return this._width-(this._rightEdgeIndex()-e)*this._barSpacing}xToIndex(e){return this._rightEdgeIndex()-(this._width-e)/this._barSpacing}visibleRange(){const e=this._rightEdgeIndex();return{from:e-this._width/this._barSpacing,to:e}}getVisibleLogicalRange(){return this.visibleRange()}setVisibleLogicalRange(e){if(this._width<=0)return;const t=e.to-e.from;t>0&&(this.setBarSpacing(this._width/t),this._rightOffset=e.to-this._baseIndex,this._onChange?.())}setChangeHandler(e){this._onChange=e}scrollByPixels(e){this._rightOffset-=e/this._barSpacing}zoomAtX(e,t){const i=this.xToIndex(e),s=this._barSpacing;if(this.setBarSpacing(s*t),this._barSpacing===s)return;const r=i+(this._width-e)/this._barSpacing;this._rightOffset=r-this._baseIndex}fitContent(e){if(e<=0||this._width<=0)return;this._baseIndex=e-1,this._rightOffset=g.rightOffset;const t=this._width/(e+this._rightOffset);this.setBarSpacing(t)}}const y=[];class w{constructor(){Object.defineProperty(this,"_series",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"_sortedTimes",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"_indexByTime",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"_nextId",{enumerable:!0,configurable:!0,writable:!0,value:1})}createSeries(){const e=this._nextId++;return this._series.set(e,{bars:[]}),e}removeSeries(e){this._series.delete(e),this._rebuild()}setSeriesData(e,t){const i=this._series.get(e);if(void 0===i)throw new Error(`openalgo-charts: unknown series ${e}`);i.bars=function(e){const t=e.slice().sort((e,t)=>e.time-t.time);let i=0;for(let e=0;e<t.length;e++)i>0&&t[e].time===t[i-1].time?t[i-1]=t[e]:t[i++]=t[e];return t.length=i,t}(t),this._rebuild()}addBars(e,t){const i=this._series.get(e);if(void 0===i)throw new Error(`openalgo-charts: unknown series ${e}`);if(0===t.length)return;const s=new Map;for(const e of i.bars)s.set(e.time,e);for(const e of t)s.set(e.time,e);i.bars=Array.from(s.values()).sort((e,t)=>e.time-t.time),this._rebuild()}update(e,t){const i=this._series.get(e);if(void 0===i)throw new Error(`openalgo-charts: unknown series ${e}`);const s=i.bars,r=s[s.length-1];if(void 0===r||t.time>r.time){s.push(t);const e=this._sortedTimes.length,i=e>0?this._sortedTimes[e-1]:void 0;return void 0===i||t.time>i?(this._appendTime(t.time),"append"):this._indexByTime.has(t.time)?"replace":(this._rebuild(),"insert")}if(t.time===r.time)return s[s.length-1]=t,"replace";const n=s.findIndex(e=>e.time===t.time);return n>=0?(s[n]=t,"replace"):(this.addBars(e,[t]),"insert")}_appendTime(e){this._indexByTime.has(e)||(this._indexByTime.set(e,this._sortedTimes.length),this._sortedTimes.push(e))}get length(){return this._sortedTimes.length}get baseIndex(){return this._sortedTimes.length-1}indexToTime(e){return this._sortedTimes[e]}timeToIndex(e){return this._indexByTime.get(e)}indexToTimeFloat(e){const t=this._sortedTimes,i=t.length;if(0===i)return NaN;if(1===i)return t[0];if(e<=0)return t[0]+e*(t[1]-t[0]);if(e>=i-1)return t[i-1]+(e-(i-1))*(t[i-1]-t[i-2]);const s=Math.floor(e);return t[s]+(e-s)*(t[s+1]-t[s])}timeToIndexFloat(e){const t=this._sortedTimes,i=t.length;if(0===i)return NaN;if(1===i)return 0;if(e<=t[0]){const i=t[1]-t[0];return i>0?(e-t[0])/i:0}if(e>=t[i-1]){const s=t[i-1]-t[i-2];return s>0?i-1+(e-t[i-1])/s:i-1}let s=0,r=i-1;for(;s<r;){const i=s+r+1>>1;t[i]<=e?s=i:r=i-1}const n=t[s+1]-t[s];return n>0?s+(e-t[s])/n:s}seriesBars(e){return this._series.get(e)?.bars??y}indexedBars(e){const t=this._series.get(e);if(void 0===t)return[];const i=[];for(const e of t.bars){const t=this._indexByTime.get(e.time);void 0!==t&&i.push({index:t,bar:e})}return i}visibleBars(e,t,i){const s=this._series.get(e);if(void 0===s)return[];const r=s.bars,n=Math.max(0,Math.floor(t)),o=Math.min(this.baseIndex,Math.ceil(i));if(o<n||0===r.length)return[];const a=this._sortedTimes[n],l=this._sortedTimes[o];if(void 0===a||void 0===l)return[];let h=0,c=r.length;for(;h<c;){const e=h+c>>1;r[e].time<a?h=e+1:c=e}const u=[];for(let e=h;e<r.length;e++){const t=r[e].time;if(t>l)break;const i=this._indexByTime.get(t);void 0!==i&&u.push({index:i,bar:r[e]})}return u}lastIndexedBar(e){const t=this._series.get(e);if(void 0===t||0===t.bars.length)return null;const i=t.bars[t.bars.length-1],s=this._indexByTime.get(i.time);return void 0===s?null:{index:s,bar:i}}_rebuild(){const e=new Set;for(const t of this._series.values())for(const i of t.bars)e.add(i.time);this._sortedTimes=Array.from(e).sort((e,t)=>e-t),this._indexByTime.clear();for(let e=0;e<this._sortedTimes.length;e++)this._indexByTime.set(this._sortedTimes[e],e)}}function x(e,t){return"dashed"===e?[4*t,4*t]:"dotted"===e?[1*t,3*t]:[]}function S(e,t,i){const s=x(e.gridStyle,i);return{color:e.grid,lineWidth:t?.lineWidth??1,dash:s,vert:{color:t?.vertColor??e.grid,dash:void 0===t?.vertStyle?s:x(t.vertStyle,i)},horz:{color:t?.horzColor??e.grid,dash:void 0===t?.horzStyle?s:x(t.horzStyle,i)}}}function P(e,t,i,s,r,n,o,l){if(0!==t.length){e.strokeStyle=s?.color??r.color,e.setLineDash(s?.dash??r.dash??[]),e.beginPath();for(const s of t){const t=Math.round(a(s,n)*n);i?(e.moveTo(t,0),e.lineTo(t,l)):(e.moveTo(0,t),e.lineTo(o,t))}e.stroke()}}function O(e,t){const i=void 0===t?.fontSize?e.axisFontSize??11:h(Math.round(t.fontSize),10,14);return{textColor:t?.textColor??e.axisText,lineColor:t?.lineColor??e.axisLine,font:`${i}px system-ui, sans-serif`}}function M(e){const t={};return void 0!==e?.top&&(t.marginTop=h(e.top,0,49)/100),void 0!==e?.bottom&&(t.marginBottom=h(e.bottom,0,49)/100),t}const k={upColor:"#26a69a",downColor:"#ef5350",borderUpColor:"#26a69a",borderDownColor:"#ef5350",wickUpColor:"#26a69a",wickDownColor:"#ef5350",borderVisible:!0,wickVisible:!0};function T(e,t){const i=Math.floor(e*t*.8);let s=Math.max(1,i);if(s>=2){s%2!=Math.max(1,Math.floor(t))%2&&(s-=1)}return Math.max(1,s)}function C(e,t,i){return i.wickVisible?!0===i.hollow||!1===i.bodyVisible||e>t||i.borderVisible&&e>=3||i.upColor!==i.wickUpColor||i.downColor!==i.wickDownColor?"full":"wick":"full"}function I(e,t,i,s=1){const r=T(t,i),n=Math.max(1,Math.floor(i)),o=Math.round(e*i),a=Math.max(.05,Math.min(1,s)),l=1===a?r:Math.max(1,Math.round(r*a));return{cx:o,bodyX:o-Math.floor(l/2),bodyW:l,wickX:o-Math.floor(n/2),wickW:n}}function j(e,t,i,s,r,n=k){const o=T(s,r),a=Math.max(1,Math.floor(r)),l=n.widthScale?null:C(o,a,n);for(let o=0;o<t.length;o++){const{x:h,bar:c}=t[o],u=o>0?t[o-1].bar.close:t[o].prevClose,d=!0===n.colorByPreviousClose&&void 0!==u&&Number.isFinite(u)?c.close>=u:c.close>=c.open,_=Math.round(i(c.open)*r),b=Math.round(i(c.close)*r),p=Math.round(i(c.high)*r),f=Math.round(i(c.low)*r),m=I(h,s,r,n.widthScale?n.widthScale(c):1),g=m.cx,v=m.bodyW,y=g-m.bodyX,w=c.color;if(n.wickVisible&&(e.fillStyle=w??(d?n.wickUpColor:n.wickDownColor),e.fillRect(m.wickX,p,m.wickW,Math.max(1,f-p))),"wick"===(l??C(v,a,n)))continue;const x=Math.min(_,b),S=Math.max(1,Math.abs(b-_)),P=w??(d?n.upColor:n.downColor),O=w??(d?n.borderUpColor:n.borderDownColor);if(n.hollow&&d)e.strokeStyle=n.borderVisible?O:P,e.lineWidth=Math.max(1,a),e.strokeRect(g-y+.5,x+.5,v-1,S-1);else{const t=!1!==n.bodyVisible;t&&(e.fillStyle=P,e.fillRect(g-y,x,v,S)),n.borderVisible&&(!t||v>=3)&&(e.strokeStyle=O,e.lineWidth=1,e.strokeRect(g-y+.5,x+.5,v-1,S-1))}}}function L(e,t,i){const s=e.bar;return{cx:Math.round(e.x*i),yOpen:Math.round(t(s.open)*i),yClose:Math.round(t(s.close)*i),yHigh:Math.round(t(s.high)*i),yLow:Math.round(t(s.low)*i),up:s.close>=s.open}}function A(e,t,i,s,r,n,o=!1){const a=Math.max(1,Math.floor(T(s,r)/2)),l=Math.max(1,Math.floor(r));e.save();for(let s=0;s<t.length;s++){const h=t[s],c=L(h,i,r),u=s>0?t[s-1].bar.close:h.prevClose,d=!0===n.colorByPreviousClose&&void 0!==u&&Number.isFinite(u)?h.bar.close>=u:c.up;e.fillStyle=h.bar.color??(d?n.upColor??"#26a69a":n.downColor??"#ef5350"),e.fillRect(c.cx-Math.floor(l/2),c.yHigh,l,Math.max(1,c.yLow-c.yHigh)),o||(e.fillRect(c.cx-a,c.yOpen,a,l),e.fillRect(c.cx,c.yClose,a,l))}e.restore()}function z(e){const t=e.trim();if(t.startsWith("#")){const e=t.slice(1);if(3===e.length||4===e.length){const[t,i,s,r]=[...e].map(e=>parseInt(e+e,16));return[t,i,s].some(Number.isNaN)?null:{r:t,g:i,b:s,a:4===e.length?r/255:1}}if(6===e.length||8===e.length){const t=parseInt(e.slice(0,6),16);if(Number.isNaN(t))return null;const i=8===e.length?parseInt(e.slice(6,8),16)/255:1;return{r:t>>16&255,g:t>>8&255,b:255&t,a:Number.isNaN(i)?1:i}}return null}const i=/^rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*(?:,\s*([\d.]+)\s*)?\)$/i.exec(t);return null===i?null:{r:Number(i[1]),g:Number(i[2]),b:Number(i[3]),a:void 0===i[4]?1:Number(i[4])}}function F(e){return function(e){const t=z(e);if(null===t)return.5;const i=e=>{const t=e/255;return t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4)};return.2126*i(t.r)+.7152*i(t.g)+.0722*i(t.b)}(e)>.45?"#10131a":"#ffffff"}function B(e,t){const i=z(e);return null===i?e:`rgba(${i.r},${i.g},${i.b},${t})`}function $(e,t){const i=z(e);if(null===i)return e;const s=t>=0?255:0,r=Math.min(1,Math.abs(t)),n=e=>Math.round(e+(s-e)*r);return`rgba(${n(i.r)},${n(i.g)},${n(i.b)},${i.a})`}function N(e,t,i,s,r,n){const o=e.roundRect;"function"==typeof o?o.call(e,t,i,s,r,Math.max(0,Math.min(n,s/2,r/2))):e.rect(t,i,s,r)}const R=new WeakMap;function W(e,t,i,s){let r=R.get(e);void 0===r&&(r=new Map,R.set(e,r));const n=`${Math.round(t)}|${i}|${s}`;let o=r.get(n);return void 0===o&&(o=e.createLinearGradient(0,0,0,t),o.addColorStop(0,i),o.addColorStop(1,s),r.set(n,o)),o}function D(e,t,i=e=>e.close){return e.map(e=>({x:e.x,y:t(i(e.bar))}))}function E(e,t,i,s){if(0===t.length)return;const r=e.strokeStyle;let n,o;e.beginPath();let a=!1;for(let l=0;l<t.length;l++){const h=t[l];if(!Number.isFinite(h.x)||!Number.isFinite(h.y)){n=void 0;continue}if(void 0===n){e.moveTo(h.x*i,h.y*i),n=h;continue}const c=void 0===s?o:s[l];c!==o&&(a&&(e.stroke(),e.beginPath(),e.moveTo(n.x*i,n.y*i),a=!1),e.strokeStyle=c??r,o=c),e.lineTo(h.x*i,h.y*i),n=h,a=!0}e.stroke()}function q(e,t,i,s,r){const n=D(t,i),o=r.step?function(e){if(0===e.length)return[];const t=[{...e[0]}];for(let i=1;i<e.length;i++)t.push({x:e[i].x,y:e[i-1].y}),t.push({x:e[i].x,y:e[i].y});return t}(n):n,a=function(e,t){let i=!1;for(const t of e)if(void 0!==t.bar.color){i=!0;break}if(!i)return;const s=[];for(const i of e)t&&s.length>0&&s.push(i.bar.color),s.push(i.bar.color);return s}(t,!0===r.step);e.save(),e.strokeStyle=r.color??"#4f8cff",e.lineWidth=Math.max(1,(r.lineWidth??1.5)*s),e.lineJoin="round",e.lineCap="round";const l="dashed"===r.lineStyle?[6*s,4*s]:"dotted"===r.lineStyle?[1*s,3*s]:[];if(e.setLineDash(l),r.markersOnly||E(e,o,s,a),e.setLineDash([]),r.markers||r.markersOnly){const i=(r.markerRadius??2)*s,o=r.color??"#4f8cff";e.fillStyle=o;for(let r=0;r<n.length;r++){const l=n[r];Number.isFinite(l.x)&&Number.isFinite(l.y)&&(void 0!==a&&(e.fillStyle=t[r].bar.color??o),e.beginPath(),e.arc(l.x*s,l.y*s,i,0,2*Math.PI),e.fill())}}e.restore()}const H={color:"#3a4666",base:0};function V(e,t,i={}){return{...k,upColor:e.upColor??t.upColor,downColor:e.downColor??t.downColor,borderUpColor:e.borderUpColor??t.upColor,borderDownColor:e.borderDownColor??t.downColor,wickUpColor:e.wickUpColor??t.wickUpColor,wickDownColor:e.wickDownColor??t.wickDownColor,borderVisible:e.borderVisible??k.borderVisible,bodyVisible:e.bodyVisible??!0,wickVisible:e.wickVisible??k.wickVisible,colorByPreviousClose:e.colorByPreviousClose,...i}}const G=e=>({min:e.low,max:e.high}),U=e=>({min:e.close,max:e.close}),Y=(e,t)=>{const i=t.base??0;return{min:Math.min(i,e.close),max:Math.max(i,e.close)}},K=new Map,Z=new Set(["point-figure","kagi"]);function X(e,t){K.set(e,t)}function J(e){const t=K.get(e);if(void 0===t){if(Z.has(e))throw new Error(`openalgo-charts: series type "${e}" needs the transform tier — import 'openalgo-charts/transform' first`);throw new Error(`openalgo-charts: unknown series type "${e}"`)}return t}const Q=(e,t)=>({...e,upColor:e.upColor??t.upColor,downColor:e.downColor??t.downColor});function ee(e,t,i=.5,s=1){const r=e*t;if(r<=0)return 1;const n=i*Math.max(1,s);return r>=n?1:Math.max(1,Math.ceil(n/r))}function te(e){const t=e[0];let i=t.high,s=t.low,r=t.volume??0,n=void 0!==t.volume;for(let t=1;t<e.length;t++){const o=e[t];o.high>i&&(i=o.high),o.low<s&&(s=o.low),void 0!==o.volume&&(r+=o.volume,n=!0)}const o={time:t.time,open:t.open,high:i,low:s,close:e[e.length-1].close};return n&&(o.volume=r),o}function ie(e,t){if(t<=1)return e.map(e=>({x:e.x,bar:e.bar}));const i=[];for(let s=0;s<e.length;s+=t){const r=e.slice(s,s+t),n=r.reduce((e,t)=>e+t.x,0)/r.length;i.push({x:n,bar:te(r.map(e=>e.bar))})}return i}X("candlestick",{defaultStyle:{},isPriceSeries:!0,draw:(e,t,i,s,r,n,o)=>j(e,t,i,s,r,V(n,o.theme)),extents:G}),X("hollow-candle",{defaultStyle:{},isPriceSeries:!0,draw:(e,t,i,s,r,n,o)=>j(e,t,i,s,r,V(n,o.theme,{hollow:!0})),extents:G}),X("volume-candle",{defaultStyle:{},isPriceSeries:!0,draw:(e,t,i,s,r,n,o)=>{const a=o.maxVolume;j(e,t,i,s,r,V(n,o.theme,{widthScale:e=>a>0?(e.volume??0)/a:1}))},extents:G}),X("bar",{defaultStyle:{},isPriceSeries:!0,draw:(e,t,i,s,r,n,o)=>A(e,t,i,s,r,Q(n,o.theme)),extents:G}),X("high-low",{defaultStyle:{},isPriceSeries:!0,draw:(e,t,i,s,r,n,o)=>A(e,t,i,s,r,Q(n,o.theme),!0),extents:G}),X("line",{defaultStyle:{lineWidth:1.5},isPriceSeries:!0,draw:(e,t,i,s,r,n,o)=>q(e,t,i,r,{...n,color:n.color??o.theme.lineColor}),extents:U}),X("line-markers",{defaultStyle:{lineWidth:1.5,markers:!0},isPriceSeries:!0,draw:(e,t,i,s,r,n,o)=>q(e,t,i,r,{...n,color:n.color??o.theme.lineColor,markers:!0}),extents:U}),X("step",{defaultStyle:{lineWidth:1.5,step:!0},isPriceSeries:!0,draw:(e,t,i,s,r,n,o)=>q(e,t,i,r,{...n,color:n.color??o.theme.lineColor,step:!0}),extents:U}),X("area",{defaultStyle:{lineWidth:1.5},isPriceSeries:!0,draw:(e,t,i,s,r,n,o)=>function(e,t,i,s,r,n){const o=D(t,i);if(0===o.length)return;const a=r*s;e.save(),e.beginPath(),e.moveTo(o[0].x*s,a);for(const t of o)e.lineTo(t.x*s,t.y*s);e.lineTo(o[o.length-1].x*s,a),e.closePath(),e.fillStyle=W(e,a,n.areaTopColor??"rgba(79,140,255,0.40)",n.areaBottomColor??"rgba(79,140,255,0.00)"),e.fill(),e.restore(),q(e,t,i,s,{color:n.color??"#4f8cff",lineWidth:n.lineWidth??1.5,lineStyle:n.lineStyle})}(e,t,i,r,o.plotHeight,{...n,color:n.color??o.theme.lineColor,areaTopColor:n.areaTopColor??o.theme.areaTopColor,areaBottomColor:n.areaBottomColor??o.theme.areaBottomColor}),extents:U}),X("hlc-area",{defaultStyle:{lineWidth:1.5},isPriceSeries:!0,draw:(e,t,i,s,r,n,o)=>function(e,t,i,s,r){if(0===t.length)return;const n=D(t,i,e=>e.high),o=D(t,i,e=>e.low);e.save(),e.beginPath(),e.moveTo(n[0].x*s,n[0].y*s);for(const t of n)e.lineTo(t.x*s,t.y*s);for(let t=o.length-1;t>=0;t--)e.lineTo(o[t].x*s,o[t].y*s);e.closePath(),e.fillStyle=r.areaTopColor??"rgba(79,140,255,0.15)",e.fill(),e.restore();for(const[t,i]of[[r.highColor,n],[r.lowColor,o]])void 0!==t&&(e.save(),e.strokeStyle=t,e.lineWidth=Math.max(1,Math.round((r.lineWidth??1.5)*s)),E(e,i,s),e.restore());q(e,t,i,s,{color:r.closeColor??"#4f8cff",lineWidth:r.lineWidth??1.5})}(e,t,i,r,{...n,closeColor:n.closeColor??o.theme.lineColor}),extents:G}),X("baseline",{defaultStyle:{baseValue:0,lineWidth:1.5},isPriceSeries:!0,draw:(e,t,i,s,r,n,o)=>function(e,t,i,s,r){const n=i(r.baseValue??0)*s,o=D(t,i);if(0===o.length)return;const a=o[0].x*s,l=o[o.length-1].x*s,h=()=>{e.beginPath(),e.moveTo(a,n);for(const t of o)e.lineTo(t.x*s,t.y*s);e.lineTo(l,n),e.closePath()},c=r.areaTopColor??"rgba(38,166,154,0.20)",u=r.areaBottomColor??"rgba(239,83,80,0.20)",d=1e5;e.save(),e.beginPath(),e.rect(a,n-d,l-a,d),e.clip(),h(),e.fillStyle=W(e,n,c,"rgba(0,0,0,0)"),e.fill(),e.restore(),e.save(),e.beginPath(),e.rect(a,n,l-a,d),e.clip(),h(),e.fillStyle=u,e.fill(),e.restore(),e.save();for(let t=1;t<o.length;t++){const i=o[t-1],a=o[t],l=(i.y+a.y)/2<=n/s;e.strokeStyle=l?r.topColor??"#26a69a":r.bottomColor??"#ef5350",e.lineWidth=Math.max(1,Math.round((r.lineWidth??1.5)*s)),e.beginPath(),e.moveTo(i.x*s,i.y*s),e.lineTo(a.x*s,a.y*s),e.stroke()}e.restore()}(e,t,i,r,{...n,topColor:n.topColor??o.theme.baselineTopLine,bottomColor:n.bottomColor??o.theme.baselineBottomLine,areaTopColor:n.areaTopColor??o.theme.baselineTopFill,areaBottomColor:n.areaBottomColor??o.theme.baselineBottomFill}),extents:(e,t)=>{const i=t.baseValue??0;return{min:Math.min(i,e.close),max:Math.max(i,e.close)}}}),X("column",{defaultStyle:{base:0},isPriceSeries:!1,draw:(e,t,i,s,r,n,o)=>function(e,t,i,s,r,n){const o=T(s,r),a=Math.floor(o/2),l=Math.round(i(n.base??0)*r);e.save();for(const s of t){const t=L(s,i,r);e.fillStyle=s.bar.color??n.color??(t.up?n.upColor??"#26a69a":n.downColor??"#ef5350");const h=Math.min(l,t.yClose);e.fillRect(t.cx-a,h,o,Math.max(1,Math.abs(l-t.yClose)))}e.restore()}(e,t,i,s,r,Q(n,o.theme)),extents:Y}),X("histogram",{defaultStyle:{base:0,color:"#3a4666"},isPriceSeries:!1,draw:(e,t,i,s,r,n)=>{!function(e,t,i,s,r,n=H){const o=T(s,r),a=Math.floor(o/2),l=Math.round(i(n.base)*r);let h="";for(const{x:s,bar:c}of t){const t=c.color??n.color;t!==h&&(e.fillStyle=t,h=t);const u=Math.round(s*r),d=Math.round(i(c.close)*r),_=Math.min(l,d),b=Math.max(1,Math.abs(l-d));e.fillRect(u-a,_,o,b)}}(e,t,i,s,r,{color:n.color??"#3a4666",base:n.base??0})},extents:Y});const se=19800;function re(e){return Math.floor(e/1e3)}function ne(e){const t=e.trim(),i=/^(\d{4})-(\d{2})-(\d{2})(?:[ T](\d{2}):(\d{2})(?::(\d{2}))?)?/.exec(t);if(null===i)throw new Error(`openalgo-charts: unparseable IST time string "${e}"`);const s=Number(i[1]),r=Number(i[2]),n=Number(i[3]),o=void 0!==i[4]?Number(i[4]):0,a=void 0!==i[5]?Number(i[5]):0,l=void 0!==i[6]?Number(i[6]):0,h=Date.UTC(s,r-1,n,o,a,l);return Math.floor(h/1e3)-se}function oe(e){const t=new Date(1e3*(e+se));return{year:t.getUTCFullYear(),month:t.getUTCMonth()+1,day:t.getUTCDate(),hour:t.getUTCHours(),minute:t.getUTCMinutes(),second:t.getUTCSeconds(),weekday:t.getUTCDay()}}const ae=e=>e<10?`0${e}`:String(e);function le(e){const t=oe(e);return`${ae(t.hour)}:${ae(t.minute)}`}function he(e){const t=oe(e);return`${ae(t.hour)}:${ae(t.minute)}:${ae(t.second)}`}function ce(e){const t=oe(e);return`${t.year}-${ae(t.month)}-${ae(t.day)}`}const ue=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function de(e){const t=oe(e);return`${ae(t.day)} ${ue[t.month-1]}`}const _e=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];function be(e,t){const i=oe(e),s=oe(t);return i.year!==s.year||i.month!==s.month||i.day!==s.day}const pe="Asia/Kolkata",fe=new Map,me={Sun:0,Mon:1,Tue:2,Wed:3,Thu:4,Fri:5,Sat:6};function ge(e){let t=fe.get(e);if(void 0===t){let i;try{i=new Intl.DateTimeFormat("en-US",{timeZone:e,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",weekday:"short"})}catch{throw new Error(`openalgo-charts: unknown IANA time zone "${e}"`)}t={format:i,parts:new Map,lastSecond:Number.NaN,lastParts:null},fe.set(e,t)}return t}function ve(e){if(fe.has(e))return!0;try{return ge(e),!0}catch{return!1}}function ye(e,t){const i=ge(t);if(e===i.lastSecond&&null!==i.lastParts)return i.lastParts;let s=i.parts.get(e);return void 0===s&&(s=function(e,t){let i=1970,s=1,r=1,n=0,o=0,a=0,l=4;for(const h of e.formatToParts(new Date(1e3*t)))switch(h.type){case"year":i=Number(h.value);break;case"month":s=Number(h.value);break;case"day":r=Number(h.value);break;case"hour":n=Number(h.value)%24;break;case"minute":o=Number(h.value);break;case"second":a=Number(h.value);break;case"weekday":l=me[h.value]??0}return{year:i,month:s,day:r,hour:n,minute:o,second:a,weekday:l,dayIndex:Math.floor(Date.UTC(i,s-1,r)/864e5)}}(i.format,e),i.parts.size>=4096&&i.parts.clear(),i.parts.set(e,s)),i.lastSecond=e,i.lastParts=s,s}function we(e,t=pe){const i=ye(e,t);return{year:i.year,month:i.month,day:i.day,hour:i.hour,minute:i.minute,second:i.second,weekday:i.weekday}}function xe(e,t=pe){const i=ye(e,t);return Math.floor(Date.UTC(i.year,i.month-1,i.day,i.hour,i.minute,i.second)/1e3)-e}function Se(e,t,i=pe){return ye(e,i).dayIndex!==ye(t,i).dayIndex}function Pe(e,t,i=pe){return Math.floor((ye(e,i).dayIndex+3)/7)!==Math.floor((ye(t,i).dayIndex+3)/7)}function Oe(e,t,i=pe){const s=ye(e,i),r=ye(t,i);return s.year!==r.year||s.month!==r.month}function Me(e,t,i=pe){const s=ye(e,i),r=ye(t,i);return s.year!==r.year||Math.floor((s.month-1)/3)!==Math.floor((r.month-1)/3)}function ke(e,t,i=pe){return ye(e,i).year!==ye(t,i).year}function Te(e,t,i,s=0,r=0,n=0,o=pe){const a=Math.floor(Date.UTC(e,t-1,i,s,r,n)/1e3),l=a-xe(a,o);return a-xe(l,o)}function Ce(e,t=pe){const i=ye(e,t);return`${ae(i.hour)}:${ae(i.minute)}`}function Ie(e,t=pe){const i=ye(e,t);return`${ae(i.hour)}:${ae(i.minute)}:${ae(i.second)}`}function je(e,t=pe){const i=ye(e,t);return`${ae(i.day)} ${ue[i.month-1]}`}function Le(e,t=pe){const i=ye(e,t);let s=`${_e[i.weekday]} ${ae(i.day)} ${ue[i.month-1]} '${String(i.year).slice(-2)}`;return 0===i.hour&&0===i.minute&&0===i.second||(s+=` ${ae(i.hour)}:${ae(i.minute)}`,0!==i.second&&(s+=`:${ae(i.second)}`)),s}function Ae(e){const t=function(e){const t=[];for(let i=1;i<e.length;i++){const s=e[i]-e[i-1];s>0&&t.push(s)}return 0===t.length?0:(t.sort((e,t)=>e-t),t[t.length>>1])}(e);if(t<=0||t>=86400)return null;const i=Math.max(4*t,14400),s=[];for(let t=1;t<e.length;t++)e[t]-e[t-1]>=i&&s.push(t);if(0===s.length)return null;const r=[e[0],...s.map(t=>e[t])],n=[];for(let e=1;e<r.length;e++)n.push(r[e]-r[e-1]);return n.sort((e,t)=>e-t),n[n.length>>1]>129600?null:s}function ze(e,t=pe){const i=new Array(e.length).fill(!1),s=Ae(e);if(null===s){const s=t===pe?be:(e,i)=>Se(e,i,t);for(let t=1;t<e.length;t++)i[t]=s(e[t-1],e[t]);return i}for(const e of s)i[e]=!0;return i}const Fe=/^\s*(\d{2})(\d{2})\s*-\s*(\d{2})(\d{2})(?:\s*:\s*([1-7]+))?\s*$/;function Be(e,t){const i=Number(e),s=Number(t);return i>23||s>59?-1:60*i+s}function $e(e){const t=Fe.exec(e);if(null===t)return null;const i=Be(t[1],t[2]),s=Be(t[3],t[4]);return i<0||s<0?null:void 0===t[5]?{start:i,end:s}:{start:i,end:s,days:[...t[5]].map(Number)}}function Ne(e,t){const i=60*e.hour+e.minute,s=t.end<=t.start,r=i<t.end;if(!(s?i>=t.start||r:i>=t.start&&r))return!1;if(void 0===t.days)return!0;const n=s&&r?(e.weekday+6)%7:e.weekday;return t.days.includes(n+1)}const Re={textColor:"#8b91a7",lineColor:"#2a3046",font:"11px system-ui, sans-serif"};function We(e){return!Number.isFinite(e)||e<=0?2:Math.max(2,Math.min(30,Math.round(e/32)))}const De=90,Ee=30,qe=10;function He(e,t=0){const i=new Array(e.length).fill(!1),s=e.map((e,t)=>t);s.sort((t,i)=>e[i].priority-e[t].priority||t-i);const r=[];for(const n of s){const s=e[n];if(!Number.isFinite(s.y)||!Number.isFinite(s.height))continue;let o=!0;for(const e of r)if(Math.abs(e.y-s.y)<(e.height+s.height)/2+t){o=!1;break}o&&(i[n]=!0,r.push(s))}return i}function Ve(e,t,i,s){if(void 0===s||0===s.length)return null;return He([...e.map(e=>({y:Math.round(t.priceToY(e)*i),height:16*i,priority:qe})),...s],2*i).slice(0,e.length)}function Ge(e,t,i,s){const r=s?"timeWithSeconds":"time";if(i===pe){const i=oe(e),s=oe(t);return i.year!==s.year?"year":i.month!==s.month?"month":i.day!==s.day?"day":r}return ke(e,t,i)?"year":Oe(e,t,i)?"month":Se(e,t,i)?"day":r}function Ue(e,t,i){const s=[];for(let r=e;r<=t;r+=i)s.push(r);return s}function Ye(e,t=64){const i=e.baseIndex,s=[];let r;for(let n=Math.max(0,i-t);n<=i;n++){const t=e.indexToTime(n);void 0!==t&&(void 0!==r&&t-r>0&&s.push(t-r),r=t)}return 0===s.length?0:(s.sort((e,t)=>e-t),s[s.length>>1])}const Ke=e=>e<10?`0${e}`:String(e);function Ze(e,t=!1){return(t?28:16)*e}function Xe(e,t,i,s,r,n,o,a){const l=e.measureText(n).width;e.fillStyle=o,e.fillRect(t+1,i-s/2,l+2*r,s),e.fillStyle=a,e.fillText(n,t+1+r,i)}function Je(e,t,i,s,r,n,o=Re){if(!Number.isFinite(i))return;const a=Math.round(t.priceToY(i)*n);a<0||a>r.plotHeight*n||(e.save(),e.font=tt(o.font,n),e.textAlign="left",e.textBaseline="middle",Xe(e,Math.round(r.plotWidth*n),a,Ze(n),6*n,t.format(i),s,F(s)),e.restore())}function Qe(e,t,i,s,r,n,o=Re,a={up:"#26a69a",down:"#ef5350",text:"#0d0e12"},l=!0,h=!0,c){if(!l&&!h)return;const u=Math.round(t.priceToY(i)*n);if(u<0||u>r.plotHeight*n)return;const d=s?a.up:a.down,_=Math.round(r.plotWidth*n);if(e.save(),l&&(e.strokeStyle=d,e.lineWidth=Math.max(1,Math.round(n)),e.setLineDash([3*n,3*n]),e.beginPath(),e.moveTo(0,u+.5),e.lineTo(_,u+.5),e.stroke(),e.setLineDash([])),h){const s=t.format(i),r=void 0!==c&&!0===c.visible,l=tt(o.font,n);e.font=l;const h=6*n,b=Ze(n,r);if(e.textAlign="left",e.textBaseline="middle",r){const t=function(e){if(null===e||!Number.isFinite(e))return"--:--:--";const t=Math.max(0,Math.ceil(e));return`${Ke(Math.floor(t/3600))}:${Ke(Math.floor(t%3600/60))}:${Ke(t%60)}`}(function(e,t,i){if(!Number.isFinite(t)||t<=0)return null;if(!Number.isFinite(e)||!Number.isFinite(i))return null;const s=i-e;return s<0?t-s:t-s%t}(c.lastBarTime,c.intervalSec,c.now())),i=tt(o.font,.9*n),r=e.measureText(s).width;e.font=i;const p=e.measureText(t).width;e.fillStyle=d,e.fillRect(_+1,u-b/2,Math.max(r,p)+2*h,b),e.fillStyle=a.text,e.font=l,e.fillText(s,_+1+h,u-b/4),e.font=i,e.fillText(t,_+1+h,u+b/4)}else Xe(e,_,u,b,h,s,d,a.text)}e.restore()}function et(e,t,i,s,r=Re){if(!0!==s.visible)return;if(t.timeAxisHeight<=0||t.priceAxisWidth<=0)return;const n=s.now();if(!Number.isFinite(n))return;const o=Math.floor(n),a=void 0!==s.timezone&&s.timezone!==pe&&ve(s.timezone)?s.timezone:pe,l=a===pe,h=l?he(o):Ie(o,a),c=l?se:xe(o,a),u=Math.round((t.plotWidth+t.priceAxisWidth/2)*i),d=Math.round(t.plotHeight*i),_=t.timeAxisHeight*i,b=!1!==s.showOffset&&t.timeAxisHeight>=20;e.save(),e.fillStyle=r.textColor,e.textAlign="center",e.textBaseline="middle",e.font=tt(r.font,i),b?(e.fillText(h,u,d+.3*_),e.font=tt(r.font,.82*i),e.fillText(function(e){const t=Math.round(e/60);if(0===t)return"UTC";const i=Math.abs(t),s=i%60;return`UTC${t<0?"-":"+"}${Math.floor(i/60)}${0===s?"":`:${Ke(s)}`}`}(c),u,d+.74*_)):e.fillText(h,u,d+_/2),e.restore()}function tt(e,t){return e.replace(/(^|[^\d.])(\d{1,5}(?:\.\d{1,4})?)px/,(e,i,s)=>`${i}${Number(s)*t}px`)}function it(e,t,i){return{color:t?.color??e.crosshair,width:t?.width??e.crosshairWidth??1,dash:x(t?.style??e.crosshairStyle??"dashed",i)}}function st(e,t,i,s,r,n,o,a=1,l=[4*n,4*n]){if(e.save(),e.strokeStyle=o,e.lineWidth=Math.max(1,a),e.setLineDash(l),t>=0&&t<=s){const i=Math.round(t*n)+.5;e.beginPath(),e.moveTo(i,0),e.lineTo(i,Math.round(r*n)),e.stroke()}if(null!==i&&i>=0&&i<=r){const t=Math.round(i*n)+.5;e.beginPath(),e.moveTo(0,t),e.lineTo(Math.round(s*n),t),e.stroke()}e.setLineDash([]),e.restore()}function rt(e){const t={top:2,normal:1,bottom:0};let i=null;for(const s of e)null!==s&&(null===i||s.distance<i.distance||s.distance===i.distance&&t[s.zOrder]>t[i.zOrder])&&(i=s);return i}function nt(e){return"canvas2d"===e.kind||void 0===e.device?null:e.device.lost?"context-lost":e.device.available?null:"unavailable"}const ot=new Map;function at(e,t){ot.set(e,t)}function lt(e="canvas2d"){const t=ot.get("canvas2d");if(void 0===t)throw new Error("openalgo-charts: no canvas2d render backend is registered");if("auto"===e){const e=ot.get("webgl2");return void 0===e?t:()=>e()??t()}const i=ot.get(e);if(void 0===i)throw new Error(`openalgo-charts: render backend "${e}" is not registered; import the tier that provides it first`);return"canvas2d"===e?i:()=>i()??t()}class ht{constructor(){Object.defineProperty(this,"kind",{enumerable:!0,configurable:!0,writable:!0,value:"canvas2d"}),Object.defineProperty(this,"_canvas",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_ctx",{enumerable:!0,configurable:!0,writable:!0,value:null})}mount(e,t){if(this._canvas=e,this._ctx=t??e.getContext("2d"),null===this._ctx)throw new Error("openalgo-charts: 2D canvas context is not available")}resize(e,t,i){}beginFrame(e){e&&null!==this._ctx&&null!==this._canvas&&(this._ctx.setTransform(1,0,0,1,0,0),this._ctx.clearRect(0,0,this._canvas.width,this._canvas.height))}drawSeries(e,t,i,s,r,n,o){null!==this._ctx&&e.draw(this._ctx,t,i,s,r,n,o)}endFrame(){}overlay2d(){return this._ctx}destroy(){this._ctx=null,this._canvas=null}}function ct(e,t){if("string"==typeof e.color)return e.color;const i=t?e.upColor:e.downColor;return"string"==typeof i?i:"string"==typeof e.closeColor?e.closeColor:void 0}at("canvas2d",()=>new ht);class ut{constructor(e,t=new ht){Object.defineProperty(this,"element",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"base",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"top",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_backend",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_rightScale",{enumerable:!0,configurable:!0,writable:!0,value:new m}),Object.defineProperty(this,"_leftScale",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_overlayScale",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_ratioLocks",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"weight",{enumerable:!0,configurable:!0,writable:!0,value:1}),Object.defineProperty(this,"_series",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"_primitives",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"_width",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_height",{enumerable:!0,configurable:!0,writable:!0,value:0}),this.element=e.createElement("div"),this.element.style.position="relative",this.element.style.width="100%",this.element.style.flex="1 1 auto",this.element.style.overflow="hidden",this.element.style.borderTopStyle="solid",this.element.style.borderTopWidth="0px",this.element.style.boxSizing="border-box",this.base=new l(e,0),this.top=new l(e,1),this.element.appendChild(this.base.element),this.element.appendChild(this.top.element),this._backend=t,t.mount(this.base.element,this.base.ctx)}get backend(){return this._backend}setBackend(e){e!==this._backend&&(this._backend.destroy(),this._backend=e,e.mount(this.base.element,this.base.ctx),this._width>0&&this._height>0&&e.resize(this._width,this._height,this.base.pixelRatio))}get backendDegradation(){return nt(this._backend)}get priceScale(){return this._rightScale}addSeries(e){this._scaleFor(e.scaleId),this._series.push(e)}_scaleFor(e){return"left"===e?this._leftScale??(this._leftScale=new m):""===e?this._overlayScale??(this._overlayScale=new m):this._rightScale}scaleFor(e){return this._scaleFor(e)}usesScale(e){return this._series.some(t=>t.scaleId===e)}moveSeriesScale(e,t){if(e===t||!this.usesScale(e)||this.usesScale(t))return!1;const i=this._scaleFor(e),s=this._scaleFor(t);"left"===t?(this._leftScale=i,this._rightScale=s):(this._rightScale=i,this._leftScale=s);for(const i of this._series)i.scaleId===e&&(i.scaleId=t);s.setFixedRange(null),s.setAutoScale(!0),s.reset();const r=this._ratioLocks.get(e);return void 0!==r&&(this._ratioLocks.delete(e),this._ratioLocks.set(t,r)),!0}ratioLocked(e){return this._ratioLocks.has(e)}setRatioLock(e,t,i,s){if(!t)return this._ratioLocks.delete(e),!0;const r=this._scaleFor(e);return!!(r.scaled&&i>0&&s>0)&&(r.setAutoScale(!1),this._ratioLocks.set(e,{barSpacing:i,height:s}),!0)}clearRatioLocks(){this._ratioLocks.clear()}scaleOf(e){return this._scaleFor(e.scaleId)}scales(){const e=[this.priceScale];return null!==this._leftScale&&e.push(this._leftScale),null!==this._overlayScale&&e.push(this._overlayScale),e}axisScales(){const e=[this.priceScale];return null!==this._leftScale&&e.push(this._leftScale),e}hasLeftScale(){return null!==this._leftScale&&this._series.some(e=>"left"===e.scaleId)}removeSeries(e){const t=this._series.indexOf(e);return!(t<0)&&(this._series.splice(t,1),this._series.some(t=>t.scaleId===e.scaleId)||this._scaleFor(e.scaleId).reset(),!0)}series(){return this._series}primitives(){return this._primitives}addPrimitive(e,t){this._primitives.push(e),e.attached?.(t)}hasPrimitive(e){return this._primitives.includes(e)}removePrimitive(e){const t=this._primitives.indexOf(e);return!(t<0)&&(this._primitives.splice(t,1),e.detached?.(),!0)}destroy(){for(const e of this._primitives)e.detached?.();this._primitives.length=0,this._backend.destroy(),this.element.remove()}_primitiveContext(e){const t=this._layout(e);return{timeScale:e.timeScale,priceScale:this.priceScale,readoutPriceScale:this._readoutScale(),dataLayer:e.dataLayer,plotWidth:t.plotWidth,plotHeight:t.plotHeight,priceAxisWidth:e.priceAxisWidth,dpr:e.dpr,theme:e.theme,hoverId:e.hoverId??null,dragId:e.dragId??null,bars:()=>{for(const t of this._series)if(J(t.type).isPriceSeries)return e.dataLayer.seriesBars(t.dataId);return[]}}}hitTestPrimitives(e,t,i){const s=this._primitiveContext(i);return rt(this._primitives.map(i=>i.hitTest?i.hitTest(e,t,s):null))}resize(e,t,i){this._width=e,this._height=t,this.base.resize(e,t,i),this.top.resize(e,t,i),this._backend.resize(e,t,i)}setLayoutSize(e,t){this._width=e,this._height=t}setScaleHeights(e){this.priceScale.setHeight(e),this._leftScale?.setHeight(e),this._overlayScale?.setHeight(e)}_layout(e){const t=e.leftAxisWidth??0;return{plotWidth:Math.max(0,this._width-e.priceAxisWidth-t),plotHeight:Math.max(0,this._height-(e.showTimeAxis?e.timeAxisHeight:0)),priceAxisWidth:e.priceAxisWidth,timeAxisHeight:e.showTimeAxis?e.timeAxisHeight:0,plotLeft:t}}autoscale(e,t=1){let i=!1;const s=this._layout(e),r=e.timeScale.visibleRange();i=this._autoscaleScale(this.priceScale,e=>"right"===e.scaleId,!0,e,s.plotHeight,r,t)||i,this._leftScale&&(i=this._autoscaleScale(this._leftScale,e=>"left"===e.scaleId,!1,e,s.plotHeight,r,t)||i),this._overlayScale&&(i=this._autoscaleScale(this._overlayScale,e=>""===e.scaleId,!1,e,s.plotHeight,r,t)||i),this._ratioLocks.size>0&&this._applyRatioLocks(e.timeScale.barSpacing,s.plotHeight);for(const e of this._primitives)e.afterAutoscale?.();return i}_autoscaleScale(e,t,i,s,r,n,o){e.setHeight(r);const a=e.options.mode;if("percentage"!==a&&"indexed-to-100"!==a||e.setBaseline(this._firstVisibleValue(t,s,n)),!e.autoScale)return!1;let l=1/0,h=-1/0;for(const e of this._series){if(!1===e.style.visible||!t(e))continue;const i=J(e.type);for(const t of s.dataLayer.visibleBars(e.dataId,n.from,n.to)){const s=i.extents(t.bar,e.style);s.min<l&&(l=s.min),s.max>h&&(h=s.max)}}if(i)for(const e of this._primitives){const t=e.autoscaleInfo?.();t&&(t.min<l&&(l=t.min),t.max>h&&(h=t.max))}return l<=h&&e.autoscale(l,h,o)}_applyRatioLocks(e,t){if(e>0&&t>0)for(const[i,s]of this._ratioLocks){const r=t/e/(s.height/s.barSpacing);if(s.barSpacing=e,s.height=t,!isFinite(r)||r<=0||Math.abs(r-1)<1e-9)continue;const n=this._scaleFor(i);n.scaled&&this._scaleSpan(n,r)}}_scaleSpan(e,t){const i=e.height;if(!(i>0))return;const s=i/2*t,r=e.yToPrice(i/2-s),n=e.yToPrice(i/2+s);isFinite(r)&&isFinite(n)&&r!==n&&e.setPriceRange({min:Math.min(r,n),max:Math.max(r,n)})}_firstVisibleValue(e,t,i){for(const s of this._series)if(!1!==s.style.visible&&e(s))for(const e of t.dataLayer.visibleBars(s.dataId,i.from,i.to))if(isFinite(e.bar.close))return e.bar.close;return null}paintBase(e,t){const i=this._layout(e),s=e.dpr,r=t??this._backend.overlay2d()??this.base.ctx;void 0===t&&this._backend.beginFrame(!0);const n=O(e.theme,e.canvasOptions?.scales);!1!==e.paintBackground&&"transparent"!==e.theme.background&&(r.fillStyle=e.theme.background,r.fillRect(0,0,Math.round(this._width*s),Math.round(this._height*s))),this._leftScale&&i.plotLeft>0&&this._leftScale.scaled&&function(e,t,i,s,r,n=Re,o){const a=t.ticks(We(s)),l=Ve(a,t,r,o),h=Math.round(i*r);e.save(),e.strokeStyle=n.lineColor,e.fillStyle=n.textColor,e.font=tt(n.font,r),e.textAlign="right",e.textBaseline="middle",e.lineWidth=1,e.beginPath(),e.moveTo(h-.5,0),e.lineTo(h-.5,Math.round(s*r)),e.stroke();for(let i=0;i<a.length;i++){if(null!==l&&!l[i])continue;const n=a[i],o=Math.round(t.priceToY(n)*r);o<0||o>s*r||e.fillText(t.format(n),h-6*r,o)}e.restore()}(r,this._leftScale,i.plotLeft,i.plotHeight,s,n),r.save(),i.plotLeft>0&&r.translate(Math.round(i.plotLeft*s),0);const o=e.canvasOptions?.grid,a=function(e,t,i){const s=Math.max(1,i.spacing),r=[];if(!1!==i.vertLines)for(let t=s;t<e;t+=s)r.push(t);const n=[];if(!1!==i.horzLines)for(let e=s;e<t;e+=s)n.push(e);return{verticals:r,horizontals:n}}(i.plotWidth,i.plotHeight,{...o,spacing:o?.spacing??60,vertLines:e.showVertGrid,horzLines:e.showHorzGrid});(a.verticals.length>0||a.horizontals.length>0)&&function(e,t,i,s,r,n){e.save(),e.lineWidth=Math.max(1,Math.round(n.lineWidth*r));const o=Math.round(i*r),a=Math.round(s*r);P(e,t.verticals,!0,n.vert,n,r,o,a),P(e,t.horizontals,!1,n.horz,n,r,o,a),e.setLineDash([]),e.restore()}(r,a,i.plotWidth,i.plotHeight,s,S(e.theme,o,s)),r.save(),r.beginPath(),r.rect(0,0,Math.round(i.plotWidth*s),Math.round(i.plotHeight*s)),r.clip();const l=this._primitiveContext(e);for(const e of this._primitives)"bottom"===e.zOrder()&&e.draw(r,l);const h=e.timeScale.visibleRange(),c=this._readoutScale();let u=null;const d=[],_=e.conflate?ee(e.timeScale.barSpacing,s,.5,e.conflationFactor):1;for(const n of this._series){if(!1===n.style.visible)continue;const o=this._scaleFor(n.scaleId),a=e=>o.priceToY(e),l=J(n.type),b=e.dataLayer.visibleBars(n.dataId,h.from,h.to);let p=b.map(t=>({x:e.timeScale.indexToX(t.index),bar:t.bar}));if(_>1&&(p=ie(p,_)),!0===n.style.colorByPreviousClose&&p.length>0){const t=e.dataLayer.visibleBars(n.dataId,b[0].index-1,b[0].index-1);t.length>0&&(p[0].prevClose=t[0].bar.close)}let f=0;for(const e of p)(e.bar.volume??0)>f&&(f=e.bar.volume??0);const m={plotHeight:i.plotHeight,maxVolume:f,theme:e.theme};if(void 0===t?this._backend.drawSeries(l,p,a,e.timeScale.barSpacing,s,n.style,m):l.draw(r,p,a,e.timeScale.barSpacing,s,n.style,m),o===c){const t=e.dataLayer.lastIndexedBar(n.dataId);if(null!==t&&l.isPriceSeries&&null===u)u={close:t.bar.close,up:t.bar.close>=t.bar.open,showLine:!1!==n.style.priceLineVisible,showTag:!1!==n.style.lastValueVisible};else if(null!==t&&!1!==n.style.lastValueVisible){const e=ct(n.style,t.bar.close>=t.bar.open);void 0!==e&&Number.isFinite(t.bar.close)&&d.push({price:t.bar.close,color:e})}}}void 0===t&&this._backend.endFrame(),r.restore();const b=null!==u&&u.showTag&&c===this._rightScale,p=!0===e.barCountdown?.visible,f=e=>e>=0&&e<=i.plotHeight*s,m=[];if(null!==u&&b){const e=Math.round(c.priceToY(u.close)*s);f(e)&&m.push({y:e,height:Ze(s,p),priority:De})}const g=m.length,v=c===this._rightScale;if(v)for(const e of d){const t=Math.round(c.priceToY(e.price)*s);m.push({y:t,height:f(t)?Ze(s):NaN,priority:Ee})}const y=m.length>0?He(m,2*s):[],w=m.length>0?m.filter((e,t)=>y[t]):void 0;if(this.priceScale.scaled&&function(e,t,i,s,r=Re,n){const o=t.ticks(We(i.plotHeight)),a=Ve(o,t,s,n),l=Math.round(i.plotWidth*s);e.save(),e.strokeStyle=r.lineColor,e.fillStyle=r.textColor,e.font=tt(r.font,s),e.textAlign="left",e.textBaseline="middle",e.lineWidth=1,e.beginPath(),e.moveTo(l+.5,0),e.lineTo(l+.5,Math.round(i.plotHeight*s)),e.stroke();for(let r=0;r<o.length;r++){if(null!==a&&!a[r])continue;const n=o[r],h=Math.round(t.priceToY(n)*s);h<0||h>i.plotHeight*s||e.fillText(t.format(n),l+6*s,h)}e.restore()}(r,this.priceScale,i,s,n,w),v)for(let e=0;e<d.length;e++)y[g+e]&&Je(r,c,d[e].price,d[e].color,i,s,n);null!==u&&Qe(r,c,u.close,u.up,i,s,n,{up:e.theme.lastPriceUp,down:e.theme.lastPriceDown,text:e.theme.lastPriceText},u.showLine,b,e.barCountdown);for(const e of this._primitives)"normal"===e.zOrder()&&e.draw(r,l);e.showTimeAxis&&(!function(e,t,i,s,r,n=Re,o,a){const l=t.visibleRange(),h=Math.max(0,Math.floor(l.from)),c=Math.min(i.baseIndex,Math.ceil(l.to));if(c<h)return;const u=Math.max(1,Math.round(80/Math.max(1,t.barSpacing))),d=Math.round(s.plotHeight*r);let _=Number.POSITIVE_INFINITY;{let e=i.indexToTime(h);for(let t=h+1;t<=c;t++){const s=i.indexToTime(t);if(void 0!==s&&void 0!==e){const t=s-e;t>0&&t<_&&(_=t)}void 0!==s&&(e=s)}}const b=_*u,p=Number.isFinite(b)&&b<60,f=void 0!==a&&a!==pe&&ve(a)?a:pe,m=f===pe,g=m?be:(e,t)=>Se(e,t,f),v=m?de:e=>je(e,f),y=m?le:e=>Ce(e,f),w=m?he:e=>Ie(e,f);e.save(),e.fillStyle=n.textColor,e.strokeStyle=n.lineColor,e.font=tt(n.font,r),e.textAlign="center",e.textBaseline="top",e.lineWidth=1,e.beginPath(),e.moveTo(0,d+.5),e.lineTo(Math.round(s.plotWidth*r),d+.5),e.stroke();const x=new Set;{let e=i.indexToTime(h);for(let t=h+1;t<=c;t++){const s=i.indexToTime(t);void 0!==s&&(void 0!==e&&g(e,s)&&x.add(t),e=s)}}const S=[...new Set([...Ue(h,c,u),...x])].sort((e,t)=>e-t),P=[];let O;for(const n of S){const a=i.indexToTime(n);if(void 0===a)continue;const l=Math.round(t.indexToX(n)*r);if(l<0||l>s.plotWidth*r){O=a;continue}let h;h=o?o(a,void 0===O?"day":Ge(O,a,f,p)):void 0===O||g(O,a)?v(a):p?w(a):y(a),P.push({x:l,text:h,half:e.measureText(h).width/2,boundary:x.has(n)}),O=a}const M=4*r,k=[],T=e=>k.every(t=>e.x+e.half+M<=t.x-t.half||e.x-e.half-M>=t.x+t.half);for(const e of P)e.boundary&&T(e)&&k.push(e);for(const e of P)!e.boundary&&T(e)&&k.push(e);k.sort((e,t)=>e.x-t.x);for(const t of k)e.fillText(t.text,t.x,d+4*r);e.restore()}(r,e.timeScale,e.dataLayer,i,s,n,e.timeFormatter,e.timezone),void 0!==e.sessionClock&&et(r,i,s,e.sessionClock,n)),r.restore()}paintTop(e,t,i){void 0===i&&this.top.clearBitmap();const s=this._layout(t),r=i??this.top.ctx,n=t.dpr;r.save(),s.plotLeft>0&&r.translate(Math.round(s.plotLeft*n),0);const o=this._primitiveContext(t);for(const e of this._primitives)"top"===e.zOrder()&&e.draw(r,o);if(null!==e){const i=it(t.theme,t.canvasOptions?.crosshair,n);st(r,e.x,e.yLocal,s.plotWidth,s.plotHeight,n,i.color,i.width,i.dash);const o=t.theme.crosshairLabelBackground??i.color,a=!1!==t.theme.crosshairLabelVisible;if(a&&null!==e.yLocal){const i=this._readoutScale(),a=i.format(i.yToPrice(e.yLocal));!function(e,t,i,s,r,n,o){e.save(),e.font=11*r+"px system-ui, sans-serif";const a=6*r,l=16*r,h=e.measureText(t).width;e.fillStyle=n,e.textBaseline="middle",e.fillRect(i+1,s-l/2,h+2*a,l),e.fillStyle=o,e.textAlign="left",e.fillText(t,i+1+a,s),e.restore()}(r,a,i===this._leftScale&&s.plotLeft>0?-this._tagWidth(r,a,n):s.plotWidth*n,e.yLocal*n,n,o,t.theme.lastPriceText)}if(a&&e.showTimeTag&&e.x>=0&&e.x<=s.plotWidth){const i=Math.round(t.timeScale.xToIndex(e.x)),a=t.dataLayer.indexToTime(i);if(void 0!==a){!function(e,t,i,s,r,n,o=Re){e.save(),e.font=tt(o.font,r);const a=7*r,l=18*r,h=e.measureText(t).width+2*a,c=Math.max(0,i-h/2),u=s+1*r,d=(n.radius??4)*r;e.beginPath(),N(e,c,u,h,l,d),void 0!==n.backplate&&(e.fillStyle=n.backplate,e.fill()),e.fillStyle=n.background,e.fill(),void 0!==n.border&&(e.strokeStyle=n.border,e.lineWidth=Math.max(1,Math.round(r)),e.stroke()),e.fillStyle=n.textColor,e.textAlign="center",e.textBaseline="middle",e.fillText(t,c+h/2,u+l/2),e.restore()}(r,t.timeFormatter?t.timeFormatter(a):Le(a,t.timezone??pe),e.x*n,s.plotHeight*n,n,{background:o,textColor:t.theme.lastPriceText,backplate:t.theme.background},O(t.theme,t.canvasOptions?.scales))}}}r.restore()}_readoutScale(){for(const e of this._series)if(!1!==e.style.visible&&J(e.type).isPriceSeries)return this._scaleFor(e.scaleId);return this._rightScale}readoutScale(){return this._readoutScale()}priceToY(e){return this._readoutScale().priceToY(e)}_tagWidth(e,t,i){e.save(),e.font=11*i+"px system-ui, sans-serif";const s=e.measureText(t).width+12*i+1;return e.restore(),s}yToPrice(e){return this._readoutScale().yToPrice(e)}}const dt={background:"#ffffff",grid:"#eef1f6",axisText:"#5b6472",axisLine:"#d4dae3",paneSeparator:"#e6eaf0",crosshair:"#9aa3b2",upColor:"#089981",downColor:"#e0473e",wickUpColor:"#089981",wickDownColor:"#e0473e",lineColor:"#2962ff",areaTopColor:"rgba(41,98,255,0.30)",areaBottomColor:"rgba(41,98,255,0.00)",baselineTopLine:"#089981",baselineTopFill:"rgba(8,153,129,0.18)",baselineBottomLine:"#e0473e",baselineBottomFill:"rgba(224,71,62,0.18)",lastPriceUp:"#089981",lastPriceDown:"#e0473e",lastPriceText:"#ffffff",buy:"#089981",sell:"#e0473e",profit:"#089981",loss:"#e0473e"},_t=dt;class bt{constructor(e,t,i,s,r){Object.defineProperty(this,"id",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"x0",{enumerable:!0,configurable:!0,writable:!0,value:t}),Object.defineProperty(this,"y0",{enumerable:!0,configurable:!0,writable:!0,value:i}),Object.defineProperty(this,"x1",{enumerable:!0,configurable:!0,writable:!0,value:s}),Object.defineProperty(this,"y1",{enumerable:!0,configurable:!0,writable:!0,value:r}),Object.defineProperty(this,"stops",{enumerable:!0,configurable:!0,writable:!0,value:[]})}addColorStop(e,t){this.stops.push({offset:e,color:t})}toString(){return`url(#${this.id})`}}const pt=2*Math.PI;function ft(e){if(!Number.isFinite(e))return"0";const t=Math.round(100*e)/100;return String(0===t?0:t)}function mt(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function gt(e){return/[ .,:;'|!iIljtfr[\]()-]/.test(e)?.3:/[mwMW@%]/.test(e)?.9:/[A-Z]/.test(e)?.68:.55}function vt(e){const t=e.trim().split(/\s+/);let i=null,s=null,r=10,n=0;for(;n<t.length;n++){const e=t[n],o=/^(\d+(?:\.\d+)?)(px|pt)(?:\/\S+)?$/.exec(e);if(null!==o){r=parseFloat(o[1])*("pt"===o[2]?4/3:1),n++;break}"italic"===e||"oblique"===e?s=e:/^(\d{3}|bold|bolder|lighter)$/.test(e)&&(i=e)}return{size:r,family:t.slice(n).join(" ")||"sans-serif",weight:i,style:s}}const yt={top:"text-before-edge",hanging:"hanging",middle:"central",ideographic:"ideographic",bottom:"text-after-edge"},wt={center:"middle",right:"end",end:"end"};class xt{constructor(e,t,i={}){Object.defineProperty(this,"width",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"height",{enumerable:!0,configurable:!0,writable:!0,value:t}),Object.defineProperty(this,"fillStyle",{enumerable:!0,configurable:!0,writable:!0,value:"#000"}),Object.defineProperty(this,"strokeStyle",{enumerable:!0,configurable:!0,writable:!0,value:"#000"}),Object.defineProperty(this,"lineWidth",{enumerable:!0,configurable:!0,writable:!0,value:1}),Object.defineProperty(this,"lineCap",{enumerable:!0,configurable:!0,writable:!0,value:"butt"}),Object.defineProperty(this,"lineJoin",{enumerable:!0,configurable:!0,writable:!0,value:"miter"}),Object.defineProperty(this,"miterLimit",{enumerable:!0,configurable:!0,writable:!0,value:10}),Object.defineProperty(this,"globalAlpha",{enumerable:!0,configurable:!0,writable:!0,value:1}),Object.defineProperty(this,"font",{enumerable:!0,configurable:!0,writable:!0,value:"10px sans-serif"}),Object.defineProperty(this,"textAlign",{enumerable:!0,configurable:!0,writable:!0,value:"start"}),Object.defineProperty(this,"textBaseline",{enumerable:!0,configurable:!0,writable:!0,value:"alphabetic"}),Object.defineProperty(this,"shadowColor",{enumerable:!0,configurable:!0,writable:!0,value:"rgba(0, 0, 0, 0)"}),Object.defineProperty(this,"shadowBlur",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"shadowOffsetX",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"shadowOffsetY",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"globalCompositeOperation",{enumerable:!0,configurable:!0,writable:!0,value:"source-over"}),Object.defineProperty(this,"imageSmoothingEnabled",{enumerable:!0,configurable:!0,writable:!0,value:!0}),Object.defineProperty(this,"canvas",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"unsupported",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"_out",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"_frames",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"_gradients",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"_clips",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"_rootOpen",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_path",{enumerable:!0,configurable:!0,writable:!0,value:""}),Object.defineProperty(this,"_hasPoint",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"_dash",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"_ids",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_strict",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_background",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_fontCache",{enumerable:!0,configurable:!0,writable:!0,value:null}),this._strict=!0===i.strict,this._background=i.background}asCanvasContext(){return this}save(){this._frames.push({kind:"save",open:0,state:this._snapshot()})}restore(){let e=this._frames.length-1;for(;e>=0&&"save"!==this._frames[e].kind;)e--;if(!(e<0)){if(e!==this._frames.length-1&&this._strict)throw new Error("SvgContext: restore() reached across an open pushGroup()");this._closeTo(e)}}pushGroup(e,t={}){let i="<g";for(const t in e)i+=` ${t}="${mt(String(e[t]))}"`;const{translate:s,clip:r}=t;if(void 0!==s&&(i+=` transform="translate(${ft(s.x)} ${ft(s.y)})"`),void 0!==r){i+=` clip-path="url(#${this._clipId(`<rect x="${ft(r.x)}" y="${ft(r.y)}" width="${ft(r.width)}" height="${ft(r.height)}"/>`)})"`}this._out.push(i+">"),this._frames.push({kind:"group",open:1,state:null})}popGroup(){let e=this._frames.length-1;for(;e>=0&&"group"!==this._frames[e].kind;)e--;if(e<0){if(this._strict)throw new Error("SvgContext: popGroup() without a pushGroup()")}else{if(e!==this._frames.length-1&&this._strict)throw new Error("SvgContext: popGroup() reached across an open save()");this._closeTo(e)}}translate(e,t){0===e&&0===t||this._openGroup(`transform="translate(${ft(e)} ${ft(t)})"`)}scale(e,t){1===e&&1===t||this._openGroup(`transform="scale(${ft(e)} ${ft(t)})"`)}rotate(e){0!==e&&this._openGroup(`transform="rotate(${ft(180*e/Math.PI)})"`)}setLineDash(e){this._dash=e.slice()}getLineDash(){return this._dash.slice()}beginPath(){this._path="",this._hasPoint=!1}closePath(){""!==this._path&&(this._path+="Z")}moveTo(e,t){this._path+=`M${ft(e)} ${ft(t)}`,this._hasPoint=!0}lineTo(e,t){this._path+=`${this._hasPoint?"L":"M"}${ft(e)} ${ft(t)}`,this._hasPoint=!0}quadraticCurveTo(e,t,i,s){this._hasPoint||this.moveTo(e,t),this._path+=`Q${ft(e)} ${ft(t)} ${ft(i)} ${ft(s)}`}bezierCurveTo(e,t,i,s,r,n){this._hasPoint||this.moveTo(e,t),this._path+=`C${ft(e)} ${ft(t)} ${ft(i)} ${ft(s)} ${ft(r)} ${ft(n)}`}rect(e,t,i,s){this._path+=`M${ft(e)} ${ft(t)}h${ft(i)}v${ft(s)}h${ft(-i)}Z`,this._hasPoint=!0}roundRect(e,t,i,s,r=0){const n=Array.isArray(r)?r:[r];let[o,a,l,h]=[n[0]??0,n[1]??n[0]??0,n[2]??n[0]??0,n[3]??n[1]??n[0]??0];const c=Math.min(1,i/Math.max(1e-9,o+a,h+l),s/Math.max(1e-9,o+h,a+l));o*=c,a*=c,l*=c,h*=c;const u=(e,t,i)=>e>0?`A${ft(e)} ${ft(e)} 0 0 1 ${ft(t)} ${ft(i)}`:"";this._path+=`M${ft(e+o)} ${ft(t)}H${ft(e+i-a)}${u(a,e+i,t+a)}V${ft(t+s-l)}${u(l,e+i-l,t+s)}H${ft(e+h)}${u(h,e,t+s-h)}V${ft(t+o)}${u(o,e+o,t)}Z`,this._hasPoint=!0}arc(e,t,i,s,r,n=!1){this.ellipse(e,t,i,i,0,s,r,n)}ellipse(e,t,i,s,r,n,o,a=!1){const l=Math.cos(r),h=Math.sin(r),c=r=>{const n=i*Math.cos(r),o=s*Math.sin(r);return[e+n*l-o*h,t+n*h+o*l]};let u,d=!1;a?(d=n-o>=pt,u=-((n-o)%pt+pt)%pt):(d=o-n>=pt,u=((o-n)%pt+pt)%pt);const[_,b]=c(n);this._path+=`${this._hasPoint?"L":"M"}${ft(_)} ${ft(b)}`,this._hasPoint=!0;const p=ft(180*r/Math.PI),f=(e,t,r)=>{const[n,o]=c(e);this._path+=`A${ft(i)} ${ft(s)} ${p} ${t?1:0} ${r?1:0} ${ft(n)} ${ft(o)}`};if(d){const e=a?-Math.PI:Math.PI;f(n+e,!1,!a),f(n+2*e,!1,!a)}else 0!==u&&f(n+u,Math.abs(u)>Math.PI,u>0)}fill(e,t){if("object"==typeof e)return void this._unsupported("fill(Path2D)");if(""===this._path)return;const i=this._paint(this.fillStyle);null!==i&&this._out.push(`<path d="${this._path}" fill="${i}"${"evenodd"===e?' fill-rule="evenodd"':""}${this._opacity()}/>`)}stroke(e){if(void 0!==e)return void this._unsupported("stroke(Path2D)");if(""===this._path)return;const t=this._strokeAttrs();null!==t&&this._out.push(`<path d="${this._path}" fill="none"${t}${this._opacity()}/>`)}clip(e){if("object"==typeof e)return void this._unsupported("clip(Path2D)");if(""===this._path)return;const t=this._clipId(`<path d="${this._path}"${"evenodd"===e?' clip-rule="evenodd"':""}/>`);this._openGroup(`clip-path="url(#${t})"`)}fillRect(e,t,i,s){const r=this._paint(this.fillStyle);null!==r&&this._rect(e,t,i,s,` fill="${r}"`)}strokeRect(e,t,i,s){const r=this._strokeAttrs();null!==r&&this._rect(e,t,i,s,` fill="none"${r}`)}clearRect(e,t,i,s){void 0!==this._background&&this._rect(e,t,i,s,` fill="${mt(this._background)}"`)}fillText(e,t,i){if(""===e)return;const s=this._paint(this.fillStyle);if(null===s)return;const r=this._font();let n=` font-family="${mt(r.family)}" font-size="${ft(r.size)}"`;null!==r.weight&&(n+=` font-weight="${r.weight}"`),null!==r.style&&(n+=` font-style="${r.style}"`);const o=wt[this.textAlign];void 0!==o&&(n+=` text-anchor="${o}"`);const a=yt[this.textBaseline];void 0!==a&&(n+=` dominant-baseline="${a}"`),this._out.push(`<text x="${ft(t)}" y="${ft(i)}"${n} fill="${s}"${this._opacity()}>${mt(e)}</text>`)}measureText(e){const t=this._font();let i=0;for(const t of e)i+=gt(t);const s=null!==t.weight&&("bold"===t.weight||"bolder"===t.weight||parseInt(t.weight,10)>=600),r=i*t.size*(s?1.05:1);return{width:r,actualBoundingBoxLeft:0,actualBoundingBoxRight:r,actualBoundingBoxAscent:.8*t.size,actualBoundingBoxDescent:.2*t.size,fontBoundingBoxAscent:.8*t.size,fontBoundingBoxDescent:.2*t.size}}createLinearGradient(e,t,i,s){const r=new bt("g"+ ++this._ids,e,t,i,s);return this._gradients.push(r),r}drawImage(e,...t){const i=this._imageHref(e);if(null===i)return void this._unsupported("drawImage");const s=e,r=s.naturalWidth??("number"==typeof s.width?s.width:0),n=s.naturalHeight??("number"==typeof s.height?s.height:0),o=this._opacity();if(t.length>=8){const[e,s,a,l,h,c,u,d]=t;return void this._out.push(`<svg x="${ft(h)}" y="${ft(c)}" width="${ft(u)}" height="${ft(d)}" viewBox="${ft(e)} ${ft(s)} ${ft(a)} ${ft(l)}" preserveAspectRatio="none"><image href="${mt(i)}" width="${ft(r)}" height="${ft(n)}" preserveAspectRatio="none"${o}/></svg>`)}const[a,l]=t,h=t.length>=4?t[2]:r,c=t.length>=4?t[3]:n;this._out.push(`<image href="${mt(i)}" x="${ft(a)}" y="${ft(l)}" width="${ft(h)}" height="${ft(c)}" preserveAspectRatio="none"${o}/>`)}setTransform(){this._unsupported("setTransform")}resetTransform(){this._unsupported("resetTransform")}getTransform(){this._unsupported("getTransform")}createRadialGradient(){this._unsupported("createRadialGradient")}createConicGradient(){this._unsupported("createConicGradient")}createPattern(){return this._unsupported("createPattern"),null}getImageData(){this._unsupported("getImageData")}putImageData(){this._unsupported("putImageData")}createImageData(){this._unsupported("createImageData")}strokeText(){this._unsupported("strokeText")}drawFocusIfNeeded(){this._unsupported("drawFocusIfNeeded")}isPointInPath(){return this._unsupported("isPointInPath"),!1}isPointInStroke(){return this._unsupported("isPointInStroke"),!1}toString(){const e=ft(this.width),t=ft(this.height);let i="";for(const e of this._clips)i+=e;for(const e of this._gradients){i+=`<linearGradient id="${e.id}" gradientUnits="userSpaceOnUse" x1="${ft(e.x0)}" y1="${ft(e.y0)}" x2="${ft(e.x1)}" y2="${ft(e.y1)}">`;for(const t of e.stops)i+=`<stop offset="${ft(t.offset)}" stop-color="${mt(t.color)}"/>`;i+="</linearGradient>"}let s="";for(let e=this._frames.length-1;e>=0;e--)s+="</g>".repeat(this._frames[e].open);return s+="</g>".repeat(this._rootOpen),`<svg xmlns="http://www.w3.org/2000/svg" width="${e}" height="${t}" viewBox="0 0 ${e} ${t}" xml:space="preserve">`+(""===i?"":`<defs>${i}</defs>`)+this._out.join("")+s+"</svg>"}_snapshot(){return{fillStyle:this.fillStyle,strokeStyle:this.strokeStyle,lineWidth:this.lineWidth,lineCap:this.lineCap,lineJoin:this.lineJoin,miterLimit:this.miterLimit,globalAlpha:this.globalAlpha,font:this.font,textAlign:this.textAlign,textBaseline:this.textBaseline,dash:this._dash.slice()}}_apply(e){this.fillStyle=e.fillStyle,this.strokeStyle=e.strokeStyle,this.lineWidth=e.lineWidth,this.lineCap=e.lineCap,this.lineJoin=e.lineJoin,this.miterLimit=e.miterLimit,this.globalAlpha=e.globalAlpha,this.font=e.font,this.textAlign=e.textAlign,this.textBaseline=e.textBaseline,this._dash=e.dash}_closeTo(e){for(;this._frames.length>e;){const e=this._frames.pop();this._out.push("</g>".repeat(e.open)),null!==e.state&&this._apply(e.state)}}_openGroup(e){this._out.push(`<g ${e}>`);const t=this._frames[this._frames.length-1];void 0!==t?t.open++:this._rootOpen++}_clipId(e){const t="c"+ ++this._ids;return this._clips.push(`<clipPath id="${t}">${e}</clipPath>`),t}_rect(e,t,i,s,r){0!==i&&0!==s&&(i<0&&(e+=i,i=-i),s<0&&(t+=s,s=-s),this._out.push(`<rect x="${ft(e)}" y="${ft(t)}" width="${ft(i)}" height="${ft(s)}"${r}${this._opacity()}/>`))}_paint(e){return this.globalAlpha<=0?null:"string"!=typeof e?e instanceof bt?e.toString():null:"transparent"===e?null:mt(e)}_strokeAttrs(){if(!(this.lineWidth>0))return null;const e=this._paint(this.strokeStyle);if(null===e)return null;let t=` stroke="${e}" stroke-width="${ft(this.lineWidth)}"`;return"butt"!==this.lineCap&&(t+=` stroke-linecap="${this.lineCap}"`),"miter"!==this.lineJoin&&(t+=` stroke-linejoin="${this.lineJoin}"`),this._dash.some(e=>e>0)&&(t+=` stroke-dasharray="${this._dash.map(ft).join(" ")}"`),t}_opacity(){return this.globalAlpha<1?` opacity="${ft(this.globalAlpha)}"`:""}_font(){return null!==this._fontCache&&this._fontCache.font===this.font||(this._fontCache={font:this.font,parsed:vt(this.font)}),this._fontCache.parsed}_imageHref(e){const t=e;if("string"==typeof t.src&&""!==t.src)return t.src;if("function"==typeof t.toDataURL)try{return t.toDataURL.call(e)}catch{return null}return null}_unsupported(e){if(this._strict)throw new Error(`SvgContext: ${e} has no SVG form and cannot be exported`);this.unsupported.includes(e)||this.unsupported.push(e)}}const St=[{label:"Solid",value:"solid"},{label:"Dashed",value:"dashed"},{label:"Dotted",value:"dotted"}];function Pt(e){return{color:e.colorKey??`${e.key}:color`,width:`${e.key}:width`,lineStyle:`${e.key}:lineStyle`,opacity:`${e.key}:opacity`,type:`${e.key}:type`}}function Ot(e){const t=[];for(const i of e.plots){const s=Pt(i),r=e.inputs.find(e=>e.key===i.colorKey),n="string"==typeof r?.default?r.default:i.style?.color??"#4f8cff";t.push({key:s.color,type:"color",label:i.title,default:n,group:i.title}),t.push({key:s.opacity,type:"number",label:"Opacity",default:100,min:0,max:100,step:1,group:i.title}),t.push({key:s.width,type:"number",label:"Thickness",default:i.style?.lineWidth??1.5,min:.5,max:8,step:.5,group:i.title}),t.push({key:s.lineStyle,type:"select",label:"Line style",default:i.style?.lineStyle??"solid",options:St,group:i.title}),t.push({key:s.type,type:"select",label:"Plot style",default:i.type,options:Mt,group:i.title})}return t}const Mt=[{label:"Line",value:"line"},{label:"Line with markers",value:"line-markers"},{label:"Step line",value:"step"},{label:"Area",value:"area"},{label:"Histogram",value:"histogram"},{label:"Columns",value:"column"}],kt=new Map;function Tt(e){const t=kt.get(e);if(void 0===t)throw new Error(`openalgo-charts: unknown indicator "${e}" — did you import 'openalgo-charts/indicators'?`);return t}function Ct(e){return kt.has(e)}function It(e){const t={};for(const i of e.inputs)t[i.key]=i.default;return t}function jt(e,t){switch(t){case"open":return e.open;case"high":return e.high;case"low":return e.low;case"hl2":return(e.high+e.low)/2;case"hlc3":return(e.high+e.low+e.close)/3;case"ohlc4":return(e.open+e.high+e.low+e.close)/4;case"volume":return e.volume??0;default:return e.close}}class Lt{constructor(e){Object.defineProperty(this,"_points",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"_opts",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_host",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_visible",{enumerable:!0,configurable:!0,writable:!0,value:!0}),this._opts={opacity:.12,...e}}attached(e){this._host=e}detached(){this._host=null}zOrder(){return"bottom"}autoscaleInfo(){return null}setPoints(e){this._points=e.slice(),this._host?.requestUpdate()}setOptions(e){this._opts={...this._opts,...e},this._host?.requestUpdate()}setVisible(e){this._visible=e,this._host?.requestUpdate()}draw(e,t){if(!this._visible||this._points.length<2)return;const i=t.dpr,s=e=>t.timeScale.indexToX(e)*i,r=e=>t.priceScale.priceToY(e)*i,n=this._opts.gradient;let o=0,a=1;if(void 0!==n){let e=n.topValue,t=n.bottomValue;if(void 0===e||void 0===t){let i=1/0,s=-1/0;const r=e=>{null!==e&&Number.isFinite(e)&&(e<i&&(i=e),e>s&&(s=e))};for(const e of this._points)r(e.a),r(e.b);e??(e=s),t??(t=i)}o=r(e),a=r(t)-o||1}e.save(),e.globalAlpha=this._opts.opacity??.12;let l=null;const h=()=>{if(null!==l&&l.xs.length>=2){e.beginPath(),e.moveTo(l.xs[0],l.top[0]);for(let t=1;t<l.xs.length;t++)e.lineTo(l.xs[t],l.top[t]);for(let t=l.xs.length-1;t>=0;t--)e.lineTo(l.xs[t],l.bot[t]);e.closePath(),void 0===n||void 0!==l.color?(e.fillStyle=l.color??(l.up?this._opts.colorUp:this._opts.colorDown),e.fill()):(e.save(),e.translate(0,o),e.fillStyle=W(e,a,n.topColor,n.bottomColor),e.fill(),e.restore())}l=null};for(let e=0;e<this._points.length;e++){const t=this._points[e];if(null===t.a||null===t.b||!Number.isFinite(t.a)||!Number.isFinite(t.b)){h();continue}const i=t.a>=t.b,n=s(t.index),o=r(t.a),a=r(t.b);if(null===l||l.up!==i||l.color===t.color){if(null!==l&&l.up!==i){const n=this._points[e-1];if(void 0!==n&&null!==n.a&&null!==n.b){const e=n.a-n.b,o=t.a-t.b,a=e===o?0:e/(e-o),c=s(n.index+(t.index-n.index)*a),u=r(n.a+(t.a-n.a)*a);l.xs.push(c),l.top.push(u),l.bot.push(u),h(),l={up:i,color:t.color,xs:[c],top:[u],bot:[u]}}else h()}null===l&&(l={up:i,color:t.color,xs:[],top:[],bot:[]}),l.xs.push(n),l.top.push(o),l.bot.push(a)}else l.xs.push(n),l.top.push(o),l.bot.push(a),h(),l={up:i,color:t.color,xs:[n],top:[o],bot:[a]}}h(),e.restore()}}function At(e,t){return"dashed"===e?[6*t,4*t]:"dotted"===e?[1*t,3*t]:[]}function zt(e,t,i,s,r,n,o,a){const l=11*t;e.font=`${l}px ui-sans-serif, system-ui, sans-serif`,e.textBaseline="middle",e.textAlign="left";const h=r.split("\n");let c=0;for(const t of h)c=Math.max(c,e.measureText(t).width);const u=5*t,d=3*t,_=1.35*l,b=c+2*u,p=_*h.length+2*d,f="center"===a?i-b/2:"right"===a?i-b:i,m=s-p/2;e.beginPath(),N(e,f,m,b,p,3*t),e.fillStyle=n,e.fill(),e.fillStyle=o??F(n);for(let t=0;t<h.length;t++)e.fillText(h[t],f+u,m+d+_*(t+.5))}class Ft{constructor(){Object.defineProperty(this,"_items",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"_host",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_visible",{enumerable:!0,configurable:!0,writable:!0,value:!0})}attached(e){this._host=e}detached(){this._host=null}zOrder(){return"normal"}autoscaleInfo(){return null}setItems(e){this._items=e,this._host?.requestUpdate()}setVisible(e){this._visible=e,this._host?.requestUpdate()}draw(e,t){if(!this._visible||0===this._items.length)return;const i=t.dpr,s=t.plotWidth*i,r=t.plotHeight*i,n=t.theme.axisText,o=200*i,a=e=>t.timeScale.indexToX(t.dataLayer.timeToIndexFloat(e.time))*i,l=e=>t.priceScale.priceToY(e.price)*i,h=(e,t,i,n)=>Math.max(e,i)<0||Math.min(e,i)>s||Math.max(t,n)<0||Math.min(t,n)>r;e.save(),e.lineJoin="round",e.lineCap="round";for(const t of this._items){if("label"===t.kind){const h=a(t.at),c=l(t.at);if(h<-o||h>s+o||c<-o||c>r+o)continue;zt(e,i,h,c,t.text,t.color??n,t.textColor,t.align??"center");continue}const c=t.color??n;if(e.lineWidth=Math.max(1,Math.round((t.lineWidth??1)*i)),"polyline"===t.kind){const i=t.points;if(i.length<2)continue;const s=new Array(i.length),r=new Array(i.length);let n=1/0,o=-1/0,u=1/0,d=-1/0;for(let e=0;e<i.length;e++){const t=a(i[e]),h=l(i[e]);s[e]=t,r[e]=h,t<n&&(n=t),t>o&&(o=t),h<u&&(u=h),h>d&&(d=h)}if(h(n,u,o,d))continue;e.beginPath(),e.moveTo(s[0],r[0]);for(let t=1;t<i.length;t++)e.lineTo(s[t],r[t]);!0===t.closed&&e.closePath(),void 0!==t.fillColor&&(e.globalAlpha=t.opacity??.12,e.fillStyle=t.fillColor,e.fill(),e.globalAlpha=1),e.setLineDash([]),e.strokeStyle=c,e.stroke();continue}let u=a(t.from),d=l(t.from),_=a(t.to),b=l(t.to);if("box"===t.kind){if(h(u,d,_,b))continue;const s=Math.min(u,_),r=Math.min(d,b),n=Math.abs(_-u),o=Math.abs(b-d);void 0!==t.fillColor&&(e.globalAlpha=t.opacity??.12,e.fillStyle=t.fillColor,e.fillRect(s,r,n,o),e.globalAlpha=1),e.setLineDash([]),e.strokeStyle=c,e.strokeRect(s,r,n,o),void 0!==t.text&&""!==t.text&&zt(e,i,s+n/2,r+o/2,t.text,c,t.textColor,"center");continue}if(!0===t.extendLeft||!0===t.extendRight){const e=_-u;if(0===e)d=0,b=r;else{const i=(b-d)/e,r=u<=_;!0===t.extendLeft&&(r?(d-=i*u,u=0):(b-=i*_,_=0)),!0===t.extendRight&&(r?(b+=i*(s-_),_=s):(d+=i*(s-u),u=s))}}h(u,d,_,b)||(e.setLineDash(At(t.lineStyle,i)),e.strokeStyle=c,e.beginPath(),e.moveTo(u,d),e.lineTo(_,b),e.stroke())}e.setLineDash([]),e.restore()}}class Bt{constructor(){Object.defineProperty(this,"_colors",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"_anchor",{enumerable:!0,configurable:!0,writable:!0,value:NaN}),Object.defineProperty(this,"_host",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_visible",{enumerable:!0,configurable:!0,writable:!0,value:!0})}attached(e){this._host=e}detached(){this._host=null}zOrder(){return"bottom"}autoscaleInfo(){return null}setColors(e,t){this._colors=e,this._anchor=t.length>0?t[0].time:NaN,this._host?.requestUpdate()}setVisible(e){this._visible=e,this._host?.requestUpdate()}draw(e,t){const i=this._colors,s=i.length;if(!this._visible||0===s)return;const r=Math.round(t.dataLayer.timeToIndexFloat(this._anchor)),n=t.timeScale.visibleRange(),o=Math.max(0,Math.floor(n.from-r)),a=Math.min(s-1,Math.ceil(n.to-r)),l=t.dpr,h=t.plotWidth*l,c=t.plotHeight*l,u=e=>Math.min(h,Math.max(0,Math.round(t.timeScale.indexToX(r+e-.5)*l)));e.save();for(let t=o,s=o;t<=a;t++){const r=i[t];if(!(t<a&&i[t+1]===r)){if(r){const i=u(s);e.fillStyle=r,e.fillRect(i,0,u(t+1)-i,c)}s=t+1}}e.restore()}}function $t(e){const t={};for(const i of Ot(e))t[i.key]=i.default;return t}function Nt(e,t){if(void 0!==t&&t>0)return e.toFixed(_(t));const i=Math.abs(e);return i>=1e9?`${(e/1e9).toFixed(2)}B`:i>=1e6?`${(e/1e6).toFixed(2)}M`:i>=1e3?e.toFixed(0):i>=1?e.toFixed(2):e.toPrecision(3)}let Rt=1;class Wt{constructor(e,t,i={},s){Object.defineProperty(this,"id",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"indicatorId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"paneIndex",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_host",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_d",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_ownPane",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_settings",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_zoned",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_series",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"_plotTypes",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"_fills",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"_levels",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"_levelSig",{enumerable:!0,configurable:!0,writable:!0,value:""}),Object.defineProperty(this,"_values",{enumerable:!0,configurable:!0,writable:!0,value:{}}),Object.defineProperty(this,"_barCount",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_firstTime",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_lastTime",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_removed",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"_store",{enumerable:!0,configurable:!0,writable:!0,value:{}}),Object.defineProperty(this,"_detach",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_lifetime",{enumerable:!0,configurable:!0,writable:!0,value:new AbortController}),Object.defineProperty(this,"_dataStatus",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_dataRetry",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_dataListeners",{enumerable:!0,configurable:!0,writable:!0,value:new Set}),Object.defineProperty(this,"_legend",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_markers",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_table",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_draws",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_background",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_alertTime",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_live",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"_visible",{enumerable:!0,configurable:!0,writable:!0,value:!0}),this._host=e,this._d=t,this.indicatorId=t.id,this.name=t.name,this.id=`${t.id}-${Rt++}`,this._settings={...It(t),...$t(t),...i},void 0!==s?(this.paneIndex=s,this._ownPane=!1):"onchart"===t.placement?(this.paneIndex=0,this._ownPane=!1):(this.paneIndex=e.nextPaneIndex(),this._ownPane=!0);for(const i of t.plots){const t=this._plotType(i);this._plotTypes.set(i.key,t),this._series.set(i.key,e.addIndicatorSeries(t,this._plotPane(i),this._plotStyle(i),i.priceScaleId,i.priceFormat))}for(const i of t.fills??[]){const t=new Lt({colorUp:this._fillColor(i,!0),colorDown:this._fillColor(i,!1),opacity:i.opacity??.12});this._fills.push(t),e.addIndicatorFill(t,this.paneIndex)}this._legend=e.addIndicatorLegend({id:`indicator:${this.id}`,title:t.name,params:this._paramSummary(),color:this._legendColor(),row:e.legendRowsOn(this.paneIndex),paneIndex:this.paneIndex}),this._applyRange(),this.recompute(),this._attach()}_plotPane(e){return!0===e.overlay?0:this.paneIndex}_paramSummary(){const e=[];for(const t of this._d.inputs){if("color"===t.type||"boolean"===t.type)continue;const i=this._settings[t.key];null!=i&&""!==i&&e.push(String(i))}return e.join(" ")}_legendColor(){for(const e of this._d.plots){const t=e.colorKey;if(void 0!==t&&"string"==typeof this._settings[t])return this._settings[t];if("string"==typeof e.style?.color)return e.style.color}}visible(){return this._visible}setVisible(e){if(this._removed||e===this._visible)return;this._visible=e;for(const t of this._d.plots)this._series.get(t.key)?.applyOptions({visible:e&&!1!==t.style?.visible});for(const t of this._fills)t.setVisible(e);const t=this._host.sourceBars();this._applyLevels(t,this._descriptorSettings()),this._syncMarkers(t),this._syncTable(t),this._syncBarColors(t),this._draws?.setVisible(e),this._background?.setVisible(e),this._legend?.setOptions({hidden:!e}),this._host.emit?.("objects:change",{})}shiftPane(e){this.paneIndex+=e}legend(){return this._legend}updateLegendValues(e){if(null===this._legend)return;const t=this._barCount,i=void 0===e||e<0||e>=t?t-1:e;if(i<0)return void this._legend.setValues([]);const s=[];for(const e of this._d.plots){const t=this._values[e.ohlc?.close??e.key]?.[i];if(null==t||!Number.isFinite(t))continue;const r=this._plotPane(e),n=this._host.formatPrice?.(r,t)??Nt(t,this._host.tickSize?.(r));s.push({text:n,color:this._plotColor(e)})}this._legend.setValues(s)}_fillColor(e,t){const i=t?e.colorUpKey:e.colorDownKey,s=void 0!==i?this._settings[i]:void 0;if("string"==typeof s)return s;return(t?e.colorUp:e.colorDown)??(t?"#26a69a":"#ef5350")}_syncFills(){const e=this._d.fills??[];for(let t=0;t<e.length;t++){const i=this._fills[t];if(void 0===i)continue;const s=e[t],r=this._values[s.between[0]],n=this._values[s.between[1]];if(i.setOptions({colorUp:this._fillColor(s,!0),colorDown:this._fillColor(s,!1),opacity:s.opacity??.12}),void 0===r||void 0===n){i.setPoints([]);continue}const o=[];for(let e=0;e<this._barCount;e++)o.push({index:e,a:r[e]??null,b:n[e]??null});i.setPoints(o)}}_syncMarkers(e){if(void 0===this._d.markers)return;const t=this._visible?this._d.markers({bars:e,values:this._values,settings:this._descriptorSettings()}):[];if(null===this._markers){if(0===t.length)return;const e=this._series.get(this._d.plots[0]?.key??"");if(void 0===e)return;this._markers=e.createMarkers()}this._markers.setMarkers(t)}_syncTable(e){if(void 0===this._d.table)return;const t=this._visible?this._d.table({bars:e,values:this._values,settings:this._descriptorSettings()}):null,i=t?.rows??[];if(null===this._table){if(0===i.length)return;this._table=this._host.addIndicatorTable(this.paneIndex)}void 0!==t?.options&&this._table.setOptions(t.options),this._table.setRows(i)}_syncDraws(e){if(void 0===this._d.draws)return;const t=this._d.draws({bars:e,values:this._values,settings:this._descriptorSettings()});if(null===this._draws){if(0===t.length||void 0===this._host.addIndicatorPrimitive)return;this._draws=new Ft,this._draws.setVisible(this._visible),this._host.addIndicatorPrimitive(this._draws,this.paneIndex)}this._draws.setItems(t)}_syncBackground(e){if(void 0===this._d.background)return;const t=this._d.background({bars:e,values:this._values,settings:this._descriptorSettings()});if(null===this._background){if(0===t.length||void 0===this._host.addIndicatorPrimitive)return;this._background=new Bt,this._background.setVisible(this._visible),this._host.addIndicatorPrimitive(this._background,this.paneIndex)}this._background.setColors(t,e)}_syncBarColors(e){if(void 0===this._d.barColors)return;const t=this._visible?this._d.barColors({bars:e,values:this._values,settings:this._descriptorSettings()}):null;this._host.setBarColors?.(t,this.id)}_syncAlerts(e,t,i){const s=this._d.alerts,r=e.length;if(void 0===s||0===r)return;const n=this._alertTime;if(this._alertTime=e[r-1].time,!i)return;let o=r;for(;o>0&&e[o-1].time>n;)o--;for(let i=o;i<r;i++)for(const r of s)r.when({bars:e,values:this._values,settings:t,index:i})&&this._host.emit?.("indicator:alert",{indicatorId:this.indicatorId,instanceId:this.id,alertId:r.id,title:r.title,message:r.message??r.title,time:e[i].time,index:i})}_calcContext(e,t){const i=e.length,s=()=>this._host.now?.()??Date.now()/1e3,r=i>1?e[i-1].time-e[i-2].time:0;return{barState:{isNew:t,isConfirmed:0===i||r<=0||s()>=e[i-1].time+r,isRealtime:this._live,lastIndex:i-1},symbol:this._host.symbol?.(),interval:this._host.interval?.(),timezone:this._host.timezone?.()??pe,now:s,tickSize:this._host.tickSize?.(0)||void 0}}_plotType(e){const t=this._settings[Pt(e).type];return"string"==typeof t&&""!==t?t:e.type}_plotColor(e){const t=this._settings[Pt(e).color];return"string"==typeof t?t:"string"==typeof e.style?.color?e.style.color:void 0}_plotStyle(e){const t=Pt(e),i={...e.style??{},title:e.title,visible:this._visible&&!1!==e.style?.visible},s=this._plotColor(e),r=(n=this._settings[t.opacity],o=100,"number"==typeof n&&Number.isFinite(n)?n:o);var n,o;void 0!==s&&(i.color=r>=100?s:B(s,r/100));const a=this._settings[t.width];"number"==typeof a&&a>0&&(i.lineWidth=a);const l=this._settings[t.lineStyle];return"string"==typeof l&&(i.lineStyle=l),i}_attach(){this._dataRetry=null;const e=this._d.attach?.({dataContext:()=>this._host.dataContext?.(),subscribeDataChanges:e=>this._host.subscribeDataChanges?.(e)??(()=>{}),signal:this._lifetime.signal,setDataStatus:e=>{if(this._removed)return;const t=this._dataStatus;if(t?.state!==e.state||"error"===e.state&&("error"!==t.state||t.error!==e.error)){this._dataStatus=Object.freeze({...e});for(const e of this._dataListeners)e(this._dataStatus);this._host.emit?.("indicator:data-status",{id:this.id,indicatorId:this.indicatorId,status:this._dataStatus})}},setDataRetry:e=>{this._removed||(this._dataRetry=e)},settings:()=>this._descriptorSettings(),bars:()=>this._host.sourceBars(),requestRecompute:()=>{this._removed||(this._barCount=0,this.recompute())},store:this._store,symbol:()=>this._host.symbol?.(),interval:()=>this._host.interval?.(),timezone:()=>this._host.timezone?.()??pe,now:()=>this._host.now?.()??Date.now()/1e3,paneIndex:()=>this.paneIndex,addPrimitive:e=>{this._host.addIndicatorPrimitive?.(e,this.paneIndex)},removePrimitive:e=>{this._host.removeIndicatorPrimitive?.(e)},emit:(e,t)=>{this._host.emit?.(e,t)}});this._detach="function"==typeof e?e:null}dataStatus(){return this._dataStatus}subscribeDataStatus(e){return this._removed?()=>{}:(this._dataListeners.add(e),null!==this._dataStatus&&e(this._dataStatus),()=>{this._dataListeners.delete(e)})}retryData(){this._removed||this._dataRetry?.()}settings(){return{...this._settings}}_descriptorSettings(){const e=this._host.timezone?.()??pe;if(e===pe)return this._settings;const t=this._zoned;if(null!==t&&t.zone===e&&t.base===this._settings)return t.merged;const i={...this._settings,timezone:e};return this._zoned={zone:e,base:this._settings,merged:i},i}series(e){return this._series.get(e)}values(){return this._host.flushIndicators?.(),this._values}setSettings(e){if(!this._removed){this._settings={...this._settings,...e};for(const e of this._d.plots){const t=this._plotType(e);t===this._plotTypes.get(e.key)?this._series.get(e.key)?.applyOptions(this._plotStyle(e)):(this._series.get(e.key)?.remove(),this._series.set(e.key,this._host.addIndicatorSeries(t,this._plotPane(e),this._plotStyle(e),e.priceScaleId,e.priceFormat)),this._plotTypes.set(e.key,t))}this._legend?.setOptions({params:this._paramSummary(),color:this._legendColor()}),this._applyRange(),this._values={},this._barCount=0,this.recompute(),this._detach?.(),this._attach(),this._host.emit?.("objects:change",{})}}recompute(){if(this._removed)return;const e=this._host.sourceBars(),t=e.length,i=this._descriptorSettings();let s=null;const r=this._barCount>0&&t===this._barCount+1&&e[t-2].time===this._lastTime&&e[0].time===this._firstTime,n=t>0&&this._barCount>0&&e[0].time===this._firstTime&&(t===this._barCount&&e[t-1].time===this._lastTime||r);n&&(this._live=!0);const o=this._calcContext(e,r);if(n&&void 0!==this._d.calcTail){const r=this._barCount-1,n=this._d.calcTail(e,i,r,this._values,this._store,o);null!==n&&(s=function(e,t,i,s){const r={};for(const n of Object.keys(t)){const o=e[n],a=t[n];if(void 0===o||void 0===a)return null;if(a.length!==s-i)return null;const l=new Array(s);for(let e=0;e<i;e++)l[e]=o[e]??null;for(let e=i;e<s;e++)l[e]=a[e-i]??null;r[n]=l}return r}(this._values,n,r,t))}null===s&&(s=this._d.calc(e,i,this._store,o)),this._values=s,this._barCount=t,this._firstTime=t>0?e[0].time:0,this._lastTime=t>0?e[t-1].time:0;for(const r of this._d.plots){const n=this._series.get(r.key);if(void 0===n)continue;if(void 0!==r.ohlc){n.setData(this._ohlcPoints(r,r.ohlc,s,e,i));continue}const o=s[r.key];if(void 0===o){n.setData([]);continue}const a=r.colorBy,l=new Array(t);for(let r=0;r<t;r++){const t=o[r],n=null==t?NaN:t,h={time:e[r].time,value:n};if(void 0!==a&&Number.isFinite(n)){const e=a({value:n,index:r,values:s,settings:i});void 0!==e&&(h.color=e)}l[r]=h}n.setData(l)}this._syncFills(),this._syncMarkers(e),this._syncTable(e),this._syncDraws(e),this._syncBackground(e),this._syncBarColors(e),this._applyLevels(e,i),this._syncAlerts(e,i,n),this.updateLegendValues()}_ohlcPoints(e,t,i,s,r){const n=s.length,o=[t.open,t.high,t.low,t.close].map(t=>{const s=i[t];if(void 0===s||s.length!==n)throw new Error(`openalgo-charts: ${this.indicatorId} plot "${e.key}" ohlc column "${t}" must be ${n} values`);return s}),a=e.colorBy,l=new Array(n);for(let e=0;e<n;e++){const t=o[3][e],n=null===t?NaN:t,h={time:s[e].time,open:o[0][e]??NaN,high:o[1][e]??NaN,low:o[2][e]??NaN,close:n};if(void 0!==a&&Number.isFinite(n)){const t=a({value:n,index:e,values:i,settings:r});void 0!==t&&(h.color=t)}l[e]=h}return l}_applyLevels(e,t){if(void 0===this._d.levels)return;const i={...t,settings:t,bars:e,values:this._values},s=this._visible?this._d.levels(i):[];let r="";for(const e of s)r+=`${e.price}|${e.color??""}|${e.title??""}|${e.dashed??""}|${e.lineWidth??""}|${e.lineStyle??""};`;if(r===this._levelSig)return;this._levelSig=r;for(const e of this._levels)this._host.removeIndicatorLevel(e);this._levels=[];let n=0;for(const e of s){const t=e.lineStyle??(!1===e.dashed?"solid":"dashed");this._levels.push(this._host.addIndicatorLevel({price:e.price,color:e.color??"#8892a6",dashed:"dashed"===t,lineWidth:e.lineWidth??1,lineStyle:t,label:e.title??"",id:`${this.id}:level:${n++}`},this.paneIndex))}}_applyRange(){this._ownPane&&this._host.setPaneRange(this.paneIndex,this._d.range?.(this._descriptorSettings())??null)}remove(){if(!this._removed){this._removed=!0,this._lifetime.abort(),this._dataRetry=null,this._dataListeners.clear();try{this._detach?.()}catch{}this._detach=null,null!==this._legend&&(this._host.removeIndicatorLegend(this._legend),this._legend=null);for(const e of this._levels)this._host.removeIndicatorLevel(e);this._levels=[];for(const e of this._series.values())e.remove();this._series.clear();for(const e of this._fills)this._host.removeIndicatorFill(e);this._fills.length=0,null!==this._markers&&(this._host.removeIndicatorMarkers(this._markers),this._markers=null),null!==this._table&&(this._host.removeIndicatorTable(this._table),this._table=null),null!==this._draws&&(this._host.removeIndicatorPrimitive?.(this._draws),this._draws=null),null!==this._background&&(this._host.removeIndicatorPrimitive?.(this._background),this._background=null),void 0!==this._d.barColors&&this._host.setBarColors?.(null,this.id),this._ownPane&&this._host.setPaneRange(this.paneIndex,null),this._host.indicatorRemoved?.(this.id)}}}function Dt(e){if("open"in e)return e;if("value"in e){const t=e.value,i={time:e.time,open:t,high:t,low:t,close:t};return void 0!==e.color&&(i.color=e.color),i}return{time:e.time,open:NaN,high:NaN,low:NaN,close:NaN}}const Et={friction:.0055,minSpeed:.02,triggerSpeed:.08};class qt{constructor(e,t={}){Object.defineProperty(this,"_v0",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_k",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_minSpeed",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_duration",{enumerable:!0,configurable:!0,writable:!0,value:void 0});const i={...Et,...t};this._v0=e,this._k=i.friction,this._minSpeed=i.minSpeed;const s=Math.abs(this._v0)>0?this._minSpeed/Math.abs(this._v0):1;this._duration=s>=1?0:-Math.log(s)/this._k}static shouldAnimate(e,t={}){const i=t.triggerSpeed??Et.triggerSpeed;return Math.abs(e)>=i}distanceAt(e){const t=Math.min(Math.max(0,e),this._duration);return this._v0/this._k*(1-Math.exp(-this._k*t))}get durationMs(){return this._duration}finished(e){return e>=this._duration}}const Ht={tau:55,stopFraction:.995,minLogStep:.02};class Vt{constructor(e,t={}){Object.defineProperty(this,"_base",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_target",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_epoch",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_tau",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_duration",{enumerable:!0,configurable:!0,writable:!0,value:void 0});const i={...Ht,...t};this._target=e,this._tau=i.tau,this._duration=-Math.log(1-i.stopFraction)*i.tau}static leadFraction(e={}){const t=e.tau??Ht.tau;return 1-Math.exp(-16.666666666666668/t)}static shouldAnimate(e,t={}){const i=t.minLogStep??Ht.minLogStep;return Math.abs(e)>=i}add(e,t,i){this._base=t,this._target+=e,this._epoch=i}appliedAt(e){const t=e-this._epoch;return t<=0?this._base:t>=this._duration?this._target:this._base+(this._target-this._base)*(1-Math.exp(-t/this._tau))}get totalLogFactor(){return this._target}get durationMs(){return this._duration}finished(e){return e-this._epoch>=this._duration}}function Gt(e){return Math.max(-2,Math.min(2,-e*Math.log(1.1)/100))}const Ut=["Mod","Ctrl","Meta","Alt","Shift"],Yt=new Set(Ut),Kt=new Set(["Shift","Control","Alt","Meta","OS","ShiftLeft","ShiftRight","ControlLeft","ControlRight","AltLeft","AltRight","MetaLeft","MetaRight","OSLeft","OSRight"]);function Zt(){return"undefined"!=typeof navigator&&/mac|iphone|ipad/i.test(navigator.platform||navigator.userAgent||"")}function Xt(e){const t=e.split("+").map(e=>e.trim()).filter(e=>e.length>0);if(0===t.length)return null;const i=t[t.length-1];if(!/^[A-Za-z0-9]+$/.test(i)||Yt.has(i))return null;const s=[];for(const e of t.slice(0,-1)){if(!Yt.has(e))return null;s.includes(e)||s.push(e)}return s.sort((e,t)=>Ut.indexOf(e)-Ut.indexOf(t)),{mods:s,key:i}}function Jt(e){const t=Xt(e);return null===t?"":[...t.mods,t.key].join("+")}const Qt={ArrowLeft:"←",ArrowRight:"→",ArrowUp:"↑",ArrowDown:"↓",Equal:"=",Minus:"-",NumpadAdd:"+",NumpadSubtract:"-",Escape:"Esc",Space:"Space"};function ei(e,t=Zt()){const i=e.code??e.key??"";if(""===i||Kt.has(i))return"";const s=[];return(t?e.metaKey:e.ctrlKey)&&s.push("Mod"),t&&e.ctrlKey&&s.push("Ctrl"),!t&&e.metaKey&&s.push("Meta"),e.altKey&&s.push("Alt"),e.shiftKey&&s.push("Shift"),Jt([...s,i].join("+"))}const ti=new Set(["Mod+KeyW","Mod+KeyT","Mod+KeyN","Mod+KeyQ","Mod+KeyR","Mod+KeyL","Mod+Shift+KeyT","Mod+Shift+KeyN","Mod+Shift+KeyW"]);function ii(e){return ti.has(Jt(e))}const si=[{command:"panLeft",label:"Pan left",combos:["ArrowLeft"]},{command:"panRight",label:"Pan right",combos:["ArrowRight"]},{command:"panLeftFast",label:"Pan left (fast)",combos:["Mod+ArrowLeft"]},{command:"panRightFast",label:"Pan right (fast)",combos:["Mod+ArrowRight"]},{command:"panUp",label:"Pan up",combos:["ArrowUp"]},{command:"panDown",label:"Pan down",combos:["ArrowDown"]},{command:"zoomIn",label:"Zoom in",combos:["Equal","Shift+Equal","NumpadAdd"]},{command:"zoomOut",label:"Zoom out",combos:["Minus","NumpadSubtract"]},{command:"resetScale",label:"Reset scale",combos:["Home","Digit0"]},{command:"fitContent",label:"Fit content",combos:["Alt+KeyF"]},{command:"screenshot",label:"Screenshot (PNG)",combos:["Alt+Shift+KeyS"]},{command:"toggleGridVert",label:"Toggle vertical grid",combos:["Alt+KeyV"]},{command:"toggleGridHorz",label:"Toggle horizontal grid",combos:["Alt+KeyH"]},{command:"toggleCrosshairMagnet",label:"Toggle crosshair magnet",combos:["Alt+KeyM"]}],ri={panLeftFast:["Alt+ArrowLeft"],panRightFast:["Alt+ArrowRight"],screenshot:["Mod+Shift+KeyS"]},ni=new Set(si.map(e=>e.command)),oi=e=>Array.isArray(e)?e:[e];class ai{constructor(e={}){Object.defineProperty(this,"scope",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_isMac",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_persist",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_storageKey",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_preset",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_overrides",{enumerable:!0,configurable:!0,writable:!0,value:{}}),Object.defineProperty(this,"_disabled",{enumerable:!0,configurable:!0,writable:!0,value:new Set}),Object.defineProperty(this,"_custom",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"_entries",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"_reverse",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"_listeners",{enumerable:!0,configurable:!0,writable:!0,value:new Set}),this.scope=e.scope??"hover",this._isMac=e.isMac??Zt(),this._persist=e.persist??!1,this._storageKey=e.storageKey??"openalgo-charts:shortcuts",this._preset=e.preset??"default";const t=e=>{for(const[t,i]of Object.entries(e??{})){if(null===i){this._disabled.add(t);continue}const e=oi(i).map(Jt).filter(e=>""!==e&&!ii(e));this._overrides[t]=e}};t(e.overrides);for(const t of e.disabledCommands??[])this._disabled.add(t);for(const t of e.customShortcuts??[])this._custom.set(t.command,t);const i=this._load();if(null!==i){void 0!==i.preset&&(this._preset=i.preset),t(i.overrides);for(const e of i.disabled??[])this._disabled.add(e)}this._rebuild()}_presetCombos(e){return"alt"===this._preset?ri[e]:void 0}_effectiveCombos(e,t){return this._disabled.has(e)?[]:void 0!==this._overrides[e]?this._overrides[e]:this._presetCombos(e)??t}_rebuild(){this._entries=new Map;for(const e of si)this._entries.set(e.command,{command:e.command,label:e.label,combos:this._effectiveCombos(e.command,e.combos)});for(const e of this._custom.values())this._entries.set(e.command,{command:e.command,label:e.label??e.command,combos:this._effectiveCombos(e.command,oi(e.combos).map(Jt).filter(e=>""!==e))});this._reverse=new Map;for(const e of this._entries.values())for(const t of e.combos)this._reverse.has(t)||this._reverse.set(t,e.command)}resolve(e){const t=ei(e,this._isMac);return""===t?null:this._reverse.get(t)??null}handleKey(e){return this._reverse.get(Jt(e))??null}runCustom(e){const t=this._custom.get(e);return void 0!==t&&(t.onTrigger(),this.emitTrigger(e),!0)}emitTrigger(e,t=""){const i={command:e,combo:t,isCustom:this._custom.has(e)};for(const e of this._listeners)e(i)}on(e){return this._listeners.add(e),()=>this._listeners.delete(e)}setBinding(e,t){const i=oi(t).map(Jt).filter(e=>""!==e&&!ii(e));return 0!==i.length&&(this._overrides[e]=i,this._disabled.delete(e),this._after(),!0)}disable(e){this._disabled.add(e),delete this._overrides[e],this._after()}resetBinding(e){delete this._overrides[e],this._disabled.delete(e),this._after()}resetAll(){this._overrides={},this._disabled.clear(),this._after()}setPreset(e){this._preset=e,this._after()}addCustom(e){this._custom.set(e.command,e),this._after()}list(){return[...this._entries.values()].map(e=>({command:e.command,label:e.label,combos:e.combos,isCustom:this._custom.has(e.command),isDisabled:this._disabled.has(e.command)}))}state(){return{preset:this._preset,overrides:this._overrides,disabled:[...this._disabled]}}_after(){this._rebuild(),this._save()}_save(){if(this._persist&&"undefined"!=typeof localStorage)try{localStorage.setItem(this._storageKey,JSON.stringify(this.state()))}catch{}}_load(){if(!this._persist||"undefined"==typeof localStorage)return null;try{const e=localStorage.getItem(this._storageKey);return null===e?null:JSON.parse(e)}catch{return null}}static shouldIgnore(e){const t=e;if(null==t)return!1;if(!0===t.isContentEditable)return!0;const i=(t.tagName??"").toUpperCase();return"INPUT"===i||"TEXTAREA"===i||"SELECT"===i}}class li{constructor(e){Object.defineProperty(this,"_opts",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_host",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_ghostPrice",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_group",{enumerable:!0,configurable:!0,writable:!0,value:null}),this._opts=e}attached(e){this._host=e}detached(){this._host=null}get price(){return this._opts.price}setPrice(e){this._opts.price=e,this._host?.requestUpdate()}setLeftLabel(e){this._opts.leftLabel=e,this._host?.requestUpdate()}setOptions(e){this._opts={...this._opts,...e},this._host?.requestUpdate()}setDragGhost(e){this._ghostPrice=e,this._host?.requestUpdate()}options(){return this._opts}zOrder(){return"normal"}autoscaleInfo(){return{min:this._opts.price,max:this._opts.price}}draw(e,t){this._group=null;const i=Math.round(t.priceScale.priceToY(this._opts.price)*t.dpr)+.5;if(i<0||i>t.plotHeight*t.dpr)return;const s=t.dpr,r=this._opts.lineWidth??1,n=Math.round(t.plotWidth*s),o=Math.max(0,Math.min(1,this._opts.extentFromRight??1)),a=Math.round(t.plotWidth*(1-o)*s),l=this._opts.color,h=void 0!==this._opts.cursor||!0===this._opts.closeButton,c=t.dragId===this._opts.id,u=h&&!c&&(t.hoverId===this._opts.id||t.hoverId===`${this._opts.id}::close`),d=t.hoverId===`${this._opts.id}::close`;if(e.save(),null!==this._ghostPrice&&c){const i=Math.round(t.priceScale.priceToY(this._ghostPrice)*s)+.5;i>=0&&i<=t.plotHeight*s&&(e.strokeStyle=B(l,.35),e.lineWidth=Math.max(1,Math.round(s)),e.setLineDash([2*s,3*s]),e.beginPath(),e.moveTo(a,i),e.lineTo(n,i),e.stroke(),e.setLineDash([]))}c&&(e.strokeStyle=B(l,.18),e.lineWidth=Math.max(5*s,Math.round(r*s)+4*s),e.beginPath(),e.moveTo(a,i),e.lineTo(n,i),e.stroke()),e.strokeStyle=u||c?$(l,.1):l;const _=Math.max(1,Math.round(r*s));e.lineWidth=u||c?_+Math.round(s):_,e.setLineDash(x(this._opts.lineStyle??(!0===this._opts.dashed?"dashed":"solid"),s)),e.beginPath(),e.moveTo(a,i),e.lineTo(n,i),e.stroke(),e.setLineDash([]),e.font=`500 ${11*s}px system-ui, sans-serif`,e.textBaseline="middle",e.textAlign="left";const b=18*s,p=6*s,f=3*s,m=c||u?$(l,.12):l,g=this._opts.label??t.priceScale.format(this._opts.price);e.fillStyle=m,e.fillRect(n+1,i-b/2,e.measureText(g).width+2*p,b),e.fillStyle=F(l),e.fillText(g,n+1+p,i);if(void 0!==this._opts.badge||void 0!==this._opts.qty||void 0!==this._opts.leftLabel&&""!==this._opts.leftLabel||!0===this._opts.closeButton){const r="transparent"===t.theme.background,n=r?B(l,.14):t.theme.background,h=r?t.theme.axisText:F(t.theme.background),_=B(t.theme.axisText,u||c?.75:.5),m=[];void 0!==this._opts.badge&&m.push({text:this._opts.badge,fill:c?$(l,.2):u?$(l,.12):l,textColor:F(l),border:$(l,-.25)}),void 0!==this._opts.qty&&m.push({text:String(this._opts.qty),fill:n,textColor:h,border:_}),void 0!==this._opts.leftLabel&&""!==this._opts.leftLabel&&m.push({text:this._opts.leftLabel,fill:n,textColor:h,border:_}),!0===this._opts.closeButton&&m.push({close:!0,fill:d?l:n,textColor:d?F(l):h,border:d?l:_}),this._group=function(e,t,i,s,r){const{height:n,padX:o,radius:a,gap:l,dpr:h}=r,c=s.map(t=>!0===t.close?20*h:e.measureText(t.text??"").width+2*o),u=c.reduce((e,t)=>e+t,0)+l*Math.max(0,s.length-1);void 0!==r.backplate&&(e.beginPath(),N(e,t,i-n/2,u,n,a),e.fillStyle=r.backplate,e.fill());let d=Number.POSITIVE_INFINITY,_=t;for(let t=0;t<s.length;t++){const r=s[t],u=c[t];if(e.beginPath(),N(e,_,i-n/2,u,n,a),e.fillStyle=r.fill,e.fill(),void 0!==r.border&&(e.strokeStyle=r.border,e.lineWidth=Math.max(1,Math.round(h)),e.stroke()),!0===r.close){d=_,e.strokeStyle=r.textColor,e.lineWidth=Math.max(1,Math.round(1.4*h));const t=_+u/2,s=3.5*h;e.beginPath(),e.moveTo(t-s,i-s),e.lineTo(t+s,i+s),e.moveTo(t+s,i-s),e.lineTo(t-s,i+s),e.stroke()}else e.fillStyle=r.textColor,e.textAlign="left",e.textBaseline="middle",e.fillText(r.text??"",_+o,i);_+=u+l}return{x0:t/h,x1:(_-l)/h,closeX0:d/h}}(e,a+(1===o?6*s:0),i,m,{height:b,padX:p,radius:f,gap:2*s,backplate:r?void 0:t.theme.background,dpr:s})}e.restore()}hitTest(e,t,i){if(e<0||e>i.plotWidth)return null;const s=i.priceScale.priceToY(this._opts.price),r=Math.abs(t-s),n=this._group;return null!==n&&r<=10&&e>=n.x0&&e<=n.x1?this._opts.closeButton&&e>=n.closeX0?{externalId:`${this._opts.id}::close`,zOrder:"normal",distance:r,cursor:"pointer"}:{externalId:this._opts.id,zOrder:"normal",distance:r,cursor:this._opts.cursor}:r>4?null:{externalId:this._opts.id,zOrder:"normal",distance:r,cursor:this._opts.cursor}}}const hi={long:"#2f6df6",short:"#ef5350",order:"#3b82f6",tp:"#26a69a",sl:"#ef5350",buy:"#26a69a",sell:"#ef5350"},ci="::close";function ui(e,t){const i=e.length;if(0===i)return;let s=0,r=i-1;for(;s<r;){const i=s+r+1>>1,n=e.indexToTime(i);void 0!==n&&n<=t?s=i:r=i-1}const n=e.indexToTime(s);if(void 0!==n){if(s+1<i){const i=e.indexToTime(s+1);if(void 0!==i&&Math.abs(i-t)<Math.abs(n-t))return s+1}return s}}function di(e,t,i,s,r,n){const o=5*n;e.fillStyle=r,e.beginPath(),"buy"===s?(e.moveTo(t,i-1.5*o),e.lineTo(t-o,i),e.lineTo(t+o,i)):(e.moveTo(t,i+1.5*o),e.lineTo(t-o,i),e.lineTo(t+o,i)),e.closePath(),e.fill()}function _i(e,t,i,s,r,n){const o=9*n;e.fillStyle=s,e.beginPath(),e.arc(t,i,o,0,2*Math.PI),e.fill(),""!==r&&(e.fillStyle=F(s),e.font=`500 ${9*n}px system-ui, sans-serif`,e.textAlign="center",e.textBaseline="middle",e.fillText(r,t,i+.5*n))}function bi(e,t,i,s,r,n){const o=String(s);e.font=`500 ${9*n}px system-ui, sans-serif`;const a=e.measureText(o).width+10*n,l=15*n;e.fillStyle=r,e.beginPath(),N(e,Math.round(t-a/2),Math.round(i-l/2),Math.round(a),Math.round(l),3*n),e.fill(),e.fillStyle=F(r),e.textAlign="center",e.textBaseline="middle",e.fillText(o,t,i+.5*n)}class pi{constructor(e){Object.defineProperty(this,"_trades",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"_colors",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_host",{enumerable:!0,configurable:!0,writable:!0,value:null}),this._colors=e}attached(e){this._host=e}detached(){this._host=null}zOrder(){return"top"}autoscaleInfo(){return null}setTrades(e){this._trades=e,this._host?.requestUpdate()}setColors(e){this._colors=e,this._host?.requestUpdate()}draw(e,t){if(0===this._trades.length)return;const i=t.dpr,s=new Map;e.save();for(const r of this._trades){const n=ui(t.dataLayer,Math.floor(r.timestamp/1e3));if(void 0===n)continue;const o=Math.round(t.timeScale.indexToX(n)*i),a=r.color??("buy"===r.side?this._colors.buy:this._colors.sell),l=r.variant??"chevron";if("count"===l){const e=`${n}:${r.side}`;let t=s.get(e);void 0===t&&(t={index:n,sumPS:0,sumS:0,n:0,color:a},s.set(e,t)),t.sumPS+=r.price*r.size,t.sumS+=r.size,t.n+=1;continue}const h=Math.round(t.priceScale.priceToY(r.price)*i);"bubble"===l?_i(e,o,h,a,r.label??("buy"===r.side?"B":"S"),i):di(e,o,h,r.side,a,i)}for(const r of s.values()){const s=r.sumS>0?r.sumPS/r.sumS:0;bi(e,Math.round(t.timeScale.indexToX(r.index)*i),Math.round(t.priceScale.priceToY(s)*i),r.n,r.color,i)}e.restore()}}class fi{constructor(e){Object.defineProperty(this,"_host",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_positions",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"_orders",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"_trades",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"_listeners",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"_dragPrev",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"_colors",{enumerable:!0,configurable:!0,writable:!0,value:{...hi}}),Object.defineProperty(this,"_markers",{enumerable:!0,configurable:!0,writable:!0,value:null}),this._host=e,e.subscribeClick(e=>this._onClick(e)),e.subscribeDrag((e,t)=>this._onDrag(e,t),(e,t)=>this._onDragEnd(e,t))}on(e,t){let i=this._listeners.get(e);return void 0===i&&(i=new Set,this._listeners.set(e,i)),i.add(t),()=>{this._listeners.get(e)?.delete(t)}}off(e,t){this._listeners.get(e)?.delete(t)}_emit(e,t){const i=this._listeners.get(e);if(void 0!==i)for(const e of i)e(t);this._host.emit?.(e,t)}setSettings(e){void 0!==e.longColor&&(this._colors.long=e.longColor),void 0!==e.shortColor&&(this._colors.short=e.shortColor),void 0!==e.orderColor&&(this._colors.order=e.orderColor),void 0!==e.tpColor&&(this._colors.tp=e.tpColor),void 0!==e.slColor&&(this._colors.sl=e.slColor),void 0!==e.buyColor&&(this._colors.buy=e.buyColor),void 0!==e.sellColor&&(this._colors.sell=e.sellColor),this.setPositions(this.getPositions()),this.setOrders(this.getOrders()),this._markers?.setColors(this._colors)}getSettings(){return{...this._colors}}setPositions(e){this._sync(this._positions,e,"pos")}setOrders(e){this._sync(this._orders,e,"ord")}setTrades(e){this._trades.clear();for(const t of e)this._trades.set(t.id,t);this._renderTrades()}addTrade(e){this._trades.set(e.id,e),this._renderTrades()}upsertOrder(e){const t=this.getOrders().filter(t=>t.id!==e.id);t.push(e),this.setOrders(t)}removeOrder(e){const t=this.getOrders().filter(t=>t.id!==e&&t.parentId!==e);this.setOrders(t)}syncState(e){void 0!==e.positions&&this.setPositions(e.positions),void 0!==e.orders&&this.setOrders(e.orders),void 0!==e.trades&&this.setTrades(e.trades)}updatePositionPnl(e,t,i,s){const r=this._positions.get(e);void 0!==r&&(void 0!==i&&(r.entity.pnlText=i),void 0!==s&&(r.entity.pnlPercent=s),r.line.setLeftLabel(this._positionPill(r.entity)))}getPositions(){return[...this._positions.values()].map(e=>e.entity)}getOrders(){return[...this._orders.values()].map(e=>e.entity)}getTrades(){return[...this._trades.values()]}clear(){for(const e of this._positions.values())this._host.removePrimitive(e.line);for(const e of this._orders.values())this._host.removePrimitive(e.line);this._positions.clear(),this._orders.clear(),this._trades.clear(),null!==this._markers&&(this._host.removePrimitive(this._markers),this._markers=null)}_renderTrades(){null===this._markers&&(this._markers=new pi(this._colors),this._host.addPrimitive(this._markers)),this._markers.setTrades(this.getTrades())}_sync(e,t,i){const s=new Set;for(const r of t){s.add(r.id);const t="pos"===i?this._positionOpts(r):this._orderOpts(r),n=this._sig(t),o=e.get(r.id);if(void 0!==o&&o.sig===n)o.entity=r,o.line.setPrice(t.price),void 0!==t.leftLabel&&o.line.setLeftLabel(t.leftLabel);else{void 0!==o&&this._host.removePrimitive(o.line);const i=new li(t);this._host.addPrimitive(i),e.set(r.id,{entity:r,line:i,sig:n})}}for(const[t,i]of e)s.has(t)||(this._host.removePrimitive(i.line),e.delete(t))}_sig(e){return`${e.color}|${e.dashed}|${!0===e.closeButton}|${e.cursor??""}|${void 0!==e.leftLabel}|${e.badge??""}|${e.qty??""}`}_positionPill(e){return void 0===e.pnlText?"":`${e.pnlText}${void 0!==e.pnlPercent?` (${e.pnlPercent})`:""}`}_positionOpts(e){const t="line-only"===e.variant;return{price:e.entryPrice,color:e.color??("long"===e.side?this._colors.long:this._colors.short),lineWidth:2,dashed:!1,id:`pos:${e.id}`,badge:t?void 0:e.side.toUpperCase(),qty:t?void 0:e.size,leftLabel:t?void 0:this._positionPill(e),closeButton:!t&&!0!==e.readOnly,extentFromRight:.3}}_orderOpts(e){const t="line-only"===e.variant,i=!t&&(e.draggable??!0!==e.readOnly),s=e.color??("tp"===e.bracketRole?this._colors.tp:"sl"===e.bracketRole?this._colors.sl:this._colors.order);return{price:e.price,color:s,lineWidth:e.lineWidth??1,dashed:"solid"!==(e.lineStyle??"solid"),id:`ord:${e.id}`,badge:t?void 0:(e.bracketRole??e.side).toUpperCase(),qty:t?void 0:e.size,leftLabel:t||void 0!==e.bracketRole?void 0:e.type.replace("_"," ").toUpperCase(),closeButton:!t&&!0!==e.readOnly,extentFromRight:.3,cursor:i?"ns-resize":void 0}}_onClick(e){if(e.endsWith(ci)){const t=e.slice(0,-7);if(t.startsWith("ord:")){const e=t.slice(4);this._orders.has(e)&&this._emit("trading:order_cancel",{orderId:e})}else if(t.startsWith("pos:")){const e=t.slice(4);this._positions.has(e)&&this._emit("trading:position_close",{positionId:e})}return}if(e.startsWith("ord:")){const t=this._orders.get(e.slice(4));void 0!==t&&this._emit("trading:order_click",{order:t.entity})}else if(e.startsWith("pos:")){const t=this._positions.get(e.slice(4));void 0!==t&&this._emit("trading:position_click",{position:t.entity})}}_onDrag(e,t){if(!e.startsWith("ord:"))return;const i=this._orders.get(e.slice(4));if(void 0===i)return;const s=e.slice(4);this._dragPrev.has(s)||(this._dragPrev.set(s,i.entity.price),i.line.setDragGhost(i.entity.price)),i.line.setPrice(t)}_onDragEnd(e,t){if(!e.startsWith("ord:"))return;const i=e.slice(4),s=this._orders.get(i);if(void 0===s)return;const r=this._dragPrev.get(i)??s.entity.price;this._dragPrev.delete(i),s.line.setDragGhost(null),s.entity.price=t,s.line.setPrice(t),void 0!==s.entity.bracketRole?this._emit("trading:bracket_modify",{parentId:s.entity.parentId,bracketRole:s.entity.bracketRole,newPrice:t}):this._emit("trading:order_modify",{orderId:i,newPrice:t,previousPrice:r})}}function mi(e,t){return{dist:Math.hypot(e.x-t.x,e.y-t.y),cx:(e.x+t.x)/2,cy:(e.y+t.y)/2}}const gi=new WeakMap;function vi(e,t,i){gi.get(e)?.();let s=null;const r=r=>{null!==s&&(s(),s=null,gi.get(e)===n&&gi.delete(e),e.emit("pick:end",{kind:t,value:r}),null!==r&&i(r))},n=()=>r(null);return s=e.on("click",i=>{const s=i;let n="price"===t?s.price:s.time;if(null!==n&&Number.isFinite(n)){if("time"===t){const t=e.dataLayer;n=t.indexToTime(Math.round(t.timeToIndexFloat(n)))??n}r(n)}}),gi.set(e,n),e.emit("pick:start",{kind:t}),n}const yi={tiny:6,small:9,medium:12,big:16};function wi(e){return yi[e]}function xi(e,t){return Math.max(4,Math.min(yi[e],Math.floor(t)))}function Si(e,t,i,s,r,n){const o=r/2;switch(e.fillStyle=n,e.strokeStyle=n,e.beginPath(),t){case"arrowUp":case"triangleUp":e.moveTo(i,s-o),e.lineTo(i+o,s+o),e.lineTo(i-o,s+o),e.closePath(),e.fill();break;case"arrowDown":case"triangleDown":e.moveTo(i,s+o),e.lineTo(i+o,s-o),e.lineTo(i-o,s-o),e.closePath(),e.fill();break;case"circle":e.arc(i,s,o,0,2*Math.PI),e.fill();break;case"square":e.fillRect(i-o,s-o,r,r);break;case"diamond":e.moveTo(i,s-o),e.lineTo(i+o,s),e.lineTo(i,s+o),e.lineTo(i-o,s),e.closePath(),e.fill();break;case"flag":e.fillRect(i-1,s-o,Math.max(1,r/8),r),e.fillRect(i,s-o,o,.8*o)}}function Pi(e,t,i,s,r,n,o){e.font=`600 ${o}px system-ui, sans-serif`;const a=.5*o,l=r.indexOf("\n")<0?void 0:r.split("\n");let h=e.measureText(void 0===l?r:l[0]).width;if(void 0!==l)for(let t=1;t<l.length;t++)h=Math.max(h,e.measureText(l[t]).width);const c=1.35*o,u=h+2*a,d=o+.64*o+(void 0===l?0:c*(l.length-1)),_=.42*o,b=t?s+_:s-_-d;e.fillStyle=n,N(e,i-u/2,b,u,d,Math.min(.3*o,d/2)),e.fill();const p=t?b+1:b+d-1;if(e.beginPath(),e.moveTo(i,s),e.lineTo(i-_,p),e.lineTo(i+_,p),e.closePath(),e.fill(),e.fillStyle=F(n),e.textAlign="center",e.textBaseline="middle",void 0===l)return void e.fillText(r,i,b+d/2);const f=b+d/2-c*(l.length-1)/2;for(let t=0;t<l.length;t++)e.fillText(l[t],i,f+c*t)}class Oi{constructor(e){Object.defineProperty(this,"_seriesId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_markers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"_host",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_lastPositions",{enumerable:!0,configurable:!0,writable:!0,value:[]}),this._seriesId=e}attached(e){this._host=e}detached(){this._host=null}zOrder(){return"normal"}setMarkers(e){this._markers=e.slice().sort((e,t)=>e.time-t.time),this._host?.requestUpdate()}draw(e,t){if(this._lastPositions=[],0===this._markers.length)return;const i=new Map;for(const e of t.dataLayer.indexedBars(this._seriesId))i.set(e.bar.time,e.bar);const s=t.timeScale.visibleRange(),r=new Map;e.save();for(const n of this._markers){const o=t.dataLayer.timeToIndex(n.time);if(void 0===o||o<s.from-1||o>s.to+1)continue;const a=i.get(n.time),l=xi(n.size,t.timeScale.barSpacing)*t.dpr,h=t.timeScale.indexToX(o)*t.dpr,c=r.get(n.time)??0,u=(l+4*t.dpr)*c;let d;if("atPrice"===n.position&&void 0!==n.price)d=t.priceScale.priceToY(n.price)*t.dpr;else if(void 0!==a&&"aboveBar"===n.position)d=t.priceScale.priceToY(a.high)*t.dpr-l-u;else if(void 0!==a&&"belowBar"===n.position)d=t.priceScale.priceToY(a.low)*t.dpr+l+u;else{if(void 0===a)continue;d=t.priceScale.priceToY((a.open+a.close)/2)*t.dpr}if(r.set(n.time,c+1),"labelUp"!==n.shape&&"labelDown"!==n.shape){if(Si(e,n.shape,h,d,l,n.color),void 0!==n.text){const i=Math.max(9,wi(n.size))*t.dpr;e.fillStyle=n.color,e.font=`${i}px system-ui, sans-serif`,e.textAlign="center";const s="belowBar"===n.position;e.textBaseline=s?"top":"bottom";const r=s?d+l:d-l;if(n.text.indexOf("\n")<0)e.fillText(n.text,h,r);else{const t=n.text.split("\n"),o=1.35*i;for(let i=0;i<t.length;i++)e.fillText(t[s?i:t.length-1-i],h,s?r+o*i:r-o*i)}}void 0!==n.id&&this._lastPositions.push({id:n.id,x:h/t.dpr,y:d/t.dpr})}else void 0!==n.text&&Pi(e,"labelUp"===n.shape,h,d,n.text,n.color,Math.max(9,wi(n.size))*t.dpr),void 0!==n.id&&this._lastPositions.push({id:n.id,x:h/t.dpr,y:d/t.dpr})}e.restore()}hitTest(e,t){let i=null;for(const s of this._lastPositions){const r=Math.hypot(s.x-e,s.y-t);r<=8&&(null===i||r<i.distance)&&(i={externalId:s.id,zOrder:"normal",distance:r,cursor:"pointer"})}return i}}const Mi={earnings:"#f0a020",dividend:"#26a69a",split:"#4f8cff",news:"#9aa0b4"};class ki{constructor(){Object.defineProperty(this,"_events",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"_host",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_positions",{enumerable:!0,configurable:!0,writable:!0,value:[]})}attached(e){this._host=e}detached(){this._host=null}zOrder(){return"normal"}setEvents(e){this._events=e.slice().sort((e,t)=>e.time-t.time),this._host?.requestUpdate()}draw(e,t){if(this._positions=[],0===this._events.length)return;const i=t.timeScale.visibleRange(),s=8*t.dpr,r=t.plotHeight*t.dpr-s-4*t.dpr;e.save(),e.textAlign="center",e.textBaseline="middle",e.font=10*t.dpr+"px system-ui, sans-serif";for(const n of this._events){const o=t.dataLayer.timeToIndex(n.time);if(void 0===o||o<i.from-1||o>i.to+1)continue;const a=t.timeScale.indexToX(o)*t.dpr,l=n.color??Mi[n.type]??"#9aa0b4";e.fillStyle=l,e.beginPath(),e.arc(a,r,s,0,2*Math.PI),e.fill(),e.fillStyle="#0d0e12",e.fillText(n.label.slice(0,2),a,r),void 0!==n.id&&this._positions.push({id:n.id,x:a/t.dpr,y:r/t.dpr,r:s/t.dpr})}e.restore()}hitTest(e,t){let i=null;for(const s of this._positions){const r=Math.hypot(s.x-e,s.y-t);r<=s.r&&(null===i||r<i.distance)&&(i={externalId:s.id,zOrder:"normal",distance:r,cursor:"pointer"})}return i}}const Ti=18,Ci=16,Ii="ui-sans-serif, system-ui, sans-serif",ji={},Li={};function Ai(e,t){return"ohlc"===t?!1!==e.chartValues:"change"===t?!1!==e.barChange:"volume"===t?!1!==e.volume:!1!==e.lastValueLabel}const zi=["hide","settings","close"];function Fi(e,t,i,s,r,n,o){const a=.42*r,l=Math.max(1,Math.round(1.4*n));switch(e.save(),e.strokeStyle=e.fillStyle,e.lineWidth=l,e.lineCap="round",e.lineJoin="round",e.beginPath(),t){case"up":e.moveTo(i,s+a),e.lineTo(i,s-a),e.moveTo(i-.62*a,s-.35*a),e.lineTo(i,s-a),e.lineTo(i+.62*a,s-.35*a);break;case"down":e.moveTo(i,s-a),e.lineTo(i,s+a),e.moveTo(i-.62*a,s+.35*a),e.lineTo(i,s+a),e.lineTo(i+.62*a,s+.35*a);break;case"hide":e.moveTo(i-a,s),e.quadraticCurveTo(i,s-1.15*a,i+a,s),e.quadraticCurveTo(i,s+1.15*a,i-a,s),e.stroke(),e.beginPath(),e.arc(i,s,.34*a,0,2*Math.PI),!0===o.hidden&&(e.moveTo(i-a,s+.85*a),e.lineTo(i+a,s-.85*a));break;case"maximize":!0===o.maximized?(e.moveTo(i-a,s-.25*a),e.lineTo(i-.25*a,s-.25*a),e.lineTo(i-.25*a,s-a),e.moveTo(i+a,s+.25*a),e.lineTo(i+.25*a,s+.25*a),e.lineTo(i+.25*a,s+a)):(e.moveTo(i-a,s-.4*a),e.lineTo(i-a,s-a),e.lineTo(i-.4*a,s-a),e.moveTo(i+.4*a,s-a),e.lineTo(i+a,s-a),e.lineTo(i+a,s-.4*a),e.moveTo(i+a,s+.4*a),e.lineTo(i+a,s+a),e.lineTo(i+.4*a,s+a),e.moveTo(i-.4*a,s+a),e.lineTo(i-a,s+a),e.lineTo(i-a,s+.4*a));break;case"settings":e.arc(i,s,.46*a,0,2*Math.PI);for(let t=0;t<8;t++){const r=t*Math.PI/4,n=Math.cos(r),o=Math.sin(r);e.moveTo(i+n*a*.68,s+o*a*.68),e.lineTo(i+n*a,s+o*a)}break;case"close":e.moveTo(i-.8*a,s-.55*a),e.lineTo(i+.8*a,s-.55*a),e.moveTo(i-.3*a,s-.55*a),e.lineTo(i-.3*a,s-.85*a),e.lineTo(i+.3*a,s-.85*a),e.lineTo(i+.3*a,s-.55*a),e.moveTo(i-.6*a,s-.55*a),e.lineTo(i-.45*a,s+.85*a),e.lineTo(i+.45*a,s+.85*a),e.lineTo(i+.6*a,s-.55*a)}e.stroke(),e.restore()}class Bi{constructor(e){Object.defineProperty(this,"_opts",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_host",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_values",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"_buttons",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"_width",{enumerable:!0,configurable:!0,writable:!0,value:0}),this._opts={font:11,left:8,top:6,row:0,...e}}attached(e){this._host=e}detached(){this._host=null}zOrder(){return"top"}autoscaleInfo(){return null}setValue(e,t){this.setValues(""===e?[]:[{text:e,color:t}])}setValues(e){e.length===this._values.length&&e.every((e,t)=>e.text===this._values[t].text&&e.label===this._values[t].label&&e.color===this._values[t].color&&e.field===this._values[t].field)||(this._values=e.map(e=>({...e})),this._host?.requestUpdate())}setOptions(e){const t=this._opts.statusLine;this._opts={...this._opts,...e},void 0!==e.statusLine&&(this._opts.statusLine={...t,...e.statusLine}),this._host?.requestUpdate()}_status(){const e=this._opts.status;return void 0===e?Li:("function"==typeof e?e():e)??Li}options(){return this._opts}draw(e,t){const i=this._opts,s=t.dpr,r=(i.font??11)*s,n=((i.top??6)+(i.row??0)*Ti)*s,o=n+Ti*s/2,a=(i.left??8)*s;let l=a;const h=!0===i.hidden,c=i.statusLine??ji,u=this._status(),d=B(t.theme.axisText,.55);e.save(),e.textBaseline="middle",e.textAlign="left",e.globalAlpha=h?.45:1;const _=[],b=(t,i,n,o)=>{e.font=`${n?"600 ":""}${r}px ${Ii}`,_.push({k:"text",text:t,color:i,bold:n,w:e.measureText(t).width,gap:o*s})},p=(e,t)=>{void 0!==e.label&&""!==e.label&&b(e.label,d,!1,3),b(e.text,e.color??t,!1,6)};if(void 0!==u.logo&&!1!==c.logo&&_.push({k:"logo",img:u.logo,w:12*s,gap:5*s}),void 0!==i.color&&_.push({k:"dot",color:i.color,w:6*s,gap:5*s}),!1!==c.title){const e=c.titleMode??"symbol",s="description"===e?u.description:"ticker"===e?u.ticker:void 0;b(s??i.title,t.theme.axisText,!0,6)}void 0!==i.params&&""!==i.params&&b(i.params,d,!1,6),void 0!==u.marketStatus&&!1!==c.marketStatus&&p(u.marketStatus,d);const f=i.valueColor??i.color??t.theme.axisText;for(const e of this._values)Ai(c,e.field)&&p(e,f);void 0!==u.lastDayChange&&!1!==c.lastDayChange&&p(u.lastDayChange,f);const m=_[_.length-1];if(!0===c.background&&void 0!==m){const i=4*s,r=_.reduce((e,t)=>e+t.w+t.gap,0)-m.gap+2*i;e.globalAlpha=1,e.fillStyle=B(c.backgroundColor??t.theme.background,c.backgroundOpacity??.8),e.beginPath(),e.roundRect(a-i,o-9*s,r,Ti*s,4*s),e.fill(),e.globalAlpha=h?.45:1}for(const t of _)"text"===t.k?(e.font=`${t.bold?"600 ":""}${r}px ${Ii}`,e.fillStyle=t.color,e.fillText(t.text,l,o)):"dot"===t.k?(e.fillStyle=t.color,e.beginPath(),e.arc(l+3*s,o,3*s,0,2*Math.PI),e.fill()):e.drawImage(t.img,l,o-t.w/2,t.w,t.w),l+=t.w+t.gap;this._buttons=[];const g="string"==typeof t.hoverId&&t.hoverId.startsWith(`${i.id}::`),v=i.actions??zi;if(g&&v.length>0){const a=(18*v.length+6)*s;e.globalAlpha=1,e.fillStyle=B(t.theme.background,.82),e.beginPath(),e.roundRect(l-3*s,o-9*s,a,Ti*s,5*s),e.fill(),l+=2*s;for(const a of v){const c=`${i.id}::${a}`,u=l;this._buttons.push({id:c,x:u/s,y:n/s});const d=t.hoverId===c;d&&(e.fillStyle=B(t.theme.axisText,.16),e.beginPath(),e.roundRect(u,o-8*s,Ci*s,Ci*s,4*s),e.fill()),e.globalAlpha=h?.5:d?1:.75,e.fillStyle="close"===a&&d?"#ff6b6b":t.theme.axisText,Fi(e,a,u+8*s,o,r,s,i),e.globalAlpha=1,l+=18*s}}this._width=l/s,e.restore()}hitTest(e,t){const i=this._opts,s=(i.top??6)+(i.row??0)*Ti;if(t<s||t>s+Ti)return null;for(const t of this._buttons)if(e>=t.x&&e<=t.x+Ci)return{externalId:t.id,zOrder:"top",distance:0,cursor:"pointer"};const r=Math.max(this._width,(i.left??8)+40)+130;return e>=(i.left??8)-4&&e<=r?{externalId:`${i.id}::row`,zOrder:"top",distance:0,cursor:"default"}:null}}const $i={position:"bottom-right",margin:8,cellWidth:64,cellHeight:18,fontSize:11,borderWidth:1};function Ni(e,t,i,s,r,n){const[o,a]=e.split("-");return{x:"left"===a?t:"right"===a?r-i-t:(r-i)/2,y:"top"===o?t:"bottom"===o?n-s-t:(n-s)/2}}class Ri{constructor(e={}){Object.defineProperty(this,"_rows",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"_opts",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_host",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_rect",{enumerable:!0,configurable:!0,writable:!0,value:null}),this._opts={...$i,...e}}attached(e){this._host=e}detached(){this._host=null}zOrder(){return"top"}options(){return this._opts}setOptions(e){this._opts={...this._opts,...e},this._host?.requestUpdate()}setRows(e){this._rows=e,this._host?.requestUpdate()}rows(){return this._rows}draw(e,t){this._rect=null;const i=this._rows;if(0===i.length)return;const s=this._opts,r=t.dpr;let n=0;for(const e of i)e.length>n&&(n=e.length);if(0===n)return;const o=function(e,t){const i=[];let s=0;for(let r=0;r<t;r++)i.push(s),s+="number"==typeof e?e:e[r]??e[e.length-1]??0;return{x:i,total:s}}(s.cellWidth,n);let a=o.x,l=o.total;if(void 0!==s.widthPercent&&s.widthPercent>0&&l>0){const e=t.plotWidth*s.widthPercent/100,i=e/l;a=a.map(e=>e*i),l=e}const h=i.map((e,t)=>{const i=s.rowWeights?.[t];return"number"==typeof i&&i>0?i:1}),c=h.reduce((e,t)=>e+t,0);let u=s.cellHeight,d=u*c;void 0!==s.heightPercent&&s.heightPercent>0&&(d=t.plotHeight*s.heightPercent/100,u=d/c);const _=[];for(let e=0,t=0;e<i.length;e++)_.push(t),t+=u*h[e];const b=Ni(s.position,s.margin,l,d,t.plotWidth,t.plotHeight);this._rect={x:b.x,y:b.y,w:l,h:d};const p=e=>Math.round(e*r),f=p(b.x),m=p(b.y);e.save(),void 0!==s.background&&(e.fillStyle=s.background,e.fillRect(f,m,p(l),p(d))),e.textBaseline="middle";for(let r=0;r<i.length;r++){const n=i[r],o=m+p(_[r]),c=p(u*h[r]);for(let i=0;i<n.length;i++){const r=n[i],h=f+p(a[i]),u=p((a[i+1]??l)-a[i]);if(void 0!==r.bgColor&&(e.fillStyle=r.bgColor,e.fillRect(h,o,u,c)),void 0!==s.borderColor&&s.borderWidth>0&&(e.strokeStyle=s.borderColor,e.lineWidth=Math.max(1,p(s.borderWidth)),e.strokeRect(h,o,u,c)),""===r.text)continue;const d=Math.min(p(r.fontSize??s.fontSize),Math.floor(.62*c));e.font=`${!0===r.bold?"600 ":""}${d}px system-ui, sans-serif`,e.fillStyle=r.textColor??(void 0!==r.bgColor?F(r.bgColor):t.theme.axisText);const _=p(4),b=r.align??"center";e.textAlign=b;const m="left"===b?h+_:"right"===b?h+u-_:h+u/2;e.fillText(r.text,m,o+c/2)}}e.restore()}hitTest(e,t){const i=this._rect;return void 0===this._opts.id||null===i||e<i.x||e>i.x+i.w||t<i.y||t>i.y+i.h?null:{externalId:this._opts.id,zOrder:"top",distance:0,cursor:"default"}}}const Wi={zoomOut:"Zoom out",zoomIn:"Zoom in",resetScale:"Reset view",panLeftBar:"Move left",panRightBar:"Move right"},Di={id:"timenav",buttons:["zoomOut","zoomIn",null,"resetScale",null,"panLeftBar","panRightBar"],size:26,gap:4,groupGap:16,bottomMargin:10,revealHeight:64,fadeSeconds:.12,labels:Wi,hints:{},showTooltip:!0,font:11,radius:6,zOrder:"top"};class Ei{constructor(e={},t){Object.defineProperty(this,"_opts",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_host",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_boxes",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"_pointer",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_opacity",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_lastFrameMs",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_now",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_revealTop",{enumerable:!0,configurable:!0,writable:!0,value:1/0}),this._opts={...Di,...e,labels:{...Di.labels,...e.labels}},this._now=t??(()=>"undefined"!=typeof performance?performance.now():0)}attached(e){this._host=e}detached(){this._host=null}zOrder(){return this._opts.zOrder??"top"}options(){return this._opts}setOptions(e){this._opts={...this._opts,...e,labels:{...this._opts.labels,...e.labels}},this._host?.requestUpdate()}setPointer(e){const t=this._pointer;this._pointer=e,(null===t!=(null===e)||this._opacity>0||this._targetOpacity()>0)&&this._host?.requestUpdate()}_revealed(){return null!==this._pointer&&this._pointer.y>=this._revealTop}_targetOpacity(){return this._revealed()?1:0}animating(){return Math.abs(this._targetOpacity()-this._opacity)>.001}draw(e,t){const i=this._opts,s=t.dpr;this._revealTop=Math.max(0,t.plotHeight-i.revealHeight);const r=this._targetOpacity(),n=this._now(),o=null===this._lastFrameMs?0:Math.max(0,(n-this._lastFrameMs)/1e3);if(this._lastFrameMs=n,i.fadeSeconds<=0||o<=0)i.fadeSeconds<=0&&(this._opacity=r);else{const e=o/i.fadeSeconds;this._opacity+=Math.sign(r-this._opacity)*Math.min(e,Math.abs(r-this._opacity))}if(this._opacity<=.001)return this._boxes=[],void(this._opacity=0);const a=i.size;let l=0;for(let e=0;e<i.buttons.length;e++){null!==i.buttons[e]?(l+=a,e<i.buttons.length-1&&null!==i.buttons[e+1]&&(l+=i.gap)):l+=i.groupGap}const h=(t.plotWidth-l)/2,c=t.plotHeight-i.bottomMargin-a;this._boxes=[];let u=h;for(let e=0;e<i.buttons.length;e++){const t=i.buttons[e];null!==t?(this._boxes.push({action:t,x:u,y:c,w:a,h:a}),u+=a,e<i.buttons.length-1&&null!==i.buttons[e+1]&&(u+=i.gap)):u+=i.groupGap}const d=this._hoveredAction();e.save(),e.globalAlpha=this._opacity;for(const i of this._boxes)this._button(e,i,i.action===d,t,s);i.showTooltip&&null!==d&&this._tooltip(e,d,t,s),e.restore()}_hoveredAction(){const e=this._pointer;if(null===e)return null;for(const t of this._boxes)if(e.x>=t.x&&e.x<=t.x+t.w&&e.y>=t.y&&e.y<=t.y+t.h)return t.action;return null}_button(e,t,i,s,r){const n=this._opts,o=t.x*r,a=t.y*r,l=t.w*r,h=t.h*r,c=Math.min(n.radius*r,l/2,h/2);e.beginPath(),e.roundRect(o,a,l,h,c),e.fillStyle=qi(s.theme.background,s.theme.axisText,i?.28:.12),e.fill(),e.strokeStyle=Vi(s.theme.axisLine,i?1:.8),e.lineWidth=Math.max(1,Math.round(r)),e.stroke(),e.strokeStyle=s.theme.axisText,e.fillStyle=s.theme.axisText,e.lineWidth=Math.max(1,Math.round(1.5*r)),e.lineCap="round",e.lineJoin="round";const u=o+l/2,d=a+h/2,_=.22*Math.min(l,h);switch(e.beginPath(),t.action){case"zoomOut":e.moveTo(u-_,d),e.lineTo(u+_,d);break;case"zoomIn":e.moveTo(u-_,d),e.lineTo(u+_,d),e.moveTo(u,d-_),e.lineTo(u,d+_);break;case"resetScale":{const t=_*Math.SQRT1_2;e.arc(u,d,_,.75*-Math.PI,.75*Math.PI),e.moveTo(u-t,d-2*t),e.lineTo(u-t,d-t),e.lineTo(u,d-t);break}case"panLeftBar":e.moveTo(u+.55*_,d-_),e.lineTo(u-.5*_,d),e.lineTo(u+.55*_,d+_);break;case"panRightBar":e.moveTo(u-.55*_,d-_),e.lineTo(u+.5*_,d),e.lineTo(u-.55*_,d+_)}e.stroke()}_tooltip(e,t,i,s){const r=this._opts,n=this._boxes.find(e=>e.action===t);if(void 0===n)return;const o=r.labels[t]??Wi[t],a=r.hints[t];e.font=r.font*s+"px ui-sans-serif, system-ui, sans-serif",e.textBaseline="middle",e.textAlign="left";const l=7*s,h=8*s,c=e.measureText(o).width,u=2*l+c+(void 0===a?0:e.measureText(a).width+h+8*s),d=22*s;let _=(n.x+n.w/2)*s-u/2;_=Math.max(2*s,Math.min(_,i.plotWidth*s-u-2*s));const b=n.y*s-d-6*s;if(e.beginPath(),e.roundRect(_,b,u,d,5*s),e.fillStyle=qi(i.theme.background,i.theme.axisText,.22),e.fill(),e.strokeStyle=Vi(i.theme.axisLine,.9),e.lineWidth=Math.max(1,Math.round(s)),e.stroke(),e.fillStyle=i.theme.axisText,e.fillText(o,_+l,b+d/2),void 0!==a){const t=_+l+c+h,r=e.measureText(a).width+8*s;e.beginPath(),e.roundRect(t-4*s,b+4*s,r,d-8*s,3*s),e.fillStyle=qi(i.theme.background,i.theme.axisText,.42),e.fill(),e.fillStyle=i.theme.axisText,e.fillText(a,t,b+d/2)}}hitTest(e,t){if(this._opacity<.5)return null;for(const i of this._boxes)if(e>=i.x&&e<=i.x+i.w&&t>=i.y&&t<=i.y+i.h)return{externalId:`${this._opts.id}::${i.action}`,zOrder:"top",distance:0,cursor:"pointer"};return null}}function qi(e,t,i){const s=Hi(e),r=Hi(t);if(null===s||null===r)return e;const n=i<0?0:i>1?1:i;return`rgb(${Math.round(s[0]+(r[0]-s[0])*n)},${Math.round(s[1]+(r[1]-s[1])*n)},${Math.round(s[2]+(r[2]-s[2])*n)})`}function Hi(e){if(e.startsWith("#")){const t=e.slice(1),i=3===t.length?t.split("").map(e=>e+e).join(""):t,s=parseInt(i.slice(0,6),16);return Number.isNaN(s)?null:[s>>16&255,s>>8&255,255&s]}const t=/^rgba?\(([^)]+)\)$/.exec(e);if(null===t)return null;const i=t[1].split(",").map(e=>parseFloat(e));return[i[0],i[1],i[2]]}function Vi(e,t){if(e.startsWith("#")){const i=e.slice(1),s=3===i.length?i.split("").map(e=>e+e).join(""):i,r=parseInt(s.slice(0,6),16);return Number.isNaN(r)?e:`rgba(${r>>16&255},${r>>8&255},${255&r},${t})`}const i=/^rgba?\(([^)]+)\)$/.exec(e);if(null===i)return e;const s=i[1].split(",").map(e=>e.trim());return`rgba(${s[0]},${s[1]},${s[2]},${t})`}function Gi(e){return void 0===e?{x:7,y:4}:"number"==typeof e?{x:e,y:e}:{x:e.x,y:e.y}}function Ui(e,t,i,s,r,n){const o=r-t-i,a=n-t-s;switch(e){case"top-left":return{x:t,y:t,w:i,h:s};case"top-right":return{x:o,y:t,w:i,h:s};case"bottom-left":return{x:t,y:a,w:i,h:s};case"center":return{x:(r-i)/2,y:(n-s)/2,w:i,h:s};default:return{x:o,y:a,w:i,h:s}}}class Yi{constructor(e={}){Object.defineProperty(this,"_opts",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_reveal",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_lastFrameMs",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_labelW",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_now",{enumerable:!0,configurable:!0,writable:!0,value:"undefined"!=typeof performance?()=>performance.now():()=>0}),Object.defineProperty(this,"_host",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_img",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_ready",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"_autoHeight",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_tintCanvas",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_tintKey",{enumerable:!0,configurable:!0,writable:!0,value:""}),this._autoHeight=void 0===e.height,this._opts={position:e.position??"bottom-right",margin:e.margin??12,height:e.height??28,opacity:e.opacity??.7,zOrder:e.zOrder??"top",src:e.src,image:e.image,tint:e.tint,label:e.label,id:e.id??"watermark",revealSeconds:e.revealSeconds??.18,labelColor:e.labelColor,fontSize:e.fontSize??12,background:e.background,borderColor:e.borderColor,radius:e.radius??6,padding:Gi(e.padding),href:e.href,utmMedium:e.utmMedium??"oac-link",utmCampaign:e.utmCampaign??"oac-chart"},e.image&&(this._img=e.image,this._ready=!0)}attached(e){if(this._host=e,!this._ready&&this._opts.src&&"undefined"!=typeof Image){const e=new Image;e.onload=()=>{this._img=e,this._ready=!0,this._host?.requestUpdate()},e.decoding="async",e.src=this._opts.src}}detached(){this._host=null}zOrder(){return this._opts.zOrder}autoscaleInfo(){return null}setOptions(e){const{padding:t,...i}=e;this._opts={...this._opts,...i},void 0!==t&&(this._opts.padding=Gi(t)),void 0!==e.height&&(this._autoHeight=!1),void 0===e.label&&void 0===e.fontSize||(this._labelW=0),this._tintCanvas=null,e.image?(this._img=e.image,this._ready=!0):void 0!==e.src&&(this._ready=!1,this._img=null,this.attached(this._host)),this._host?.requestUpdate()}_rect(e){if(!(this._builtin()||this._ready&&null!==this._img))return null;const t=this._img?.naturalWidth??this._img?.width??1,i=this._img?.naturalHeight??this._img?.height??1;if(!t||!i)return null;const s=this._opts,r=Math.max(0,s.margin,s.padding.x,s.padding.y),n=e.plotWidth-2*r,o=e.plotHeight-2*r;if(n<=0||o<=0)return null;const a=this._builtin()&&this._autoHeight&&e.plotWidth<480?24:s.height,l=Math.max(0,Math.min(a,o,n*i/t));if(!Number.isFinite(l)||l<=0)return null;const h=l*(t/i),c=Math.min(n,h+this._labelW*this._reveal);return{...Ui(s.position,r,c,l,e.plotWidth,e.plotHeight),logoW:h}}_builtin(){return void 0===this._opts.src&&void 0===this._opts.image}href(){const e=this._opts.href;if(void 0===e||e.includes("?"))return e;const t="undefined"!=typeof location?location:void 0,i=[`utm_medium=${encodeURIComponent(this._opts.utmMedium)}`,`utm_campaign=${encodeURIComponent(this._opts.utmCampaign)}`];return t?.host&&i.push(`utm_source=${t.host}${t.pathname}`),`${e}${e.includes("?")?"&":"?"}${i.join("&")}`}hitTest(e,t,i){if(void 0===this._opts.label&&void 0===this._opts.href)return null;const s=this._rect(i);if(null===s)return null;const r=Math.max(this._opts.padding.x,4,(44-s.w)/2),n=Math.max(this._opts.padding.y,4,(44-s.h)/2),o=Math.min(i.plotWidth,s.w+2*r),a=Math.min(i.plotHeight,s.h+2*n),l=Math.max(0,Math.min(i.plotWidth-o,s.x-r)),h=Math.max(0,Math.min(i.plotHeight-a,s.y-n));return e>=l&&e<=l+o&&t>=h&&t<=h+a?{externalId:this._opts.id,zOrder:this._opts.zOrder,distance:0,cursor:void 0!==this._opts.href?"pointer":"default"}:null}draw(e,t){if(!(this._builtin()||this._ready&&null!==this._img))return;const i=this._opts,s=t.dpr;void 0!==i.label&&0===this._labelW&&(e.save(),e.font=`600 ${i.fontSize*s}px system-ui, sans-serif`,this._labelW=e.measureText(i.label).width/s+8,e.restore()),this._advanceReveal(t);const r=this._rect(t);if(null===r)return;const n=Math.round(r.x*s),o=Math.round(r.y*s),a=Math.round(r.logoW*s),l=Math.round(r.h*s);e.save();const h=i.padding,c=Math.round((r.x-h.x)*s),u=Math.round((r.y-h.y)*s),d=Math.round((r.x+r.w+h.x)*s)-c,_=Math.round((r.y+r.h+h.y)*s)-u,b=t.theme,p=i.background??(b?B(b.background,.82):"none"),f=i.borderColor??b?.axisLine??"none";"none"!==p&&(e.beginPath(),N(e,c,u,d,_,Math.round(i.radius*s)),e.fillStyle=p,e.fill(),"none"!==f&&(e.strokeStyle=f,e.lineWidth=Math.max(1,Math.round(s)),e.stroke())),e.globalAlpha=Math.max(0,Math.min(1,i.opacity));const m=this._ink(t),g=void 0!==i.label?m:i.tint;if(this._builtin())e.fillStyle=m,function(e,t,i,s){e.save(),e.translate(t,i),e.scale(s/397,s/397),e.translate(-315.1,-217.65),e.beginPath(),e.moveTo(367.5,255.5),e.bezierCurveTo(371.3,251.3,374.8,247.3,378.7,242.8),e.bezierCurveTo(398.1,262.7,416.4,281.4,435.2,300.6),e.bezierCurveTo(461.6,273.7,487.4,247.4,513.6,220.6),e.bezierCurveTo(540.7,247.4,566.9,273.2,592.9,298.9),e.bezierCurveTo(611.4,280.3,629.8,262,648.4,243.3),e.bezierCurveTo(654.6,249.9,660.3,256.1,665.9,262.2),e.bezierCurveTo(648.3,280.2,630.3,298.7,612.5,316.9),e.bezierCurveTo(645.6,350.8,679,384.9,712.1,418.6),e.bezierCurveTo(684.7,446.7,656.7,475.5,628.4,504.5),e.bezierCurveTo(647.5,523.2,667.4,542.7,686.8,561.8),e.bezierCurveTo(680.8,568.3,675,574.7,668.8,581.5),e.bezierCurveTo(648.3,561.4,628.3,541.7,608.1,521.8),e.bezierCurveTo(577.2,551.9,546.6,581.7,516,611.7),e.bezierCurveTo(488.3,584.7,461,558,433.6,531.3),e.bezierCurveTo(415.9,548.5,398.2,565.6,380.1,583.1),e.bezierCurveTo(374.3,576.6,368.7,570.4,363.5,564.6),e.bezierCurveTo(379.4,548,396.1,530.5,412.9,512.9),e.bezierCurveTo(380.7,481.9,348,450.4,315.1,418.7),e.bezierCurveTo(349.2,385,383,351.6,416.6,318.3),e.bezierCurveTo(398.1,299.3,379.8,280.6,360.9,261.3),e.bezierCurveTo(362.8,259.7,365,257.7,367.5,255.5),e.moveTo(540.5,406),e.bezierCurveTo(552,417.1,563.4,428.1,575,439.2),e.bezierCurveTo(588.1,426.5,601.7,413.3,615.9,399.5),e.bezierCurveTo(621.9,406.1,627.8,412.6,633.8,419.2),e.bezierCurveTo(620.3,431.7,606.4,444.8,592.9,457.3),e.bezierCurveTo(600,464.3,606.9,471.2,613.8,478.1),e.bezierCurveTo(633.5,458.1,653.4,437.7,673.2,417.5),e.bezierCurveTo(620.7,365.5,567.7,313.2,514.8,260.8),e.bezierCurveTo(494.6,280.6,474.6,300.2,454.3,320),e.bezierCurveTo(461.7,327,468.8,333.8,477.5,342.1),e.bezierCurveTo(489.4,329.1,501.6,315.8,514.3,301.9),e.bezierCurveTo(521,308.7,526.7,314.6,531.9,319.9),e.bezierCurveTo(519.2,333.3,506.8,346.5,494.7,359.4),e.bezierCurveTo(509.5,374.4,524.7,390,540.5,406),e.moveTo(575.3,514.8),e.bezierCurveTo(581.4,508.6,587.6,502.3,593.4,496.4),e.bezierCurveTo(586.7,489.5,580.1,482.5,573.2,475.3),e.bezierCurveTo(557.6,490.1,542.3,504.7,526.9,519.3),e.bezierCurveTo(520.9,513.3,515.2,507.5,509.4,501.6),e.bezierCurveTo(524.7,487,540,472.3,555.6,457.4),e.bezierCurveTo(528.5,430.5,501.6,403.8,474.5,377),e.bezierCurveTo(461.3,389.6,448,402.3,434.6,415.2),e.bezierCurveTo(455,435.2,475.1,454.9,494.9,474.3),e.bezierCurveTo(482.1,487.6,469.4,500.8,456.5,514.1),e.bezierCurveTo(476.3,533.2,496.5,552.7,516.8,572.4),e.bezierCurveTo(536.3,553.1,555.6,534.2,575.3,514.8),e.moveTo(413.2,474.3),e.bezierCurveTo(420.1,481,427,487.7,434.6,495.1),e.bezierCurveTo(441.3,487.6,447.8,480.3,453.9,473.5),e.bezierCurveTo(435.5,454.7,416.3,435.1,397.1,415.5),e.bezierCurveTo(416.9,396.5,436.7,377.7,456.9,358.4),e.bezierCurveTo(449.8,351.8,442.7,345.3,435.6,338.7),e.bezierCurveTo(409,364.8,381.8,391.4,354.7,418),e.bezierCurveTo(374.3,436.9,393.4,455.4,413.2,474.3),e.closePath(),e.fill(),e.restore()}(e,n,o,l);else{const t=g?this._tinted(e,a,l,g):this._img;g&&t?e.drawImage(t,n,o):this._img&&e.drawImage(this._img,n,o,a,l)}if(void 0!==i.label&&this._reveal>.001){const t=(r.w-r.logoW)*s;e.beginPath(),e.rect(n+a,o,t,l),e.clip(),e.globalAlpha=this._reveal,e.font=`600 ${Math.round(i.fontSize*s)}px system-ui, -apple-system, sans-serif`,e.textBaseline="middle",e.textAlign="left",e.fillStyle=m,e.fillText(i.label,Math.round(n+a+6*s),Math.round(o+l/2))}e.restore()}_ink(e){const t=this._opts,i=e.theme;return t.labelColor??t.tint??i?.axisText??"#9aa3b2"}_advanceReveal(e){if(void 0===this._opts.label)return;const t=e.hoverId===this._opts.id?1:0,i=this._now(),s=null===this._lastFrameMs?0:Math.max(0,(i-this._lastFrameMs)/1e3);this._lastFrameMs=i;const r=this._opts.revealSeconds;if(r<=0)this._reveal=t;else if(this._reveal!==t){const e=s/r;this._reveal+=Math.sign(t-this._reveal)*Math.min(e,Math.abs(t-this._reveal))}Math.abs(t-this._reveal)>.001?this._host?.requestUpdate():this._reveal=t}_tinted(e,t,i,s){const r=`${t}x${i}:${s}`;if(this._tintCanvas&&this._tintKey===r)return this._tintCanvas;const n=e.canvas,o=n?.ownerDocument;let a=null;if(o&&"function"==typeof o.createElement&&(a=o.createElement("canvas")),!a)return null;a.width=t,a.height=i;const l=a.getContext("2d");return l&&null!==this._img?(l.clearRect(0,0,t,i),l.drawImage(this._img,0,0,t,i),l.globalCompositeOperation="source-in",l.fillStyle=s,l.fillRect(0,0,t,i),this._tintCanvas=a,this._tintKey=r,a):null}}const Ki='600 {size}px system-ui, -apple-system, "Segoe UI", sans-serif';class Zi{constructor(e){Object.defineProperty(this,"_host",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_opts",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this._opts={text:e.text,fontSize:e.fontSize??64,opacity:e.opacity??.08,zOrder:e.zOrder??"bottom",id:e.id??"text-watermark",color:e.color,font:e.font}}zOrder(){return this._opts.zOrder}attached(e){this._host=e}detached(){this._host=null}autoscaleInfo(){return null}hitTest(){return null}setOptions(e){this._opts={...this._opts,...e},this._host?.requestUpdate()}draw(e,t){const i=this._opts;if(""===i.text)return;const s=t.dpr,r=t.plotWidth*s,n=t.plotHeight*s;if(r<=0||n<=0)return;e.save(),e.beginPath(),e.rect(0,0,r,n),e.clip(),e.globalAlpha=i.opacity,e.fillStyle=i.color??"#9aa4b2",e.textAlign="center",e.textBaseline="middle";const o=Math.min(i.fontSize*s,.8*n),a=(i.font??Ki).replace("{size}",String(Math.round(o)));e.font=a;const l=e.measureText(i.text).width,h=.8*r;if(l>h&&l>0){const t=Math.max(.1,o*(h/l));e.font=(i.font??Ki).replace("{size}",String(t))}e.fillText(i.text,r/2,n/2),e.restore()}}const Xi=["#f5a623","#26a69a","#ab47bc","#ef5350","#26c6da","#8bc34a","#ff7043","#5c6bc0"];function Ji(e){if(!ve(e))throw new Error(`openalgo-charts: unknown IANA time zone "${e}"`);return e}function Qi(e){const t=Math.abs(e);return t>=1e9?(e/1e9).toFixed(2)+"B":t>=1e6?(e/1e6).toFixed(2)+"M":t>=1e3?(e/1e3).toFixed(2)+"K":String(Math.round(e))}function es(e){const t=e.pointerType;return{modifiers:{shift:!0===e.shiftKey,alt:!0===e.altKey,ctrl:!0===e.ctrlKey,meta:!0===e.metaKey},pointerType:"touch"===t||"pen"===t?t:"mouse",pressure:ts(e)}}function ts(e){const t=e.pressure;return"number"==typeof t&&Number.isFinite(t)?Math.min(1,Math.max(0,t)):0!==(e.buttons??0)?.5:0}function is(){return"undefined"!=typeof window&&window.devicePixelRatio?window.devicePixelRatio:1}class ss{constructor(e,t={}){Object.defineProperty(this,"_container",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_doc",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_pixelRatio",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_theme",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_panes",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"_loop",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_raf",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_remeasureHandle",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_dataLayer",{enumerable:!0,configurable:!0,writable:!0,value:new w}),Object.defineProperty(this,"_timeScale",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_priceAxisWidth",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_timeAxisHeight",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_pending",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_resizeObserver",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_width",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_height",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_hasFitContent",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"_crosshairMode",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_shortcuts",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_trading",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_pointerInside",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"_keyTarget",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_now",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_conflate",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_conflationFactor",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_backendFactory",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_rendererKind",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_requestedRenderer",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_gridVert",{enumerable:!0,configurable:!0,writable:!0,value:!0}),Object.defineProperty(this,"_gridHorz",{enumerable:!0,configurable:!0,writable:!0,value:!0}),Object.defineProperty(this,"_canvas",{enumerable:!0,configurable:!0,writable:!0,value:{}}),Object.defineProperty(this,"_statusLine",{enumerable:!0,configurable:!0,writable:!0,value:{}}),Object.defineProperty(this,"_axisChrome",{enumerable:!0,configurable:!0,writable:!0,value:{sessionClock:!1,barCountdown:!1}}),Object.defineProperty(this,"_sessionClockForm",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_wallClock",{enumerable:!0,configurable:!0,writable:!0,value:()=>Date.now()/1e3}),Object.defineProperty(this,"_tradingSettings",{enumerable:!0,configurable:!0,writable:!0,value:{}}),Object.defineProperty(this,"_events",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"_eventMarkers",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_eventPane",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_eventVisible",{enumerable:!0,configurable:!0,writable:!0,value:{}}),Object.defineProperty(this,"_cursorPane",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_cursor",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_dragging",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"_navigation",{enumerable:!0,configurable:!0,writable:!0,value:{mousePan:"both",defaultVisibleBars:0}}),Object.defineProperty(this,"_dragStartX",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_dragStartY",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_lastDragY",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_endedPointers",{enumerable:!0,configurable:!0,writable:!0,value:new Set}),Object.defineProperty(this,"_pointers",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"_pinch",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_pinchPane",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_liveRegion",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_dragStartOffset",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_lastDragX",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_lastDragT",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_dragVelocity",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_kineticHandle",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_kineticEpoch",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_zoomHandle",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_zoomGlide",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_zoomGlideStart",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_zoomGlideApplied",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_animZoom",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_animAutoscale",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_autoscaleTime",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_autoscaleFrames",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_navigationEpoch",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_zoomAnchor",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_doubleClick",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_firstDataId",{enumerable:!0,configurable:!0,writable:!0,value:{value:null}}),Object.defineProperty(this,"_primary",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_indicators",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"_dataContext",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_recomputing",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"_indicatorsDirty",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"_barColorOwner",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_barColors",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_barColorBase",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"_barColorAnchor",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_drawingState",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_maximizedPane",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_legends",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"_firstPaneIndex",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_historyLoader",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_loadingHistory",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"_clickCb",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_crosshairCb",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_pointerMoved",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"_placementMode",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"_legendOffset",{enumerable:!0,configurable:!0,writable:!0,value:{top:6,left:8}}),Object.defineProperty(this,"_downPane",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_downX",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_downLocalY",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_downPressure",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_dragId",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_hoverId",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_hoverOnBase",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"_overlayFrozen",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"_dragCb",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_dragEndCb",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_axisDrag",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_axisDragScale",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_dragMoved",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"_dragFrom",{enumerable:!0,configurable:!0,writable:!0,value:{time:0,price:0}}),Object.defineProperty(this,"_paneResize",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_axisStartCoord",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_axisStartMin",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_axisStartMax",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_axisStartSpacing",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_priceFormatter",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_priceScaleOptions",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_pricePanes",{enumerable:!0,configurable:!0,writable:!0,value:new WeakSet}),Object.defineProperty(this,"_timeFormatter",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_timezone",{enumerable:!0,configurable:!0,writable:!0,value:pe}),Object.defineProperty(this,"_leftAxisWidth",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_rightAxisWidth",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_timeNav",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_timeNavPane",{enumerable:!0,configurable:!0,writable:!0,value:-1}),Object.defineProperty(this,"_branding",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_brandingOptions",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"_brandingPress",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_watermark",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_watermarkOptions",{enumerable:!0,configurable:!0,writable:!0,value:{visible:!1,text:"",color:"#9aa4b2",opacity:.08,fontSize:64}}),Object.defineProperty(this,"_listeners",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"_anchored",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"_onPointerEnter",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this._pointerInside=!0}}),Object.defineProperty(this,"_onContextMenu",{enumerable:!0,configurable:!0,writable:!0,value:e=>{if(e.defaultPrevented)return;const t=this._localPoint(e),i=this._panes[t.pane];if(void 0===i)return;const s=this._listeners.get("contextmenu");if(void 0!==s&&s.size>0)this.emit("contextmenu",this._contextMenuEvent(e,t));else{this._cursor=null,this._cursorPane=null;try{const e=i.top.ctx;e.save(),e.globalCompositeOperation="destination-over",e.drawImage(i.base.element,0,0),e.restore(),this._overlayFrozen=!0}catch{}}}}),Object.defineProperty(this,"_onPointerDown",{enumerable:!0,configurable:!0,writable:!0,value:e=>{if(this._unfreezeOverlay(),("mouse"===e.pointerType||"pen"===e.pointerType)&&0!==e.button)return;this._endedPointers.delete(e.pointerId),this._stopKinetic(),this._stopZoomGlide();const t=this._localPoint(e);this._pointers.set(e.pointerId,{x:t.x,y:t.y,pane:t.pane});try{this._container.setPointerCapture?.(e.pointerId)}catch{}if(this._pointers.size>=2)return void this._beginPinch();this._downPane=t.pane,this._downX=t.x,this._downLocalY=t.localY,this._downPressure=ts(e);const s=this._dividerAt(t.y);if(null!==s){const e=this._paneLayout();return this._paneResize={index:s,startY:t.y,aWeight:this._panes[s].weight,bWeight:this._panes[s+1].weight,aHeight:e[s].height,bHeight:e[s+1].height},void(this._dragging=!1)}const r=Math.max(0,this._width-this._rightAxisWidth),n=this._leftAxisWidth>0&&t.x<this._leftAxisWidth,o=t.x>=r||n,a=t.pane===this._bottomPaneIndex()&&t.localY>=t.paneHeight-this._timeAxisHeight;if(o){this._axisDrag="price",this._axisDragScale=n?this._panes[t.pane].scaleFor("left"):this._panes[t.pane].priceScale,this._axisStartCoord=t.localY;const e=this._axisDragScale.priceRange();return this._axisStartMin=e.min,this._axisStartMax=e.max,void(this._dragging=!1)}if(a)return this._axisDrag="time",this._axisStartCoord=t.x,this._axisStartSpacing=this._timeScale.barSpacing,void(this._dragging=!1);if(null!==this._branding&&this._brandingHit(t.pane,t.x,t.localY))return this._brandingPress={pointerId:e.pointerId,mark:this._branding,moved:!1},this._dragging=!1,void(this._pointerMoved=!1);if(this._placementMode)return this._dragging=!1,void(this._pointerMoved=!1);const l=this._panes[t.pane]?.hitTestPrimitives(t.x-this._leftAxisWidth,t.localY,this._renderContext(t.pane===this._bottomPaneIndex()));if(l&&(!0===l.draggable||"ns-resize"===l.cursor&&null!==this._dragCb))return this._dragId=l.externalId,this._dragMoved=!1,this._ensureScaled(t.pane),this._dragFrom={time:this._xToTime(t.x),price:this._panes[t.pane].yToPrice(t.localY)},this._setHover(l),this._cursor=null,this._cursorPane=null,this.invalidate(e=>e.invalidateGlobal(i.Cursor)),this._dragging=!1,void(this._pointerMoved=!1);this._dragging=!0,this._pointerMoved=!1,this._dragStartX=t.x,this._dragStartY=t.y,this._lastDragY=t.y,this._dragStartOffset=this._timeScale.rightOffset,this._lastDragX=t.x,this._lastDragT=this._now(),this._dragVelocity=0}}),Object.defineProperty(this,"_onPointerMove",{enumerable:!0,configurable:!0,writable:!0,value:e=>{if(this._unfreezeOverlay(),"mouse"===e.pointerType&&!(1&e.buttons)&&(this._dragging||null!==this._dragId||null!==this._axisDrag||null!==this._brandingPress))return null!==this._brandingPress&&(this._brandingPress.moved=!0),this._onPointerUp(e),void this._endedPointers.add(e.pointerId);const t=this._localPoint(e);if(this._pointers.has(e.pointerId)&&this._pointers.set(e.pointerId,{x:t.x,y:t.y,pane:t.pane}),null===this._pinch)if(null===this._brandingPress){if("price"===this._axisDrag){const e=t.localY-this._axisStartCoord,s=Math.exp(.005*e),r=(this._axisStartMin+this._axisStartMax)/2,n=(this._axisStartMax-this._axisStartMin)/2*s,o=this._axisDragScale??this._panes[this._downPane].priceScale;return o.setPriceRange({min:r-n,max:r+n}),o.setAutoScale(!1),void this.invalidate(e=>e.invalidatePane(this._downPane,{level:i.Light,autoScale:!1}))}if(null!==this._paneResize){const e=this._paneResize,s=e.aHeight+e.bHeight,r=e.aWeight+e.bWeight,n=Math.min(24,s/4),o=Math.max(n,Math.min(s-n,e.aHeight+(t.y-e.startY)));return this._panes[e.index].weight=o/s*r,this._panes[e.index+1].weight=r-this._panes[e.index].weight,this._relayout(),void this.invalidate(e=>e.invalidateGlobal(i.Full))}if("time"===this._axisDrag){this._beginAutoscaleMotion();const e=t.x-this._axisStartCoord;return this._timeScale.setBarSpacing(this._axisStartSpacing*Math.exp(.005*-e)),this.invalidate(e=>e.invalidateGlobal(i.Full)),void this._emitViewport("zoom")}if(this._placementMode&&this._pointers.size>0&&(Math.abs(t.x-this._downX)>3||Math.abs(t.localY-this._downLocalY)>3)&&(this._pointerMoved=!0),null!==this._dragId){(Math.abs(t.x-this._downX)>3||Math.abs(t.localY-this._downLocalY)>3)&&(this._dragMoved=!0);const i=this._panes[this._downPane].yToPrice(t.localY),s=this._xToTime(t.x);this._dragCb?.(this._dragId,i,s);const r={id:this._dragId,price:i,time:s,paneIndex:this._downPane,fromPrice:this._dragFrom.price,fromTime:this._dragFrom.time,point:{x:t.x,y:t.localY},samples:this._dragSamples(e),...es(e)};return void this.emit("drag",r)}if(this._dragging){this._beginAutoscaleMotion();const s=t.x-this._dragStartX;(Math.abs(s)>3||Math.abs(t.y-this._dragStartY)>3)&&(this._pointerMoved=!0),this._timeScale.setRightOffset(this._dragStartOffset-s/this._timeScale.barSpacing),"touch"!==e.pointerType&&"both"!==this._navigation.mousePan||this._panes[this._downPane]?.priceScale.panByPixels(t.y-this._lastDragY),this._lastDragY=t.y;const r=this._now(),n=r-this._lastDragT;if(n>0){const e=(t.x-this._lastDragX)/n,i=Math.exp(-n/50);this._dragVelocity=this._dragVelocity*i+e*(1-i)}return this._lastDragX=t.x,this._lastDragT=r,this._maybeLoadHistory(),this.invalidate(e=>e.invalidateGlobal(i.Full)),void this._emitViewport("pan")}this._updateCursor(t.pane,t.x,t.localY,t.y,e)}else(Math.abs(t.x-this._downX)>3||Math.abs(t.localY-this._downLocalY)>3||t.pane!==this._downPane||"mouse"===e.pointerType&&!(1&e.buttons))&&(this._brandingPress.moved=!0);else this._updatePinch()}}),Object.defineProperty(this,"_onPointerUp",{enumerable:!0,configurable:!0,writable:!0,value:e=>{try{this._container.releasePointerCapture?.(e.pointerId)}catch{}if(this._endedPointers.has(e.pointerId))this._endedPointers.delete(e.pointerId);else{if(this._pointers.delete(e.pointerId),this._brandingPress?.pointerId===e.pointerId){const t=this._brandingPress;this._brandingPress=null;const i=this._localPoint(e);if(!t.moved&&t.mark===this._branding&&i.pane===this._downPane&&Math.abs(i.x-this._downX)<=3&&Math.abs(i.localY-this._downLocalY)<=3&&this._brandingHit(i.pane,i.x,i.localY)){const e=t.mark.href();e&&/^https?:\/\//i.test(e)&&this._doc.defaultView?.open(e,"_blank","noopener,noreferrer")}return void this._endedPointers.add(e.pointerId)}if(null===this._pinch){if(null!==this._paneResize)return this._paneResize=null,void this.emit("paneResized",{paneIndex:this._downPane});if(null!==this._axisDrag)return this._axisDrag=null,void(this._axisDragScale=null);if(null!==this._dragId){const t=this._localPoint(e),s=this._panes[this._downPane].yToPrice(t.localY),r=this._xToTime(t.x);this._dragEndCb?.(this._dragId,s,r);const n={id:this._dragId,price:s,time:r,paneIndex:this._downPane,point:{x:t.x,y:t.localY},...es(e)};if(this.emit("drag:end",n),!this._dragMoved){const t=this._dragId;this._clickCb?.(t);const i={id:t,price:s,time:r,paneIndex:this._downPane,point:{x:this._downX,y:this._downLocalY},...this._clickInfo(e)};this.emit("click",i)}this._dragId=null;const o="touch"===e.pointerType?null:this._panes[t.pane]?.hitTestPrimitives(t.x-this._leftAxisWidth,t.localY,this._renderContext(t.pane===this._bottomPaneIndex()))??null;return this._setHover(o),void this.invalidate(e=>e.invalidateGlobal(i.Light))}if(this._dragging=!1,this._placementMode&&this._pointerMoved){const t=this._localPoint(e);this._ensureScaled(this._downPane);const i=this._clickInfo(e),s={id:null,price:this._panes[this._downPane]?.yToPrice(this._downLocalY)??null,time:this._xToTime(this._downX),paneIndex:this._downPane,point:{x:this._downX,y:this._downLocalY},...i};this.emit("click",s);const r={id:null,price:this._panes[this._downPane]?.yToPrice(t.localY)??null,time:this._xToTime(t.x),paneIndex:this._downPane,point:{x:t.x,y:t.localY},viaDrag:!0,...i};return void this.emit("click",r)}if(!this._pointerMoved){const t=this._downPane===this._bottomPaneIndex(),i=this._panes[this._downPane]?.hitTestPrimitives(this._downX-this._leftAxisWidth,this._downLocalY,this._renderContext(t));if(i&&this._handleLegendAction(i.externalId))return;i&&this._clickCb?.(i.externalId),this._ensureScaled(this._downPane);const s={id:i?.externalId??null,price:this._panes[this._downPane]?.yToPrice(this._downLocalY)??null,time:this._xToTime(this._downX),paneIndex:this._downPane,point:{x:this._downX,y:this._downLocalY},...this._clickInfo(e)};return void this.emit("click",s)}qt.shouldAnimate(this._dragVelocity)&&this._startKinetic(this._dragVelocity)}else 0===this._pointers.size&&(this._pinch=null,this._dragging=!1)}}}),Object.defineProperty(this,"_onPointerUpNative",{enumerable:!0,configurable:!0,writable:!0,value:e=>{("mouse"!==e.pointerType&&"pen"!==e.pointerType||0===e.button)&&this._onPointerUp(e)}}),Object.defineProperty(this,"_onPointerCancel",{enumerable:!0,configurable:!0,writable:!0,value:e=>{this._brandingPress?.pointerId===e.pointerId&&(this._brandingPress.moved=!0),this._onPointerUp(e)}}),Object.defineProperty(this,"_onPointerLeave",{enumerable:!0,configurable:!0,writable:!0,value:()=>{if(this._pointerInside=!1,this._feedTimeNav(null),null===this._dragId&&this._setHover(null),null!==this._cursor){this._cursor=null,this._cursorPane=null,this.invalidate(e=>e.invalidateGlobal(i.Cursor));for(const e of this._indicators)e.updateLegendValues();const e={time:null,index:null,price:null,bar:null,point:null,paneIndex:null};this._crosshairCb?.(e),this.emit("crosshair:move",e)}}}),Object.defineProperty(this,"_onWheel",{enumerable:!0,configurable:!0,writable:!0,value:e=>{const t=function(e,t,i){const s=e.deltaMode,r=e.deltaX??0,n=e.deltaY??0;return{x:Number.isFinite(r)?r*(1===s?16:2===s?t:1):0,y:Number.isFinite(n)?n*(1===s?16:2===s?i:1):0}}(e,this._width,this._height);if(0===t.x&&0===t.y)return;this._unfreezeOverlay(),e.preventDefault(),this._stopKinetic();const s=this._localPoint(e),r=this._leftAxisWidth>0&&s.x<this._leftAxisWidth,n=this._rightAxisWidth>0&&s.x>=this._width-this._rightAxisWidth;if(r||n){if(0===t.y)return;this._stopZoomGlide();return this._panes[s.pane].scaleFor(this._axisScaleId(s.pane,r?"left":"right")).scaleAtY(s.localY,Math.exp(-Gt(t.y))),void this.invalidate(e=>e.invalidateGlobal(i.Full))}if(!e.ctrlKey&&!e.metaKey&&(e.shiftKey||Math.abs(t.x)>Math.abs(t.y)))return this._stopZoomGlide(),this._beginAutoscaleMotion(),this._timeScale.scrollByPixels(-(e.shiftKey&&0===t.x?t.y:t.x)),this._maybeLoadHistory(),this.invalidate(e=>e.invalidateGlobal(i.Full)),void this._emitViewport("pan");if(0===t.y)return;const o="right"!==this._zoomAnchor||e.ctrlKey||e.metaKey?Math.max(0,Math.min(this._timeScale.width,s.x-this._leftAxisWidth)):this._timeScale.width,a=null===this._zoomGlide?0:this._zoomGlide.totalLogFactor-this._zoomGlideApplied,l=this._timeScale.barSpacing,h=this._timeScale.constrainBarSpacing(l*Math.exp(a+Gt(t.y))),c=Math.log(h/l);if(this._stopZoomGlide(),0===c)return;if(!this._animZoom||!Vt.shouldAnimate(c))return void this._applyZoom(o,c);const u=c*Vt.leadFraction(),d=this._navigationEpoch;this._applyZoom(o,u),this._destroyed||d!==this._navigationEpoch||this._startZoomGlide(o,c-u)}}),Object.defineProperty(this,"_onDblClick",{enumerable:!0,configurable:!0,writable:!0,value:e=>{const t=this._localPoint(e);if(this._brandingHit(t.pane,t.x,t.localY))return;const i={paneIndex:t.pane,x:t.x,y:t.y,handled:!1};this.emit("dblclick",i),this._placementMode||i.handled||("reset"===this._doubleClick?this.resetScale():"maximize"===this._doubleClick&&this.maximizePane(t.pane))}}),Object.defineProperty(this,"_onKeyDown",{enumerable:!0,configurable:!0,writable:!0,value:e=>{this._unfreezeOverlay();const t=this._shortcuts;if(null===t||ai.shouldIgnore(e.target)||!this._shortcutsActive())return;const s=t.resolve(e);if(null===s)return;let r=this._runShortcut(s);r||(r=t.runCustom(s)),r&&(e.preventDefault(),t.emitTrigger(s),this._maybeLoadHistory(),this.invalidate(e=>e.invalidateGlobal(i.Full)),this._updateAccessibleSummary())}}),Object.defineProperty(this,"_destroyed",{enumerable:!0,configurable:!0,writable:!0,value:!1}),this._timeScale=new v(t.timeScale),this._container=e,this._doc=t.document??e.ownerDocument,this._pixelRatio=t.pixelRatio??is,this._theme=t.theme??_t,this._priceAxisWidth=t.priceAxisWidth??56,this._rightAxisWidth=this._priceAxisWidth,void 0!==t.legendOffset?.top&&(this._legendOffset.top=t.legendOffset.top),void 0!==t.legendOffset?.left&&(this._legendOffset.left=t.legendOffset.left),this._timeAxisHeight=t.timeAxisHeight??22,this._crosshairMode=t.crosshairMode??"normal",Object.assign(this._axisChrome,t.axisChrome),"object"==typeof t.axisChrome?.sessionClock&&(this._sessionClockForm={...t.axisChrome.sessionClock}),void 0!==t.axisChrome?.clock&&(this._wallClock=t.axisChrome.clock);const s=t.shortcuts;this._shortcuts=!1===s?null:s instanceof ai?s:new ai(s??{}),this._now=t.now??(()=>"undefined"!=typeof performance?performance.now():0),this._animZoom=t.animZoom??!0,this._animAutoscale=t.animAutoscale??this._animZoom,this._zoomAnchor=t.zoomAnchor??"cursor",this._doubleClick=t.doubleClick??"reset",this._conflate=t.conflate??!1,this._conflationFactor=t.conflationFactor??1,this._backendFactory=t.renderBackend??lt(t.renderer??"canvas2d"),this._requestedRenderer=void 0===t.renderBackend?t.renderer??"canvas2d":null,this._priceFormatter=t.priceFormatter??null,this._priceScaleOptions=t.priceScale??null,this._timeFormatter=t.timeFormatter,void 0!==t.timezone&&(this._timezone=Ji(t.timezone)),this._gridVert=t.grid?.vertLines??!0,this._gridHorz=t.grid?.horzLines??!0,Object.assign(this._canvas,t.canvas),t.grid&&(this._canvas.grid={...this._canvas.grid,...t.grid}),Object.assign(this._statusLine,t.statusLine);const r=M(this._canvas.margins);void 0===r.marginTop&&void 0===r.marginBottom||(this._priceScaleOptions={...this._priceScaleOptions,...r}),this._patchNavigation(t.navigation??{});const o=t.timeNavigator??!0;!1!==o&&(this._timeNav=new Ei({...!0===o?{}:o,hints:this._navHints(!0===o?void 0:o)},this._now));const a="function"==typeof getComputedStyle?getComputedStyle(e).position:e.style.position;a&&"static"!==a||(e.style.position="relative"),e.style.display="flex",e.style.flexDirection="column",e.style.background=this._theme.background,e.style.touchAction="none",e.getAttribute("role")||e.setAttribute("role","application"),e.setAttribute("aria-label",t.ariaLabel??"Interactive financial chart"),e.hasAttribute("tabindex")||(e.tabIndex=0);const l=this._doc.createElement("div");l.setAttribute("aria-live","polite");const h=l.style;var c;h.position="absolute",h.width="1px",h.height="1px",h.overflow="hidden",h.clip="rect(0 0 0 0)",h.whiteSpace="nowrap",h.border="0",h.padding="0",h.margin="-1px",e.appendChild(l),this._liveRegion=l,this._raf=(c=t.raf)?{schedule:c.schedule,cancel:c.cancel??(()=>{})}:"function"==typeof requestAnimationFrame?{schedule:e=>requestAnimationFrame(e),cancel:e=>cancelAnimationFrame(e)}:{schedule:e=>setTimeout(e,16),cancel:e=>clearTimeout(e)},this._loop=new n(()=>this._onFrame(),this._raf.schedule,this._raf.cancel),this._addPane(),this.setBranding(t.branding??!0),this.setWatermarkOptions(t.watermark??!1),this._observeSize(),this._attachInput(),this._timeScale.setChangeHandler(()=>{this._stopNavigationMotion(),this.invalidate(e=>e.invalidateGlobal(i.Full))}),this.applySize(e.clientWidth,e.clientHeight),this._remeasureHandle=this._raf.schedule(()=>{this._remeasureHandle=null,this._remeasure()}),"function"==typeof queueMicrotask&&queueMicrotask(()=>this.emit("ready",{}))}setHistoryLoader(e){this._historyLoader=e}historyLoadComplete(){this._loadingHistory=!1}get dataLayer(){return this._dataLayer}get timeScale(){return this._timeScale}setVisibleLogicalRange(e){this._stopNavigationMotion();const t=this._timeScale.visibleRange();this._timeScale.setVisibleLogicalRange(e),this._emitViewportIfMoved(t)}getVisibleLogicalRange(){return this._timeScale.visibleRange()}fitContent(){if(this._stopNavigationMotion(),this._dataLayer.length<=0)return;const e=this._timeScale.visibleRange();this._timeScale.fitContent(this._dataLayer.length),this.invalidate(e=>e.invalidateGlobal(i.Full)),this._emitViewportIfMoved(e)}navigationOptions(){return{...this._navigation}}setNavigationOptions(e){const t=this._navigation.defaultVisibleBars;this._patchNavigation(e),t!==this._navigation.defaultVisibleBars&&this.resetScale()}_patchNavigation(e){"horizontal"!==e.mousePan&&"both"!==e.mousePan||(this._navigation.mousePan=e.mousePan);const t=e.defaultVisibleBars;"number"==typeof t&&Number.isFinite(t)&&t>=0&&(this._navigation.defaultVisibleBars=Math.min(1e5,Math.floor(t)))}_fitDefaultView(){const e=this._dataLayer.length;if(e<=0||!(this._timeScale.width>0))return!1;if(this._timeScale.fitContent(e),this._navigation.defaultVisibleBars>0){const t=Math.min(e,this._navigation.defaultVisibleBars);this._timeScale.setBarSpacing(this._timeScale.width/(t+this._timeScale.rightOffset))}return!0}get shortcuts(){return this._shortcuts}get trading(){return null===this._trading&&(this._trading=new fi(this),this._trading.setSettings(this._tradingSettings)),this._trading}hasTrading(){return null!==this._trading}tradingSettings(){if(null!==this._trading)return this._trading.getSettings();const e={...hi};for(const[t,i]of Object.entries(this._tradingSettings))"string"==typeof i&&(e[t.slice(0,-5)]=i);return e}setTradingSettings(e){Object.assign(this._tradingSettings,e),this._trading?.setSettings(e)}addSeries(e,t={}){return this._createSeries(e,t,!0)}_createSeries(e,t,s){const r=this._dataLayer.createSeries(),n=t.paneIndex??0;this._ensurePane(n);const o=function(e,t,i,s="right"){return{dataId:e,type:t,style:{...J(t).defaultStyle,...i},scaleId:s}}(r,e,t.style,t.priceScaleId??"right");s&&J(e).isPriceSeries&&this._claimPricePane(this._panes[n]);const a=s&&null===this._firstDataId.value&&J(e).isPriceSeries;a&&(this._firstDataId.value=r,this._firstPaneIndex=n),this._panes[n].addSeries(o),this._recomputeAxisColumns();const l=this._panes[n],h=l.scaleOf(o);if(t.priceFormat){const e=t.priceFormat;if("custom"===e.type)h.setPriceFormatter(e.formatter);else if("volume"===e.type)h.setPriceFormatter(Qi);else if("percent"===e.type){const t=e.precision??2;h.setPriceFormatter(e=>`${e.toFixed(t)}%`)}else{const t=e.minMove??(void 0!==e.precision?Math.pow(10,-e.precision):void 0);void 0!==t&&h.setOptions({minMove:t})}}void 0!==o.style.precision&&this._applyPrecision(h,o.style.precision);const c={setData:e=>this._setData(r,e.map(Dt)),prependData:e=>this._prependData(r,e.map(Dt)),update:e=>this._updateBar(r,Dt(e)),getData:()=>this._dataLayer.indexedBars(r).map(e=>e.bar),applyOptions:e=>{Object.assign(o.style,e),"precision"in e&&this._applyPrecision(l.scaleOf(o),e.precision),this.invalidate(e=>e.invalidateGlobal(i.Full)),this._primary?.record===o&&this.emit("objects:change",{})},remove:()=>{const e=this._primary?.record===o;l.removeSeries(o),this._dataLayer.removeSeries(r),this._firstDataId.value===r&&(this._firstDataId.value=null),this._primary?.record===o&&(this._primary=null),this._timeScale.setBaseIndex(this._dataLayer.baseIndex),this._recomputeAxisColumns(),this.invalidate(e=>e.invalidateGlobal(i.Full)),e&&this.emit("objects:change",{})},priceScale:()=>l.scaleOf(o),createMarkers:()=>{const e=new Oi(r);return this._addPrimitive(this._panes.indexOf(l),e),e}};return a&&(this._primary={api:c,record:o},this.emit("objects:change",{})),c}primarySeries(){return this._primary?.api??null}primarySeriesInfo(){const e=this._primary;return null===e?null:{type:e.record.type,style:e.record.style}}_applyPrecision(e,t){if(void 0===t||!isFinite(t))return void e.setPriceFormatter(this._priceFormatter);const i=h(Math.round(t),0,8);e.setPriceFormatter(e=>e.toFixed(i))}addPriceLine(e,t=0){const i=new li(e);return this._addPrimitive(t,i),i}addEventMarkers(e=0){const t=new ki;return this._addPrimitive(e,t),t}setEvents(e,t=0){this._events=e,this._eventPane=t,this._syncEvents()}setEventOptions(e){Object.assign(this._eventVisible,e),this._syncEvents()}eventOptions(){return{...this._eventVisible}}_syncEvents(){if(null===this._eventMarkers){if(0===this._events.length)return;this._eventMarkers=new ki,this._addPrimitive(this._eventPane,this._eventMarkers)}const e=this._eventVisible;this._eventMarkers.setEvents(this._events.filter(t=>!1!==e[t.type]))}addIndicator(e,t={},i={}){const s=Tt(e),r=new Wt(this._indicatorHost(),s,this._distinctColors(s,t),i.paneIndex);return this._indicators.push(r),this.emit("objects:change",{}),r}_distinctColors(e,t){const i=this._indicators.filter(t=>t.indicatorId===e.id).length;if(0===i)return t;const s={...t},r=e.plots;for(let e=0;e<r.length;e++){const t=Pt(r[e]).color;void 0===s[t]&&(s[t]=Xi[(i*r.length+e)%Xi.length])}return s}indicators(){return this._flushIndicators(),this._indicators}removeIndicator(e){const t=this._indicators.find(t=>t.id===e);return void 0!==t&&(t.remove(),!0)}_forgetIndicator(e){const t=this._indicators.findIndex(t=>t.id===e);if(t<0)return;const{indicatorId:i,paneIndex:s}=this._indicators[t];this._indicators.splice(t,1),this.emit("indicatorRemoved",{instanceId:e,indicatorId:i,paneIndex:s}),s>0&&0===this._panes[s]?.series().length&&this.removePane(s)}getDataContext(){return this._dataContext}setDataContext(e){this._dataContext?.symbol===e?.symbol&&this._dataContext?.exchange===e?.exchange&&this._dataContext?.interval===e?.interval&&!!this._dataContext==!!e||(this._dataContext=e?Object.freeze({...e}):void 0,this._syncWatermark(),this.emit("data:context",this._dataContext))}setBranding(e){null!==this._branding&&this.removePrimitive(this._branding),this._branding=null,this._brandingOptions=!1!==e&&{position:"bottom-left",margin:14,opacity:1,padding:8,label:"Chart by OpenAlgo",href:"https://openalgo.in",id:"chart-branding",...!0===e?{}:e},!1!==this._brandingOptions&&("object"==typeof this._brandingOptions.padding&&(this._brandingOptions.padding={...this._brandingOptions.padding}),this._branding=new Yi(this._brandingOptions),this.addPrimitive(this._branding,{anchor:"chart-bottom"})),this.invalidate(e=>e.invalidateGlobal(i.Light)),this.emit("branding:changed",this.brandingOptions())}brandingOptions(){const e=this._brandingOptions;return!1!==e&&{...e,..."object"==typeof e.padding?{padding:{...e.padding}}:{}}}setWatermarkOptions(e){const t="boolean"==typeof e?{visible:e}:e;if(null===t||"object"!=typeof t)return;const i=this._watermarkOptions;"boolean"==typeof t.visible&&(i.visible=t.visible);for(const e of["text","color","font","id"])"string"==typeof t[e]&&(i[e]=t[e]);"number"==typeof t.opacity&&Number.isFinite(t.opacity)&&(i.opacity=Math.max(0,Math.min(1,t.opacity))),"number"==typeof t.fontSize&&Number.isFinite(t.fontSize)&&(i.fontSize=Math.max(10,Math.min(200,t.fontSize))),"bottom"!==t.zOrder&&"normal"!==t.zOrder&&"top"!==t.zOrder||(i.zOrder=t.zOrder),this._syncWatermark()}watermarkOptions(){return{...this._watermarkOptions}}_syncWatermark(){const e=this._watermarkOptions;if(!e.visible)return null!==this._watermark&&this.removePrimitive(this._watermark),void(this._watermark=null);const t=e.text?.trim()?e.text:[this._dataContext?.symbol,this._dataContext?.interval].filter(Boolean).join(" ");null===this._watermark?(this._watermark=new Zi({...e,text:t}),this.addPrimitive(this._watermark,{anchor:"chart-top"})):this._watermark.setOptions({...e,text:t}),this.invalidate(e=>e.invalidateGlobal(i.Light))}_indicatorHost(){return{indicatorRemoved:e=>this._forgetIndicator(e),flushIndicators:()=>this._flushIndicators(),formatPrice:(e,t)=>this._panes[e]?.priceScale.format(t),addIndicatorLegend:e=>{const t=0===e.row&&e.paneIndex>0?["hide","settings","up","down","maximize","close"]:["hide","settings","close"],i=new Bi({...e,actions:t});return this._addPrimitive(e.paneIndex,i),i},removeIndicatorLegend:e=>{this.removePrimitive(e),this._restackLegends()},legendRowsOn:e=>this._legends.filter(t=>t.paneIndex===e).length,addIndicatorSeries:(e,t,i,s,r)=>this._createSeries(e,{paneIndex:t,style:i,priceScaleId:s,priceFormat:r},!1),addIndicatorLevel:(e,t)=>{const i={price:e.price,color:e.color,lineWidth:e.lineWidth,dashed:e.dashed,lineStyle:e.lineStyle,leftLabel:e.label,id:e.id};return this.addPriceLine(i,t)},removeIndicatorLevel:e=>this.removePrimitive(e),addIndicatorFill:(e,t)=>this._addPrimitive(t,e),removeIndicatorFill:e=>this.removePrimitive(e),removeIndicatorMarkers:e=>this.removePrimitive(e),addIndicatorPrimitive:(e,t)=>this._addPrimitive(t,e),removeIndicatorPrimitive:e=>this.removePrimitive(e),addIndicatorTable:e=>{const t=new Ri;return this._addPrimitive(e,t),t},removeIndicatorTable:e=>this.removePrimitive(e),sourceBars:()=>null===this._firstDataId.value?[]:this._dataLayer.seriesBars(this._firstDataId.value),nextPaneIndex:()=>this._panes.length,timezone:()=>this._timezone,now:()=>this._wallClock(),symbol:()=>this._dataContext?.symbol,interval:()=>this._dataContext?.interval,dataContext:()=>this._dataContext,subscribeDataChanges:e=>{const t=this.on("data:context",()=>e("context")),i=this.on("data:range",()=>e("range"));return()=>{t(),i()}},tickSize:e=>{const t=this._panes[e]??this._panes[0],i=t?.priceScale.options.minMove??0;return i>0?i:void 0},setBarColors:(e,t)=>this._setBarColors(e,t),emit:(e,t)=>this.emit(e,t),setPaneRange:(e,t)=>{const i=this._panes[e];void 0!==i&&(i.priceScale.setFixedRange(t),null===t&&i.priceScale.setAutoScale(!0))}}}_setBarColors(e,t){if(null===e){if(this._barColorOwner!==t)return;this._barColorOwner=null}else this._barColorOwner=t;this._barColors=e,this._applyBarColors()}_applyBarColors(){const e=this._firstDataId.value;if(null===e)return;const t=this._dataLayer.seriesBars(e),s=t.length,r=this._barColorBase;(s<r.length||r.length>0&&t[0].time!==this._barColorAnchor)&&(r.length=0),0===r.length&&(this._barColorAnchor=s>0?t[0].time:0);for(let e=r.length;e<s;e++)r[e]=t[e].color;const n=this._barColors,o=new Array(s);let a=!1;for(let e=0;e<s;e++){const i=t[e],s=n?.[e]??r[e];s!==i.color?(o[e]={...i,color:s},a=!0):o[e]=i}a&&(this._dataLayer.setSeriesData(e,o),this.invalidate(e=>e.invalidateGlobal(i.Light)))}_invalidateIndicators(){this.emit("data:range",{}),0!==this._indicators.length&&(this._indicatorsDirty=!0,this._loop.requestFrame())}_flushIndicators(){if(this._indicatorsDirty)if(this._recomputing||0===this._indicators.length)this._indicatorsDirty=!1;else{this._indicatorsDirty=!1,this._recomputing=!0;try{for(const e of this._indicators)e.recompute()}finally{this._recomputing=!1}}}subscribeClick(e){this._clickCb=e}subscribeCrosshairMove(e){this._crosshairCb=e}subscribeDrag(e,t){this._dragCb=e,this._dragEndCb=t??null}_ensureScaled(e){const t=this._panes[e];void 0===t||t.readoutScale().scaled||t.autoscale(this._renderContext(e===this._bottomPaneIndex()))}_xToTime(e){return this._dataLayer.indexToTimeFloat(this._timeScale.xToIndex(e-this._leftAxisWidth))}timeToCoordinate(e){return this._timeScale.indexToX(this._dataLayer.timeToIndexFloat(e))+this._leftAxisWidth}coordinateToTime(e){return this._xToTime(e)}on(e,t){let i=this._listeners.get(e);return void 0===i&&(i=new Set,this._listeners.set(e,i)),i.add(t),()=>this.off(e,t)}once(e,t){const i=s=>{this.off(e,i),t(s)};return this.on(e,i)}off(e,t){void 0!==t?this._listeners.get(e)?.delete(t):this._listeners.delete(e)}emit(e,t){const i=this._listeners.get(e);if(void 0!==i)for(const e of[...i])try{e(t)}catch{}}_emitViewport(e){if(void 0===this._listeners.get(e))return;const t=this._timeScale.visibleRange();this.emit(e,{from:this._dataLayer.indexToTime(Math.round(t.from))??null,to:this._dataLayer.indexToTime(Math.round(t.to))??null,logicalFrom:t.from,logicalTo:t.to})}_emitViewportIfMoved(e){const t=this._timeScale.visibleRange();if(t.from===e.from&&t.to===e.to)return;const i=Math.abs(t.to-t.from-(e.to-e.from))>1e-9;this._emitViewport(i?"zoom":"pan")}addPrimitive(e,t=0){"number"!=typeof t?(this._anchored.push({primitive:e,anchor:t.anchor}),this._addPrimitive(this._anchorTarget(t.anchor),e)):this._addPrimitive(t,e)}_anchorTarget(e){return"chart-bottom"===e?this._bottomPaneIndex():this._topPaneIndex()}_rehomeAnchored(){if(0!==this._anchored.length)for(const e of this._anchored){const t=this._anchorTarget(e.anchor),i=this._panes.findIndex(t=>t.hasPrimitive(e.primitive));if(i===t)continue;i>=0&&this._panes[i].removePrimitive(e.primitive);const s=this._legends.findIndex(t=>t.legend===e.primitive);s>=0&&this._legends.splice(s,1),this._addPrimitive(t,e.primitive)}}priceToCoordinate(e,t=0){this._ensureScaled(t);const i=this._panes[t];if(void 0===i)return null;return(this._paneLayout()[t]?.top??0)+i.priceToY(e)}coordinateToPrice(e,t=0){this._ensureScaled(t);const i=this._panes[t];if(void 0===i)return null;const s=this._paneLayout()[t]?.top??0;return i.yToPrice(e-s)}setGridOptions(e){void 0!==e.vertLines&&(this._gridVert=e.vertLines),void 0!==e.horzLines&&(this._gridHorz=e.horzLines),this._canvas.grid={...this._canvas.grid,...e},this.invalidate(e=>e.invalidateGlobal(i.Full))}gridOptions(){return{...this._canvas.grid,vertLines:this._gridVert,horzLines:this._gridHorz}}setCanvasOptions(e){e.grid&&this.setGridOptions(e.grid),e.crosshair&&(this._canvas.crosshair={...this._canvas.crosshair,...e.crosshair}),e.scales&&(this._canvas.scales={...this._canvas.scales,...e.scales}),e.margins&&(this._canvas.margins={...this._canvas.margins,...e.margins},this.setPriceScaleOptions(M(this._canvas.margins),"axes")),this.invalidate(e=>e.invalidateGlobal(i.Full))}canvasOptions(){return{...this._canvas}}setPriceScaleOptions(e,t="primary"){this._priceScaleOptions={...this._priceScaleOptions,...e};for(const i of this._panes){const s="all"===t?i.scales():"axes"===t?i.axisScales():[i.priceScale],r=this._scalePatchFor(i,e);for(const e of s)e.setOptions(r)}this.invalidate(e=>e.invalidateGlobal(i.Full))}_scalePatchFor(e,t){if(void 0===t.minMove||this._pricePanes.has(e))return t;const i={...t};return delete i.minMove,i.minPrecision=2,i}_claimPricePane(e){if(this._pricePanes.has(e))return;this._pricePanes.add(e);const t=this._priceScaleOptions?.minMove;for(const i of e.axisScales())i.setOptions(void 0!==t?{minMove:t,minPrecision:0}:{minPrecision:0})}priceScaleOptions(){return{...this._panes[0].priceScale.options}}setAutoScale(e){for(const t of this._panes)e&&t.setRatioLock("right",!1,0,0),t.priceScale.setAutoScale(e);this.invalidate(e=>e.invalidateGlobal(i.Full))}priceAxisState(e=0,t="right"){const i=this._panes[e];if(void 0===i)return null;const s=i.scaleFor(t),r="left"===t?"left":"right",n="left"===r?"right":"left";return{paneIndex:e,scaleId:t,side:r,active:i.usesScale(t),autoFit:s.autoScale,inverted:s.options.inverted,mode:s.options.mode,scaled:s.scaled,lockRatio:i.ratioLocked(t),movable:""!==t&&i.usesScale(t)&&!i.usesScale(n)}}setPriceAxisOptions(e,t,s){const r=this._panes[e];void 0!==r&&(r.scaleFor(t).setOptions(s),this.invalidate(e=>e.invalidateGlobal(i.Full)))}setPriceAxisAutoFit(e,t,s){const r=this._panes[e];void 0!==r&&(s&&r.setRatioLock(t,!1,0,0),r.scaleFor(t).setAutoScale(s),this.invalidate(e=>e.invalidateGlobal(i.Full)))}setPriceAxisLockRatio(e,t,s){const r=this._panes[e];if(void 0===r)return!1;s&&this._ensureScaledFor(e,t);const n=r.setRatioLock(t,s,this._timeScale.barSpacing,r.scaleFor(t).height);return this.invalidate(e=>e.invalidateGlobal(i.Full)),n}movePriceAxis(e,t,s){const r=this._panes[e];if(void 0===r||!r.moveSeriesScale(t,s))return!1;const n=r.scaleFor(t);return this._priceScaleOptions&&n.setOptions(this._scalePatchFor(r,this._priceScaleOptions)),n.setPriceFormatter(this._priceFormatter),this._recomputeAxisColumns(),this.invalidate(e=>e.invalidateGlobal(i.Full)),this.emit("priceAxisMoved",{paneIndex:e,from:t,to:s}),!0}_ensureScaledFor(e,t){const i=this._panes[e];void 0===i||i.scaleFor(t).scaled||i.autoscale(this._renderContext(e===this._bottomPaneIndex()))}setStatusLineOptions(e){Object.assign(this._statusLine,e);for(const e of this._legends)e.legend.setOptions({statusLine:this._statusLine});this.invalidate(e=>e.invalidateGlobal(i.Full))}statusLineOptions(){return{...this._statusLine}}setAxisChromeOptions(e){void 0!==e.sessionClock&&("object"==typeof e.sessionClock&&(this._sessionClockForm={...e.sessionClock}),this._axisChrome.sessionClock=!0===e.sessionClock?this._sessionClockForm??!0:e.sessionClock),void 0!==e.barCountdown&&(this._axisChrome.barCountdown=e.barCountdown),void 0!==e.clock&&(this._axisChrome.clock=e.clock,this._wallClock=e.clock),this.invalidate(e=>e.invalidateGlobal(i.Full))}axisChromeOptions(){return{...this._axisChrome}}crosshairMode(){return this._crosshairMode}theme(){return this._theme}takeScreenshot(){const e=this._pixelRatio(),t=this._doc.createElement("canvas");t.width=Math.max(1,Math.round(this._width*e)),t.height=Math.max(1,Math.round(this._height*e));const i=t.getContext("2d");if(null===i)return t;i.fillStyle=this._theme.background,i.fillRect(0,0,t.width,t.height);const s=this._paneLayout();for(let t=0;t<this._panes.length;t++){if(this._layoutWeight(t)<=0)continue;const r=Math.round((s[t]?.top??0)*e);for(const e of[this._panes[t].base,this._panes[t].top])e.element.width>0&&e.element.height>0&&i.drawImage(e.element,0,r)}return t}exportSVG(e={}){if(void 0!==e.dpr&&1!==e.dpr)throw new RangeError("exportSVG: dpr must be 1, SVG has no device pixels");const t=Math.max(1,Math.round(e.width??this._width)),s=Math.max(1,Math.round(e.height??this._height)),r=!1!==e.background,n=new xt(t,s,{background:r?this._theme.background:void 0}),o=n.asCanvasContext();this._flushIndicators();const a=this._width,l=this._height,h=t!==a||s!==l;h&&(this._width=t,this._height=s,this._relayout(!0));try{r&&"transparent"!==this._theme.background&&(n.fillStyle=this._theme.background,n.fillRect(0,0,t,s));const e=this._paneLayout(),i=this._topPaneIndex(),a=this._bottomPaneIndex();for(let s=0;s<this._panes.length;s++){if(this._layoutWeight(s)<=0)continue;const l=this._panes[s],h={...this._renderContext(s===a),dpr:1,hoverId:null,dragId:null,paintBackground:r},c=s===i,u=e[s].top+(c?0:1),d=e[s].height-(c?0:1);c||(n.fillStyle=this._theme.paneSeparator,n.fillRect(0,e[s].top,t,1)),n.pushGroup({"data-pane":s},{translate:{x:0,y:u},clip:{x:0,y:0,width:t,height:d}}),l.autoscale(h),l.paintBase(h,o),l.paintTop(null,h,o),n.popGroup()}}finally{h&&(this._width=a,this._height=l,this._relayout(!0),this.invalidate(e=>e.invalidateGlobal(i.Full)))}return n.toString()}_addPrimitive(e,t){this._ensurePane(e);const s={requestUpdate:()=>this.invalidate(s=>s.invalidatePane(e,{level:"top"===t.zOrder()?i.Cursor:i.Light,autoScale:!1}))};if(this._panes[e].addPrimitive(t,s),t instanceof Bi){if(this._legends.push({legend:t,paneIndex:e}),Object.keys(this._statusLine).length>0){const e=t.options().statusLine;t.setOptions({statusLine:{...this._statusLine,...e}})}this._restackLegends()}this.invalidate(t=>t.invalidatePane(e,{level:i.Light,autoScale:!1}))}removePrimitive(e){const t=this._anchored.findIndex(t=>t.primitive===e);t>=0&&this._anchored.splice(t,1);const s=this._legends.findIndex(t=>t.legend===e);s>=0&&this._legends.splice(s,1);for(let t=0;t<this._panes.length;t++)if(this._panes[t].removePrimitive(e))return s>=0&&this._restackLegends(),void this.invalidate(e=>e.invalidatePane(t,{level:i.Light,autoScale:!1}))}_restackLegends(){const e=new Map;for(const t of this._legends){const i=e.get(t.paneIndex)??0;t.legend.setOptions({row:i}),e.set(t.paneIndex,i+1)}this._syncLegendOffsets()}_syncLegendOffsets(){const e=this._paneLayout();for(const t of this._legends){if(!t.legend.options().id.startsWith("indicator:"))continue;const i=(e[t.paneIndex]?.top??Number.POSITIVE_INFINITY)<=12;t.legend.setOptions(i?{top:this._legendOffset.top,left:this._legendOffset.left}:{top:6,left:8})}}tradeHost(e=0){return{addPrimitive:t=>this._addPrimitive(e,t),removePrimitive:e=>this.removePrimitive(e)}}_updateBar(e,t){const s=this._timeScale.rightOffset>=0,r=this._dataLayer.update(e,t);this._timeScale.setBaseIndex(this._dataLayer.baseIndex),"append"!==r||s||this._timeScale.setRightOffset(this._timeScale.rightOffset-1),e===this._firstDataId.value&&this._invalidateIndicators(),this.invalidate(e=>e.invalidateGlobal(i.Full)),this._updateAccessibleSummary()}_ensurePane(e){const t=[];for(;this._panes.length<=e;)this._addPane(0===this._panes.length?1:.32),t.push(this._panes.length-1);if(0!==t.length){this._relayout(),this._rehomeAnchored();for(const e of t)this.emit("paneAdded",{paneIndex:e})}}_setData(e,t){e===this._firstDataId.value&&this._stopNavigationMotion(),this._dataLayer.setSeriesData(e,t),e===this._firstDataId.value&&(this._invalidateIndicators(),this._flushIndicators()),this._timeScale.setBaseIndex(this._dataLayer.baseIndex),!this._hasFitContent&&this._dataLayer.length>0&&(this._timeScale.setWidth(Math.max(0,this._width-this._rightAxisWidth-this._leftAxisWidth)),this._hasFitContent=this._fitDefaultView()),this.invalidate(e=>e.invalidateGlobal(i.Full)),this._updateAccessibleSummary()}_prependData(e,t){this._dataLayer.addBars(e,t),this._timeScale.setBaseIndex(this._dataLayer.baseIndex),e===this._firstDataId.value&&this._invalidateIndicators(),this.invalidate(e=>e.invalidateGlobal(i.Full)),this._updateAccessibleSummary()}get rendererKind(){return this._rendererKind??"canvas2d"}get renderer(){return this.rendererKind}_newBackend(){const e=this._backendFactory()??lt("canvas2d")();if(null===e)throw new Error("openalgo-charts: the canvas2d render backend factory returned null");return null===this._rendererKind&&(this._rendererKind=e.kind,null!==this._requestedRenderer&&"auto"!==this._requestedRenderer&&e.kind!==this._requestedRenderer&&console.warn(`openalgo-charts: render backend "${this._requestedRenderer}" is unavailable on this device; using "${e.kind}"`)),e}_fallbackToCanvas2d(e){const t=this.rendererKind;this._backendFactory=lt("canvas2d");for(const e of this._panes)e.setBackend(this._newBackend());this._rendererKind="canvas2d";const s={from:t,to:"canvas2d",reason:e};this.emit("renderer:fallback",s),this.invalidate(e=>e.invalidateGlobal(i.Full))}_addPane(e=1){const t=new ut(this._doc,this._newBackend());if(t.weight=e,0===this._panes.length)this._pricePanes.add(t);else for(const e of t.scales())e.setOptions({minPrecision:2});return t.priceScale.setPriceFormatter(this._priceFormatter),this._priceScaleOptions&&t.priceScale.setOptions(this._scalePatchFor(t,this._priceScaleOptions)),this._panes.push(t),this._container.appendChild(t.element),t}setPriceFormatter(e){this._priceFormatter=e;for(const t of this._panes)t.priceScale.setPriceFormatter(e);for(const e of this._panes)for(const t of e.series())void 0!==t.style.precision&&this._applyPrecision(e.scaleOf(t),t.style.precision);this.invalidate(e=>e.invalidateGlobal(i.Full))}setTimeFormatter(e){this._timeFormatter=e,this.invalidate(e=>e.invalidateGlobal(i.Full))}timezone(){return this._timezone}setTimezone(e){const t=Ji(e);t!==this._timezone&&(this._timezone=t,this._invalidateIndicators(),this.invalidate(e=>e.invalidateGlobal(i.Full)))}setPlacementMode(e){this._placementMode=e}beginPick(e,t){return vi(this,e,t)}setTheme(e){this._theme=e,this._container.style.background=e.background,this.invalidate(e=>e.invalidateGlobal(i.Full))}applyOptions(e){e.theme&&this.setTheme(e.theme),e.grid&&this.setGridOptions(e.grid),e.canvas&&this.setCanvasOptions(e.canvas),e.statusLine&&this.setStatusLineOptions(e.statusLine),e.priceScale&&this.setPriceScaleOptions(e.priceScale),void 0!==e.priceFormatter&&this.setPriceFormatter(e.priceFormatter),"timeFormatter"in e&&this.setTimeFormatter(e.timeFormatter),void 0!==e.timezone&&this.setTimezone(e.timezone),e.crosshairMode&&(this._crosshairMode=e.crosshairMode)}panes(){return this._panes}getState(){const e=this._panes.map(e=>{const t=e.priceScale,i=t.options,s={weight:e.weight,priceScale:{marginTop:i.marginTop,marginBottom:i.marginBottom,minMove:i.minMove,mode:i.mode,inverted:i.inverted,autoScale:t.autoScale}};return t.autoScale||(s.priceScale.range={...t.priceRange()}),s}),t=[];this._panes.forEach((e,i)=>{for(const s of e.series())t.push({type:s.type,style:{...s.style},paneIndex:i,priceScaleId:s.scaleId})});const i={version:1,timezone:this._timezone,viewport:{...this.getVisibleLogicalRange()},barSpacing:this._timeScale.barSpacing,navigation:this.navigationOptions(),grid:this.gridOptions(),canvas:this.canvasOptions(),statusLine:this.statusLineOptions(),watermark:this.watermarkOptions(),trading:{...this._tradingSettings},axisChrome:{sessionClock:this._axisChrome.sessionClock,barCountdown:this._axisChrome.barCountdown},events:this.eventOptions(),crosshairMode:this._crosshairMode,panes:e,series:t,indicators:this._indicators.map(e=>({indicatorId:e.indicatorId,settings:e.settings(),paneIndex:e.paneIndex,visible:e.visible()}))};return void 0!==this._drawingState&&(i.drawings=this._drawingState),i}restoreState(e){const t=e;if(null===t||"object"!=typeof t||"number"!=typeof t.version)return{applied:!1,series:[],indicators:0,reason:"not a chart state object"};if(t.version>1)return{applied:!1,series:[],indicators:0,reason:`state version ${t.version} is newer than 1`};t.grid&&this.setGridOptions(t.grid),t.canvas&&this.setCanvasOptions(t.canvas),t.statusLine&&this.setStatusLineOptions(t.statusLine),t.watermark&&this.setWatermarkOptions(t.watermark),t.trading&&this.setTradingSettings(t.trading),t.axisChrome&&this.setAxisChromeOptions(t.axisChrome),t.navigation&&"object"==typeof t.navigation&&this._patchNavigation(t.navigation),t.events&&this.setEventOptions(t.events),t.crosshairMode&&(this._crosshairMode=t.crosshairMode),"string"==typeof t.timezone&&ve(t.timezone)&&this.setTimezone(t.timezone),t.panes&&(t.panes.forEach((e,t)=>{this._ensurePane(t),this._panes[t].weight=e.weight}),this._relayout());let s=0;if(t.indicators){for(const e of this._indicators.splice(0))e.remove();const e=new Set;for(const i of t.indicators){if(!Ct(i.indicatorId))continue;const t=Tt(i.indicatorId),r=new Wt(this._indicatorHost(),t,i.settings,i.paneIndex);this._indicators.push(r),!1===i.visible&&r.setVisible(!1),s+=1,i.paneIndex>0&&!e.has(i.paneIndex)&&(e.add(i.paneIndex),this._panes[i.paneIndex]?.priceScale.setFixedRange(t.range?.(i.settings)??null))}}t.panes&&t.panes.forEach((e,t)=>{const i=this._panes[t];if(void 0===i)return;const s=i.priceScale;s.setOptions(this._scalePatchFor(i,{marginTop:e.priceScale.marginTop,marginBottom:e.priceScale.marginBottom,minMove:e.priceScale.minMove,mode:e.priceScale.mode,inverted:e.priceScale.inverted})),s.setAutoScale(e.priceScale.autoScale),!e.priceScale.autoScale&&e.priceScale.range&&s.setPriceRange(e.priceScale.range)});for(let e=this._panes.length-1;e>0;e--)0===this._panes[e].series().length&&this.removePane(e);return this._drawingState=t.drawings,void 0!==t.barSpacing&&this._timeScale.setBarSpacing(t.barSpacing),t.viewport&&this._dataLayer.length>0&&this.setVisibleLogicalRange(t.viewport),this.invalidate(e=>e.invalidateGlobal(i.Full)),this.emit("objects:change",{}),{applied:!0,series:t.series??[],indicators:s}}drawingState(){return this._drawingState}setDrawingState(e){this._drawingState=e,this.emit("objects:change",{})}invalidate(e){null===this._pending&&(this._pending=new s),e(this._pending),this._loop.requestFrame()}_remeasure(){if(0===this._panes.length)return;const e=this._container.clientWidth,t=this._container.clientHeight;e>0&&t>0&&this.applySize(e,t)}applySize(e,t){e===this._width&&t===this._height||(this._width=e,this._height=t,this._relayout(),this._hasFitContent||(this._hasFitContent=this._fitDefaultView()),this.invalidate(e=>e.invalidateGlobal(i.Full)),this.emit("resize",{width:e,height:t}))}_relayout(e=!1){if(e){const e=this._weightTotal(),t=this._bottomPaneIndex();return this._panes.forEach((i,s)=>{const r=this._height*this._layoutWeight(s)/e;i.setLayoutSize(this._width,r),i.setScaleHeights(Math.max(0,r-(s===t?this._timeAxisHeight:0)))}),void this._timeScale.setWidth(Math.max(0,this._width-this._rightAxisWidth-this._leftAxisWidth))}this._syncTimeNavPane(),this._syncLegendOffsets();const t=this._pixelRatio(),i=this._weightTotal(),s=this._topPaneIndex(),r=this._bottomPaneIndex();this._panes.forEach((e,n)=>{const o=this._layoutWeight(n),a=this._height*o/i;e.element.style.display=o>0?"":"none",e.element.style.flex=`0 0 ${a}px`;const l=n===s;e.element.style.borderTopWidth=l?"0px":"1px",e.element.style.borderTopColor=l?"transparent":this._theme.paneSeparator,e.resize(this._width,a,t);const h=n===r;e.setScaleHeights(Math.max(0,a-(h?this._timeAxisHeight:0)))}),this._timeScale.setWidth(Math.max(0,this._width-this._rightAxisWidth-this._leftAxisWidth))}_recomputeAxisColumns(){const e=this._panes.some(e=>e.hasLeftScale()),t=this._panes.some(e=>e.usesScale("right")),s=e?this._priceAxisWidth:0,r=t||!e?this._priceAxisWidth:0;s===this._leftAxisWidth&&r===this._rightAxisWidth||(this._leftAxisWidth=s,this._rightAxisWidth=r,this._relayout(),this.invalidate(e=>e.invalidateGlobal(i.Full)))}_layoutWeight(e){const t=this._panes[e];return void 0===t?0:null===this._maximizedPane?t.weight:e===this._maximizedPane?1:0}_topPaneIndex(){for(let e=0;e<this._panes.length;e++)if(this._layoutWeight(e)>0)return e;return 0}_bottomPaneIndex(){for(let e=this._panes.length-1;e>=0;e--)if(this._layoutWeight(e)>0)return e;return this._panes.length-1}_weightTotal(){let e=0;for(let t=0;t<this._panes.length;t++)e+=this._layoutWeight(t);return e<=0?1:e}_dividerAt(e){const t=this._paneLayout();for(let i=0;i<t.length-1;i++){const s=t[i].top+t[i].height;if(Math.abs(e-s)<=ss.DIVIDER_GRAB)return i}return null}setPaneWeight(e,t){const s=this._panes[e];void 0!==s&&(s.weight=Math.max(.05,t),this._relayout(),this.invalidate(e=>e.invalidateGlobal(i.Full)))}paneWeight(e){return this._panes[e]?.weight??0}removePane(e){if(e<=0||e>=this._panes.length)return!1;for(let t=this._indicators.length-1;t>=0;t--){if(this._indicators[t].paneIndex!==e)continue;const[i]=this._indicators.splice(t,1);i.remove()}const t=this._panes[e];for(const e of[...t.series()])t.removeSeries(e),this._dataLayer.removeSeries(e.dataId),this._firstDataId.value===e.dataId&&(this._firstDataId.value=null);t.destroy(),this._panes.splice(e,1),null!==this._maximizedPane&&(this._maximizedPane===e?this._maximizedPane=null:this._maximizedPane>e&&(this._maximizedPane-=1));for(const t of this._indicators)t.paneIndex>e&&t.shiftPane(-1);return this._timeScale.setBaseIndex(this._dataLayer.baseIndex),this._recomputeAxisColumns(),this._relayout(),this.invalidate(e=>e.invalidateGlobal(i.Full)),this._rehomeAnchored(),this.emit("paneRemoved",{paneIndex:e}),!0}movePane(e,t){const s=e+t;if(e<=0||s<=0||e>=this._panes.length||s>=this._panes.length)return!1;const r=this._panes;[r[e],r[s]]=[r[s],r[e]],this._maximizedPane===e?this._maximizedPane=s:this._maximizedPane===s&&(this._maximizedPane=e);for(const i of this._indicators)i.paneIndex===e?i.shiftPane(t):i.paneIndex===s&&i.shiftPane(-t);for(const e of r)this._container.appendChild(e.element);return this._relayout(),this.invalidate(e=>e.invalidateGlobal(i.Full)),this._rehomeAnchored(),this.emit("paneMoved",{from:e,to:s}),!0}maximizePane(e){return!(e<0||e>=this._panes.length)&&(this._maximizedPane=this._maximizedPane===e?null:e,this._relayout(),this.invalidate(e=>e.invalidateGlobal(i.Full)),this._rehomeAnchored(),this.emit("paneMaximized",{paneIndex:this._maximizedPane}),!0)}maximizedPane(){return this._maximizedPane}_handleLegendAction(e){const t=e.lastIndexOf("::");if(t<0)return!1;const s=e.slice(t+2);if(null!==this._timeNav&&e.startsWith(`${this._timeNav.options().id}::`))return this._runShortcut(s)&&this.invalidate(e=>e.invalidateGlobal(i.Full)),!0;if("row"===s&&!e.startsWith("indicator:"))return!0;if(!e.startsWith("indicator:"))return!1;const r=e.slice(10,t);if("row"===s)return!0;const n=this._indicators.find(e=>e.id===r);if(void 0===n)return!1;const o=n.paneIndex;switch(s){case"close":return this.removeIndicator(r),!0;case"hide":return n.setVisible(!n.visible()),!0;case"up":return this.movePane(o,-1),!0;case"down":return this.movePane(o,1),!0;case"maximize":return this.maximizePane(o),!0;case"settings":return this.emit("indicatorSettings",{instanceId:r,indicatorId:n.indicatorId,paneIndex:o}),!0;default:return!1}}_paneLayout(){const e=this._weightTotal(),t=[];let i=0;for(let s=0;s<this._panes.length;s++){const r=this._height*this._layoutWeight(s)/e;t.push({top:i,height:r}),i+=r}return t}_navHints(e){if(void 0!==e?.hints)return e.hints;if(null===this._shortcuts)return{};const t={};for(const e of this._shortcuts.list()){if("zoomIn"!==e.command&&"zoomOut"!==e.command&&"resetScale"!==e.command)continue;const i=e.combos[0];void 0!==i&&(t[e.command]=rs(i))}return t}_syncTimeNavPane(){if(null===this._timeNav)return;const e=this._bottomPaneIndex();e===this._timeNavPane||e<0||(this._timeNavPane>=0&&this._panes[this._timeNavPane]?.removePrimitive(this._timeNav),this._addPrimitive(e,this._timeNav),this._timeNavPane=e)}_feedTimeNav(e){const t=this._timeNav;null!==t&&(t.setPointer(e),t.animating()&&this.invalidate(e=>e.invalidateGlobal(i.Light)))}_renderContext(e){return{timeScale:this._timeScale,dataLayer:this._dataLayer,dpr:this._pixelRatio(),priceAxisWidth:this._rightAxisWidth,timeAxisHeight:this._timeAxisHeight,showTimeAxis:e,conflate:this._conflate,conflationFactor:this._conflationFactor,theme:this._theme,showVertGrid:this._gridVert,showHorzGrid:this._gridHorz,canvasOptions:this._canvas,timeFormatter:this._timeFormatter,timezone:this._timezone,leftAxisWidth:this._leftAxisWidth,hoverId:this._hoverId,dragId:this._dragId,sessionClock:this._sessionClockOptions(),barCountdown:this._barCountdownOptions()}}_sessionClockOptions(){const e=this._axisChrome.sessionClock;if(void 0!==e&&!1!==e)return{visible:!0,now:this._wallClock,timezone:this._timezone,showOffset:!0===e?void 0:e.showOffset}}_barCountdownOptions(){if(!0!==this._axisChrome.barCountdown)return;const e=this._dataLayer.indexToTime(this._dataLayer.baseIndex);return void 0!==e?{visible:!0,now:this._wallClock,lastBarTime:e,intervalSec:Ye(this._dataLayer)}:void 0}_observeSize(){"undefined"!=typeof ResizeObserver&&(this._resizeObserver=new ResizeObserver(e=>{const t=e[0];t&&this.applySize(t.contentRect.width,t.contentRect.height)}),this._resizeObserver.observe(this._container))}_onFrame(){this._flushIndicators();const e=this._pending;if(this._pending=null,null===e||e.isEmpty())return;const t=e.globalLevel;let s=!1;const r=this._now(),n=null===this._autoscaleTime||++this._autoscaleFrames>=90?1:1-Math.exp(-Math.max(1,r-this._autoscaleTime)/80);null!==this._autoscaleTime&&(this._autoscaleTime=r);for(let r=0;r<this._panes.length;r++){const o=this._panes[r],a=e.paneInvalidation(r),l=Math.max(t,a?.level??i.None),h=r===this._bottomPaneIndex(),c=this._renderContext(h);if((l>=i.Full||a?.autoScale||null!==this._autoscaleTime)&&(s=o.autoscale(c,n)||s),l>=i.Light&&o.paintBase(c),l>=i.Cursor&&!this._overlayFrozen){const e=null===this._cursor?null:{x:this._cursor.x,yLocal:r===this._cursorPane?this._cursor.y:null,showTimeTag:h};o.paintTop(e,c)}}if(s?this.invalidate(e=>e.invalidateGlobal(i.Light)):this._autoscaleTime=null,null!==this._rendererKind&&"canvas2d"!==this._rendererKind)for(const e of this._panes){const t=e.backendDegradation;if(null!==t){this._fallbackToCanvas2d(t);break}}}_attachInput(){if("undefined"==typeof window)return;const e=this._container;e.addEventListener("pointerdown",this._onPointerDown),e.addEventListener("pointermove",this._onPointerMove),e.addEventListener("pointerup",this._onPointerUpNative),e.addEventListener("pointercancel",this._onPointerCancel),e.addEventListener("pointerleave",this._onPointerLeave),e.addEventListener("wheel",this._onWheel,{passive:!1}),e.addEventListener("dblclick",this._onDblClick),e.addEventListener("pointerenter",this._onPointerEnter),e.addEventListener("contextmenu",this._onContextMenu);const t="function"==typeof this._doc.addEventListener?this._doc:e;t.addEventListener("keydown",this._onKeyDown),this._keyTarget=t}_contextMenuEvent(e,t){const i=t.x-this._leftAxisWidth,s=i>=0&&t.x<this._width-this._rightAxisWidth,r=s?Math.round(this._timeScale.xToIndex(i)):null;return s&&this._ensureScaled(t.pane),{paneIndex:t.pane,point:{x:t.x,y:t.y},price:s?this._panes[t.pane].yToPrice(t.localY):null,time:null===r?null:this._dataLayer.indexToTime(r)??null,index:r,target:this._contextTarget(t,i,s,r),preventDefault:()=>e.preventDefault()}}_contextTarget(e,t,i,s){const r=e.pane===this._bottomPaneIndex(),n=e.x>=this._width-this._rightAxisWidth;if(r&&e.localY>=e.paneHeight-this._timeAxisHeight&&!n)return{kind:"time-scale",id:null};if(!i){const t=n?"right":"left";return{kind:"price-scale",id:null,side:t,scaleId:this._axisScaleId(e.pane,t)}}const o=this._panes[e.pane]?.hitTestPrimitives(t,e.localY,this._renderContext(r));if(null!=o){const e=o.externalId;if(e.startsWith("draw:"))return{kind:"drawing",id:e};if(e.startsWith("indicator:")){const t=e.lastIndexOf("::"),i=e.slice(10,t<0?void 0:t);return{kind:"indicator",id:e,instanceId:i}}return e.endsWith("::row")?{kind:"legend",id:e}:{kind:"primitive",id:e}}const a=null===s?null:this._seriesAt(e.pane,s,e.localY);return null===a?{kind:"empty",id:null}:{kind:"series",id:null,seriesType:a}}_axisScaleId(e,t){const i=this._panes[e];return void 0===i||i.usesScale(t)?t:i.usesScale("")?"":t}_seriesAt(e,t,i){const s=this._panes[e];if(void 0===s)return null;for(const e of s.series()){if(!1===e.style.visible)continue;const r=this._dataLayer.visibleBars(e.dataId,t,t);if(0===r.length)continue;const n=J(e.type).extents(r[0].bar,e.style);if(!isFinite(n.min)||!isFinite(n.max))continue;const o=s.scaleOf(e),a=o.priceToY(n.max),l=o.priceToY(n.min);if(i>=Math.min(a,l)-3&&i<=Math.max(a,l)+3)return e.type}return null}_unfreezeOverlay(){this._overlayFrozen&&(this._overlayFrozen=!1,this.invalidate(e=>e.invalidateGlobal(i.Cursor)))}_localPoint(e){const t=this._container.getBoundingClientRect();return this._project(e.clientX-t.left,e.clientY-t.top,this._paneLayout())}_project(e,t,i){let s=0;for(let e=0;e<i.length;e++)t>=i[e].top&&(s=e);const r=i[s]??{top:0,height:this._height};return{x:e,y:t,pane:s,localY:t-r.top,paneHeight:r.height}}_dragSamples(e){const t="function"==typeof e.getCoalescedEvents?e.getCoalescedEvents():[],i=t.length>0?t:[e],s=this._container.getBoundingClientRect(),r=this._paneLayout(),n=[];for(const e of i){const t=this._project(e.clientX-s.left,e.clientY-s.top,r);n.push({x:t.x,y:t.localY,pressure:ts(e)})}return n}_clickInfo(e){const t=es(e);return t.pressure=this._downPressure,{...t,shiftKey:t.modifiers.shift,ctrlKey:t.modifiers.ctrl,metaKey:t.modifiers.meta}}_brandingHit(e,t,i){const s=this._panes[e];if(null===this._branding||!s?.hasPrimitive(this._branding))return!1;const r=e===this._bottomPaneIndex();return null!==this._branding.hitTest(t-this._leftAxisWidth,i,{timeScale:this._timeScale,priceScale:s.priceScale,dataLayer:this._dataLayer,plotWidth:this._width-this._leftAxisWidth-this._rightAxisWidth,plotHeight:(this._paneLayout()[e]?.height??0)-(r?this._timeAxisHeight:0),priceAxisWidth:this._rightAxisWidth,dpr:this._pixelRatio(),theme:this._theme})}_applyZoom(e,t){this._beginAutoscaleMotion(),this._timeScale.zoomAtX(e,Math.exp(t)),this._maybeLoadHistory(),this.invalidate(e=>e.invalidateGlobal(i.Full)),this._emitViewport("zoom")}_startZoomGlide(e,t){const i=new Vt(t);this._zoomGlide=i,this._zoomGlideStart=this._now(),this._zoomGlideApplied=0;let s=0;const r=()=>{if(this._zoomGlide!==i||this._destroyed)return;const t=this._now()-this._zoomGlideStart,n=i.appliedAt(t),o=n-this._zoomGlideApplied;if(this._zoomGlideApplied=n,0!==o&&this._applyZoom(e,o),this._zoomGlide===i&&!this._destroyed)if(!i.finished(t)&&++s<600)this._zoomHandle=this._raf.schedule(r);else{const t=i.totalLogFactor-this._zoomGlideApplied;0!==t&&this._applyZoom(e,t),this._zoomHandle=null,this._zoomGlide=null}};this._zoomHandle=this._raf.schedule(r)}_beginAutoscaleMotion(){this._animAutoscale&&null===this._autoscaleTime&&(this._autoscaleTime=this._now()-16,this._autoscaleFrames=0)}_stopNavigationMotion(){this._navigationEpoch++,this._stopZoomGlide(),this._stopKinetic(),this._autoscaleTime=null}_stopZoomGlide(){null!==this._zoomHandle&&(this._raf.cancel(this._zoomHandle),this._zoomHandle=null),this._zoomGlide=null}resetScale(){this._stopNavigationMotion();const e=this._timeScale.visibleRange();this._hasFitContent=this._fitDefaultView();for(const e of this._panes){e.clearRatioLocks();for(const t of e.scales())t.setAutoScale(!0)}this.invalidate(e=>e.invalidateGlobal(i.Full)),this._emitViewportIfMoved(e)}_beginPinch(){this._brandingPress=null;const e=[...this._pointers.values()];this._pinch=mi(e[0],e[1]),this._pinchPane=e[0].pane,this._dragging=!1,this._axisDrag=null,this._axisDragScale=null,this._dragId=null,this._pointerMoved=!0}_updatePinch(){const e=[...this._pointers.values()];if(e.length<2||null===this._pinch)return;const t=mi(e[0],e[1]),s=function(e,t){return{factor:e.dist>0?t.dist/e.dist:1,dx:t.cx-e.cx,dy:t.cy-e.cy}}(this._pinch,t);this._beginAutoscaleMotion(),1!==s.factor&&this._timeScale.zoomAtX(t.cx,s.factor),this._timeScale.setRightOffset(this._timeScale.rightOffset-s.dx/this._timeScale.barSpacing),this._panes[this._pinchPane]?.priceScale.panByPixels(s.dy),this._pinch=t,this._maybeLoadHistory(),this.invalidate(e=>e.invalidateGlobal(i.Full)),this._emitViewport(1!==s.factor?"zoom":"pan")}_shortcutsActive(){if(null===this._shortcuts)return!1;if("global"===this._shortcuts.scope||this._pointerInside)return!0;const e=this._doc.activeElement;return null!==e&&(e===this._container||!0===this._container.contains?.(e))}_runShortcut(e){const t=this._timeScale,i=e=>{this._stopZoomGlide(),this._beginAutoscaleMotion();const i=t.visibleRange();return t.setRightOffset(t.rightOffset+e),this._emitViewportIfMoved(i),!0},s=e=>{this._stopZoomGlide(),this._beginAutoscaleMotion();const i=t.visibleRange();return t.zoomAtX(this._width/2,e),this._emitViewportIfMoved(i),!0};switch(e){case"panLeftBar":return i(-1);case"panRightBar":return i(1);case"panLeft":return i(-2);case"panRight":return i(2);case"panLeftFast":return i(-10);case"panRightFast":return i(10);case"panUp":return this._panes[0]?.priceScale.panByPixels(20),!0;case"panDown":return this._panes[0]?.priceScale.panByPixels(-20),!0;case"zoomIn":return s(1.1);case"zoomOut":return s(1/1.1);case"resetScale":return this.resetScale(),!0;case"fitContent":return this.fitContent(),!0;case"screenshot":return this.downloadScreenshot(),!0;case"toggleGridVert":return this.setGridOptions({vertLines:!this._gridVert}),!0;case"toggleGridHorz":return this.setGridOptions({horzLines:!this._gridHorz}),!0;case"toggleCrosshairMagnet":return this._crosshairMode="magnet"===this._crosshairMode?"normal":"magnet",!0;default:return!1}}downloadScreenshot(e="chart.png"){try{const t=this.takeScreenshot(),i=this._doc.createElement("a");i.href=t.toDataURL("image/png"),i.download=e,i.click()}catch{}}_updateAccessibleSummary(){if(null===this._liveRegion)return;const e=this._dataLayer.length;let t=`${e} bar${1===e?"":"s"}`;if(null!==this._firstDataId.value&&void 0!==this._panes[0]){const e=this._dataLayer.lastIndexedBar(this._firstDataId.value);null!==e&&(t+=`, latest price ${this._panes[0].priceScale.format(e.bar.close)}`)}this._liveRegion.textContent=`Financial chart, ${t}`}_setHover(e){const t=e?.externalId??null;if(this._container.style.cursor=e?.cursor??"",t===this._hoverId)return;const s=null!==e&&"top"!==e.zOrder,r=s||this._hoverOnBase?i.Light:i.Cursor;this._hoverId=t,this._hoverOnBase=s,this.invalidate(e=>e.invalidateGlobal(r)),this.emit("hover",{id:t})}_updateCursor(e,t,s,r,n){const o=this._width-this._rightAxisWidth,a=t-this._leftAxisWidth,l=Math.max(0,o-this._leftAxisWidth);if(a<0||a>l)return void this._onPointerLeave();const h=this._panes[e],c=h.hitTestPrimitives(a,s,this._renderContext(e===this._bottomPaneIndex()))??null;if(null===c&&null!==this._dividerAt(r))return this._setHover(null),void(this._container.style.cursor="row-resize");this._setHover(c),this._feedTimeNav(e!==this._bottomPaneIndex()||this._brandingHit(e,t,s)?null:{x:a,y:s});let u=s;const d=Math.round(this._timeScale.xToIndex(a));let _=null;if(null!==this._firstDataId.value){const t=this._dataLayer.visibleBars(this._firstDataId.value,d,d);if(t.length>0&&(_=t[0].bar,"magnet"===this._crosshairMode&&e===this._firstPaneIndex)){const e=function(e,t){const i=[t.open,t.high,t.low,t.close];let s=i[0],r=Math.abs(e-s);for(let t=1;t<i.length;t++){const n=Math.abs(e-i[t]);n<r&&(r=n,s=i[t])}return s}(h.yToPrice(s),_);u=h.priceToY(e)}}this._cursorPane=e,this._cursor={x:a,y:u};for(const e of this._indicators)e.updateLegendValues(d);if(this.invalidate(e=>e.invalidateGlobal(i.Cursor)),null!==this._crosshairCb||void 0!==this._listeners.get("crosshair:move")){const i={time:this._dataLayer.indexToTime(d)??null,index:d,price:h.yToPrice(s),bar:_,point:{x:t,y:r},paneIndex:e,pressed:this._pointers.size>0,...es(n),...this._pointers.size>0?{samples:this._dragSamples(n)}:{}};this._crosshairCb?.(i),this.emit("crosshair:move",i)}}_maybeLoadHistory(){if(null===this._historyLoader||this._loadingHistory)return;const e=this._timeScale.visibleRange();e.from<10&&(this._loadingHistory=!0,this.emit("lazy-load",{from:this._dataLayer.indexToTime(Math.round(e.from))??null,to:this._dataLayer.indexToTime(Math.round(e.to))??null,direction:"backward"}),this._historyLoader())}_startKinetic(e){this._stopKinetic();const t=this._kineticEpoch,s=new qt(e);if(s.durationMs<=0)return;const r=this._now();let n=0,o=0;const a=()=>{if(t!==this._kineticEpoch||this._destroyed)return;const e=this._now()-r,l=s.distanceAt(e),h=l-n;n=l,this._beginAutoscaleMotion(),this._timeScale.setRightOffset(this._timeScale.rightOffset-h/this._timeScale.barSpacing),this._maybeLoadHistory(),this.invalidate(e=>e.invalidateGlobal(i.Full)),this._emitViewport("pan"),t!==this._kineticEpoch||this._destroyed||(!s.finished(e)&&++o<600?this._kineticHandle=this._raf.schedule(a):this._kineticHandle=null)};this._kineticHandle=this._raf.schedule(a)}_stopKinetic(){this._kineticEpoch++,null!==this._kineticHandle&&(this._raf.cancel(this._kineticHandle),this._kineticHandle=null)}get isDestroyed(){return this._destroyed}destroy(){if(!this._destroyed){this._loop.stop(),null!==this._remeasureHandle&&(this._raf.cancel(this._remeasureHandle),this._remeasureHandle=null),this._stopNavigationMotion();for(const e of this._indicators.splice(0))e.remove();if(this._resizeObserver?.disconnect(),this._resizeObserver=null,"undefined"!=typeof window){const e=this._container;e.removeEventListener("pointerdown",this._onPointerDown),e.removeEventListener("pointermove",this._onPointerMove),e.removeEventListener("pointerup",this._onPointerUpNative),e.removeEventListener("pointercancel",this._onPointerCancel),e.removeEventListener("pointerleave",this._onPointerLeave),e.removeEventListener("wheel",this._onWheel),e.removeEventListener("dblclick",this._onDblClick),e.removeEventListener("pointerenter",this._onPointerEnter),e.removeEventListener("contextmenu",this._onContextMenu),this._keyTarget?.removeEventListener("keydown",this._onKeyDown),this._keyTarget=null}this._liveRegion?.remove(),this._liveRegion=null,this._container.style.cursor="",this._pointers.clear();for(const e of this._panes)e.destroy();this._panes.length=0,this._destroyed=!0,this.emit("destroy",{}),this._listeners.clear()}}}function rs(e){const t={Equal:"+",Minus:"-",NumpadAdd:"+",NumpadSubtract:"-",ArrowLeft:"<",ArrowRight:">",ArrowUp:"^",ArrowDown:"v"};return e.split("+").map(e=>e.trim()).map(e=>"Mod"===e?"Ctrl":t[e]??e.replace(/^(Key|Digit)/,"")).join(" + ")}Object.defineProperty(ss,"DIVIDER_GRAB",{enumerable:!0,configurable:!0,writable:!0,value:4});const ns=Object.freeze([]),os=(e,t)=>e.length===t.length&&e.every((e,i)=>{const s=t[i];return e.id===s.id&&e.name===s.name&&e.kind===s.kind&&e.paneIndex===s.paneIndex&&e.visible===s.visible&&e.locked===s.locked&&e.selected===s.selected&&e.dataStatus?.state===s.dataStatus?.state&&("error"!==e.dataStatus?.state||"error"===s.dataStatus?.state&&e.dataStatus.error===s.dataStatus.error)&&Object.keys(e.capabilities).every(t=>e.capabilities[t]===s.capabilities[t])});function as(e,t,i,s,r,n){return{input:{key:e,type:"boolean",label:t,default:s,group:i},fields:[{key:e,read:r,write:(e,t)=>n(e,!0===t)}]}}function ls(e,t,i,s,r,n){return{input:{key:e,type:"color",label:t,default:s,group:i},fields:[{key:e,read:r,write:(e,t)=>n(e,String(t))}]}}function hs(e,t,i,s,r,n,o){return{input:{key:e,type:"number",label:t,default:s,min:r.min,max:r.max,step:r.step,group:i},fields:[{key:e,read:n,write:(e,t)=>o(e,Number(t))}]}}function cs(e,t,i,s,r,n,o,a){return{input:{key:e,type:"select",label:t,default:s,options:r,group:i,tooltip:a},fields:[{key:e,read:n,write:(e,t)=>o(e,String(t))}]}}function us(e,t,i,s,r,n){const o={key:e,type:"colorPair",label:t,group:i,up:{key:s.key,label:s.label,default:s.def},down:{key:r.key,label:r.label,default:r.def}},a=[{key:s.key,read:s.get,write:(e,t)=>s.set(e,String(t))},{key:r.key,read:r.get,write:(e,t)=>r.set(e,String(t))}];return void 0!==n&&(o.enabled={key:n.key,default:n.def},a.unshift({key:n.key,read:n.get,write:(e,t)=>n.set(e,!0===t)})),{input:o,fields:a}}const ds=[{label:"Solid",value:"solid"},{label:"Dashed",value:"dashed"},{label:"Dotted",value:"dotted"}],_s=[{label:"Default",value:"default"},...Array.from({length:9},(e,t)=>({label:String(t),value:String(t)}))],bs=e=>e.primarySeriesInfo()?.style??{},ps=(e,t)=>{e.primarySeries()?.applyOptions(t)},fs=(e,t,i)=>ps(e,{[t]:i});function ms(e,t,i,s,r,n){const o=e=>({key:`symbol.${e.key}`,label:e.label,def:e.def,get:t=>bs(t)[e.key]??e.def,set:(t,i)=>fs(t,e.key,i)}),a=void 0===n?void 0:{key:`symbol.${n.key}`,def:!0,get:e=>!1!==bs(e)[n.key],set:(e,t)=>fs(e,n.key,t)};return us(e,t,i,o(s),o(r),a)}const gs=e=>Math.round(1e3*e)/10;const vs=e=>as("symbol.colorByPreviousClose","Color from previous close",e,!1,e=>!0===bs(e).colorByPreviousClose,(e,t)=>ps(e,{colorByPreviousClose:t}));function ys(e){const t=e.theme(),i=e.primarySeriesInfo()?.type,s=[];if(void 0===i)return[];if("candlestick"===i||"hollow-candle"===i||"volume-candle"===i)s.push(ms("symbol.body","Body","Candles",{key:"upColor",label:"Up",def:t.upColor},{key:"downColor",label:"Down",def:t.downColor},{key:"bodyVisible"}),ms("symbol.borders","Borders","Candles",{key:"borderUpColor",label:"Up",def:t.upColor},{key:"borderDownColor",label:"Down",def:t.downColor},{key:"borderVisible"}),ms("symbol.wick","Wick","Candles",{key:"wickUpColor",label:"Up",def:t.wickUpColor},{key:"wickDownColor",label:"Down",def:t.wickDownColor},{key:"wickVisible"}),vs("Candles"));else if("bar"===i||"high-low"===i||"column"===i){const e="column"===i?"Columns":"Bars";s.push(ms("symbol.body","column"===i?"Columns":"Bars",e,{key:"upColor",label:"Up",def:t.upColor},{key:"downColor",label:"Down",def:t.downColor})),"column"!==i&&s.push(vs(e))}else"baseline"===i?s.push(ms("symbol.baseline","Line","Baseline",{key:"topColor",label:"Above",def:t.baselineTopLine},{key:"bottomColor",label:"Below",def:t.baselineBottomLine})):"hlc-area"===i?s.push(ls("symbol.closeColor","Close line","Line",t.lineColor,e=>bs(e).closeColor??t.lineColor,(e,t)=>ps(e,{closeColor:t}))):s.push(ls("symbol.color","Line","Line",t.lineColor,e=>bs(e).color??t.lineColor,(e,t)=>ps(e,{color:t}))),"histogram"!==i&&s.push(hs("symbol.lineWidth","Thickness","Line",1.5,{min:.5,max:8,step:.5},e=>bs(e).lineWidth??1.5,(e,t)=>ps(e,{lineWidth:t}))),"line"!==i&&"line-markers"!==i&&"step"!==i||s.push(cs("symbol.lineStyle","Line style","Line","solid",ds,e=>bs(e).lineStyle??"solid",(e,t)=>ps(e,{lineStyle:t}))),"area"===i?s.push(ms("symbol.fill","Fill","Line",{key:"areaTopColor",label:"Top",def:t.areaTopColor},{key:"areaBottomColor",label:"Bottom",def:t.areaBottomColor})):"baseline"===i?s.push(ms("symbol.fill","Fill","Baseline",{key:"areaTopColor",label:"Above",def:t.baselineTopFill},{key:"areaBottomColor",label:"Below",def:t.baselineBottomFill})):"hlc-area"===i&&s.push(ls("symbol.areaTopColor","Band","Line",t.areaTopColor,e=>bs(e).areaTopColor??t.areaTopColor,(e,t)=>ps(e,{areaTopColor:t})));return[...s,cs("symbol.precision","Precision","Values","default",_s,e=>{const t=bs(e).precision;return void 0===t?"default":String(t)},(e,t)=>ps(e,{precision:"default"===t?void 0:Number(t)})),as("symbol.priceLineVisible","Price line","Values",!0,e=>!1!==bs(e).priceLineVisible,(e,t)=>ps(e,{priceLineVisible:t})),as("symbol.lastValueVisible","Last value label","Values",!0,e=>!1!==bs(e).lastValueVisible,(e,t)=>ps(e,{lastValueVisible:t}))]}const ws=[{label:"Symbol",value:"symbol"},{label:"Description",value:"description"},{label:"Ticker",value:"ticker"}];function xs(e,t,i){return as(`statusLine.${e}`,t,i,!0,t=>!1!==t.statusLineOptions()[e],(t,i)=>t.setStatusLineOptions({[e]:i}))}function Ss(e){const t=e.theme();return[xs("logo","Logo","Show"),xs("title","Title","Show"),cs("statusLine.titleMode","Title shows","Show","symbol",ws,e=>e.statusLineOptions().titleMode??"symbol",(e,t)=>e.setStatusLineOptions({titleMode:t})),xs("marketStatus","Session state","Show"),xs("chartValues","Open, high, low, close","Show"),xs("barChange","Bar change","Show"),xs("volume","Volume","Show"),xs("lastDayChange","Change since previous close","Show"),xs("lastValueLabel","Indicator values","Show"),as("statusLine.background","Background","Background",!1,e=>!0===e.statusLineOptions().background,(e,t)=>e.setStatusLineOptions({background:t})),ls("statusLine.backgroundColor","Color","Background",t.background,e=>e.statusLineOptions().backgroundColor??t.background,(e,t)=>e.setStatusLineOptions({backgroundColor:t})),hs("statusLine.backgroundOpacity","Opacity","Background",.8,{min:0,max:1,step:.05},e=>e.statusLineOptions().backgroundOpacity??.8,(e,t)=>e.setStatusLineOptions({backgroundOpacity:t}))]}const Ps=[{label:"Regular",value:"linear"},{label:"Logarithmic",value:"logarithmic"},{label:"Percent",value:"percentage"},{label:"Indexed to 100",value:"indexed-to-100"}],Os=["UTC","Europe/London","Europe/Berlin","Europe/Moscow","Asia/Dubai","Asia/Kolkata","Asia/Singapore","Asia/Hong_Kong","Asia/Tokyo","Australia/Sydney","America/Sao_Paulo","America/New_York","America/Chicago","America/Los_Angeles"];function Ms(e){const t=e.timezone();return(Os.includes(t)?Os:[...Os,t]).map(e=>({label:e,value:e}))}function ks(e){const t=[cs("navigation.mousePan","Mouse drag","Navigation","both",[{label:"Horizontal only",value:"horizontal"},{label:"Time and price",value:"both"}],e=>e.navigationOptions().mousePan,(e,t)=>e.setNavigationOptions({mousePan:t})),hs("navigation.defaultVisibleBars","Default visible bars (0 = all)","Navigation",0,{min:0,max:1e5,step:1},e=>e.navigationOptions().defaultVisibleBars,(e,t)=>e.setNavigationOptions({defaultVisibleBars:t})),cs("scales.mode","Scale","Price scale","linear",Ps,e=>e.priceScaleOptions().mode,(e,t)=>e.setPriceScaleOptions({mode:t}),"Regular plots the price. Logarithmic gives equal space to equal percentage moves. Percent and Indexed to 100 both rebase to the left edge of the visible range, the first as a change from it, the second as a level starting at 100."),as("scales.autoScale","Auto (fits data to screen)","Price scale",!0,e=>e.panes()[0].priceScale.autoScale,(e,t)=>e.setAutoScale(t)),as("scales.inverted","Invert scale","Price scale",!1,e=>e.priceScaleOptions().inverted,(e,t)=>e.setPriceScaleOptions({inverted:t})),cs("time.timezone","Timezone","Time axis",pe,Ms(e),e=>e.timezone(),(e,t)=>{ve(t)&&e.setTimezone(t)},"The calendar the axis and crosshair label in, and the one every session-anchored study resets on. Changing it moves VWAP and pivot values, not only the labels."),as("axisChrome.sessionClock","Corner clock","Axis chrome",!1,e=>void 0!==e.axisChromeOptions().sessionClock&&!1!==e.axisChromeOptions().sessionClock,(e,t)=>e.setAxisChromeOptions({sessionClock:t}))];return function(e){const t=e.primarySeriesInfo()?.type;return void 0!==t&&J(t).isPriceSeries}(e)&&t.push(as("axisChrome.barCountdown","Countdown to bar close","Axis chrome",!1,e=>!0===e.axisChromeOptions().barCountdown,(e,t)=>e.setAxisChromeOptions({barCountdown:t}))),t}const Ts=[{label:"Cross",value:"normal"},{label:"Magnet",value:"magnet"}];function Cs(e){const t=e.theme(),i=e=>e.gridOptions(),s=e=>e.canvasOptions().crosshair??{},r=e=>e.canvasOptions().scales??{};return[as("watermark.visible","Show watermark","Watermark",!1,e=>e.watermarkOptions().visible??!1,(e,t)=>e.setWatermarkOptions({visible:t})),{input:{key:"watermark.text",type:"text",label:"Text (blank uses symbol and interval)",group:"Watermark",default:""},fields:[{key:"watermark.text",read:e=>e.watermarkOptions().text??"",write:(e,t)=>e.setWatermarkOptions({text:String(t)})}]},ls("watermark.color","Color","Watermark","#9aa4b2",e=>e.watermarkOptions().color??"#9aa4b2",(e,t)=>e.setWatermarkOptions({color:t})),hs("watermark.opacity","Opacity","Watermark",.08,{min:0,max:1,step:.01},e=>e.watermarkOptions().opacity??.08,(e,t)=>e.setWatermarkOptions({opacity:t})),hs("watermark.fontSize","Text size","Watermark",64,{min:10,max:200,step:1},e=>e.watermarkOptions().fontSize??64,(e,t)=>e.setWatermarkOptions({fontSize:t})),as("canvas.grid.vertLines","Vert grid lines","Grid",!0,e=>e.gridOptions().vertLines,(e,t)=>e.setGridOptions({vertLines:t})),ls("canvas.grid.vertColor","Vert color","Grid",t.grid,e=>i(e)?.vertColor??t.grid,(e,t)=>e.setGridOptions({vertColor:t})),cs("canvas.grid.vertStyle","Vert style","Grid",t.gridStyle??"solid",ds,e=>i(e)?.vertStyle??t.gridStyle??"solid",(e,t)=>e.setGridOptions({vertStyle:t})),as("canvas.grid.horzLines","Horz grid lines","Grid",!0,e=>e.gridOptions().horzLines,(e,t)=>e.setGridOptions({horzLines:t})),ls("canvas.grid.horzColor","Horz color","Grid",t.grid,e=>i(e)?.horzColor??t.grid,(e,t)=>e.setGridOptions({horzColor:t})),cs("canvas.grid.horzStyle","Horz style","Grid",t.gridStyle??"solid",ds,e=>i(e)?.horzStyle??t.gridStyle??"solid",(e,t)=>e.setGridOptions({horzStyle:t})),hs("canvas.grid.lineWidth","Width","Grid",1,{min:1,max:4,step:1},e=>i(e)?.lineWidth??1,(e,t)=>e.setGridOptions({lineWidth:t})),hs("canvas.grid.spacing","Spacing","Grid",60,{min:20,max:200,step:10},e=>i(e)?.spacing??60,(e,t)=>e.setGridOptions({spacing:t})),cs("canvas.crosshairMode","Mode","Crosshair","normal",Ts,e=>e.crosshairMode(),(e,t)=>e.applyOptions({crosshairMode:"magnet"===t?"magnet":"normal"})),ls("canvas.crosshair.color","Color","Crosshair",t.crosshair,e=>s(e).color??t.crosshair,(e,t)=>e.setCanvasOptions({crosshair:{color:t}})),cs("canvas.crosshair.style","Style","Crosshair",t.crosshairStyle??"dashed",ds,e=>s(e).style??t.crosshairStyle??"dashed",(e,t)=>e.setCanvasOptions({crosshair:{style:t}})),hs("canvas.crosshair.width","Width","Crosshair",1,{min:1,max:4,step:1},e=>s(e).width??t.crosshairWidth??1,(e,t)=>e.setCanvasOptions({crosshair:{width:t}})),ls("canvas.scales.textColor","Text color","Scale text",t.axisText,e=>r(e).textColor??t.axisText,(e,t)=>e.setCanvasOptions({scales:{textColor:t}})),hs("canvas.scales.fontSize","Text size","Scale text",t.axisFontSize??11,{min:10,max:14,step:1},e=>r(e).fontSize??t.axisFontSize??11,(e,t)=>e.setCanvasOptions({scales:{fontSize:t}})),ls("canvas.scales.lineColor","Lines color","Scale text",t.axisLine,e=>r(e).lineColor??t.axisLine,(e,t)=>e.setCanvasOptions({scales:{lineColor:t}})),hs("canvas.margins.top","Top margin %","Plot margins",10,{min:0,max:49,step:1},e=>gs(e.priceScaleOptions().marginTop),(e,t)=>e.setCanvasOptions({margins:{top:t}})),hs("canvas.margins.bottom","Bottom margin %","Plot margins",10,{min:0,max:49,step:1},e=>gs(e.priceScaleOptions().marginBottom),(e,t)=>e.setCanvasOptions({margins:{bottom:t}}))]}function Is(e){const t=(t,i,s)=>function(e,t,i,s){return{key:`trading.${t}`,label:s,def:e.tradingSettings()[i],get:e=>e.tradingSettings()[i],set:(e,i)=>e.setTradingSettings({[t]:i})}}(e,t,i,s);return[us("trading.positions","Position","Positions",t("longColor","long","Long"),t("shortColor","short","Short")),ls("trading.orderColor","Order","Orders",e.tradingSettings().order,e=>e.tradingSettings().order,(e,t)=>e.setTradingSettings({orderColor:t})),us("trading.bracket","Bracket","Orders",t("tpColor","tp","Take profit"),t("slColor","sl","Stop loss")),us("trading.executions","Execution","Executions",t("buyColor","buy","Buy"),t("sellColor","sell","Sell"))]}function js(e){return[{id:"price",label:"Price",controls:ys(e)},{id:"readout",label:"Readout",controls:Ss(e)},{id:"axes",label:"Axes",controls:ks(e)},{id:"appearance",label:"Appearance",controls:Cs(e)},{id:"trading",label:"Trading",controls:Is(e)}]}const Ls=(e,t)=>{const i=setInterval(e,t);return()=>clearInterval(i)};function As(e,t){let i=0,s=e.length;for(;i<s;){const r=i+s>>1;e[r].time<=t?i=r+1:s=r}return i}function zs(e,t,i,s){const r=e[t];let n=r.high,o=r.low,a=r.volume??0;for(let s=t+1;s<=i;s++){const t=e[s];t.high>n&&(n=t.high),t.low<o&&(o=t.low),a+=t.volume??0}return{time:s,open:r.open,high:n,low:o,close:e[i].close,volume:a}}const Fs={bars:0,matched:0,gaps:0,dropped:0};function Bs(e,t){const i=new Map;for(const e of t){const t=Dt(e);isFinite(t.close)&&i.set(t.time,t)}const s=[];let r=0;for(const t of e){const e=i.get(t.time);void 0!==e?(s.push(e),r++):s.push({time:t.time})}return{items:s,alignment:{bars:s.length,matched:r,gaps:s.length-r,dropped:i.size-r}}}class $s{constructor(e,t={}){Object.defineProperty(this,"_chart",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_mode",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_panes",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"_items",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"_alignedAt",{enumerable:!0,configurable:!0,writable:!0,value:-1}),Object.defineProperty(this,"_realigning",{enumerable:!0,configurable:!0,writable:!0,value:!1}),this._chart=e,this._mode=t.mode??"percentage"}add(e){if(null===this._chart.primarySeries())throw new Error("openalgo-charts: a comparison needs a primary series to align against");const t=e.paneIndex??0,i={...e.style};void 0===i.color&&void 0!==e.color&&(i.color=e.color);const s=this._panes.get(t),r=s?.scaleId??this._scaleIdFor(t),n=this._chart.addSeries(e.type??"line",{paneIndex:t,style:i,priceScaleId:r}),o=s??this._openPane(t,r,n.priceScale());o.count++;const a={series:n,entry:o,bars:e.bars,alignment:Fs,removed:!1},l={symbol:e.symbol,series:n,paneIndex:t,priceScale:()=>o.scale,alignment:()=>a.alignment,setBars:e=>{a.bars=e,a.removed||this._align(a,this._primaryBars())},remove:()=>{this.remove(l)},list:()=>this.list()};return this._items.set(l,a),this._align(a,this._primaryBars()),this._alignedAt=this._chart.dataLayer.length,l}remove(e){const t=this._items.get(e);if(void 0===t||t.removed)return!1;t.removed=!0,this._items.delete(e);const i=t.entry;return--i.count<=0&&this._closePane(i),t.series.remove(),!0}list(){return Array.from(this._items.keys())}clear(){for(const e of this.list())this.remove(e)}setMode(e){if(e!==this._mode){this._mode=e;for(const e of this._panes.values())this._restoreMode(e),this._applyMode(e);this._repaint()}}get mode(){return this._mode}realign(){if(this._realigning)return;this._realigning=!0;const e=this._primaryBars();for(const t of this._items.values())this._align(t,e);this._alignedAt=this._chart.dataLayer.length,this._realigning=!1}sync(){this._chart.dataLayer.length!==this._alignedAt&&this.realign();for(const e of this._panes.values())this._mirror(e)}destroy(){this.clear(),Ns.delete(this._chart)}_scaleIdFor(e){const t=this._chart.panes()[e];return void 0===t?"":t.series().some(e=>""===e.scaleId)?"left":""}_openPane(e,t,i){const s=this._chart.panes()[e].priceScale,r={paneIndex:e,scaleId:t,scale:i,primary:s,savedPrimaryMode:s.options.mode,savedScaleMode:i.options.mode,applied:null,sync:{zOrder:()=>"bottom",draw:()=>{},afterAutoscale:()=>{this.sync()}},count:0};return this._panes.set(e,r),this._applyMode(r),this._chart.addPrimitive(r.sync,e),r}_closePane(e){this._restoreMode(e),this._chart.removePrimitive(e.sync),this._panes.delete(e.paneIndex)}_applyMode(e){"none"!==this._mode&&(e.applied=this._mode,e.primary.setOptions({mode:this._mode}),e.scale.setOptions({mode:this._mode}))}_restoreMode(e){const t=e.applied;null!==t&&(e.applied=null,e.primary.options.mode===t&&e.primary.setOptions({mode:e.savedPrimaryMode}),e.scale.options.mode===t&&e.scale.setOptions({mode:e.savedScaleMode}))}_mirror(e){if(null===e.applied)return;const t=e.primary.baseline,i=e.scale.baseline;if(null===t||null===i||!e.primary.scaled)return;const s=i/t,r=e.primary.priceRange();e.scale.setPriceRange({min:r.min*s,max:r.max*s})}_primaryBars(){return this._chart.primarySeries()?.getData()??[]}_align(e,t){const i=Bs(t,e.bars);e.alignment=i.alignment,e.series.setData(i.items)}_repaint(){for(const e of this._items.values())e.series.applyOptions({})}}const Ns=new WeakMap;function Rs(e,t){let i=Ns.get(e);return void 0===i&&(i=new $s(e,t),Ns.set(e,i)),i}class Ws{constructor(){Object.defineProperty(this,"_index",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_host",{enumerable:!0,configurable:!0,writable:!0,value:null})}attached(e){this._host=e}detached(){this._host=null}zOrder(){return"top"}index(){return this._index}setIndex(e){e!==this._index&&(this._index=e,this._host?.requestUpdate())}draw(e,t){const i=this._index;if(null===i)return;const s=it(t.theme,void 0,t.dpr);st(e,t.timeScale.indexToX(i),null,t.plotWidth,t.plotHeight,t.dpr,B(s.color,.55),s.width,s.dash)}}function Ds(e,t,i="nearest"){if(!Number.isFinite(t)||0===e.length)return null;const s=e.indexToTime(0),r=e.indexToTime(e.length-1);if(void 0===s||void 0===r)return null;if(t<s||t>r)return null;const n=e.timeToIndex(t);if(void 0!==n)return n;if("hide"===i)return null;const o=Math.floor(e.timeToIndexFloat(t));return void 0===e.indexToTime(o)?null:Math.max(0,Math.min(o,e.length-1))}function Es(e,t,i){if(0===e.length||t.length<2)return null;const s=e.indexToTimeFloat(i.from),r=e.indexToTimeFloat(i.to);if(!Number.isFinite(s)||!Number.isFinite(r)||r<=s)return null;const n=t.timeToIndexFloat(s),o=t.timeToIndexFloat(r);return!Number.isFinite(n)||!Number.isFinite(o)||o<=n?null:{from:n,to:o}}const qs={crosshair:!0,viewport:!0,symbol:!1,whenMissing:"nearest"};function Hs(e){return!0!==e.isDestroyed&&e.panes().length>0}class Vs{constructor(e={}){Object.defineProperty(this,"_members",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"_options",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_broadcasting",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"_symbol",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_destroyed",{enumerable:!0,configurable:!0,writable:!0,value:!1}),this._options={...qs,...e}}options(){return{...this._options}}setOptions(e){const t=this._options;if(this._options={...t,...e},t.crosshair&&!this._options.crosshair)for(const e of this._members)this._detachCrosshairs(e);!t.symbol&&this._options.symbol&&this._convergeSymbol()}members(){return this._prune(),this._members.map(e=>e.chart)}has(e){return null!==this._find(e)}symbol(){return this._symbol}crosshairIndex(e){return this._find(e)?.crosshairs[0]?.index()??null}add(e,t={}){if(this._destroyed||!Hs(e))return;const i=this._find(e);if(null!==i)return void 0!==t.symbol&&(i.symbol=t.symbol),void(void 0!==t.onSymbol&&(i.onSymbol=t.onSymbol));const s={chart:e,symbol:t.symbol??null,onSymbol:t.onSymbol??null,unsubscribe:[],crosshairs:[]};s.unsubscribe.push(e.on("crosshair:move",e=>this._onCrosshair(s,e)),e.on("pan",()=>this._onViewport(s)),e.on("zoom",()=>this._onViewport(s)),e.on("symbol",e=>this._onSymbolEvent(s,e)),e.on("destroy",()=>this._prune())),this._members.push(s),null===this._symbol&&null!==s.symbol&&(this._symbol=s.symbol),this._options.symbol&&this._convergeSymbol()}remove(e){const t=this._members.findIndex(t=>t.chart===e);t<0||(this._release(this._members[t]),this._members.splice(t,1))}setSymbol(e,t){const i=this._find(e);null!==i&&this._applySymbol(i,t)}destroy(){this._destroyed=!0;for(const e of this._members)this._release(e);this._members.length=0,this._symbol=null}_onCrosshair(e,t){if(!this._options.crosshair)return;const i=t?.time??null;this._broadcast(e,e=>{const t=null===i?null:Ds(e.chart.dataLayer,i,this._options.whenMissing);this._setCrosshair(e,t)},e=>{this._setCrosshair(e,null)})}_onViewport(e){if(!this._options.viewport)return;if(!Hs(e.chart))return void this._prune();const t=e.chart.getVisibleLogicalRange(),i=e.chart.dataLayer;this._broadcast(e,e=>{const s=Es(i,e.chart.dataLayer,t);null!==s&&e.chart.setVisibleLogicalRange(s)})}_onSymbolEvent(e,t){const i="string"==typeof t?t:t?.symbol;"string"==typeof i&&0!==i.length&&this._applySymbol(e,i)}_applySymbol(e,t){e.symbol=t,this._symbol=t,this._options.symbol&&this._broadcast(e,e=>{e.symbol!==t&&(e.symbol=t,e.onSymbol?.(t,e.chart))})}_convergeSymbol(){const e=this._symbol;null!==e&&this._options.symbol&&this._broadcast(null,t=>{t.symbol!==e&&(t.symbol=e,t.onSymbol?.(e,t.chart))})}_broadcast(e,t,i){if(!this._broadcasting){this._broadcasting=!0;try{this._prune(),null!==e&&this._members.includes(e)&&i?.(e);for(const i of[...this._members])i!==e&&Hs(i.chart)&&t(i)}finally{this._broadcasting=!1}}}_prune(){for(let e=this._members.length-1;e>=0;e--)Hs(this._members[e].chart)||this._members.splice(e,1)}_find(e){return this._members.find(t=>t.chart===e)??null}_release(e){for(const t of e.unsubscribe)t();e.unsubscribe.length=0,this._detachCrosshairs(e)}_setCrosshair(e,t){if(!Hs(e.chart))return;const i=null===t?e.crosshairs.length:e.chart.panes().length;for(;e.crosshairs.length>i;){const t=e.crosshairs.pop();void 0!==t&&e.chart.removePrimitive(t)}for(;e.crosshairs.length<i;){const t=new Ws;e.chart.addPrimitive(t,e.crosshairs.length),e.crosshairs.push(t)}for(const i of e.crosshairs)i.setIndex(t)}_detachCrosshairs(e){if(Hs(e.chart))for(const t of e.crosshairs)e.chart.removePrimitive(t);e.crosshairs.length=0}}const Gs={intervalSec:60,volumeMode:"ltq-sum",lateTickPolicy:"foldIntoBar",sessionAnchorSec:0};class Us{constructor(e={}){Object.defineProperty(this,"_opts",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_current",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_cumAtBarStart",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_lastCum",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_hasCum",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"_streamed",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"_provisional",{enumerable:!0,configurable:!0,writable:!0,value:!1}),this._opts={...Gs,...e}}seed(e,t){this._current={...e},this._hasCum=!1,this._streamed=!1,this._provisional=!1,void 0!==t&&(this._lastCum=t,this._cumAtBarStart=t-(e.volume??0),this._hasCum=!0)}current(){return null===this._current?null:{...this._current}}isProvisional(){return null!==this._current&&this._provisional}reconcile(e){const t=this._current;if(null===t||e.time!==t.time)return null;const i=void 0===t.volume&&void 0===e.volume?void 0:Math.max(t.volume??0,e.volume??0),s={...t,open:this._provisional?e.open:t.open,high:Math.max(t.high,e.high),low:Math.min(t.low,e.low),volume:i};return"day-delta"===this._opts.volumeMode&&this._hasCum&&void 0!==i&&(this._cumAtBarStart=this._lastCum-i),this._current=s,this._provisional=!1,{...s}}bucketStart(e){const t=this._opts.sessionAnchorSec,i=this._opts.intervalSec;return t+Math.floor((e-t)/i)*i}onTick(e){const t=this.bucketStart(e.time);if(null!==this._current&&t<this._current.time)return"dropOlderThanPrevBar"===this._opts.lateTickPolicy?null:(this._foldInto(this._current,e),this._streamed=!0,{bar:{...this._current},isNew:!1,provisional:this._provisional});if(null===this._current||t>this._current.time){const i=null===this._current||!this._streamed,s=this._volumeForNewBar(e),r={time:t,open:e.price,high:e.price,low:e.price,close:e.price,volume:s};return this._current=r,this._streamed=!0,this._provisional=i,{bar:{...r},isNew:!0,provisional:i}}return this._foldInto(this._current,e),this._streamed=!0,{bar:{...this._current},isNew:!1,provisional:this._provisional}}_foldInto(e,t){t.price>e.high&&(e.high=t.price),t.price<e.low&&(e.low=t.price),e.close=t.price,e.volume=this._volumeForSameBar(e,t)}_volumeForNewBar(e){if("ltq-sum"===this._opts.volumeMode)return e.ltq??0;const t=e.cumDayVolume??0;return this._hasCum?t<this._lastCum?this._cumAtBarStart=0:this._cumAtBarStart=this._lastCum:this._cumAtBarStart=t,this._lastCum=t,this._hasCum=!0,Math.max(0,t-this._cumAtBarStart)}_volumeForSameBar(e,t){if("ltq-sum"===this._opts.volumeMode)return(e.volume??0)+(t.ltq??0);const i=t.cumDayVolume??0;return this._hasCum||(this._cumAtBarStart=i-(e.volume??0),this._hasCum=!0),this._lastCum=i,Math.max(0,i-this._cumAtBarStart)}}const Ys=["previousClose","sessionHigh","sessionLow","lastPrice","preMarketOpen","preMarketClose","postMarketOpen","postMarketClose","bid","ask"];const Ks={previousClose:{line:!0,label:!0,lineStyle:"dashed"},sessionHigh:{line:!1,label:!1,lineStyle:"dashed"},sessionLow:{line:!1,label:!1,lineStyle:"dashed"},lastPrice:{line:!1,label:!1,lineStyle:"dashed"},preMarketOpen:{line:!1,label:!1,lineStyle:"dotted"},preMarketClose:{line:!1,label:!1,lineStyle:"dotted"},postMarketOpen:{line:!1,label:!1,lineStyle:"dotted"},postMarketClose:{line:!1,label:!1,lineStyle:"dotted"},bid:{line:!1,label:!1,lineStyle:"dotted"},ask:{line:!1,label:!1,lineStyle:"dotted"}};function Zs(e){return"number"==typeof e&&Number.isFinite(e)?e:null}const Xs=new WeakMap;function Js(e){const t={previousClose:null,sessionHigh:null,sessionLow:null,lastPrice:null,preMarketOpen:null,preMarketClose:null,postMarketOpen:null,postMarketClose:null,bid:null,ask:null},i=e.quote;null!=i&&(t.bid=Zs(i.bid),t.ask=Zs(i.ask));const s=e.bars,r=s.length;if(0===r)return t;t.lastPrice=Zs(s[r-1].close);const n=function(e,t){const i=e.length;if(void 0===t||!Number.isFinite(t))return i-1;if(t>=e[i-1].time)return i-1;if(t<e[0].time)return-1;let s=0,r=i-1;for(;s<r;){const i=s+r+1>>1;e[i].time<=t?s=i:r=i-1}return s}(s,e.anchorTime);if(n<0)return t;const o=function(e,t){const i=e.length;if(0===i)return[];const s=e[0].time,r=e[i-1].time,n=Xs.get(e);if(void 0!==n&&n.len===i&&n.first===s&&n.last===r&&n.zone===t)return n.starts;const o=new Array(i);for(let t=0;t<i;t++)o[t]=e[t].time;const a=ze(o,t),l=[0];for(let e=1;e<i;e++)a[e]&&l.push(e);return Xs.set(e,{len:i,first:s,last:r,zone:t,starts:l}),l}(s,e.timezone??pe),a=function(e,t){let i=0,s=e.length-1;for(;i<s;){const r=i+s+1>>1;e[r]<=t?i=r:s=r-1}return i}(o,n),l=o[a],h=a+1<o.length?o[a+1]-1:r-1;let c=-1/0,u=1/0;for(let e=l;e<=h;e++){const t=s[e];Number.isFinite(t.high)&&t.high>c&&(c=t.high),Number.isFinite(t.low)&&t.low<u&&(u=t.low)}if(c>-1/0&&(t.sessionHigh=c),u<1/0&&(t.sessionLow=u),a>0){const e=o[a-1];for(let i=l-1;i>=e;i--){const e=Zs(s[i].close);if(null!==e){t.previousClose=e;break}}}const d=e.marketPhase;if(null!=d)for(let e=l;e<=h;e++){const i=s[e],r=d(i);if("pre"===r){null===t.preMarketOpen&&(t.preMarketOpen=Zs(i.open));const e=Zs(i.close);null!==e&&(t.preMarketClose=e)}else if("post"===r){null===t.postMarketOpen&&(t.postMarketOpen=Zs(i.open));const e=Zs(i.close);null!==e&&(t.postMarketClose=e)}}return t}function Qs(e,t,i){switch(e){case"sessionHigh":return t.upColor;case"sessionLow":return t.downColor;case"bid":return t.buy;case"ask":return t.sell;case"lastPrice":return i?t.lastPriceUp:t.lastPriceDown;default:return t.crosshair}}function er(e,t){if(t<=0)throw new Error("openalgo-charts: EMA period must be > 0");const i=[];if(0===e.length)return i;const s=2/(t+1);let r=e[0];i.push(r);for(let t=1;t<e.length;t++)r=e[t]*s+r*(1-s),i.push(r);return i}function tr(e,t=14){if(t<=0)throw new Error("openalgo-charts: RSI period must be > 0");const i=e.length,s=new Array(i).fill(NaN);if(i<=t)return s;let r=0,n=0;for(let i=1;i<=t;i++){const t=e[i]-e[i-1];t>=0?r+=t:n-=t}let o=r/t,a=n/t;s[t]=0===a?100:100-100/(1+o/a);for(let r=t+1;r<i;r++){const i=e[r]-e[r-1];o=(o*(t-1)+(i>0?i:0))/t,a=(a*(t-1)+(i<0?-i:0))/t,s[r]=0===a?100:100-100/(1+o/a)}return s}function ir(e,t,i){const s=e.length,r=new Array(s);if(0===s)return r;r[0]=e[0]-t[0];for(let n=1;n<s;n++){const s=e[n]-t[n],o=Math.abs(e[n]-i[n-1]),a=Math.abs(t[n]-i[n-1]);r[n]=Math.max(s,o,a)}return r}function sr(e,t,i,s=14){if(s<=0)throw new Error("openalgo-charts: ATR period must be > 0");const r=ir(e,t,i),n=r.length,o=new Array(n).fill(NaN);if(n<s)return o;let a=0;for(let e=0;e<s;e++)a+=r[e];let l=a/s;o[s-1]=l;for(let e=s;e<n;e++)l=(l*(s-1)+r[e])/s,o[e]=l;return o}function rr(e,t=10,i=3){const s=e.length,r=e.map(()=>({value:NaN,direction:1})),n=e.map(e=>e.high),o=e.map(e=>e.low),a=e.map(e=>e.close),l=sr(n,o,a,t);let h=NaN,c=NaN,u=NaN,d=!1;for(let e=0;e<s;e++){if(!Number.isFinite(l[e]))continue;const t=(n[e]+o[e])/2,s=t+i*l[e],_=t-i*l[e],b=d?s<h||a[e-1]>h?s:h:s,p=d?_>c||a[e-1]<c?_:c:_;let f,m;d&&u!==h?a[e]>=p?(f=p,m=-1):(f=b,m=1):a[e]<=b?(f=b,m=1):(f=p,m=-1),r[e]={value:f,direction:m},h=b,c=p,u=f,d=!0}return r}function nr(e,t){const i=new Error(t);return i.name=e,i}function or(e){if(!Number.isFinite(e)||e<=0)throw new RangeError("History timeout must be positive and finite");return e}function ar(e,t){if(e.signal?.aborted)return Promise.reject(nr("AbortError","History request cancelled"));const i=or(e.timeoutMs??15e3);return new Promise((s,r)=>{const n=new AbortController;let o=!1;const a=(t,i)=>{o||(o=!0,clearTimeout(h),e.signal?.removeEventListener("abort",l),t?s(i):(n.abort(),r(i)))},l=()=>a(!1,nr("AbortError","History request cancelled")),h=setTimeout(()=>a(!1,nr("TimeoutError","History request timed out")),i);e.signal?.addEventListener("abort",l,{once:!0});try{t(n.signal).then(e=>a(!0,e),e=>a(!1,e))}catch(e){a(!1,e)}})}function lr(e){const t=e=>e.map(e=>{if(null===e||"object"!=typeof e)throw new TypeError("Invalid history bar");return{...e}});return Array.isArray(e)?t(e):{...e,bars:t(e.bars)}}class hr{constructor(e,t={}){if(Object.defineProperty(this,"_feed",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_max",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_timeout",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_jobs",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"_active",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_draining",{enumerable:!0,configurable:!0,writable:!0,value:!1}),this._feed=e,this._max=t.maxConcurrent??4,!Number.isInteger(this._max)||this._max<1)throw new RangeError("History concurrency must be a positive integer");this._timeout=or(t.timeoutMs??15e3)}getBars(e,t=0){return this._request(e,!1,t)}getBarsPage(e,t=0){return this._feed.getBarsPage?this._request(e,!0,t):Promise.reject(new Error("This feed does not support history pages"))}_request(e,t,i){if(e.signal?.aborted)return Promise.reject(nr("AbortError","History request cancelled"));if(!Number.isFinite(i))return Promise.reject(new RangeError("History priority must be finite"));let s;try{s=or(e.timeoutMs??this._timeout)}catch(e){return Promise.reject(e)}const r=JSON.stringify([t,e.symbol,e.exchange,e.interval,e.from,e.to,e.countBack,!0===e.noCache,"before"in e?e.before:null]);let n=this._jobs.get(r);n||(n={key:r,req:{...e,signal:void 0,timeoutMs:2147483647},page:t,priority:i,controller:new AbortController,consumers:new Set,running:!1,done:!1},this._jobs.set(r,n));const o=n;o.priority=Math.max(o.priority,i);const a=new Promise((t,i)=>{const r=e=>{o.consumers.delete(l)&&(l.cleanup(),i(e),0===o.consumers.size&&(this._remove(o),o.controller.abort(),this._drain()))},n=()=>r(nr("AbortError","History request cancelled")),a=setTimeout(()=>r(nr("TimeoutError","History request timed out")),s),l={resolve:t,reject:i,cleanup:()=>{clearTimeout(a),e.signal?.removeEventListener("abort",n)}};o.consumers.add(l),e.signal?.addEventListener("abort",n,{once:!0})});return this._drain(),a}_remove(e){e.done||(e.done=!0,this._jobs.get(e.key)===e&&this._jobs.delete(e.key),e.running&&this._active--)}_finish(e,t,i){if(e.done)return;let s;if(t)try{if(e.page===Array.isArray(i))throw new TypeError("Invalid history result shape");s=lr(i)}catch(e){t=!1,i=e}this._remove(e);for(const r of e.consumers)r.cleanup(),t?r.resolve(lr(s)):r.reject(i);e.consumers.clear(),this._drain()}_drain(){if(!this._draining){this._draining=!0;try{for(;this._active<this._max;){let e;for(const t of this._jobs.values())t.running||e&&!(t.priority>e.priority)||(e=t);if(!e)return;const t=e;t.running=!0,this._active++;const i={...t.req,signal:t.controller.signal};try{(t.page?this._feed.getBarsPage(i):this._feed.getBars(i)).then(e=>this._finish(t,!0,e),e=>this._finish(t,!1,e))}catch(e){this._finish(t,!1,e)}}}finally{this._draining=!1}}}}const cr=new WeakMap;function ur(e){let t=cr.get(e);return t||(t=new hr(e),cr.set(e,t)),t}class dr extends Error{constructor(e){super(`openalgo-charts: unknown interval "${e}". Register it with registerInterval() or use a built-in token (1s, 1m, 5m, 1h, D, W).`),Object.defineProperty(this,"code",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.name="UnknownIntervalError",this.code=e}}const _r=/^(\d*)\s*([smhdw])$/i,br={s:1,m:60,h:3600,d:86400,w:604800};const pr=new Map;function fr(e){return e.trim().toLowerCase()}function mr(e){const t=e.trim(),i=pr.get(t.toLowerCase());if(void 0!==i)return i;const s=function(e){if(/^\d*\s*M$/.test(e))return null;const t=_r.exec(e);return null===t?null:{mode:"interval",seconds:(""===t[1]?1:Number(t[1]))*br[t[2].toLowerCase()]}}(t);return null===s?null:{code:t,bucketing:s}}function gr(e){const t=mr(e);if(null===t)throw new dr(e);return t}function vr(e){return"interval"===e.mode||"calendar"===e.mode}const yr={month:1,quarter:3,year:12};function wr(e){return yr[e.unit]*Math.max(1,Math.floor(e.count??1))}function xr(e,t){return e.timezone??t??pe}function Sr(e,t,i){const s=we(t,i),r=wr(e);return Math.floor((12*s.year+(s.month-1))/r)*r}function Pr(e,t){return Te(Math.floor(e/12),e%12+1,1,0,0,0,t)}function Or(e,t,i){if("interval"===e.mode){const i=e.anchorSec??0;return i+Math.floor((t-i)/e.seconds)*e.seconds}if("calendar"!==e.mode)return t;const s=xr(e,i);return Pr(Sr(e,t,s),s)}function Mr(e,t,i){if("interval"===e.mode)return Or(e,t)+e.seconds;if("calendar"!==e.mode)return null;const s=xr(e,i);return Pr(Sr(e,t,s)+wr(e),s)}function kr(e){const t=mr(e)?.bucketing;return void 0!==t&&"interval"===t.mode?t.seconds:0}const Tr={delayMs:2500,retries:2,retryDelayMs:5e3};function Cr(e){return e instanceof Error?e:new Error(String(e??"History request failed"))}function Ir(e,t){if(!Number.isFinite(e)||e<=0)throw new RangeError(`${t} must be positive and finite`);return e}function jr(e){const t=new Map;for(const i of e){if(![i.time,i.open,i.high,i.low,i.close].every(Number.isFinite)||i.high<Math.max(i.open,i.close,i.low)||i.low>Math.min(i.open,i.close)||void 0!==i.volume&&(!Number.isFinite(i.volume)||i.volume<0))throw new Error("History contains an invalid candle");t.set(i.time,{...i})}return[...t.values()].sort((e,t)=>e.time-t.time)}function Lr(...e){return jr(e.flat())}function Ar(e){if("number"==typeof e)return e>1e12?re(e):Math.floor(e);const t=Number(e);if(""!==e.trim()&&!Number.isNaN(t)&&!/[-T :]/.test(e.trim()))return t>1e12?re(t):Math.floor(t);if(/(?:Z|[+-]\d{2}:?\d{2})$/i.test(e.trim())){const t=Date.parse(e.trim().replace(" ","T"));if(Number.isFinite(t))return re(t)}return ne(e)}function zr(e){if("error"===e.status)throw new Error(e.message??"OpenAlgo history request failed");const t=e.data??[],i=[];for(const e of t){const t=e.timestamp??e.time;void 0!==t&&i.push({time:Ar(t),open:e.open,high:e.high,low:e.low,close:e.close,volume:e.volume})}return i.sort((e,t)=>e.time-t.time)}class Fr{constructor(e){Object.defineProperty(this,"_config",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_fetch",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this._config=e;const t=e.fetchImpl??("undefined"!=typeof fetch?fetch.bind(globalThis):void 0);if(void 0===t)throw new Error("openalgo-charts: no fetch available; pass config.fetchImpl");this._fetch=t}async getBars(e){const{from:t,to:i}=e;if(void 0===t||void 0===i)throw new Error("openalgo-charts: getBars requires `from` and `to` (UTC seconds): OpenAlgo history needs a date range");return ar(e,async s=>{const r=await this._fetch(`${this._config.baseUrl}/api/v1/history`,{method:"POST",signal:s,headers:{"Content-Type":"application/json"},body:JSON.stringify({apikey:this._config.apiKey,symbol:e.symbol,exchange:e.exchange,interval:{"1d":"D","1D":"D","1w":"W","1W":"W","1M":"M",MN:"M"}[e.interval]??e.interval,start_date:ce(t),end_date:ce(i)})});if(!r.ok)throw new Error(`openalgo-charts: history request failed (${r.status})`);return zr(await r.json())})}}const Br={LTP:1,Quote:2,Depth:3};function $r(){return JSON.stringify({action:"subscribe_orders"})}function Nr(e,t,i,s){const r={action:"subscribe",symbol:t,exchange:i,mode:Br[e]};return"Depth"===e&&void 0!==s&&(r.depth=s,r.depth_level=s),JSON.stringify(r)}function Rr(e,t,i){return JSON.stringify({action:"unsubscribe",symbol:t,exchange:i,mode:Br[e]})}function Wr(e){if("number"==typeof e)return e>1e12?re(e):Math.floor(e);if("string"==typeof e&&""!==e.trim()){const t=Date.parse(e);if(!Number.isNaN(t))return Math.floor(t/1e3)}return 0}function Dr(e){if("string"!=typeof e)return null;const t=e.split(".");if(2!==t.length)return null;const[i,s]=t;return""===i||""===s?null:{symbol:i,exchange:s}}function Er(e){if("object"!=typeof e||null===e)return null;const t=e,i="string"==typeof t.type?t.type.toLowerCase():"",s="string"==typeof t.status?t.status.toLowerCase():"",r="success"===s||"ok"===s||"authenticated"===s;return"auth"===i||"authenticate"===i||"auth_response"===i?r?"ok":"failed":"error"===i||"error"===s?"failed":""===i&&r&&"string"==typeof t.message&&/auth/i.test(t.message)?"ok":null}function qr(e){if("object"!=typeof e||null===e)return;const t=e,i=e=>{if(void 0!==e)for(const t of["seq","sequence","sequence_number"]){const i=e[t];if("number"==typeof i&&Number.isFinite(i))return i}};return i(t)??i(t.data)}function Hr(e,t,i=Math.random){const s=Math.min(t.maxDelayMs,t.baseDelayMs*2**e);return!1===t.jitter?s:Math.floor(s/2+i()*(s/2))}function Vr(e){if("object"!=typeof e||null===e)return null;const t=e,i=t.data??t,s=Dr(t.topic),r=i.symbol||t.symbol||s?.symbol||"",n=i.exchange||t.exchange||s?.exchange||"";if(i.depth&&(i.depth.buy||i.depth.sell)){const e=(i.depth.buy??[]).map(e=>({price:e.price,qty:e.quantity})),t=(i.depth.sell??[]).map(e=>({price:e.price,qty:e.quantity})),s=i.ltp??i.last_price??e[0]?.price??0,o=Wr(i.timestamp);return{kind:"depth",symbol:r,exchange:n,depth:{bids:e,asks:t,ltp:s,...Number.isFinite(o)&&o>0?{timeSec:o}:{}}}}const o=i.ltp??i.last_price;return"number"==typeof o?{kind:"ltp",event:{symbol:r,exchange:n,ltp:o,ltq:i.last_trade_quantity??i.ltq,volume:i.volume,timeSec:Wr(i.timestamp)}}:null}class Gr{constructor(e){Object.defineProperty(this,"_config",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_factory",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_sock",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_phase",{enumerable:!0,configurable:!0,writable:!0,value:"idle"}),Object.defineProperty(this,"_epoch",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_ltpCbs",{enumerable:!0,configurable:!0,writable:!0,value:new Set}),Object.defineProperty(this,"_depthCbs",{enumerable:!0,configurable:!0,writable:!0,value:new Set}),Object.defineProperty(this,"_stateCbs",{enumerable:!0,configurable:!0,writable:!0,value:new Set}),Object.defineProperty(this,"_controlCbs",{enumerable:!0,configurable:!0,writable:!0,value:new Set}),Object.defineProperty(this,"_orderCbs",{enumerable:!0,configurable:!0,writable:!0,value:new Set}),Object.defineProperty(this,"_ordersSubscribed",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"_subs",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"_seq",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"_userClosed",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"_fatal",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"_everAuthed",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"_attempts",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_reconnectTimer",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_authTimer",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_liveTimer",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_rc",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_auth",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_hbTimeoutMs",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_hbProbeMs",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this._config=e;const t=e.socketFactory??(e=>new WebSocket(e));this._factory=t;const i=e.reconnect??{};this._rc={enabled:i.enabled??!0,baseDelayMs:i.baseDelayMs??1e3,maxDelayMs:i.maxDelayMs??3e4,maxAttempts:i.maxAttempts??1/0,jitter:i.jitter??!0,random:i.random??Math.random};const s=e.auth??{};this._auth={requireAck:s.requireAck??!0,ackTimeoutMs:s.ackTimeoutMs??5e3},this._hbTimeoutMs=e.heartbeat?.timeoutMs??45e3,this._hbProbeMs=e.heartbeat?.probeMs??5e3}connect(){null===this._sock&&(this._userClosed=!1,this._fatal=!1,this._attempts=0,null!==this._reconnectTimer&&(clearTimeout(this._reconnectTimer),this._reconnectTimer=null),this._openSocket())}isReady(){return"ready"===this._phase}_openSocket(){if(null!==this._sock)return;this._phase="connecting",this._emitState("connecting");const e=this._factory(this._config.url),t=++this._epoch;e.onmessage=e=>{t===this._epoch&&this._dispatch(e.data)},e.onopen=()=>{t===this._epoch&&this._onOpen()},e.onclose=()=>{t===this._epoch&&this._onClose()},e.onerror=()=>{t===this._epoch&&this._emitState("error")},this._sock=e,1===e.readyState&&this._onOpen()}onState(e){return this._stateCbs.add(e),()=>this._stateCbs.delete(e)}onControl(e){return this._controlCbs.add(e),()=>this._controlCbs.delete(e)}_emitState(e){for(const t of this._stateCbs)t(e)}_emitControl(e){for(const t of this._controlCbs)t(e)}_warn(e,t){const i={type:"client_warning",code:e,message:t};this._emitControl(i)}_later(e,t){const i=setTimeout(e,t);return i.unref?.(),i}_onOpen(){if("connecting"===this._phase){var e;if(this._phase="authenticating",this._sock?.send((e=this._config.apiKey,JSON.stringify({action:"authenticate",api_key:e}))),!this._auth.requireAck)return this._warn("AUTH_UNACKNOWLEDGED","proceeding without an auth acknowledgement (auth.requireAck is false)"),void this._onAuthenticated();this._authTimer=this._later(()=>this._failConnection("AUTH_TIMEOUT",`no auth acknowledgement within ${this._auth.ackTimeoutMs}ms`),this._auth.ackTimeoutMs)}}_onAuthenticated(){if("authenticating"===this._phase){this._clearTimer("auth"),this._phase="ready",this._attempts=0,this._armLiveness();for(const e of Array.from(this._subs.values()))this._sock?.send(Nr(e.mode,e.symbol,e.exchange,e.depthLevel));this._ordersSubscribed&&this._sock?.send($r()),this._everAuthed&&(this._seq.clear(),this._warn("STREAM_RESYNC","reconnected: ticks were missed and the forming bar is stale, refetch it")),this._everAuthed=!0,this._emitState("open")}}_onAuthFailed(e){const t="object"==typeof e&&null!==e&&"string"==typeof e.message?e.message:"authentication refused";this._fatal=!0,this._warn("AUTH_FAILED",t),this._emitState("error"),this._dropSocket(),this._clearTimer("auth"),this._clearTimer("live"),this._phase="fatal",this._emitState("closed")}_failConnection(e,t){this._warn(e,t),this._emitState("error"),this._dropSocket(),this._clearTimer("auth"),this._clearTimer("live"),this._phase="idle",this._emitState("closed"),this._maybeReconnect()}_onClose(){this._sock=null,this._clearTimer("auth"),this._clearTimer("live"),this._phase=this._userClosed?"closed":"idle",this._emitState("closed"),this._maybeReconnect()}_maybeReconnect(){if(this._userClosed||this._fatal||!this._rc.enabled)return;if(this._attempts>=this._rc.maxAttempts)return void("fatal"!==this._phase&&(this._phase="fatal",this._warn("RECONNECT_ABANDONED",`gave up after ${this._attempts} attempts; call connect() to retry`)));const e=Hr(this._attempts++,this._rc,this._rc.random);this._phase="backoff",this._emitState("reconnecting"),this._reconnectTimer=this._later(()=>{this._reconnectTimer=null,this._sock=null,this._openSocket()},e)}_sendGated(e){"ready"===this._phase&&null!==this._sock&&this._sock.send(e)}_armLiveness(){this._hbTimeoutMs<=0||"ready"!==this._phase||(this._clearTimer("live"),this._liveTimer=this._later(()=>this._probeLiveness(),this._hbTimeoutMs))}_probeLiveness(){"ready"===this._phase&&null!==this._sock&&(this._sock.send(JSON.stringify({action:"ping"})),this._liveTimer=this._later(()=>this._failConnection("HEARTBEAT_DEAD",`no answer to a liveness ping within ${this._hbProbeMs}ms`),this._hbProbeMs))}_clearTimer(e){const t="auth"===e?this._authTimer:"live"===e?this._liveTimer:this._reconnectTimer;null!==t&&clearTimeout(t),"auth"===e?this._authTimer=null:"live"===e?this._liveTimer=null:this._reconnectTimer=null}_dropSocket(){const e=this._sock;if(this._sock=null,this._epoch++,null!==e)try{e.close()}catch{}}onLtp(e){return this._ltpCbs.add(e),()=>this._ltpCbs.delete(e)}onDepth(e){return this._depthCbs.add(e),()=>this._depthCbs.delete(e)}subscribe(e,t,i,s){this._subs.set(`${e}:${t}:${i}`,{mode:e,symbol:t,exchange:i,depthLevel:s}),this._sendGated(Nr(e,t,i,s))}unsubscribe(e,t,i){this._subs.delete(`${e}:${t}:${i}`),this._sendGated(Rr(e,t,i))}onOrderUpdate(e){return this._orderCbs.add(e),()=>this._orderCbs.delete(e)}subscribeOrders(){this._ordersSubscribed=!0,this._sendGated($r())}unsubscribeOrders(){this._ordersSubscribed=!1,this._sendGated(JSON.stringify({action:"unsubscribe_orders"}))}close(){this._userClosed=!0,this._clearTimer("reconnect"),this._clearTimer("auth"),this._clearTimer("live"),this._dropSocket(),this._subs.clear(),this._ordersSubscribed=!1,this._seq.clear(),this._attempts=0,this._everAuthed=!1,this._fatal=!1,this._phase="closed",this._emitState("closed")}_sequenceOk(e,t){const i=qr(t);if(void 0===i)return!0;const s=this._seq.get(e);return!(void 0!==s&&i<=s)&&(void 0!==s&&i>s+1&&this._warn("SEQUENCE_GAP",`${e}: ${i-s-1} frame(s) missing, the forming bar is suspect`),this._seq.set(e,i),!0)}_dispatch(e){let t;try{t=JSON.parse(e)}catch{t=e}if(this._armLiveness(),function(e){return"ping"===e||"object"==typeof e&&null!==e&&"ping"===e.type}(t))return void this._sock?.send(JSON.stringify({action:"pong"}));if("authenticating"===this._phase){const e=Er(t);if(null!==e)return this._emitControl(t),void("ok"===e?this._onAuthenticated():this._onAuthFailed(t))}const i=function(e){if("object"!=typeof e||null===e)return null;const t=e;if("order_update"!==t.type)return null;const i=e=>{if("number"==typeof e)return e;if("string"==typeof e&&""!==e.trim()){const t=Number(e);return Number.isNaN(t)?0:t}return 0},s=e=>"string"==typeof e?e:"",r=i(t.trigger_price);return{orderId:s(t.orderid),symbol:s(t.symbol),exchange:s(t.exchange),action:"SELL"===t.action?"SELL":"BUY",quantity:i(t.quantity),price:i(t.price),triggerPrice:r>0?r:void 0,pricetype:""===s(t.pricetype)?"LIMIT":s(t.pricetype),product:s(t.product),status:s(t.order_status).toLowerCase(),filledQuantity:i(t.filled_quantity),pendingQuantity:i(t.pending_quantity),averagePrice:i(t.average_price),rejectionReason:s(t.rejection_reason),mode:s(t.mode)}}(t);if(null!==i){if(!this._sequenceOk("orders",t))return;for(const e of this._orderCbs)e(i);return}const s=Vr(t);if(null===s)return void("object"==typeof t&&null!==t&&this._emitControl(t));const r=t.topic;if("ltp"===s.kind){if(!this._sequenceOk(r??`ltp:${s.event.symbol}.${s.event.exchange}`,t))return;for(const e of this._ltpCbs)e(s.event)}else{if(!this._sequenceOk(r??`depth:${s.symbol}.${s.exchange}`,t))return;for(const e of this._depthCbs)e(s.symbol,s.exchange,s.depth)}}}function Ur(e,t){if(!Number.isFinite(e))return{ok:!1,code:"QTY_INVALID",reason:"quantity must be a finite number"};if(e<=0)return{ok:!1,code:"QTY_INVALID",reason:"quantity must be positive"};const i=t.lotSize??(!0===t.allowFractionalQty?void 0:1);return void 0!==i&&function(e,t){if(!Number.isFinite(t)||t<=0)return!1;const i=e/t;return Math.abs(i-Math.round(i))>1e-6*Math.max(1,Math.abs(i))}(e,i)?{ok:!1,code:"QTY_STEP",reason:void 0!==t.lotSize?`quantity ${e} is not a multiple of lot size ${t.lotSize}`:`quantity ${e} must be a whole number`}:void 0!==t.freezeQty&&e>t.freezeQty?{ok:!1,code:"QTY_FREEZE_LIMIT",reason:`quantity ${e} exceeds freeze limit ${t.freezeQty}`}:{ok:!0}}function Yr(e){return Object.assign(new Error(e),{preflight:!0})}function Kr(e){const t="number"==typeof e?e:"string"==typeof e&&""!==e.trim()?Number(e):NaN;return Number.isFinite(t)?t:void 0}function Zr(e){return"string"==typeof e&&""!==e.trim()?e.trim():void 0}const Xr="a non-empty string",Jr="a finite number",Qr="a number of 0 or more";function en(e,t,i,s){return{ok:!1,issue:{path:e,code:t,expected:i,got:("string"==typeof s?s:String(s)).slice(0,64)}}}const tn={open:"working",pending:"pending",trigger_pending:"working","trigger pending":"working",complete:"filled",cancelled:"cancelled",rejected:"rejected"};function sn(e,t="order"){const i=Zr(e.orderid);if(void 0===i)return en(`${t}.orderid`,"MISSING",Xr,e.orderid);const s=Zr(e.symbol);if(void 0===s)return en(`${t}.symbol`,"MISSING",Xr,e.symbol);const r=Zr(e.action)?.toUpperCase();if("BUY"!==r&&"SELL"!==r)return en(`${t}.action`,"UNKNOWN_ENUM","BUY or SELL",e.action);const n=Zr(e.pricetype)?.toUpperCase();if("MARKET"!==n&&"LIMIT"!==n&&"SL"!==n&&"SL-M"!==n)return en(`${t}.pricetype`,"UNKNOWN_ENUM","MARKET, LIMIT, SL or SL-M",e.pricetype);const o=Kr(e.quantity);if(void 0===o)return en(`${t}.quantity`,void 0===e.quantity?"MISSING":"NON_FINITE",Jr,e.quantity);if(o<0)return en(`${t}.quantity`,"RANGE",Qr,e.quantity);const a=void 0===e.filled_quantity?0:Kr(e.filled_quantity);if(void 0===a)return en(`${t}.filled_quantity`,"NON_FINITE",Jr,e.filled_quantity);const l=void 0===e.price?0:Kr(e.price);if(void 0===l)return en(`${t}.price`,"NON_FINITE",Jr,e.price);if(l<0)return en(`${t}.price`,"RANGE",Qr,e.price);const h=void 0===e.trigger_price?0:Kr(e.trigger_price);if(void 0===h)return en(`${t}.trigger_price`,"NON_FINITE",Jr,e.trigger_price);const c=Zr(e.order_status)??"",u=tn[c.toLowerCase()],d={id:i,symbol:s,side:r,type:n,qty:o,filledQty:a,price:l,triggerPrice:h>0?h:void 0,status:u??"unknown"};return void 0===u&&(d.rawStatus=c),{ok:!0,order:d}}function rn(e){return{symbol:e.symbol??"",netQty:Kr(e.quantity)??0,avgPrice:Kr(e.average_price)??0}}function nn(e){if("object"!=typeof e||null===e)return;const t=e,i=t.mode??t.data?.mode;if("analyze"===i)return"analyzer";if("live"===i)return"live";const s=t.data?.analyze_mode;return"boolean"==typeof s?s?"analyzer":"live":void 0}class on{constructor(e,t={}){Object.defineProperty(this,"_tf",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_zone",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_cur",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_count",{enumerable:!0,configurable:!0,writable:!0,value:0}),this._tf=e,this._zone=t.timezone}current(){return null===this._cur?null:{...this._cur}}seed(e){vr(this._tf)&&(this._cur={...e},this._count=0)}onTick(e){const t=null===this._cur;let i=t;if(t||null===this._cur||(i="interval"===this._tf.mode||"calendar"===this._tf.mode?Or(this._tf,e.time,this._zone)!==this._cur.time:"ticks"===this._tf.mode?this._count>=this._tf.count:(this._cur.volume??0)>=this._tf.perBar),i){const t=Or(this._tf,e.time,this._zone);return this._cur={time:t,open:e.price,high:e.price,low:e.price,close:e.price,volume:e.qty},this._count=1,{bar:{...this._cur},isNew:!0}}const s=this._cur;return e.price>s.high&&(s.high=e.price),e.price<s.low&&(s.low=e.price),s.close=e.price,s.volume=(s.volume??0)+e.qty,this._count+=1,{bar:{...s},isNew:!1}}}class an{constructor(e){Object.defineProperty(this,"_rest",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_ws",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_volumeMode",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_timezone",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_depthLevel",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_tickMode",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_subs",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),this._rest=new Fr(e),this._ws=new Gr({url:e.wsUrl,apiKey:e.apiKey,socketFactory:e.socketFactory,reconnect:e.reconnect,auth:e.auth,heartbeat:e.heartbeat}),this._volumeMode=e.volumeMode??"ltq-sum",this._timezone=e.timezone,this._depthLevel=e.depthLevel,this._tickMode="day-delta"===this._volumeMode?"Quote":"LTP",this._ws.connect()}_acquire(e,t,i,s){const r=`${e}:${t}:${i}`,n=this._subs.get(r);void 0===n?(this._subs.set(r,{count:1,level:s}),this._ws.subscribe(e,t,i,s)):(n.count+=1,void 0!==s&&(void 0===n.level||s>n.level)&&(n.level=s,this._ws.subscribe(e,t,i,s)));let o=!1;return()=>{if(o)return;o=!0;const s=this._subs.get(r);void 0!==s&&(s.count-=1,s.count>0||(this._subs.delete(r),this._ws.unsubscribe(e,t,i)))}}getBars(e){return this._rest.getBars(e)}subscribeBars(e,t,i){const{bucketing:s}=gr(e.interval),r="interval"===s.mode?this._candleReader(s,t,i):this._aggregatorReader(s,t,i),n=this._ws.onLtp(t=>{t.symbol===e.symbol&&(t.exchange&&e.exchange&&t.exchange!==e.exchange||r(t))}),o=i?.onResync?this._ws.onControl(e=>{"client_warning"===e.type&&"STREAM_RESYNC"===e.code&&i.onResync?.()}):void 0,a=this._acquire(this._tickMode,e.symbol,e.exchange);return()=>{n(),o?.(),a()}}static _tickTime(e){return e.timeSec&&e.timeSec>0?e.timeSec:Math.floor(Date.now()/1e3)}_candleReader(e,t,i){const s=new Us({intervalSec:e.seconds,sessionAnchorSec:e.anchorSec??0,volumeMode:this._volumeMode});return i?.seedFrom&&s.seed(i.seedFrom,i.cumDayVolumeSoFar),e=>{const i=s.onTick({time:an._tickTime(e),price:e.ltp,ltq:e.ltq,cumDayVolume:e.volume});null!==i&&t(i.bar,i.provisional?{provisional:!0}:void 0)}}_aggregatorReader(e,t,i){const s=new on(e,{timezone:this._timezone});i?.seedFrom&&vr(e)&&s.seed(i.seedFrom);const r=function(e,t){if("ltq-sum"===e)return e=>e.ltq??0;let i=t??null;return e=>{const t=e.volume??0,s=null===i?0:t<i?t:t-i;return i=t,Math.max(0,s)}}(this._volumeMode,i?.cumDayVolumeSoFar);return e=>{const i=s.onTick({time:an._tickTime(e),price:e.ltp,qty:r(e)});t(i.bar)}}subscribeDepth(e,t,i){const s=this._ws.onDepth((i,s,r)=>{i===e.symbol&&(s&&e.exchange&&s!==e.exchange||t(r))}),r=this._acquire("Depth",e.symbol,e.exchange,i?.depthLevel??this._depthLevel);return()=>{s(),r()}}close(){this._subs.clear(),this._ws.close()}}const ln=(e,t)=>{const i=setInterval(e,t);return()=>clearInterval(i)};function hn(e,t,i){const s=[];let r=100,n=2654435769;const o=()=>(n^=n<<13,n>>>=0,n^=n>>17,n^=n<<5,n>>>=0,n/4294967295);for(let n=0;n<t;n++){const t=2*(o()-.5),a=r,l=Math.max(1,a+t),h=Math.max(a,l)+o(),c=Math.min(a,l)-o();s.push({time:e+n*i,open:a,high:h,low:c,close:l,volume:Math.round(1e3+9e3*o())}),r=l}return s}function cn(e,t,i){const s=mr(e);if(null===s)return null;const r=s.bucketing;return"interval"===r.mode?t+r.seconds:Mr(r,t,i)}function un(e){return`${e.symbol}|${e.exchange}|${e.interval}`}function dn(e){const t=new Array(e.length);for(let i=0;i<e.length;i++)t[i]={...e[i]};return t}function _n(e){e?.throwIfAborted()}class bn{constructor(e,t={}){Object.defineProperty(this,"source",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_backing",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_memory",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"_tombstones",{enumerable:!0,configurable:!0,writable:!0,value:new Set}),Object.defineProperty(this,"_writes",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"_ttlMs",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_max",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_maxBars",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_now",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_barCloses",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_index",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"_tick",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_hits",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_misses",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_evictions",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"subscribeBars",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"subscribeDepth",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"getBarsPage",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.source=e,this._backing=t.storage,this._ttlMs=t.ttlMs??3e5,this._max=t.max??24,this._maxBars=t.maxBars??25e4,this._now=t.now??(()=>Date.now());const i=t.timezone;this._barCloses=t.barCloses??((e,t)=>cn(e,t,i)),"function"==typeof e.subscribeBars&&(this.subscribeBars=(t,i,...s)=>e.subscribeBars(t,i,...s)),"function"==typeof e.subscribeDepth&&(this.subscribeDepth=(t,i,...s)=>e.subscribeDepth(t,i,...s)),"function"==typeof e.getBarsPage&&(this.getBarsPage=t=>e.getBarsPage(t))}async getBars(e){if(_n(e.signal),void 0===e.from||void 0===e.to){const t=await this.source.getBars(e);return _n(e.signal),t}const t=un(e);if(!0!==e.noCache){const i=await this._lookup(t,e.interval,e.from,e.to);if(_n(e.signal),void 0!==i)return this._hits++,i;this._misses++}_n(e.signal);const i=await this.source.getBars(e);return _n(e.signal),await this._put(t,e.from,e.to,e.interval,i,e.signal),_n(e.signal),i}async getCachedBars(e){if(_n(e.signal),!0===e.noCache||void 0===e.from||void 0===e.to)return;const t=un(e),i=await this._readEntry(t,e.interval);if(_n(e.signal),void 0===i)return;if(this._now()-i.storedAt>this._ttlMs)return await this._drop(t),void _n(e.signal);const s=this._slice(i,e.from,e.to);return 0!==s.length?(this._remember(t,i),await this._evict(),_n(e.signal),s):void 0}async invalidate(e){if(void 0===e)return this.clear();const t=un(e);await this._drop(t)}async clear(){const e=new Set([...this._memory.keys(),...this._tombstones]);this._memory.clear(),this._index.clear();for(const t of e)await this._deleteBacking(t)}stats(){let e=0;for(const t of this._index.values())e+=t.bars;return{entries:this._index.size,bars:e,hits:this._hits,misses:this._misses,evictions:this._evictions}}async _lookup(e,t,i,s){const r=await this._readEntry(e,t);if(void 0===r)return;const n=this._now();if(n-r.storedAt>this._ttlMs)return void await this._drop(e);if(i<r.from)return;const o=Math.floor(n/1e3);return s>r.to&&o>=r.nextClose?void 0:(this._remember(e,r),await this._evict(),this._slice(r,i,s))}_slice(e,t,i){const s=[];for(const r of e.bars)if(!(r.time<t)){if(r.time>i)break;s.push({...r})}return s}async _put(e,t,i,s,r,n){const o=this._now(),a=Math.floor(o/1e3),l=r.filter(e=>e.time>=t&&e.time<=i);let h=l.length;for(;h>0;){const e=this._barCloses(s,l[h-1].time);if(null!==e&&e<=a)break;h--}if(0===h)return;if(h>this._maxBars)return;const c=dn(l.slice(0,h)),u=c[c.length-1],d=this._barCloses(s,u.time),_=this._barCloses(s,d)??d,b={version:1,bars:c,from:t,to:Math.min(i,d-1),storedAt:o,nextClose:_};if(!this._validEntry(b,s,o))return;_n(n);const p=Symbol(e);if(this._writes.set(e,p),this._remember(e,b),await this._writeBacking(e,b),this._writes.get(e)!==p)return await this._restoreLatestBacking(e),void _n(n);!0===n?.aborted&&(this._memory.delete(e),this._index.delete(e),this._writes.delete(e),await this._deleteBacking(e),_n(n)),await this._evict(),!0===n?.aborted&&this._writes.get(e)===p&&(this._memory.delete(e),this._index.delete(e),this._writes.delete(e),await this._deleteBacking(e),_n(n)),this._writes.get(e)===p&&this._writes.delete(e)}async _drop(e){this._memory.delete(e),this._index.delete(e),await this._deleteBacking(e)}async _evict(){for(;;){let e,t=0;for(const e of this._index.values())t+=e.bars;if(this._index.size<=this._max&&t<=this._maxBars)return;let i=1/0;for(const[t,s]of this._index)s.lastUsed<i&&(i=s.lastUsed,e=t);if(void 0===e)return;this._evictions++,await this._drop(e)}}_remember(e,t){const i=this._cloneEntry(t);this._memory.set(e,i),this._index.set(e,{lastUsed:++this._tick,bars:i.bars.length})}async _readEntry(e,t){const i=this._memory.get(e);if(void 0===this._backing||this._tombstones.has(e))return i;let s;try{s=await this._backing.get(e)}catch{return i}if(void 0===s)return i;const r=this._now();if(!this._validEntry(s,t,r))return await this._deleteBacking(e),i;const n=this._cloneEntry(s);return void 0!==i&&i.storedAt>=n.storedAt?i:n}_validEntry(e,t,i){if("object"!=typeof e||null===e)return!1;const s=e;if(void 0!==s.version&&1!==s.version)return!1;if(!Number.isFinite(s.from)||!Number.isInteger(s.from))return!1;if(!Number.isFinite(s.to)||!Number.isInteger(s.to))return!1;if(!Number.isFinite(s.storedAt)||s.storedAt<0||s.storedAt>i)return!1;if(!Number.isFinite(s.nextClose)||!Number.isInteger(s.nextClose))return!1;if(s.from>s.to||s.nextClose<=s.to)return!1;if(!Array.isArray(s.bars)||0===s.bars.length)return!1;if(s.bars.length>this._maxBars||this._max<1)return!1;const r=Math.floor(i/1e3);let n=-1/0,o=null;for(const e of s.bars){if(!this._validBar(e)||e.time<=n)return!1;if(e.time<s.from||e.time>s.to)return!1;if(o=this._barCloses(t,e.time),null===o||o>r)return!1;n=e.time}const a=this._barCloses(t,o)??o;return s.nextClose===a}_validBar(e){if("object"!=typeof e||null===e)return!1;const t=e;return!!Number.isInteger(t.time)&&(!![t.open,t.high,t.low,t.close].every(Number.isFinite)&&(!(void 0!==t.volume&&!Number.isFinite(t.volume))&&(void 0===t.color||"string"==typeof t.color)))}_cloneEntry(e){const t={bars:dn(e.bars),from:e.from,to:e.to,storedAt:e.storedAt,nextClose:e.nextClose};return void 0!==e.version&&(t.version=e.version),t}async _writeBacking(e,t){if(void 0!==this._backing)try{await this._backing.set(e,this._cloneEntry(t)),this._tombstones.delete(e)}catch{this._tombstones.add(e)}}async _deleteBacking(e){if(void 0!==this._backing)try{await this._backing.delete(e),this._tombstones.delete(e)}catch{this._tombstones.add(e)}}async _restoreLatestBacking(e){const t=this._memory.get(e);void 0===t?await this._deleteBacking(e):await this._writeBacking(e,t)}}return e.ALT_PRESET=ri,e.BAR_CACHE_VERSION=1,e.BUILTIN_COMMANDS=ni,e.BarCache=bn,e.BuySellButtons=class{constructor(e={}){Object.defineProperty(this,"_id",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_position",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_mx",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_my",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_scale",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_btnW",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_qtyW",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_h",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_buyLabel",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_sellLabel",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_showPrices",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_qty",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_buyColor",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_sellColor",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_bid",{enumerable:!0,configurable:!0,writable:!0,value:NaN}),Object.defineProperty(this,"_ask",{enumerable:!0,configurable:!0,writable:!0,value:NaN}),Object.defineProperty(this,"_host",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_sellRect",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_buyRect",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_qtyRect",{enumerable:!0,configurable:!0,writable:!0,value:null}),this._id=e.id??"trade",this._position=e.position??"top-left";const t=e.margin??12;this._mx="number"==typeof t?t:t.x,this._my="number"==typeof t?t:t.y,this._buyLabel=e.buyLabel??"BUY",this._sellLabel=e.sellLabel??"SELL",this._showPrices=e.showPrices??!0,this._scale=Math.max(.6,Math.min(1.5,e.scale??1)),this._btnW=74*this._scale,this._qtyW=40*this._scale,this._h=42*this._scale,this._qty=void 0!==e.qty?String(e.qty):"",this._buyColor=e.buyColor,this._sellColor=e.sellColor}attached(e){this._host=e}detached(){this._host=null}zOrder(){return"top"}autoscaleInfo(){return null}setPrices(e,t){this._bid=e,this._ask=t,this._host?.requestUpdate()}setMark(e){this.setPrices(e,e)}setQty(e){this._qty=String(e),this._host?.requestUpdate()}setColors(e,t){this._buyColor=e,this._sellColor=t,this._host?.requestUpdate()}_origin(e,t){const i=2*this._btnW+this._qtyW+2,s=this._mx,r=e-this._mx-i,n=this._my,o=t-this._my-this._h;switch(this._position){case"top-right":return{x:r,y:n,w:i};case"bottom-left":return{x:s,y:o,w:i};case"bottom-right":return{x:r,y:o,w:i};case"center":return{x:(e-i)/2,y:(t-this._h)/2,w:i};default:return{x:s,y:n,w:i}}}draw(e,t){this._sellRect=this._buyRect=this._qtyRect=null;const i=t.dpr,s=this._origin(t.plotWidth,t.plotHeight),r=this._sellColor??t.theme.sell,n=this._buyColor??t.theme.buy;this._sellRect={x:s.x,y:s.y,w:this._btnW,h:this._h},this._qtyRect={x:s.x+this._btnW+1,y:s.y,w:this._qtyW,h:this._h},this._buyRect={x:s.x+this._btnW+this._qtyW+2,y:s.y,w:this._btnW,h:this._h},e.save(),e.shadowColor="rgba(0,0,0,0.35)",e.shadowBlur=8*i,e.shadowOffsetY=2*i;const o=(e,i)=>null!==e&&t.hoverId===`${this._id}:${i}`;this._drawButton(e,this._sellRect,i,o(this._sellRect,"sell")?$(r,.12):r,this._sellLabel,this._showPrices?this._fmt(t,this._bid):"","left");const a="transparent"===t.theme.background?$(r,-.6):t.theme.grid;this._drawChip(e,this._qtyRect,i,a,this._qty||"—",t.theme.axisText),this._drawButton(e,this._buyRect,i,o(this._buyRect,"buy")?$(n,.12):n,this._buyLabel,this._showPrices?this._fmt(t,this._ask):"","right"),e.restore()}_fmt(e,t){return Number.isNaN(t)?"":e.priceScale.format(t)}_drawButton(e,t,i,s,r,n,o){const a=7*this._scale*i;e.beginPath(),this._roundedSide(e,t.x*i,t.y*i,t.w*i,t.h*i,a,o),e.fillStyle=s,e.fill();const l=F(s);e.textAlign="center";const h=(t.x+t.w/2)*i;""!==n?(e.fillStyle=l,e.font=10*this._scale*i+"px system-ui, sans-serif",e.textBaseline="alphabetic",e.fillText(n,h,(t.y+t.h*(18/42))*i),e.font=`700 ${12*this._scale*i}px system-ui, sans-serif`,e.fillText(r,h,(t.y+t.h*(33/42))*i)):(e.fillStyle=l,e.font=`700 ${13*this._scale*i}px system-ui, sans-serif`,e.textBaseline="middle",e.fillText(r,h,(t.y+t.h/2)*i))}_drawChip(e,t,i,s,r,n){e.beginPath(),e.rect(t.x*i,t.y*i,t.w*i,t.h*i),e.fillStyle=s,e.fill(),e.fillStyle=n,e.font=`600 ${13*this._scale*i}px system-ui, sans-serif`,e.textAlign="center",e.textBaseline="middle",e.fillText(r,(t.x+t.w/2)*i,(t.y+t.h/2)*i)}_roundedSide(e,t,i,s,r,n,o){const a=e;if("function"==typeof a.roundRect){const e="left"===o?[n,0,0,n]:[0,n,n,0];a.roundRect(t,i,s,r,e)}else N(e,t,i,s,r,n)}hitTest(e,t,i){const s=i=>null!==i&&e>=i.x&&e<=i.x+i.w&&t>=i.y&&t<=i.y+i.h;return s(this._buyRect)?{externalId:`${this._id}:buy`,zOrder:"top",distance:0,cursor:"pointer"}:s(this._sellRect)?{externalId:`${this._id}:sell`,zOrder:"top",distance:0,cursor:"pointer"}:s(this._qtyRect)?{externalId:`${this._id}:qty`,zOrder:"top",distance:0,cursor:"pointer"}:null}},e.CHART_STATE_VERSION=1,e.CandleBuilder=Us,e.Canvas2dBackend=ht,e.Chart=ss,e.ChartObjects=class{constructor(e,t={}){if(Object.defineProperty(this,"_chart",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_options",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_off",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"_providers",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"_listeners",{enumerable:!0,configurable:!0,writable:!0,value:new Set}),Object.defineProperty(this,"_entries",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"_rows",{enumerable:!0,configurable:!0,writable:!0,value:ns}),Object.defineProperty(this,"_selected",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_destroyed",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"_refreshing",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"_pending",{enumerable:!0,configurable:!0,writable:!0,value:!1}),this._chart=e,this._options=t,e.isDestroyed)return void(this._destroyed=!0);for(const t of["objects:change","indicatorRemoved","paneRemoved","paneMoved","data:context","indicator:data-status","drawing:change","drawing:select"])this._off.push(e.on(t,()=>this.refresh()));let i=e.dataLayer.length>0;this._off.push(e.on("data:range",()=>{const t=e.dataLayer.length>0;t!==i&&(i=t,this.refresh())})),this._off.push(e.on("destroy",()=>this.destroy())),this.refresh()}list(){return this._refreshing||this.refresh(),this._rows}get(e){return this._refreshing||this.refresh(),this._entries.get(e)?.row}subscribe(e){this.refresh(),this._destroyed||this._listeners.add(e);try{e(this._rows)}catch{}return()=>{this._listeners.delete(e)}}register(e){if(this._destroyed)return()=>{};if("string"!=typeof e.id||""===e.id.trim())throw new Error("An object provider needs an id");const t="custom:"+e.id;if(this._providers.has(t))throw new Error("Object provider already registered: "+e.id);const i={provider:e};this._providers.set(t,i);try{i.off=e.subscribe?.(()=>this.refresh())}catch(e){throw this._providers.get(t)===i&&this._providers.delete(t),this.refresh(),e}if(this._destroyed||this._providers.get(t)!==i){try{i.off?.()}catch{}return()=>{}}return this.refresh(),()=>{if(this._providers.get(t)===i){this._providers.delete(t);try{i.off?.()}catch{}this.refresh()}}}refresh(){if(!this._destroyed)if(this._refreshing)this._pending=!0;else{this._refreshing=!0;try{do{this._pending=!1;const e=this._read();if(this._destroyed)break;this._entries=e,null===this._selected||e.has(this._selected)||(this._selected=null);const t=Object.freeze([...e.values()].map(e=>e.row));if(!os(t,this._rows)){this._rows=t;for(const e of[...this._listeners]){if(this._destroyed)break;try{e(t)}catch{}}}}while(this._pending&&!this._destroyed)}finally{this._refreshing=!1}}}select(e,t=!1){if(this._destroyed)return!1;if(null===e)return this._selected=null,this._options.drawings?.select(null),this.refresh(),!0;const i=this.get(e);if(!i?.capabilities.select)return!1;try{return this._selected="drawing"===i.kind?null:e,e.startsWith("drawing:")?this._options.drawings?.select(i.sourceId,t):(this._options.drawings?.select(null),this._entries.get(e)?.actions.select?.()),this.refresh(),!0}catch{return this.refresh(),!1}}setVisible(e,t){return this._act(e,"visibility",e=>e.setVisible(t))}setLocked(e,t){return this._act(e,"lock",e=>e.setLocked(t))}remove(e){return this._act(e,"remove",e=>e.remove())}openSettings(e){return this._act(e,"settings",e=>e.openSettings())}focus(e){return this._act(e,"focus",e=>e.focus())}_act(e,t,i){const s=this.get(e);if(this._destroyed||!s?.capabilities[t])return!1;try{return i(this._entries.get(e).actions),this.refresh(),!0}catch{return this.refresh(),!1}}_read(){const e=new Map,t=this._options.drawings,i=t?.selection()??[];i.length>0&&(this._selected=null);const s=(t,i,s,r)=>{const n=Object.freeze({select:"function"==typeof r.select,visibility:"function"==typeof r.setVisible,lock:"function"==typeof r.setLocked,remove:"function"==typeof r.remove,settings:"function"==typeof r.openSettings,focus:"function"==typeof r.focus}),o=Object.freeze({id:t,sourceId:i,kind:s.kind,name:s.name,paneIndex:s.paneIndex??0,visible:!1!==s.visible,locked:s.locked,selected:!0===s.selected||this._selected===t,dataStatus:s.dataStatus?Object.freeze({...s.dataStatus}):void 0,capabilities:n});e.set(t,{row:o,actions:r})},r=e=>this._options.onSettings?{openSettings:()=>{const t=this.get(e);t&&this._options.onSettings(t)}}:{},n=this._chart;if(null!==n.primarySeries()){const e=n.getDataContext();s("source:primary","primary",{kind:"source",name:e?.symbol||"Price",visible:!1!==n.primarySeriesInfo()?.style.visible},r("source:primary"))}for(const e of n.indicators()){const t="indicator:"+e.id;s(t,e.id,{kind:"indicator",name:e.name,paneIndex:e.paneIndex,visible:e.visible(),dataStatus:e.dataStatus()??void 0},{select:()=>{},setVisible:t=>e.setVisible(t),remove:()=>{n.removeIndicator(e.id)},...r(t)})}if(t)for(const e of t.drawings()){const o="drawing:"+e.id,a=n.dataLayer.length>0&&e.points.length>0&&e.points.every(e=>Number.isFinite(e.time)&&Number.isFinite(e.price))&&void 0!==n.panes()[e.paneIndex];s(o,e.id,{kind:"drawing",name:e.tool.replace(/-/g," ").replace(/^./,e=>e.toUpperCase()),paneIndex:e.paneIndex,visible:!1!==e.visible,locked:!0===e.locked,selected:i.includes(e.id)},{select:()=>t.select(e.id),setVisible:i=>t.update(e.id,{visible:i}),setLocked:i=>t.update(e.id,{locked:i}),remove:()=>{t.remove(e.id)},...a?{focus:()=>this._focusDrawing(e)}:{},...r(o)})}for(const[e,{provider:t}]of this._providers)try{const i=t.get();if(!i||"string"!=typeof i.name||!["source","indicator","drawing","profile"].includes(i.kind))continue;s(e,t.id,i,t)}catch{}return e}_focusDrawing(e){const t=this._chart,i=e.points.map(e=>t.dataLayer.timeToIndexFloat(e.time));if(!i.every(Number.isFinite))return;const s=Math.min(...i),r=Math.max(...i),n=t.getVisibleLogicalRange(),o=Math.max(n.to-n.from,1.2*(r-s),10),a=t.panes()[e.paneIndex].readoutScale(),l=e.points.map(e=>e.price),h=Math.min(...l),c=Math.max(...l),u=Math.max(.15*(c-h),.001*Math.abs(c),a.options.minMove);a.setAutoScale(!1),a.setPriceRange({min:h-u,max:c+u});const d=t.maximizedPane();null!==d&&d!==e.paneIndex&&t.maximizePane(d),t.setVisibleLogicalRange({from:(s+r-o)/2,to:(s+r+o)/2})}destroy(){if(this._destroyed)return;this._destroyed=!0;for(const e of this._off.splice(0))e();const e=[...this._providers.values()];this._providers.clear(),this._entries.clear(),this._rows=ns,this._selected=null;for(const{off:t}of e)try{t?.()}catch{}const t=[...this._listeners];this._listeners.clear();for(const e of t)try{e(ns)}catch{}}},e.ChartTable=Ri,e.ComparisonController=$s,e.DEFAULT_CANDLE_BUILDER_OPTIONS=Gs,e.DEFAULT_CANDLE_STYLE=k,e.DEFAULT_CHART_TABLE_OPTIONS=$i,e.DEFAULT_HISTOGRAM_STYLE=H,e.DEFAULT_KEYMAP=si,e.DEFAULT_PRICE_SCALE_OPTIONS=p,e.DEFAULT_THEME=_t,e.DEFAULT_TIMEZONE=pe,e.DEFAULT_TIME_NAVIGATOR_OPTIONS=Di,e.DEFAULT_TIME_SCALE_OPTIONS=g,e.DEFAULT_TRADING_COLORS=hi,e.DEFAULT_ZOOM_GLIDE_OPTIONS=Ht,e.DataLoadingController=class{constructor(e,t={}){Object.defineProperty(this,"_feed",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_pool",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_options",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_listeners",{enumerable:!0,configurable:!0,writable:!0,value:new Set}),Object.defineProperty(this,"_state",{enumerable:!0,configurable:!0,writable:!0,value:{request:null,bars:[],status:"idle",historyStatus:"idle",hasMore:null,reason:"state",paused:!1}}),Object.defineProperty(this,"_bars",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"_scope",{enumerable:!0,configurable:!0,writable:!0,value:new AbortController}),Object.defineProperty(this,"_refreshAbort",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_pageAbort",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_loadWork",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_pageWork",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_unsubscribe",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_stream",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_generation",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_refreshId",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_before",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_buffer",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_poll",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_visible",{enumerable:!0,configurable:!0,writable:!0,value:!0}),Object.defineProperty(this,"_destroyed",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"_seconds",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_provisionalTime",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_repairTimer",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_repairRetries",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_pendingRepair",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_barClose",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this._feed=e,this._pool=t.requestPool??ur(e),this._options={pageSize:500,maxEmptyPages:4,maxBars:1e5,pollIntervalMs:0,...t};for(const e of["pageSize","maxEmptyPages","maxBars"]){const t=Ir(this._options[e],e);if(!Number.isInteger(t))throw new RangeError(`${e} must be an integer`)}if(void 0!==t.pageWindowSec&&Ir(t.pageWindowSec,"pageWindowSec"),void 0!==t.timeoutMs&&Ir(t.timeoutMs,"timeoutMs"),!Number.isFinite(this._options.pollIntervalMs)||this._options.pollIntervalMs<0)throw new RangeError("pollIntervalMs must be nonnegative");if(void 0!==t.refreshWindowBars&&!Number.isInteger(Ir(t.refreshWindowBars,"refreshWindowBars")))throw new RangeError("refreshWindowBars must be an integer");const i=t.refreshOnBarClose;if(this._barClose=i?{...Tr,...!0===i?{}:i}:null,this._barClose){for(const e of["delayMs","retries","retryDelayMs"]){const t=this._barClose[e];if(!Number.isFinite(t)||t<0)throw new RangeError(`refreshOnBarClose.${e} must be nonnegative`)}if(!Number.isInteger(this._barClose.retries))throw new RangeError("refreshOnBarClose.retries must be an integer")}}getState(){return this._state}bars(){return this._bars}subscribe(e){return this._destroyed?()=>{}:(this._listeners.add(e),()=>{this._listeners.delete(e)})}load(e){if(this._destroyed)return Promise.resolve([]);const t=++this._generation;if(this._cancel(),!this._current(t))return this._loadWork??Promise.resolve(this._bars);this._scope=new AbortController,this._bars=[],this._before=void 0,this._provisionalTime=null;const i=mr(e.interval);this._seconds="interval"===i?.bucketing.mode?i.bucketing.seconds:null;const s={...e,signal:void 0,timeoutMs:e.timeoutMs??this._options.timeoutMs};let r;this._state={request:s,bars:[],status:"loading",historyStatus:"idle",hasMore:null,reason:"load",paused:!1};const n=new Promise(e=>{r=e});return this._loadWork=n,this._publish("load"),this._load(s,e.signal,t).then(r),n.then(()=>{this._loadWork===n&&(this._loadWork=null)}),n}async _load(e,t,i){if(!this._current(i))return this._bars;const s=this._scope,r=()=>s.abort();t?.addEventListener("abort",r,{once:!0}),t?.aborted&&s.abort();try{let t;if(!e.noCache&&this._feed.getCachedBars)try{const i=await ar({signal:s.signal,timeoutMs:Math.min(e.timeoutMs??500,500)},t=>this._feed.getCachedBars({...e,signal:t}));t=i?jr(i):void 0}catch{}if(!this._current(i))return this._bars;if(s.signal.aborted)throw s.signal.reason;t?.length&&(this._bars=t,this._publish("cache",{status:"refreshing"}));const r=t?.length&&void 0!==e.from&&t[0].time<=e.from?Math.max(e.from,t[Math.max(0,t.length-2)].time):e.from,n=await this._pool.getBars({...e,from:r,signal:s.signal,noCache:e.noCache||!!this._feed.getCachedBars},10);if(!this._current(i))return this._bars;this._bars=this._replaceWindow(jr(n),r,e.to),this._limit(),this._before=this._bars[0]?.time??e.from,this._publish("load",{status:this._bars.length?"ready":"empty",error:void 0}),this._startStream(i),this._current(i)&&this._schedulePoll()}catch(e){this._current(i)&&this._publish("state",{status:s.signal.aborted?"idle":this._bars.length?"stale":"error",error:s.signal.aborted?void 0:Cr(e)})}finally{t?.removeEventListener("abort",r)}return this._bars}refresh(){return this._refresh()}async _refresh(e){if(this._destroyed||!this._state.request)return this._bars;if(this._loadWork)return this._loadWork;const t=this._generation,i=++this._refreshId,s=this._refreshAbort;if(this._refreshAbort=null,s?.abort(),!this._current(t)||i!==this._refreshId)return this._bars;const r=new AbortController;this._refreshAbort=r,this._clearPoll(),this._buffer??(this._buffer=new Map);const n=this._state.request,o=Math.max(n.to??0,(this._options.now??(()=>Date.now()/1e3))()),a=void 0!==n.from&&void 0!==n.to?n.to-n.from:void 0,l=this._bars[this._bars.length-1];let h=void 0===a?n.from:o-a;void 0!==this._options.refreshWindowBars&&null!==this._seconds&&l&&(h=l.time-this._options.refreshWindowBars*this._seconds,void 0!==e?.from&&(h=Math.min(h,e.from))),this._publish("state",{status:"refreshing",error:void 0});try{const s=await this._pool.getBars({...n,from:h,to:o,noCache:!0,signal:r.signal},5);if(!this._current(t)||i!==this._refreshId)return this._bars;if(0===s.length&&this._bars.length)throw new Error("History refresh returned no bars");const a=jr(s);let c=-1/0;for(const e of a)e.time>c&&(c=e.time);const u=a.length?Math.min(o,c):o,d=this._replaceWindow(a,h,u),_=new Map(d.map(e=>[e.time,e])),b=l&&l.time===c?_.get(l.time):void 0;l&&b&&_.set(l.time,{...b,high:Math.max(b.high,l.high),low:Math.min(b.low,l.low),volume:void 0===b.volume&&void 0===l.volume?void 0:Math.max(b.volume??0,l.volume??0)}),null!==this._provisionalTime&&_.has(this._provisionalTime)&&this._provisionalTime<=u&&(this._provisionalTime=null);for(const e of this._buffer?.values()??[]){const t=_.get(e.time);_.set(e.time,t?{...t,high:Math.max(t.high,e.high),low:Math.min(t.low,e.low),close:e.close,volume:void 0===t.volume&&void 0===e.volume?void 0:Math.max(t.volume??0,e.volume??0)}:e)}this._bars=jr([..._.values()]),this._buffer=null,this._limit(),this._publish("refresh",{status:this._bars.length?"ready":"empty",error:void 0}),this._startStream(t),void 0!==e?.expect&&c<e.expect&&this._barClose&&this._repairRetries<this._barClose.retries&&(this._repairRetries++,this._scheduleRepair({expect:e.expect},this._barClose.retryDelayMs))}catch(e){if(!this._current(t)||i!==this._refreshId||r.signal.aborted)return this._bars;this._limit(),this._publish("refresh",{status:this._bars.length?"stale":"error",error:Cr(e)})}finally{if(this._current(t)&&i===this._refreshId){this._refreshAbort=null,this._schedulePoll();const e=this._pendingRepair;this._pendingRepair=null,e&&this._refresh(e)}}return this._bars}pushBar(e,t){if(this._destroyed||!this._state.request)return;let i;try{i=jr([e])[0]}catch(e){return void this._publish("state",{status:this._bars.length?"stale":"error",error:Cr(e)})}const s=this._bars[this._bars.length-1];if(s&&i.time<s.time)return;const r=!0===t?.provisional,n=!s||i.time>s.time;if(n?r&&(this._provisionalTime=i.time):r&&this._provisionalTime!==i.time&&(i={...i,open:s.open,high:Math.max(s.high,i.high),low:Math.min(s.low,i.low),volume:void 0===s.volume&&void 0===i.volume?void 0:Math.max(s.volume??0,i.volume??0)}),this._buffer)for(this._buffer.set(i.time,i);this._buffer.size>this._options.maxBars;)this._buffer.delete(this._buffer.keys().next().value);const o=this._bars.slice();s?.time===i.time?o[o.length-1]={...i,volume:i.volume??s.volume}:o.push(i),this._bars=o,this._limit(),this._buffer||this._publish("live",{status:"stale"===this._state.status?"stale":"ready"}),n&&this._onNewBucket(s?.time,i.time)}_onNewBucket(e,t){this._options.refreshOnGap&&null!==this._seconds&&void 0!==e&&t-e>this._seconds?this._requestRepair({from:e}):this._barClose&&(this._repairRetries=0,this._scheduleRepair({expect:e},this._barClose.delayMs))}_scheduleRepair(e,t){this._clearRepairTimer(),!this._destroyed&&this._visible&&(this._repairTimer=setTimeout(()=>{this._repairTimer=null,this._requestRepair(e)},t))}_requestRepair(e){if(!this._destroyed&&this._visible&&this._state.request&&!this._loadWork){if(this._refreshAbort){const t=this._pendingRepair;return void(this._pendingRepair={from:void 0===t?.from?e.from:void 0===e.from?t.from:Math.min(t.from,e.from),expect:void 0===t?.expect?e.expect:void 0===e.expect?t.expect:Math.max(t.expect,e.expect)})}this._refresh(e)}}_clearRepairTimer(){null!==this._repairTimer&&clearTimeout(this._repairTimer),this._repairTimer=null}loadMore(){if(this._pageWork)return this._pageWork;if(this._destroyed||!this._state.request||this._loadWork||this._state.paused||!1===this._state.hasMore)return Promise.resolve(this._bars);if(this._bars.length>=this._options.maxBars)return this._publish("state",{historyStatus:"limited"}),Promise.resolve(this._bars);const e=this._generation;let t;const i=new Promise(e=>{t=e});return this._pageWork=i,this._loadMore(e).then(t),i.then(()=>{this._pageWork===i&&(this._pageWork=null)}),i}async _loadMore(e){const t=this._state.request,i=this._options.pageWindowSec??Math.max(1,(t.to??0)-(t.from??0)||86400),s=new AbortController;this._pageAbort=s,this._publish("state",{historyStatus:"loading",historyError:void 0});try{for(let r=0;r<this._options.maxEmptyPages;r++){const r=this._before??this._bars[0]?.time??t.from;if(void 0===r)throw new Error("Older history needs a starting time");const n={...t,from:r-i,to:r-1e-6,before:r,countBack:this._options.pageSize,signal:s.signal},o=this._feed.getBarsPage?await this._pool.getBarsPage(n):{bars:await this._pool.getBars(n),hasMore:void 0,nextBefore:void 0};if(!this._current(e)||s.signal.aborted)return this._bars;const a=jr(o.bars).filter(e=>e.time<r),l=o.nextBefore??a[0]?.time??r-i;if(!Number.isFinite(l)||l>=r)throw new Error("History page did not advance its cursor");if(this._before=l,a.length){const e=new Set(this._bars.map(e=>e.time)),t=a.filter(t=>!e.has(t.time)),i=Math.max(0,this._options.maxBars-this._bars.length);this._bars=Lr(i?t.slice(-i):[],this._bars);const s=t.length>i||this._bars.length>=this._options.maxBars;return this._publish("prepend",{hasMore:t.length>i||(o.hasMore??null),historyStatus:s?"limited":!1===o.hasMore?"exhausted":"idle"}),this._bars}if(!1===o.hasMore)return this._publish("state",{hasMore:!1,historyStatus:"exhausted"}),this._bars}this._publish("state",{hasMore:null,historyStatus:"idle"})}catch(t){this._current(e)&&!s.signal.aborted&&this._publish("state",{historyStatus:"error",historyError:Cr(t)})}finally{this._pageAbort===s&&(this._pageAbort=null)}return this._bars}setPaused(e){this._destroyed||e===this._state.paused||(this._state={...this._state,paused:e},this._publish(e?"state":"resume"))}setVisible(e){this._destroyed||e===this._visible||(this._visible=e,e?this.refresh():(this._clearPoll(),this._clearRepairTimer(),this._pendingRepair=null))}destroy(){this._destroyed||(this._destroyed=!0,this._generation++,this._cancel(),this._listeners.clear())}_current(e){return!this._destroyed&&e===this._generation}_replaceWindow(e,t,i){return void 0===t||void 0===i?e:Lr(this._bars.filter(e=>e.time<t||e.time>i),e)}_limit(){this._bars.length>this._options.maxBars&&(this._bars=this._bars.slice(-this._options.maxBars))}_publish(e,t={}){if(this._destroyed)return;this._state={...this._state,...t,reason:e,bars:this._state.paused||this._buffer?this._state.bars:this._bars};const i=this._state;for(const e of[...this._listeners]){if(this._destroyed||this._state!==i)break;try{e(i)}catch{}}}_startStream(e){if(!this._current(e))return;const t=this._stream,i=++this._stream,s=this._unsubscribe;if(this._unsubscribe=null,this._feed.subscribeBars)try{const t=this._feed.subscribeBars(this._state.request,(t,s)=>{this._current(e)&&i===this._stream&&this.pushBar(t,s)},{seedFrom:this._bars[this._bars.length-1],onResync:()=>{this._current(e)&&i===this._stream&&this.refresh()}});this._current(e)&&i===this._stream?this._unsubscribe=t:this._release(t),this._release(s)}catch(r){this._current(e)&&i===this._stream?(this._stream=t,this._unsubscribe=s,this._buffer??(this._buffer=new Map),this._publish("state",{status:this._bars.length?"stale":"error",error:Cr(r)})):this._release(s)}else this._release(s)}_release(e){try{e?.()}catch{}}_clearPoll(){null!==this._poll&&clearTimeout(this._poll),this._poll=null}_schedulePoll(){this._clearPoll(),!this._destroyed&&this._visible&&this._options.pollIntervalMs>0&&(this._poll=setTimeout(()=>{this._poll=null,this.refresh()},this._options.pollIntervalMs))}_cancel(){const e=this._scope,t=this._refreshAbort,i=this._pageAbort,s=this._unsubscribe;this._refreshAbort=null,this._pageAbort=null,this._loadWork=null,this._pageWork=null,this._buffer=null,this._pendingRepair=null,this._stream++,this._unsubscribe=null,this._clearPoll(),this._clearRepairTimer(),e.abort(),t?.abort(),i?.abort(),this._release(s)}},e.EventMarkers=ki,e.FakeDataFeed=class{constructor(e=60,t=ln){Object.defineProperty(this,"intervalSec",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_schedule",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.intervalSec=e,this._schedule=t}async getBars(e){return hn(e.from??17e8,500,this.intervalSec)}subscribeBars(e,t,i){let s=i?.seedFrom?.time??e.from??17e8,r=i?.seedFrom?.close??100,n=19088743;const o=()=>(n^=n<<13,n>>>=0,n^=n>>17,n^=n<<5,n>>>=0,n/4294967295);return this._schedule(()=>{s+=this.intervalSec;const e=r,i=Math.max(1,e+2*(o()-.5)),n=Math.max(e,i)+o(),a=Math.max(.01,Math.min(e,i)-o());t({time:s,open:e,high:n,low:a,close:i,volume:Math.round(1e3+9e3*o())}),r=i},i?.tickMs??1e3)}},e.HistoryRequestPool=hr,e.INDICATOR_LINE_STYLES=St,e.INDICATOR_PLOT_STYLES=Mt,e.INDICATOR_SOURCES=[{label:"Close",value:"close"},{label:"Open",value:"open"},{label:"High",value:"high"},{label:"Low",value:"low"},{label:"HL2",value:"hl2"},{label:"HLC3",value:"hlc3"},{label:"OHLC4",value:"ohlc4"}],e.IST_OFFSET_SECONDS=se,e.IndicatorBackground=Bt,e.IndicatorDrawings=Ft,e.IndicatorFill=Lt,e.InvalidationLevel=i,e.LINK_CROSSHAIR_ALPHA=.55,e.LinkCrosshair=Ws,e.LinkGroup=Vs,e.LogoWatermark=Yi,e.OpenAlgoDataFeed=Fr,e.OpenAlgoLiveDataFeed=an,e.OpenAlgoTradeFeed=class{constructor(e){Object.defineProperty(this,"_config",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_fetch",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_strategy",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_defaultProduct",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_ctx",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"_claimed",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"_verifyMode",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_modeCacheMs",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_now",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_mode",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_modeAt",{enumerable:!0,configurable:!0,writable:!0,value:0}),this._config=e,this._strategy=e.strategy??"openalgo-charts",this._defaultProduct=e.defaultProduct??"MIS",this._verifyMode=e.verifyMode??"auto",this._modeCacheMs=e.modeCacheMs??5e3,this._now=e.now??Date.now;const t=e.fetchImpl??("undefined"!=typeof fetch?fetch.bind(globalThis):void 0);if(void 0===t)throw new Error("openalgo-charts: no fetch available; pass config.fetchImpl");this._fetch=t}async _post(e,t){const i=await this._fetch(`${this._config.baseUrl}${e}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apikey:this._config.apiKey,...t})});if(!i.ok){let t="";try{const e=await i.json();"string"==typeof e.message&&""!==e.message&&(t=`: ${e.message}`)}catch{}throw new Error(`openalgo-charts: ${e} failed (${i.status})${t}`)}const s=await i.json(),r=nn(s);return void 0!==r&&(this._mode=r,this._modeAt=this._now()),s}async getServerMode(e=this._modeCacheMs){const t=this._freshMode(e);if(void 0!==t)return t;const i=nn(await this._post("/api/v1/analyzer/",{}));if(void 0===i)throw new Error("openalgo-charts: /api/v1/analyzer/ returned no readable mode");return i}serverMode(e=this._modeCacheMs){return this._freshMode(e)}_freshMode(e){if(void 0!==this._mode)return this._now()-this._modeAt<=e?this._mode:void 0}async _assertMode(e){if("off"===this._verifyMode)return;if("live"!==e&&"analyzer"!==e)return;let t=this._freshMode(this._modeCacheMs);if(void 0===t&&("always"===this._verifyMode||"analyzer"===e))try{t=await this.getServerMode()}catch(e){throw Yr(`openalgo-charts: cannot confirm the server mode, no order was sent (${String(e.message??e)})`)}if(void 0!==t&&t!==e)throw Yr(`openalgo-charts: refusing to place, caller expects ${e} mode but the OpenAlgo server is in ${t} mode`)}_assertQuantity(e){const t=e.exchange??"NSE",i=this._config.constraints?.(e.symbol,t)??{},s=Ur(e.qty,i);if(!s.ok)throw Yr(`openalgo-charts: ${e.symbol} ${t}: ${s.reason}`)}_claimToken(e){if(void 0===e||!0===this._config.disableIdempotency)return;const t=this._claimed.get(e);if(void 0!==t)throw Yr("ambiguous"===t?`openalgo-charts: clientToken ${e} may already be live at the broker; check the order book before retrying`:`openalgo-charts: duplicate clientToken ${e}`);return this._claimed.set(e,"inflight"),e}async place(e){await this._assertMode(e.mode),this._assertQuantity(e);const t=this._claimToken(e.clientToken),i={symbol:e.symbol,exchange:e.exchange??"NSE",action:e.side,pricetype:e.type,product:e.product??this._defaultProduct,quantity:e.qty,price:e.price??0,triggerPrice:e.triggerPrice??0};let s;try{s=await this._post("/api/v1/placeorder",{strategy:this._strategy,symbol:i.symbol,action:i.action,exchange:i.exchange,pricetype:i.pricetype,product:i.product,quantity:e.qty,price:e.price??0,trigger_price:e.triggerPrice??0,disclosed_quantity:0})}catch(e){throw void 0!==t&&this._claimed.set(t,"ambiguous"),e}const r=s.orderid??s.order_id;if(void 0===r)throw new Error("openalgo-charts: placeorder returned no orderid");return void 0!==t&&this._claimed.set(t,"sent"),this._ctx.set(r,i),{orderId:r}}tokenState(e){return this._claimed.get(e)??"unknown"}releaseToken(e){this._claimed.delete(e)}async modify(e,t){const i=this._ctx.get(e);if(void 0===i)throw Yr(`openalgo-charts: cannot modify ${e}, unknown order context (place it or load the order book first)`);void 0!==t.qty&&(i.quantity=t.qty),void 0!==t.price&&(i.price=t.price),void 0!==t.triggerPrice&&(i.triggerPrice=t.triggerPrice),await this._post("/api/v1/modifyorder",{orderid:e,strategy:this._strategy,symbol:i.symbol,action:i.action,exchange:i.exchange,pricetype:i.pricetype,product:i.product,quantity:i.quantity,price:i.price,trigger_price:i.triggerPrice,disclosed_quantity:0})}async cancel(e){await this._post("/api/v1/cancelorder",{orderid:e,strategy:this._strategy})}async getOrderBook(){const e=await this._post("/api/v1/orderbook",{}),t=Array.isArray(e.data)?e.data:e.data?.orders??[],i=[],s=[];for(let e=0;e<t.length;e++){const r=t[e],n=sn(r,`orders[${e}]`);if(!n.ok){s.push({issue:n.issue,raw:r});continue}i.push(n.order);const o=Zr(r.exchange),a=Zr(r.product);void 0!==o&&void 0!==a&&this._ctx.set(n.order.id,{symbol:n.order.symbol,exchange:o,action:n.order.side,pricetype:n.order.type,product:a,quantity:n.order.qty,price:n.order.price,triggerPrice:n.order.triggerPrice??0})}return s.length>0&&this._config.onDecodeIssue?.({orders:i,quarantined:s}),{orders:i,quarantined:s}}async getOrders(){return(await this.getOrderBook()).orders}async getPositions(){return((await this._post("/api/v1/positionbook",{})).data??[]).map(rn)}},e.OpenAlgoWsFeed=Gr,e.PRICE_LEVEL_KINDS=Ys,e.PRICE_SCALE_MODES=["linear","logarithmic","percentage","indexed-to-100"],e.Pane=ut,e.PaneLegend=Bi,e.PriceLevels=class{constructor(e={}){Object.defineProperty(this,"_levels",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_timezone",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_phase",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_quote",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_values",{enumerable:!0,configurable:!0,writable:!0,value:{previousClose:null,sessionHigh:null,sessionLow:null,lastPrice:null,preMarketOpen:null,preMarketClose:null,postMarketOpen:null,postMarketClose:null,bid:null,ask:null}}),Object.defineProperty(this,"_host",{enumerable:!0,configurable:!0,writable:!0,value:null}),this._levels={...Ks};for(const t of Ys){const i=e.levels?.[t];void 0!==i&&(this._levels[t]={...Ks[t],...i})}this._timezone=e.timezone??pe,this._phase=e.marketPhase??null,this._quote=e.quote??null}attached(e){this._host=e}detached(){this._host=null}zOrder(){return"normal"}level(e){return this._levels[e]}setLevel(e,t){this._levels[e]={...this._levels[e],...t},this._host?.requestUpdate()}setOptions(e){for(const t of Ys){const i=e.levels?.[t];void 0!==i&&(this._levels[t]={...this._levels[t],...i})}void 0!==e.timezone&&(this._timezone=e.timezone),void 0!==e.marketPhase&&(this._phase=e.marketPhase),void 0!==e.quote&&(this._quote=e.quote),this._host?.requestUpdate()}setQuote(e){this._quote=e,this._host?.requestUpdate()}values(){return this._values}available(e){return null!==this._values[e]}draw(e,t){const i=t.bars?.()??[],s=t.dataLayer.indexToTimeFloat(t.timeScale.visibleRange().to);this._values=Js({bars:i,anchorTime:s,timezone:this._timezone,marketPhase:this._phase,quote:"function"==typeof this._quote?this._quote()??null:this._quote});const r=t.dpr,n=Math.round(t.plotWidth*r),o=t.plotHeight*r,a=i.length>0?i[i.length-1]:null,l=null!==a&&a.close>=a.open;e.save(),e.font=`500 ${11*r}px system-ui, sans-serif`,e.textBaseline="middle",e.textAlign="left";for(const i of Ys){const s=this._levels[i];if(!s.line&&!s.label)continue;const a=this._values[i];if(null===a)continue;const h=Math.round(t.priceScale.priceToY(a)*r)+.5;if(h<0||h>o)continue;const c=s.color??Qs(i,t.theme,l);if(s.line){const i=Math.max(0,Math.min(1,s.extentFromRight??1)),o=Math.round(t.plotWidth*(1-i)*r);e.strokeStyle=c,e.lineWidth=Math.max(1,Math.round((s.lineWidth??1)*r)),e.setLineDash(x(s.lineStyle,r)),e.beginPath(),e.moveTo(o,h),e.lineTo(n,h),e.stroke(),e.setLineDash([])}if(s.label){const i=s.text??t.priceScale.format(a),o=6*r,l=16*r;e.fillStyle=c,e.fillRect(n+1,h-l/2,e.measureText(i).width+2*o,l),e.fillStyle=F(c),e.fillText(i,n+1+o,h)}}e.restore()}},e.PriceLine=li,e.PriceScale=m,e.ReplayController=class{constructor(e,t={}){Object.defineProperty(this,"_chart",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_series",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_bars",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_restore",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_view",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_onFrame",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_now",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_schedule",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_barMs",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_startIndex",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_subBars",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_subStart",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_subCount",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_intra",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_speed",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_index",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_sub",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_playing",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"_active",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"_cancel",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"_interval",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_lastAdvance",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"_tick",{enumerable:!0,configurable:!0,writable:!0,value:()=>{if(!this._playing)return;const e=this._now();let t=Math.floor((e-this._lastAdvance)/this._interval);t<=0||(t>10?(t=10,this._lastAdvance=e):this._lastAdvance+=t*this._interval,this._advance(t),this._atEnd()&&this._end())}}),this._chart=e;const i=t.series,s=void 0===i?[]:"setData"in i?[i]:[...i];if(0===s.length){const t=e.primarySeries?.()??null;if(null===t)throw new Error("openalgo-charts: replay needs a series to drive (pass options.series)");s.push(t)}this._series=s,this._restore=s.map(e=>e.getData()),this._bars=t.bars??this._restore[0],this._view={barSpacing:e.timeScale.barSpacing,rightOffset:e.timeScale.rightOffset},this._subBars=t.subBars??[],this._intra=this._subBars.length>0&&this._bars.length>0;const r=this._buildBuckets();this._subStart=r.start,this._subCount=r.count,this._startIndex=h(Math.floor(t.startIndex??0),0,Math.max(0,this._bars.length-1)),this._index=this._startIndex;const n=t.barMs??1e3;this._barMs=n>0?n:1e3;const o=t.speed??1;this._speed=o>0?o:1,this._onFrame=t.onFrame??null,this._now=t.now??(()=>"undefined"!=typeof performance?performance.now():0),this._schedule=t.scheduler??Ls,this._apply(this._startIndex,this._steps(this._startIndex)-1)}_buildBuckets(){const e=this._bars.length,t=new Int32Array(e),i=new Int32Array(e);if(!this._intra)return{start:t,count:i};const s=this._subBars;let r=-1;for(let n=0;n<s.length;n++){const o=s[n].time;for(;r+1<e&&this._bars[r+1].time<=o;)r++,t[r]=n;r>=0&&i[r]++}return{start:t,count:i}}_steps(e){return this._intra?Math.max(1,this._subCount[e]):1}seek(e){this._apply(e,this._steps(h(Math.floor(e),0,Math.max(0,this._bars.length-1)))-1)}step(e=1){this._advance(e)}stepBack(e=1){this._advance(-e)}_advance(e){if(!this._intra)return void this._apply(this._index+e,0);let t=this._index,i=this._sub;const s=this._bars.length-1;for(let r=0;r<Math.abs(e);r++)if(e>0)if(i+1<this._steps(t))i++;else{if(!(t<s))break;t++,i=0}else if(i>0)i--;else{if(!(t>0))break;t--,i=this._steps(t)-1}this._apply(t,i)}play(e={}){const t=e.speed;void 0!==t&&t>0&&(this._speed=t),0!==this._bars.length&&(this._apply(this._index,this._sub),this._atEnd()?this._end():(this._stopTimer(),this._interval=this._barMs/this._speed,this._lastAdvance=this._now(),this._playing=!0,this._cancel=this._schedule(this._tick,this._interval),this._chart.emit("replay:play",this.state())))}pause(){this._playing&&(this._playing=!1,this._stopTimer(),this._chart.emit("replay:pause",this.state()))}stop(){if(this._playing=!1,this._stopTimer(),!this._active)return;this._active=!1,this._index=this._startIndex,this._sub=0;for(let e=0;e<this._series.length;e++)this._series[e].setData(this._restore[e]);const e=this._chart.timeScale;e.setBarSpacing(this._view.barSpacing),e.setRightOffset(this._view.rightOffset),this._chart.emit("replay:stop",this.state())}state(){const e=this._bars.length,t=0===e?1:this._steps(this._index);let i=null;if(e>0&&(i=this._bars[this._index],this._intra&&this._sub<t-1&&this._subCount[this._index]>0)){const e=this._subStart[this._index];i=zs(this._subBars,e,e+this._sub,i.time)}return{index:this._index,total:e,playing:this._playing,speed:this._speed,bar:i,subIndex:this._sub,subSteps:t}}_apply(e,t=0){const i=this._bars.length;if(0===i)return;const s=h(Math.floor(e),0,i-1),r=this._steps(s),n=h(Math.floor(t),0,r-1);if(this._active&&s===this._index&&n===this._sub)return;const o=!this._active;this._active=!0,this._index=s,this._sub=n;const a=this._bars.slice(0,s+1);if(this._intra&&n<r-1&&this._subCount[s]>0){const e=this._subStart[s];a[s]=zs(this._subBars,e,e+n,this._bars[s].time)}this._series[0].setData(a);const l=this._intra&&n<r-1?s>0?this._bars[s-1].time:Number.NEGATIVE_INFINITY:this._bars[s].time;for(let e=1;e<this._series.length;e++){const t=this._restore[e];this._series[e].setData(t.slice(0,As(t,l)))}o&&this._chart.emit("replay:start",this.state());const c=this.state();this._onFrame?.(c),this._chart.emit("replay:frame",c)}_atEnd(){const e=this._bars.length-1;return this._index>=e&&this._sub>=this._steps(e)-1}_end(){this.pause(),this._chart.emit("replay:end",this.state())}_stopTimer(){this._cancel?.(),this._cancel=null}},e.ReplayShade=class{constructor(e){Object.defineProperty(this,"_opts",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this._opts={index:e.index,color:e.color??"rgba(12,14,20,0.62)",lineColor:e.lineColor??"#3b82f6",lineWidth:e.lineWidth??1,lineVisible:e.lineVisible??!0,zOrder:e.zOrder??"top",id:e.id??"replay-shade"}}zOrder(){return this._opts.zOrder}autoscaleInfo(){return null}hitTest(){return null}setOptions(e){this._opts={...this._opts,...e}}draw(e,t){const i=this._opts;if(null===i.index)return;const s=t.dpr,r=t.plotWidth*s,n=t.plotHeight*s;if(r<=0||n<=0)return;const o=t.timeScale.barSpacing*s/2,a=Math.round(t.timeScale.indexToX(i.index)*s+o);if(a>=r)return;const l=Math.max(0,a);e.save(),e.fillStyle=i.color,e.fillRect(l,0,r-l,n),i.lineVisible&&a>=0&&(e.strokeStyle=i.lineColor,e.lineWidth=Math.max(1,Math.round(i.lineWidth*s)),e.beginPath(),e.moveTo(a+.5,0),e.lineTo(a+.5,n),e.stroke()),e.restore()}},e.SCALE_FONT_MAX=14,e.SCALE_FONT_MIN=10,e.SeriesMarkers=Oi,e.ShortcutManager=ai,e.SvgContext=xt,e.SvgLinearGradient=bt,e.TextWatermark=Zi,e.TickBarAggregator=on,e.TimeNavigator=Ei,e.TimeScale=v,e.TradeMarkersPrimitive=pi,e.TradingController=fi,e.UnknownIntervalError=dr,e.VERSION=t,e.ZoomGlide=Vt,e.addComparison=function(e,t){return Rs(e).add(t)},e.alignToPrimary=Bs,e.applyChartSettings=function(e,t){const i=new Map;for(const t of js(e))for(const e of t.controls)for(const t of e.fields)i.set(t.key,t);for(const s of Object.keys(t)){const r=t[s];void 0!==r&&i.get(s)?.write(e,r)}},e.atr=sr,e.autoscaleRange=f,e.backendDegradation=nt,e.backoffDelayMs=Hr,e.barCacheKey=un,e.barCloseSec=cn,e.beginPick=vi,e.bestHit=rt,e.bitmapSize=o,e.bucketStartOf=Or,e.calendarPeriodFlags=function(e,t){const i=new Array(e.length).fill(!1),s=Ae(e);if(null===s){for(let s=1;s<e.length;s++)i[s]=t(e[s-1],e[s]);return i}let r=e[0];for(const n of s)t(r,e[n])&&(i[n]=!0),r=e[n];return i},e.candleGeometry=I,e.candleTier=C,e.chartSettingsSchema=function(e){return js(e).map(e=>({id:e.id,label:e.label,inputs:e.controls.map(e=>e.input)}))},e.clamp=h,e.classifyAuthAck=Er,e.compactVolume=Qi,e.comparisonController=Rs,e.computePriceLevels=Js,e.conflateBars=function(e,t){if(t<=1)return e.slice();const i=[];for(let s=0;s<e.length;s+=t)i.push(te(e.slice(s,s+t)));return i},e.conflateItems=ie,e.conflationGroupSize=ee,e.createChart=function(e,t={}){return new ss(e,t)},e.createLinkGroup=function(e={}){return new Vs(e)},e.createRenderBackend=function(e="canvas2d"){const t=lt(e)();if(null===t)throw new Error("openalgo-charts: the canvas2d render backend factory returned null");return t},e.darkTheme={background:"#0d0e12",grid:"#161a26",axisText:"#8b91a7",axisLine:"#2a3046",paneSeparator:"#1e2334",crosshair:"#6b7280",upColor:"#26a69a",downColor:"#ef5350",wickUpColor:"#26a69a",wickDownColor:"#ef5350",lineColor:"#4f8cff",areaTopColor:"rgba(79,140,255,0.40)",areaBottomColor:"rgba(79,140,255,0.00)",baselineTopLine:"#26a69a",baselineTopFill:"rgba(38,166,154,0.20)",baselineBottomLine:"#ef5350",baselineBottomFill:"rgba(239,83,80,0.20)",lastPriceUp:"#26a69a",lastPriceDown:"#ef5350",lastPriceText:"#0d0e12",buy:"#26a69a",sell:"#ef5350",profit:"#26a69a",loss:"#ef5350"},e.dashPattern=x,e.decodeOrder=sn,e.drawLabel=Pi,e.drawShape=Si,e.effectiveMarkerPx=xi,e.ema=er,e.emaSeries=function(e,t){const i=er(e.map(e=>e.close),t);return e.map((e,t)=>({time:e.time,open:i[t],high:i[t],low:i[t],close:i[t]}))},e.epochMsToUtcSeconds=re,e.eventToCombo=ei,e.followerIndex=Ds,e.followerRange=Es,e.formatCombo=function(e,t=Zt()){const i=Xt(e);if(null===i)return"";const s=t?{Mod:"⌘",Ctrl:"⌃",Meta:"⌘",Alt:"⌥",Shift:"⇧"}:{Mod:"Ctrl",Ctrl:"Ctrl",Meta:"Win",Alt:"Alt",Shift:"Shift"};var r;return[...i.mods.map(e=>s[e]),(r=i.key,void 0!==Qt[r]?Qt[r]:/^Key[A-Z]$/.test(r)?r.slice(3):/^Digit[0-9]$/.test(r)?r.slice(5):r)].join(t?" ":" + ")},e.formatIstCrosshairLabel=function(e){const t=oe(e);let i=`${_e[t.weekday]} ${ae(t.day)} ${ue[t.month-1]} '${String(t.year).slice(-2)}`;return 0===t.hour&&0===t.minute&&0===t.second||(i+=` ${ae(t.hour)}:${ae(t.minute)}`,0!==t.second&&(i+=`:${ae(t.second)}`)),i},e.formatIstDate=de,e.formatIstTime=le,e.formatIstTimeSeconds=he,e.formatSubscribe=Nr,e.formatUnsubscribe=Rr,e.formatZonedCrosshairLabel=Le,e.formatZonedDate=je,e.formatZonedTime=Ce,e.formatZonedTimeSeconds=Ie,e.fromGradient=function(e,t,i,s,r){const n=z(s),o=z(r);if(null===n||null===o)return s;const a=(e-t)/(i-t),l=a>0?a<1?a:1:0;return`rgba(${Math.round(n.r+(o.r-n.r)*l)},${Math.round(n.g+(o.g-n.g)*l)},${Math.round(n.b+(o.b-n.b)*l)},${n.a+(o.a-n.a)*l})`},e.generateBars=hn,e.getChartType=J,e.getIndicator=Tt,e.hasIndicator=Ct,e.inSessionAt=function(e,t,i=pe){return Ne(ye(e,i),t)},e.indicatorDefaults=It,e.indicatorStyleInputs=Ot,e.intervalParts=function(e){const t=mr(e);if(null===t)return null;const i=t.bucketing;if("ticks"===i.mode)return{multiplier:i.count,unit:"tick"};if("volume"===i.mode)return{multiplier:i.perBar,unit:"other"};if("calendar"===i.mode)return{multiplier:wr(i),unit:"M"};const s=i.seconds;return s%604800==0?{multiplier:s/604800,unit:"W"}:s%86400==0?{multiplier:s/86400,unit:"D"}:s%3600==0?{multiplier:s/3600,unit:"h"}:s%60==0?{multiplier:s/60,unit:"m"}:{multiplier:s,unit:"s"}},e.intervalToSeconds=function(e){const{bucketing:t}=gr(e);if("interval"!==t.mode)throw new Error(`openalgo-charts: interval "${e}" is ${t.mode}-bucketed and has no fixed length. Use resolveInterval() and bucketStartOf() instead of intervalToSeconds().`);return t.seconds},e.isDailyInterval=function(e){return 86400===kr(e)},e.isIntradayInterval=function(e){const t=kr(e);return t>0&&t<86400},e.isKnownInterval=function(e){return null!==mr(e)},e.isNewIstDay=be,e.isNewZonedDay=Se,e.isNewZonedMonth=Oe,e.isNewZonedPeriod=function(e,t,i,s=pe){switch(i){case"week":return Pe(e,t,s);case"month":return Oe(e,t,s);case"quarter":return Me(e,t,s);case"year":return ke(e,t,s);default:return Se(e,t,s)}},e.isNewZonedQuarter=Me,e.isNewZonedWeek=Pe,e.isNewZonedYear=ke,e.isRebasing=b,e.isReservedCombo=ii,e.isSecondsInterval=function(e){const t=kr(e);return t>0&&t%60!=0},e.isTickInterval=function(e){return"ticks"===mr(e)?.bucketing.mode},e.isTimeBucketed=vr,e.isValidCombo=function(e){return""!==Jt(e)},e.isValidTimezone=ve,e.isWhitespace=function(e){return!("open"in e)&&!("value"in e)},e.istStringToUtcSeconds=ne,e.lastPriceLevelFromSeriesStyle=function(e){return{line:!1!==e.priceLineVisible,label:!1!==e.lastValueVisible}},e.lerp=function(e,t,i){return e+(t-e)*i},e.lightTheme=dt,e.mapHistoryResponse=zr,e.mapOrder=function(e){const t=sn(e);return t.ok?t.order:{id:Zr(e.orderid)??"",symbol:Zr(e.symbol)??"",side:Zr(e.action)??"",type:Zr(e.pricetype)??"",qty:Kr(e.quantity)??0,filledQty:Kr(e.filled_quantity)??0,price:Kr(e.price)??0,status:"unknown",rawStatus:Zr(e.order_status)??""}},e.mapOrderStatus=function(e){return tn[e.trim().toLowerCase()]??"unknown"},e.mapPosition=rn,e.markerSizePx=wi,e.mergeBars=te,e.nextBucketStart=Mr,e.niceTicks=d,e.normalizeCombo=Jt,e.optimalBarWidth=T,e.parseCombo=Xt,e.parseMessage=Vr,e.parseSessionSpec=$e,e.parseTopic=Dr,e.plotStyleKeys=Pt,e.precisionForStep=_,e.readChartSettings=function(e){const t={};for(const i of js(e))for(const s of i.controls)for(const i of s.fields)t[i.key]=i.read(e);return t},e.readSequence=qr,e.registerChartType=X,e.registerIndicator=function(e){kt.set(e.id,e)},e.registerInterval=function(e){const t=fr(e.code);if(""===t)throw new Error("openalgo-charts: interval code must not be empty");return function(e){if("interval"===e.mode&&!(e.seconds>0))throw new Error("openalgo-charts: interval bucketing needs seconds > 0");if("ticks"===e.mode&&!(e.count>=1))throw new Error("openalgo-charts: tick bucketing needs count >= 1");if("volume"===e.mode&&!(e.perBar>0))throw new Error("openalgo-charts: volume bucketing needs perBar > 0");if("calendar"===e.mode&&void 0!==e.count&&!(e.count>=1))throw new Error("openalgo-charts: calendar bucketing needs count >= 1")}(e.bucketing),pr.set(t,e),()=>{pr.get(t)===e&&pr.delete(t)}},e.registerRenderBackend=at,e.registeredChartTypes=function(){return Array.from(K.keys())},e.registeredIndicators=function(){return Array.from(kt.values())},e.registeredIntervals=function(){return Array.from(pr.values())},e.registeredRenderBackends=function(){return Array.from(ot.keys())},e.resolveCrosshairStyle=it,e.resolveGridStyle=S,e.resolveInterval=gr,e.resolvePlotMargins=M,e.resolveRenderBackend=lt,e.resolveScaleStyle=O,e.roundToTick=function(e,t){return t<=0?e:Math.round(e/t)*t},e.rowTimeToUtcSeconds=Ar,e.rsi=tr,e.rsiSeries=function(e,t=14){const i=tr(e.map(e=>e.close),t);return e.map((e,t)=>({time:e.time,open:i[t],high:i[t],low:i[t],close:i[t]}))},e.seriesStyleForLastPriceLevel=function(e){return{priceLineVisible:e.line,lastValueVisible:e.label}},e.sessionFlags=function(e,t,i=pe){const s=new Array(e.length).fill(!1),r="string"==typeof t?$e(t):t;if(null===r)return s;for(let t=0;t<e.length;t++)s[t]=Ne(ye(e[t],i),r);return s},e.sessionStartFlags=ze,e.sessionStartIndices=Ae,e.sharedHistoryRequests=ur,e.snapToDevicePixel=a,e.sourceValue=jt,e.sourceValues=function(e,t){const i=new Array(e.length);for(let s=0;s<e.length;s++)i[s]=jt(e[s],t);return i},e.startOfZonedDay=function(e,t=pe){const i=ye(e,t);return Te(i.year,i.month,i.day,0,0,0,t)},e.startOfZonedMonth=function(e,t=pe){const i=ye(e,t);return Te(i.year,i.month,1,0,0,0,t)},e.startOfZonedWeek=function(e,t=pe){const i=ye(e,t),s=(i.weekday+6)%7,r=new Date(Date.UTC(i.year,i.month-1,i.day-s));return Te(r.getUTCFullYear(),r.getUTCMonth()+1,r.getUTCDate(),0,0,0,t)},e.supertrend=rr,e.supertrendSeries=function(e,t=10,i=3){const s=rr(e,t,i),r=(e,t)=>({time:e,open:t,high:t,low:t,close:t}),n=[],o=[];for(let t=0;t<e.length;t++){const i=s[t],a=Number.isFinite(i.value);n.push(r(e[t].time,a&&-1===i.direction?i.value:NaN)),o.push(r(e[t].time,a&&1===i.direction?i.value:NaN))}return{up:n,down:o}},e.tableOrigin=Ni,e.toBar=Dt,e.trueRange=ir,e.tryResolveInterval=mr,e.unregisterInterval=function(e){return pr.delete(fr(e))},e.unregisterRenderBackend=function(e){return"canvas2d"!==e&&ot.delete(e)},e.utcSecondsToIstDateString=ce,e.utcSecondsToIstParts=oe,e.utcSecondsToZonedDateString=function(e,t=pe){const i=ye(e,t);return`${i.year}-${ae(i.month)}-${ae(i.day)}`},e.utcSecondsToZonedParts=we,e.version=function(){return t},e.verticalGradient=W,e.watermarkRect=Ui,e.withAlpha=B,e.withBarCache=function(e,t){return new bn(e,t)},e.zoneOffsetSeconds=xe,e.zonedDayIndex=function(e,t=pe){return ye(e,t).dayIndex},e.zonedStringToUtcSeconds=function(e,t=pe){const i=e.trim(),s=/^(\d{4})-(\d{2})-(\d{2})(?:[ T](\d{2}):(\d{2})(?::(\d{2}))?)?/.exec(i);if(null===s)throw new Error(`openalgo-charts: unparseable time string "${e}"`);return Te(Number(s[1]),Number(s[2]),Number(s[3]),void 0!==s[4]?Number(s[4]):0,void 0!==s[5]?Number(s[5]):0,void 0!==s[6]?Number(s[6]):0,t)},e.zonedWallClockToUtcSeconds=Te,e.zonedWeekIndex=function(e,t=pe){return Math.floor((ye(e,t).dayIndex+3)/7)},e}({});
//# sourceMappingURL=openalgo-charts.standalone.js.map