@supersolutions/super-chart-web 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +674 -0
- package/README.md +8 -2
- package/dist/annotations.d.ts +124 -0
- package/dist/annotations.js +315 -0
- package/dist/chunk-PTYNDDEE.js +3082 -0
- package/dist/engine.d.ts +147 -0
- package/dist/engine.js +6 -0
- package/dist/index.d.ts +413 -0
- package/dist/index.js +1807 -0
- package/dist/overlays.d.ts +24 -0
- package/dist/overlays.js +109 -0
- package/dist/super-chart.engine.global.js +7 -0
- package/dist/super-chart.global.js +75 -0
- package/package.json +65 -4
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";var SuperChart=(()=>{var Xt=Object.defineProperty;var cs=Object.getOwnPropertyDescriptor;var hs=Object.getOwnPropertyNames;var us=Object.prototype.hasOwnProperty;var ds=(e,t)=>{for(var i in t)Xt(e,i,{get:t[i],enumerable:!0})},ps=(e,t,i,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of hs(t))!us.call(e,r)&&r!==i&&Xt(e,r,{get:()=>t[r],enumerable:!(n=cs(t,r))||n.enumerable});return e};var ms=e=>ps(Xt({},"__esModule",{value:!0}),e);var Po={};ds(Po,{ChartWorkspace:()=>vt,DRAWING_IMAGE_LIMITS:()=>le,DRAWING_TYPES:()=>ke,DrawingImageRenderer:()=>Te,DrawingStore:()=>Oe,ENGINE_CHART_TYPES:()=>Se,EngineChart:()=>Je,EngineIndicators:()=>Fe,SuperChart:()=>vt,WORKSPACE_CHROME_VARS:()=>yt,WORKSPACE_DOCUMENT_LIMITS:()=>pe,WORKSPACE_THEMES:()=>Xe,buildEngineFrame:()=>mt,createDrawingImage:()=>Ut,createPriceScale:()=>pt,drawingAnchorCount:()=>ye,hitTestDrawingGeometry:()=>Ht,paintEngineCursor:()=>Gt,paintEngineFrame:()=>$t,parseWorkspaceDocument:()=>Ve,projectDrawing:()=>Ye,validateDrawingImage:()=>Be});function K(e){return new Array(e).fill(null)}function se(e){return Number.isInteger(e)&&e>=1}function fs(e,t,i){let n=0;for(let r=t;r<=i;r++)n+=e[r];return n}function De(e,t){let i=e.length,n=K(i);if(!se(t))return n;let r=0,s=-1,o=!1,a=0,l=0,c=0;for(let u=0;u<i;u++){let h=e[u];if(h==null){r=0,o=!1;continue}if(r++,Number.isFinite(h)||(s=u),!(r<t)){if(s>u-t){n[u]=fs(e,u-t+1,u),o=!1;continue}if(!o||++c>=t){a=0,l=0;for(let d=u-t+1;d<=u;d++){let p=e[d],m=a+p;l+=Math.abs(a)>=Math.abs(p)?a-m+p:p-m+a,a=m}c=0,o=!0}else{let d=-e[u-t],p=a+d;l+=Math.abs(a)>=Math.abs(d)?a-p+d:d-p+a,a=p,p=a+h,l+=Math.abs(a)>=Math.abs(h)?a-p+h:h-p+a,a=p}n[u]=a+l}}return n}function Ie(e,t){let i=De(e,t);for(let n=0;n<i.length;n++){let r=i[n];r!=null&&(i[n]=r/t)}return i}function Ze(e,t){let i=e.length,n=K(i);if(!se(t))return n;let r=t*(t+1)/2,s=0,o=-1,a=!1,l=0,c=0,u=0;for(let h=0;h<i;h++){let d=e[h];if(d==null){s=0,a=!1;continue}if(s++,Number.isFinite(d)||(o=h),!(s<t)){if(o>h-t){let p=0;for(let m=0;m<t;m++)p+=e[h-t+1+m]*(m+1);n[h]=p/r,a=!1;continue}if(!a||++u>=t){l=0,c=0;for(let p=0;p<t;p++){let m=e[h-t+1+p];l+=m,c+=m*(p+1)}u=0,a=!0}else c=c-l+t*d,l=l-e[h-t]+d;n[h]=c/r}}return n}function $i(e,t){if(!se(t)||t<2)return K(e.length);let i=Ze(e,Math.floor(t/2)),n=Ze(e,t),r=i.map((s,o)=>{let a=n[o];return s==null||a==null?null:2*s-a});return Ze(r,Math.round(Math.sqrt(t)))}function Gi(e,t,i){let n=e.map((a,l)=>{let c=t[l];return a==null||c==null?null:a*c}),r=t.map((a,l)=>e[l]==null?null:a),s=De(n,i),o=De(r,i);return s.map((a,l)=>{let c=o[l];return a==null||c==null||c===0?null:a/c})}function Ee(e,t){let i=e.length,n=K(i);if(!se(t))return n;let r=null,s=0,o=0;for(let a=0;a<i;a++){let l=e[a];l!=null&&(r==null?(s+=l,o++,o===t&&(r=s/t,n[a]=r)):(r=(2*l+(t-1)*r)/(t+1),n[a]=r))}return n}function Qt(e,t){let i=e.length,n=K(i);if(!se(t))return n;let r=null,s=0,o=0;for(let a=0;a<i;a++){let l=e[a];l!=null&&(r==null?(s+=l,o++,o===t&&(r=s/t,n[a]=r)):(r=(r*(t-1)+l)/t,n[a]=r))}return n}function ji(e,t){return t===0?100:e===0?0:100-100/(1+e/t)}function bt(e,t){let i=e.length,n=K(i);if(!se(t))return n;let r=0,s=0,o=null,a=0;for(let l=0;l<i;l++){let c=e[l];if(c==null){o=null;continue}if(o!=null){let u=c-o,h=Math.max(u,0),d=Math.max(-u,0);a<t?(r+=h,s+=d,a++,a===t&&(r/=t,s/=t,n[l]=ji(r,s))):(r=(r*(t-1)+h)/t,s=(s*(t-1)+d)/t,n[l]=ji(r,s))}o=c}return n}function Zt(e,t=12,i=26,n=9,r={}){let s=r.histMultiplier??1,o=Ee(e,t),a=Ee(e,i),l=o.map((h,d)=>{let p=a[d];return h==null||p==null?null:h-p}),c=Ee(l,n),u=l.map((h,d)=>{let p=c[d];return h==null||p==null?null:(h-p)*s});return{dif:l,dea:c,hist:u}}function ei(e,t){let i=e.length,n=K(i);if(!se(t))return n;let r=0,s=-1,o=!1,a=0,l=0,c=0;for(let u=0;u<i;u++){let h=e[u];if(h==null){r=0,o=!1;continue}if(r++,Number.isFinite(h)||(s=u),r<t)continue;if(s>u-t||!o||++c>=t){let m=0;for(let v=u-t+1;v<=u;v++)m+=e[v];let y=m/t,g=0;for(let v=u-t+1;v<=u;v++)g+=(e[v]-y)**2;n[u]=Math.sqrt(g/t),o=!(s>u-t),o&&(a=y,l=g,c=0);continue}let d=e[u-t],p=a+(h-d)/t;l+=(h-d)*(h-p+d-a),a=p,n[u]=Math.sqrt(Math.max(l,0)/t)}return n}function ti(e,t){let i=e.length,n=K(i);if(!se(t))return n;let r=0;for(let s=0;s<i;s++){if(e[s]==null){r=0;continue}if(r++,r<t)continue;let o=0;for(let c=s-t+1;c<=s;c++)o+=e[c];let a=o/t,l=0;for(let c=s-t+1;c<=s;c++)l+=Math.abs(e[c]-a);n[s]=l/t}return n}function xt(e,t,i=2){let n=Ie(e,t),r=ei(e,t),s=n.map((a,l)=>{let c=r[l];return a==null||c==null?null:a+i*c}),o=n.map((a,l)=>{let c=r[l];return a==null||c==null?null:a-i*c});return{basis:n,upper:s,lower:o}}function Ui(e,t,i){let n=e.length,r=K(n);if(!se(t)||t>n)return r;let s=new Int32Array(t),o=0,a=0,l=0,c=-1;for(let u=0;u<n;u++){let h=e[u];if(h==null){l=0,o=0,a=0;continue}if(l++,a>0&&s[o]<=u-t&&(o=o+1===t?0:o+1,a--),Number.isNaN(h))c=u;else{for(;a>0;){let p=o+a-1,m=e[s[p>=t?p-t:p]];if(i?m<=h:m>=h)a--;else break}let d=o+a;s[d>=t?d-t:d]=u,a++}l<t||(r[u]=c>u-t?NaN:a>0?e[s[o]]:i?-1/0:1/0)}return r}function _t(e,t){return Ui(e,t,!0)}function Mt(e,t){return Ui(e,t,!1)}function gs(e,t,i,n){let r=0,s=0,o=0,a=0;for(let h=0;h<i;h++){let d=e[t-i+1+h];r+=h,s+=d,o+=h*h,a+=h*d}let l=i*o-r*r;if(l===0)return s/i;let c=(i*a-r*s)/l;return(s-c*r)/i+c*(i-1-n)}function qi(e,t,i=0){let n=e.length,r=K(n);if(!se(t))return r;let s=t*(t-1)/2,o=(t-1)*t*(2*t-1)/6,a=t*o-s*s,l=0,c=-1,u=0,h=0,d=0,p=t;for(let m=0;m<n;m++){let y=e[m];if(y==null){l=0,p=t;continue}if(l++,Number.isFinite(y)||(c=m),l<t)continue;if(c>m-t){r[m]=gs(e,m,t,i),p=t;continue}if(p>=t){u=e[m-t+1],h=0,d=0;for(let b=0;b<t;b++){let f=e[m-t+1+b]-u;h+=f,d+=b*f}p=0}else{let b=e[m-t]-u,f=y-u;d=d-(h-b)+(t-1)*f,h=h-b+f,p++}if(a===0){r[m]=h/t+u;continue}let g=(t*d-s*h)/a,v=(h-g*s)/t;r[m]=v+g*(t-1-i)+u}return r}var ys=32,ws=64;function Ki(e,t,i){let n=e.length,r=K(n);if(!se(i))return r;let s=0,o=-1,a=!1,l=0,c=0,u=0,h=0,d=0,p=0,m=0,y=0,g=Math.min(i,ws),v=b=>{c=e[b-i+1],u=t[b-i+1],h=0,d=0;for(let f=b-i+1;f<=b;f++)h+=e[f]-c,d+=t[f]-u;h/=i,d/=i,p=0,m=0,y=0;for(let f=b-i+1;f<=b;f++){let w=e[f]-c-h,_=t[f]-u-d;p+=w*w,m+=_*_,y+=w*_}};for(let b=0;b<n;b++){let f=e[b],w=t[b];if(f==null||w==null){s=0,a=!1;continue}if(s++,(!Number.isFinite(f)||!Number.isFinite(w))&&(o=b),s<i)continue;if(o>b-i){let C=0,N=0,I=0,P=0,L=0;for(let M=b-i+1;M<=b;M++){let O=e[M],E=t[M];C+=O,N+=E,I+=O*O,P+=E*E,L+=O*E}let B=C/i,z=N/i,S=Math.sqrt((I/i-B*B)*(P/i-z*z));r[b]=S===0?null:(L/i-B*z)/S,a=!1;continue}if(i<=ys||!a||++l>=g)v(b),l=0,a=!0;else{let C=e[b-i]-c,N=t[b-i]-u,I=f-c,P=w-u,L=I-C,B=P-N,z=h+L/i,S=d+B/i;p+=L*(I-z+C-h),m+=B*(P-S+N-d),y+=L*(P-S)+B*(C-h),h=z,d=S}let _=p<=i*(16*Number.EPSILON*Math.max(Math.abs(c+h),1e-300))**2,D=m<=i*(16*Number.EPSILON*Math.max(Math.abs(u+d),1e-300))**2;r[b]=_||D?null:Math.max(-1,Math.min(1,y/Math.sqrt(p*m)))}return r}function ii(e,t=1){return e.map((i,n)=>{let r=n-t>=0?e[n-t]:null;return i==null||r==null?null:i-r})}function Yi(e,t){return ii(e,t)}function Vi(e,t){return e.map((i,n)=>{let r=n-t>=0?e[n-t]:null;return i==null||r==null||r===0?null:100*(i-r)/r})}function Ji(e,t){return e.map((i,n)=>{let r=e[n-1],s=t[n-1],o=t[n];return i==null||o==null||r==null||s==null?null:r<=s&&i>o?1:0})}function Xi(e,t){return e.map((i,n)=>{let r=e[n-1],s=t[n-1],o=t[n];return i==null||o==null||r==null||s==null?null:r>=s&&i<o?1:0})}function Qi(e,t){return e.map((i,n)=>{let r=e[n-1],s=t[n-1],o=t[n];return i==null||o==null||r==null||s==null?null:r<=s&&i>o||r>=s&&i<o?1:0})}function Zi(e){let t=K(e.length),i=0;for(let n=0;n<e.length;n++){let r=e[n];r!=null&&(i+=r,t[n]=i)}return t}function en(e){let t=K(e.length),i=null;for(let n=0;n<e.length;n++){let r=e[n];r!=null&&r!==0?i=0:i!=null&&i++,t[n]=i}return t}function tn(e,t,i=0){let n=K(e.length);if(i===0){let a;for(let l=0;l<e.length;l++){let c=e[l];c!=null&&c!==0&&(a=l),n[l]=a===void 0?null:t[a]}return n}if(!Number.isInteger(i)||i<0||i>=e.length)return n;let r=[],s=i+1,o=0;for(let a=0;a<e.length;a++){let l=e[a];l!=null&&l!==0&&(r[o]=a,o=(o+1)%s);let c=r.length===s?r[o]:void 0;n[a]=c==null?null:t[c]}return n}function nn(e,t,i,n){let r=t+i+1;return r>=64&&r<=e.length&&Number.isSafeInteger(t)&&Number.isSafeInteger(i)&&t>=0&&i>=0&&e.every(s=>s==null||Number.isFinite(s))?vs(e,r,i,n):bs(e,t,i,n)}function vs(e,t,i,n){let r=K(e.length),s=new Int32Array(t),o=0,a=0,l=0;for(let c=0;c<e.length;c++){let u=e[c];if(u==null){o=0,a=0,l=0;continue}for(l++,a>0&&s[o]<=c-t&&(o=o+1===t?0:o+1,a--);a>0;){let p=o+a-1,m=e[s[p>=t?p-t:p]];if(n==="high"?m<u:m>u)a--;else break}let h=o+a;s[h>=t?h-t:h]=c,a++;let d=c-i;l>=t&&s[o]===d&&(r[c]=e[d])}return r}function bs(e,t,i,n){let r=K(e.length);for(let s=t;s<e.length-i;s++){let o=e[s];if(o==null)continue;let a=!0;for(let l=s-t;l<=s+i;l++){if(l===s)continue;let c=e[l];if(c==null){a=!1;break}if(n==="high"?c>o:c<o){a=!1;break}if(c===o&&l<s){a=!1;break}}a&&(r[s+i]=o)}return r}function ni(e,t,i){return e.map((n,r)=>{let s=t[r],o=r>0?i[r-1]:null;return n==null||s==null?null:o==null?n-s:Math.max(n-s,Math.abs(n-o),Math.abs(s-o))})}function it(e,t,i,n){return Qt(ni(e,t,i),n)}function rn(e,t){let i=K(e.length),n=0,r=null;for(let s=0;s<e.length;s++){let o=e[s],a=t[s]??0;o!=null&&(r!=null&&(n+=o>r?a:o<r?-a:0),i[s]=n,r=o)}return i}function sn(e,t,i,n){let r=K(i.length),s=0,o=0;for(let a=0;a<i.length;a++){let l=e[a],c=t[a],u=i[a],h=n[a]??0;l==null||c==null||u==null||(s+=(l+c+u)/3*h,o+=h,r[a]=o===0?null:s/o)}return r}function on(e,t,i){return e.map((n,r)=>{let s=t[r],o=i[r];return n==null||s==null||o==null?null:(n+s+o)/3})}function an(e,t,i,n){let r=on(e,t,i),s=Ie(r,n),o=ti(r,n);return r.map((a,l)=>{let c=s[l],u=o[l];return a==null||c==null||u==null||u===0?null:(a-c)/(.015*u)})}function ln(e,t,i,n,r){let s=i.length,o=on(e,t,i),a=new Array(s).fill(0),l=new Array(s).fill(0);for(let h=1;h<s;h++){let d=o[h],p=o[h-1],m=n[h]??0;d==null||p==null||(d>p?a[h]=d*m:d<p&&(l[h]=d*m))}let c=De(a,r),u=De(l,r);return c.map((h,d)=>{let p=u[d];return h==null||p==null?null:p===0?100:100-100/(1+h/p)})}function kt(e,t,i,n){let r=_t(e,n),s=Mt(t,n);return i.map((o,a)=>{let l=r[a],c=s[a];if(o==null||l==null||c==null)return null;let u=l-c;return u===0?0:100*(o-c)/u})}function cn(e,t,i=.02,n=.02,r=.2){let s=e.length,o=K(s);if(s<2)return o;let a=e[0],l=t[0],c=e[1],u=t[1];if(a==null||l==null||c==null||u==null)return o;let h=c>=a,d=i,p=h?c:u,m=h?l:a;for(let y=1;y<s;y++){let g=e[y],v=t[y];g==null||v==null||(m=m+d*(p-m),h?v<m?(h=!1,m=p,p=v,d=i):g>p&&(p=g,d=Math.min(d+n,r)):g>m?(h=!0,m=p,p=g,d=i):v<p&&(p=v,d=Math.min(d+n,r)),o[y]=m)}return o}function hn(e,t){return e.map((i,n)=>{let r=t[n];return i==null||r==null?null:(i+r)/2})}function ri(e,t){return kt(e,e,e,t)}function un(e,t,i,n,r){let s=Ie(ri(bt(e,t),i),n);return{k:s,d:Ie(s,r)}}function dn(e,t,i=2){let{upper:n,lower:r}=xt(e,t,i);return e.map((s,o)=>{let a=n[o],l=r[o];return s==null||a==null||l==null||a===l?null:(s-l)/(a-l)})}function pn(e,t,i,n=20,r=2,s=10){let o=Ee(i,n),a=it(e,t,i,s),l=c=>o.map((u,h)=>{let d=a[h];return u==null||d==null?null:u+c*r*d});return{basis:o,upper:l(1),lower:l(-1)}}function et(e,t,i=20){let n=_t(e,i),r=Mt(t,i);return{basis:hn(n,r),upper:n,lower:r}}function mn(e,t,i,n=14,r=2){let s=it(e,t,i,n),o=a=>i.map((l,c)=>{let u=s[c];return l==null||u==null?null:l+a*r*u});return{basis:i.slice(),upper:o(1),lower:o(-1)}}function fn(e,t,i,n=10,r=3){let s=i.length,o=K(s),a=K(s),l=it(e,t,i,n),c=0,u=0,h=null,d=null;for(let p=0;p<s;p++){let m=e[p],y=t[p],g=i[p],v=l[p];if(m==null||y==null||g==null||v==null){d=v??null;continue}let b=(m+y)/2,f=p>0?i[p-1]:null,w=b+r*v,_=b-r*v;_=_>u||f!=null&&f<u?_:u,w=w<c||f!=null&&f>c?w:c;let D;d==null?D=!1:h===c?D=g>w:D=!(g<_);let C=D?_:w;o[p]=C,a[p]=D?1:-1,c=w,u=_,h=C,d=v}return{line:o,trend:a}}function gn(e,t,i,n=9,r=26,s=52,o=26){let a=i.length,l=et(e,t,n).basis,c=et(e,t,r).basis,u=hn(l,c),h=et(e,t,s).basis,d=Math.max(0,Math.floor(o)-1),p=K(a),m=K(a),y=K(a);for(let b=0;b<a;b++)b-d>=0&&(p[b]=u[b-d],m[b]=h[b-d]),b+d<a&&(y[b]=i[b+d]);let g=K(d),v=K(d);for(let b=0;b<d;b++){let f=a-d+b;f>=0&&(g[b]=u[f],v[b]=h[f])}return{conversion:l,base:c,spanA:p,spanB:m,lagging:y,futureA:g,futureB:v}}function yn(e,t,i,n,r,s=!1){let o=i.length,a=K(o),l=K(o),c=null,u=-1,h=0,d=0,p=0,m=0;for(let y=0;y<o;y++){let g=r[y],v=e[y],b=t[y],f=i[y];if(g==null||v==null||b==null||f==null)continue;let w=(v+b+f)/3;g!==c&&(c=g,u++,h=w,d=0,p=0,m=0);let _=n[y]??0,D=w-h;if(d+=_,p+=_*D,m+=_*D*D,!(s&&u===0)&&d>0){let C=p/d;a[y]=h+C,l[y]=Math.sqrt(Math.max(0,m/d-C*C))}}return{vwap:a,stdev:l}}var xs=new WeakMap;function si(e){return xs.get(e)}var _s=new WeakMap;function wn(e){return _s.get(e)}var tt;function vn(e,t){let i=tt;tt={bars:e,fields:new Map};try{return t()}finally{tt=i}}function bn(e,t,i="raw"){let n=tt?.bars===e?tt.fields:void 0,r=i+":"+t,s=n?.get(r);if(s!==void 0)return s;let o=new Array(e.length);for(let a=0;a<e.length;a++){let l=e[a][t];o[a]=typeof l!="number"||i!=="raw"&&!Number.isFinite(l)||i==="volume"&&l<0?null:l}return n?.set(r,o),o}function ut(e,t){if(e.length===0||!Number.isFinite(t))return null;let i=0,n=e.length;for(;i<n;){let r=i+Math.floor((n-i)/2);e[r].timestamp<t?i=r+1:n=r}return i===0?0:i===e.length||t-e[i-1].timestamp<=e[i].timestamp-t?i-1:i}var Ms=1e11;function Kn(){return{notArray:!1,dropped:0,duplicates:0,unsorted:!1,seconds:!1,coerced:!1}}function Ne(e){return typeof e=="number"?e:typeof e=="string"&&e.trim()!==""?Number(e):NaN}function Mi(e){return typeof e=="object"&&e!==null}function at(e){if(!Array.isArray(e))return;let t=-1/0;for(let i of e)if(Mi(i)){let n=Ne(i.timestamp);Number.isFinite(n)&&n>t&&(t=n)}if(t!==-1/0)return t<Ms?1e3:1}function xn(e){return e==null||typeof e=="number"&&Number.isFinite(e)}function ks(e,t){if(t!==1)return!1;let i=-1/0;for(let n of e){if(!Mi(n))return!1;let{timestamp:r,open:s,high:o,low:a,close:l}=n;if(typeof r!="number"||typeof s!="number"||typeof o!="number"||typeof a!="number"||typeof l!="number"||!Number.isFinite(r)||!Number.isFinite(s)||!Number.isFinite(o)||!Number.isFinite(a)||!Number.isFinite(l)||r<=i||!xn(n.volume)||!xn(n.turnover))return!1;i=r}return!0}function Pt(e,t,i=Kn()){if(!Mi(e))return i.dropped++,null;let n=Ne(e.timestamp)*t,r=Ne(e.open),s=Ne(e.high),o=Ne(e.low),a=Ne(e.close);if(!Number.isFinite(n)||!Number.isFinite(r)||!Number.isFinite(s)||!Number.isFinite(o)||!Number.isFinite(a))return i.dropped++,null;(typeof e.timestamp!="number"||typeof e.open!="number"||typeof e.high!="number"||typeof e.low!="number"||typeof e.close!="number")&&(i.coerced=!0);let l={...e,timestamp:n,open:r,high:s,low:o,close:a};for(let c of["volume","turnover"]){let u=e[c];if(u==null)continue;let h=Ne(u);typeof u!="number"&&(i.coerced=!0),l[c]=Number.isFinite(h)?h:void 0}return l}function de(e,t){let i=Kn();if(!Array.isArray(e))return i.notArray=!0,{bars:[],unit:t??1,issues:i};let n=t??at(e)??1;if(ks(e,n))return{bars:e,unit:n,issues:i};i.seconds=n===1e3;let r=[],s=!0;for(let a of e){let l=Pt(a,n,i);l!==null&&(r.length>0&&l.timestamp<r[r.length-1].timestamp&&(s=!1),r.push(l))}s||(i.unsorted=!0,r.sort((a,l)=>a.timestamp-l.timestamp));let o=0;for(let a of r){let l=o>0?r[o-1]:void 0;l!==void 0&&l.timestamp===a.timestamp?(r[o-1]=a,i.duplicates++):r[o++]=a}return r.length=o,{bars:r,unit:n,issues:i}}function Yn(e,t){if(t===void 0)return e.slice();let i=0;for(;i<e.length&&e[i].timestamp<t;)i++;return e.slice(0,i)}function Ss(e,t,i){return Math.min(i,Math.max(t,e))}function Ke(e){let t=1/0,i=1/0,n=-1/0;for(let o of e)for(let a of[o.open,o.high,o.low,o.close])typeof a!="number"||!Number.isFinite(a)||(a>0&&a<t&&(t=a),a<i&&(i=a),a>n&&(n=a));if(!Number.isFinite(t))return 2;let r=Ss(Math.ceil(-Math.log10(t))+3,2,10),s=n-i;if(Number.isFinite(s)&&s>0)for(;r<10&&s<10**-r;)r++;return r}function At(e,t){return typeof e=="number"?e:Ke(t)}var Vn=class{constructor(e,t,i=0){this._apply=e,this._sched=t,this._throttleMs=i}_pending=[];_frame=null;_timer=null;_lastFlush=-1/0;lastTs(){return this._pending[this._pending.length-1]?.timestamp}get size(){return this._pending.length}push(e){let t=this._pending[this._pending.length-1];if(t!==void 0){if(e.timestamp<t.timestamp)return!1;if(e.timestamp===t.timestamp)return this._pending[this._pending.length-1]=e,!0}return this._pending.push(e),this._schedule(),!0}flush(){if(this._cancelHandles(),this._pending.length===0)return;let e=this._pending;this._pending=[],this._lastFlush=this._sched.now(),this._apply(e)}cancel(){this._cancelHandles(),this._pending=[]}visibilityChanged(){this._pending.length>0&&(this._cancelHandles(),this._schedule())}_schedule(){if(this._frame!==null||this._timer!==null)return;let e=this._sched;if(this._throttleMs>0){let t=Math.max(0,this._lastFlush+this._throttleMs-e.now());this._timer=e.setTimeout(()=>{this._timer=null,this.flush()},t)}else!e.hidden()&&e.requestFrame!==void 0?this._frame=e.requestFrame(()=>{this._frame=null,this.flush()}):this._timer=e.setTimeout(()=>{this._timer=null,this.flush()},0)}_cancelHandles(){this._frame!==null&&(this._sched.cancelFrame?.(this._frame),this._frame=null),this._timer!==null&&(this._sched.clearTimeout(this._timer),this._timer=null)}};function dt(e,t,i=52,n=12){let r=Math.max(1,e),s=Math.max(1,t),o=Math.max(52,Math.min(i,r*.34)),a=Math.max(o+1,r-Math.max(12,Math.min(n,r*.34))),l=12,c=Math.max(l+1,s-34);return{width:r,height:s,left:o,right:a,top:l,bottom:c,plotWidth:a-o,plotHeight:c-l}}function yi(e){if(typeof e=="number")return e;let t=Number(e);return Number.isFinite(t)?t:Date.parse(e)}function _n(e,t){return String(t==="category"?e:yi(e))}function Jn(e){return Number.isFinite(e.o)&&Number.isFinite(e.h)&&Number.isFinite(e.l)&&Number.isFinite(e.c)&&e.h>=Math.max(e.o,e.c)&&e.l<=Math.min(e.o,e.c)}function Xn(e){let t=new Map,i=l=>{if(typeof l=="number")return l;let c=Number(l);if(Number.isFinite(c))return c;let u=t.get(l);return u===void 0&&(u=Date.parse(l),t.set(l,u)),u},n=e.series??[],r=n.reduce((l,c)=>l==null||c.points.length>l.points.length?c:l,null),s=new Set,o=[],a=l=>{if(e.xType!=="category"&&!Number.isFinite(i(l)))return;let c=e.xType==="category"?String(l):String(i(l));s.has(c)||(s.add(c),o.push(l))};for(let l of e.candles??[])Jn(l)&&a(l.t);if(r!=null)for(let l of r.points)Number.isFinite(l[1])&&a(l[0]);for(let l of n)for(let c of l.points)Number.isFinite(c[1])&&a(c[0]);return e.xType==="category"?o:o.sort((l,c)=>i(l)-i(c))}function Mn(e,t,i=3){if(e===t)return[e];let n=(t-e)/i,r=10**Math.floor(Math.log10(n)),s=[1,2,5,10].map(a=>a*r).find(a=>a>=n)??10*r,o=[];for(let a=Math.ceil(e/s)*s;a<=t+s*.001;a+=s)o.push(Number(a.toFixed(10)));return o.length>0?o:[e,t]}function kn(e,t){if(e.length===0)return[0,1];let i=1/0,n=-1/0;for(let s of e)i=Math.min(i,s),n=Math.max(n,s);let r=n>i?(n-i)*.12:Math.max(Math.abs(n)*.05,.01);return[t?Math.min(0,i):i-r,t?Math.max(.01,n+r):n+r]}function Qn(e,t,i,n=52,r,s=52){let o=new Map,a=x=>{if(typeof x=="number"||e.xType==="category")return _n(x,e.xType);let F=o.get(x);return F===void 0&&(F=_n(x,e.xType),o.set(x,F)),F},l=Xn(e),c=Math.max(0,Math.min(r?.start??0,Math.max(0,l.length-1))),u=Math.max(c+1,Math.min(r?.end??l.length,l.length)),h=l.slice(c,u),d=new Set(h.map(x=>a(x))),p=e.series??[],m=(e.candles??[]).filter(x=>Jn(x)&&d.has(a(x.t))),y=p.some(x=>x.axis==="right"),g=dt(t,i,n,y?s:12),v=new Map(h.map((x,F)=>[a(x),F])),b=p.map(x=>({source:x,points:x.points.filter(F=>d.has(a(F[0]))&&Number.isFinite(F[1]))})),f=m.flatMap(x=>[x.h,x.l]).filter(Number.isFinite),w=[];for(let{source:x,points:F}of b){let H=x.axis==="right"?w:f;for(let R of F)H.push(R[1])}if(e.stacked)for(let x of["left","right"]){let F=new Map;for(let{source:R,points:j}of b)if(!(R.type!=="bar"||(R.axis??"left")!==x))for(let $ of j){let G=a($[0]),A=F.get(G);A==null&&(A=[0,0],F.set(G,A)),A[$[1]>=0?0:1]+=$[1]}let H=x==="right"?w:f;for(let R of h){let j=F.get(a(R));H.push(j?.[0]??0,j?.[1]??0)}}let _=e.scale==="zero"||e.scale!=="tight"&&p.length>0&&p.every(x=>x.type==="bar"),[D,C]=kn(f,_||p.some(x=>x.type==="bar"&&(x.axis??"left")==="left")),[N,I]=kn(w,_||p.some(x=>x.type==="bar"&&x.axis==="right")),P=e.xType==="category"?[]:h.map(yi),L=P[0]??0,B=P[P.length-1]??1,z=(x,F)=>e.xType==="category"?g.left+(h.length<2?g.plotWidth/2:F/(h.length-1)*g.plotWidth):g.left+(B===L?g.plotWidth/2:(yi(x)-L)/(B-L)*g.plotWidth),S=(x,F="left")=>{let H=F==="right"?N:D,R=F==="right"?I:C;return g.bottom-(x-H)/(R-H)*g.plotHeight},M=h.map((x,F)=>z(x,F)),O=h.length<3?h.map((x,F)=>F):[...new Set([0,Math.floor((h.length-1)/2),h.length-1])],E=b.map(({source:x,points:F})=>({source:x,points:F.map(([H,R])=>{let j=v.get(a(H))??0;return{x:z(H,j),y:S(R,x.axis),value:R,key:H,index:j}}).filter(H=>Number.isFinite(H.x)&&Number.isFinite(H.y))})),k=m.map(x=>{let F=v.get(a(x.t))??0;return{...x,x:z(x.t,F),bodyTop:S(Math.max(x.o,x.c)),bodyBottom:S(Math.min(x.o,x.c)),wickTop:S(x.h),wickBottom:S(x.l),index:F}});return o.clear(),{geometry:g,min:D,max:C,yTicks:Mn(D,C),rightMin:N,rightMax:I,rightTicks:y?Mn(N,I):[],hasRightAxis:y,xKeys:h,allKeys:l,start:c,end:u,xPositions:M,xTickIndices:O,plottedSeries:E,plottedCandles:k,x:z,y:S}}function Ft(e,t){if(e.xPositions.length===0)return null;let i=e.xPositions;if(!Number.isFinite(t))return 0;if(!Number.isFinite(i[0])||!Number.isFinite(i[i.length-1])){let a=0;for(let l=1;l<i.length;l++)Math.abs(i[l]-t)<Math.abs(i[a]-t)&&(a=l);return a}let n=a=>{let l=0,c=i.length;for(;l<c;){let u=l+c>>>1;i[u]<a?l=u+1:c=u}return l},r=n(t),s=Math.max(0,r-1),o=r<i.length&&Math.abs(i[r]-t)<Math.abs(i[s]-t)?r:s;return n(i[o])}var Zn=12;function ge(e={}){let t=e.minBars??Zn,i=e.maxBars??Number.MAX_SAFE_INTEGER,n=e.rightPaddingBars??0;if(!Number.isSafeInteger(t)||t<1||!Number.isSafeInteger(i)||i<t||!Number.isSafeInteger(n)||n<0)throw new RangeError("Viewport bounds must be safe integers: 1 <= minBars <= maxBars, rightPaddingBars >= 0");return{minBars:t,maxBars:i,rightPaddingBars:n}}var ki=90;function Si(e,t=ki,i){if(!Number.isFinite(e)||e<=0)return{i0:0,i1:0};let n=ge(i),r=Math.min(Number.MAX_SAFE_INTEGER,e+n.rightPaddingBars),s=Math.max(1,Math.min(t,r,n.maxBars));return Re({i0:r-s,i1:r-1},e,n)}function Re(e,t,i){if(!Number.isFinite(t)||t<=0)return{i0:0,i1:0};let n=ge(i);if(!Number.isFinite(e.i0)||!Number.isFinite(e.i1))return Si(t,ki,n);let r=Math.min(Number.MAX_SAFE_INTEGER,t+n.rightPaddingBars),s=Math.min(n.minBars,r),o=Math.round(e.i0),a=Math.round(e.i1);a<o&&([o,a]=[a,o]);let l=Math.max(s,Math.min(a-o+1,r,n.maxBars));return o=Math.max(0,Math.min(o,r-l,t-1)),a=o+l-1,a>r-1&&(a=r-1,l=a-o+1),{i0:o,i1:a}}function ae(e){return e.i1-e.i0+1}function er(e,t,i,n,r){if(t<=0||!Number.isFinite(i)||i<=0||!Number.isFinite(n))return Re(e,t,r);let s=ae(e),o=ge(r),a=Math.min(Number.MAX_SAFE_INTEGER,t+o.rightPaddingBars),l=Math.min(o.minBars,a),c=Math.max(l,Math.min(a,o.maxBars,Math.round(s/i))),u=Math.max(0,Math.min(1,n)),h=e.i0+u*(s-1),d=Math.round(h-u*(c-1));return Re({i0:d,i1:d+c-1},t,r)}function tr(e,t,i,n){if(t<=0||!Number.isFinite(i))return Re(e,t,n);let r=Math.round(i);return Re({i0:e.i0+r,i1:e.i1+r},t,n)}function Bt(e,t={}){let i=ge(t),n=t.minCandleSpacing??1.5,r=t.maxCandleSpacing??40;if(!Number.isFinite(e)||!Number.isFinite(n)||n<=0||!Number.isFinite(r)||r<n)throw new RangeError("Viewport density requires a finite width and positive ordered candle spacing");if(e<=0)return i;let s=Math.min(i.maxBars,Math.max(i.minBars,Math.floor(e/n)+1)),o=Math.min(s,Math.max(i.minBars,Math.ceil(e/r)+1));return{...i,minBars:o,maxBars:s}}function ir(e={}){let t=globalThis;return{now:()=>Date.now(),setTimeout:(i,n)=>setTimeout(i,n),clearTimeout:i=>{clearTimeout(i)},hidden:()=>e.visibility?.hidden===!0,queueMicrotask:i=>{typeof t.queueMicrotask=="function"?t.queueMicrotask(i):Promise.resolve().then(i)},warn:(...i)=>{console.warn(...i)},...e}}var Ts=new Set(["name","shortName","logo","pricePrecision","volumePrecision","timezone"]);function ne(e){if(typeof e!="object"||e===null)return String(e);let t=Object.entries(e).filter(([i,n])=>!Ts.has(i)&&n!==void 0).sort(([i],[n])=>i<n?-1:i>n?1:0);return JSON.stringify(t)}function te(e){return e==null?"":`${e.multiplier}:${e.timespan}`}var Es={s:"second",S:"second",m:"minute",h:"hour",H:"hour",d:"day",D:"day",w:"week",W:"week",M:"month",y:"year",Y:"year"};function Ti(e){let t=String(e).trim();if(/^\d+$/.test(t)){let r=Number(t);return r>0?r%60===0?{multiplier:r/60,timespan:"hour"}:{multiplier:r,timespan:"minute"}:null}let i=/^(\d*)\s*([sSmhHdDwWMyY])$/.exec(t);if(i===null)return null;let n=i[1]===""?1:Number(i[1]);return n>0?{multiplier:n,timespan:Es[i[2]]}:null}function lt(e,t){return`${ne(e)}|${te(t)}`}var nr=class{_max;_ttl;_entries=new Map;constructor(e={}){this._max=Math.max(1,Math.floor(e.max??8)),this._ttl=Math.max(0,e.ttlMs??6e5)}get size(){return this._entries.size}get(e,t){let i=this._entries.get(e);if(i!==void 0){if(t-i.at>this._ttl||i.bars.length===0){this._entries.delete(e);return}return this._entries.delete(e),this._entries.set(e,i),i}}set(e,t){if(this._entries.delete(e),t.bars.length!==0)for(this._entries.set(e,t);this._entries.size>this._max;){let i=this._entries.keys().next().value;this._entries.delete(i)}}invalidate(e,t){if(e===void 0){this._entries.clear();return}if(t!==void 0){this._entries.delete(lt(e,t));return}let i=`${ne(e)}|`;for(let n of[...this._entries.keys()])n.startsWith(i)&&this._entries.delete(n)}};function Ds(e,t){let i=0,n=e.length-1;for(;i<=n;){let r=i+n>>1,s=e[r].timestamp;if(s===t)return r;s<t?i=r+1:n=r-1}return-1}function rr(e,t){if(e.length===0||t.length===0)return"replace";let i=e[e.length-1].timestamp;if(t[0].timestamp>i||t[t.length-1].timestamp<i)return"replace";let n=-1;for(let r of t){if(r.timestamp>i)break;let s=n+1;if(n=s<e.length&&e[s].timestamp===r.timestamp?s:Ds(e,r.timestamp),n<0)return"replace"}return"tail"}var sr=3;function or(e,t){let i=e[e.length-1];if(i===void 0||t.timestamp>i.timestamp)return[...e,t];if(t.timestamp===i.timestamp){let n=e.slice();return n[n.length-1]=t,n}return e}function ar(e,t){if(e.length<sr)return null;let i=t??Math.floor(e.length*.6);return{full:e.slice(),idx:lr(i,e.length)}}function lr(e,t){return Math.max(0,Math.min(t-1,Math.trunc(e)))}function cr(e,t){let i=lr(e.idx+t,e.full.length);return i===e.idx?e:{full:e.full,idx:i}}function wi(e,t){let i=or(e.full,t);return i===e.full?e:{full:i,idx:e.idx}}function hr(e,t){return t.length===0?e:{full:t.concat(e.full),idx:e.idx+t.length}}function Ei(e){return e.full.slice(0,e.idx+1)}function ur(e){return e.idx>=e.full.length-1}function dr(e,t,i){if(t===e)return{kind:"none"};let n=e.full[e.idx];return t.full===e.full&&t.idx===e.idx+1&&n!==void 0&&i===n.timestamp?{kind:"append",bar:t.full[t.idx]}:{kind:"rebuild",bars:Ei(t)}}var Nt={second:1e3,minute:6e4,hour:36e5,day:864e5,week:6048e5},Sn=new Set;function Is(e){Sn.has(e)||(Sn.add(e),console.warn(`[super-chart] unknown period timespan ${JSON.stringify(e)}; expected second, minute, hour, day, week, month or year.`))}function Rt(e,t,i){let n=i*e.multiplier,r=Nt[e.timespan];if(r!==void 0)return t+n*r;if(e.timespan==="month"||e.timespan==="year"){let s=new Date(t),o=e.timespan==="month"?n:n*12;return Date.UTC(s.getUTCFullYear(),s.getUTCMonth()+o,s.getUTCDate(),s.getUTCHours(),s.getUTCMinutes(),s.getUTCSeconds(),s.getUTCMilliseconds())}return NaN}function Dt(e,t,i){let n;if(e.timespan==="month"){let r=new Date(t);n=Date.UTC(r.getUTCFullYear(),r.getUTCMonth()-i*e.multiplier,1)}else if(e.timespan==="year"){let r=new Date(t);n=Date.UTC(r.getUTCFullYear()-i*e.multiplier,0,1)}else Nt[e.timespan]!==void 0?n=t-i*e.multiplier*Nt[e.timespan]:(Is(String(e.timespan)),n=t);return Number.isFinite(n)||(n=0),[Math.min(Math.max(0,n),t),t]}function oi(e){if(e!==null&&typeof e=="object"&&!Array.isArray(e)&&Array.isArray(e.bars)){let t=e;return{bars:t.bars,noData:t.noData===!0}}return{bars:e,noData:!1}}function St(e){if(e?.getLastTimestamp!==void 0)return e.getLastTimestamp();let t=e?.getDataList();return t!==void 0&&t.length>0?t[t.length-1].timestamp:void 0}function vi(e,t){for(let i=1;i<e.length;i++){let n=Rt(t,e[i-1].timestamp,2);if(Number.isFinite(n)&&e[i].timestamp>=n)return!0}return!1}function We(e){return`${String(e.symbol?.ticker)} ${String(e.period?.text??`${e.period?.multiplier} ${e.period?.timespan}`)}`}var nt=2147483647;function Ns(e,t,i,n){if(!Number.isSafeInteger(t)||t<i||t>n)throw new RangeError(`Loader option ${e} must be an integer from ${i} to ${n}, got ${String(t)}`);return t}function ze(e,t,i,n){if(!Number.isFinite(t)||t<i||t>n)throw new RangeError(`Loader option ${e} must be from ${i} to ${n} milliseconds, got ${String(t)}`);return t}var Di=class{_env;_datafeed;_count;_timeoutMs;_syncMinMs;_syncTimeoutMs;_moreRetry;_coalescer;_cache;_chart=null;_reqAbort=null;_moreAbort=null;_syncAbort=null;_disposed=!1;_detach=[];_listeners={status:new Set,error:new Set,replay:new Set,bars:new Set};_pending=null;_scheduled=!1;_current=null;_reqGen=0;_shownGen=0;_shown=null;_subscribed=null;_status={state:"idle",loadingMore:!1,error:null};_unit;_more=!1;_moreGen=0;_moreFailures=0;_moreTimer=null;_loadUntilBusy=!1;_pendingOlderPage=null;_syncGen=0;_syncing=!1;_syncTimer=null;_held=[];_lastSyncAt=-1/0;_hiddenAt=null;_sparse=!1;_replay=null;_warned=new Set;constructor(e){if(this._env=ir(e.env),this._datafeed=e.datafeed,this._count=Ns("count",e.count??500,1,1e6),this._timeoutMs=ze("loadTimeoutMs",e.loadTimeoutMs??2e4,1,nt),this._syncMinMs=ze("syncMinIntervalMs",e.syncMinIntervalMs??3e4,0,Number.MAX_SAFE_INTEGER),this._syncTimeoutMs=ze("syncTimeoutMs",e.syncTimeoutMs??1e4,1,nt),this._moreRetry=e.moreRetryMs===void 0?{base:1e3,max:3e4}:{base:ze("moreRetryMs.base",e.moreRetryMs.base,1,nt),max:ze("moreRetryMs.max",e.moreRetryMs.max,1,nt)},e.tickThrottleMs!==void 0&&!Number.isFinite(e.tickThrottleMs))throw new RangeError("Loader option tickThrottleMs must be a finite number of milliseconds");let t=ze("tickThrottleMs",Math.max(0,e.tickThrottleMs??0),0,nt);this._coalescer=new Vn(i=>{this._applyTicks(i)},this._env,t),this._cache=e.historyCache===void 0||e.historyCache===!1?null:new nr(e.historyCache)}on(e,t){return this._listeners[e].add(t),()=>{this._listeners[e].delete(t)}}get status(){return this._status}get shown(){return this._shown}get disposed(){return this._disposed}attach(e){this._disposed||this._chart!==null||(this._chart=e,typeof e.setLoadDataCallback=="function"?e.setLoadDataCallback(t=>{if(t.type!=="forward"){t.callback([],!1);return}this._loadOlder(t.data?.timestamp??null,(i,n)=>{t.callback(i,n)})}):typeof e.loadMore=="function"&&e.loadMore(t=>{this._loadOlder(t??null,(i,n)=>{this._chart?.applyMoreData(i,n)})}),this._listen(),this._pending!==null&&this._schedule())}request(e,t){this._disposed||(this._pending={symbol:e,period:t},this._schedule())}reload(){this._disposed||(this._pending=this._pending??this._current,this._pending!==null&&this._schedule())}resync(){this._canSync()&&this._startSync(null)}primeHistory(e,t,i){if(this._cache===null||i.length===0)return;let{bars:n}=de(i.slice());this._cache.set(lt(e,t),{bars:n,more:!0,at:this._env.now()})}invalidateHistory(e,t){this._cache?.invalidate(e,t)}async loadUntil(e,t=20){if(this._disposed||this._chart===null||this._shownGen!==this._reqGen||this._loadUntilBusy)return{covered:!1};this._loadUntilBusy=!0;let i=this._reqGen;try{for(let r=0;r<t;r++){if(!this._isCurrent(i)||this._shownGen!==i||this._chart===null)return{covered:!1};let s=this._chart.getDataList(),o=s.length>0?s[0].timestamp:null;if(o!==null&&o<=e)return{covered:!0};if(!this._more||o===null)return{covered:!1};let a=await this._awaitOlderPage(o);if(a===null||!this._isCurrent(i)||this._shownGen!==i||this._chart===null)return{covered:!1};if(a.bars.length===0)return{covered:!1};this._chart.applyMoreData(a.bars,a.more)}let n=this._chart?.getDataList()??[];return{covered:n.length>0&&n[0].timestamp<=e}}finally{this._loadUntilBusy=!1}}async _awaitOlderPage(e){return await new Promise(t=>{let i=!1,n=null,r=s=>{i||(i=!0,n!==null&&this._env.clearTimeout(n),this._pendingOlderPage===r&&(this._pendingOlderPage=null),t(s))};this._pendingOlderPage=r,n=this._env.setTimeout(()=>{r(null)},this._timeoutMs),this._loadOlder(e,(s,o)=>{r({bars:s,more:o})})})}dispose(){if(!this._disposed){this._disposed=!0,this._reqGen++,this._pending=null,this._retire(),this._replay=null;for(let e of this._detach)e();this._detach=[],this._chart=null;for(let e of Object.values(this._listeners))e.clear()}}get replaying(){return this._replay!==null}get replayAtEnd(){return this._replay===null||ur(this._replay)}get replayInfo(){let e=this._replay;return e===null?null:{index:e.idx,length:e.full.length,timestamp:e.full[e.idx]?.timestamp??NaN}}enterReplay(e){let t=this._chart;if(t===null||this._disposed||this._replay!==null||this._shownGen!==this._reqGen||this._status.state!=="ready")return!1;this._coalescer.flush();let i=ar(t.getDataList(),e);if(i===null)return!1;for(let n of this._abandonSync())i=wi(i,n);return this._replay=i,this._replaceData(Ei(i),this._more),this._emit("replay",!0),!0}replayStep(e){let t=this._replay,i=this._chart;if(t===null||i===null)return;let n=cr(t,e);if(this._replay=n,n!==t&&n.full===t.full&&n.idx<t.idx&&i.truncateData?.(n.idx+1,t.idx+1,t.full[t.idx].timestamp)===!0)return;let r=St(i);if(n.full===t.full&&n.idx>t.idx+1&&i.updateDataBatch!==void 0&&r===t.full[t.idx].timestamp){i.updateDataBatch(n.full.slice(t.idx+1,n.idx+1),this._more);return}let s=dr(t,n,r);s.kind==="append"?i.updateData(s.bar):s.kind==="rebuild"&&this._replaceData(s.bars,this._more)}exitReplay(){this._endReplay(!0)}_replaceData(e,t=!1){let i=this._chart;i!==null&&(i.applyNormalizedData!==void 0?i.applyNormalizedData(e,t):i.applyNewData(e,t))}_schedule(){this._scheduled||(this._scheduled=!0,this._env.queueMicrotask(()=>{this._scheduled=!1,this._start()}))}_isCurrent(e){return!this._disposed&&e===this._reqGen}async _fetch(e,t,i,n){return await this._datafeed.getHistoryKLineData(e.symbol,e.period,t,i,n)}_start(){let e=this._pending;if(this._disposed||e===null||this._chart===null)return;this._pending=null,this._current=e;let t=++this._reqGen;this._endReplay(!1),this._retire(),this._unit=void 0,this._sparse=!1,this._setStatus({state:"loading",loadingMore:!1,error:null});let i=null;if(this._cache!==null){let c=this._cache.get(lt(e.symbol,e.period),this._env.now());c!==void 0&&(i=c.bars,this._replaceData(c.bars.slice(),c.more))}let[n,r]=Dt(e.period,this._env.now(),this._count),s=!1,o=new AbortController;this._reqAbort=o;let a={signal:o.signal,firstDataRequest:!0,countBack:this._count},l=this._env.setTimeout(()=>{this._isCurrent(t)&&this._shownGen!==t&&(s=!0,i=null,this._failInitial(t,e,new Error(`[super-chart] the history request for ${We(e)} did not settle within ${this._timeoutMs} ms`),!0))},this._timeoutMs);this._fetch(e,n,r,a).then(c=>{if(this._env.clearTimeout(l),this._isCurrent(t))try{this._show(t,e,c,i)}catch(u){this._env.warn(`[super-chart] showing the history of ${We(e)} threw.`,u);try{this._failInitial(t,e,u,!1)}catch(h){this._env.warn("[super-chart] reporting that failure threw as well.",h)}}},c=>{this._env.clearTimeout(l),this._isCurrent(t)&&!s&&this._failInitial(t,e,c,!1)})}_show(e,t,i,n){let r=this._chart;if(r===null)return;let{bars:s,noData:o}=oi(i),{bars:a,unit:l,issues:c}=de(s);if(this._unit=a.length>0?l:void 0,this._report(c),this._more=a.length>0&&!o,this._sparse=vi(a,t.period),this._shownGen=e,this._shown=t,this._setStatus({state:a.length>0?"ready":"empty",loadingMore:!1,error:null}),this._emit("bars",{bars:a,symbol:t.symbol,period:t.period}),n!==null&&n.length>0&&rr(n,a)==="tail"){let u=n[n.length-1].timestamp,h=a.filter(d=>d.timestamp>=u);if(r.updateDataBatch!==void 0)r.updateDataBatch(h,this._more);else for(let d of h)r.updateData(d)}else this._replaceData(a,this._more);this._cache!==null&&this._cache.set(lt(t.symbol,t.period),{bars:a,more:this._more,at:this._env.now()}),this._subscribed===null&&this._subscribe(e,t)}_failInitial(e,t,i,n){this._more=!1,this._shownGen=e,this._shown=t;let r={phase:"initial",symbol:t.symbol,period:t.period,error:i,timeout:n};this._setStatus({state:"error",loadingMore:!1,error:r}),this._replaceData([],!1),this._emitError(r)}_subscribe(e,t){let i=n=>{this._isCurrent(e)&&this._onTick(n)};try{this._datafeed.subscribe(t.symbol,t.period,i),this._subscribed=t}catch(n){this._env.warn(`[super-chart] datafeed.subscribe threw for ${We(t)}; no live updates.`,n)}}_retire(){let e=this._subscribed;if(this._subscribed=null,e!==null)try{this._datafeed.unsubscribe(e.symbol,e.period)}catch(t){this._env.warn(`[super-chart] datafeed.unsubscribe threw for ${We(e)}.`,t)}this._coalescer.cancel(),this._abandonSync(),this._cancelMore(),this._reqAbort?.abort(),this._reqAbort=null}_cancelMore(){this._moreGen++,this._moreFailures=0,this._moreTimer!==null&&(this._env.clearTimeout(this._moreTimer),this._moreTimer=null),this._moreAbort?.abort(),this._moreAbort=null;let e=this._pendingOlderPage;this._pendingOlderPage=null,e?.(null),this._chart?.cancelHistoryLoad?.()}_loadOlder(e,t){let i=this._shown;if(this._disposed||i===null||this._shownGen!==this._reqGen)return;if(e===null){t([],!1);return}let n=this._reqGen,r=++this._moreGen,[s,o]=Dt(i.period,e,this._count);this._setLoadingMore(!0),this._moreAbort?.abort();let a=new AbortController;this._moreAbort=a;let l={signal:a.signal,firstDataRequest:!1,countBack:this._count,before:e};this._fetch(i,s,o,l).then(c=>{if(!this._isCurrent(n)||r!==this._moreGen)return;this._setLoadingMore(!1),this._moreFailures=0;let{bars:u,noData:h}=oi(c);this._unit===void 0&&(this._unit=at(u));let{bars:d,issues:p}=de(u,this._unit??1);this._report(p);let m=this._chart?.getDataList(),y=Yn(d,m!==void 0&&m.length>0?m[0].timestamp:e);this._more=y.length>0&&!h,this._replay!==null&&(this._replay=hr(this._replay,y)),t(y,this._more)},c=>{if(!this._isCurrent(n)||r!==this._moreGen)return;this._setLoadingMore(!1),this._emitError({phase:"more",symbol:i.symbol,period:i.period,error:c,timeout:!1});let u=Math.min(this._moreRetry.base*2**this._moreFailures,this._moreRetry.max);this._moreFailures++,this._moreTimer=this._env.setTimeout(()=>{this._moreTimer=null,this._isCurrent(n)&&r===this._moreGen&&t([],!0)},u)})}_onTick(e){let t=Array.isArray(e)?e:[e];if(t.length===0)return;this._unit===void 0&&(this._unit=at(t));let{bars:i,issues:n}=de(t,this._unit??1);this._report(n);for(let r of i)this._routeTick(r)}_routeTick(e){if(this._replay!==null){this._replay=wi(this._replay,e);return}if(this._syncing){this._hold(e);return}let t=this._coalescer.lastTs()??St(this._chart);if(t!==void 0&&e.timestamp<t){this._warnOnce("late","[super-chart] a live bar older than the newest bar was ignored (klinecharts cannot update an older bar in place).");return}if(t!==void 0&&!this._sparse&&this._isGap(t,e.timestamp)&&this._canSync()){this._startSync(e);return}this._coalescer.push(e)}_applyTicks(e){let t=this._chart;if(!(t===null||this._disposed)){if(t.updateDataBatch!==void 0)t.updateDataBatch(e);else for(let i of e)t.updateData(i);this._status.state==="empty"&&t.getDataList().length>0&&this._setStatus({...this._status,state:"ready"})}}_isGap(e,t){let i=this._shown?.period;if(i===void 0)return!1;let n=Rt(i,e,2);return Number.isFinite(n)&&t>=n}_canSync(){return!this._disposed&&this._chart!==null&&this._shown!==null&&this._shownGen===this._reqGen&&this._replay===null&&!this._syncing&&this._subscribed!==null&&(this._status.state==="ready"||this._status.state==="empty")&&this._env.now()-this._lastSyncAt>=this._syncMinMs}_hold(e){let t=this._held[this._held.length-1];t===void 0||e.timestamp>t.timestamp?this._held.push(e):e.timestamp===t.timestamp&&(this._held[this._held.length-1]=e)}_abandonSync(){let e=this._held;return this._syncGen++,this._syncing=!1,this._held=[],this._syncTimer!==null&&(this._env.clearTimeout(this._syncTimer),this._syncTimer=null),this._syncAbort?.abort(),this._syncAbort=null,e}_giveUpSync(e,t,i){for(let n of this._abandonSync())this._coalescer.push(n);this._emitError({phase:"sync",symbol:e.symbol,period:e.period,error:t,timeout:i})}_startSync(e){let t=this._shown,i=this._chart;if(t===null||i===null)return;let n=this._reqGen,r=++this._syncGen;this._coalescer.flush(),this._syncing=!0,this._held=e!==null?[e]:[];let s=this._env.now();this._lastSyncAt=s;let a=St(i)??Dt(t.period,s,this._count)[0];this._syncTimer=this._env.setTimeout(()=>{this._syncTimer=null,this._isCurrent(n)&&r===this._syncGen&&this._giveUpSync(t,new Error(`[super-chart] the backfill request for ${We(t)} did not settle within ${this._syncTimeoutMs} ms`),!0)},this._syncTimeoutMs),this._syncAbort?.abort();let l=new AbortController;this._syncAbort=l;let c={signal:l.signal,firstDataRequest:!1,countBack:this._count};this._fetch(t,Math.min(a,s),s,c).then(u=>{if(!this._isCurrent(n)||r!==this._syncGen)return;let h=this._abandonSync(),{bars:d,noData:p}=oi(u);this._unit===void 0&&(this._unit=at(d));let{bars:m,issues:y}=de(d,this._unit??1);this._report(y);let g=h.length>0?h[0].timestamp:1/0,v=St(i);if(m.length>0&&v!==void 0&&m[0].timestamp<=v)for(let b of m)(v===void 0||b.timestamp>=v)&&b.timestamp<g&&this._coalescer.push(b);else if(m.length>0){this._coalescer.cancel(),this._cancelMore();let b=m.filter(f=>f.timestamp<g);this._more=b.length>0&&!p,this._sparse=vi(b,t.period),this._setStatus({state:b.length>0||h.length>0?"ready":"empty",loadingMore:!1,error:null}),this._replaceData(b,this._more)}for(let b of h)this._coalescer.push(b)},u=>{!this._isCurrent(n)||r!==this._syncGen||this._giveUpSync(t,u,!1)})}_listen(){let e=this._env.visibility;if(e!==void 0){let i=()=>{if(this._coalescer.visibilityChanged(),e.hidden){this._hiddenAt=this._env.now();return}let n=this._hiddenAt;this._hiddenAt=null;let r=this._shown?.period;if(n===null||r===void 0)return;let s=Rt(r,n,1);Number.isFinite(s)&&this._env.now()>=s&&this.resync()};e.addEventListener("visibilitychange",i),this._detach.push(()=>{e.removeEventListener("visibilitychange",i)})}let t=this._env.connectivity;if(t!==void 0){let i=()=>{this._status.state==="error"?this.reload():this.resync()};t.addEventListener("online",i),this._detach.push(()=>{t.removeEventListener("online",i)})}}_endReplay(e){let t=this._replay;t!==null&&(this._replay=null,e&&this._replaceData(t.full.slice(),this._more),this._emit("replay",!1))}_setStatus(e){this._status=e,this._emit("status",e)}_setLoadingMore(e){this._status.loadingMore!==e&&this._setStatus({...this._status,loadingMore:e})}_emit(e,t){for(let i of[...this._listeners[e]])try{i(t)}catch(n){this._env.warn(`[super-chart] a ${e} listener threw.`,n)}}_emitError(e){let t=e.phase==="initial"?"history":e.phase==="more"?"older history":"missed bars";this._env.warn(`[super-chart] loading ${t} for ${We(e)} failed.`,e.error),this._emit("error",e)}_warnOnce(e,t){this._warned.has(e)||(this._warned.add(e),this._env.warn(t))}_report(e){e.notArray&&this._warnOnce("notArray","[super-chart] the datafeed returned something that is not an array of bars; treated as no data."),e.seconds&&this._warnOnce("seconds","[super-chart] bar timestamps look like seconds; converted to milliseconds."),e.coerced&&this._warnOnce("coerced","[super-chart] bar fields that were not numbers (numeric strings) were converted to numbers."),e.unsorted&&this._warnOnce("unsorted","[super-chart] bars were not in ascending time order; sorted."),e.duplicates>0&&this._warnOnce("duplicates","[super-chart] bars with duplicate timestamps; the last of each was kept."),e.dropped>0&&this._warnOnce("dropped",`[super-chart] dropped ${e.dropped} bar(s) with a missing or non-finite timestamp, open, high, low or close.`)}};function pr(e){let t=null,i=null;return e.map(n=>{let{open:r,high:s,low:o,close:a}=n;if(!Number.isFinite(r)||!Number.isFinite(s)||!Number.isFinite(o)||!Number.isFinite(a))return t=null,i=null,n;let l=(r+s+o+a)/4,c=t===null||i===null?(r+a)/2:(t+i)/2,u=Math.max(s,c,l),h=Math.min(o,c,l);return t=c,i=l,{...n,open:c,high:u,low:h,close:l}})}var Ii=class{_bars=[];_ha=null;_ma=[];_ema=[];_sum=0;_previous=null;_sumBeforeLast=0;_emaBeforeLast=null;_version=0;_more=!1;_loadMore=null;_listeners=new Set;_referenceIndicators;constructor(e={}){this._referenceIndicators=e.referenceIndicators!==!1}get version(){return this._version}get hasMore(){return this._more}getDataList(){return this._bars}getLastTimestamp(){return this._bars[this._bars.length-1]?.timestamp}snapshot(e=0,t=this._bars.length,i="raw"){let n=this._bars;return i==="heikin-ashi"&&(this._ha===null&&(this._ha=pr(this._bars)),n=this._ha),{version:this._version,bars:n.slice(e,t).map(r=>({...r})),ma20:this._ma.slice(e,t),ema21:this._ema.slice(e,t)}}subscribe(e){return this._listeners.add(e),()=>{this._listeners.delete(e)}}loadMore(e){this._loadMore=e}requestMore(){this._more&&this._loadMore?.(this._bars[0]?.timestamp??null)}applyNewData(e,t=!1){this._bars=this._copyValidated(e),this._more=t,this._rebuild(),this._emit("reset",0)}truncateData(e,t,i){return!Number.isSafeInteger(e)||e<1||e>this._bars.length||this._bars.length!==t||this.getLastTimestamp()!==i?!1:(e===this._bars.length||(this._bars.length=e,this._referenceIndicators?this._rebuild():this._ha!==null&&(this._ha.length=e),this._emit("truncate",e)),!0)}applyMoreData(e,t=!1){this._validate(e);let i=this._bars[0]?.timestamp??1/0,n=e.filter(s=>s.timestamp<i).map(s=>({...s})),r=this._more!==t;if(this._more=t,n.length===0){r&&this._emit("availability",this._bars.length);return}this._bars=n.concat(this._bars),this._rebuild(),this._emit("prepend",0)}updateData(e){this.updateDataBatch([e])}updateDataBatch(e,t){this._validate(e,!0);let i=t!==void 0&&this._more!==t;t!==void 0&&(this._more=t);let n=this._bars.length,r=!1;for(let s of e){let o=this._bars.length-1,a=this._bars[o];a!==void 0&&s.timestamp<a.timestamp||(a!==void 0&&s.timestamp===a.timestamp?(this._bars[o]={...s},this._sum=this._sumBeforeLast,this._previous=this._emaBeforeLast,this._calculate(o),n=Math.min(n,o)):(this._bars.push({...s}),this._calculate(o+1)),r=!0)}r?this._emit("tail",n):i&&this._emit("availability",this._bars.length)}_rebuild(){if(this._ha!==null&&(this._ha=[]),this._ma=[],this._ema=[],this._sum=0,this._previous=null,this._sumBeforeLast=0,this._emaBeforeLast=null,this._referenceIndicators||this._ha!==null)for(let e=0;e<this._bars.length;e++)this._calculate(e)}_calculate(e){if(this._referenceIndicators){this._sumBeforeLast=this._sum,this._emaBeforeLast=this._previous;let t=this._bars[e].close;this._sum+=t,e>=20&&(this._sum-=this._bars[e-20].close),this._ma[e]=e>=19?this._sum/20:null,this._previous=this._previous===null?t:t*(2/22)+this._previous*(1-2/22),this._ema[e]=e>=20?this._previous:null}if(this._ha!==null){let t=this._bars[e],i=this._ha[e-1],n=(t.open+t.high+t.low+t.close)/4,r=i===void 0?(t.open+t.close)/2:(i.open+i.close)/2;this._ha[e]={...t,open:r,close:n,high:Math.max(t.high,r,n),low:Math.min(t.low,r,n)}}}_copyValidated(e){let t=[],i=-1/0;for(let n of e){let r={...n};this._validateBar(r,i,!1),t.push(r),i=r.timestamp}return t}_validateBar(e,t,i){if(!Number.isFinite(e.timestamp)||!Number.isFinite(e.open)||!Number.isFinite(e.high)||!Number.isFinite(e.low)||!Number.isFinite(e.close)||(i?e.timestamp<t:e.timestamp<=t))throw new RangeError("RealtimeSeries requires finite OHLC and ascending normalized timestamps")}_validate(e,t=!1){let i=-1/0;for(let n of e)this._validateBar(n,i,t),i=n.timestamp}_emit(e,t){let i={kind:e,from:t,length:this._bars.length,version:++this._version};for(let n of[...this._listeners])n(i)}};function Ce(e,t,i){if(t<=0)return{i0:0,i1:0};if(!Number.isFinite(e.i0)||!Number.isFinite(e.i1))throw new RangeError("Viewport must be finite");let n=Math.min(e.i0,e.i1),r=Math.max(e.i0,e.i1),s=ge(i),o=Math.min(Number.MAX_SAFE_INTEGER,t+s.rightPaddingBars),a=Math.max(Math.min(s.minBars,o),Math.min(o,s.maxBars,r-n+1)),l=Math.max(0,Math.min(n,o-a,t-1));return{i0:l,i1:Math.min(o-1,l+a-1)}}function Le(e,t,i,n,r){if(!Number.isFinite(i)||i<=0||!Number.isFinite(n))return Ce(e,t,r);let s=Math.max(0,Math.min(1,n)),o=ae(e),a=ge(r),l=Math.min(Number.MAX_SAFE_INTEGER,t+a.rightPaddingBars),c=Math.max(Math.min(a.minBars,l),Math.min(l,a.maxBars,o/i)),u=e.i0+s*(o-c);return Ce({i0:u,i1:u+c-1},t,r)}var Ni=class{constructor(e,t={}){this._series=e;let i=t.navigationHistory??32;if(!Number.isSafeInteger(i)||i<0||i>100)throw new RangeError("Navigation history must be an integer from 0 to 100");this._historyLimit=i,this._continuous=t.continuous===!0,this._limits=Object.freeze(ge(t.limits)),this._count=this._validCount(t.count??160),this._openingCount=this._count,this._mode=t.mode??"raw",this._length=e.getDataList().length,this._viewport=this._default(this._count),this._snapshot=this._read(),this._unsubscribe=e.subscribe(n=>{this._changed(n)})}_viewport;_length;_following=!0;_count;_mode;_snapshot;_disposed=!1;_unsubscribe;_listeners=new Set;_continuous;_limits;_openingCount;_historyLimit;_past=[];_future=[];_navigationStart=null;getSnapshot=()=>this._snapshot;subscribe=e=>this._disposed?()=>{}:(this._listeners.add(e),()=>{this._listeners.delete(e)});getLimits(){return this._limits}setLimits(e){if(this._disposed)return;let t=ge(e);t.minBars===this._limits.minBars&&t.maxBars===this._limits.maxBars&&t.rightPaddingBars===this._limits.rightPaddingBars||(this._limits=Object.freeze(t),this._count=this._validCount(this._count),this._viewport=this._following?this._default(this._count):this._clamp(this._viewport),this._navigationStart!==null&&(this._navigationStart=this._navigationState()),this._publish())}setViewport(e){if(this._disposed||this._length===0||!Number.isFinite(e.i0)||!Number.isFinite(e.i1))return;let t=this._clamp(e);if(!this._following&&t.i0===this._viewport.i0&&t.i1===this._viewport.i1)return;let i=this._navigationStart===null?this._navigationState():null;this._following=!1,this._viewport=t,this._count=ae(t),i!==null&&this._recordNavigation(i),this._publish()}pan(e){!Number.isFinite(e)||e===0||this.setViewport(this._continuous?{i0:this._viewport.i0+e,i1:this._viewport.i1+e}:tr(this._viewport,this._length,e,this._limits))}zoom(e,t=.5){!Number.isFinite(e)||e<=0||!Number.isFinite(t)||this.setViewport((this._continuous?Le:er)(this._viewport,this._length,e,t,this._limits))}followLatest(e=this._count){if(this._disposed)return;let t=this._validCount(e),i=this._default(t);if(this._following&&t===this._count&&i.i0===this._viewport.i0&&i.i1===this._viewport.i1)return;let n=this._navigationStart===null?this._navigationState():null;this._count=t,this._following=!0,this._viewport=i,n!==null&&this._recordNavigation(n),this._publish()}resetViewport(){this.followLatest(this._openingCount)}beginNavigation(){!this._disposed&&this._navigationStart===null&&(this._navigationStart=this._navigationState())}endNavigation(){let e=this._navigationStart;this._navigationStart=null,!this._disposed&&e!==null&&this._recordNavigation(e)&&this._publish(!1,!0)}getNavigationHistory(){return{canUndo:this._past.length>0,canRedo:this._future.length>0,limit:this._historyLimit}}clearNavigationHistory(){if(this._disposed)return;let e=this._past.length>0||this._future.length>0;this._past.length=0,this._future.length=0,this._navigationStart=null,e&&this._publish(!1,!0)}undoNavigation(){if(this._disposed)return!1;this.endNavigation();let e=this._past.pop();return e===void 0?!1:(this._future.push(this._navigationState()),this._restoreNavigation(e),!0)}redoNavigation(){if(this._disposed)return!1;this.endNavigation();let e=this._future.pop();return e===void 0?!1:(this._past.push(this._navigationState()),this._restoreNavigation(e),!0)}setMode(e){this._disposed||e===this._mode||(this._mode=e,this._publish())}seek(e,t=.5){if(this._disposed||!Number.isFinite(t))return!1;let i=ut(this._series.getDataList(),e);if(i===null)return!1;let n=ae(this._viewport),r=Math.max(0,Math.min(1,t))*(n-1),s=i-(this._continuous?r:Math.round(r));return this.setViewport({i0:s,i1:s+n-1}),!0}requestMore(){this._disposed||this._series.requestMore()}dispose(){this._disposed||(this._disposed=!0,this._unsubscribe(),this._listeners.clear(),this._past.length=0,this._future.length=0,this._navigationStart=null)}_navigationState(){return{viewport:{...this._viewport},count:this._count,following:this._following}}_recordNavigation(e){return this._historyLimit===0||e.following===this._following&&(this._following?e.count===this._count:e.viewport.i0===this._viewport.i0&&e.viewport.i1===this._viewport.i1)?!1:(this._past.push(e),this._past.length>this._historyLimit&&this._past.shift(),this._future.length=0,!0)}_restoreNavigation(e){this._following=e.following,this._count=this._validCount(e.count),this._viewport=this._following?this._default(this._count):this._clamp(e.viewport),this._following||(this._count=ae(this._viewport)),this._publish()}_validCount(e){if(!Number.isFinite(e)||e<1)throw new RangeError("View count must be a positive finite number");return Math.max(this._limits.minBars,Math.min(this._limits.maxBars,this._continuous?e:Math.floor(e)))}_clamp(e){return(this._continuous?Ce:Re)(e,this._length,this._limits)}_default(e){let t=Math.min(Number.MAX_SAFE_INTEGER,this._length+this._limits.rightPaddingBars);return this._continuous?this._clamp({i0:Math.max(0,t-e),i1:Math.max(0,t-1)}):Si(this._length,e,this._limits)}_changed(e){let t=this._length;if(this._length=e.length,e.kind==="reset"||e.kind==="truncate")this._past.length=0,this._future.length=0,this._navigationStart=null,e.kind==="reset"&&(this._following=!0);else if(e.kind==="prepend"){let r=this._length-t;for(let s of[...this._past,...this._future,...this._navigationStart===null?[]:[this._navigationStart]])s.viewport={i0:s.viewport.i0+r,i1:s.viewport.i1+r}}if(this._following)this._viewport=this._default(this._count);else if(e.kind==="prepend"){let r=this._length-t;this._viewport=this._clamp({i0:this._viewport.i0+r,i1:this._viewport.i1+r})}else this._viewport=this._clamp(this._viewport);let i=this._continuous?Math.ceil(this._viewport.i1):this._viewport.i1;if(e.kind==="tail"&&t===this._length&&e.from>i&&this._snapshot.hasMore===this._series.hasMore)return;let n=(e.kind==="availability"||e.kind==="tail"&&e.from>i)&&this._snapshot.viewport.i0===this._viewport.i0&&this._snapshot.viewport.i1===this._viewport.i1;this._publish(n,e.kind==="availability"||e.kind==="tail"&&t===this._length&&e.from===t-1)}_read(e){let t=this._continuous?Math.floor(this._viewport.i0):this._viewport.i0,i=Math.min(this._length-1,this._continuous?Math.ceil(this._viewport.i1):this._viewport.i1),n=this._snapshot,r=this._continuous&&n!==void 0&&n.version===this._series.version&&n.mode===this._mode&&n.dataStart===t&&Math.min(n.length-1,Math.ceil(n.viewport.i1))===i,s=r?n:this._series.snapshot(t,i+1,this._mode);return Object.freeze({...s,...this._continuous?{dataStart:t}:{},bars:r?n.bars:Object.freeze(s.bars.map(o=>Object.freeze(o))),ma20:Object.freeze(s.ma20),ema21:Object.freeze(s.ema21),viewport:e!==void 0&&e.i0===this._viewport.i0&&e.i1===this._viewport.i1?e:Object.freeze({...this._viewport}),length:this._length,hasMore:this._series.hasMore,following:this._following,mode:this._mode})}_publish(e=!1,t=!1){this._snapshot=e?Object.freeze({...this._snapshot,version:this._series.version,length:this._length,hasMore:this._series.hasMore}):this._read(t&&this._continuous?this._snapshot.viewport:void 0);for(let i of[...this._listeners])i()}};function mr(e,t,i){if(t.dataStart===void 0||t.viewport.i1<=t.viewport.i0||t.bars.length===0)return;let n=t.dataStart,r=e.geometry,s=i==="category"||t.bars.length===1,o=h=>{if(t.bars.length===1)return t.bars[0].timestamp;let d=h-n,p=Math.max(0,Math.min(t.bars.length-2,Math.floor(d))),m=t.bars[p].timestamp,y=t.bars[p+1].timestamp;return m+(y-m)*(d-p)},a=o(t.viewport.i0),l=o(t.viewport.i1);e.x=(h,d)=>r.left+(s?(n+d-t.viewport.i0)/(t.viewport.i1-t.viewport.i0):(Number(h)-a)/(l-a))*r.plotWidth,e.xPositions=e.xKeys.map((h,d)=>e.x(h,d));for(let h of e.plottedCandles)h.x=e.x(h.t,h.index);for(let h of e.plottedSeries)for(let d of h.points)d.x=e.x(d.key,d.index);let c=Math.max(0,Math.ceil(t.viewport.i0)-n),u=Math.min(e.xKeys.length-1,Math.floor(t.viewport.i1)-n);e.xTickIndices=u<c?[]:[...new Set([c,Math.floor((c+u)/2),u])]}function Pe(e){if(e.mode!==void 0&&!["linear","log","percentage"].includes(e.mode))throw new RangeError("Unknown price scale");if(e.range!==void 0){let[t,i]=e.range;if(!Number.isFinite(t)||!Number.isFinite(i)||t>=i||e.mode==="log"&&t<=0)throw new RangeError("Invalid price scale range")}}function pt(e,t,i,n={},r=1){Pe(n);let s=n.mode??"linear";if(s==="percentage"&&(!Number.isFinite(r)||r===0))throw new RangeError("Percentage scale requires a finite nonzero reference price");let o=Math.abs(r),a=s==="log"?f=>Math.log(f):s==="percentage"?f=>(f-r)/o*100:f=>f,l=s==="log"?f=>Math.exp(f):s==="percentage"?f=>r+f/100*o:f=>f,c=1/0,u=-1/0;for(let f of e){if(!Number.isFinite(f)||s==="log"&&f<=0)continue;let w=a(f);c=Math.min(c,w),u=Math.max(u,w)}if(n.range!==void 0)c=a(n.range[0]),u=a(n.range[1]);else{Number.isFinite(c)||(c=0,u=1);let f=u>c?(u-c)*.08:s==="log"?Math.log(1.05):c===0?.01:Math.max(Number.MIN_VALUE,Math.abs(c)*.05);c-=f,u+=f}let h=u-c,d=Math.max(1,i-t),p=f=>{let w=(a(f)-c)/h;return n.reversed===!0?t+w*d:i-w*d},m=f=>l(c+(n.reversed===!0?f-t:i-f)/d*h),y=h/4,g=10**Math.floor(Math.log10(y)),v=([1,2,5,10].find(f=>f*g>=y)??10)*g,b=[];if(Number.isFinite(v)&&v>0){let f=Math.ceil(c/v)*v;for(let w=0;w<12&&f+w*v<=u;w++)b.push(l(f+w*v))}return{min:l(c),max:l(u),ticks:b,y:p,value:m,label:(f,w)=>s==="percentage"?`${a(f).toFixed(2)}%`:f.toFixed(w)}}function Ae(e){if(e.axisGutter!==void 0&&(!Number.isFinite(e.axisGutter)||e.axisGutter<0))throw new RangeError("Axis gutter must be finite and nonnegative");if(e.priceRatio!==void 0&&(!Number.isFinite(e.priceRatio)||e.priceRatio<.3||e.priceRatio>.85))throw new RangeError("Price ratio must be from 0.3 to 0.85");if(e.paneWeights!==void 0&&(e.paneWeights===null||typeof e.paneWeights!="object"||Array.isArray(e.paneWeights)||Object.values(e.paneWeights).some(t=>!Number.isFinite(t)||t<=0)))throw new RangeError("Pane weights must be positive finite numbers")}function Rs(e,t,i,n){let r=pt(t,e.geometry.top,e.geometry.bottom,i,n);e.min=r.min,e.max=r.max,e.yTicks=r.ticks,e.y=r.y;for(let s of e.plottedCandles){let o=r.y(s.o),a=r.y(s.c),l=r.y(s.h),c=r.y(s.l);s.bodyTop=Math.min(o,a),s.bodyBottom=Math.max(o,a),s.wickTop=Math.min(l,c),s.wickBottom=Math.max(l,c)}e.plottedCandles=e.plottedCandles.filter(s=>Number.isFinite(s.wickTop)&&Number.isFinite(s.wickBottom));for(let s of e.plottedSeries)s.points=s.points.map(o=>({...o,y:r.y(o.value)})).filter(o=>Number.isFinite(o.y));return r}function Cs(e,t,i,n,r,s,o,a,l,c){let u=dt(n,r,s,12),h=e.bars.length,d=pt(a,u.top,u.bottom,o,l),p=e.viewport.i1-e.viewport.i0,m=e.dataStart!==void 0&&p>0&&h>0,y=(w,_)=>u.left+(m?(e.dataStart+_-e.viewport.i0)/p*u.plotWidth:h<2?u.plotWidth/2:_/(h-1)*u.plotWidth),g=e.bars.map(w=>w.timestamp),v=g.map(y),b=h<3?g.map((w,_)=>_):[0,Math.floor((h-1)/2),h-1];if(m){let w=Math.max(0,Math.ceil(e.viewport.i0)-e.dataStart),_=Math.min(h-1,Math.floor(e.viewport.i1)-e.dataStart);b=_<w?[]:[...new Set([w,Math.floor((w+_)/2),_])]}let f={geometry:u,min:d.min,max:d.max,yTicks:d.ticks,rightMin:0,rightMax:1,rightTicks:[],hasRightAxis:!1,xKeys:g,allKeys:[...g],start:0,end:Math.max(1,h),xPositions:v,xTickIndices:b,plottedCandles:[],plottedSeries:[],x:y,y:d.y};if(c)for(let w=0;w<h;w++){let _=e.bars[w],D=d.y(_.open),C=d.y(_.close),N=d.y(_.high),I=d.y(_.low);!Number.isFinite(N)||!Number.isFinite(I)||f.plottedCandles.push({t:_.timestamp,o:_.open,h:_.high,l:_.low,c:_.close,v:_.volume,x:v[w],index:w,bodyTop:Math.min(D,C),bodyBottom:Math.max(D,C),wickTop:Math.min(N,I),wickBottom:Math.max(N,I)})}for(let w of t){let _=[];for(let[D,C]of w.points){let N=i.get(D),I=d.y(C);N===void 0||!Number.isFinite(v[N])||!Number.isFinite(I)||_.push({x:v[N],y:I,value:C,key:D,index:N})}f.plottedSeries.push({source:w,points:_})}return{model:f,scale:d}}function mt(e,t,i,n,r,s={},o,a){Ae(s);let l=[...new Set(i.filter(M=>M.pane!=="price").map(M=>M.pane))],c=Math.max(.3,Math.min(.85,s.priceRatio??.62)),u=["price",...l],h=u.map(M=>s.paneWeights?.[M]??(M==="price"?c:(1-c)/l.length)),d=Math.max(...h),p=h.map(M=>M/d),m=p.reduce((M,O)=>M+O,0),y=r,g=Math.min(48,r/u.length),v=new Array(u.length),b=new Set(u.map((M,O)=>O));for(;b.size>0;){let M=[...b].filter(O=>y*p[O]/m<g);if(M.length===0){for(let O of b)v[O]=y*p[O]/m;break}for(let O of M)v[O]=g,y-=g,m-=p[O],b.delete(O)}let f=[],w=e.bars.every((M,O,E)=>Number.isFinite(M.timestamp)&&(O===0||M.timestamp>E[O-1].timestamp)&&Number.isFinite(M.open)&&Number.isFinite(M.high)&&Number.isFinite(M.low)&&Number.isFinite(M.close)&&M.high>=Math.max(M.open,M.close)&&M.low<=Math.min(M.open,M.close)),_=new Map;if(w)for(let M=0;M<e.bars.length;M++)_.set(e.bars[M].timestamp,M);let D=w?[]:e.bars.map(M=>({t:M.timestamp,o:M.open,h:M.high,l:M.low,c:M.close,v:M.volume})),C=Ke(e.bars),N=e.dataStart??e.viewport.i0,I=(M,O)=>{if(!Number.isFinite(O))return null;let E=e.viewport.i1-e.viewport.i0;if(e.dataStart!==void 0&&E>0&&M.xPositions.length>0){let R=M.geometry.plotWidth/E/2;if(O>M.xPositions[M.xPositions.length-1]+R||O<M.xPositions[0]-R)return null}let k=Ft(M,O),x=k===null?void 0:M.xKeys[k],F=w?k:typeof x=="number"?ut(e.bars,x):null,H=F===null?void 0:e.bars[F];return F===null||H===void 0||H.timestamp!==x?null:{index:N+F,timestamp:H.timestamp,mode:e.mode,displayBar:H}},P=(M,O)=>{let E=I(M,O);if(E===null)return null;let k=Object.create(null);for(let x of i)k[x.id]={...x.rows[E.index]};return{...E,indicatorBasis:"raw",indicators:k}},L=0;for(let[M,O]of u.entries()){let E=M===0,k=v[M],x=L;L+=k;let F=[],H=new Map;for(let T of i)if(T.pane===O)for(let W of T.figures){let q=[];for(let U=0;U<e.bars.length;U++){let V=T.rows[N+U]?.[W.key];V!=null&&Number.isFinite(V)&&q.push([e.bars[U].timestamp,V])}let Y=JSON.stringify([T.id,W.key]);H.set(Y,W),F.push({id:Y,name:W.title,type:W.type==="circle"?"scatter":W.type,color:W.color,points:q})}let R=[];if(E)for(let T of e.bars)R.push(T.high,T.low);for(let T of F){for(let W of T.points)R.push(W[1]);T.type==="bar"&&R.push(H.get(T.id)?.base??0)}let j=E?s.priceScale??{}:{},$=t[0]?.close??1,G,A;w?{model:G,scale:A}=Cs(e,F,_,n,k,s.axisGutter,j,R,$,E):(G=Qn({xType:"category",series:F,candles:D},n,k,s.axisGutter),mr(G,e,"category"),E||(G.plottedCandles=[]),A=Rs(G,R,j,$)),f.push({id:O,top:x,height:k,frame:{snapshot:e,model:G,figureStyles:H,pricePrecision:C,previousClose:E?o:void 0,indicatorPane:!E,title:E?void 0:i.filter(T=>T.pane===O).map(T=>T.name).join(" \xB7 "),inspectBar:T=>I(G,T),inspect:T=>P(G,T)},scale:A})}let B=f[0],z=B.frame.model,S=M=>{if(!Number.isFinite(M)||t.length===0)return null;let O=0,E=t.length;for(;O<E;){let F=O+E>>>1;t[F].timestamp<M?O=F+1:E=F}if(t.length===1)return 0;if(O===0)return(M-t[0].timestamp)/(t[1].timestamp-t[0].timestamp);if(O===t.length)return t.length-1+(M-t[O-1].timestamp)/(t[O-1].timestamp-t[O-2].timestamp);let k=t[O-1].timestamp,x=t[O].timestamp;return O-1+(M-k)/(x-k)};return{...B.frame,drawingContext:{bars:t,revision:a,visibleRange:[e.viewport.i0,e.viewport.i1]},panes:f,project:(M,O)=>{let E=S(M);if(E===null||!Number.isFinite(O))return null;let k=e.viewport.i1-e.viewport.i0,x=z.geometry,F=k<=0?x.left+x.plotWidth/2:x.left+(E-e.viewport.i0)/k*x.plotWidth,H=B.scale.y(O);return Number.isFinite(H)?{x:F,y:H}:null},unproject:(M,O)=>{if(!Number.isFinite(M)||!Number.isFinite(O)||e.bars.length===0)return null;let E=z.geometry,k=(M-E.left)/E.plotWidth*Math.max(0,e.viewport.i1-e.viewport.i0),x=e.viewport.i0+k,F=Math.max(0,Math.min(t.length-2,Math.floor(x))),H=t[F],R=t[Math.min(t.length-1,F+1)],j=H.timestamp+(R.timestamp-H.timestamp)*(x-F),$=B.scale.value(O);return Number.isFinite($)?{timestamp:j,price:$}:null}}}var ai=Object.freeze({basis:null,upper:null,lower:null}),Tt=e=>Number.isFinite(e)?e:null;function Tn(){return{run:0,valid:!1,sinceSeed:0,sum:0,compensation:0,mean:0,m2:0}}function En(e){return{...e}}function li(e,t){let i=e.sum+t;e.compensation+=Math.abs(e.sum)>=Math.abs(t)?e.sum-i+t:t-i+e.sum,e.sum=i}function Ls(e,t,i,n,r){if(!Number.isInteger(i)||i<1)return ai;let s=Tt(e[t].close);if(s===null)return r.run=0,r.valid=!1,ai;if(r.run++,r.run<i)return ai;let o;if(!r.valid||++r.sinceSeed>=i){r.sum=0,r.compensation=0;let l=0;for(let c=t-i+1;c<=t;c++){let u=e[c].close;li(r,u),l+=u}r.mean=l/i,r.m2=0;for(let c=t-i+1;c<=t;c++)r.m2+=(e[c].close-r.mean)**2;r.valid=!0,r.sinceSeed=0,o=Math.sqrt(r.m2/i)}else{let l=e[t-i].close;li(r,-l),li(r,s);let c=r.mean+(s-l)/i;r.m2+=(s-l)*(s-c+l-r.mean),r.mean=c,o=Math.sqrt(Math.max(r.m2,0)/i)}let a=(r.sum+r.compensation)/i;return{basis:Tt(a),upper:Tt(a+n*o),lower:Tt(a-n*o)}}function X(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function ve(e,t){return bn(e,t,"finite")}function rt(e,t){let i=new Array(t[0]?.length??0);for(let n=0;n<i.length;n++){let r=Object.create(null);for(let s=0;s<e.length;s++)r[e[s]]=X(t[s][n]);i[n]=r}return i}function fr(e){let t=X(e.volume);return{volume:t!==null&&t>=0?t:null}}function ct(){return{sum:0,count:0,previous:null,gain:0,loss:0}}function Dn(){return{fast:ct(),slow:ct(),signal:ct()}}function In(e){return{fast:{...e.fast},slow:{...e.slow},signal:{...e.signal}}}function Nn(){return{run:0,valid:!1,sum:0,compensation:0,sinceSeed:0}}function ci(e,t){let i=e.sum+t;e.compensation+=Math.abs(e.sum)>=Math.abs(t)?e.sum-i+t:t-i+e.sum,e.sum=i}function Ps(e,t,i,n){let r=X(e[t].close);if(r===null)return n.run=0,n.valid=!1,null;if(n.run++,n.run<i)return null;if(!n.valid||++n.sinceSeed>=i){n.sum=0,n.compensation=0;for(let s=t-i+1;s<=t;s++)ci(n,e[s].close);n.sinceSeed=0,n.valid=!0}else ci(n,-e[t-i].close),ci(n,r);return X((n.sum+n.compensation)/i)}function Et(e,t,i,n){if(e==="EMA")return t===null?null:(n.previous===null?(n.sum+=t,n.count++,n.count===i&&(n.previous=n.sum/i)):n.previous=(2*t+(i-1)*n.previous)/(i+1),X(n.previous));if(t===null)return n.previous=null,null;if(n.previous===null)return n.previous=t,null;let r=t-n.previous;n.previous=t;let s=Math.max(r,0),o=Math.max(-r,0);if(n.count<i){if(n.gain+=s,n.loss+=o,n.count++,n.count<i)return null;n.gain/=i,n.loss/=i}else n.gain=(n.gain*(i-1)+s)/i,n.loss=(n.loss*(i-1)+o)/i;return X(n.loss===0?100:n.gain===0?0:100-100/(1+n.gain/n.loss))}function As(e,t){let i=kt(ve(e,"high"),ve(e,"low"),ve(e,"close"),t[0]),n=new Array(e.length),r=50,s=50;for(let o=0;o<i.length;o++){let a=X(i[o]);if(a===null){n[o]={k:null,d:null,j:null},r=50,s=50;continue}r=((t[1]-1)*r+a)/t[1],s=((t[2]-1)*s+r)/t[2],n[o]={k:X(r),d:X(s),j:X(3*r-2*s)}}return n}var Fs=[{name:"MA",params:[20],pane:"price",figures:[{key:"ma",title:"MA",type:"line"}],calculate:(e,t)=>rt(["ma"],[Ie(ve(e,"close"),t[0])])},{name:"EMA",params:[20],pane:"price",figures:[{key:"ema",title:"EMA",type:"line"}],calculate:(e,t)=>rt(["ema"],[Ee(ve(e,"close"),t[0])])},{name:"BOLL",params:[20,2],pane:"price",figures:[{key:"basis",title:"Basis",type:"line"},{key:"upper",title:"Upper",type:"line"},{key:"lower",title:"Lower",type:"line"}],calculate:(e,t)=>{let i=xt(ve(e,"close"),t[0],t[1]);return rt(["basis","upper","lower"],[i.basis,i.upper,i.lower])}},{name:"VOL",params:[],pane:"separate",figures:[{key:"volume",title:"Volume",type:"bar"}],calculate:e=>e.map(fr)},{name:"MACD",params:[12,26,9],pane:"separate",figures:[{key:"dif",title:"DIF",type:"line"},{key:"dea",title:"DEA",type:"line"},{key:"hist",title:"MACD",type:"bar"}],calculate:(e,t)=>{let i=Zt(ve(e,"close"),t[0],t[1],t[2]);return rt(["dif","dea","hist"],[i.dif,i.dea,i.hist])}},{name:"RSI",params:[14],pane:"separate",figures:[{key:"rsi",title:"RSI",type:"line"}],calculate:(e,t)=>rt(["rsi"],[bt(ve(e,"close"),t[0])])},{name:"KDJ",params:[9,3,3],pane:"separate",figures:[{key:"k",title:"K",type:"line"},{key:"d",title:"D",type:"line"},{key:"j",title:"J",type:"line"}],calculate:As}];function hi(e,t){for(let i of e)if(typeof i!="number"||!Number.isFinite(i))throw new RangeError("Indicator parameters must be finite numbers");if(t!==void 0){let i=t==="VOL"?0:t==="BOLL"?2:t==="MACD"||t==="KDJ"?3:1;if(e.length!==i)throw new RangeError(`${t} requires ${i} parameters`);for(let n=0;n<e.length;n++)if(t==="BOLL"&&n===1){if(e[n]<0)throw new RangeError("BOLL deviation multiplier must not be negative")}else if(!Number.isSafeInteger(e[n])||e[n]<1)throw new RangeError("Indicator periods must be positive safe integers")}return Object.freeze([...e])}var Fe=class{definitions=new Map;builtinNames=new Set;entries=new Map;result=[];bars=null;length=0;dataDirty=!1;structureDirty=!1;fullReset=!1;from=1/0;nextId=1;disposed=!1;constructor(){for(let e of Fs)this.register(e),this.builtinNames.add(e.name)}register(e){if(this.assertLive(),typeof e.name!="string"||e.name.trim()==="")throw new TypeError("Indicator name must not be empty");if(this.definitions.has(e.name))throw new Error(`Indicator already registered: ${e.name}`);if(e.pane!=="price"&&e.pane!=="separate")throw new TypeError("Invalid indicator pane");if(typeof e.calculate!="function"||e.figures.length===0)throw new TypeError("Indicator needs figures and a calculation");let t=new Set,i=e.figures.map(n=>{if(typeof n.key!="string"||n.key===""||t.has(n.key)||!["line","bar","circle"].includes(n.type))throw new TypeError("Indicator figure keys must be unique and types must be line, bar or circle");if(n.lineWidth!==void 0&&(!Number.isFinite(n.lineWidth)||n.lineWidth<=0||n.lineWidth>32))throw new RangeError("Figure width must be greater than zero and at most 32");if(n.base!==void 0&&!Number.isFinite(n.base))throw new RangeError("Figure base must be finite");if(n.dash!==void 0&&(!Array.isArray(n.dash)||n.dash.length>16||n.dash.some(r=>!Number.isFinite(r)||r<0)))throw new RangeError("Invalid figure dash pattern");return t.add(n.key),Object.freeze({...n,...n.dash===void 0?{}:{dash:Object.freeze([...n.dash])}})});this.definitions.set(e.name,Object.freeze({...e,params:hi(e.params??[]),figures:Object.freeze(i)}))}unregister(e,t){this.assertLive();let i=this.definitions.get(e);return i===void 0||this.builtinNames.has(e)||t!==void 0&&i.calculate!==t||[...this.entries.values()].some(n=>n.instance.name===e)?!1:this.definitions.delete(e)}add(e){this.assertLive();let t=this.definitions.get(e.name);if(t===void 0)throw new Error(`Unknown indicator: ${e.name}`);let i=this.builtinNames.has(e.name)?e.name:void 0,n=hi(e.params??t.params??[],i);t.validateParams?.(n);let r=e.pane??t.pane;if(r!=="price"&&r!=="separate")throw new TypeError("Invalid indicator pane");let s=e.id;if(s===void 0)do s=`indicator-${this.nextId++}`;while(this.entries.has(s));if(typeof s!="string"||s.trim()===""||this.entries.has(s))throw new Error("Indicator id must be nonempty and unique");this.validatePlacement(e);let o=Object.freeze({id:s,name:e.name,params:n,pane:r,paneId:e.paneId,visible:e.visible??!0});return this.entries.set(s,{instance:o,definition:t,builtin:i??si(t.calculate)?.name,result:null}),this.structureDirty=!0,s}update(e,t){this.assertLive();let i=this.entries.get(e);if(i===void 0)return!1;this.validatePlacement(t);let n=t.pane??i.instance.pane;if(n!=="price"&&n!=="separate")throw new TypeError("Invalid indicator pane");let r=t.params===void 0?i.instance.params:hi(t.params,this.builtinNames.has(i.instance.name)?i.builtin:void 0);i.definition.validateParams?.(r);let s=Object.freeze({...i.instance,...t,pane:n,params:r,visible:t.visible??i.instance.visible});return r.length!==i.instance.params.length||r.some((a,l)=>a!==i.instance.params[l])||s.visible!==i.instance.visible?i.result=null:i.result!==null&&(i.result={...i.result,pane:n,paneId:s.paneId}),i.instance=s,this.structureDirty=!0,!0}validatePlacement(e){if(e.paneId!==void 0&&(typeof e.paneId!="string"||e.paneId.trim()===""||e.paneId.length>128))throw new TypeError("Indicator pane id must be nonempty and at most 128 characters");if(e.visible!==void 0&&typeof e.visible!="boolean")throw new TypeError("Indicator visibility must be boolean")}remove(e){this.assertLive();let t=this.entries.delete(e);return t&&(this.structureDirty=!0),t}hasCustom(){return[...this.entries.values()].some(e=>e.instance.visible&&e.builtin===void 0)}list(){return this.assertLive(),Array.from(this.entries.values(),e=>e.instance)}registeredNames(){return this.assertLive(),[...this.definitions.keys()]}validateReplacement(e){this.prepareReplacement(e).dispose()}replace(e){let t=this.prepareReplacement(e);this.entries.clear();for(let[i,n]of t.entries)this.entries.set(i,n);this.nextId=t.nextId,this.result=[],this.structureDirty=!0,this.fullReset=!0,t.dispose()}prepareReplacement(e){if(this.assertLive(),!Array.isArray(e)||e.length>64)throw new RangeError("At most 64 indicator instances can be restored");let t=new Fe;t.nextId=this.nextId;try{for(let i of this.definitions.values())this.builtinNames.has(i.name)||t.register(i);for(let i of e)t.add(i);return t}catch(i){throw t.dispose(),i}}dispose(){this.disposed||(this.disposed=!0,this.entries.clear(),this.definitions.clear(),this.builtinNames.clear(),this.result=[],this.bars=null,this.length=0,this.dataDirty=!1,this.structureDirty=!1,this.fullReset=!1,this.from=1/0)}invalidate(e){this.assertLive(),e.kind!=="availability"&&(this.dataDirty=!0,e.kind!=="tail"||!Number.isSafeInteger(e.from)||e.from<0?this.fullReset=!0:this.from=Math.min(this.from,e.from))}compute(e){this.assertLive();let t=this.dataDirty||this.bars!==e||this.length!==e.length;if(!t&&!this.structureDirty)return this.result;let i=this.dataDirty&&!this.fullReset&&this.bars===e&&e.length>=this.length&&this.from<=this.length,n=i?this.from:0,r=[];try{vn(e,()=>{let s=new Map;for(let o of this.entries.values()){if(!o.instance.visible){o.result=null;continue}let a=si(o.definition.calculate),l=a?.parameters(o.instance.params)??o.instance.params,c=o.builtin===void 0?void 0:JSON.stringify([o.builtin,l,a?.maKey??"ma"]),u=c===void 0?void 0:s.get(c);u!==void 0?(o.result={...u.result,id:o.instance.id,name:o.instance.name,pane:o.instance.pane,paneId:o.instance.paneId,figures:o.definition.figures},o.recursive=u.recursive,o.macd=u.macd,o.bollinger=u.bollinger,o.movingAverage=u.movingAverage):((t||o.result===null)&&this.calculate(o,e,n,i&&o.result!==null,l,a?.maKey),c!==void 0&&s.set(c,o)),r.push(o.result)}})}catch(s){throw this.dataDirty=!0,this.fullReset=!0,s}return this.result=r,this.bars=e,this.length=e.length,this.dataDirty=!1,this.structureDirty=!1,this.fullReset=!1,this.from=1/0,this.result}calculate(e,t,i,n,r,s="ma"){let o,a=e.builtin;if(a==="MA"){let l=e.movingAverage,c=n&&l!==void 0&&this.length>0&&i>=this.length-1,u=c?i:0,h=c?{...i===this.length?l.afterLast:l.beforeLast}:Nn();o=c?e.result.rows:new Array(t.length);let d=Nn();for(let p=u;p<t.length;p++){p===t.length-1&&(d={...h});let m=Ps(t,p,r[0],h);o[p]=s==="ma"?{ma:m}:{[s]:m}}u===t.length&&l!==void 0&&(d=l.beforeLast),e.movingAverage={beforeLast:d,afterLast:h}}else if(a==="EMA"||a==="RSI"){let l=e.recursive,c=n&&l!==void 0&&this.length>0&&i>=this.length-1,u=c?i:0,h=c?{...i===this.length?l.afterLast:l.beforeLast}:ct();o=c?e.result.rows:new Array(t.length);let d=ct();for(let p=u;p<t.length;p++){p===t.length-1&&(d={...h});let m=Et(a,X(t[p].close),r[0],h);o[p]=a==="EMA"?{ema:m}:{rsi:m}}u===t.length&&l!==void 0&&(d=l.beforeLast),e.recursive={beforeLast:d,afterLast:h}}else if(a==="BOLL"){let l=e.bollinger,c=n&&l!==void 0&&this.length>0&&i>=this.length-1,u=c?i:0,h=c?En(i===this.length?l.afterLast:l.beforeLast):Tn();o=c?e.result.rows:new Array(t.length);let d=Tn();for(let p=u;p<t.length;p++)p===t.length-1&&(d=En(h)),o[p]=Ls(t,p,r[0],r[1],h);u===t.length&&l!==void 0&&(d=l.beforeLast),e.bollinger={beforeLast:d,afterLast:h}}else if(a==="MACD"){let l=e.macd,c=n&&l!==void 0&&this.length>0&&i>=this.length-1,u=c?i:0,h=c?In(i===this.length?l.afterLast:l.beforeLast):Dn();o=c?e.result.rows:new Array(t.length);let d=Dn(),[p,m,y]=r;for(let g=u;g<t.length;g++){g===t.length-1&&(d=In(h));let v=X(t[g].close),b=Et("EMA",v,p,h.fast),f=Et("EMA",v,m,h.slow),w=b===null||f===null?null:b-f,_=Et("EMA",w,y,h.signal);o[g]={dif:X(w),dea:X(_),hist:w===null||_===null?null:X(w-_)}}u===t.length&&l!==void 0&&(d=l.beforeLast),e.macd={beforeLast:d,afterLast:h}}else if(a==="KDJ"&&n&&this.length>0&&i>=this.length-1&&i>0&&e.result.rows[i-1]?.k!=null&&e.result.rows[i-1]?.d!=null){o=e.result.rows;let[l,c,u]=r,h=o[i-1].k,d=o[i-1].d;for(let p=i;p<t.length;p++){let m=-1/0,y=1/0;for(let b=Math.max(0,p-l+1);b<=p;b++){let f=X(t[b].high),w=X(t[b].low);if(f===null||w===null){m=NaN;break}m=Math.max(m,f),y=Math.min(y,w)}let g=X(t[p].close),v=g===null||p<l-1?null:X(m===y?0:100*(g-y)/(m-y));if(v===null){o[p]={k:null,d:null,j:null},h=50,d=50;continue}h=((c-1)*h+v)/c,d=((u-1)*d+h)/u,o[p]={k:X(h),d:X(d),j:X(3*h-2*d)}}}else if(a==="VOL"){o=n?e.result.rows:new Array(t.length);for(let l=n?i:0;l<t.length;l++)o[l]=fr(t[l])}else{let l=n&&i>=this.length-1?wn(e.definition.calculate):void 0,c=l?.inputStart(r,i,t.length)??0,u=e.definition.calculate(c>0?t.slice(c):t,r);if(!Array.isArray(u)||u.length!==t.length-c)throw new RangeError(`${e.instance.name} must return one row per bar`);if(a!==void 0)o=u;else{let h=c>0?l.outputStart(r,i,t.length):0;o=c>0?e.result.rows:new Array(t.length);for(let d=h;d<t.length;d++){let p=Object.create(null);for(let m of e.definition.figures)p[m.key]=X(u[d-c]?.[m.key]);o[d]=p}o.length=t.length}}e.result={id:e.instance.id,name:e.instance.name,pane:e.instance.pane,paneId:e.instance.paneId,figures:e.definition.figures,rows:o}}assertLive(){if(this.disposed)throw new Error("EngineIndicators has been disposed")}},Rn=[0,.236,.382,.5,.618,.786,1],Bs=[1,.75,.618,.5,.382,.25,0],Os=[.382,.5,.618,1],Ws=[0,1,2,3,5,8,13,21,34],zs=[1/8,1/4,1/3,1/2,1,2,3,4,8],Cn=Math.PI*2,$e=Math.PI/2,Hs=e=>e!==null&&Number.isFinite(e.x)&&Number.isFinite(e.y),Ri=(e,t)=>({x:e.x/2+t.x/2,y:e.y/2+t.y/2}),ht=(e,t)=>Math.hypot(t.x-e.x,t.y-e.y),js=(e,t,i)=>({x:e.x+(t.x-e.x)*i,y:e.y+(t.y-e.y)*i});function $s(e,t){for(let i=1;i<t.length;i++)e.line(t[i-1],t[i])}function Gs(e){let t=e.length-1,i=0;for(let n=2;n<e.length;n++){let r=e[n-2],s=e[n-1],o=e[n];i=Math.max(i,t*(t-1)*Math.hypot(r.x-2*s.x+o.x,r.y-2*s.y+o.y))}return Math.max(1,Math.min(1024,Math.ceil(Math.sqrt(i/(8*.35)))))}function ui(e,t){let i=Gs(t),n=t[0];for(let r=1;r<=i;r++){let s=r/i,o=t;for(;o.length>1;)o=o.slice(1).map((a,l)=>js(o[l],a,s));e.line(n,o[0]),n=o[0]}}function Ue(e,t,i,n,r){if(![t.x,t.y,i,n,r].every(Number.isFinite)||i<=0)return;let s=Math.max(16,Math.min(512,Math.ceil(Math.abs(r-n)*Math.sqrt(i/.5)))),o=l=>({x:t.x+i*Math.cos(l),y:t.y+i*Math.sin(l)}),a=o(n);for(let l=1;l<=s;l++){let c=o(n+(r-n)*l/s);e.line(a,c),a=c}}function Us(e,t,i){let n=ht(t,i);if(!(n>0)||!Number.isFinite(n))return;let r=(i.x-t.x)/n,s=(i.y-t.y)/n,o=Math.min(10,n/3);e.line(t,i);for(let a of[1,-1])e.line(i,{x:i.x-r*o+a*s*o/2,y:i.y-s*o-a*r*o/2})}function Ln(e,t){let i=t?.bars;if(i===void 0||i.length<2)return null;let n=0,r=i.length-1;for(;n+1<r;){let o=n+r>>>1;i[o].timestamp<=e?n=o:r=o}e>=i[i.length-1].timestamp&&(n=i.length-2,r=i.length-1);let s=i[r].timestamp-i[n].timestamp;return s>0?n+(e-i[n].timestamp)/s:null}function gr({drawing:e,context:t}){let i=Ln(e.anchors[0].timestamp,t),n=Ln(e.anchors[1].timestamp,t);return i===null||n===null?null:Math.abs(Math.round(n-i))}function Pn(e){return({points:[t],sink:i})=>{let n=(r,s)=>({x:t.x+r,y:t.y+e*s});i.polygon([n(0,0),n(-7,9),n(-3,9),n(-3,20),n(3,20),n(3,9),n(7,9)])}}function He(e,t){return({points:i,sink:n})=>{if($s(n,i),i.forEach((r,s)=>n.text(r,`(${e?.[s]??s})`)),e!==null)for(let r=2;r<i.length;r++)n.line(i[r-2],i[r]);t&&(n.polygon([i[0],i[1],i[2]]),n.polygon([i[2],i[3],i[4]]))}}function An(e){return({points:[t,i],sink:n})=>{if(n.polygon([t,{x:i.x,y:t.y},i,{x:t.x,y:i.y}]),n.line(t,i),n.line({x:t.x,y:i.y},{x:i.x,y:t.y}),e){let r=Ri(t,i);n.line({x:r.x,y:t.y},{x:r.x,y:i.y}),n.line({x:t.x,y:r.y},{x:i.x,y:r.y});return}for(let r of[.25,.5])n.line(t,{x:i.x,y:i.y-(i.y-t.y)*r}),n.line({x:t.x,y:i.y},{x:i.x,y:t.y+(i.y-t.y)*r});for(let r of[.236,.5])n.line(t,{x:t.x+(i.x-t.x)*r,y:i.y}),n.line({x:t.x,y:i.y},{x:t.x+(i.x-t.x)*r,y:t.y})}}function qs({points:[e,t],sink:i}){let n=ht(e,t)/Math.sqrt(24),r=Math.atan2(t.y-e.y,t.x-e.x);if(!(n>0)||!Number.isFinite(n))return;let s=(u,h)=>({x:e.x+u*Math.cos(r)-h*Math.sin(r),y:e.y+u*Math.sin(r)+h*Math.cos(r)}),o=[n,n*2],a=-n,l=-n;Ue(i,s(-n,0),n,r,r+$e),Ue(i,s(a,l),o[1],r+$e,r+Math.PI);let c=[[-1,0],[0,-1],[1,0],[0,1]];for(let u=2;u<9;u++){o.push(o[u-2]+o[u-1]);let[h,d]=c[u%4];a+=h*o[u-2],l+=d*o[u-2];let p=r+u%4*$e;Ue(i,s(a,l),o[u],p,p+$e)}i.line(e,t,!0)}var Ks={"arrow-up":Pn(1),"arrow-down":Pn(-1),"price-line":({drawing:e,points:[t],bounds:i,sink:n})=>{n.line(t,{x:i.right,y:t.y}),n.text({x:i.right-3,y:t.y},"",e.anchors[0].price,"right")},flag:({points:[e],sink:t})=>{t.line(e,{x:e.x,y:e.y-22}),t.polygon([{x:e.x,y:e.y-22},{x:e.x+15,y:e.y-18},{x:e.x,y:e.y-14}])},pin:({points:[e],sink:t})=>{t.polygon([e,{x:e.x-7,y:e.y-15},{x:e.x+7,y:e.y-15}]),Ue(t,{x:e.x,y:e.y-18},8,0,Cn)},curve:({points:[e,t,i],sink:n})=>ui(n,[e,t,i]),arc:({points:[e,t,i],sink:n})=>ui(n,[e,{x:2*t.x-(e.x+i.x)/2,y:2*t.y-(e.y+i.y)/2},i]),"double-curve":({points:[e,t,i,n],sink:r})=>ui(r,[e,t,i,n]),"disjoint-channel":({points:[e,t,i],sink:n})=>n.polygon([e,t,{x:i.x+t.x-e.x,y:i.y+t.y-e.y},i]),"rotated-rectangle":({points:[e,t,i],sink:n})=>{let r=ht(e,t);if(!(r>0)){n.line(e,i);return}let s=-(t.y-e.y)/r,o=(t.x-e.x)/r,a=(i.x-t.x)*s+(i.y-t.y)*o;n.polygon([e,t,{x:t.x+s*a,y:t.y+o*a},{x:e.x+s*a,y:e.y+o*a}])},"fibonacci-line":({drawing:{anchors:[e,t]},project:i,bounds:n,sink:r})=>{for(let s of Rn){let o=t.price*(1-s)+e.price*s,a=i(e.timestamp,o);!Hs(a)||!Number.isFinite(o)||(r.line({x:n.left,y:a.y},{x:n.right,y:a.y}),r.text({x:n.right-3,y:a.y},`${Math.round(s*1e3)/10}%`,o,"right"))}},"fibonacci-circle":({points:[e,t],sink:i})=>{let n=ht(e,t);for(let r of Rn.slice(1))Ue(i,e,n*r,0,Cn),i.text({x:e.x,y:e.y+n*r},`${r*100}%`)},"fibonacci-spiral":qs,"fibonacci-fan":({points:[e,t],sink:i})=>{for(let n of Bs){let r=t.x-(t.x-e.x)*n,s=t.y-(t.y-e.y)*n;i.line({x:r,y:e.y},{x:r,y:t.y}),i.line({x:e.x,y:s},{x:t.x,y:s}),i.line(e,{x:r,y:t.y},!0),i.line(e,{x:t.x,y:s},!0),i.text({x:r,y:e.y},String(n)),i.text({x:e.x,y:s},String(n),void 0,"left")}},"fibonacci-time-zone":({points:[e,t],bounds:i,sink:n})=>{for(let r of Ws){let s=e.x+(t.x-e.x)*r;n.line({x:s,y:i.top},{x:s,y:i.bottom}),n.text({x:s,y:i.top+16},String(r))}},"fibonacci-arcs":({points:[e,t],sink:i})=>{let n=ht(e,t),r=t.x>=e.x,s=t.y>=e.y;i.line(e,t);let o=r?0:Math.PI,a=s?$e:r?-$e:Math.PI*1.5;for(let l of Os)Ue(i,e,n*l,o,a)},"gann-fan":({points:[e,t],sink:i})=>{for(let n of zs)i.line(e,{x:t.x,y:e.y+(t.y-e.y)*n},!0)},"gann-square":An(!0),"gann-box":An(!1),xabcd:He(["X","A","B","C","D"],!0),abcd:He(["A","B","C","D"],!1),"three-waves":He(null,!1),"five-waves":He(null,!1),"eight-waves":He(null,!1),"any-waves":He(null,!1),"time-range":e=>{let t=gr(e);t!==null&&e.sink.text(Ri(e.points[0],e.points[1]),`${t} bars`)},"price-time-range":e=>Fn(e,!0),forecast:e=>Fn(e,!1),note:({drawing:e,points:[t],sink:i})=>i.label(t,e.text??""),callout:({drawing:e,points:[t,i],sink:n})=>{n.line(t,i),n.label(i,e.text??"")},signpost:({drawing:e,points:[t],sink:i})=>{let n={x:t.x,y:t.y-26};i.line(t,n),i.label(n,e.text??"")}};function Fn(e,t){let{drawing:{anchors:[i,n]},points:[r,s],sink:o}=e;t?o.polygon([r,{x:s.x,y:r.y},s,{x:r.x,y:s.y}]):Us(o,r,s);let a=n.price-i.price,l=a/Math.abs(i.price)*100;if(!Number.isFinite(a))return;let c=Number.isFinite(l)?`${l>=0?"+":""}${l.toFixed(2)}%`:"Percentage unavailable";if(t){let u=gr(e);u!==null&&(c+=` \xB7 ${u} bars`),c+=" \xB7 \u0394"}t?o.text(Ri(r,s),c,a):o.text(s,c)}function yr(e,t,i,n,r,s){Ks[e.type]?.({drawing:e,points:t,project:i,bounds:n,context:r,sink:s})}var Bn=1e4,di=e=>Number.isFinite(e.high)&&Number.isFinite(e.low),On=e=>Number.isFinite(e.volume)&&e.volume>0?e.volume:0;function pi(e,t){return Math.max(0,Math.min(t-1,e))}function wr(e,t={}){let i=t.rows??24,n=t.valueArea??.7;if(!Number.isInteger(i)||i<1||i>Bn)throw new RangeError(`Volume profile rows must be an integer from 1 to ${Bn}`);if(!(n>0&&n<=1))throw new RangeError("Volume profile value area must be above 0 and at most 1");let r=1/0,s=-1/0;for(let m of e)di(m)&&(m.low<r&&(r=m.low),m.high>s&&(s=m.high));if(!Number.isFinite(r)||!Number.isFinite(s))return{rows:[],poc:NaN,vah:NaN,val:NaN,pmin:r,pmax:s};if(!(s>r)){let m=e.reduce((y,g)=>y+(di(g)?On(g):0),0);return{rows:[{priceLow:r,priceHigh:r,volume:m}],poc:r,vah:r,val:r,pmin:r,pmax:r}}let o=new Array(i).fill(0),a=(s-r)/i;for(let m of e){let y=di(m)?On(m):0;if(y<=0)continue;if(!(m.high>m.low)){o[pi(Math.floor((m.low-r)/a),i)]+=y;continue}let g=pi(Math.floor((m.low-r)/a),i),v=pi(Math.floor((m.high-r)/a),i),b=m.high-m.low;for(let f=g;f<=v;f++){let w=r+f*a,_=w+a,D=Math.min(m.high,_)-Math.max(m.low,w);D>0&&(o[f]+=y*(D/b))}}let l=o.reduce((m,y)=>m+y,0),c=0;for(let m=1;m<i;m++)o[m]>o[c]&&(c=m);let u=c,h=c,d=o[c];for(;d<l*n&&(u>0||h<i-1);){let m=u>0?o[u-1]:-1;(h<i-1?o[h+1]:-1)>=m?(h++,d+=o[h]):(u--,d+=o[u])}return{rows:o.map((m,y)=>({priceLow:r+y*a,priceHigh:r+(y+1)*a,volume:m})),poc:r+(c+.5)*a,vah:r+(h+1)*a,val:r+u*a,pmin:r,pmax:s}}var Ci=Object.freeze(["regression-trend","position-long","position-short","anchored-vwap","fixed-range-volume-profile","anchored-volume-profile"]),qe=Object.freeze({rangeBars:1e5,visibleVwapBars:8192,cachedCells:1e6,cacheEntries:64}),Wn=new WeakMap,Ge=new Set,mi=0;function Ys(e){let t={value:e,cells:e.vwap?.length??(e.profile?.rows.length??1)*3};for(Ge.add(t),mi+=t.cells;mi>qe.cachedCells||Ge.size>qe.cacheEntries;){let i=Ge.values().next().value;Ge.delete(i),mi-=i.cells,i.value=null}return t}function J(e,t,i={}){return Object.freeze({...i,type:e,status:t,...i.statistics===void 0?{}:{statistics:Object.freeze(i.statistics)}})}function we(e){return e!==null&&Number.isFinite(e.x)&&Number.isFinite(e.y)}function Vs(e,t){return e.x>=t.left&&e.x<=t.right&&e.y>=t.top&&e.y<=t.bottom}function Js(e,t){let i=0,n=e.length;for(;i<n;){let r=Math.floor((i+n)/2);e[r].timestamp<=t?i=r+1:n=r}return i-1}function Xs(e,t){return Number.isFinite(e.timestamp)&&Math.abs(e.timestamp)<=864e13&&e.timestamp>t&&[e.open,e.high,e.low,e.close].every(Number.isFinite)&&e.high>=Math.max(e.open,e.close,e.low)&&e.low<=Math.min(e.open,e.close)}function zn(e){let t=0,i=0;for(let n of e){let r=n-i,s=t+r;i=s-t-r,t=s}return t}function Qs(e,t,i,n){let r={fromIndex:i,toIndex:n},s=n-i+1;if(s>qe.rangeBars)return{result:J(e,"too-wide",r)};if(s<(e==="anchored-vwap"?1:2))return{result:J(e,"empty",r)};let o=0;for(let u=i;u<=n;u++){let h=t[u];if(!Xs(h,u===0?-1/0:t[u-1].timestamp))return{result:J(e,"invalid-data",r)};e!=="regression-trend"&&(typeof h.volume!="number"||!Number.isFinite(h.volume)||h.volume<0)&&o++}if(o>0)return{result:J(e,"missing-volume",{...r,missingVolumeBars:o})};if(e==="regression-trend"){let u=(s-1)/2,h=0;for(let v=i;v<=n;v++)h+=(t[v].close-h)/(v-i+1);function*d(){for(let v=i;v<=n;v++)yield(v-i-u)*(t[v].close-h)}let p=zn(d())/(s*(s*s-1)/12),m=h-p*u,y=0;for(let v=i;v<=n;v++)y=Math.hypot(y,t[v].close-(m+p*(v-i)));let g=y/Math.sqrt(s);return[p,m,g].every(Number.isFinite)?{result:J(e,"ready",{...r,statistics:{slope:p,intercept:m,standardDeviation:g}})}:{result:J(e,"invalid-data",r)}}if(e==="anchored-vwap"){let u=new Float64Array(s),h=0,d=0,p=0;for(let m=i;m<=n;m++){let y=t[m],g=y.volume,v=g-d,b=h+v;if(d=b-h-v,!Number.isFinite(b))return{result:J(e,"invalid-data",r)};if(g>0){let f=y.high/3+y.low/3+y.close/3;p=h===0?f:p*(h/b)+f*(g/b)}if(h=b,u[m-i]=h>0?p:NaN,h>0&&!Number.isFinite(p))return{result:J(e,"invalid-data",r)}}return{result:J(e,h>0?"ready":"empty",{...r,statistics:{totalVolume:h}}),vwap:u}}let a=t.slice(i,n+1).map(u=>({low:u.low,high:u.high,volume:u.volume})),l=wr(a,{rows:24,valueArea:.7}),c=zn(a.map(u=>u.volume));return!Number.isFinite(c)||![l.poc,l.vah,l.val,l.pmin,l.pmax].every(Number.isFinite)||l.rows.some(u=>![u.priceLow,u.priceHigh,u.volume].every(Number.isFinite))?{result:J(e,"invalid-data",r)}:{result:J(e,c>0?"ready":"empty",{...r,statistics:{totalVolume:c,poc:l.poc,valueAreaHigh:l.vah,valueAreaLow:l.val}}),profile:l}}function Zs(e,t,i,n){let r=t.bars,s=Wn.get(r),o=`${e}:${i}:${n}`,a=t.revision!==void 0&&s!==void 0&&Object.is(s.revision,t.revision)&&s.length===r.length&&s.firstTimestamp===r[0].timestamp&&s.lastTimestamp===r[r.length-1].timestamp,l=a?s.values.get(o):void 0;if(l!==void 0&&l.value!==null)return Ge.delete(l),Ge.add(l),l.value;let c=Qs(e,r,i,n);if(t.revision!==void 0){let u=a?s:{revision:t.revision,length:r.length,firstTimestamp:r[0].timestamp,lastTimestamp:r[r.length-1].timestamp,values:new Map};u.values.set(o,Ys(c)),u.values.size>qe.cacheEntries&&u.values.delete(u.values.keys().next().value),Wn.set(r,u)}return c}function eo(e,t,i,n,r){if(e.anchors.length!==3)return J(t,"invalid-position");let[s,o,a]=e.anchors.map(f=>f.price),l=t==="position-long";if(![s,o,a].every(Number.isFinite)||(l?!(o>s&&a<s):!(o<s&&a>s)))return J(t,"invalid-position");let c=Math.abs(o-s)/Math.abs(s-a);if(!Number.isFinite(c))return J(t,"invalid-position");let u=f=>{let w=(f-s)/Math.abs(s)*100;return s!==0&&Number.isFinite(w)?w:void 0},h=u(o),d=u(a),p={rewardRiskRatio:c,...h===void 0?{}:{targetChangePercent:h},...d===void 0?{}:{stopChangePercent:d}},m=e.anchors.map(f=>i(f.timestamp,f.price));if(!m.every(we))return J(t,"unprojectable",{statistics:p});let y=Math.min(...m.map(f=>f.x)),g=Math.max(...m.map(f=>f.x));for(let f of[m[1],m[2]])r.polygon([{x:y,y:m[0].y},{x:g,y:m[0].y},{x:g,y:f.y},{x:y,y:f.y}]);for(let f of m)r.line({x:y,y:f.y},{x:g,y:f.y});let v=(f,w,_)=>{let D={x:Math.max(n.left+4,Math.min(n.right-4,y/2+g/2)),y:f.y};Vs(D,n)&&r.text(D,w,_,"center")},b=f=>f===void 0?"":` ${f>=0?"+":""}${f.toFixed(2)}%`;return v(m[0],`${l?"Long":"Short"} R/R ${c.toFixed(2)}`),v(m[1],`Target${b(h)}`,o),v(m[2],`Stop${b(d)}`,a),J(t,"ready",{statistics:p})}function vr(e,t,i,n,r){let s=e.type;if(!Ci.includes(s))return null;if(s==="position-long"||s==="position-short")return eo(e,s,t,i,r);let o=n?.bars;if(n===void 0||o===void 0||o.length===0)return J(s,"unavailable-history");let a=s==="regression-trend"||s==="fixed-range-volume-profile"?2:1;if(e.anchors.length!==a||e.anchors.some(g=>!Number.isFinite(g.timestamp)))return J(s,"invalid-data");let l=e.anchors.map(g=>g.timestamp);if(l.some(g=>g<o[0].timestamp||g>o[o.length-1].timestamp))return J(s,"unavailable-history");let c=l.map(g=>Js(o,g)),u=Math.min(...c),h=a===2?Math.max(...c):o.length-1;if(u<0||h<u)return J(s,"unavailable-history");let d=Zs(s,n,u,h),p=d.result;if(p.status!=="ready")return p;let m=!1,y=(g,v)=>{we(g)&&we(v)&&(r.line(g,v),m=!0)};if(d.vwap!==void 0){let g=n.visibleRange??[u,h];if(g.length!==2||!g.every(Number.isFinite))return J(s,"invalid-data");let v=Math.max(u,Math.floor(Math.min(...g))-1),b=Math.min(h,Math.ceil(Math.max(...g))+1);if(b-v+1>qe.visibleVwapBars)return J(s,"too-wide",p);for(let f=v+1;f<=b;f++){let w=d.vwap[f-u-1],_=d.vwap[f-u];Number.isFinite(w)&&Number.isFinite(_)&&y(t(o[f-1].timestamp,w),t(o[f].timestamp,_))}}else if(s==="regression-trend"){let g=p.statistics,v=g.intercept,b=v+g.slope*(h-u);for(let f of[0,2*g.standardDeviation,-2*g.standardDeviation])Number.isFinite(v+f)&&Number.isFinite(b+f)&&y(t(o[u].timestamp,v+f),t(o[h].timestamp,b+f))}else if(d.profile!==void 0){let g=d.profile,v=t(e.anchors[0].timestamp,g.poc),b=a===2?t(e.anchors[1].timestamp,g.poc):null;if(!we(v)||a===2&&!we(b))return J(s,"unprojectable",p);let f=b===null?v.x:Math.min(v.x,b.x),w=b===null?120:Math.abs(b.x-v.x),_=g.rows.reduce((C,N)=>Math.max(C,N.volume),0);if(!(_>0))return J(s,"invalid-data",p);for(let C of g.rows){if(C.volume<=0)continue;let N=t(o[u].timestamp,C.priceLow),I=t(o[u].timestamp,C.priceHigh);if(!we(N)||!we(I))continue;let P=N.y/2+I.y/2,L=Math.max(.5,Math.abs(I.y/2-N.y/2)*.84),B=f+C.volume/_*w*(a===2?.95:1);[P,L,B].every(Number.isFinite)&&(r.polygon([{x:f,y:P-L},{x:B,y:P-L},{x:B,y:P+L},{x:f,y:P+L}]),m=!0)}let D=t(o[u].timestamp,g.poc);we(D)&&y({x:f,y:D.y},{x:f+w,y:D.y})}return m?p:J(s,"unprojectable",p)}var le=Object.freeze({encodedCharacters:512*1024,dimension:4096,pixels:4*1024*1024,cachedImages:32,cachedPixels:16*1024*1024}),Q=()=>{throw new TypeError("Drawing images must be bounded static PNG, JPEG or WebP rasters")};function be(e,t){if(!Number.isSafeInteger(e)||!Number.isSafeInteger(t)||e<=0||t<=0||e>le.dimension||t>le.dimension||e*t>le.pixels)throw new RangeError("Drawing image exceeds its decoded dimension or pixel limit")}function Ot(e,t){let i=new DataView(e.buffer,e.byteOffset,e.byteLength),n=(o,a)=>String.fromCharCode(...e.subarray(o,o+a)),r=0,s=0;if(t==="image/png"){(e.length<33||e[0]!==137||n(1,7)!==`PNG\r
|
|
2
|
+
|
|
3
|
+
`||i.getUint32(8)!==13||n(12,4)!=="IHDR")&&Q(),r=i.getUint32(16),s=i.getUint32(20);let o=8,a=!1,l=0;for(;o+12<=e.length;){let c=i.getUint32(o),u=n(o+4,4);if((c>e.length-o-12||u==="acTL")&&Q(),u==="IHDR"&&++l!==1&&Q(),o+=c+12,u==="IEND"){a=c===0&&o===e.length;break}}a||Q()}else if(t==="image/jpeg"){(e.length<4||e[0]!==255||e[1]!==216)&&Q();let o=2,a=0;for(;o<e.length;){for(e[o++]!==255&&Q();e[o]===255;)o++;let l=e[o++];if(l===218||l===217)break;if(l===1||l>=208&&l<=215)continue;o+2>e.length&&Q();let c=i.getUint16(o);(c<2||c>e.length-o)&&Q(),[192,193,194,195,197,198,199,201,202,203,205,206,207].includes(l)&&((![192,193,194].includes(l)||++a!==1)&&Q(),c<8&&Q(),s=i.getUint16(o+3),r=i.getUint16(o+5),be(r,s)),o+=c}}else if(t==="image/webp"){(e.length<20||n(0,4)!=="RIFF"||n(8,4)!=="WEBP"||i.getUint32(4,!0)!==e.length-8)&&Q();let o=12,a=0,l=0,c=0;for(;o+8<=e.length;){let u=n(o,4),h=i.getUint32(o+4,!0),d=o+8;if((h>e.length-d||u==="ANIM"||u==="ANMF")&&Q(),u==="VP8X")(h!==10||a!==0||e[d]&2)&&Q(),a=1+e[d+4]+(e[d+5]<<8)+(e[d+6]<<16),l=1+e[d+7]+(e[d+8]<<8)+(e[d+9]<<16),be(a,l);else if(u==="VP8 ")(++c!==1||h<10||e[d]&1||n(d+3,3)!=="\x9D*")&&Q(),r=i.getUint16(d+6,!0)&16383,s=i.getUint16(d+8,!0)&16383,be(r,s);else if(u==="VP8L"){(++c!==1||h<5||e[d]!==47)&&Q();let p=i.getUint32(d+1,!0);r=1+(p&16383),s=1+(p>>>14&16383),be(r,s)}o=d+h+h%2}(o!==e.length||c!==1||a!==0&&(a!==r||l!==s))&&Q()}else Q();return be(r,s),{width:r,height:s}}function Wt(e){if(typeof e!="string"||e.length>le.encodedCharacters)throw new RangeError("Drawing image exceeds its encoded size limit");let t=/^data:(image\/(?:png|jpeg|webp));base64,([A-Za-z0-9+/]+={0,2})$/.exec(e);if(t===null||t[2].length%4!==0)return Q();let i;try{i=atob(t[2])}catch{return Q()}let n=Uint8Array.from(i,r=>r.charCodeAt(0));return{mime:t[1],bytes:n,...Ot(n,t[1])}}function Be(e){return Wt(e),e}var zt=2048;function br(e,t,i){if(e.type!=="brush"&&e.type!=="highlighter"||e.hidden||e.anchors.length<2||e.anchors.length>zt)return null;let n=[];for(let r of e.anchors){let s=t(r.timestamp,r.price);if(s===null||!Number.isFinite(s.x)||!Number.isFinite(s.y))return null;n.push(Object.freeze({...s}))}return Object.freeze({kind:"stroke",points:Object.freeze(n),width:e.strokeWidth??(e.type==="highlighter"?16:2),opacity:e.type==="highlighter"?.24:1,clip:Object.freeze({...i})})}var ke=Object.freeze(["horizontal","vertical","horizontal-ray","segment","ray","trend-line","arrow","rectangle","ellipse","circle","price-range","time-range","fibonacci","horizontal-segment","vertical-segment","vertical-ray","parallel-channel","price-channel","pitchfork","schiff-pitchfork","modified-schiff-pitchfork","fibonacci-extension","triangle","parallelogram","text","price-label","arrow-up","arrow-down","price-line","curve","arc","double-curve","flag","regression-trend","disjoint-channel","rotated-rectangle","fibonacci-line","fibonacci-circle","fibonacci-spiral","fibonacci-fan","fibonacci-time-zone","gann-box","gann-fan","gann-square","fibonacci-arcs","xabcd","abcd","three-waves","five-waves","eight-waves","any-waves","position-long","position-short","price-time-range","forecast","note","callout","signpost","pin","image","anchored-vwap","fixed-range-volume-profile","anchored-volume-profile","brush","highlighter"]),xr=[0,.236,.382,.5,.618,.786,1],to=[...xr,1.618,2.618,3.618,4.236],Hn=1e3,jn=8*1024*1024,io=864e13;function Ct(e,t,i){if(e===null||typeof e!="object"||Array.isArray(e))throw new TypeError(`Invalid ${i}`);let n=e;if(Object.keys(n).some(r=>!t.includes(r)))throw new TypeError(`Unknown ${i} property`);return n}function $n(e,t){if(e===void 0)return!1;if(typeof e!="boolean")throw new TypeError(`Invalid drawing ${t}`);return e}function ft(e){return e==="text"||e==="note"||e==="callout"||e==="signpost"}function ye(e){switch(e){case"horizontal":case"vertical":case"horizontal-ray":case"text":case"price-label":case"arrow-up":case"arrow-down":case"price-line":case"flag":case"note":case"signpost":case"pin":case"anchored-vwap":case"anchored-volume-profile":return 1;case"parallel-channel":case"price-channel":case"pitchfork":case"schiff-pitchfork":case"modified-schiff-pitchfork":case"fibonacci-extension":case"triangle":case"parallelogram":case"curve":case"arc":case"disjoint-channel":case"rotated-rectangle":case"position-long":case"position-short":return 3;case"double-curve":case"abcd":case"three-waves":return 4;case"xabcd":return 5;case"five-waves":return 6;case"eight-waves":return 9;default:return 2}}function no(e,t){let i=ye(t),n=t==="brush"||t==="highlighter"||t==="any-waves";if(!Array.isArray(e)||(n?e.length<2||e.length>(t==="any-waves"?256:2048):e.length!==i))throw new TypeError(`${t} requires ${n?"a bounded path of at least 2":i} anchors`);let r=e.map(s=>{let o=Ct(s,["timestamp","price"],"drawing anchor");if(typeof o.timestamp!="number"||!Number.isFinite(o.timestamp)||Math.abs(o.timestamp)>io||typeof o.price!="number"||!Number.isFinite(o.price))throw new TypeError("Invalid drawing anchor coordinates");return{timestamp:o.timestamp,price:o.price}});return t==="horizontal-segment"&&(r[1].price=r[0].price),(t==="vertical-segment"||t==="vertical-ray")&&(r[1].timestamp=r[0].timestamp),Object.freeze(r.map(s=>Object.freeze(s)))}function fi(e){let t=Ct(e,["id","type","anchors","locked","hidden","text","image","strokeWidth"],"drawing");if(typeof t.id!="string"||t.id.trim()===""||t.id.length>128)throw new TypeError("Invalid drawing id");if(!ke.includes(t.type))throw new TypeError("Invalid drawing type");let i=t.type,n={};if(ft(i)){if(typeof t.text!="string"||t.text.trim()===""||t.text.length>512||t.text.split(`
|
|
4
|
+
`).length>8||Array.from(t.text).some(r=>{let s=r.charCodeAt(0);return s<32&&s!==9&&s!==10||s===127}))throw new TypeError("Drawing text must contain 1\u2013512 plain characters in at most 8 lines");n.text=t.text}else if(t.text!==void 0)throw new TypeError("Only text drawings accept text");if(i==="image")n.image=Be(t.image);else if(t.image!==void 0)throw new TypeError("Only image drawings accept image data");if(t.strokeWidth!==void 0){if(i!=="brush"&&i!=="highlighter"||typeof t.strokeWidth!="number"||!Number.isFinite(t.strokeWidth)||t.strokeWidth<1||t.strokeWidth>64)throw new TypeError("Invalid freehand stroke width");n.strokeWidth=t.strokeWidth}return Object.freeze({id:t.id,type:i,anchors:no(t.anchors,i),locked:$n(t.locked,"locked"),hidden:$n(t.hidden,"hidden"),...n})}function Gn(e,t){return e.id===t.id&&e.type===t.type&&e.locked===t.locked&&e.hidden===t.hidden&&e.text===t.text&&e.image===t.image&&e.strokeWidth===t.strokeWidth&&e.anchors.length===t.anchors.length&&e.anchors.every((i,n)=>i.timestamp===t.anchors[n].timestamp&&i.price===t.anchors[n].price)}function ue(e){return e!==null&&Number.isFinite(e.x)&&Number.isFinite(e.y)}function fe(e,t){return e.x>=t.left&&e.x<=t.right&&e.y>=t.top&&e.y<=t.bottom}function _r(e){if(![e.left,e.top,e.right,e.bottom].every(Number.isFinite)||e.left>=e.right||e.top>=e.bottom)throw new RangeError("Drawing bounds must be finite and have positive size")}function Un(e,t,i,n=!1,r=!1){let s=t.x-e.x,o=t.y-e.y;if(!Number.isFinite(s)||!Number.isFinite(o))return null;if(s===0&&o===0)return fe(e,i)?{kind:"line",from:e,to:t}:null;let a=r?-1/0:0,l=n||r?1/0:1,c=[[-s,e.x-i.left],[s,i.right-e.x],[-o,e.y-i.top],[o,i.bottom-e.y]];for(let[d,p]of c){if(d===0){if(p<0)return null;continue}let m=p/d;if(d<0?a=Math.max(a,m):l=Math.min(l,m),a>l)return null}let u={x:e.x+a*s,y:e.y+a*o},h={x:e.x+l*s,y:e.y+l*o};return ue(u)&&ue(h)?{kind:"line",from:u,to:h}:null}function ro(e,t){let i=[...e];for(let[n,r,s]of[["x",t.left,!0],["x",t.right,!1],["y",t.top,!0],["y",t.bottom,!1]]){let o=i;if(i=[],o.length===0)break;let a=o[o.length-1],l=s?a[n]>=r:a[n]<=r;for(let c of o){let u=s?c[n]>=r:c[n]<=r;if(u!==l){let h=(r-a[n])/(c[n]-a[n]),d={x:a.x*(1-h)+c.x*h,y:a.y*(1-h)+c.y*h};ue(d)&&i.push(d)}u&&i.push(c),a=c,l=u}}return i}function Ye(e,t,i,n){if(_r(i),e.hidden)return null;let r=e.anchors.map(f=>t(f.timestamp,f.price));if(!r.every(ue)&&!Ci.includes(e.type))return null;let s=r.map(f=>ue(f)?f:{x:NaN,y:NaN}),o=s[0];e.type==="horizontal-segment"&&(s[1]={x:s[1].x,y:o.y}),(e.type==="vertical-segment"||e.type==="vertical-ray")&&(s[1]={x:o.x,y:s[1].y});let a=s[1],l=s[2],c=[],u=(f,w,_=!1,D=!1)=>{let C=Un(f,w,i,_,D);C!==null&&c.push(C)},h=(f,w)=>{let _=w.x-f.x,D=w.y-f.y,C=Math.hypot(_,D);if(!fe(w,i)||!Number.isFinite(C)||C===0)return;let N=Math.min(10,C*.35),I=_/C,P=D/C;u({x:w.x-I*N+P*N*.5,y:w.y-P*N-I*N*.5},w),u({x:w.x-I*N-P*N*.5,y:w.y-P*N+I*N*.5},w)},d=()=>{let f=Math.min(o.x,a.x),w=Math.max(o.x,a.x),_=Math.min(o.y,a.y),D=Math.max(o.y,a.y),C={left:Math.max(f,i.left),right:Math.min(w,i.right),top:Math.max(_,i.top),bottom:Math.min(D,i.bottom)};C.left<C.right&&C.top<C.bottom&&c.push({kind:"rect",from:{x:C.left,y:C.top},to:{x:C.right,y:C.bottom}}),u({x:f,y:_},{x:w,y:_}),u({x:w,y:_},{x:w,y:D}),u({x:w,y:D},{x:f,y:D}),u({x:f,y:D},{x:f,y:_})},p=f=>{if(!f.every(ue))return;let w=ro(f,i);w.length>2&&c.push({kind:"polygon",points:w});for(let _=0;_<f.length;_++)u(f[_],f[(_+1)%f.length])},m=(f,w,_,D=!0)=>{if(!fe(f,i))return;let C=[];for(let L of w.split(`
|
|
5
|
+
`)){let B=Array.from(L);B.length===0&&C.push("");for(let z=0;z<B.length;z+=32)C.push(B.slice(z,z+32).join(""))}let N=C.slice(0,24),I=_===void 0?Math.max(32,Math.min(260,Math.max(...N.map(L=>Array.from(L).length))*8+12)):150,P={left:f.x,top:f.y,right:f.x+I,bottom:f.y+N.length*16+8};c.push({kind:"label",bounds:P,clip:{...i},lines:N,price:_,boxed:D})},y=(f,w)=>{if(c.length===0)return;let _={x:Math.min(i.right-4,Math.max(o.x,a.x)),y:Math.max(i.top+16,Math.min(o.y,a.y))};fe(_,i)&&c.push({kind:"text",position:_,text:f,price:w,align:"right"})};switch(e.type){case"horizontal":u({x:i.left,y:o.y},{x:i.right,y:o.y});break;case"vertical":u({x:o.x,y:i.top},{x:o.x,y:i.bottom});break;case"horizontal-ray":o.x<=i.right&&u(o,{x:i.right,y:o.y});break;case"segment":case"horizontal-segment":case"vertical-segment":u(o,a);break;case"vertical-ray":u(o,a,!0);break;case"ray":u(o,a,!0);break;case"trend-line":u(o,a,!1,!0);break;case"arrow":u(o,a),h(o,a);break;case"rectangle":d();break;case"triangle":p([o,a,l]);break;case"parallelogram":p([o,a,l,{x:o.x+l.x-a.x,y:o.y+l.y-a.y}]);break;case"parallel-channel":case"price-channel":{let f={x:a.x-o.x,y:a.y-o.y};if(!ue(f)||f.x===0&&f.y===0)break;let w=_=>({x:_.x+f.x,y:_.y+f.y});if(u(o,a,!1,!0),u(l,w(l),!1,!0),e.type==="price-channel"){let _={x:2*o.x-l.x,y:2*o.y-l.y};u(_,w(_),!1,!0)}else{let _={x:o.x/2+l.x/2,y:o.y/2+l.y/2};u(_,w(_),!1,!0)}break}case"pitchfork":case"schiff-pitchfork":case"modified-schiff-pitchfork":{let f=e.type==="pitchfork"?o:{x:e.type==="schiff-pitchfork"?o.x:o.x/2+a.x/2,y:o.y/2+a.y/2},w={x:a.x/2+l.x/2,y:a.y/2+l.y/2},_=w.x-f.x,D=w.y-f.y;if(u(a,l),!Number.isFinite(_)||!Number.isFinite(D)||_===0&&D===0)break;for(let C of[f,a,l])u(C,{x:C.x+_,y:C.y+D},!0);break}case"text":m(o,e.text??"",void 0,!1);break;case"price-label":m(o,"",e.anchors[0].price);break;case"ellipse":case"circle":{let f=e.type==="circle"?o:{x:o.x/2+a.x/2,y:o.y/2+a.y/2},w=e.type==="circle"?Math.hypot(a.x-o.x,a.y-o.y):Math.abs(a.x/2-o.x/2),_=e.type==="circle"?w:Math.abs(a.y/2-o.y/2);if(![w,_].every(Number.isFinite))break;if(w===0||_===0){u(o,a);break}if(f.x+w<i.left||f.x-w>i.right||f.y+_<i.top||f.y-_>i.bottom)break;c.push({kind:"ellipse",center:f,radiusX:w,radiusY:_,clip:{...i}});break}case"price-range":{d();let f={x:o.x/2+a.x/2,y:o.y},w={x:f.x,y:a.y};u(f,w),h(f,w),h(w,f);let _=e.anchors[1].price-e.anchors[0].price;if(!Number.isFinite(_))break;let D=_/Math.abs(e.anchors[0].price)*100;y(Number.isFinite(D)?`${D>=0?"+":""}${D.toFixed(2)}% \xB7 \u0394`:"\u0394",_);break}case"time-range":{d();let f={x:o.x,y:o.y/2+a.y/2},w={x:a.x,y:f.y};u(f,w),h(f,w),h(w,f);let _=Math.abs(e.anchors[1].timestamp-e.anchors[0].timestamp),[D,C]=_>=864e5?["d",864e5]:_>=36e5?["h",36e5]:_>=6e4?["m",6e4]:_>=1e3?["s",1e3]:["ms",1];y(`${Number((_/C).toFixed(2))} ${D}`);break}case"fibonacci":case"fibonacci-extension":{let f=e.anchors[0],w=e.anchors[1],_=e.type==="fibonacci-extension",D=e.anchors[2];_&&(u(o,a),u(a,l));for(let C of _?to:xr){let N=_?D.price+(w.price-f.price)*C:w.price*(1-C)+f.price*C,I=t(_?w.timestamp:f.timestamp,N),P=t(_?D.timestamp:w.timestamp,N);if(!Number.isFinite(N)||!ue(I)||!ue(P))continue;let L=Un(I,P,i);if(L===null||L.kind!=="line")continue;c.push(L);let B=L.from.x>L.to.x?L.from:L.to;c.push({kind:"text",position:B,text:`${Math.round(C*1e3)/10}%`,price:N,align:"right"})}break}}let g={line:u,polygon:p,label:m,text:(f,w,_,D="center")=>{ue(f)&&fe(f,i)&&c.push({kind:"text",position:f,text:w,price:_,align:D})}};yr(e,s,t,i,n,g);let v=vr(e,t,i,n,g)??void 0;if(e.type==="brush"||e.type==="highlighter"){let f=br(e,t,i);f!==null&&c.push(f)}if(e.type==="image"&&e.image!==void 0){let f={left:Math.min(o.x,a.x),top:Math.min(o.y,a.y),right:Math.max(o.x,a.x),bottom:Math.max(o.y,a.y)};f.left<i.right&&f.right>i.left&&f.top<i.bottom&&f.bottom>i.top&&f.left<f.right&&f.top<f.bottom&&c.push({kind:"image",source:e.image,bounds:f,clip:{...i}})}let b=e.locked?[]:s.flatMap((f,w)=>fe(f,i)?[{point:f,anchorIndex:w}]:[]);return{id:e.id,type:e.type,locked:e.locked,primitives:c,handles:b,...v===void 0?{}:{analysis:v}}}function bi(e,t,i){let n=i.x-t.x,r=i.y-t.y,s=n*n+r*r,o=s===0?0:Math.max(0,Math.min(1,((e.x-t.x)*n+(e.y-t.y)*r)/s));return Math.hypot(e.x-(t.x+o*n),e.y-(t.y+o*r))}function so(e,t){if(!fe(e,t.clip))return 1/0;let i=Math.abs(e.x-t.center.x),n=Math.abs(e.y-t.center.y),r=Math.max(t.radiusX,t.radiusY,i,n,1),s=t.radiusX/r,o=t.radiusY/r,a=i/r,l=n/r;if(Math.hypot(a/s,l/o)<=1)return 0;let c=s*s,u=o*o;if(c===0||u===0)return 1/0;let h=0,d=Math.hypot(s*a,o*l);for(let m=0;m<48;m++){let y=(h+d)/2;Math.hypot(s*a/(y+c),o*l/(y+u))>1?h=y:d=y}let p=(h+d)/2;return Math.hypot(a-c*a/(p+c),l-u*l/(p+u))*r}function oo(e,t){let i=!1,n=1/0;for(let r=0,s=t.length-1;r<t.length;s=r++){let o=t[r],a=t[s];n=Math.min(n,bi(e,o,a)),o.y>e.y!=a.y>e.y&&e.x<(a.x-o.x)*(e.y-o.y)/(a.y-o.y)+o.x&&(i=!i)}return i?0:n}function Ht(e,t,i,n=6){if(!ue(i)||!Number.isFinite(n)||n<0)return null;let r=e.find(s=>s.id===t);if(r!==void 0)for(let s of r.handles){let o=Math.hypot(i.x-s.point.x,i.y-s.point.y);if(o<=n)return{id:r.id,anchorIndex:s.anchorIndex,distance:o}}for(let s=e.length-1;s>=0;s--){let o=e[s];for(let a of o.primitives){if(a.kind==="text")continue;let l=a.kind==="stroke"?fe(i,a.clip)?Math.max(0,a.points.reduce((c,u,h)=>h===0?c:Math.min(c,bi(i,a.points[h-1],u)),1/0)-a.width/2):1/0:a.kind==="polygon"?oo(i,a.points):a.kind==="label"||a.kind==="image"?fe(i,a.clip)?Math.hypot(Math.max(a.bounds.left-i.x,0,i.x-a.bounds.right),Math.max(a.bounds.top-i.y,0,i.y-a.bounds.bottom)):1/0:a.kind==="ellipse"?so(i,a):a.kind==="line"?bi(i,a.from,a.to):Math.hypot(Math.max(a.from.x-i.x,0,i.x-a.to.x),Math.max(a.from.y-i.y,0,i.y-a.to.y));if(l<=n)return{id:o.id,anchorIndex:null,distance:l}}}return null}var Oe=class{drawings=Object.freeze([]);selectedId=null;past=[];future=[];listeners=new Set;historyLimit;snapshot=Object.freeze({drawings:this.drawings,selectedId:null,canUndo:!1,canRedo:!1});constructor(e={}){let t=e.historyLimit??50;if(!Number.isInteger(t)||t<0||t>200)throw new RangeError("Drawing history limit must be between 0 and 200");this.historyLimit=t}getSnapshot=()=>this.snapshot;subscribe=e=>(this.listeners.add(e),()=>{this.listeners.delete(e)});add(e){let t=fi(e);if(this.drawings.length>=Hn)throw new RangeError("Drawing limit reached");if(this.drawings.some(i=>i.id===t.id))throw new TypeError("Duplicate drawing id");return this.commit([...this.drawings,t]),t}update(e,t){let i=Ct(t,["anchors","locked","hidden","text","image","strokeWidth"],"drawing patch"),n=this.drawings.findIndex(a=>a.id===e);if(n<0)return!1;let r=this.drawings[n],s=fi({...r,...i});if(r.locked&&(i.anchors!==void 0||i.text!==void 0||i.image!==void 0||i.strokeWidth!==void 0)||Gn(r,s))return!1;let o=this.drawings.slice();return o[n]=s,this.commit(o),!0}remove(e){let t=this.drawings.find(i=>i.id===e);return t===void 0||t.locked?!1:(this.commit(this.drawings.filter(i=>i.id!==e)),!0)}clear(){let e=this.drawings.filter(t=>t.locked);return e.length===this.drawings.length?!1:(this.commit(e),!0)}select(e){return e!==null&&!this.drawings.some(t=>t.id===e&&!t.hidden)||e===this.selectedId?!1:(this.selectedId=e,this.publish(),!0)}undo(){let e=this.past.pop();return e===void 0?!1:(this.future.push(this.drawings),this.drawings=e,this.publish(),!0)}redo(){let e=this.future.pop();return e===void 0?!1:(this.past.push(this.drawings),this.drawings=e,this.publish(),!0)}exportJson(){return JSON.stringify({version:1,drawings:this.drawings})}importJson(e,t={}){if(typeof e!="string"||e.length>jn)throw new TypeError("Invalid drawing document size");let i=Ct(JSON.parse(e),["version","drawings"],"drawing document");if(i.version!==1||!Array.isArray(i.drawings)||i.drawings.length>Hn)throw new TypeError("Invalid drawing document");let n=i.drawings.map(fi);if(new Set(n.map(o=>o.id)).size!==n.length)throw new TypeError("Duplicate drawing id");let s=n.length!==this.drawings.length||n.some((o,a)=>!Gn(o,this.drawings[a]));t.recordHistory===!0?s&&this.commit(n):(this.past=[],this.future=[],this.drawings=Object.freeze(n),this.publish())}geometry(e,t,i){_r(t);let n=[];for(let r of this.drawings){let s=Ye(r,e,t,i);s!==null&&n.push(s)}return n}hitTest(e,t,i,n=6,r){return Ht(this.geometry(t,i,r),this.selectedId,e,n)}commit(e){if(JSON.stringify({version:1,drawings:e}).length>jn)throw new RangeError("Drawing document size limit reached");this.historyLimit>0&&(this.past.push(this.drawings),this.past.length>this.historyLimit&&this.past.shift()),this.future=[],this.drawings=Object.freeze(e),this.publish()}publish(){this.drawings.some(e=>e.id===this.selectedId&&!e.hidden)||(this.selectedId=null),this.snapshot=Object.freeze({drawings:this.drawings,selectedId:this.selectedId,canUndo:this.past.length>0,canRedo:this.future.length>0});for(let e of[...this.listeners])try{e()}catch(t){console.warn("[super-chart] Drawing observer failed",t)}}},Se=["candles","hollow-candles","outline-candles","hollow-down-candles","ohlc","volume-bars","columns","high-low","line","line-markers","step-line","area","hlc-area","baseline"],xi=600,ao={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>{clearTimeout(e)}};function Mr(e,t){if(!Number.isFinite(t)||Math.abs(t)>864e13)throw new RangeError("Replay timestamp must be valid epoch milliseconds");let i=0,n=e.length;for(;i<n;){let r=Math.floor((i+n)/2);e[r].timestamp<=t?i=r+1:n=r}return Math.max(0,i-1)}function Li(e){let{loader:t}=e,i=e.timer??ao,n=1,r=!1,s=!1,o=0,a,l=null,c=()=>{if(s)throw new Error("Timed replay has been disposed")},u=()=>{o++,a!==void 0&&(i.clearTimeout(a),a=void 0),r=!1},h=()=>l!==null&&e.getMarketKey()===l,d=()=>{let f=!s&&(l===null||h())?t.replayInfo:null;return Object.freeze({active:f!==null,index:f?.index??null,length:f?.length??0,timestamp:f?.timestamp??null,atEnd:f!==null&&t.replayAtEnd,playing:f!==null&&r,speed:n})},p=()=>{s||e.onChange?.(d())},m=f=>{let w=xi/f;if(!Number.isFinite(f)||f<=0||w<16||w>2147483647)throw new RangeError("Replay speed must give a step interval from 16ms to 2147483647ms")},y=f=>{s||!r||f!==o||!h()||!t.replaying||(a=i.setTimeout(()=>{if(!(s||f!==o||!r)){if(a=void 0,!h()||!t.replaying){u(),p();return}try{t.replayStep(1)}catch(w){throw u(),p(),w}s||f!==o||((!h()||!t.replaying||t.replayAtEnd)&&u(),p(),y(f))}},xi/n))},g=t.on?.("replay",f=>{!s&&!f&&(u(),l=null,p())}),v=(f={})=>{if(c(),f.index!==void 0&&(!Number.isSafeInteger(f.index)||f.index<0))throw new RangeError("Replay index must be a nonnegative safe integer");if(f.timestamp!==void 0&&(!Number.isFinite(f.timestamp)||Math.abs(f.timestamp)>864e13))throw new RangeError("Replay timestamp must be valid epoch milliseconds");if(f.index!==void 0&&f.timestamp!==void 0)throw new TypeError("Choose a replay index or timestamp, not both");let w=e.getMarketKey();if(w===null||(u(),t.replaying&&t.exitReplay(),s||e.getMarketKey()!==w))return!1;let _=f.index??(f.timestamp===void 0?void 0:Mr(e.getDataList(),f.timestamp));l=w;let D=t.enterReplay(_);return D||(l=null),p(),D&&!s&&h()},b=f=>{if(c(),m(f),f===n)return;let w=r;u(),n=f,r=w&&t.replaying&&h()&&!t.replayAtEnd;let _=o;p(),y(_)};return{start:v,startByTimestamp:f=>v({timestamp:f}),step:(f=1)=>{if(c(),!Number.isSafeInteger(f))throw new RangeError("Replay step must be a safe integer");return!t.replaying||!h()||f===0||(u(),t.replayStep(f),p()),d()},play:f=>{if(c(),f!==void 0&&m(f),!t.replaying||t.replayAtEnd)return!1;let w=e.getMarketKey();if(w===null||l!==null&&l!==w)return u(),p(),!1;if(l=w,r)return f!==void 0&&b(f),r;f!==void 0&&(n=f),r=!0;let _=o;return p(),y(_),r},setSpeed:b,pause:()=>{c();let f=r;u(),f&&p()},exit:()=>{c(),u(),t.exitReplay(),l=null,p()},getState:d,dispose:()=>{s||(s=!0,u(),g?.(),l=null)}}}var lo=864e13,xe=e=>Number.isFinite(e)&&Math.abs(e)<=lo,je=new Map;function co(e){if(je.has(e))return je.get(e);let t;try{t=new Intl.DateTimeFormat("en-US-u-ca-gregory-nu-latn",{timeZone:e,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hourCycle:"h23"})}catch{t=null}return je.size>=8&&je.delete(je.keys().next().value),je.set(e,t),t}function gi(e,t){let i={};for(let r of e.formatToParts(t))["year","month","day","hour","minute","second"].includes(r.type)&&(i[r.type]=Number(r.value));let n=new Date(0);return n.setUTCFullYear(i.year,i.month-1,i.day),n.setUTCHours(i.hour,i.minute,i.second,new Date(t).getUTCMilliseconds()),n.getTime()}function kr(e,t,i="UTC"){if(!xe(e)||!Number.isSafeInteger(t.multiplier)||t.multiplier<=0)return null;let r={second:1e3,minute:6e4,hour:36e5}[t.timespan];if(r!==void 0){let c=e+t.multiplier*r;return xe(c)&&c>e?c:null}if(!["day","week","month","year"].includes(t.timespan))return null;let s=co(i);if(s===null)return null;let o=new Date(gi(s,e));switch(t.timespan){case"day":o.setUTCDate(o.getUTCDate()+t.multiplier);break;case"week":o.setUTCDate(o.getUTCDate()+7*t.multiplier);break;case"month":o.setUTCMonth(o.getUTCMonth()+t.multiplier);break;case"year":o.setUTCFullYear(o.getUTCFullYear()+t.multiplier);break}let a=o.getTime();if(!xe(a))return null;let l=new Set;for(let c of[e,a-36*36e5,a,a+36*36e5]){if(!xe(c))continue;let u=gi(s,c)-c,h=a-u;xe(h)&&h>e&&gi(s,h)===a&&l.add(h)}return l.size===1?l.values().next().value:null}function Sr(e){if(!Number.isFinite(e))throw new RangeError("Countdown duration must be finite milliseconds");let t=Math.max(0,Math.ceil(e/1e3)),i=n=>String(n).padStart(2,"0");return t>=86400?`${Math.floor(t/86400)}d ${i(Math.floor(t%86400/3600))}h`:t>=3600?`${i(Math.floor(t/3600))}:${i(Math.floor(t%3600/60))}:${i(t%60)}`:`${i(Math.floor(t/60))}:${i(t%60)}`}function Tr(e,t){let i=e?.lastBar;if(e===null||e.enabled===!1||e.replaying===!0||i==null||!xe(t)||!xe(i.timestamp)||!Number.isFinite(i.open)||!Number.isFinite(i.close)||t<i.timestamp)return null;let n=e.closeTimestamp===void 0?kr(i.timestamp,e.period,e.symbolTimezone):e.closeTimestamp;if(n===null||!xe(n)||n<=t||n<=i.timestamp)return null;let r=n-t;return Object.freeze({marketKey:e.marketKey,openedAt:i.timestamp,closesAt:n,remainingMs:r,text:Sr(r),price:i.close,direction:i.close>i.open?"up":i.close<i.open?"down":"flat"})}function Pi(e){let t=e.now??Date.now,i=e.timer??{setTimeout:(c,u)=>setTimeout(c,u),clearTimeout:c=>{clearTimeout(c)}},n=null,r,s=0,o=!1,a=()=>{s++,r!==void 0&&(i.clearTimeout(r),r=void 0)},l=()=>{if(o)return;a();let c=s,u=t(),h=e.hidden?.()===!0?null:Tr(e.getContext(),u),d=h?.marketKey!==n?.marketKey||h?.openedAt!==n?.openedAt||h?.closesAt!==n?.closesAt||h?.text!==n?.text||h?.price!==n?.price||h?.direction!==n?.direction;if(n=h,d&&e.onChange(n),o||c!==s||n===null)return;let p=Math.max(1,Math.min(n.remainingMs,1e3-(u%1e3+1e3)%1e3));r=i.setTimeout(()=>{!o&&c===s&&(r=void 0,l())},p)};return l(),{refresh:l,getSnapshot:()=>n,dispose:()=>{if(o)return;o=!0,a();let c=n!==null;n=null,c&&e.onChange(null)}}}function It(e){return{symbol:{...e.symbol},period:{...e.period}}}function ot(e){return`${ne(e.symbol)}:${te(e.period)}`}var Ai=class{constructor(e,t){this.schedule=e,this.reportSuperseded=t}active=null;disposed=!1;get pending(){return this.active!==null}current(e){return this.active!==null&&ot(this.active.market)===ot(e)?this.active.promise:null}request(e){if(this.disposed)return Promise.resolve({status:"disposed"});let t=It(e);if(this.active!==null&&!this.active.sealed)return this.active.market=t,this.active.promise;let i=this.active===null?[]:[this.active],n,r=new Promise(o=>{n=o}),s={market:t,sealed:!1,superseded:i,promise:r,resolve:n};return this.active=s,this.schedule(()=>{s.sealed=!0,this.retireSuperseded(s)}),r}retireSuperseded(e){for(let t of e.superseded.splice(0)){let i={status:"superseded",by:It(e.market)};t.resolve(i),this.reportSuperseded(i)}}settle(e,t){if(this.active===null||!this.active.sealed||ot(this.active.market)!==ot(e))return!1;let i=this.active;return this.active=null,i.resolve(t),!0}cancel(){let e=this.active;if(e===null)return null;this.retireSuperseded(e);let t={status:"cancelled",...It(e.market)};return this.active=null,e.resolve(t),t}dispose(){this.disposed=!0;let e=this.active;this.active=null;for(let t of e?.superseded.splice(0)??[])t.resolve({status:"disposed"});e?.resolve({status:"disposed"})}};function _i(e){return Array.isArray(e)?Object.freeze(e.map(t=>_i(t))):e!==null&&typeof e=="object"?Object.freeze(Object.fromEntries(Object.entries(e).map(([t,i])=>[t,_i(i)]))):e}var Fi=class{constructor(e,t=queueMicrotask){this.warn=e,this.schedule=t}listeners=new Map;on(e,t){if(!["marketChange","loadState","loadResult","dataChange","replayChange"].includes(e))throw new RangeError("Unknown workspace event");if(typeof t!="function")throw new TypeError("Workspace listener must be a function");let i=this.listeners.get(e);return i===void 0&&(i=new Set,this.listeners.set(e,i)),i.add(t),()=>this.off(e,t)}off(e,t){this.listeners.get(e)?.delete(t)}emit(e,t){let i=[...this.listeners.get(e)??[]];if(i.length===0)return;let n=_i(t);this.schedule(()=>{for(let r of i)if(this.listeners.get(e)?.has(r))try{r(n)}catch(s){this.warn(`[super-chart] workspace ${e} listener failed`,s)}})}clear(){this.listeners.clear()}},pe=Object.freeze({characters:8*1024*1024,nodes:11e5,depth:24,indicators:64,params:64,drawings:1e3}),qn=new Set(["MA","EMA","BOLL","VOL","MACD","RSI","KDJ"]),ho=["ticker","name","shortName","exchange","market","pricePrecision","volumePrecision","priceCurrency","type","logo","timezone"],uo=["chartType","candleDensity","baseline","background","grid","text","up","down","line","font","pricePrecision","timeZone"],po=new Set(["__proto__","prototype","constructor"]);function Me(e,t,i,n){if(e===null||typeof e!="object"||Array.isArray(e))throw new TypeError(`Invalid ${n}`);let r=e;if(Object.keys(r).some(s=>!t.includes(s))||i.some(s=>!Object.prototype.hasOwnProperty.call(r,s)))throw new TypeError(`Unknown or missing ${n} property`);return r}function ce(e,t,i=128,n=!1){if(typeof e!="string"||e.length>i||!n&&e.trim()===""||Array.from(e).some(r=>r.charCodeAt(0)<32||r.charCodeAt(0)===127))throw new TypeError(`Invalid ${t}`);return e}function _e(e,t){if(typeof e!="number"||!Number.isFinite(e))throw new TypeError(`Invalid ${t}`);return e}function Lt(e,t,i,n=Number.MAX_SAFE_INTEGER){let r=_e(e,t);if(!Number.isSafeInteger(r)||r<i||r>n)throw new RangeError(`Invalid ${t}`);return r}function Er(e,t){if(typeof e!="boolean")throw new TypeError(`Invalid ${t}`);return e}function Dr(e,t){let i=ce(e,t);return new Intl.DateTimeFormat("en",{timeZone:i}).format(0),i}function mo(e){let t=[],i=0,n=(r,s)=>{if(++i>pe.nodes||s>pe.depth)throw new RangeError("Workspace document is too complex");if(typeof r=="number"&&!Number.isFinite(r))throw new TypeError("Workspace document contains a nonfinite number");if(r!==null&&typeof r=="object"){let o=Array.isArray(r)?void 0:Object.keys(r);if(o!==void 0&&o.length>256)throw new RangeError("Workspace object has too many properties");t.push({value:r,keys:o,index:0,depth:s})}};for(n(e,0);t.length>0;){let r=t[t.length-1],s=r.keys?.length??r.value.length;if(r.index>=s){t.pop();continue}let o=r.index++,a=r.keys===void 0?String(o):r.keys[o];if(po.has(a))throw new TypeError("Workspace document contains an unsafe property");n(r.value[a],r.depth+1)}}function fo(e){let t=[e];for(;t.length>0;){let i=t.pop();i!==null&&typeof i=="object"&&!Object.isFrozen(i)&&(t.push(...Object.values(i)),Object.freeze(i))}return e}function go(e){let t=Me(e,ho,["ticker"],"symbol");ce(t.ticker,"symbol ticker",256);for(let i of["name","shortName","exchange","market","priceCurrency","type"])t[i]!==void 0&&ce(t[i],`symbol ${i}`,256,!0);if(t.pricePrecision!==void 0&&t.pricePrecision!=="auto"&&Lt(t.pricePrecision,"symbol price precision",0,20),t.volumePrecision!==void 0&&Lt(t.volumePrecision,"symbol volume precision",0,20),t.timezone!==void 0&&Dr(t.timezone,"symbol timezone"),t.logo!==void 0){let i=ce(t.logo,"symbol logo",2048,!0);if(i!==""){let n=new URL(i);if(!["https:","http:"].includes(n.protocol)||n.username!==""||n.password!=="")throw new TypeError("Symbol logo must be an HTTP(S) URL without credentials")}}return{...t}}function yo(e){let t=Me(e,["multiplier","timespan","text"],["multiplier","timespan","text"],"period");return{multiplier:Lt(t.multiplier,"period multiplier",1),timespan:ce(t.timespan,"period timespan",64),text:ce(t.text,"period label",64)}}function wo(e){let t=Me(e,uo,[],"render options");if(t.candleDensity!==void 0&&t.candleDensity!=="raw"&&t.candleDensity!=="pixel-envelope")throw new RangeError("Unknown candle density mode");if(t.chartType!==void 0&&!Se.includes(t.chartType))throw new TypeError("Unknown chart type");t.baseline!==void 0&&_e(t.baseline,"baseline"),t.pricePrecision!==void 0&&Lt(t.pricePrecision,"render price precision",0,20),t.timeZone!==void 0&&Dr(t.timeZone,"display timezone");for(let i of["background","grid","text","up","down","line","font"])t[i]!==void 0&&ce(t[i],`render ${i}`,256);return{...t}}function vo(e){let t=Me(e,["axisGutter","priceScale","priceRatio","paneWeights"],[],"layout"),i={};if(t.axisGutter!==void 0&&(i.axisGutter=_e(t.axisGutter,"axis gutter")),t.priceRatio!==void 0&&(i.priceRatio=_e(t.priceRatio,"price ratio")),t.priceScale!==void 0){let n=Me(t.priceScale,["mode","reversed","range"],[],"price scale");if(n.reversed!==void 0&&Er(n.reversed,"reversed scale"),n.range!==void 0){if(!Array.isArray(n.range)||n.range.length!==2)throw new TypeError("Price range requires two raw prices");let r=_e(n.range[0],"price range minimum"),s=_e(n.range[1],"price range maximum"),o=n.mode==="log"?Math.log(s)-Math.log(r):s-r;if(!Number.isFinite(o)||o<=0)throw new RangeError("Price range cannot be projected")}i.priceScale={...n},Pe(i.priceScale)}if(t.paneWeights!==void 0){if(t.paneWeights===null||typeof t.paneWeights!="object"||Array.isArray(t.paneWeights))throw new TypeError("Invalid pane weights");let n=Object.entries(t.paneWeights);if(n.length>pe.indicators+1)throw new RangeError("Too many pane weights");for(let[r,s]of n)ce(r,"pane weight id",256),_e(s,"pane weight");i.paneWeights=Object.fromEntries(n)}return Ae(i),i}function bo(e,t){if(!Array.isArray(e)||e.length>pe.indicators)throw new TypeError("Invalid workspace indicators");let i=new Set(t.registeredIndicatorNames??[]);for(let s of i)ce(s,"registered indicator name");let n=new Set,r=new Fe;try{return e.map(s=>{let o=Me(s,["id","name","params","pane","paneId","visible"],["id","name","params","pane","visible"],"indicator"),a=ce(o.id,"indicator id"),l=ce(o.name,"indicator name");if(n.has(a))throw new TypeError("Duplicate indicator id");if(n.add(a),!qn.has(l)&&!i.has(l))throw new TypeError(`Indicator is not registered: ${l}`);if(!Array.isArray(o.params)||o.params.length>pe.params)throw new TypeError("Invalid indicator parameters");let c=o.params.map(h=>_e(h,"indicator parameter"));if(o.pane!=="price"&&o.pane!=="separate")throw new TypeError("Invalid indicator pane");let u={id:a,name:l,params:c,pane:o.pane,visible:Er(o.visible,"indicator visibility"),...o.paneId===void 0?{}:{paneId:ce(o.paneId,"indicator pane id")}};return qn.has(l)&&r.add(u),u})}finally{r.dispose()}}function Ve(e,t={}){if(typeof e!="string"||e.length===0||e.length>pe.characters)throw new TypeError("Invalid workspace document size");let i=JSON.parse(e);mo(i);let n=Me(i,["version","symbol","period","mode","render","layout","indicators","drawings"],["version","symbol","period","render","layout","indicators","drawings"],"workspace document");if(n.version!==1)throw new TypeError("Unsupported workspace document version");if(n.mode!==void 0&&n.mode!=="raw"&&n.mode!=="heikin-ashi")throw new TypeError("Invalid candle display mode");let r=go(n.symbol),s=yo(n.period),o=wo(n.render),a=vo(n.layout),l=bo(n.indicators,t),c=Me(n.drawings,["version","drawings"],["version","drawings"],"drawing document");if(!Array.isArray(c.drawings)||c.drawings.length>pe.drawings)throw new TypeError("Invalid drawing collection");let u=new Oe({historyLimit:0});return u.importJson(JSON.stringify(c)),fo({version:1,symbol:r,period:s,render:o,layout:a,indicators:l,...n.mode===void 0?{}:{mode:n.mode},drawings:{version:1,drawings:u.getSnapshot().drawings}})}var Ir={hour12:!1,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"};function oe(e,t,i){let n={};for(let{type:r,value:s}of e.formatToParts(new Date(t)))switch(r){case"year":n.YYYY=s;break;case"month":n.MM=s;break;case"day":n.DD=s;break;case"hour":n.HH=s==="24"?"00":s;break;case"minute":n.mm=s;break;case"second":n.ss=s;break}return i.replace(/YYYY|MM|DD|HH|mm|ss/g,r=>n[r]??r)}var xo=new Intl.DateTimeFormat("en",{...Ir,timeZone:"UTC"}),st=new Map;function _o(e){let t=st.get(e);if(t!==void 0)return t;let i;try{i=new Intl.DateTimeFormat("en",{...Ir,timeZone:e})}catch{i=xo}return st.size>=8&&st.delete(st.keys().next().value),st.set(e,i),i}function Mo(e){return e==="day"||e==="week"||e==="month"||e==="year"}function Bi(e){let t=Mo(e.timespan)?_o(e.symbolTimezone??"UTC"):e.displayDtf;switch(e.timespan){case"second":return e.type==="xAxis"?oe(t,e.timestamp,e.format==="YYYY"||e.format==="YYYY-MM"||e.format==="MM-DD"?e.format:"HH:mm:ss"):oe(t,e.timestamp,"YYYY-MM-DD HH:mm:ss");case"minute":return e.type==="xAxis"?e.format==="YYYY"||e.format==="YYYY-MM"||e.format==="MM-DD"?oe(t,e.timestamp,e.format):oe(t,e.timestamp,"HH:mm"):oe(t,e.timestamp,"YYYY-MM-DD HH:mm");case"hour":return e.type==="xAxis"?oe(t,e.timestamp,"MM-DD HH:mm"):oe(t,e.timestamp,"YYYY-MM-DD HH:mm");case"day":case"week":return oe(t,e.timestamp,"YYYY-MM-DD");case"month":return e.type==="xAxis"?oe(t,e.timestamp,"YYYY-MM"):oe(t,e.timestamp,"YYYY-MM-DD");case"year":return e.type==="xAxis"?oe(t,e.timestamp,"YYYY"):oe(t,e.timestamp,"YYYY-MM-DD");default:return oe(t,e.timestamp,"YYYY-MM-DD HH:mm")}}var ko=Object.freeze({isLength:se,sum:De,sma:Ie,wma:Ze,hma:$i,vwma:Gi,ema:Ee,rma:Qt,rsi:bt,macd:Zt,stdev:ei,dev:ti,bollinger:xt,highest:_t,lowest:Mt,linreg:qi,correlation:Ki,change:ii,mom:Yi,roc:Vi,crossover:Ji,crossunder:Xi,cross:Qi,cum:Zi,barssince:en,valuewhen:tn,pivot:nn,trueRange:ni,atr:it,obv:rn,vwap:sn,cci:an,mfi:ln,stochK:kt,sar:cn,stoch:ri,stochRsi:un,bbPercent:dn,keltner:pn,donchian:et,atrBands:mn,supertrend:fn,ichimoku:gn,anchoredVwap:yn});function Nr(e){return e.map((t,i)=>{let n=i>0?e[i-1].close:t.open;return{index:i,from:n,to:t.close,up:t.close>=n}})}function Rr(e){let t=[];return e.forEach((i,n)=>{n>0&&t.push({index:n,value:e[n-1].close}),t.push({index:n,value:i.close})}),t}function Oi(e){return(e.high+e.low+e.close)/3}function Cr(e){return e.map((t,i)=>({index:i,value:Oi(t)}))}function Lr(e,t){if(e.length===0)return[];let i=[],n=0,r=e[0].close>=t;for(let s=1;s<e.length;s++){let o=e[s].close>=t;o!==r&&(i.push({from:n,to:s-1,above:r}),n=s-1,r=o)}return i.push({from:n,to:e.length-1,above:r}),i}function jt(e,t){let i=t!==void 0&&Number.isFinite(t)&&t>0?t:e.geometry.plotWidth;for(let n=1;n<e.xPositions.length;n++){let r=e.xPositions[n]-e.xPositions[n-1];r>0&&(i=Math.min(i,r))}return Math.max(.25,i*.34)}function Pr(e){return e.map(t=>({open:t.o,high:t.h,low:t.l,close:t.c,volume:t.v}))}function Ar(e,t){for(let i=0;i<t.length;i++){let n=t[i];i===0?e.moveTo(n.x,n.y):e.lineTo(n.x,n.y)}}function Fr(e,t,i){let n=[],r=-2,s=[];for(let o of e){if(!Number.isFinite(o.x)||!Number.isFinite(t(i(o)))){r=-2;continue}o.index!==r+1&&(s=[],n.push(s)),s.push(o),r=o.index}return n}function So(e,t,i,n,r,s){let o=t.y(i);if(!Number.isFinite(o))return;let a=(l,c)=>{let u=t.y(l.c),h=t.y(c.c),d=h===u?0:Math.max(0,Math.min(1,(o-u)/(h-u)));return{x:l.x+(c.x-l.x)*d,y:o}};for(let l of Fr(t.plottedCandles,t.y,c=>c.c)){let c=Pr(l);for(let u of Lr(c,i)){let h=[];for(let y=u.from;y<=u.to;y++){let g=l[y];y===u.from&&g.c>=i!==u.above&&y+1<l.length?h.push(a(g,l[y+1])):h.push({x:g.x,y:t.y(g.c)})}u.to+1<l.length&&l[u.to+1].c>=i!==u.above&&h.push(a(l[u.to],l[u.to+1]));let d=h[0],p=h[h.length-1];if(d===void 0)continue;let m=u.above?n:r;e.fillStyle=e.strokeStyle=m,e.beginPath(),e.moveTo(d.x,o);for(let y of h)e.lineTo(y.x,y.y);e.lineTo(p.x,o),e.closePath(),e.globalAlpha=.22,e.fill(),e.globalAlpha=1,e.beginPath(),Ar(e,h),e.stroke()}}e.strokeStyle=s,e.lineWidth=1,e.setLineDash([4,4]),e.beginPath(),e.moveTo(t.geometry.left,o),e.lineTo(t.geometry.right,o),e.stroke()}function Br(e,t,i={},n){let r=i.chartType??"candles";if(r==="candles"||r==="ohlc"||r==="line"||r==="area")return!1;let s=t.model,o=s.plottedCandles,a=n??jt(s),l=i.up??"#58c9ac",c=i.down??"#f28b82",u=i.line??"#8bafff",h=d=>d?l:c;e.save();try{switch(e.globalAlpha=1,e.globalCompositeOperation="source-over",e.setLineDash([]),e.lineWidth=1.5,e.strokeStyle=e.fillStyle=u,r){case"hollow-candles":case"outline-candles":case"hollow-down-candles":{for(let d=0;d<2;d++){let p=d===0,m=r==="outline-candles"||(r==="hollow-candles"?p:!p);e.strokeStyle=e.fillStyle=h(p),e.lineWidth=1,e.beginPath();for(let y of o){if(y.c>=y.o!==p)continue;let{bodyTop:g,bodyBottom:v,wickTop:b,wickBottom:f}=y;if(!Number.isFinite(g)||!Number.isFinite(v)||!Number.isFinite(b)||!Number.isFinite(f))continue;let w=Math.max(1,v-g),_=(g+v-w)/2;e.moveTo(y.x,y.wickTop),e.lineTo(y.x,_),e.moveTo(y.x,_+w),e.lineTo(y.x,y.wickBottom)}e.stroke(),e.beginPath();for(let y of o){if(y.c>=y.o!==p)continue;let{bodyTop:g,bodyBottom:v}=y;if(!Number.isFinite(g)||!Number.isFinite(v))continue;let b=Math.max(1,v-g);e.rect(y.x-a,(g+v-b)/2,a*2,b)}m?e.stroke():e.fill()}break}case"columns":{let d=Nr(t.snapshot.bars),p=t.previousClose;d.length>0&&p!==void 0&&Number.isFinite(p)&&(d[0]={...d[0],from:p,up:d[0].to>=p});for(let m=0;m<2;m++){let y=m===0;e.fillStyle=h(y),e.beginPath();for(let g of o){let v=t.snapshot.bars[g.index]?.timestamp===g.t?g.index:typeof g.t=="number"?ut(t.snapshot.bars,g.t):null;if(v===null||t.snapshot.bars[v].timestamp!==g.t)continue;let b=d[v];if(b.up!==y)continue;let f=s.y(b.from),w=s.y(b.to);!Number.isFinite(f)||!Number.isFinite(w)||e.rect(g.x-a,Math.min(f,w),a*2,Math.max(1,Math.abs(w-f)))}e.fill()}break}case"high-low":{e.lineWidth=2;for(let d=0;d<2;d++){let p=d===0;e.strokeStyle=h(p),e.beginPath();for(let m of o){if(m.c>=m.o!==p)continue;let y=m.x,g=s.y(m.h),v=s.y(m.l);!Number.isFinite(g)||!Number.isFinite(v)||(e.moveTo(y,g),e.lineTo(y,v))}e.stroke()}break}case"volume-bars":{let d=0;for(let p of o)d=Math.max(d,p.v??0);e.lineWidth=2;for(let p=0;p<o.length;p++){let m=o[p],y=s.y(m.o),g=s.y(m.c);!Number.isFinite(y)||!Number.isFinite(g)||(e.strokeStyle=h(m.c>=m.o),e.globalAlpha=.25+.65*(d<=0?0:Math.max(0,Math.min(1,(m.v??0)/d))),e.beginPath(),e.moveTo(m.x,m.wickTop),e.lineTo(m.x,m.wickBottom),e.moveTo(m.x-a,y),e.lineTo(m.x,y),e.moveTo(m.x,g),e.lineTo(m.x+a,g),e.stroke())}break}case"step-line":case"hlc-area":case"line-markers":{let d=r==="hlc-area";for(let p of Fr(o,s.y,m=>d?m.h/3+m.l/3+m.c/3:m.c)){let m=Pr(p),y=r==="step-line"?Rr(m):d?Cr(m):m.map((v,b)=>({index:b,value:v.close}));if(d){for(let v of y)if(!Number.isFinite(v.value)){let b=m[v.index];v.value=b.high/3+b.low/3+b.close/3}}let g=y.map(v=>({x:p[v.index].x,y:s.y(v.value)})).filter(v=>Number.isFinite(v.y));if(g.length!==0){if(d){e.beginPath(),e.moveTo(g[0].x,s.geometry.bottom);for(let v of g)e.lineTo(v.x,v.y);e.lineTo(g[g.length-1].x,s.geometry.bottom),e.closePath(),e.globalAlpha=.18,e.fill(),e.globalAlpha=1}if(e.lineWidth=1.75,e.beginPath(),Ar(e,g),e.stroke(),r==="line-markers"){e.beginPath();for(let v of g)e.moveTo(v.x+2.5,v.y),e.arc(v.x,v.y,2.5,0,Math.PI*2);e.fill()}}}break}case"baseline":{let d=i.baseline??t.snapshot.bars[0]?.close;d!==void 0&&Number.isFinite(d)&&So(e,s,d,l,c,i.text??"#aebcca");break}default:return!1}return!0}finally{e.restore()}}var he={background:"#10151d",grid:"#283444",text:"#aebcca",up:"#58c9ac",down:"#f28b82",line:"#8bafff",font:"12px system-ui"},gt=new Map;function Gr(e){let t=gt.get(e);return t!==void 0||(t=new Intl.DateTimeFormat("en",{timeZone:e,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hourCycle:"h23"}),gt.size===8&>.delete(gt.keys().next().value),gt.set(e,t)),t}function Ur(e){return e!==void 0&&Number.isFinite(e)?Math.max(0,Math.min(20,Math.trunc(e))):2}var Or=new Map,Wr=new Map;function qr(e,t,i){return e.size>=512&&e.delete(e.keys().next().value),e.set(t,i),i}function Kr(e,t,i,n,r="HH:mm"){if(!Number.isFinite(t)||Math.abs(t)>864e13)return String(t);let s=JSON.stringify([i.timeZone??"UTC",t,i.timespan??"",i.symbolTimezone,n,r]);return Or.get(s)??qr(Or,s,Bi({displayDtf:e,timestamp:t,timespan:i.timespan??"",symbolTimezone:i.symbolTimezone,type:n,format:r}))}function To(e,t,i){let n=JSON.stringify([i,t]),r=Wr.get(n);if(r!==void 0)return r;let s={};for(let o of e.formatToParts(t))(o.type==="year"||o.type==="month"||o.type==="day")&&(s[o.type]=o.value);return qr(Wr,n,s)}function Eo(e,t){return t===null?"MM-DD":e.year!==t.year?"YYYY":e.month!==t.month?"YYYY-MM":e.day!==t.day?"MM-DD":"HH:mm"}function Yr(e){let t=e.geometry;return Number.isFinite(t.width)&&Number.isFinite(t.height)&&t.width>0&&t.height>0&&Number.isFinite(t.left)&&Number.isFinite(t.top)&&Number.isFinite(t.plotWidth)&&Number.isFinite(t.plotHeight)&&t.plotWidth>0&&t.plotHeight>0}function Vr(e,t){let i=t.geometry;e.beginPath(),e.rect(i.left,i.top,i.plotWidth,i.plotHeight),e.clip()}var zr=new WeakMap;function Jr(e){let t=zr.get(e);if(t!==void 0)return t;t={points:[]};for(let i of e.plottedCandles){let n=e.y(i.c);Number.isFinite(i.x)&&Number.isFinite(n)&&t.points.push({x:i.x,y:n,index:i.index})}return zr.set(e,t),t}function Hr(e,t,i){let n=-2,r=0,s=0,o=!1;for(let a of Jr(t).points)a.index!==n+1?(i&&o&&(e.lineTo(s,t.geometry.bottom),e.lineTo(r,t.geometry.bottom),e.closePath()),e.moveTo(a.x,a.y),r=a.x,o=!0):e.lineTo(a.x,a.y),n=a.index,s=a.x;i&&o&&(e.lineTo(s,t.geometry.bottom),e.lineTo(r,t.geometry.bottom),e.closePath())}function jr(e,t,i){if(typeof Path2D<"u"){let n=Jr(t),r=i?"area":"stroke",s=n[r];s===void 0&&(s=new Path2D,Hr(s,t,i),n[r]=s),i?e.fill(s):e.stroke(s)}else e.beginPath(),Hr(e,t,i),i?e.fill():e.stroke()}var $r=new WeakMap;function Do(e){if(e.plottedCandles.length<=e.geometry.plotWidth)return e.plottedCandles;let t=$r.get(e);if(t!==void 0)return t;let i=[],n=NaN;for(let r of e.plottedCandles){let s=Math.floor(r.x);if(!Number.isFinite(s))continue;let o=i[i.length-1];if(s!==n||o===void 0){i.push({...r}),n=s;continue}o.c=r.c,o.h=Math.max(o.h,r.h),o.l=Math.min(o.l,r.l),o.wickTop=Math.min(o.wickTop,r.wickTop),o.wickBottom=Math.max(o.wickBottom,r.wickBottom);let a=e.y(o.o),l=e.y(o.c);o.bodyTop=Math.min(a,l),o.bodyBottom=Math.max(a,l)}return $r.set(e,i),i}function $t(e,t,i={}){let n=t.model,r=n.geometry;if(!Yr(n))return;let s=Ur(i.pricePrecision??t.pricePrecision??Ke(t.snapshot.bars)),o=Gr(i.timeZone??"UTC");e.save();try{e.globalAlpha=1,e.globalCompositeOperation="source-over",e.setLineDash([]),e.lineWidth=1,e.fillStyle=i.background??he.background,e.fillRect(0,0,r.width,r.height),e.font=i.font??he.font,e.textBaseline="middle",e.save();try{Vr(e,n),e.strokeStyle=i.grid??he.grid,e.beginPath();for(let d of n.yTicks){let p=n.y(d);e.moveTo(r.left,p),e.lineTo(r.right,p)}for(let d of n.xTickIndices){let p=n.xPositions[d];e.moveTo(p,r.top),e.lineTo(p,r.bottom)}e.stroke();let c=i.chartType??"candles",u=t.snapshot.viewport.i1-t.snapshot.viewport.i0,h=c!=="line"&&c!=="area"||n.plottedSeries.some(d=>d.source.type==="bar")?jt(n,t.snapshot.dataStart!==void 0&&u>0?r.plotWidth/u:void 0):0;if(!Br(e,t,i,h))if(c==="line"||c==="area"){let d=i.line??he.line;c==="area"&&(e.fillStyle=d,e.globalAlpha=.14,jr(e,n,!0),e.globalAlpha=1),e.strokeStyle=d,e.lineWidth=1.5,jr(e,n,!1)}else{let d=i.candleDensity==="pixel-envelope"?Do(n):n.plottedCandles;for(let p=0;p<2;p++){let m=p===0,y=m?i.up??he.up:i.down??he.down;e.fillStyle=e.strokeStyle=y,e.beginPath();for(let g of d)if(g.c>=g.o===m&&(e.moveTo(g.x,g.wickTop),e.lineTo(g.x,g.wickBottom),c==="ohlc")){let v=n.y(g.o),b=n.y(g.c);e.moveTo(g.x-h,v),e.lineTo(g.x,v),e.moveTo(g.x,b),e.lineTo(g.x+h,b)}if(e.stroke(),c==="candles"){e.beginPath();for(let g of d){if(g.c>=g.o!==m)continue;let v=Math.max(1,g.bodyBottom-g.bodyTop);e.rect(g.x-h,g.bodyTop,2*h,v)}e.fill()}}}e.lineWidth=1.5;for(let d of n.plottedSeries){let p=t.figureStyles?.get(d.source.id);if(e.lineWidth=p?.lineWidth??1.5,e.setLineDash(p?.dash===void 0?[]:[...p.dash]),e.strokeStyle=d.source.color??i.line??he.line,d.source.type==="bar"){e.fillStyle=e.strokeStyle;let y=Math.max(n.min,Math.min(n.max,p?.base??0)),g=Math.max(r.top,Math.min(r.bottom,n.y(y)));e.beginPath();for(let v of d.points)e.rect(v.x-h,Math.min(g,v.y),h*2,Math.max(1,Math.abs(v.y-g)));e.fill();continue}if(d.source.type==="scatter"){e.fillStyle=e.strokeStyle,e.beginPath();for(let y of d.points)e.moveTo(y.x+e.lineWidth,y.y),e.arc(y.x,y.y,e.lineWidth,0,2*Math.PI);e.fill();continue}e.beginPath();let m=-2;for(let y of d.points)y.index!==m+1?e.moveTo(y.x,y.y):e.lineTo(y.x,y.y),m=y.index;e.stroke()}}finally{e.restore()}e.fillStyle=i.text??he.text,t.indicatorPane===!0&&t.title!==void 0&&(e.textAlign="left",e.fillText(t.title,r.left+4,Math.max(8,r.top-7),Math.max(1,r.plotWidth-8))),e.textAlign="right";for(let c of n.yTicks)e.fillText(i.formatPrice?.(c,s)??c.toFixed(s),r.left-6,n.y(c),Math.max(1,r.left-10));if(n.hasRightAxis){e.textAlign="left";for(let c of n.rightTicks)e.fillText(c.toFixed(s),r.right+6,n.y(c,"right"),Math.max(1,r.width-r.right-10))}let a=-1/0,l=null;e.textAlign="center";for(let c of i.showTimeAxis===!1?[]:n.xTickIndices){let u=n.xKeys[c],h=(i.timespan==="minute"||i.timespan==="second")&&typeof u=="number"&&Number.isFinite(u)&&Math.abs(u)<=864e13?To(o,u,i.timeZone??"UTC"):null,d=typeof u=="number"?Kr(o,u,i,"xAxis",h===null?"HH:mm":Eo(h,l)):String(u),p=Math.min(e.measureText(d).width,Math.max(1,r.width-8)),m=Math.max(4+p/2,Math.min(r.width-4-p/2,n.xPositions[c]));m-p/2<a+8||(e.fillText(d,m,Math.min(r.height-8,r.bottom+18),p),a=m+p/2,l=h)}}finally{e.restore()}}function Gt(e,t,i,n={}){let r=t.model,s=r.geometry;if(!Yr(r)||!Number.isFinite(i)||i<s.left||i>s.right)return;let o=Ft(r,i),a=t.inspectBar!==void 0?t.inspectBar(i):t.inspect(i);if(o===null||a===null)return;let l=a.displayBar,c=Oi(l),u=n.chartType==="hlc-area"?Number.isFinite(c)?c:l.high/3+l.low/3+l.close/3:l.close,h=r.xPositions[o],d=r.y(u),p=t.indicatorPane===!0;if(!Number.isFinite(h)||!p&&!Number.isFinite(d))return;let m=Ur(n.pricePrecision??t.pricePrecision??Ke(t.snapshot.bars));e.save();try{e.globalAlpha=1,e.globalCompositeOperation="source-over",e.strokeStyle=e.fillStyle=n.text??he.text,e.lineWidth=1,e.setLineDash([3,3]),e.save();try{Vr(e,r),e.beginPath(),e.moveTo(h,s.top),e.lineTo(h,s.bottom),p||(e.moveTo(s.left,d),e.lineTo(s.right,d)),e.stroke()}finally{e.restore()}e.setLineDash([]),e.font=n.font??he.font,e.textAlign="left",e.textBaseline="top";let y=p?r.plottedSeries.map(w=>{let _=0,D=w.points.length;for(;_<D;){let N=_+D>>>1;w.points[N].index<o?_=N+1:D=N}let C=w.points[_]?.index===o?w.points[_]:void 0;return`${w.source.name??w.source.id} ${C===void 0?"\u2014":Number(C.value.toPrecision(6))}`}).join(" "):`${a.mode==="heikin-ashi"?"HA ":""}O ${l.open.toFixed(m)} H ${l.high.toFixed(m)} L ${l.low.toFixed(m)} C ${l.close.toFixed(m)}`,g=Math.min(s.plotWidth,e.measureText(y).width+8);e.fillStyle=n.background??he.background,e.fillRect(s.left,s.top,g,20),e.fillStyle=n.text??he.text,e.fillText(y,s.left+4,s.top+3,Math.max(1,g-8)),e.textAlign="right",e.textBaseline="middle",p||e.fillText(n.formatPrice?.(u,m)??u.toFixed(m),s.left-6,d,Math.max(1,s.left-10));let v=Kr(Gr(n.timeZone??"UTC"),a.timestamp,n,"crosshair"),b=Math.min(s.width-8,e.measureText(v).width),f=Math.max(4+b/2,Math.min(s.width-4-b/2,h));e.textAlign="center",n.showTimeAxis!==!1&&e.fillText(v,f,Math.min(s.height-8,s.bottom+18),b)}finally{e.restore()}}function Xr(e,t,i,n,r={}){let s=e.ownerDocument,o=s.defaultView;if(o===null)return Object.assign(()=>{},{cancelInput:()=>{}});let a=r.frameScheduler??{request:A=>o.requestAnimationFrame(A),cancel:A=>o.cancelAnimationFrame(A)},l=new o.AbortController,c=new Map,u=o.matchMedia?.("(prefers-reduced-motion: reduce)"),h=e.style.touchAction;e.style.touchAction="none";let d=!1,p=!1,m=null,y=null,g=null,v=null,b=null,f=null,w=0,_={x:0,time:0},D=null,C=null,N=A=>A instanceof o.Element&&A.closest('input,textarea,select,button,a,[contenteditable]:not([contenteditable="false"])')!==null,I=()=>{f=null},P=()=>(f===null&&(f=e.getBoundingClientRect()),b===null&&(b=a.request(()=>{b=null,f=null})),f),L=A=>{let T=o.performance.now();return Number.isFinite(A.timeStamp)&&Math.abs(A.timeStamp-T)<6e4?A.timeStamp:T},B=()=>{C!==null&&o.clearTimeout(C.timer),C=null},z=()=>{let A=i(),T=t.getSnapshot();return A!==null&&Number.isFinite(A.left)&&Number.isFinite(A.plotWidth)&&A.plotWidth>0&&T.length>0?{length:T.length,left:A.left,width:A.plotWidth,observed:T.viewport}:null},S=A=>{let T=z();return T!==null&&T.length===A.length&&T.left===A.left&&T.width===A.width&&T.observed===A.observed},M=()=>{let A=y;if(y=null,A===null||!S(A.frame))return;t.setViewport(A.next);let T=t.getSnapshot();m!==null&&(m.observed=T.viewport),D!==null&&(D.frame.observed=T.viewport),g!==null&&(g.frame.observed=T.viewport),T.viewport.i0===0&&T.hasMore&&t.requestMore()},O=()=>{d||v!==null||(v=a.request(A=>{if(v=null,!d){if(D!==null)if(!S(D.frame)||u?.matches===!0||r.reducedMotion===!0)D=null;else{let T=Math.max(0,A-D.started),W=Math.exp(-T/220),Y=-(D.velocity*220*(1-W))/D.frame.width*Math.max(0,ae(D.start)-1),U={i0:D.start.i0+Y,i1:D.start.i1+Y},V=Ce(U,D.frame.length,t.getLimits());y={next:V,frame:D.frame};let Z=Y<0&&V.i0>U.i0+1e-9||Y>0&&V.i1<U.i1-1e-9;(Math.abs(D.velocity*W)<.01||T>=1400||Z)&&(D=null)}if(g!==null)if(!S(g.frame))g=null;else{let T=t.getSnapshot().viewport,W=g.target,q=Math.max(0,A-g.time);g.time=A;let Y=r.reducedMotion===!0||u?.matches===!0?1:1-Math.exp(-q/40),U=ae(T),V=ae(W),Z=U*Math.exp(Math.log(V/U)*Y),ee=Math.abs(V-U)>1e-9?(Z-U)/(V-U):Y,ie={i0:T.i0+(W.i0-T.i0)*ee,i1:T.i1+(W.i1-T.i1)*ee},me=Math.max(Math.abs(ie.i0-W.i0),Math.abs(ie.i1-W.i1))*g.frame.width/Math.max(1,V-1),re=Y===1||me<.15||A-g.lastInput>=280;y={next:re?W:ie,frame:g.frame},re&&(g=null)}(D!==null||g!==null)&&O(),M(),c.size===0&&D===null&&g===null&&t.endNavigation()}}))},E=()=>{v!==null&&a.cancel(v),v=null},k=()=>{E(),g=null,D=null,M()},x=()=>{E(),y=null,g=null,D=null,w=0},F=()=>{let A=c.values(),T=A.next().value,W=A.next().value;return W===void 0?{x:T.x,distance:0}:{x:(T.x+W.x)/2,distance:Math.hypot(W.x-T.x,W.y-T.y)}},H=()=>{let A=z();if(c.size===0||A===null){m=null;return}let T=F();t.beginNavigation(),m={...A,start:{...A.observed},x:T.x,distance:T.distance},_={x:T.x,time:o.performance.now()},w=0},R=()=>{x(),B(),m=null,p=!1;let A=[...c.keys()];c.clear();for(let T of A)e.hasPointerCapture(T)&&e.releasePointerCapture(T);t.endNavigation(),n(null)},j=(A,T,W=!0)=>{e.addEventListener(A,T,{signal:l.signal,passive:W})};j("pointerdown",A=>{let T=A;if(T.button!==0||c.size>=2||N(T.target)||z()===null)return;k(),x(),B(),c.size===0&&t.endNavigation(),p=!1,t.beginNavigation();let W=P(),q={x:T.clientX-W.left,y:T.clientY-W.top};if(c.set(T.pointerId,q),e.setPointerCapture(T.pointerId),e.focus({preventScroll:!0}),H(),T.pointerType==="touch"&&c.size===1){let Y=T.pointerId;C={id:Y,point:q,timer:o.setTimeout(()=>{let U=c.get(Y);if(C?.id!==Y||U===void 0||c.size!==1||m===null||!S(m)){B();return}C=null,p=!0,y=null,w=0,t.endNavigation(),n(U.x)},450)}}else n(null)});let $=(A,T=A.target)=>{let W=P(),q=A.clientX-W.left,Y=A.clientY-W.top;if(!c.has(A.pointerId)){c.size===0&&!p&&!N(T)&&n(q);return}if(c.set(A.pointerId,{x:q,y:Y}),C!==null){if(Math.hypot(q-C.point.x,Y-C.point.y)<=8)return;B()}if(p&&c.size===1){n(q);return}if(m===null||!S(m)){y=null,H();return}let U=F(),V=L(A),Z=c.size===2&&m.distance>1?Math.max(1,U.distance)/m.distance:1,ee=Math.max(0,Math.min(1,(m.x-m.left)/m.width)),ie=Le(m.start,m.length,Z,ee,t.getLimits()),me=(m.x-U.x)/m.width*Math.max(0,ae(ie)-1);y={next:{i0:ie.i0+me,i1:ie.i1+me},frame:m};let re=V-_.time;if(c.size===1&&re>0){let Qe=Math.max(-3,Math.min(3,(U.x-_.x)/re));(re>80||Qe*w<0)&&(w=0),w+=(Qe-w)*(1-Math.exp(-re/30))}else c.size!==1&&(w=0);_={x:U.x,time:V},O(),n(U.x)};return j("pointermove",A=>{let T=A,W=T.getCoalescedEvents?.(),q=W===void 0||W.length===0?T:W[W.length-1];$(q,T.target)}),j("pointerup",A=>{let T=A;if(!c.has(T.pointerId))return;let W=c.get(T.pointerId),q=P();(W.x!==T.clientX-q.left||W.y!==T.clientY-q.top)&&$(T);let Y=c.size===1,U=o.performance.now()-_.time<80,V=m!==null&&S(m);if(k(),B(),c.delete(T.pointerId),e.hasPointerCapture(T.pointerId)&&e.releasePointerCapture(T.pointerId),c.size>0){H();return}let Z=z(),ee=w;m=null,!p&&Y&&V&&U&&Z!==null&&r.inertia===!0&&r.reducedMotion!==!0&&u?.matches!==!0&&Math.abs(ee)>.05?(D={frame:Z,start:{...Z.observed},velocity:ee,started:o.performance.now()},O()):t.endNavigation(),T.pointerType!=="mouse"&&!p&&n(null)}),j("pointercancel",R),j("lostpointercapture",A=>{c.has(A.pointerId)&&R()}),j("pointerleave",()=>{c.size===0&&!p&&n(null)}),j("blur",R),j("focusin",A=>{N(A.target)&&R()}),o.addEventListener("blur",R,{signal:l.signal}),o.addEventListener("resize",I,{signal:l.signal}),s.addEventListener("scroll",I,{signal:l.signal,capture:!0,passive:!0}),s.addEventListener("visibilitychange",()=>{s.hidden&&R()},{signal:l.signal}),j("wheel",A=>{let T=A,W=z();if(W===null||N(T.target)||c.size>0)return;let q=T.deltaMode===1?16:T.deltaMode===2?W.width:1,Y=T.deltaMode===1?16:T.deltaMode===2?e.clientHeight:1,U=T.deltaX*q,V=T.deltaY*Y,Z=o.performance.now(),ee=g!==null&&Z-g.lastInput<160?g.mode:null,ie=T.ctrlKey?"zoom":T.shiftKey?"pan":ee??(Math.abs(U)>Math.abs(V)*1.2?"pan":"zoom"),me=ie==="pan"?T.shiftKey&&U===0?V:U:V,re=Math.max(-400,Math.min(400,me));if(!Number.isFinite(re)||re===0)return;T.preventDefault(),D!==null&&(k(),t.endNavigation()),D=null,B(),p=!1;let Qe=Math.sign(re);(g===null||!S(g.frame)||g.direction!==Qe||g.mode!==ie)&&(g!==null&&g.mode!==ie&&t.endNavigation(),t.beginNavigation(),g={mode:ie,target:{...W.observed},direction:Qe,frame:W,time:Z,lastInput:Z});let zi=T.clientX-P().left;if(ie==="zoom")g.target=Le(g.target,W.length,Math.exp(-re*.002),(zi-W.left)/W.width,t.getLimits());else{let Hi=re/W.width*Math.max(0,ae(g.target)-1);g.target=Ce({i0:g.target.i0+Hi,i1:g.target.i1+Hi},W.length,t.getLimits())}g.lastInput=Z,O(),n(zi)},!1),j("keydown",A=>{let T=A;if(N(T.target)||T.ctrlKey||T.metaKey||T.isComposing)return;if(T.altKey){(T.key==="ArrowLeft"||T.key==="ArrowRight")&&(k(),R(),T.key==="ArrowLeft"?t.undoNavigation():t.redoNavigation(),T.preventDefault());return}if(T.key==="Escape"){R(),T.preventDefault();return}if(!["ArrowLeft","ArrowRight","PageUp","PageDown","+","=","-","Home"].includes(T.key))return;k(),R();let W=ae(t.getSnapshot().viewport);switch(T.key){case"ArrowLeft":t.pan(-10);break;case"ArrowRight":t.pan(10);break;case"PageUp":t.pan(-Math.round(W*.8));break;case"PageDown":t.pan(Math.round(W*.8));break;case"+":case"=":t.zoom(1.5);break;case"-":t.zoom(1/1.5);break;case"Home":t.followLatest();break}let q=t.getSnapshot();T.key!=="Home"&&q.viewport.i0===0&&q.hasMore&&t.requestMore(),T.preventDefault()},!1),Object.assign(()=>{d||(d=!0,l.abort(),R(),b!==null&&a.cancel(b),b=null,f=null,e.style.touchAction=h)},{cancelInput:R})}var Io=0,No=e=>e!==null&&Number.isFinite(e.timestamp)&&Math.abs(e.timestamp)<=864e13&&Number.isFinite(e.price);function Qr(e,t,i,n,r,s){let o=e.ownerDocument,a=o.defaultView;if(a===null)return{setTool:()=>{},dispose:()=>{}};let l=new a.AbortController,c=null,u=!1,h=0,d=0,p=null,m=I=>{I.preventDefault(),I.stopImmediatePropagation()},y=I=>I instanceof a.Element&&I.closest('input,textarea,select,button,a,[contenteditable]:not([contenteditable="false"])')!==null,g=()=>{let I=i(),P=e.getBoundingClientRect(),L=I?.model.geometry;return I!==null&&I.snapshot.length>0&&P.width>0&&P.height>0&&L!==void 0&&[L.left,L.right,L.top,L.bottom].every(Number.isFinite)&&L.right>L.left&&L.bottom>L.top?I:null},v=I=>{e.hasPointerCapture(I)&&e.releasePointerCapture(I)},b=()=>{d++,h!==0&&a.cancelAnimationFrame(h),h=0;let I=p;p=null,I!==null&&v(I.pointerId),n(null)},f=()=>{let I=g(),P=p;if(P===null||I===null||P.points.length<2)return null;let L=[];for(let B of P.points){let z=I.unproject(B.x,B.y);if(!No(z))return null;let S=I.project(z.timestamp,z.price);if(S===null||Math.abs(S.x-B.x)>.5||Math.abs(S.y-B.y)>.5)return null;L.push(Object.freeze({...z}))}return Object.freeze({id:P.id,type:P.type,anchors:Object.freeze(L),locked:!1,hidden:!1,strokeWidth:P.type==="highlighter"?16:2})},w=()=>{h=0,!u&&p!==null&&n(f())},_=I=>{let P=g();if(P===null)return null;let L=e.getBoundingClientRect(),B=P.model.geometry,z=I.clientX-L.left,S=I.clientY-L.top;return!Number.isFinite(z)||!Number.isFinite(S)?null:{x:Math.max(B.left,Math.min(B.right,z)),y:Math.max(B.top,Math.min(B.bottom,S))}},D=(I,P=!1)=>{let L=p,B=_(I);if(L===null||B===null)return;let z=L.points[L.points.length-1];Math.hypot(B.x-z.x,B.y-z.y)<(P?.01:L.spacing)||(L.points.length>=zt&&(L.points=L.points.filter((M,O)=>O%2===0||O===L.points.length-1),L.spacing*=2),L.points.push(B))},C=(I,P)=>{e.addEventListener(I,P,{capture:!0,passive:!1,signal:l.signal})};C("pointerdown",I=>{let P=I;if(c===null||y(P.target)||P.button!==0)return;if(p!==null){m(P);return}let L=g(),B=e.getBoundingClientRect(),z=L?.model.geometry;if(L===null||z===void 0||P.clientX-B.left<z.left||P.clientX-B.left>z.right||P.clientY-B.top<z.top||P.clientY-B.top>z.bottom)return;let S=d,M=c;if(m(P),s?.(),u||S!==d||c!==M)return;let O=_(P);if(O===null)return;let E;do E=`stroke-${Date.now().toString(36)}-${(++Io).toString(36)}`;while(t.getSnapshot().drawings.some(k=>k.id===E));p={id:E,type:M,pointerId:P.pointerId,points:[O],spacing:2,original:t.getSnapshot().drawings};try{e.setPointerCapture(P.pointerId)}catch{b();return}e.focus({preventScroll:!0})}),C("pointermove",I=>{let P=I;if(p===null||(m(P),P.pointerId!==p.pointerId))return;let L=typeof P.getCoalescedEvents=="function"?P.getCoalescedEvents():[],B=Math.max(1,Math.ceil(L.length/64));for(let z=0;z<L.length;z+=B)D(L[z]);D(P),h===0&&(h=a.requestAnimationFrame(w))}),C("pointerup",I=>{let P=I;if(p===null||(m(P),P.pointerId!==p.pointerId))return;D(P,!0);let L=f(),B=p,z=d+1;b(),!(u||z!==d||L===null||B===null||c!==B.type||t.getSnapshot().drawings!==B.original||B.points.every(S=>Math.hypot(S.x-B.points[0].x,S.y-B.points[0].y)<2))&&(t.add(L),t.select(L.id),c=null,r?.())}),C("pointercancel",I=>{p?.pointerId===I.pointerId&&(m(I),b())}),C("lostpointercapture",I=>{p?.pointerId===I.pointerId&&b()}),C("keydown",I=>{let P=I;P.key==="Escape"&&!P.isComposing&&!y(P.target)&&(p!==null||c!==null)&&(m(P),b(),c=null,r?.())}),C("blur",I=>{let P=I.relatedTarget;(!(P instanceof a.Node)||!e.contains(P))&&b()}),a.addEventListener("blur",b,{signal:l.signal}),o.addEventListener("visibilitychange",()=>{o.hidden&&b()},{signal:l.signal});let N=t.subscribe?.(()=>{p!==null&&t.getSnapshot().drawings!==p.original&&b()});return{setTool:I=>{if(!u){if(I!==null&&I!=="brush"&&I!=="highlighter")throw new TypeError("Unknown freehand tool");b(),c=I}},dispose:()=>{u||(u=!0,l.abort(),N?.(),b(),c=null)}}}async function Ut(e,t){(!["image/png","image/jpeg","image/webp"].includes(e.type)||e.size<=0||e.size>Math.floor((le.encodedCharacters-32)*3/4))&&Q(),t?.throwIfAborted();let i=new Uint8Array(await e.arrayBuffer());t?.throwIfAborted(),Ot(i,e.type);let n="";for(let r=0;r<i.length;r+=8192)n+=String.fromCharCode(...i.subarray(r,r+8192));return Be(`data:${e.type};base64,${btoa(n)}`)}var Te=class{constructor(t=async i=>await createImageBitmap(i)){this.decode=t}entries=new Map;held=new Map;pixels=0;disposed=!1;prepare(t){if(this.disposed)return Promise.reject(new Error("Drawing image renderer is disposed"));let i=this.entries.get(t);if(i!==void 0)return i.promise;let n;try{n=Wt(t)}catch(o){return Promise.reject(o)}let r=n.width*n.height;if(this.entries.size>=le.cachedImages||this.pixels+r>le.cachedPixels)return Promise.reject(new RangeError("Drawing image cache is full; release unused images before adding another"));let s={promise:Promise.resolve(),bitmap:null,error:null,pixels:r,invalidations:new Set};return this.entries.set(t,s),this.pixels+=r,s.promise=Promise.resolve().then(async()=>{if(this.disposed||this.entries.get(t)!==s)throw new Error("Drawing image decode was cancelled");let o=await this.decode(new Blob([n.bytes],{type:n.mime}));if(this.disposed||this.entries.get(t)!==s)throw o.close(),new Error("Drawing image decode was cancelled");try{if(be(o.width,o.height),o.width*o.height!==r)throw new RangeError("Decoded image dimensions disagree with the raster header");s.bitmap=o}catch(a){throw o.close(),a}}).catch(o=>{throw s.error=o instanceof Error?o:new Error(String(o)),s.error}).finally(()=>{let o=[...s.invalidations];if(s.invalidations.clear(),!this.disposed&&this.entries.get(t)===s)for(let a of o)try{a()}catch{}}),s.promise.catch(()=>{}),s.promise}getError(t){return this.entries.get(t)?.error??null}paint(t,i,n,r,s){if(this.disposed||![n.left,n.top,n.right,n.bottom,r.left,r.top,r.right,r.bottom].every(Number.isFinite)||n.right<=n.left||n.bottom<=n.top||r.right<=r.left||r.bottom<=r.top)return"unavailable";this.entries.has(i)||this.prepare(i).catch(()=>{});let o=this.entries.get(i);if(o===void 0||o.error!==null)return"unavailable";if(o.bitmap===null)return s!==void 0&&o.invalidations.add(s),"loading";t.save();try{t.beginPath(),t.rect(r.left,r.top,r.right-r.left,r.bottom-r.top),t.clip(),t.globalAlpha=1,t.globalCompositeOperation="source-over",t.drawImage(o.bitmap,n.left,n.top,n.right-n.left,n.bottom-n.top)}finally{t.restore()}return"ready"}retain(t){for(let[i,n]of this.entries){let r=n.bitmap===null&&n.error===null;!t.has(i)&&!this.held.has(i)&&!r&&this.release(i)}}hold(t){if(this.disposed)throw new Error("Drawing image renderer is disposed");if(t.size>le.cachedImages)throw new RangeError("Too many held drawing images");let i=[...t];for(let r of i)Be(r);if(new Set([...this.held.keys(),...i]).size>le.cachedImages)throw new RangeError("Too many held drawing images");for(let r of i)this.held.set(r,(this.held.get(r)??0)+1);let n=!1;return()=>{if(!n){n=!0;for(let r of i){let s=this.held.get(r)??0;s<=1?this.held.delete(r):this.held.set(r,s-1)}}}}has(t){return this.entries.has(t)}release(t){if(this.held.has(t))return;let i=this.entries.get(t);i!==void 0&&(this.entries.delete(t),this.pixels-=i.pixels,i.invalidations.clear(),i.bitmap?.close())}dispose(){if(!this.disposed){this.disposed=!0,this.held.clear();for(let t of this.entries.keys())this.release(t)}}};var Ro=0;function Zr(e,t,i,n,r,s,o){let a=e.ownerDocument,l=a.defaultView;if(l===null)return{setTool:()=>{},dispose:()=>{}};let c=new l.AbortController,u=null,h=null,d=null,p=null,m=null,y=!1,g=E=>E instanceof l.Element&&E.closest('input,textarea,select,button,a,[contenteditable]:not([contenteditable="false"])')!==null,v=E=>{E.preventDefault(),E.stopImmediatePropagation()},b=E=>{let k=e.getBoundingClientRect();return{x:E.clientX-k.left,y:E.clientY-k.top}},f=()=>{let E=i(),k=E?.model.geometry,x=e.getBoundingClientRect();return x.width>0&&x.height>0&&E!==null&&E.snapshot.length>0&&k!==void 0&&[k.left,k.right,k.top,k.bottom].every(Number.isFinite)&&k.left<k.right&&k.top<k.bottom?E:null},w=E=>E!==null&&Number.isFinite(E.timestamp)&&Math.abs(E.timestamp)<=864e13&&Number.isFinite(E.price),_=E=>{e.hasPointerCapture(E)&&e.releasePointerCapture(E)},D=()=>{let E=h;h=null,d=null,E!==null&&_(E.pointerId),p?.close(),m!==null&&(m.abort.abort(),m.input.remove(),m=null),n(null)},C=()=>{u!==null&&(u=null,r?.())},N=Qr(e,t,i,n,r,s),I=E=>E.original===null||t.getSnapshot().drawings.find(k=>k.id===E.original?.id)===E.original,P=(E,k,x)=>({...E,anchors:E.anchors.map((F,H)=>H>=k?x:F)}),L=(E,k)=>{p?.close();let x=f(),F=E.anchors[E.type==="callout"?1:0],H=x?.project(F.timestamp,F.price);if(H==null){n(null),C();return}let R=a.createElement("textarea");R.setAttribute("aria-label","Drawing text"),R.placeholder="Text \xB7 Enter to save \xB7 Shift+Enter for a new line",R.maxLength=512,R.rows=3,R.value=E.text??"";let j=Math.min(260,e.clientWidth),$=Math.min(100,e.clientHeight);R.style.cssText=`position:absolute;z-index:4;box-sizing:border-box;resize:none;width:${j}px;height:${$}px;left:${Math.max(0,Math.min(H.x,e.clientWidth-j))}px;top:${Math.max(0,Math.min(H.y,e.clientHeight-$))}px;padding:6px;background:#10151d;color:#eee;border:1px solid #8bafff;font:12px system-ui;`;let G=!1,A=()=>{G||(G=!0,p?.input===R&&(p=null),R.remove(),n(null))},T=()=>{if(!G){if(k!==null&&t.getSnapshot().drawings.find(W=>W.id===k.id)!==k){A();return}try{let W=R.value;k===null?(t.add({...E,text:W}),t.select(E.id)):t.update(k.id,{text:W})}catch(W){R.setCustomValidity(W instanceof Error?W.message:"Invalid drawing text"),R.reportValidity();return}A(),C(),e.focus({preventScroll:!0})}};p={input:R,original:k,close:A},e.append(R),R.addEventListener("input",()=>{R.setCustomValidity(""),n({...E,text:R.value})}),R.addEventListener("keydown",W=>{W.stopPropagation(),W.key==="Escape"?(W.preventDefault(),A(),C(),e.focus({preventScroll:!0})):W.key==="Enter"&&!W.shiftKey&&!W.isComposing&&(W.preventDefault(),T())}),R.addEventListener("blur",()=>{A(),C()}),n(E),R.focus(),R.select()},B=E=>{let k=a.createElement("input"),x=new l.AbortController;k.type="file",k.accept="image/png,image/jpeg,image/webp",k.hidden=!0,m={abort:x,input:k},e.append(k);let F=()=>{k.remove(),m?.abort===x&&(m=null,n(null),C())};k.addEventListener("cancel",F,{once:!0}),k.addEventListener("change",()=>{let H=k.files?.[0];if(H===void 0){F();return}let R=o??new Te(async $=>await l.createImageBitmap($)),j;(async()=>{try{let $=await Ut(H,x.signal);if(j=$,await R.prepare($),y||x.signal.aborted||m?.abort!==x)return;t.add({...E,image:$}),t.select(E.id)}catch($){x.signal.aborted||(console.warn("[super-chart] Image drawing was not saved",$),e.dispatchEvent(new l.CustomEvent("drawingerror",{bubbles:!0,detail:$})))}finally{o===void 0?R.dispose():j!==void 0&&!t.getSnapshot().drawings.some($=>$.image===j)&&R.release(j),F()}})()},{once:!0}),k.click()},z=()=>{if(d?.preview.type!=="any-waves")return;let E=d.preview,k=E.anchors.slice(0,d.nextAnchor).filter((x,F,H)=>F===0||x.timestamp!==H[F-1].timestamp||x.price!==H[F-1].price);k.length<2||(d=null,t.add({...E,anchors:k}),t.select(E.id),n(null),C())},S=E=>{let k=h,x=f();if(k===null)return!1;if(k.preview.locked)return!0;if(x===null||!I(k))return D(),!1;let F=b(E),H=F.x-k.start.x,R=F.y-k.start.y;if(!Number.isFinite(H)||!Number.isFinite(R))return!1;if(Math.hypot(H,R)>2&&(k.moved=!0),k.original!==null&&!k.moved)return!0;let j;if(k.original===null){let $=x.unproject(F.x,F.y);if(!w($))return!1;j=ye(k.preview.type)===1?[$]:P(k.preview,k.anchorIndex??1,$).anchors}else if(k.anchorIndex!==null){let $=x.unproject(F.x,F.y);if(!w($))return!1;j=k.original.anchors.map((G,A)=>A===k.anchorIndex?$:G)}else{let $=[];for(let G of k.projected){let A=G.x+H,T=G.y+R,W=x.unproject(A,T);if(!w(W))return!1;let q=x.project(W.timestamp,W.price);if(q===null||Math.abs(q.x-A)>.5||Math.abs(q.y-T)>.5)return!1;$.push(W)}j=$}return k.preview={...k.preview,anchors:j},n(k.preview),!0},M=(E,k)=>{e.addEventListener(E,k,{capture:!0,passive:!1,signal:c.signal})};M("pointerdown",E=>{let k=E;if(p!==null&&g(k.target))return;if(m!==null){v(k);return}if(h!==null){v(k);return}if(k.button!==0||g(k.target))return;u!==null&&(v(k),s?.());let x=f();if(x===null)return;let F=b(k),H=x.model.geometry,R=F.x>=H.left&&F.x<=H.right&&F.y>=H.top&&F.y<=H.bottom;if(u!==null){if(!R)return;let j=x.unproject(F.x,F.y);if(!w(j))return;let $,G=null;if(d!==null)G=d.nextAnchor,$=P(d.preview,G,j),d=null;else{let A;do A=`drawing-${Date.now().toString(36)}-${(++Ro).toString(36)}`;while(t.getSnapshot().drawings.some(T=>T.id===A));$={id:A,type:u,anchors:Array.from({length:ye(u)},()=>j),locked:!1,hidden:!1}}h={pointerId:k.pointerId,start:F,original:null,preview:$,projected:[],anchorIndex:G,moved:!1},n($)}else{let j=R?t.hitTest(F,x.project,H,k.pointerType==="touch"?10:6,x.drawingContext):null;if(j===null){t.select(null);return}let $=t.getSnapshot().drawings.find(A=>A.id===j.id);if($===void 0||(t.select(j.id),$.locked))return;v(k),s?.();let G=[];for(let A of $.anchors){let T=x.project(A.timestamp,A.price);if(T===null||!Number.isFinite(T.x)||!Number.isFinite(T.y))return;G.push({...T})}h={pointerId:k.pointerId,start:F,original:$,preview:$,projected:G,anchorIndex:j.anchorIndex,moved:!1}}try{e.setPointerCapture(k.pointerId)}catch{D();return}e.focus({preventScroll:!0})}),M("pointermove",E=>{let k=E;if(h===null){if(d===null||g(k.target))return;let x=b(k),F=f()?.unproject(x.x,x.y);F!==void 0&&w(F)&&(d.preview=P(d.preview,d.nextAnchor,F),n(d.preview)),v(k);return}v(k),k.pointerId===h.pointerId&&S(k)}),M("pointerup",E=>{if(h===null)return;let k=E;if(v(k),k.pointerId!==h.pointerId)return;if(!S(k)){D();return}let x=h;if(x===null)return;if(h=null,_(x.pointerId),x.original===null&&x.preview.type==="any-waves"){let H=x.anchorIndex===null?x.moved?2:1:x.anchorIndex+1;if(H>=256){t.add(x.preview),t.select(x.preview.id),n(null),C();return}let R=x.preview.anchors.slice(0,H);R.push(R[R.length-1]),d={preview:{...x.preview,anchors:R},nextAnchor:H},n(d.preview);return}let F=ye(x.preview.type);if(x.original===null&&F>2&&x.anchorIndex!==F-1){d={preview:x.preview,nextAnchor:x.anchorIndex===null?x.moved?2:1:x.anchorIndex+1},n(x.preview);return}if(x.original===null&&ft(x.preview.type)){L(x.preview,null);return}if(x.original===null&&x.preview.type==="image"){x.moved?B(x.preview):n(null);return}try{if(x.original===null){if(!x.moved&&ye(x.preview.type)===2)return;t.add(x.preview),t.select(x.preview.id),C()}else x.moved&&!x.original.locked&&I(x)&&t.update(x.original.id,{anchors:x.preview.anchors})}finally{n(null)}}),M("dblclick",E=>{if(d?.preview.type==="any-waves"){v(E),z();return}if(u!==null||h!==null||d!==null||g(E.target))return;let k=f();if(k===null)return;let x=b(E),F=t.hitTest(x,k.project,k.model.geometry,6,k.drawingContext),H=t.getSnapshot().drawings.find(R=>R.id===F?.id);H===void 0||!ft(H.type)||H.locked||(v(E),t.select(H.id),s?.(),L(H,H))}),M("pointercancel",E=>{h!==null&&E.pointerId===h.pointerId&&(v(E),D())}),M("lostpointercapture",E=>{h!==null&&E.pointerId===h.pointerId&&D()}),M("blur",E=>{if(m!==null)return;let k=E.relatedTarget;(!(k instanceof l.Node)||!e.contains(k))&&D()}),l.addEventListener("blur",()=>{m===null&&D()},{signal:c.signal}),a.addEventListener("visibilitychange",()=>{a.hidden&&m===null&&D()},{signal:c.signal}),M("keydown",E=>{let k=E,x=a.activeElement;if(g(k.target)||k.isComposing||x===null||!e.contains(x))return;if(k.key==="Enter"&&d?.preview.type==="any-waves"){v(k),z();return}if(k.key==="Escape"&&(h!==null||d!==null||u!==null)){v(k),D(),C();return}let F=t.getSnapshot();if((k.ctrlKey||k.metaKey)&&!k.altKey){let R=k.key.toLowerCase(),j=R==="z"&&k.shiftKey||R==="y"&&!k.shiftKey,$=R==="z"&&!k.shiftKey;(j&&F.canRedo||$&&F.canUndo)&&(v(k),D(),N.setTool(null),j?t.redo():t.undo())}else if(!k.altKey&&!k.shiftKey&&(k.key==="Delete"||k.key==="Backspace")){let R=F.drawings.find(j=>j.id===F.selectedId);R!==void 0&&!R.locked&&(v(k),D(),t.remove(R.id))}});let O=t.subscribe(()=>{h!==null&&!I(h)&&D(),p?.original!==null&&p?.original!==void 0&&t.getSnapshot().drawings.find(E=>E.id===p?.original?.id)!==p.original&&p.close()});return{setTool:E=>{y||(D(),N.setTool(E==="brush"||E==="highlighter"?E:null),u=E==="brush"||E==="highlighter"?null:E)},dispose:()=>{y||(y=!0,c.abort(),O(),D(),N.dispose(),u=null)}}}function Wi(e,t,i,n={}){let r=n.lineWidth!==void 0&&Number.isFinite(n.lineWidth)&&n.lineWidth>0?n.lineWidth:1.5,s=n.handleRadius!==void 0&&Number.isFinite(n.handleRadius)&&n.handleRadius>0?n.handleRadius:4,o=n.fillOpacity!==void 0&&Number.isFinite(n.fillOpacity)?Math.max(0,Math.min(1,n.fillOpacity)):.1;e.save();try{e.globalAlpha=1,e.globalCompositeOperation="source-over";let a=n.bounds;if(a!==void 0){if(![a.left,a.right,a.top,a.bottom].every(Number.isFinite)||a.left>=a.right||a.top>=a.bottom)return;e.beginPath(),e.rect(a.left,a.top,a.right-a.left,a.bottom-a.top),e.clip()}e.lineWidth=r,e.lineCap="round",e.lineJoin="round",e.setLineDash([]),e.font=n.font??"11px system-ui",e.textBaseline="bottom";for(let l of t){let c=l.id===i,u=c?n.selectedColor??"#c3d5ff":n.color??"#8bafff";e.strokeStyle=u;for(let h of l.primitives)if(h.kind==="image"){let d=n.imageRenderer?.paint(e,h.source,h.bounds,h.clip,n.onInvalidate);if(n.imageRenderer===void 0||d==="unavailable"){e.save();try{let p=h.bounds,m=h.clip;e.beginPath(),e.rect(m.left,m.top,m.right-m.left,m.bottom-m.top),e.clip(),e.strokeRect(p.left,p.top,p.right-p.left,p.bottom-p.top),e.fillStyle=u,e.font="12px system-ui",e.textAlign="left",e.textBaseline="top",e.fillText("Image unavailable",p.left+4,p.top+4,Math.max(1,p.right-p.left-8))}finally{e.restore()}}}else if(h.kind==="stroke"){e.save();try{let d=h.clip;e.beginPath(),e.rect(d.left,d.top,d.right-d.left,d.bottom-d.top),e.clip(),e.lineWidth=h.width,e.globalAlpha=h.opacity,e.beginPath(),h.points.forEach((p,m)=>{m===0?e.moveTo(p.x,p.y):e.lineTo(p.x,p.y)}),e.stroke()}finally{e.restore()}}for(let h of l.primitives)h.kind!=="rect"&&h.kind!=="polygon"||(e.fillStyle=n.fillColor??u,e.globalAlpha=o,h.kind==="rect"?e.fillRect(h.from.x,h.from.y,h.to.x-h.from.x,h.to.y-h.from.y):(e.beginPath(),h.points.forEach((d,p)=>{p===0?e.moveTo(d.x,d.y):e.lineTo(d.x,d.y)}),e.closePath(),e.fill()));for(let h of l.primitives)if(h.kind==="ellipse"){e.save();try{let d=h.clip;e.beginPath(),e.rect(d.left,d.top,d.right-d.left,d.bottom-d.top),e.clip(),e.beginPath(),e.ellipse(h.center.x,h.center.y,h.radiusX,h.radiusY,0,0,Math.PI*2),e.fillStyle=n.fillColor??u,e.globalAlpha=o,e.fill(),e.globalAlpha=1,e.stroke()}finally{e.restore()}}e.globalAlpha=1,e.beginPath();for(let h of l.primitives)h.kind==="line"&&(e.moveTo(h.from.x,h.from.y),e.lineTo(h.to.x,h.to.y));e.stroke(),e.fillStyle=u;for(let h of l.primitives){if(h.kind==="label"){e.save();try{let p=h.bounds,m=h.clip;e.beginPath(),e.rect(m.left,m.top,m.right-m.left,m.bottom-m.top),e.clip(),h.boxed!==!1&&(e.fillStyle=n.handleFill??"#10151d",e.globalAlpha=.92,e.fillRect(p.left,p.top,p.right-p.left,p.bottom-p.top),e.globalAlpha=1,e.strokeRect(p.left,p.top,p.right-p.left,p.bottom-p.top)),e.beginPath(),e.rect(p.left,p.top,p.right-p.left,p.bottom-p.top),e.clip(),e.fillStyle=u,e.font="12px system-ui",e.textAlign="left",e.textBaseline="top",(h.price===void 0?h.lines:[n.formatPrice?.(h.price)??String(h.price)]).forEach((g,v)=>e.fillText(g,p.left+6,p.top+4+v*16,p.right-p.left-12))}finally{e.restore()}continue}if(h.kind!=="text")continue;e.textAlign=h.align;let d=h.price===void 0?h.text:`${h.text} ${n.formatPrice?.(h.price)??String(h.price)}`;e.fillText(d,h.position.x,h.position.y-3)}if(!(!c||l.locked)){e.fillStyle=n.handleFill??"#10151d",e.beginPath();for(let h of l.handles)e.moveTo(h.point.x+s,h.point.y),e.arc(h.point.x,h.point.y,s,0,Math.PI*2);e.fill(),e.stroke()}}}finally{e.restore()}}function es(e,t,i,n,r,s,o){let a=e.ownerDocument.defaultView;if(a===null)return()=>{};let l=o??{request:N=>a.requestAnimationFrame(N),cancel:N=>a.cancelAnimationFrame(N)},c=new a.AbortController,u=e.style.cursor,h=null,d=null,p=null,m=null,y=null,g=()=>{y=null},v=()=>(y===null&&(y=e.getBoundingClientRect()),m===null&&(m=l.request(()=>{m=null,y=null})),y),b=N=>{let I=v();return{x:N.clientX-I.left,y:N.clientY-I.top}},f=(N,I,P)=>{for(let z=1;z<N.panes.length;z++)if(Math.abs(P-N.panes[z].top)<=5)return z;let L=N.model.geometry;if(I>=0&&I<L.left&&P>=L.top&&P<=L.bottom)return null;let B=N.panes[N.panes.length-1];if(s!==void 0&&B!==void 0&&I>=L.left&&I<=L.right&&P>=B.top+B.frame.model.geometry.bottom&&P<=B.top+B.height)return"time"},w=()=>{p!==null&&l.cancel(p),p=null,d=null;let N=h;h=null,e.style.cursor=u,N?.area==="time"&&s?.endNavigation(),N!==null&&e.hasPointerCapture(N.pointer)&&e.releasePointerCapture(N.pointer)},_=()=>{let N=d;if(d=null,N===null||h===null)return;let I=t(),P=v(),L=h.initial;if(I===null||P.width!==h.width||P.height!==h.height||I.panes.map(B=>B.id).join(`
|
|
6
|
+
`)!==L.panes.map(B=>B.id).join(`
|
|
7
|
+
`)){w();return}if(h.area==="time"){if(s===void 0||s.getSnapshot().viewport!==h.observed||s.getSnapshot().length!==L.snapshot.length){w();return}let B=L.model.geometry,z=Math.max(0,Math.min(1,(h.x-B.left)/B.plotWidth)),S=Math.exp(Math.max(-4,Math.min(4,(N.x-h.x)/B.plotWidth*3)));s.setViewport(Le(L.snapshot.viewport,L.snapshot.length,S,z,s.getLimits())),h.observed=s.getSnapshot().viewport;return}if(I.snapshot.viewport!==L.snapshot.viewport){w();return}if(typeof h.area=="number"){let B=L.panes[h.area-1],z=L.panes[h.area],S=Math.min(48,h.height/L.panes.length),M=Math.max(S-B.height,Math.min(z.height-S,N.y-h.y)),O=Object.create(null);for(let E of L.panes)O[E.id]=Math.max(1e-9,E.height+(E===B?M:E===z?-M:0));n({paneWeights:O})}else{let B=L.panes[0].scale,z=L.model.geometry,S=Math.exp(Math.max(-4,Math.min(4,(N.y-h.y)/z.plotHeight*2))),M=B.value(h.y+(z.top-h.y)*S),O=B.value(h.y+(z.bottom-h.y)*S);Number.isFinite(M)&&Number.isFinite(O)&&M!==O&&(i().priceScale?.mode!=="log"||Math.min(M,O)>0)&&n({priceScale:{...i().priceScale,range:[Math.min(M,O),Math.max(M,O)]}})}},D=()=>{p===null&&(p=l.request(()=>{p=null,_()}))},C=N=>{N.preventDefault(),N.stopImmediatePropagation()};return e.addEventListener("pointerdown",N=>{if(N.button!==0||!N.isPrimary||h!==null)return;let I=t(),P=b(N);if(I===null||I.snapshot.length===0)return;let L=f(I,P.x,P.y);if(L===void 0)return;C(N),r(),L==="time"&&s?.beginNavigation();let B=v();h={pointer:N.pointerId,x:P.x,y:P.y,initial:I,width:B.width,height:B.height,area:L,observed:I.snapshot.viewport},e.setPointerCapture(N.pointerId),e.focus({preventScroll:!0})},{signal:c.signal,passive:!1}),e.addEventListener("pointermove",N=>{let I=N.getCoalescedEvents?.(),P=I===void 0||I.length===0?N:I[I.length-1],L=b(P);if(h===null){let B=t(),z=B===null?void 0:f(B,L.x,L.y);e.style.cursor=z===void 0?u:z==="time"?"ew-resize":"ns-resize";return}N.pointerId===h.pointer&&(C(N),d=L,D())},{signal:c.signal,passive:!1}),e.addEventListener("pointerup",N=>{N.pointerId===h?.pointer&&(C(N),d=b(N),_(),w())},{signal:c.signal}),e.addEventListener("pointercancel",w,{signal:c.signal}),e.addEventListener("lostpointercapture",N=>{N.pointerId===h?.pointer&&w()},{signal:c.signal}),e.addEventListener("dblclick",N=>{let I=t(),P=b(N);if(I===null)return;let L=f(I,P.x,P.y);L!==void 0&&(C(N),w(),r(),L==="time"?s?.resetViewport():n(L===null?{priceScale:{...i().priceScale,range:void 0}}:{paneWeights:void 0}))},{signal:c.signal}),e.addEventListener("keydown",N=>{N.key==="Escape"&&h!==null&&(C(N),w())},{signal:c.signal}),e.addEventListener("blur",w,{signal:c.signal}),a.addEventListener("blur",w,{signal:c.signal}),a.addEventListener("resize",g,{signal:c.signal}),e.ownerDocument.addEventListener("scroll",g,{signal:c.signal,capture:!0,passive:!0}),e.ownerDocument.addEventListener("visibilitychange",()=>{e.ownerDocument.hidden&&w()},{signal:c.signal}),()=>{c.abort(),w(),m!==null&&l.cancel(m),m=null,y=null}}function qt(e){return{...e,...e.priceScale===void 0?{}:{priceScale:{...e.priceScale,...e.priceScale.range===void 0?{}:{range:[...e.priceScale.range]}}},...e.paneWeights===void 0?{}:{paneWeights:{...e.paneWeights}}}}var Je=class{series=new Ii({referenceIndicators:!1});dataPort=Object.freeze({applyNewData:(t,i)=>{this.setData(t,i)},applyNormalizedData:(t,i)=>{this.assertLive(),this.validateBars(t,this.layout,t[0]?.close,!0),this.series.applyNewData(t,i)},truncateData:(t,i,n)=>(this.assertLive(),this.series.truncateData(t,i,n)),applyMoreData:(t,i)=>{this.prependData(t,i)},updateData:t=>{this.update(t)},updateDataBatch:(t,i)=>{this.updateBatch(t,i)},getDataList:()=>this.getBars(),getLastTimestamp:()=>(this.assertLive(),this.series.getLastTimestamp()),loadMore:t=>{this.assertLive(),this.series.loadMore(t)}});view;drawings=new Oe;indicators=new Fe;doc;win;root;canvas;cursorCanvas;drawingCanvas;drawingContext;drawingImages;context;cursorContext;resizeObserver;abort;unsubscribers=[];stopGestures;drawingInput;onInspect;inputs=new Map;layers=new Set;indicatorListeners=new Set;indicatorNoticeQueued=!1;inputId=0;draining=!1;preview=null;frame=null;frameId=0;cursorX=null;width=0;height=0;ratio=0;geometryDirty=!0;paintDirty=!0;drawingDirty=!0;cursorDirty=!0;disposed=!1;invalidateDrawings=()=>{this.disposed||(this.drawingDirty=!0,this.schedule())};viewportOptions;resolution;densityWidth=-1;layout;renderOptions;dprQuery=null;counters={frames:0,geometryBuilds:0,plotPaints:0,drawingPaints:0,cursorPaints:0,lastFrameMs:0,firstDataFrameMs:0,maxFrameMs:0};constructor(t,i={}){if(this.doc=t.ownerDocument,this.doc.defaultView===null)throw new Error("Chart host needs an active document");if(this.win=this.doc.defaultView,this.drawingImages=new Te(async a=>await this.win.createImageBitmap(a)),this.abort=new this.win.AbortController,this.layout=qt(i.layout??{}),Ae(this.layout),Pe(this.layout.priceScale??{}),this.viewportOptions={minBars:20,maxBars:1200,rightPaddingBars:12,...i.viewport},Bt(0,this.viewportOptions),this.resolution={...i.resolution},this.resolution.maxPixelRatio!==void 0&&(!Number.isFinite(this.resolution.maxPixelRatio)||this.resolution.maxPixelRatio<=0))throw new RangeError("Pixel ratio cap must be positive and finite");if(this.resolution.maxCanvasPixels!==void 0&&(!Number.isSafeInteger(this.resolution.maxCanvasPixels)||this.resolution.maxCanvasPixels<1))throw new RangeError("Canvas pixel budget must be a positive safe integer");this.renderOptions={...i.render},this.validateRender(this.renderOptions);for(let a of i.indicators??[{name:"MA",params:[20]},{name:"EMA",params:[21]}])this.indicators.add(a);this.view=new Ni(this.series,{count:i.count,mode:i.mode,continuous:!0,limits:this.viewportOptions}),this.onInspect=i.onInspect,this.root=this.doc.createElement("div"),this.root.style.cssText="position:relative;width:100%;height:100%;min-height:0;overflow:hidden;touch-action:none;",this.root.tabIndex=0,this.root.setAttribute("role","group"),this.root.setAttribute("aria-label","Chart. Drag to pan, pinch or wheel to zoom; Home follows the latest candle."),this.canvas=this.doc.createElement("canvas"),this.drawingCanvas=this.doc.createElement("canvas"),this.drawingCanvas.width=this.drawingCanvas.height=1,this.cursorCanvas=this.doc.createElement("canvas");for(let a of[this.canvas,this.drawingCanvas,this.cursorCanvas])a.style.cssText="position:absolute;inset:0;width:100%;height:100%;pointer-events:none;",a.setAttribute("aria-hidden","true"),this.root.append(a);let n=this.canvas.getContext("2d"),r=this.drawingCanvas.getContext("2d"),s=this.cursorCanvas.getContext("2d");if(n===null||r===null||s===null)throw this.view.dispose(),new Error("Canvas 2D is unavailable");this.context=n,this.drawingContext=r,this.cursorContext=s,t.append(this.root),this.unsubscribers.push(this.series.subscribe(a=>{this.indicators.invalidate(a),a.kind!=="availability"&&((this.indicators.hasCustom()||this.layers.size>0)&&(this.geometryDirty=!0),this.drawings.getSnapshot().drawings.length>0&&(this.drawingDirty=!0),(this.geometryDirty||this.drawingDirty)&&this.schedule())})),this.unsubscribers.push(this.view.subscribe(()=>{let a=this.view.getSnapshot(),l=this.frame?.snapshot;(l===void 0||a.viewport!==l.viewport||a.bars!==l.bars||a.ma20!==l.ma20||a.ema21!==l.ema21)&&(this.geometryDirty=!0),this.cursorDirty=!0,this.schedule()})),this.unsubscribers.push(this.drawings.subscribe(()=>{this.retainDrawingImages(),this.drawingDirty=!0,this.schedule()}));let o={request:a=>{let l=++this.inputId;return this.inputs.set(l,a),this.schedule(),l},cancel:a=>{this.inputs.delete(a)}};this.unsubscribers.push(es(this.root,()=>this.frame,()=>this.layout,a=>this.setLayout(a),()=>this.stopGestures.cancelInput(),this.view,o)),this.drawingInput=Zr(this.root,this.drawings,()=>this.frame,a=>{this.preview=a,this.drawingDirty=!0,this.schedule()},i.onToolComplete,()=>this.stopGestures.cancelInput(),this.drawingImages),this.stopGestures=Xr(this.root,this.view,()=>this.frame?.model.geometry??null,a=>{this.cursorX!==a&&(this.cursorX=a,this.cursorDirty=!0,this.schedule())},{inertia:i.inertia!==!1,frameScheduler:o}),this.resizeObserver=new this.win.ResizeObserver(()=>this.schedule()),this.resizeObserver.observe(this.root),this.doc.addEventListener("visibilitychange",()=>{this.doc.hidden&&this.frameId!==0?(this.win.cancelAnimationFrame(this.frameId),this.frameId=0):this.schedule()},{signal:this.abort.signal}),this.watchPixelRatio(),this.schedule()}setData(t,i=!1){this.assertLive();let n=de(t,1).bars;this.validateBars(n,this.layout,n[0]?.close),this.series.applyNewData(n,i)}update(t){this.assertLive();let i=Pt(t,1);if(i===null)throw new TypeError("Invalid OHLC candle");this.validateBars([i],this.layout,this.updateReference([i])),this.series.updateData(i)}prependData(t,i=!1){this.assertLive();let n=de(t,1).bars,r=this.series.getDataList()[0],s=r===void 0||n[0]!==void 0&&n[0].timestamp<r.timestamp?n[0]?.close:r.close;this.validateBars(n,this.layout,s),this.series.applyMoreData(n,i)}updateBatch(t,i){this.assertLive();let n=de(t,1).bars;this.validateBars(n,this.layout,this.updateReference(n)),this.series.updateDataBatch(n,i)}registerIndicator(t){this.assertLive(),this.indicators.register(t),this.notifyIndicators()}unregisterIndicator(t,i){this.assertLive();let n=this.indicators.unregister(t,i);return n&&this.notifyIndicators(),n}addIndicator(t){this.assertLive();let i=this.indicators.add(t);return this.geometryDirty=!0,this.schedule(),this.notifyIndicators(),i}removeIndicator(t){this.assertLive();let i=this.indicators.remove(t);return i&&(this.geometryDirty=!0,this.schedule(),this.notifyIndicators()),i}updateIndicator(t,i){this.assertLive();let n=this.indicators.update(t,i);return n&&(this.geometryDirty=!0,this.schedule(),this.notifyIndicators()),n}listIndicators(){return this.indicators.list()}getRegisteredIndicatorNames(){return this.indicators.registeredNames()}validateIndicatorReplacement(t){this.indicators.validateReplacement(t)}replaceIndicators(t){this.assertLive(),this.indicators.replace(t),this.geometryDirty=!0,this.schedule(),this.notifyIndicators()}onIndicatorsChanged(t){return this.assertLive(),this.indicatorListeners.add(t),()=>{this.indicatorListeners.delete(t)}}notifyIndicators(){this.indicatorNoticeQueued||this.disposed||(this.indicatorNoticeQueued=!0,this.win.queueMicrotask(()=>{if(this.indicatorNoticeQueued=!1,!this.disposed){for(let t of[...this.indicatorListeners])if(this.indicatorListeners.has(t))try{t()}catch(i){this.win.console.warn("Indicator change listener failed",i)}}}))}setDrawingTool(t){if(this.assertLive(),t!==null&&!ke.includes(t))throw new RangeError(`Unknown drawing tool ${JSON.stringify(t)}`);this.drawingInput.setTool(t)}addLayer(t){if(this.assertLive(),this.layers.has(t))throw new Error("Layer is already attached");return this.layers.add(t),this.geometryDirty=!0,this.schedule(),()=>{this.layers.delete(t)&&(this.paintDirty=!0,this.schedule(),t.dispose?.())}}setRenderOptions(t){this.assertLive();let i={...this.renderOptions,...t};this.validateRender(i),this.renderOptions=i,this.paintDirty=!0,this.drawingDirty=!0,this.cursorDirty=!0,this.schedule()}setLayout(t){this.assertLive();let i=qt({...this.layout,...t});Ae(i),Pe(i.priceScale??{}),(i.priceScale?.mode??"linear")!==(this.layout.priceScale?.mode??"linear")&&this.validateBars(this.series.getDataList(),i),this.layout=i,this.geometryDirty=!0,this.schedule()}getMetrics(){return{...this.counters}}getBars(t={}){if(this.assertLive(),Object.keys(t).some(o=>o!=="limit"))throw new TypeError("Only the bars limit option is supported");let i=t.limit;if(i!==void 0&&(!Number.isSafeInteger(i)||i<0))throw new RangeError("Bars limit must be a nonnegative safe integer");let n=this.series.getDataList(),r=i===void 0?0:Math.max(0,n.length-i),s=[];for(let o=r;o<n.length;o++)s.push({...n[o]});return s}getLastBar(){this.assertLive();let t=this.series.getDataList(),i=t[t.length-1];return i===void 0?null:{...i}}getLayoutOptions(){return this.assertLive(),qt(this.layout)}getRenderOptions(){return this.assertLive(),{...this.renderOptions}}restoreConfiguration(t,i){if(this.assertLive(),t.mode!=="raw"&&t.mode!=="heikin-ashi")throw new TypeError("Invalid candle mode");let n={...t.render},r=qt(t.layout);this.validateRender(n),Ae(r),Pe(r.priceScale??{});let s=i===void 0?this.series.getDataList():de(i.bars,1).bars;this.validateBars(s,r,s[0]?.close);let o=new Oe({historyLimit:0});o.importJson(t.drawingsJson);let a=o.exportJson();this.indicators.replace(t.indicators),this.renderOptions=n,this.layout=r,this.drawings.importJson(a,{recordHistory:!1});try{this.view.setMode(t.mode),i!==void 0&&this.series.applyNewData(s,i.more)}finally{this.geometryDirty=!0,this.drawingDirty=!0,this.cursorDirty=!0,this.schedule(),this.notifyIndicators()}}requestPaint(){this.assertLive(),this.paintDirty=!0,this.schedule()}async prepareDrawingImages(t){this.assertLive();let i=this.holdDrawingImages(t),n=new Set(t.flatMap(r=>r.image===void 0?[]:[r.image]));try{let s=(await Promise.allSettled([...n].map(async o=>await this.drawingImages.prepare(o)))).find(o=>o.status==="rejected");if(s!==void 0)throw s.reason;this.assertLive()}finally{i()}}holdDrawingImages(t){this.assertLive();let i=this.drawingImages.hold(new Set(t.flatMap(n=>n.image===void 0?[]:[n.image])));return()=>{i(),this.retainDrawingImages(),this.invalidateDrawings()}}retainDrawingImages(){let t=new Set(this.drawings.getSnapshot().drawings.flatMap(i=>i.image===void 0?[]:[i.image]));this.preview?.image!==void 0&&t.add(this.preview.image),this.drawingImages.retain(t)}async snapshot(){this.assertLive();let t=this.drawings.getSnapshot().drawings,i=this.holdDrawingImages(t);try{if(await this.prepareDrawingImages(t),this.drawings.getSnapshot().drawings!==t)throw new Error("Drawings changed while preparing the image; capture again");if(this.frameId!==0&&(this.win.cancelAnimationFrame(this.frameId),this.frameId=0),this.renderTick(this.win.performance.now()),this.assertLive(),this.width<=0||this.height<=0)throw new Error("Cannot capture a zero-sized chart");if(this.frame===null||this.drawings.getSnapshot().drawings!==t)throw new Error("Chart changed while preparing the image; capture again");let n=this.doc.createElement("canvas");n.width=this.canvas.width,n.height=this.canvas.height;let r=n.getContext("2d");if(r===null)throw new Error("Canvas 2D is unavailable");r.drawImage(this.canvas,0,0),r.setTransform(this.canvas.width/this.width,0,0,this.canvas.height/this.height,0,0);let s=this.frame.model.geometry;return Wi(r,this.drawings.geometry(this.frame.project,s,this.frame.drawingContext),null,{bounds:s,imageRenderer:this.drawingImages}),await new Promise((o,a)=>n.toBlob(l=>{l===null?a(new Error("PNG encoding failed")):o(l)},"image/png"))}finally{i()}}dispose(){if(this.disposed)return;this.disposed=!0,this.abort.abort(),this.resizeObserver.disconnect(),this.unsubscribers.forEach(n=>n()),this.drawingInput.dispose(),this.drawingImages.dispose(),this.stopGestures(),this.view.dispose(),this.dprQuery?.removeEventListener("change",this.pixelRatioChanged),this.frameId!==0&&this.win.cancelAnimationFrame(this.frameId),this.frameId=0,this.inputs.clear(),this.frame=null,this.preview=null,this.series.loadMore(()=>{}),this.series.applyNewData([]),this.indicators.dispose(),this.indicatorListeners.clear(),this.root.remove(),this.canvas.width=this.canvas.height=this.drawingCanvas.width=this.drawingCanvas.height=this.cursorCanvas.width=this.cursorCanvas.height=0;let t=[...this.layers];this.layers.clear();let i=[];for(let n of t)try{n.dispose?.()}catch(r){i.push(r)}if(i.length>0)throw i[0]}assertLive(){if(this.disposed)throw new Error("Chart is disposed")}updateReference(t){let i=this.series.getDataList();return i.length===0?t[0]?.close:i.length===1?t.find(n=>n.timestamp===i[0].timestamp)?.close??i[0].close:i[0].close}validateBars(t,i=this.layout,n=this.series.getDataList()[0]?.close??t[0]?.close,r=!1){if(i.priceScale?.mode==="percentage"&&n===0)throw new RangeError("Percentage scale needs a nonzero reference price");for(let s of t){let{timestamp:o,open:a,high:l,low:c,close:u,volume:h,turnover:d}=s;if(r&&(h!=null&&!Number.isFinite(h)||d!=null&&!Number.isFinite(d)))throw new TypeError("Normalized candle has invalid volume or turnover");if(!Number.isFinite(o)||!Number.isFinite(a)||!Number.isFinite(l)||!Number.isFinite(c)||!Number.isFinite(u)||l<Math.max(a,u)||c>Math.min(a,u))throw new RangeError("Candle has invalid OHLC bounds");if(Math.abs(o)>864e13)throw new RangeError("Candle timestamp is outside the supported Date range");if(i.priceScale?.mode==="log"&&Math.min(a,l,c,u)<=0)throw new RangeError("Log scale requires positive prices")}}validateRender(t){if(t.timeZone!==void 0&&new Intl.DateTimeFormat("en",{timeZone:t.timeZone}).format(0),t.candleDensity!==void 0&&t.candleDensity!=="raw"&&t.candleDensity!=="pixel-envelope")throw new RangeError("Unknown candle density mode");if(t.chartType!==void 0&&!Se.includes(t.chartType))throw new RangeError("Unknown chart type");if(t.baseline!==void 0&&!Number.isFinite(t.baseline))throw new RangeError("Baseline must be a finite price")}pixelRatioChanged=()=>{this.watchPixelRatio(),this.schedule()};watchPixelRatio(){this.dprQuery?.removeEventListener("change",this.pixelRatioChanged),this.dprQuery=this.win.matchMedia(`(resolution: ${this.win.devicePixelRatio||1}dppx)`),this.dprQuery.addEventListener("change",this.pixelRatioChanged)}schedule(){this.disposed||this.doc.hidden||this.frameId!==0||this.draining||(this.frameId=this.win.requestAnimationFrame(t=>{this.frameId=0,this.renderTick(t)}))}renderTick(t){this.draining=!0;let i=!1;try{let n=[...this.inputs.entries()];for(let[r,s]of n)this.inputs.delete(r)&&s(t);this.flush(),i=!0}finally{this.draining=!1,i&&(this.inputs.size>0||this.width>0&&this.height>0&&(this.geometryDirty||this.paintDirty||this.drawingDirty||this.cursorDirty))&&this.schedule()}}sizeDrawingCanvas(t){let i=t?this.canvas.width:1,n=t?this.canvas.height:1;this.drawingCanvas.width!==i&&(this.drawingCanvas.width=i),this.drawingCanvas.height!==n&&(this.drawingCanvas.height=n)}flush(){if(this.disposed)return;let t=this.win.performance.now(),i=this.root.getBoundingClientRect(),n=this.resolution.maxCanvasPixels,r=Math.min(this.win.devicePixelRatio||1,this.resolution.maxPixelRatio??1/0,n===void 0||i.width<=0||i.height<=0?1/0:Math.sqrt(n/(i.width*i.height))),s=i.width>0?dt(i.width,i.height,this.layout.axisGutter,12).plotWidth:0;s>0&&s!==this.densityWidth&&(this.densityWidth=s,this.view.setLimits(Bt(s,this.viewportOptions)));let o=i.width!==this.width||i.height!==this.height;if(o||r!==this.ratio){this.width=i.width,this.height=i.height,this.ratio=r;for(let a of[this.canvas,this.cursorCanvas])a.width=Math.min(n??1/0,Math.max(this.width>0?1:0,Math.floor(this.width*r))),a.height=Math.min(n===void 0||a.width===0?1/0:Math.floor(n/a.width),Math.max(this.height>0?1:0,Math.floor(this.height*r)));this.geometryDirty=this.geometryDirty||o,this.paintDirty=!0,this.drawingDirty=!0,this.cursorDirty=!0}if(this.width<=0||this.height<=0){this.preview===null&&this.drawings.getSnapshot().drawings.length===0&&this.sizeDrawingCanvas(!1);return}if(this.geometryDirty||this.frame===null){let a=this.series.getDataList(),l=this.indicators.compute(a).map(d=>({...d,pane:d.pane==="price"?"price":`indicator:${d.paneId??d.id}`})),c=this.view.getSnapshot(),u=c.dataStart??c.viewport.i0,h=u>0?this.series.snapshot(u-1,u,c.mode).bars[0]?.close:void 0;this.frame=mt(c,a,l,this.width,this.height,this.layout,h,this.series.version);for(let d of this.layers)d.update(this.frame,a);if(this.disposed)return;this.geometryDirty=!1,this.paintDirty=!0,this.drawingDirty=!0,this.cursorDirty=!0,this.counters.geometryBuilds++}if(this.paintDirty){this.context.setTransform(this.canvas.width/this.width,0,0,this.canvas.height/this.height,0,0),this.context.clearRect(0,0,this.width,this.height);for(let[a,l]of this.frame.panes.entries())this.context.save(),this.context.translate(0,l.top),$t(this.context,l.frame,{...this.renderOptions,formatPrice:a===0?l.scale.label:c=>String(Number(c.toPrecision(6))),showTimeAxis:a===this.frame.panes.length-1}),this.context.restore();for(let a of this.layers){this.context.save();try{a.paint(this.context)}finally{this.context.restore()}if(this.disposed)return}this.paintDirty=!1,this.counters.plotPaints++}if(this.drawingDirty){let a=this.drawings.getSnapshot();this.sizeDrawingCanvas(this.preview!==null||a.drawings.length>0),this.drawingContext.setTransform(this.canvas.width/this.width,0,0,this.canvas.height/this.height,0,0),this.drawingContext.clearRect(0,0,this.width,this.height);let l=this.frame.model.geometry;this.retainDrawingImages(),this.frame.drawingContext={bars:this.series.getDataList(),revision:this.series.version,visibleRange:[this.frame.snapshot.viewport.i0,this.frame.snapshot.viewport.i1]};let c=this.drawings.geometry(this.frame.project,l,this.frame.drawingContext).filter(u=>u.id!==this.preview?.id);if(this.preview!==null){let u=Ye(this.preview,this.frame.project,l,this.frame.drawingContext);u!==null&&c.push(u)}Wi(this.drawingContext,c,this.preview?.id??a.selectedId,{bounds:l,imageRenderer:this.drawingImages,onInvalidate:this.invalidateDrawings}),this.drawingDirty=!1,this.counters.drawingPaints++}if(this.cursorDirty){if(this.cursorContext.setTransform(this.canvas.width/this.width,0,0,this.canvas.height/this.height,0,0),this.cursorContext.clearRect(0,0,this.width,this.height),this.cursorX!==null)for(let[a,l]of this.frame.panes.entries())this.cursorContext.save(),this.cursorContext.translate(0,l.top),Gt(this.cursorContext,l.frame,this.cursorX,{...this.renderOptions,formatPrice:l.scale.label,showTimeAxis:a===this.frame.panes.length-1}),this.cursorContext.restore();this.cursorDirty=!1,this.counters.cursorPaints++,this.onInspect?.(this.cursorX===null?null:this.frame.inspect(this.cursorX))}this.disposed||this.frame===null||(this.counters.frames++,this.counters.lastFrameMs=this.win.performance.now()-t,this.counters.firstDataFrameMs===0&&this.frame.snapshot.bars.length>0&&(this.counters.firstDataFrameMs=this.counters.lastFrameMs),this.counters.maxFrameMs=Math.max(this.counters.maxFrameMs,this.counters.lastFrameMs))}};var yt=Object.freeze({background:"--sc-background",text:"--sc-text",surface:"--sc-control-background",border:"--sc-control-border",divider:"--sc-border",danger:"--sc-danger",toolbar:"--sc-toolbar-background",muted:"--sc-muted",hover:"--sc-hover-background",hoverBorder:"--sc-hover-border",focus:"--sc-focus",accent:"--sc-accent",active:"--sc-active-background",panelBorder:"--sc-panel-border",panel:"--sc-panel-background",panelShadow:"--sc-panel-shadow",error:"--sc-error-background",colorScheme:"--sc-color-scheme"}),Xe=Object.freeze({dark:Object.freeze({chrome:Object.freeze({background:"#10151d",text:"#d6deea",surface:"#19232f",border:"#344150",divider:"#27313e",danger:"#f6a69e",toolbar:"#131b25",muted:"#94a3b8",hover:"#253444",hoverBorder:"#596b80",focus:"#77b6f5",accent:"#77b6f5",active:"#203146",panelBorder:"#43546a",panel:"#17212d",panelShadow:"0 10px 30px #0005",error:"#301e25",colorScheme:"dark"}),render:Object.freeze({background:"#10151d",grid:"#283444",text:"#aebcca",up:"#58c9ac",down:"#f28b82",line:"#8bafff"})}),light:Object.freeze({chrome:Object.freeze({background:"#ffffff",text:"#1f2937",surface:"#f3f5f8",border:"#b8c2d1",divider:"#e3e8ef",danger:"#b42318",toolbar:"#f8fafc",muted:"#526176",hover:"#e4ebf3",hoverBorder:"#71849c",focus:"#2962ff",accent:"#2459db",active:"#e5edff",panelBorder:"#b8c2d1",panel:"#ffffff",panelShadow:"0 10px 30px #10203022",error:"#fff0ee",colorScheme:"light"}),render:Object.freeze({background:"#ffffff",grid:"#e6e9ee",text:"#3a4250",up:"#16a34a",down:"#dc2626",line:"#2962ff"})})});var Kt=class{constructor(t){this.options=t;if(this.maxSymbols=t?.maxSymbols??8,this.maxBytes=t?.maxBytes??2*1024*1024,t!==void 0&&(typeof t.namespace!="string"||t.namespace.trim()===""||t.namespace.length>256))throw new RangeError("Drawing storage needs a bounded nonempty namespace");if(!Number.isSafeInteger(this.maxSymbols)||this.maxSymbols<0||!Number.isSafeInteger(this.maxBytes)||this.maxBytes<0)throw new RangeError("Drawing cache limits must be nonnegative safe integers")}entries=new Map;maxSymbols;maxBytes;get(t){let i=this.entries.get(t);return i!==void 0?(this.entries.delete(t),this.entries.set(t,i),i.json):this.options?.storage.getItem(this.key(t))??void 0}set(t,i){let n=this.entries.get(t);if(n?.json===i&&n.saved)return;this.entries.delete(t);let r={json:i,saved:!1};if(this.entries.set(t,r),this.options!==void 0){let s=this.options.storage.setItem(this.key(t),i);if(s!==null&&(typeof s=="object"||typeof s=="function")&&typeof s.then=="function")throw Promise.resolve(s).catch(()=>{}),new TypeError("Drawing storage setItem must finish synchronously");r.saved=!0,this.trim()}else i==='{"version":1,"drawings":[]}'&&this.entries.delete(t)}getStats(){let t=0,i=0;for(let[n,r]of this.entries)t+=(n.length+r.json.length)*2,r.saved||i++;return{symbols:this.entries.size,bytes:t,unsaved:i}}clear(){this.entries.clear()}key(t){return"super-chart:drawings:"+JSON.stringify([this.options?.namespace,t])}trim(){let{bytes:t}=this.getStats();for(let[i,n]of this.entries){if(this.entries.size<=this.maxSymbols&&t<=this.maxBytes)break;n.saved&&(t-=(i.length+n.json.length)*2,this.entries.delete(i))}}};var ts=`
|
|
8
|
+
.sc-workspace{position:relative;display:flex;flex-direction:column;width:100%;height:100%;min-width:0;min-height:280px;box-sizing:border-box;background:var(--sc-background,#10151d);color:var(--sc-text,#d6deea);font:var(--sc-font-size,12px)/1.4 var(--sc-font,system-ui,-apple-system,"Segoe UI",sans-serif);color-scheme:var(--sc-color-scheme,dark);isolation:isolate}
|
|
9
|
+
.sc-workspace *, .sc-workspace *::before, .sc-workspace *::after{box-sizing:border-box}
|
|
10
|
+
.sc-workspace [hidden]{display:none!important}
|
|
11
|
+
.sc-workspace .sc-row{display:flex;align-items:center;gap:6px;min-width:0;padding:5px 8px;flex-shrink:0;border-bottom:1px solid var(--sc-border,#27313e);background:var(--sc-toolbar-background,#131b25)}
|
|
12
|
+
.sc-workspace .sc-marketbar{flex-wrap:wrap;min-height:42px}
|
|
13
|
+
.sc-workspace .sc-drawingbar{overflow-x:auto;overscroll-behavior-x:contain;scrollbar-width:thin;white-space:nowrap;min-height:39px}
|
|
14
|
+
.sc-workspace .sc-button,.sc-workspace .sc-select,.sc-workspace .sc-input,.sc-workspace .sc-menu>summary{font:inherit;line-height:1.3;min-height:var(--sc-control-height,28px);border:1px solid var(--sc-control-border,#344150);border-radius:var(--sc-radius,4px);background:var(--sc-control-background,#19232f);color:var(--sc-text,#d6deea);padding:5px 8px;margin:0}
|
|
15
|
+
.sc-workspace .sc-button,.sc-workspace .sc-menu>summary{cursor:pointer;white-space:nowrap;flex-shrink:0;user-select:none;touch-action:manipulation}
|
|
16
|
+
.sc-workspace .sc-select{cursor:pointer;max-width:190px;min-width:0;accent-color:var(--sc-accent,#77b6f5)}
|
|
17
|
+
.sc-workspace .sc-input{width:100%;min-width:0;outline-offset:2px}
|
|
18
|
+
.sc-workspace .sc-button:hover:not(:disabled),.sc-workspace .sc-menu>summary:hover,.sc-workspace .sc-select:hover:not(:disabled){background:var(--sc-hover-background,#253444);border-color:var(--sc-hover-border,#596b80)}
|
|
19
|
+
.sc-workspace .sc-button:disabled,.sc-workspace .sc-select:disabled,.sc-workspace .sc-input:disabled{opacity:.4;cursor:not-allowed}
|
|
20
|
+
.sc-workspace .sc-button:focus-visible,.sc-workspace .sc-select:focus-visible,.sc-workspace .sc-input:focus-visible,.sc-workspace summary:focus-visible{outline:2px solid var(--sc-focus,#77b6f5);outline-offset:2px}
|
|
21
|
+
.sc-workspace .sc-button[aria-pressed=true],.sc-workspace .sc-menu[open]>summary{border-color:var(--sc-accent,#77b6f5);color:var(--sc-accent,#77b6f5);background:var(--sc-active-background,#203146)}
|
|
22
|
+
.sc-workspace .sc-primary{border-color:var(--sc-accent,#77b6f5);color:var(--sc-accent,#77b6f5)}
|
|
23
|
+
.sc-workspace .sc-danger:hover:not(:disabled){color:var(--sc-danger,#f6a69e);border-color:var(--sc-danger,#f6a69e)}
|
|
24
|
+
.sc-workspace .sc-symbol{font-weight:650;background:transparent;border-color:transparent;max-width:180px;overflow:hidden;text-overflow:ellipsis;text-align:left}
|
|
25
|
+
.sc-workspace .sc-symbol::after{content:'\u2315';margin-left:10px;color:var(--sc-muted,#94a3b8)}
|
|
26
|
+
.sc-workspace .sc-field{display:flex;align-items:center;gap:6px;min-width:0;margin:0}
|
|
27
|
+
.sc-workspace .sc-field-label{font-size:11px;color:var(--sc-muted,#94a3b8);white-space:nowrap}
|
|
28
|
+
.sc-workspace .sc-marketbar>.sc-field>.sc-field-label,.sc-workspace .sc-drawingbar>.sc-field>.sc-field-label{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}
|
|
29
|
+
.sc-workspace .sc-menu{position:static;flex-shrink:0}
|
|
30
|
+
.sc-workspace .sc-menu>summary{display:flex;align-items:center;gap:8px;list-style:none}
|
|
31
|
+
.sc-workspace .sc-menu>summary::-webkit-details-marker{display:none}
|
|
32
|
+
.sc-workspace .sc-menu>summary::after{content:'\u2304';font-size:11px;color:var(--sc-muted,#94a3b8)}
|
|
33
|
+
.sc-workspace .sc-menu-panel,.sc-workspace .sc-search{position:absolute;z-index:8;top:46px;left:8px;right:8px;max-width:520px;max-height:calc(100% - 58px);overflow:auto;overscroll-behavior:contain;border:1px solid var(--sc-panel-border,#43546a);border-radius:var(--sc-panel-radius,6px);background:var(--sc-panel-background,#17212d);box-shadow:var(--sc-panel-shadow,0 10px 30px #0005);padding:12px}
|
|
34
|
+
.sc-workspace .sc-menu:not([open])>.sc-menu-panel{display:none}
|
|
35
|
+
.sc-workspace .sc-settings-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px}
|
|
36
|
+
.sc-workspace .sc-settings-grid>.sc-field,.sc-workspace .sc-indicator-editor>.sc-field{flex-direction:column;align-items:stretch;gap:5px}
|
|
37
|
+
.sc-workspace .sc-settings-grid .sc-select,.sc-workspace .sc-indicator-editor .sc-select{max-width:none;width:100%}
|
|
38
|
+
.sc-workspace .sc-indicator-add{display:flex;align-items:end;gap:8px;padding-bottom:12px;border-bottom:1px solid var(--sc-border,#344150)}
|
|
39
|
+
.sc-workspace .sc-indicator-add>.sc-field{flex:1;align-items:stretch;flex-direction:column}
|
|
40
|
+
.sc-workspace .sc-indicator-add .sc-select{max-width:none;width:100%}
|
|
41
|
+
.sc-workspace .sc-indicator-list{display:flex;flex-direction:column;gap:8px;padding-top:10px}
|
|
42
|
+
.sc-workspace .sc-indicator-entry{display:flex;align-items:flex-start;gap:8px;padding:8px;border:1px solid var(--sc-border,#344150);border-radius:var(--sc-radius,4px)}
|
|
43
|
+
.sc-workspace .sc-indicator{flex:1;min-width:0}
|
|
44
|
+
.sc-workspace .sc-indicator>summary{cursor:pointer;padding:5px 0;font-variant-numeric:tabular-nums;overflow-wrap:anywhere}
|
|
45
|
+
.sc-workspace .sc-indicator-editor{display:grid;gap:10px;margin-top:10px;grid-template-columns:1fr 1fr}
|
|
46
|
+
.sc-workspace .sc-indicator-editor>.sc-field:first-child,.sc-workspace .sc-actions{grid-column:1/-1}
|
|
47
|
+
.sc-workspace .sc-actions{display:flex;gap:6px;flex-wrap:wrap}
|
|
48
|
+
.sc-workspace .sc-hint{color:var(--sc-muted,#94a3b8);margin:4px 0}
|
|
49
|
+
.sc-workspace .sc-stage{position:relative;flex:1;min-height:160px;min-width:0}
|
|
50
|
+
.sc-workspace .sc-chart{position:absolute;inset:0}
|
|
51
|
+
.sc-workspace .sc-stage-status{position:absolute;inset:0;display:grid;place-content:center;padding:24px;color:var(--sc-muted,#94a3b8);text-align:center;overflow-wrap:anywhere;pointer-events:none}
|
|
52
|
+
.sc-workspace[data-state=error] .sc-stage-status{color:var(--sc-danger,#f6a69e)}
|
|
53
|
+
.sc-workspace .sc-notice{flex-shrink:0;padding:8px 12px;color:var(--sc-danger,#f6a69e);background:var(--sc-error-background,#301e25);border-bottom:1px solid var(--sc-border,#344150);overflow-wrap:anywhere}
|
|
54
|
+
.sc-workspace .sc-notice:empty{display:none}
|
|
55
|
+
.sc-workspace .sc-footer{flex-wrap:wrap;border-top:1px solid var(--sc-border,#27313e);border-bottom:0;min-height:36px;font-size:11px}
|
|
56
|
+
.sc-workspace .sc-status{flex:1;min-width:120px;overflow-wrap:anywhere;color:var(--sc-muted,#94a3b8)}
|
|
57
|
+
.sc-workspace .sc-countdown{font-variant-numeric:tabular-nums;color:var(--sc-muted,#94a3b8);white-space:nowrap}
|
|
58
|
+
.sc-workspace .sc-countdown:empty{display:none}
|
|
59
|
+
.sc-workspace .sc-replay-controls{display:flex;align-items:center;flex-wrap:wrap;gap:6px;padding:6px 8px;border-top:1px solid var(--sc-border,#344150);background:var(--sc-toolbar-background,#131b25)}
|
|
60
|
+
.sc-workspace .sc-replay-info{font-variant-numeric:tabular-nums;color:var(--sc-muted,#94a3b8);font-size:11px;overflow-wrap:anywhere}
|
|
61
|
+
.sc-workspace .sc-panel-header{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:10px}
|
|
62
|
+
.sc-workspace .sc-panel-header h2{font:inherit;font-size:14px;font-weight:600;margin:0}
|
|
63
|
+
.sc-workspace .sc-search{z-index:10}
|
|
64
|
+
.sc-workspace .sc-search-input{width:100%;font-size:14px;min-height:36px}
|
|
65
|
+
.sc-workspace .sc-search-status{font-size:11px;color:var(--sc-muted,#94a3b8);padding:9px 0;min-height:32px}
|
|
66
|
+
.sc-workspace .sc-search-results{list-style:none;margin:0;padding:0;max-height:260px;overflow:auto;overscroll-behavior:contain;scrollbar-width:thin}
|
|
67
|
+
.sc-workspace .sc-search-results li+li{margin-top:4px}
|
|
68
|
+
.sc-workspace .sc-search-result{display:flex;align-items:center;gap:12px;width:100%;text-align:left;min-height:38px;white-space:normal}
|
|
69
|
+
.sc-workspace .sc-search-result strong{min-width:70px;flex-shrink:0}
|
|
70
|
+
.sc-workspace .sc-search-result span{color:var(--sc-muted,#94a3b8);font-size:11px;overflow-wrap:anywhere}
|
|
71
|
+
.sc-workspace[data-density=comfortable] .sc-button,.sc-workspace[data-density=comfortable] .sc-select,.sc-workspace[data-density=comfortable] .sc-input,.sc-workspace[data-density=comfortable] .sc-menu>summary{min-height:var(--sc-control-height,36px)}
|
|
72
|
+
.sc-workspace:fullscreen{min-height:0;background:var(--sc-background,#10151d)}
|
|
73
|
+
@media(pointer:coarse){.sc-workspace .sc-button,.sc-workspace .sc-select,.sc-workspace .sc-menu>summary{min-height:var(--sc-touch-target,36px)}}
|
|
74
|
+
@media(forced-colors:active){.sc-workspace .sc-button[aria-pressed=true],.sc-workspace .sc-menu[open]>summary{outline:2px solid Highlight}.sc-workspace .sc-button:disabled{opacity:1;color:GrayText}}
|
|
75
|
+
`;function is(e,t,i){return i<=0?-1:e<0?t>=0?0:i-1:((e+t)%i+i)%i}function Co(e,t){return t<=0?-1:Math.max(0,Math.min(t-1,e))}function ns(e){return e.isComposing?{action:"ignore"}:e.loading||e.shownQuery!==e.currentQuery?{action:"wait"}:e.resultCount===0?{action:"none"}:{action:"select",index:Co(e.activeIndex,e.resultCount)}}function Yt(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}function rs(e,t){let i=e.max??8;if(!Number.isSafeInteger(i)||i<0||i>100)throw new RangeError("Recent-symbol limit must be from 0 to 100");let n=e.persistKey!==void 0?`sc-recent-symbols:${e.persistKey}`:null,r=()=>{if(n===null||t===void 0)return Yt(e.seed??[]);try{let o=t.getItem(n);return o===null||o.length>65536?Yt(e.seed??[]):Yt(JSON.parse(o))}catch{return Yt(e.seed??[])}},s=[...new Set(r().filter(o=>o.length<=4096))].slice(0,i);return{list:()=>s.slice(),push:o=>{if(s=[o,...s.filter(a=>a!==o)].slice(0,i),n!==null&&t!==void 0)try{t.setItem(n,JSON.stringify(s))}catch{}}}}function ss(e,t,i,n=5){let r=new Map(t.map(o=>[i(o),o])),s=[];for(let o of e){let a=r.get(o);if(a!==void 0&&(s.push(a),s.length>=n))break}return s}var os='{"version":1,"drawings":[]}',Lo=[{multiplier:1,timespan:"minute",text:"1m"},{multiplier:5,timespan:"minute",text:"5m"},{multiplier:15,timespan:"minute",text:"15m"},{multiplier:1,timespan:"hour",text:"1h"},{multiplier:4,timespan:"hour",text:"4h"},{multiplier:1,timespan:"day",text:"1D"}],wt=(e,t)=>`${ne(e)}:${te(t)}`,as=e=>e.replace(/-/g," ");function ls(e){if(e!=="dark"&&e!=="light")throw new TypeError('Workspace theme must be "dark" or "light"');return e}function Vt(e){if(typeof e?.ticker!="string"||e.ticker.trim()==="")throw new TypeError("A symbol ticker is required");return{...e}}function Jt(e){if(!Number.isSafeInteger(e?.multiplier)||e.multiplier<=0||typeof e.timespan!="string"||e.timespan.trim()===""||typeof e.text!="string")throw new TypeError("A positive interval and timespan are required");return{...e}}var vt=class{chart;ready;doc;win;abort;loader;timedReplay;countdown;loaderOptions;loads;events;loaderUnsubscribe=[];datafeed;root;chartHost;statusNode;stageStatus;replayControls;downloadButton;downloading=!1;reportedStatusUI="";notice;symbolButton;periodSelect;drawingSelect;indicatorSelect;syncPresentation;searchPanel;searchInput;searchResults;searchStatus;recents;recentLimit;searchSymbols=[];searchActive=-1;searchShownQuery="";searchLoading=!1;retryButton;olderButton;replayInfo;replayButtons;replaySpeed;drawingButtons;unsubscribe=[];drawingDocuments;drawingSaveTimer=null;persistentDrawings;lastDrawingList=null;downloads=new Map;actions=new WeakMap;symbol;period;periods;scale;drawingSymbol=null;displayedPair=null;pending=!1;waitingStart=!1;olderPending=!1;applyError=null;cancelled=!1;reportedLoadState="";reportedReplayState="";searchAbort=null;searchTimer=null;searchGeneration=0;disposed=!1;restoreGeneration=0;pendingRestore=null;constructor(t,i){if(t===null||typeof t!="object"||t.ownerDocument==null)throw new TypeError("ChartWorkspace needs a host HTMLElement to mount into");if(i===null||typeof i!="object")throw new TypeError("ChartWorkspace needs options: { datafeed, symbol, period }");if(typeof i.datafeed?.getHistoryKLineData!="function")throw new TypeError("options.datafeed must implement getHistoryKLineData(symbol, period, from, to)");if(this.doc=t.ownerDocument,this.doc.defaultView===null)throw new Error("Workspace host needs an active document");if(this.win=this.doc.defaultView,this.abort=new this.win.AbortController,this.loads=new Ai(S=>this.win.queueMicrotask(S),S=>this.events.emit("loadResult",S)),this.events=new Fi((...S)=>this.win.console.warn(...S),S=>this.win.queueMicrotask(S)),this.loaderOptions=i.loader,this.drawingDocuments=new Kt(i.drawingCache),this.persistentDrawings=i.drawingCache!==void 0,this.datafeed=i.datafeed,this.symbol=Vt(i.symbol),this.period=Jt(i.period),this.recentLimit=i.search?.recentLimit??8,!Number.isSafeInteger(this.recentLimit)||this.recentLimit<0||this.recentLimit>50)throw new RangeError("Recent-symbol limit must be from 0 to 50");let n=i.search?.storage;if(i.search?.persistKey!==void 0){if(typeof i.search.persistKey!="string"||i.search.persistKey.trim()===""||i.search.persistKey.length>256)throw new RangeError("Recent-symbol storage needs a bounded nonempty host key");try{n??=this.win.localStorage}catch{}}this.recents=rs({max:this.recentLimit,persistKey:i.search?.persistKey===void 0?void 0:`owned:${i.search.persistKey}`,seed:i.search?.initialRecent?.slice(0,this.recentLimit).map(S=>ne(Vt(S)))},n),this.periods=[...i.periods??Lo].map(Jt),this.periods.some(S=>te(S)===te(this.period))||this.periods.push(this.period),this.scale={...i.chart?.layout?.priceScale},this.root=this.node("div"),this.root.className="sc-workspace",i.ui?.className!==void 0&&this.root.classList.add(...i.ui.className.split(/\s+/).filter(Boolean));let r=i.ui?.density??"compact";if(r!=="compact"&&r!=="comfortable")throw new TypeError("Unknown workspace density");this.root.dataset.density=r,i.theme!==void 0&&this.applyChromeTheme(ls(i.theme));for(let[S,M]of Object.entries(i.ui?.variables??{})){if(!/^--sc-[a-z0-9-]+$/.test(S)||typeof M!="string")throw new TypeError("Workspace variables must use --sc- names and string values");this.root.style.setProperty(S,M)}let s=this.node("style");s.textContent=ts,this.root.append(s),this.root.setAttribute("aria-label","Chart workspace"),this.listen(this.root,"click",S=>{let M=S.target instanceof this.win.Element?S.target.closest("button"):null;!this.disposed&&M instanceof this.win.HTMLButtonElement&&!M.disabled&&this.actions.get(M)?.()});let o=this.row("Chart controls"),a=this.row("Drawing controls"),l=this.row("Chart playback");o.classList.add("sc-marketbar"),a.classList.add("sc-drawingbar"),l.classList.add("sc-footer");let c=this.menu("Chart","Chart presentation"),u=this.menu("Indicators","Manage indicators");this.symbolButton=this.button(this.symbol.ticker,()=>this.openSearch()),this.symbolButton.classList.add("sc-symbol"),this.symbolButton.title="Find a symbol",this.symbolButton.setAttribute("aria-haspopup","dialog"),this.symbolButton.setAttribute("aria-expanded","false"),this.periodSelect=this.select("Interval",this.periods.map(S=>[te(S),S.text]),te(this.period)),this.listen(this.periodSelect,"change",()=>this.run(()=>{let S=this.periods.find(M=>te(M)===this.periodSelect.value);S!==void 0&&this.setPeriod(S)}));let h=this.select("Chart type",Se.map(S=>[S,as(S)]),i.chart?.render?.chartType??"candles");this.listen(h,"change",()=>{this.run(()=>this.chart.setRenderOptions({chartType:h.value})),this.syncPresentation()});let d=this.select("Candles",[["raw","Original prices"],["heikin-ashi","Heikin Ashi"]],i.chart?.mode??"raw");this.listen(d,"change",()=>{this.run(()=>this.chart.view.setMode(d.value)),this.syncPresentation()});let p=this.select("Price scale",[["linear","Linear"],["log","Logarithmic"],["percentage","Percentage"]],this.scale.mode??"linear");this.listen(p,"change",()=>{let S={...this.chart.getLayoutOptions().priceScale,mode:p.value};this.run(()=>this.chart.setLayout({priceScale:S}))?this.scale=S:p.value=this.scale.mode??"linear"});let m=this.button("Reverse scale",()=>{let S=this.chart.getLayoutOptions().priceScale,M={...S,reversed:S?.reversed!==!0};this.run(()=>this.chart.setLayout({priceScale:M}))&&(this.scale=M,m.setAttribute("aria-pressed",String(M.reversed)))});m.setAttribute("aria-pressed",String(this.scale.reversed===!0)),this.syncPresentation=()=>{this.scale={...this.chart.getLayoutOptions().priceScale},h.value=this.chart.getRenderOptions().chartType??"candles",d.value=this.chart.view.getSnapshot().mode,p.value=this.scale.mode??"linear",m.setAttribute("aria-pressed",String(this.scale.reversed===!0))},c.panel.classList.add("sc-settings-grid"),c.panel.append(this.field("Chart type",h),this.field("Price mode",d),this.field("Price scale",p),m),o.append(this.symbolButton,this.field("Interval",this.periodSelect),c.root,u.root),this.indicatorSelect=this.select("Add indicator",[],"");let y=this.node("div");y.className="sc-indicator-list";let g=!0,v=()=>{if(!u.root.open||!g)return;let S=this.doc.activeElement,M=S instanceof this.win.HTMLElement&&y.contains(S)?S:null,O=M?.closest("[data-indicator]")?.dataset.indicator,E=M?.dataset.control,k=new Set([...y.querySelectorAll("details[open]")].map(R=>R.dataset.indicator)),x=this.indicatorSelect.value||"MA",F=this.chart.getRegisteredIndicatorNames();this.indicatorSelect.replaceChildren(...F.map(R=>{let j=this.node("option");return j.value=R,j.textContent=R,j})),F.includes(x)&&(this.indicatorSelect.value=x);let H=this.chart.listIndicators();if(this.setText(u.summary,`Indicators${H.length>0?` \xB7 ${H.length}`:""}`),y.replaceChildren(...H.map(R=>{let j=this.node("details"),$=this.node("summary");j.className="sc-indicator",j.dataset.indicator=R.id,j.open=k.has(R.id),$.textContent=`${R.name} ${R.params.join(",")}${R.visible?"":" (hidden)"}`;let G=this.node("input");G.type="text",G.value=R.params.join(","),G.setAttribute("aria-label",`${R.name} parameters`),G.className="sc-input",G.dataset.control="params",G.autocomplete="off",G.spellcheck=!1;let A=this.select(`${R.name} pane`,[["price","Price pane"],["separate","Separate pane"]],R.pane),T=this.node("input");T.type="text",T.value=R.paneId??"",T.maxLength=128,T.setAttribute("aria-label",`${R.name} pane group`),T.placeholder="Independent pane",T.className="sc-input",T.dataset.control="group",A.dataset.control="pane",T.disabled=A.value!=="separate",A.onchange=()=>{T.disabled=A.value!=="separate"};let W=this.button("Apply indicator",()=>this.run(()=>{let ee=G.value.trim(),ie=ee===""?[]:ee.split(",").map(me=>{if(me.trim()==="")throw new TypeError("Indicator parameters must be numbers separated by commas");return Number(me)});this.chart.updateIndicator(R.id,{params:ie,pane:A.value,paneId:A.value==="separate"&&T.value.trim()||void 0})})),q=this.button(R.visible?"Hide indicator":"Show indicator",()=>this.run(()=>{let ee=this.chart.listIndicators().find(ie=>ie.id===R.id);ee!==void 0&&this.chart.updateIndicator(R.id,{visible:!ee.visible})})),Y=this.button("Remove",()=>{this.run(()=>{this.chart.removeIndicator(R.id)})});Y.setAttribute("aria-label",`Remove ${R.name} ${R.params.join(",")}`),W.classList.add("sc-primary"),W.dataset.control="apply",q.dataset.control="toggle",Y.dataset.control="remove",q.setAttribute("aria-pressed",String(R.visible)),Y.classList.add("sc-danger"),G.onkeydown=ee=>{ee.key==="Enter"&&!ee.isComposing&&(ee.preventDefault(),W.click())};let U=this.node("div");U.className="sc-indicator-editor";let V=this.node("div");V.className="sc-actions",V.append(W,q),U.append(this.field("Parameters",G),this.field("Pane",A),this.field("Pane group",T),V),j.append($,U);let Z=this.node("div");return Z.className="sc-indicator-entry",Z.dataset.indicator=R.id,Z.append(j,Y),Z})),H.length===0){let R=this.node("p");R.className="sc-hint",R.textContent="No indicators. Choose one above to add it.",y.append(R)}if(M!==null){let R=[...y.children].find($=>$.dataset.indicator===O);((E===void 0?R?.querySelector("summary"):R?.querySelector(`[data-control="${E}"]`))??u.summary).focus({preventScroll:!0})}g=!1},b=()=>{g=!0;let S=this.chart.listIndicators().length;this.setText(u.summary,`Indicators${S>0?` \xB7 ${S}`:""}`),v()};this.listen(u.root,"toggle",v);let f=this.node("div");f.className="sc-indicator-add";let w=this.button("Add",()=>{this.run(()=>{this.chart.addIndicator({name:this.indicatorSelect.value})})});w.classList.add("sc-primary"),f.append(this.field("Indicator",this.indicatorSelect),w),u.panel.append(f,y),this.drawingSelect=this.select("Drawing tool",[["","Pan / select"]],"");let _=new Map;for(let S of ke){let M=/fibonacci|gann/.test(S)?"Fibonacci & Gann":/waves|abcd/.test(S)?"Patterns & waves":/vwap|volume-profile/.test(S)?"Data studies":/brush|highlighter/.test(S)?"Freehand":/channel|pitchfork|regression/.test(S)?"Channels & pitchforks":/position|range|forecast/.test(S)?"Measurement & risk":/text|note|callout|signpost|pin|image|label|flag|arrow/.test(S)?"Annotations":/horizontal|vertical|segment|ray|trend-line|price-line/.test(S)?"Lines":"Shapes & curves",O=_.get(M);O===void 0&&(O=this.node("optgroup"),O.label=M,_.set(M,O),this.drawingSelect.append(O));let E=this.node("option");E.value=S,E.textContent=as(S),O.append(E)}this.listen(this.drawingSelect,"change",()=>this.run(()=>{this.chart.setDrawingTool(this.drawingSelect.value===""?null:this.drawingSelect.value),this.chartHost.querySelector('[tabindex="0"]')?.focus({preventScroll:!0})})),this.drawingButtons={undo:this.button("Undo",()=>this.run(()=>{this.chart.drawings.undo()})),redo:this.button("Redo",()=>this.run(()=>{this.chart.drawings.redo()})),lock:this.button("Lock",()=>this.run(()=>{let S=this.chart.drawings.getSnapshot(),M=S.drawings.find(O=>O.id===S.selectedId);M!==void 0&&this.chart.drawings.update(M.id,{locked:!M.locked})})),remove:this.button("Delete drawing",()=>this.run(()=>{let S=this.chart.drawings.getSnapshot().selectedId;S!==null&&this.chart.drawings.remove(S)}))};let D=this.button("\u2190",()=>this.run(()=>{this.chart.view.undoNavigation()})),C=this.button("\u2192",()=>this.run(()=>{this.chart.view.redoNavigation()}));D.title="Previous chart view (Alt+Left)",D.setAttribute("aria-label","Previous chart view"),C.title="Next chart view (Alt+Right)",C.setAttribute("aria-label","Next chart view");let N=()=>{let S=this.chart.view.getNavigationHistory();D.disabled=!S.canUndo,C.disabled=!S.canRedo};D.disabled=C.disabled=!0;let I=this.button("Latest",()=>this.run(()=>this.chart.view.followLatest()));if(I.title="Follow latest bars",I.setAttribute("aria-label","Follow latest bars"),this.downloadButton=this.button("PNG",()=>{this.download()}),this.downloadButton.title="Download chart as PNG",this.downloadButton.setAttribute("aria-label","Download chart as PNG"),this.drawingButtons.remove.classList.add("sc-danger"),a.append(this.field("Draw",this.drawingSelect),...Object.values(this.drawingButtons),D,C,I,this.downloadButton),typeof this.root.requestFullscreen=="function"&&typeof this.doc.exitFullscreen=="function"){let S=this.button("Fullscreen",()=>{(this.doc.fullscreenElement===this.root?this.doc.exitFullscreen():this.root.requestFullscreen()).catch(M=>this.showNotice(M))});this.listen(this.doc,"fullscreenchange",()=>{let M=this.doc.fullscreenElement===this.root;this.setText(S,M?"Exit fullscreen":"Fullscreen"),S.title=S.textContent??"",S.setAttribute("aria-pressed",String(M))}),S.setAttribute("aria-pressed","false"),a.append(S)}this.searchPanel=this.node("div"),this.searchPanel.hidden=!0,this.searchPanel.setAttribute("role","dialog"),this.searchPanel.setAttribute("aria-label","Find a symbol"),this.searchPanel.className="sc-search",this.searchInput=this.node("input"),this.searchInput.type="search",this.searchInput.placeholder="Symbol or name",this.searchInput.setAttribute("aria-label","Symbol or name"),this.searchInput.autocomplete="off",this.searchInput.spellcheck=!1,this.searchInput.className="sc-input sc-search-input",this.searchStatus=this.node("div"),this.searchStatus.className="sc-search-status",this.searchStatus.setAttribute("role","status"),this.searchResults=this.node("ul"),this.searchResults.className="sc-search-results",this.searchResults.setAttribute("aria-label","Matching symbols");let P=this.node("div");P.className="sc-panel-header";let L=this.node("h2");L.textContent="Find a symbol",P.append(L,this.button("Close",()=>this.closeSearch())),this.searchPanel.append(P,this.searchInput,this.searchStatus,this.searchResults),this.listen(this.searchInput,"input",()=>this.queueSearch(200)),this.listen(this.searchPanel,"keydown",S=>this.searchKey(S)),this.listen(this.root,"keydown",S=>{let M=S;M.isComposing||M.ctrlKey||M.metaKey||M.altKey||!/^[a-z0-9]$/i.test(M.key)||!(M.target instanceof this.win.HTMLElement)||!this.chartHost.contains(M.target)||M.target.closest('input,textarea,select,[contenteditable="true"]')!==null||(M.preventDefault(),this.openSearch(M.key))}),this.listen(this.doc,"pointerdown",S=>{if(S.target instanceof this.win.Node){!this.searchPanel.hidden&&!this.searchPanel.contains(S.target)&&!this.symbolButton.contains(S.target)&&this.closeSearch(!1);for(let M of this.root.querySelectorAll(".sc-menu[open]"))M.contains(S.target)||(M.open=!1)}});let B=this.node("div");B.className="sc-stage",this.chartHost=this.node("div"),this.chartHost.className="sc-chart",this.stageStatus=this.node("div"),this.stageStatus.className="sc-stage-status",this.stageStatus.setAttribute("aria-hidden","true"),this.notice=this.node("div"),this.notice.className="sc-notice",this.notice.setAttribute("role","alert"),this.statusNode=this.node("div"),this.statusNode.className="sc-status",this.statusNode.setAttribute("role","status"),B.append(this.chartHost,this.stageStatus),this.retryButton=this.button("Retry",()=>this.reload()),this.olderButton=this.button("Load older",()=>this.run(()=>this.chart.view.requestMore())),this.replayInfo=this.node("span"),this.replayButtons={start:this.button("Replay",()=>this.run(()=>{if(!this.startReplay())throw new Error("At least three loaded bars are needed for replay")})),back:this.button("Previous bar",()=>this.run(()=>{this.stepReplay(-1)})),next:this.button("Next bar",()=>this.run(()=>{this.stepReplay(1)})),play:this.button("Play replay",()=>this.run(()=>{this.getReplayState().playing?this.pauseReplay():this.playReplay()})),exit:this.button("Exit replay",()=>this.run(()=>{this.exitReplay()}))},this.replaySpeed=this.select("Replay speed",[.25,.5,1,2,4,8,16].map(S=>[String(S),`${S}\xD7`]),"1"),this.listen(this.replaySpeed,"change",()=>this.run(()=>this.setReplaySpeed(Number(this.replaySpeed.value)))),this.replayControls=this.node("div"),this.replayControls.className="sc-replay-controls",this.replayControls.hidden=!0,this.replayInfo.className="sc-replay-info";let z=this.node("span");z.className="sc-countdown",z.title="Period boundary estimate; exchange holidays and early closes need a host-provided close time.",this.replayControls.append(this.replayButtons.back,this.replayButtons.next,this.replayButtons.play,this.field("Speed",this.replaySpeed),this.replayButtons.exit,this.replayInfo),l.append(this.statusNode,z,this.replayButtons.start,this.olderButton,this.retryButton),this.root.append(o,a,this.notice,B,this.replayControls,l,this.searchPanel),t.append(this.root);try{this.chart=new Je(this.chartHost,{...i.chart,render:{...i.theme===void 0?{}:Xe[i.theme].render,...i.chart?.render,timespan:this.period.timespan,symbolTimezone:this.symbol.timezone},onToolComplete:()=>{this.drawingSelect.value="",i.chart?.onToolComplete?.()}})}catch(S){throw this.abort.abort(),this.root.remove(),S}this.loader=this.createLoader(),this.timedReplay=this.createReplay(),this.countdown=Pi({getContext:()=>{if(i.countdown?.enabled===!1||this.getStatus().state!=="ready"||!this.shownMatches())return null;let S=this.chart.getLastBar(),M;if(S!==null&&i.countdown?.closeTimestamp!==void 0)try{M=i.countdown.closeTimestamp(this.market(),S)}catch{return null}return{marketKey:this.requestedPair(),lastBar:S,period:this.period,symbolTimezone:this.symbol.timezone,replaying:this.loader.replaying,closeTimestamp:M}},onChange:S=>{this.setText(z,S===null?"":`Close \u2248 ${S.text}`)},hidden:()=>this.doc.hidden,timer:{setTimeout:(S,M)=>this.win.setTimeout(S,M),clearTimeout:S=>this.win.clearTimeout(S)}}),this.listen(this.doc,"visibilitychange",()=>{this.doc.hidden&&this.timedReplay.pause(),this.countdown.refresh()}),this.unsubscribe.push(this.chart.view.subscribe(N)),N(),this.unsubscribe.push(this.chart.onIndicatorsChanged(b)),this.unsubscribe.push(this.chart.drawings.subscribe(()=>{this.updateDrawingControls(),this.queueDrawingSave()})),this.loader.attach(this.dataPort()),b(),this.updateDrawingControls(),this.ready=this.request()}getSymbol(){return{...this.symbol}}getPeriod(){return{...this.period}}registerIndicator(t){this.assertLive(),this.chart.registerIndicator(t)}setSymbol(t){return this.setMarket(t,this.period)}setPeriod(t){return this.setMarket(this.symbol,t)}setMarket(t,i){return this.restoreGeneration++,this.pendingRestore=null,this.changeMarket(t,i)}changeMarket(t,i){this.assertLive(),this.saveDrawings();let n=Vt(t),r=this.resolvePeriod(i),s=this.market(),o=wt(n,r)!==this.requestedPair();if(ne(n)!==ne(this.symbol)&&(this.scale={...this.chart.getLayoutOptions().priceScale,range:void 0},this.chart.setLayout({priceScale:this.scale})),(r.timespan!==this.period.timespan||n.timezone!==this.symbol.timezone||!o&&n.pricePrecision!==this.symbol.pricePrecision)&&this.chart.setRenderOptions({timespan:r.timespan,symbolTimezone:n.timezone,...!o&&n.pricePrecision!==this.symbol.pricePrecision?{pricePrecision:At(n.pricePrecision,this.chart.dataPort.getDataList())}:{}}),!this.periods.some(l=>te(l)===te(r))){this.periods.push(r);let l=this.node("option");l.value=te(r),l.textContent=r.text,this.periodSelect.append(l)}this.symbol=n,this.period=r,this.symbolButton.textContent=n.ticker,this.periodSelect.value=te(r);let a=o?this.request(!0):this.loads.current(this.market())??Promise.resolve(this.currentResult());return o&&this.events.emit("marketChange",{previous:s,requested:this.market()}),this.updateStatus(),a}reload(){return this.assertLive(),this.restoreGeneration++,this.pendingRestore=null,this.request()}cancelLoad(){this.assertLive(),this.restoreGeneration++,this.pendingRestore=null;let t=this.loads.cancel();if(t===null&&this.getStatus().state!=="error")return!1;let i=t??{status:"cancelled",...this.market()};return this.cancelled=!0,this.pending=!1,this.waitingStart=!1,this.olderPending=!1,this.applyError=null,this.displayedPair=null,this.timedReplay.dispose(),this.loaderUnsubscribe.splice(0).forEach(n=>n()),this.loader.dispose(),this.loader=this.createLoader(),this.timedReplay=this.createReplay(),this.loader.attach(this.dataPort()),this.chart.setDrawingTool(null),this.chart.setData([],!1),this.updateStatus(),this.events.emit("loadResult",i),!0}on(t,i){return this.assertLive(),this.events.on(t,i)}off(t,i){this.events.off(t,i)}getBars(t={}){if(this.assertLive(),Object.keys(t).some(n=>n!=="limit"))throw new TypeError("Only the bars limit option is supported");let i=t.limit;if(i!==void 0&&(!Number.isSafeInteger(i)||i<0))throw new RangeError("Bars limit must be a nonnegative safe integer");return this.chart.getBars(t)}getLoadState(){this.assertLive();let t=this.getStatus();return{requested:this.market(),loaded:this.displayedPair===this.requestedPair()&&this.applyError===null&&t.state!=="error"&&t.state!=="idle"?this.market():null,status:this.cancelled?"cancelled":t.state,loadingMore:t.loadingMore||this.olderPending,error:t.error===null?null:{message:this.errorMessage(t.error.error),phase:t.error.phase,timeout:t.error.timeout}}}getState(){this.assertLive();let t=this.chart.dataPort.getDataList(),i=this.chart.view.getSnapshot(),n=this.chart.drawings.getSnapshot();return{schema:1,load:this.getLoadState(),replay:this.getReplayState(),data:{count:t.length,firstTimestamp:t[0]?.timestamp??null,lastTimestamp:t[t.length-1]?.timestamp??null},view:{from:i.viewport.i0,to:i.viewport.i1,following:i.following,mode:i.mode},indicators:this.chart.listIndicators().map(r=>({...r,params:[...r.params]})),drawings:{count:n.drawings.length,selectedId:n.selectedId}}}getReplayState(){this.assertLive();let t=this.loader.replayInfo;return{active:t!==null,index:t?.index??null,length:t?.length??this.chart.view.getSnapshot().length,timestamp:t!==null&&Number.isFinite(t.timestamp)?t.timestamp:null,atEnd:this.loader.replayAtEnd,playing:this.timedReplay?.getState().playing??!1,speed:this.timedReplay?.getState().speed??1}}startReplay(t){if(this.assertLive(),t!==void 0&&(!Number.isSafeInteger(t)||t<0))throw new RangeError("Replay index must be a nonnegative safe integer");let i=this.timedReplay.start({index:t});return this.updateReplay(),i}stepReplay(t=1){if(this.assertLive(),!Number.isSafeInteger(t))throw new RangeError("Replay step must be a safe integer");if(!this.loader.replaying)throw new Error("Start replay before stepping");return this.timedReplay.step(t),this.updateReplay(),this.getReplayState()}startReplayAt(t){return this.assertLive(),this.timedReplay.startByTimestamp(t)}playReplay(t){return this.assertLive(),this.doc.hidden?!1:this.timedReplay.play(t)}pauseReplay(){this.assertLive(),this.timedReplay.pause()}setReplaySpeed(t){this.assertLive(),this.timedReplay.setSpeed(t)}exitReplay(){return this.assertLive(),this.timedReplay.exit(),this.updateReplay(),this.getReplayState()}exportDocument(){this.assertLive();let t=this.getLoadState();if(t.loaded===null||!["ready","empty"].includes(t.status))throw new Error("Load a market before saving its workspace");let{formatPrice:i,showTimeAxis:n,timespan:r,symbolTimezone:s,...o}=this.chart.getRenderOptions(),a={version:1,...this.market(),mode:this.chart.view.getSnapshot().mode,render:o,layout:this.chart.getLayoutOptions(),indicators:this.chart.listIndicators(),drawings:JSON.parse(this.chart.drawings.exportJson())},l=JSON.stringify(a);return Ve(l,{registeredIndicatorNames:this.chart.getRegisteredIndicatorNames()}),l}async restoreDocument(t){this.assertLive();let i=Ve(t,{registeredIndicatorNames:this.chart.getRegisteredIndicatorNames()}),n=this.resolvePeriod(i.period);this.chart.validateIndicatorReplacement(i.indicators);let r=++this.restoreGeneration;this.pendingRestore=null;let s=this.chart.holdDrawingImages(i.drawings.drawings);try{try{await this.chart.prepareDrawingImages(i.drawings.drawings)}catch(l){if(this.disposed)return{status:"disposed"};if(r!==this.restoreGeneration)return{status:"superseded",by:this.market()};throw l}if(this.disposed)return{status:"disposed"};if(r!==this.restoreGeneration)return{status:"superseded",by:this.market()};let o={render:{...i.render,formatPrice:this.chart.getRenderOptions().formatPrice,timespan:n.timespan,symbolTimezone:i.symbol.timezone},layout:i.layout,mode:i.mode??"raw",indicators:i.indicators,drawingsJson:JSON.stringify(i.drawings)},a={generation:r,key:wt(i.symbol,n),configuration:o,applied:!1};this.pendingRestore=a,this.timedReplay.exit();try{let l=await this.changeMarket(i.symbol,n);return this.disposed?{status:"disposed"}:this.pendingRestore!==a||r!==this.restoreGeneration||a.key!==this.requestedPair()?{status:"superseded",by:this.market()}:((l.status==="loaded"||l.status==="unchanged")&&this.getLoadState().loaded!==null&&(a.applied||this.chart.restoreConfiguration(o),this.syncPresentation(),this.drawingSymbol=ne(this.symbol),this.drawingDocuments.set(this.drawingSymbol,this.chart.drawings.exportJson()),this.updateDrawingControls(),this.updateReplay()),l)}finally{this.pendingRestore===a&&(this.pendingRestore=null)}}finally{s()}}getStatus(){if(this.cancelled)return{state:"idle",loadingMore:!1,error:null};if(this.applyError!==null)return{state:"error",loadingMore:!1,error:{phase:"initial",symbol:this.getSymbol(),period:this.getPeriod(),error:this.applyError,timeout:!1}};let t=this.loader.status,i=this.pending&&(this.waitingStart||t.state!=="error");return{...t,state:i?"loading":t.state,error:i||t.error===null?null:{...t.error,symbol:{...t.error.symbol},period:{...t.error.period}}}}setTheme(t){if(this.disposed)return;let i=ls(t);this.applyChromeTheme(i),this.chart.setRenderOptions({...Xe[i].render})}applyChromeTheme(t){for(let i of Object.keys(yt))this.root.style.setProperty(yt[i],Xe[t].chrome[i])}dispose(){if(!this.disposed){this.saveDrawings(),this.disposed=!0,this.cancelSearch(),this.abort.abort(),this.restoreGeneration++,this.pendingRestore=null,this.timedReplay.dispose(),this.countdown.dispose(),this.loads.dispose(),this.events.clear(),this.unsubscribe.forEach(t=>t()),this.loaderUnsubscribe.splice(0).forEach(t=>t()),this.loader.dispose();for(let[t,i]of this.downloads)this.win.clearTimeout(t),this.win.URL.revokeObjectURL(i);this.downloads.clear(),this.drawingDocuments.clear();try{this.chart.dispose()}finally{this.root.remove()}}}saveDrawings(){this.drawingSaveTimer!==null&&(this.win.clearTimeout(this.drawingSaveTimer),this.drawingSaveTimer=null),this.drawingSymbol!==null&&this.drawingDocuments.set(this.drawingSymbol,this.chart.drawings.exportJson())}getDrawingCacheStats(){return this.drawingDocuments.getStats()}queueDrawingSave(){let t=this.chart.drawings.getSnapshot().drawings;t!==this.lastDrawingList&&(this.lastDrawingList=t,!(!this.persistentDrawings||this.drawingSymbol===null)&&(this.drawingSaveTimer!==null&&this.win.clearTimeout(this.drawingSaveTimer),this.drawingSaveTimer=this.win.setTimeout(()=>{this.drawingSaveTimer=null;try{this.saveDrawings()}catch(i){this.showNotice(i)}},250)))}market(){return{symbol:this.getSymbol(),period:this.getPeriod()}}requestedPair(){return wt(this.symbol,this.period)}resolvePeriod(t){let i=typeof t=="string"?Ti(t):null;if(typeof t=="string"&&i===null)throw new RangeError("Unsupported interval; use a configured period or a value such as 1m, 4H or 1D");let n=Jt(typeof t=="string"?{...i,text:t.trim()}:t),r=this.periods.find(o=>te(o)===te(n));if(r!==void 0)return typeof t=="string"?{...r}:n;let s=this.datafeed.resolvePeriod?.({multiplier:n.multiplier,timespan:n.timespan});if(s==null||te(s)!==te(n))throw new RangeError("The datafeed does not support this interval");return n=Jt(s),n}createReplay(){return Li({loader:this.loader,getDataList:()=>this.chart.dataPort.getDataList(),getMarketKey:()=>this.getStatus().state==="ready"&&this.shownMatches()?this.requestedPair():null,onChange:()=>this.updateReplay(),timer:{setTimeout:(t,i)=>this.win.setTimeout(t,i),clearTimeout:t=>this.win.clearTimeout(t)}})}createLoader(){let t=new Di({...this.loaderOptions,datafeed:this.datafeed,env:{now:()=>Date.now(),setTimeout:(i,n)=>this.win.setTimeout(i,n),clearTimeout:i=>this.win.clearTimeout(i),requestFrame:i=>this.win.requestAnimationFrame(i),cancelFrame:i=>this.win.cancelAnimationFrame(i),queueMicrotask:i=>this.win.queueMicrotask(i),hidden:()=>this.doc.hidden,visibility:this.doc,connectivity:this.win,warn:(...i)=>this.win.console.warn(...i)}});return this.loaderUnsubscribe.push(t.on("status",i=>{this.waitingStart&&i.state!=="loading"||(i.state==="loading"&&(this.waitingStart=!1,this.pending=!0),i.state==="error"&&(this.pending=!1),this.restoreDrawings(),this.updateStatus())}),t.on("bars",i=>{wt(i.symbol,i.period)===this.requestedPair()&&this.run(()=>this.chart.setRenderOptions({pricePrecision:At(this.symbol.pricePrecision,i.bars)}))}),t.on("replay",()=>this.updateReplay())),t}shownMatches(){let t=this.loader.shown;return t!==null&&wt(t.symbol,t.period)===this.requestedPair()}prepareRequest(){this.drawingSymbol=null,this.displayedPair=null,this.pending=!0,this.waitingStart=!0,this.applyError=null,this.cancelled=!1,this.olderPending=!1,this.chart.setDrawingTool(null),this.drawingSelect.value="",this.chart.drawings.importJson(os),this.chart.setData([],!1),this.notice.textContent="",this.updateStatus()}request(t=!1){t||this.saveDrawings(),this.timedReplay.pause();let i=this.loads.request(this.market());return this.prepareRequest(),this.loader.request(this.getSymbol(),this.getPeriod()),i}currentResult(){let t=this.getStatus(),i=this.market();return this.cancelled?{status:"cancelled",...i}:t.state==="error"?{status:"error",...i,message:this.errorMessage(t.error?.error),timeout:t.error?.timeout??!1}:{status:"unchanged",...i}}settleLoad(){if(this.waitingStart||!this.shownMatches())return;let t=this.getStatus(),i=this.market(),n;if(t.state==="error")n={status:"error",...i,message:this.errorMessage(t.error?.error),timeout:t.error?.timeout??!1};else if((t.state==="ready"||t.state==="empty")&&this.displayedPair===this.requestedPair())n={status:"loaded",...i,bars:this.chart.view.getSnapshot().length};else return;this.loads.settle(i,n)&&this.events.emit("loadResult",n)}dataPort(){let t=this.chart.dataPort,i=(r,s,o=!1)=>{if(!(this.disposed||this.waitingStart||!(o&&this.loader.status.state==="loading")&&!this.shownMatches()))try{r(),this.displayedPair=this.requestedPair(),this.loader.status.state!=="loading"&&(this.pending=!1),this.restoreDrawings(),this.updateStatus(),this.settleLoad(),this.events.emit("dataChange",{market:this.market(),kind:s,count:this.chart.view.getSnapshot().length})}catch(a){this.applyError=a,this.pending=!1,this.chart.setDrawingTool(null),this.chart.setData([],!1),this.updateStatus(),this.settleLoad()}},n=(r,s,o=!1)=>i(()=>{let a=this.pendingRestore;a!==null&&!a.applied&&a.generation===this.restoreGeneration&&a.key===this.requestedPair()?(this.chart.restoreConfiguration(a.configuration,{bars:r,more:s}),a.applied=!0,this.drawingSymbol=ne(this.symbol)):o?t.applyNormalizedData(r,s):t.applyNewData(r,s)},"reset",!0);return{applyNewData:(r,s)=>n(r,s),applyNormalizedData:(r,s)=>n(r,s,!0),truncateData:(r,s,o)=>{let a=!1;return i(()=>{a=t.truncateData(r,s,o)},"reset"),a},applyMoreData:(r,s)=>i(()=>{this.olderPending=!1,t.applyMoreData(r,s)},"prepend"),updateData:r=>i(()=>t.updateData(r),"tail"),updateDataBatch:(r,s)=>i(()=>t.updateDataBatch?.(r,s),"tail"),getDataList:t.getDataList,getLastTimestamp:t.getLastTimestamp,cancelHistoryLoad:()=>{this.olderPending=!1,this.updateStatus()},loadMore:r=>t.loadMore?.(s=>{if(!(this.disposed||this.olderPending||this.getStatus().state!=="ready")){this.olderPending=!0,this.updateStatus();try{r(s)}catch(o){throw this.olderPending=!1,this.updateStatus(),o}}})}}restoreDrawings(){if(this.loader.status.state!=="ready"||!this.shownMatches()||this.displayedPair!==this.requestedPair()||this.applyError!==null)return;this.pending=!1;let t=ne(this.symbol);this.drawingSymbol!==t&&(this.chart.drawings.importJson(this.drawingDocuments.get(t)??os),this.drawingSymbol=t)}updateStatus(){if(this.disposed)return;let t=this.getStatus(),i=`${this.symbol.ticker} \xB7 ${this.period.text}`,n=this.cancelled?`Loading cancelled \xB7 ${i}`:t.state==="loading"?`Loading ${i}\u2026`:t.state==="error"?`Could not load ${i}: ${this.errorMessage(t.error?.error)}`:t.state==="empty"?`No data for ${i}`:t.loadingMore?`${i} \xB7 Loading older bars\u2026`:i,r=t.state==="ready"&&this.displayedPair===this.requestedPair(),s=this.chart.view.getSnapshot().hasMore,o=`${n}|${r}|${this.olderPending}|${s}|${this.downloading}`;o!==this.reportedStatusUI&&(this.reportedStatusUI=o,this.setText(this.statusNode,n),this.root.dataset.state=this.cancelled?"cancelled":t.state,this.chartHost.style.visibility=r?"visible":"hidden",this.chartHost.inert=!r,this.setText(this.stageStatus,r?"":n),this.stageStatus.hidden=r,this.drawingSelect.disabled=!r,this.downloadButton.disabled=!r||this.downloading,this.retryButton.hidden=t.state!=="error"&&!this.cancelled,this.olderButton.hidden=!s&&t.state==="ready",this.olderButton.disabled=t.state!=="ready"||t.loadingMore||this.olderPending||!s,this.olderButton.title=t.loadingMore||this.olderPending?"Older bars are loading":s?"Load older bars":"All available history is loaded"),this.updateReplay();let a=this.getLoadState(),l=JSON.stringify(a);l!==this.reportedLoadState&&(this.reportedLoadState=l,this.events.emit("loadState",a))}updateReplay(){if(this.disposed)return;let t=this.loader.replayInfo,i=this.doc.activeElement,n=t!==null&&this.replayControls.hidden,r=t===null&&!this.replayControls.hidden;this.replayButtons.start.disabled=this.getStatus().state!=="ready"||t!==null||this.chart.view.getSnapshot().length<3,this.replayButtons.back.disabled=t===null||t.index===0,this.replayButtons.next.disabled=t===null||this.loader.replayAtEnd,this.replayButtons.exit.disabled=t===null;let s=this.timedReplay?.getState();this.replayButtons.play.disabled=t===null||this.loader.replayAtEnd,this.setText(this.replayButtons.play,s?.playing===!0?"Pause replay":"Play replay"),this.replayButtons.play.title=this.replayButtons.play.textContent??"",this.replayButtons.play.setAttribute("aria-pressed",String(s?.playing===!0)),this.replayControls.hidden=t===null,this.replayButtons.start.hidden=t!==null,this.replaySpeed.disabled=t===null,n&&i===this.replayButtons.start?(this.replayButtons.play.disabled?this.replayButtons.exit:this.replayButtons.play).focus({preventScroll:!0}):r&&i!==null&&this.replayControls.contains(i)&&(this.replayButtons.start.disabled?this.symbolButton:this.replayButtons.start).focus({preventScroll:!0});let o=String(s?.speed??1);if(![...this.replaySpeed.options].some(c=>c.value===o)){this.replaySpeed.querySelector("option[data-custom]")?.remove();let c=this.node("option");c.value=o,c.textContent=`${o}\xD7`,c.dataset.custom="true",this.replaySpeed.append(c)}this.replaySpeed.value=o,this.countdown?.refresh(),this.setText(this.replayInfo,t===null?"":`${t.index+1} / ${t.length} \xB7 ${Number.isFinite(t.timestamp)?new Date(t.timestamp).toISOString().replace("T"," ").replace(".000Z"," UTC"):""}`);let a=this.getReplayState(),l=JSON.stringify(a);l!==this.reportedReplayState&&(this.reportedReplayState=l,this.events.emit("replayChange",a))}updateDrawingControls(){let t=this.chart.drawings.getSnapshot(),i=t.drawings.find(n=>n.id===t.selectedId);this.drawingButtons.undo.disabled=!t.canUndo,this.drawingButtons.redo.disabled=!t.canRedo,this.drawingButtons.lock.disabled=i===void 0,this.setText(this.drawingButtons.lock,i?.locked===!0?"Unlock":"Lock"),this.drawingButtons.lock.setAttribute("aria-pressed",String(i?.locked===!0)),this.drawingButtons.lock.title=i===void 0?"Select a drawing to lock it":i.locked?"Unlock selected drawing":"Lock selected drawing",this.drawingButtons.remove.title=i?.locked===!0?"Unlock this drawing before deleting it":"Delete selected drawing",this.drawingButtons.remove.disabled=i===void 0||i.locked}openSearch(t){if(this.disposed)return;t!==void 0&&(this.searchInput.value=t);for(let n of this.root.querySelectorAll(".sc-menu[open]"))n.open=!1;let i=this.root.querySelector(".sc-marketbar");i!==null&&(this.searchPanel.style.top=`${i.offsetHeight+4}px`),this.searchPanel.hidden=!1,this.symbolButton.setAttribute("aria-expanded","true"),this.searchInput.focus(),this.queueSearch(0)}closeSearch(t=!0){this.cancelSearch(),this.searchPanel.hidden=!0,this.symbolButton.setAttribute("aria-expanded","false"),t&&!this.disposed&&this.symbolButton.focus()}cancelSearch(){this.searchGeneration++,this.searchAbort?.abort(),this.searchAbort=null,this.searchTimer!==null&&this.win.clearTimeout(this.searchTimer),this.searchTimer=null,this.searchLoading=!1}queueSearch(t){this.cancelSearch(),this.searchResults.replaceChildren(),this.searchStatus.textContent="Searching\u2026",this.searchResults.setAttribute("aria-busy","true"),this.searchLoading=!0,this.searchSymbols=[],this.searchActive=-1;let i=this.searchGeneration;this.searchTimer=this.win.setTimeout(()=>{this.searchTimer=null,this.search(i)},t)}async search(t){let i=new this.win.AbortController;this.searchAbort=i;let n=this.searchInput.value.trim();try{let r=await this.datafeed.searchSymbols(n,{signal:i.signal});if(this.disposed||i.signal.aborted||t!==this.searchGeneration)return;if(!Array.isArray(r))throw new TypeError("Search returned an invalid symbol list");let s=new Map;for(let u of r){if(typeof u?.ticker!="string"||u.ticker.trim()==="")continue;let h=Vt(u);if(s.set(ne(h),h),s.size>=200)break}let o=[...s.values()],a=n===""&&this.recentLimit>0?ss(this.recents.list(),o,ne,this.recentLimit):[],l=new Set(a.map(ne)),c=[...a,...o.filter(u=>!l.has(ne(u)))].slice(0,50);this.searchSymbols=c,this.searchShownQuery=n,this.searchLoading=!1,this.searchActive=-1,this.searchResults.setAttribute("aria-busy","false"),this.searchStatus.textContent=c.length===0?"No matching symbols":r.length>50?"Showing the first 50 matches":`${c.length} matches`,this.searchResults.replaceChildren(...c.map((u,h)=>{let d=this.node("li"),p=this.button(`${u.ticker}${u.name?` \xB7 ${u.name}`:""}${u.exchange?` \xB7 ${u.exchange}`:""}`,()=>{this.chooseSearchResult(h)});p.classList.add("sc-search-result");let m=this.node("strong");m.textContent=u.ticker;let y=this.node("span");return y.textContent=[u.name,u.exchange].filter(Boolean).join(" \xB7 "),p.replaceChildren(m,y),d.append(p),d}))}catch(r){if(this.disposed||i.signal.aborted||t!==this.searchGeneration)return;this.searchStatus.replaceChildren(this.doc.createTextNode(`Search failed: ${this.errorMessage(r)} `),this.button("Retry search",()=>this.queueSearch(0))),this.searchLoading=!1,this.searchResults.setAttribute("aria-busy","false")}finally{this.searchAbort===i&&(this.searchAbort=null)}}chooseSearchResult(t){let i=ns({isComposing:!1,shownQuery:this.searchShownQuery,currentQuery:this.searchInput.value.trim(),loading:this.searchLoading,activeIndex:t,resultCount:this.searchSymbols.length});if(i.action!=="select")return;let n=this.searchSymbols[i.index];this.run(()=>{this.setSymbol(n)})&&(this.recents.push(ne(n)),this.closeSearch())}searchKey(t){if(t.isComposing)return;if(t.key==="Escape"){t.preventDefault(),t.stopPropagation(),this.closeSearch();return}if(t.altKey||t.ctrlKey||t.metaKey||t.shiftKey)return;if(t.key==="Enter"&&t.target===this.searchInput){t.preventDefault(),this.chooseSearchResult(this.searchActive);return}if(this.searchLoading||!(t.target instanceof this.win.Node)||t.target!==this.searchInput&&!this.searchResults.contains(t.target))return;let i=[...this.searchResults.querySelectorAll("button")],n=i.indexOf(this.doc.activeElement);if(t.key==="ArrowDown"||t.key==="ArrowUp")this.searchActive=is(n,t.key==="ArrowDown"?1:-1,i.length);else if((t.key==="Home"||t.key==="End")&&n!==-1)this.searchActive=t.key==="Home"?0:i.length-1;else return;t.preventDefault();let r=i[this.searchActive];r?.focus({preventScroll:!0}),r?.scrollIntoView({block:"nearest"})}async download(){if(!(this.disposed||this.downloading)){this.downloading=!0,this.setText(this.downloadButton,"Saving\u2026"),this.updateStatus();try{if(this.getStatus().state!=="ready")throw new Error("Load chart data before downloading an image");let t=`${this.symbol.ticker.replace(/[^a-z0-9._-]/gi,"_")}-${this.period.text.replace(/[^a-z0-9._-]/gi,"_")}.png`,i=await this.chart.snapshot();if(this.disposed)return;let n=this.win.URL.createObjectURL(i),r=this.node("a");r.href=n,r.download=t,this.root.append(r),r.click(),r.remove();let s=this.win.setTimeout(()=>{this.win.URL.revokeObjectURL(n),this.downloads.delete(s)},1e3);this.downloads.set(s,n)}catch(t){this.showNotice(t)}finally{this.downloading=!1,this.disposed||(this.setText(this.downloadButton,"PNG"),this.updateStatus())}}}node(t){return this.doc.createElement(t)}listen(t,i,n){t.addEventListener(i,n,{signal:this.abort.signal})}button(t,i){let n=this.node("button");return n.type="button",n.textContent=t,n.className="sc-button",n.title=t,this.actions.set(n,i),n}select(t,i,n){let r=this.node("select");r.setAttribute("aria-label",t),r.className="sc-select",r.title=t;for(let[s,o]of i){let a=this.node("option");a.value=s,a.textContent=o,r.append(a)}return r.value=n,r}row(t){let i=this.node("div");return i.setAttribute("role","toolbar"),i.setAttribute("aria-label",t),i.className="sc-row",i}field(t,i){let n=this.node("label");n.className="sc-field";let r=this.node("span");return r.className="sc-field-label",r.textContent=t,n.append(r,i),n}setText(t,i){t.textContent!==i&&(t.textContent=i)}menu(t,i){let n=this.node("details");n.className="sc-menu";let r=this.node("summary");r.textContent=t,r.title=i;let s=this.node("div");return s.className="sc-menu-panel",s.setAttribute("role","group"),s.setAttribute("aria-label",i),n.append(r,s),this.listen(n,"toggle",()=>{if(n.open){let o=this.root.querySelector(".sc-marketbar");o!==null&&(s.style.top=`${o.offsetHeight+4}px`),this.closeSearch(!1);for(let a of this.root.querySelectorAll(".sc-menu[open]"))a!==n&&(a.open=!1)}}),this.listen(n,"keydown",o=>{let a=o;a.key==="Escape"&&n.open&&(a.preventDefault(),a.stopPropagation(),n.open=!1,r.focus())}),{root:n,summary:r,panel:s}}run(t){if(this.disposed)return!1;try{return t(),this.notice.textContent="",!0}catch(i){return this.showNotice(i),!1}}errorMessage(t){return t instanceof Error?t.message:String(t??"Unknown error")}showNotice(t){this.disposed||(this.notice.textContent=this.errorMessage(t))}assertLive(){if(this.disposed)throw new Error("Chart workspace is disposed")}};return ms(Po);})();
|