@tradecanvas/chart 1.51.0 → 1.53.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/dist/Chart.d.ts +275 -10
  2. package/dist/Chart.d.ts.map +1 -1
  3. package/dist/DataManager.d.ts +24 -0
  4. package/dist/DataManager.d.ts.map +1 -1
  5. package/dist/HistoryPager.d.ts +12 -2
  6. package/dist/HistoryPager.d.ts.map +1 -1
  7. package/dist/{LayoutSession-Qkx1huV-.js → LayoutSession-D7uQq3jX.js} +1225 -474
  8. package/dist/LayoutSession-D7uQq3jX.js.map +1 -0
  9. package/dist/LayoutSession-nlhT-EH7.cjs +2 -0
  10. package/dist/LayoutSession-nlhT-EH7.cjs.map +1 -0
  11. package/dist/SeriesStore.d.ts +58 -4
  12. package/dist/SeriesStore.d.ts.map +1 -1
  13. package/dist/charts/ChartTypeStrategy.d.ts +32 -5
  14. package/dist/charts/ChartTypeStrategy.d.ts.map +1 -1
  15. package/dist/frameworks/feedBars.d.ts +22 -6
  16. package/dist/frameworks/feedBars.d.ts.map +1 -1
  17. package/dist/{i18n-DFTQ73Cz.js → i18n-CwCzRLKW.js} +39 -1
  18. package/dist/i18n-CwCzRLKW.js.map +1 -0
  19. package/dist/i18n-D7B7uFrN.cjs +2 -0
  20. package/dist/i18n-D7B7uFrN.cjs.map +1 -0
  21. package/dist/index.cjs +1 -1
  22. package/dist/index.cjs.map +1 -1
  23. package/dist/index.d.ts +6 -6
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +124 -101
  26. package/dist/index.js.map +1 -1
  27. package/dist/io/resampleOHLCV.d.ts +10 -4
  28. package/dist/io/resampleOHLCV.d.ts.map +1 -1
  29. package/dist/replay/ReplayStepLoader.d.ts +52 -0
  30. package/dist/replay/ReplayStepLoader.d.ts.map +1 -0
  31. package/dist/replay/intrabarPath.d.ts +44 -0
  32. package/dist/replay/intrabarPath.d.ts.map +1 -0
  33. package/dist/replay/replayStep.d.ts +18 -0
  34. package/dist/replay/replayStep.d.ts.map +1 -0
  35. package/dist/widget/ChartWidget.d.ts +329 -13
  36. package/dist/widget/ChartWidget.d.ts.map +1 -1
  37. package/dist/widget/ChartWidgetGrid.d.ts.map +1 -1
  38. package/dist/widget/WidgetDataWindow.d.ts +7 -0
  39. package/dist/widget/WidgetDataWindow.d.ts.map +1 -1
  40. package/dist/widget/WidgetHotkeySheet.d.ts.map +1 -1
  41. package/dist/widget/WidgetIndicatorLegend.d.ts +21 -3
  42. package/dist/widget/WidgetIndicatorLegend.d.ts.map +1 -1
  43. package/dist/widget/WidgetIndicatorSettings.d.ts.map +1 -1
  44. package/dist/widget/WidgetObjectTree.d.ts +7 -1
  45. package/dist/widget/WidgetObjectTree.d.ts.map +1 -1
  46. package/dist/widget/WidgetReplayBar.d.ts +101 -23
  47. package/dist/widget/WidgetReplayBar.d.ts.map +1 -1
  48. package/dist/widget/WidgetSettings.d.ts +11 -3
  49. package/dist/widget/WidgetSettings.d.ts.map +1 -1
  50. package/dist/widget/chartSettingsStore.d.ts +76 -0
  51. package/dist/widget/chartSettingsStore.d.ts.map +1 -0
  52. package/dist/widget/chartTemplates.d.ts.map +1 -1
  53. package/dist/widget/compareLegend.d.ts +20 -0
  54. package/dist/widget/compareLegend.d.ts.map +1 -0
  55. package/dist/widget/index.cjs +382 -166
  56. package/dist/widget/index.cjs.map +1 -1
  57. package/dist/widget/index.d.ts +1 -1
  58. package/dist/widget/index.d.ts.map +1 -1
  59. package/dist/widget/index.js +2947 -2041
  60. package/dist/widget/index.js.map +1 -1
  61. package/dist/widget/indicatorInputWords.d.ts +19 -0
  62. package/dist/widget/indicatorInputWords.d.ts.map +1 -0
  63. package/dist/widget/locales/ar.d.ts.map +1 -1
  64. package/dist/widget/locales/cs.d.ts.map +1 -1
  65. package/dist/widget/locales/da.d.ts.map +1 -1
  66. package/dist/widget/locales/de.d.ts.map +1 -1
  67. package/dist/widget/locales/el.d.ts.map +1 -1
  68. package/dist/widget/locales/en.d.ts +20 -0
  69. package/dist/widget/locales/en.d.ts.map +1 -1
  70. package/dist/widget/locales/es.d.ts.map +1 -1
  71. package/dist/widget/locales/et.d.ts.map +1 -1
  72. package/dist/widget/locales/fa.d.ts.map +1 -1
  73. package/dist/widget/locales/fr.d.ts.map +1 -1
  74. package/dist/widget/locales/he.d.ts.map +1 -1
  75. package/dist/widget/locales/hu.d.ts.map +1 -1
  76. package/dist/widget/locales/id.d.ts.map +1 -1
  77. package/dist/widget/locales/index.cjs +1 -1
  78. package/dist/widget/locales/index.cjs.map +1 -1
  79. package/dist/widget/locales/index.js +533 -1
  80. package/dist/widget/locales/index.js.map +1 -1
  81. package/dist/widget/locales/it.d.ts.map +1 -1
  82. package/dist/widget/locales/ja.d.ts.map +1 -1
  83. package/dist/widget/locales/ko.d.ts.map +1 -1
  84. package/dist/widget/locales/ms.d.ts.map +1 -1
  85. package/dist/widget/locales/nb.d.ts.map +1 -1
  86. package/dist/widget/locales/nl.d.ts.map +1 -1
  87. package/dist/widget/locales/pl.d.ts.map +1 -1
  88. package/dist/widget/locales/pt.d.ts.map +1 -1
  89. package/dist/widget/locales/ro.d.ts.map +1 -1
  90. package/dist/widget/locales/ru.d.ts.map +1 -1
  91. package/dist/widget/locales/sk.d.ts.map +1 -1
  92. package/dist/widget/locales/sv.d.ts.map +1 -1
  93. package/dist/widget/locales/th.d.ts.map +1 -1
  94. package/dist/widget/locales/tr.d.ts.map +1 -1
  95. package/dist/widget/locales/vi.d.ts.map +1 -1
  96. package/dist/widget/locales/zh.d.ts.map +1 -1
  97. package/dist/widget/locales/zhHant.d.ts.map +1 -1
  98. package/dist/widget/settingsRows.d.ts +12 -3
  99. package/dist/widget/settingsRows.d.ts.map +1 -1
  100. package/dist/widget/symbolInfoView.d.ts.map +1 -1
  101. package/dist/widget/types.d.ts +75 -7
  102. package/dist/widget/types.d.ts.map +1 -1
  103. package/dist/widget/widgetCompare.d.ts +18 -0
  104. package/dist/widget/widgetCompare.d.ts.map +1 -1
  105. package/dist/widget/widgetLayout.d.ts +13 -1
  106. package/dist/widget/widgetLayout.d.ts.map +1 -1
  107. package/dist/widget/widgetSettingsLook.d.ts +3 -1
  108. package/dist/widget/widgetSettingsLook.d.ts.map +1 -1
  109. package/dist/widget/widgetShareState.d.ts +8 -0
  110. package/dist/widget/widgetShareState.d.ts.map +1 -1
  111. package/dist/widget/widgetTimezones.d.ts +4 -1
  112. package/dist/widget/widgetTimezones.d.ts.map +1 -1
  113. package/package.json +3 -3
  114. package/dist/LayoutSession-DuV9kpdQ.cjs +0 -2
  115. package/dist/LayoutSession-DuV9kpdQ.cjs.map +0 -1
  116. package/dist/LayoutSession-Qkx1huV-.js.map +0 -1
  117. package/dist/i18n-Bg_UJSNs.cjs +0 -2
  118. package/dist/i18n-Bg_UJSNs.cjs.map +0 -1
  119. package/dist/i18n-DFTQ73Cz.js.map +0 -1
@@ -1,4 +1,4 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../LayoutSession-DuV9kpdQ.cjs`),t=require(`../i18n-Bg_UJSNs.cjs`);let n=require(`@tradecanvas/commons`),r=require(`@tradecanvas/core`);function i(e,t,r={}){if(e.length===0)return[];let i=r.weekStartsOn??1,a=[],o=null,s=NaN;for(let r of e){let e=(0,n.timeframeBucketStart)(r.time,t,i);o===null||e!==s?(o!==null&&a.push(o),o={time:e,open:r.open,high:r.high,low:r.low,close:r.close,volume:r.volume},s=e):o={time:o.time,open:o.open,high:Math.max(o.high,r.high),low:Math.min(o.low,r.low),close:r.close,volume:o.volume+r.volume}}return o!==null&&a.push(o),a}function a(e){if(e.length<2)return 0;let t=[];for(let n=1;n<e.length;n++){let r=e[n].time-e[n-1].time;r>0&&t.push(r)}return t.length===0?0:(t.sort((e,t)=>e-t),t[Math.floor(t.length/2)])}var o=[{zone:`Pacific/Honolulu`,city:`Honolulu`},{zone:`America/Los_Angeles`,city:`Los Angeles`},{zone:`America/Denver`,city:`Denver`},{zone:`America/Chicago`,city:`Chicago`},{zone:`America/New_York`,city:`New York`},{zone:`America/Toronto`,city:`Toronto`},{zone:`America/Sao_Paulo`,city:`São Paulo`},{zone:`UTC`,city:`UTC`},{zone:`Europe/London`,city:`London`},{zone:`Europe/Berlin`,city:`Frankfurt`},{zone:`Europe/Paris`,city:`Paris`},{zone:`Europe/Zurich`,city:`Zurich`},{zone:`Africa/Johannesburg`,city:`Johannesburg`},{zone:`Europe/Istanbul`,city:`Istanbul`},{zone:`Europe/Moscow`,city:`Moscow`},{zone:`Asia/Dubai`,city:`Dubai`},{zone:`Asia/Kolkata`,city:`Mumbai`},{zone:`Asia/Bangkok`,city:`Bangkok`},{zone:`Asia/Ho_Chi_Minh`,city:`Ho Chi Minh City`},{zone:`Asia/Jakarta`,city:`Jakarta`},{zone:`Asia/Singapore`,city:`Singapore`},{zone:`Asia/Hong_Kong`,city:`Hong Kong`},{zone:`Asia/Shanghai`,city:`Shanghai`},{zone:`Asia/Taipei`,city:`Taipei`},{zone:`Asia/Seoul`,city:`Seoul`},{zone:`Asia/Tokyo`,city:`Tokyo`},{zone:`Australia/Sydney`,city:`Sydney`},{zone:`Pacific/Auckland`,city:`Auckland`}];function s(e){return!e||e===`local`?null:e===`exchange`?`exchange`:/^-?\d+$/.test(e)?Number(e):(0,n.isValidTimeZone)(e)?e:null}function c(e){return e===null?`local`:String(e)}function l(e,t,r,i){let a=(0,n.offsetAt)(null,t),c=o.filter(({zone:e})=>(0,n.isValidTimeZone)(e)).map(({zone:e,city:r})=>{let i=(0,n.offsetAt)(e,t);return{value:e,label:e===`UTC`?`UTC`:`(${(0,n.tzLabel)(i)}) ${r}`,offset:i}}),l=s(e);typeof l==`number`&&c.push({value:e,label:(0,n.tzLabel)(l),offset:l}),c.sort((e,t)=>e.offset-t.offset);let u=[{value:`local`,label:`${r} (${(0,n.tzLabel)(a)})`,offset:a}];if(i){let e=(0,n.offsetAt)(i.zone&&(0,n.isValidTimeZone)(i.zone)?i.zone:`UTC`,t);u.push({value:`exchange`,label:`${i.label} (${(0,n.tzLabel)(e)})`,offset:e})}return[...u,...c]}var u=6,d=8,f=120;function p(e,t,n=`left`){let r=e.style,i=t.getBoundingClientRect();r.position=`fixed`,r.margin=`0`,r.top=r.bottom=r.left=r.right=``;let a=window.innerHeight-i.bottom-u-d,o=i.top-u-d;e.scrollHeight<=a||a>=o?(r.top=`${i.bottom+u}px`,r.bottom=`auto`,r.maxHeight=`${Math.max(f,a)}px`):(r.top=`auto`,r.bottom=`${window.innerHeight-i.top+u}px`,r.maxHeight=`${Math.max(f,o)}px`);let s=getComputedStyle(t).direction===`rtl`,c=n===`right`!==s,l=e.offsetWidth,p=c?i.right-l:i.left;r.left=`${Math.max(d,Math.min(p,window.innerWidth-l-d))}px`}var m=700,h=class{select=null;panel=null;rows=[];active=-1;typed=``;typedAt=0;onOutside=e=>{let t=e.target;this.panel?.contains(t)||this.select?.contains(t)||this.close(!1)};onAway=()=>this.close(!1);onScroll=e=>{e.target instanceof Node&&this.panel?.contains(e.target)||this.close(!1)};watch=new MutationObserver(()=>{this.select&&!this.select.isConnected&&this.close(!1)});constructor(e){this.layer=e}isOpenFor(e){return this.select===e}owns(e){return e!==null&&(e===this.select||this.panel?.contains(e)===!0)}open(e){this.close(!1),this.select=e;let t=document.createElement(`div`);t.className=`tcw-dropdown tcw-select-menu`,t.setAttribute(`role`,`listbox`),t.id=`tcw-select-menu-${Math.random().toString(36).slice(2,9)}`;let n=e.getAttribute(`aria-label`)??e.labels?.[0]?.textContent??``;n&&t.setAttribute(`aria-label`,n.trim()),t.style.minWidth=`${e.getBoundingClientRect().width}px`,this.rows=[];for(let n of e.children)if(n instanceof HTMLOptGroupElement){let e=document.createElement(`div`);e.className=`tcw-select-group`,e.textContent=n.label,t.appendChild(e);for(let e of n.querySelectorAll(`option`))this.addRow(t,e,n.disabled)}else n instanceof HTMLOptionElement&&this.addRow(t,n,!1);t.addEventListener(`mousedown`,e=>e.preventDefault());let r=e=>this.rows.findIndex(t=>t.el.contains(e.target));t.addEventListener(`click`,e=>{let t=r(e);t>=0&&this.pick(t)}),t.addEventListener(`mousemove`,e=>{let t=r(e);t>=0&&t!==this.active&&this.enabled(t)&&this.setActive(t,!1)}),this.layer().appendChild(t),this.panel=t,p(t,e),e.setAttribute(`aria-expanded`,`true`),e.setAttribute(`aria-controls`,t.id),this.setActive(this.rows.findIndex(e=>e.option.selected)),document.addEventListener(`pointerdown`,this.onOutside,!0),window.addEventListener(`resize`,this.onAway),document.addEventListener(`scroll`,this.onScroll,{capture:!0,passive:!0}),this.watch.observe(document.documentElement,{childList:!0,subtree:!0})}close(e){let t=this.select;t&&(document.removeEventListener(`pointerdown`,this.onOutside,!0),window.removeEventListener(`resize`,this.onAway),document.removeEventListener(`scroll`,this.onScroll,{capture:!0}),this.watch.disconnect(),this.panel?.remove(),this.panel=null,this.rows=[],this.select=null,t.setAttribute(`aria-expanded`,`false`),t.removeAttribute(`aria-controls`),t.removeAttribute(`aria-activedescendant`),e&&t.isConnected&&t.focus())}key(e){if(!this.select)return!1;switch(e.key){case`ArrowDown`:return this.step(1),!0;case`ArrowUp`:return this.step(-1),!0;case`Home`:return this.setActive(this.nextEnabled(-1,1)),!0;case`End`:return this.setActive(this.nextEnabled(this.rows.length,-1)),!0;case`PageDown`:return this.step(8),!0;case`PageUp`:return this.step(-8),!0;case` `:return this.typed&&Date.now()-this.typedAt<=m?(this.typeahead(` `),!0):(this.active>=0?this.pick(this.active):this.close(!0),!0);case`Enter`:return this.active>=0?this.pick(this.active):this.close(!0),!0;case`Escape`:return this.close(!0),!0;case`Tab`:return this.close(!1),!1;default:return e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey?(this.typeahead(e.key),!0):!1}}destroy(){this.close(!1)}addRow(e,t,n){let r=document.createElement(`div`);r.className=`tcw-select-option`,r.id=`${e.id}-${this.rows.length}`,r.setAttribute(`role`,`option`),r.setAttribute(`aria-selected`,String(t.selected)),(t.disabled||n)&&r.setAttribute(`aria-disabled`,`true`);let i=document.createElement(`span`);i.className=`tcw-select-option-text`,i.textContent=t.label||t.textContent||``,t.dir&&(i.dir=t.dir);let a=document.createElement(`span`);a.className=`tcw-select-check`,a.setAttribute(`aria-hidden`,`true`),r.append(a,i),e.appendChild(r),this.rows.push({option:t,el:r})}enabled(e){return this.rows[e]?.el.getAttribute(`aria-disabled`)!==`true`}nextEnabled(e,t){for(let n=e+t;n>=0&&n<this.rows.length;n+=t)if(this.enabled(n))return n;return-1}step(e){let t=e>0?1:-1,n=this.active;for(let r=0;r<Math.abs(e);r++){let e=this.nextEnabled(n,t);if(e<0)break;n=e}n>=0&&this.setActive(n)}setActive(e,t=!0){this.rows[this.active]?.el.classList.remove(`tcw-active`),this.active=e;let n=this.rows[e];n&&(n.el.classList.add(`tcw-active`),this.select?.setAttribute(`aria-activedescendant`,n.el.id),t&&n.el.scrollIntoView?.({block:`nearest`}))}typeahead(e){let t=Date.now();this.typed=t-this.typedAt>m?e.toLowerCase():this.typed+e.toLowerCase(),this.typedAt=t;let n=e=>this.enabled(e)&&(this.rows[e].el.textContent??``).trim().toLowerCase().startsWith(this.typed),r=this.typed.length===1?this.active+1:Math.max(0,this.active);for(let e=0;e<this.rows.length;e++){let t=(r+e)%this.rows.length;if(n(t)){this.setActive(t);return}}}pick(e){let t=this.select,n=this.rows[e];if(!t||!n||!this.enabled(e))return;let r=!n.option.selected;n.option.selected=!0,this.close(!0),r&&(t.dispatchEvent(new Event(`input`,{bubbles:!0})),t.dispatchEvent(new Event(`change`,{bubbles:!0})))}},ee=42,g=7,_=new Set([`US`,`CA`,`MX`,`BR`,`JP`,`KR`,`TW`,`HK`,`IL`,`PH`,`IN`,`ZA`,`AU`,`TH`,`SA`,`PE`,`CO`]);function v(e){try{let t=new Intl.Locale(e),n=t.getWeekInfo?.()??t.weekInfo;return n?n.firstDay===7?0:1:+!_.has(t.maximize().region??``)}catch{return 1}}function y(e,t,n){let r=(new Date(Date.UTC(e,t,1)).getUTCDay()-n+g)%g,i=[];for(let n=0;n<ee;n++){let a=new Date(Date.UTC(e,t,1-r+n));i.push({year:a.getUTCFullYear(),month:a.getUTCMonth(),day:a.getUTCDate()})}return i}var te=e=>String(e).padStart(2,`0`),b=e=>`${String(e.year).padStart(4,`0`)}-${te(e.month+1)}-${te(e.day)}`;function x(e){let t=/^(\d{4})-(\d{2})-(\d{2})$/.exec(e??``);return t?{year:Number(t[1]),month:Number(t[2])-1,day:Number(t[3])}:null}function ne(){let e=new Date;return{year:e.getFullYear(),month:e.getMonth(),day:e.getDate()}}function re(e,t){let n=new Date(Date.UTC(e.year,e.month,e.day+t));return{year:n.getUTCFullYear(),month:n.getUTCMonth(),day:n.getUTCDate()}}var ie=class{element;grid;titleEl;chosen=``;limits={};today=b(ne());view={year:0,month:0};focusDay=ne();constructor(e,t,n){this.locale=t,this.onPick=n;let r=document.createElement(`div`);r.className=`tcw-calendar`;let i=document.createElement(`div`);i.className=`tcw-calendar-head`;let a=document.createElement(`div`);a.className=`tcw-calendar-title`,a.setAttribute(`aria-live`,`polite`),i.append(this.navButton(e.prevMonth,-1),a,this.navButton(e.nextMonth,1));let o=document.createElement(`div`);o.className=`tcw-calendar-weekdays`,o.setAttribute(`aria-hidden`,`true`);let s=v(t),c=new Intl.DateTimeFormat(t,{weekday:`narrow`,timeZone:`UTC`});for(let e=0;e<g;e++){let t=document.createElement(`span`);t.className=`tcw-calendar-weekday`,t.textContent=c.format(new Date(Date.UTC(2023,0,1+(s+e)%g))),o.appendChild(t)}let l=document.createElement(`div`);l.className=`tcw-calendar-grid`,l.setAttribute(`role`,`grid`),l.addEventListener(`keydown`,e=>this.onKey(e)),l.addEventListener(`click`,e=>{let t=e.target.closest(`.tcw-calendar-day`);t&&!t.disabled&&t.dataset.date&&this.pick(t.dataset.date)});let u=document.createElement(`div`);u.className=`tcw-calendar-foot`;let d=document.createElement(`button`);d.type=`button`,d.className=`tcw-calendar-today`,d.textContent=e.today,d.addEventListener(`click`,()=>this.pick(this.today)),u.appendChild(d),r.append(i,o,l,u),this.element=r,this.grid=l,this.titleEl=a}show(e,t={}){this.chosen=e,this.limits=t,this.today=x(t.today)?t.today:b(ne());let n=this.clamp(x(e)??x(this.today));this.focusDay=n,this.view={year:n.year,month:n.month},this.render()}focusGrid(){this.grid.querySelector(`[tabindex="0"]`)?.focus()}navButton(e,t){let n=document.createElement(`button`);return n.type=`button`,n.className=`tcw-calendar-nav`,n.setAttribute(`aria-label`,e),n.innerHTML=t<0?`<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M10 3.5L5.5 8l4.5 4.5"/></svg>`:`<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M6 3.5L10.5 8 6 12.5"/></svg>`,n.addEventListener(`click`,()=>this.turn(t)),n}turn(e){let t=new Date(Date.UTC(this.view.year,this.view.month+e,1));this.view={year:t.getUTCFullYear(),month:t.getUTCMonth()};let n=new Date(Date.UTC(this.view.year,this.view.month+1,0)).getUTCDate();this.focusDay=this.clamp({...this.view,day:Math.min(this.focusDay.day,n)}),this.view={year:this.focusDay.year,month:this.focusDay.month},this.render()}clamp(e){let t=b(e),n=x(this.limits.min),r=x(this.limits.max);return n&&t<b(n)?n:r&&t>b(r)?r:e}allowed(e){let{min:t,max:n}=this.limits;return!(t&&e<t)&&!(n&&e>n)}render(){let e=this.locale;this.titleEl.textContent=new Intl.DateTimeFormat(e,{month:`long`,year:`numeric`,timeZone:`UTC`}).format(new Date(Date.UTC(this.view.year,this.view.month,1)));let t=this.today,n=b(this.focusDay),r=new Intl.DateTimeFormat(e,{dateStyle:`full`,timeZone:`UTC`});this.grid.textContent=``;let i=null;for(let[a,o]of y(this.view.year,this.view.month,v(e)).entries()){a%g===0&&(i=document.createElement(`div`),i.className=`tcw-calendar-week`,i.setAttribute(`role`,`row`),this.grid.appendChild(i));let e=b(o),s=document.createElement(`button`);s.type=`button`,s.className=`tcw-calendar-day`,s.dataset.date=e,s.setAttribute(`role`,`gridcell`),s.textContent=String(o.day),s.setAttribute(`aria-label`,r.format(new Date(Date.UTC(o.year,o.month,o.day)))),s.setAttribute(`aria-selected`,String(e===this.chosen)),s.tabIndex=e===n?0:-1,o.month!==this.view.month&&s.classList.add(`tcw-outside`),e===t&&s.classList.add(`tcw-today`),this.allowed(e)||(s.disabled=!0),i?.appendChild(s)}}onKey(e){let t={ArrowLeft:-1,ArrowRight:1,ArrowUp:-g,ArrowDown:g},n=this.element.isConnected&&getComputedStyle(this.element).direction===`rtl`;if(e.key in t){let r=n&&(e.key===`ArrowLeft`||e.key===`ArrowRight`)?-t[e.key]:t[e.key];this.moveFocus(re(this.focusDay,r))}else if(e.key===`PageUp`||e.key===`PageDown`)this.turn(e.key===`PageUp`?-1:1),this.focusGrid();else if(e.key===`Home`||e.key===`End`){let t=new Date(Date.UTC(this.view.year,this.view.month+1,0)).getUTCDate();this.moveFocus({...this.view,day:e.key===`Home`?1:t})}else if(e.key===`Enter`||e.key===` `)this.pick(b(this.focusDay));else return;e.preventDefault()}moveFocus(e){let t=this.clamp(e);this.focusDay=t,(t.year!==this.view.year||t.month!==this.view.month)&&(this.view={year:t.year,month:t.month}),this.render(),this.focusGrid()}pick(e){this.allowed(e)&&this.onPick(e)}},ae=class{input=null;view=null;onOutside=e=>{let t=e.target;this.view?.element.contains(t)||this.input?.contains(t)||this.close(!1)};onAway=()=>this.close(!1);onScroll=e=>{e.target instanceof Node&&this.view?.element.contains(e.target)||this.close(!1)};watch=new MutationObserver(()=>{this.input&&!this.input.isConnected&&this.close(!1)});constructor(e,t,n){this.layer=e,this.labels=t,this.locale=n}isOpenFor(e){return this.input===e}owns(e){return e!==null&&(e===this.input||this.view?.element.contains(e)===!0)}open(e){this.close(!1),this.input=e;let t=new ie(this.labels(),this.locale(),e=>this.pick(e));t.show(e.value,{min:e.min||void 0,max:e.max||void 0});let n=t.element;n.setAttribute(`role`,`dialog`);let r=e.getAttribute(`aria-label`)??e.labels?.[0]?.textContent??``;r&&n.setAttribute(`aria-label`,r.trim()),n.addEventListener(`mousedown`,e=>{e.target.closest(`button`)||e.preventDefault()}),n.addEventListener(`keydown`,e=>{e.stopPropagation(),e.key===`Escape`&&(e.preventDefault(),this.close(!0))}),this.view=t,this.layer().appendChild(n),p(n,e),document.addEventListener(`pointerdown`,this.onOutside,!0),window.addEventListener(`resize`,this.onAway),document.addEventListener(`scroll`,this.onScroll,{capture:!0,passive:!0}),this.watch.observe(document.documentElement,{childList:!0,subtree:!0})}close(e){let t=this.input;t&&(document.removeEventListener(`pointerdown`,this.onOutside,!0),window.removeEventListener(`resize`,this.onAway),document.removeEventListener(`scroll`,this.onScroll,{capture:!0}),this.watch.disconnect(),this.view?.element.remove(),this.view=null,this.input=null,e&&t.isConnected&&t.focus())}focusGrid(){this.view?.focusGrid()}destroy(){this.close(!1)}pick(e){let t=this.input;if(!t)return;let n=t.value!==e;t.value=e,this.close(!0),n&&(t.dispatchEvent(new Event(`input`,{bubbles:!0})),t.dispatchEvent(new Event(`change`,{bubbles:!0})))}},oe=()=>typeof matchMedia==`function`&&matchMedia(`(pointer: coarse)`).matches,se=()=>typeof CSS>`u`||typeof CSS.supports!=`function`||CSS.supports(`selector(::-webkit-calendar-picker-indicator)`);function ce(e){if(!(e instanceof Element))return null;let t=e.closest(`select`);return!t||t.matches(`:disabled`)||t.multiple||t.size>1?null:t}function le(e){return!(e instanceof HTMLInputElement)||e.type!==`date`||e.dataset.tcwCalendar===`inline`||e.matches(`:disabled`)||e.readOnly?null:e}function ue(e,t){let n=new h(t.layer),r=new ae(t.layer,t.labels,t.locale),i=t.native??oe,a=t.calendar??se,o=new WeakSet,s=e=>o.has(e)?!1:(o.add(e),!0),c=e=>{if(e.button!==0||i()||!s(e))return;let t=ce(e.target);if(t){if(e.preventDefault(),n.isOpenFor(t)){n.close(!0);return}t.focus(),n.open(t)}},l=e=>{if(i()||!a()||!s(e))return;let t=le(e.target);t&&(e.preventDefault(),r.isOpenFor(t)||r.open(t))},u=e=>{if(i()||!s(e))return;let t=ce(e.target);if(t){if(n.isOpenFor(t)){n.key(e)&&(e.preventDefault(),e.stopPropagation());return}(e.key===`Enter`||e.key===` `||e.altKey&&(e.key===`ArrowDown`||e.key===`ArrowUp`)||e.key===`F4`)&&(e.preventDefault(),e.stopPropagation(),n.open(t));return}let o=le(e.target);!o||!a()||(e.key===`Escape`&&r.isOpenFor(o)?(e.preventDefault(),e.stopPropagation(),r.close(!0)):(e.altKey&&e.key===`ArrowDown`||e.key===`F4`)&&(e.preventDefault(),r.isOpenFor(o)||r.open(o),r.focusGrid()))},d=e=>{if(!s(e))return;let t=e.target instanceof Node?e.target:null,i=e.relatedTarget instanceof Node?e.relatedTarget:null;n.owns(t)&&!n.owns(i)&&n.close(!1),r.owns(t)&&!r.owns(i)&&r.close(!1)};for(let t of e)t.addEventListener(`mousedown`,c,!0),t.addEventListener(`click`,l,!0),t.addEventListener(`keydown`,u,!0),t.addEventListener(`focusout`,d,!0);return()=>{for(let t of e)t.removeEventListener(`mousedown`,c,!0),t.removeEventListener(`click`,l,!0),t.removeEventListener(`keydown`,u,!0),t.removeEventListener(`focusout`,d,!0);n.destroy(),r.destroy()}}var de=[{label:`Candlestick`,value:`candlestick`},{label:`Line`,value:`line`},{label:`Area`,value:`area`},{label:`Bar`,value:`bar`},{label:`Heikin-Ashi`,value:`heikinAshi`},{label:`Hollow Candle`,value:`hollowCandle`},{label:`Baseline`,value:`baseline`},{label:`Volume Candles`,value:`volumeCandles`},{label:`Equivolume`,value:`equivolume`},{label:`HLC Area`,value:`hlcArea`},{label:`Step Line`,value:`stepLine`},{label:`Line + Markers`,value:`lineWithMarkers`},{label:`High-Low`,value:`hiLo`},{label:`Renko`,value:`renko`},{label:`Line Break`,value:`lineBreak`},{label:`Kagi`,value:`kagi`},{label:`Point & Figure`,value:`pointAndFigure`},{label:`Range Bars`,value:`rangeBars`}],fe=[{label:`Lines`,section:`lines`,tools:[{label:`Trend Line`,value:`trendLine`},{label:`Ray`,value:`ray`},{label:`Extended Line`,value:`extendedLine`},{label:`Info Line`,value:`infoLine`},{label:`Trend Angle`,value:`trendAngle`}]},{label:`Horizontal/Vertical`,section:`lines`,tools:[{label:`Horizontal Line`,value:`horizontalLine`},{label:`Horizontal Ray`,value:`horizontalRay`},{label:`Vertical Line`,value:`verticalLine`},{label:`Cross Line`,value:`crossLine`}]},{label:`Channels`,section:`lines`,tools:[{label:`Parallel Channel`,value:`parallelChannel`},{label:`Regression Channel`,value:`regressionChannel`}]},{label:`Fibonacci`,section:`fibonacci`,tools:[{label:`Fib Retracement`,value:`fibRetracement`},{label:`Fib Extension`,value:`fibExtension`},{label:`Fib Channel`,value:`fibChannel`},{label:`Fib Time Zones`,value:`fibTimeZones`},{label:`Fib Speed Resistance Fan`,value:`fibSpeedResistanceFan`},{label:`Fib Speed Resistance Arcs`,value:`fibArcs`},{label:`Fib Circles`,value:`fibCircles`},{label:`Fib Spiral`,value:`fibSpiral`},{label:`Fib Wedge`,value:`fibWedge`}]},{label:`Gann & Pitchforks`,section:`fibonacci`,tools:[{label:`Pitchfork`,value:`pitchfork`},{label:`Schiff Pitchfork`,value:`schiffPitchfork`},{label:`Modified Schiff Pitchfork`,value:`modifiedSchiffPitchfork`},{label:`Gann Fan`,value:`gannFan`},{label:`Gann Box`,value:`gannBox`},{label:`Gann Square`,value:`gannSquare`},{label:`Pitchfan`,value:`pitchfan`}]},{label:`Cycles`,section:`fibonacci`,tools:[{label:`Cyclic Lines`,value:`cyclicLines`},{label:`Time Cycles`,value:`timeCycles`},{label:`Sine Line`,value:`sineLine`}]},{label:`Patterns`,section:`patterns`,tools:[{label:`XABCD Pattern`,value:`xabcdPattern`},{label:`ABCD Pattern`,value:`abcdPattern`},{label:`Head and Shoulders`,value:`headAndShoulders`},{label:`Cypher Pattern`,value:`cypherPattern`},{label:`Three Drives Pattern`,value:`threeDrives`}]},{label:`Elliott Waves`,section:`patterns`,tools:[{label:`Elliott Wave`,value:`elliottWave`},{label:`Elliott Impulse Wave`,value:`elliottImpulse`},{label:`Elliott Correction Wave`,value:`elliottCorrection`},{label:`Elliott Triangle Wave`,value:`elliottTriangle`},{label:`Elliott Double Combo Wave`,value:`elliottDoubleCombo`},{label:`Elliott Triple Combo Wave`,value:`elliottTripleCombo`}]},{label:`Forecasting`,section:`forecasting`,tools:[{label:`Long/Short Position`,value:`riskReward`},{label:`Anchored VWAP`,value:`anchoredVWAP`},{label:`Fixed Range Volume Profile`,value:`volumeProfileRange`},{label:`Forecast`,value:`forecast`},{label:`Projection`,value:`projection`},{label:`Bars Pattern`,value:`barsPattern`}]},{label:`Measure`,section:`forecasting`,tools:[{label:`Price Range`,value:`priceRange`},{label:`Date Range`,value:`dateRange`},{label:`Date and Price Range`,value:`dateAndPriceRange`},{label:`Measure`,value:`measure`}]},{label:`Shapes`,section:`annotation`,tools:[{label:`Rectangle`,value:`rectangle`},{label:`Circle`,value:`circle`},{label:`Ellipse`,value:`ellipse`},{label:`Triangle`,value:`triangle`},{label:`Polyline`,value:`polyline`},{label:`Curve`,value:`curve`},{label:`Arc`,value:`arc`}]},{label:`Brushes`,section:`annotation`,tools:[{label:`Brush`,value:`brush`},{label:`Highlighter`,value:`highlighter`},{label:`Path`,value:`path`}]},{label:`Annotation`,section:`annotation`,tools:[{label:`Text`,value:`text`},{label:`Price Label`,value:`priceLabel`},{label:`Arrow`,value:`arrow`},{label:`Note`,value:`note`},{label:`Callout`,value:`callout`},{label:`Flag Mark`,value:`flag`},{label:`Arrow Mark`,value:`arrowMark`},{label:`Icon`,value:`icon`}]}],pe=[`BTCUSDT`,`ETHUSDT`,`SOLUSDT`,`BNBUSDT`],me={gridVisible:!0,volumeVisible:!0,volumeProfileVisible:!1,marketProfileVisible:!1,marketProfileSplit:!1,marketProfileLetters:!1,marketProfileBuckets:48,marketProfileOpacity:.32,depthHeatmapVisible:!1,depthHeatmapOpacity:.7,sessionShadingVisible:!1,pivotMarkersVisible:!1,pivotStrength:5,pivotStructureLabels:!1,periodLevelsVisible:!1,periodLevelsPeriod:`day`,legendVisible:!0,barCountdown:!0,indicatorValueLabels:!1,logScale:!1,scaleMode:`regular`,autoScale:!0,invertScale:!1,leftPriceScale:!1,crosshairMode:`magnet`,numberLocale:`en-US`,timezone:`local`,highLowLines:!1,mainSeriesVisible:!0,extendedHours:!0,chartTypeOptions:{}},S=(e,...t)=>({label:e,keys:t}),C=(e,t,n={})=>({label:e,keys:[t],auto:n}),w=e=>({hint:e}),he={from:`panes.titleColor`},ge={title:`settings.section.lastPrice`,rows:[S(`settings.priceLine`,`lastPrice.visible`),S(`settings.up`,`lastPrice.upColor`),S(`settings.down`,`lastPrice.downColor`),S(`drawingSettings.lineStyle`,`lastPrice.style`),S(`drawingSettings.lineWidth`,`lastPrice.width`)]},_e={title:`settings.volume`,rows:[S(`settings.up`,`volume.upColor`),S(`settings.down`,`volume.downColor`)]},ve={title:`settings.highLowLines`,rows:[C(`drawingSettings.color`,`highLow.color`,he)]},ye=[ge,_e,ve],be=[S(`settings.legendText`,`legend.textColor`),S(`settings.legendLabels`,`legend.labelColor`),S(`settings.paneTitles`,`panes.titleColor`)],xe=[S(`drawingSettings.text`,`axis.price.textColor`,`axis.time.textColor`),S(`settings.scaleLines`,`axis.price.lineColor`,`axis.time.lineColor`)],Se=[{title:`settings.section.background`,rows:[S(`settings.background`,`background.color`),S(`settings.paneBackground`,`panes.background`),S(`settings.paneSeparator`,`panes.separatorColor`),C(`settings.watermark`,`watermark.color`,he)]},{title:`settings.gridLines`,rows:[S(`settings.horizontal`,`grid.horizontal.visible`),S(`settings.vertical`,`grid.vertical.visible`),S(`drawingSettings.color`,`grid.horizontal.color`,`grid.vertical.color`),S(`drawingSettings.lineStyle`,`grid.horizontal.style`,`grid.vertical.style`),S(`drawingSettings.lineWidth`,`grid.horizontal.width`,`grid.vertical.width`)]},{title:`settings.crosshairMode`,rows:[S(`settings.horizontal`,`crosshair.horizontal.visible`),S(`settings.vertical`,`crosshair.vertical.visible`),S(`drawingSettings.color`,`crosshair.horizontal.color`,`crosshair.vertical.color`),S(`drawingSettings.lineStyle`,`crosshair.horizontal.style`,`crosshair.vertical.style`),S(`drawingSettings.lineWidth`,`crosshair.horizontal.width`,`crosshair.vertical.width`),S(`settings.labelBackground`,`crosshair.labelBackground`),S(`settings.labelText`,`crosshair.labelTextColor`)]},{title:`settings.sessionBreaks`,rows:[C(`drawingSettings.color`,`sessionBreaks.color`,{from:`axis.price.lineColor`}),C(`drawingSettings.lineStyle`,`sessionBreaks.style`),C(`drawingSettings.lineWidth`,`sessionBreaks.width`)]},{title:`objects.drawings`,rows:[C(`settings.handles`,`drawings.handleColor`,w(`#ffffff`))]}],Ce=[{title:`settings.section.orders`,trading:!0,rows:[C(`ticket.buy`,`trading.buyColor`,w(n.DEFAULT_TRADING_CONFIG.orderColors?.buy)),C(`ticket.sell`,`trading.sellColor`,w(n.DEFAULT_TRADING_CONFIG.orderColors?.sell)),C(`settings.profit`,`trading.profitColor`,w(n.DEFAULT_TRADING_CONFIG.positionColors?.profit)),C(`settings.loss`,`trading.lossColor`,w(n.DEFAULT_TRADING_CONFIG.positionColors?.loss)),C(`account.entry`,`trading.entryColor`,w(n.DEFAULT_TRADING_CONFIG.positionColors?.entry))]},{title:`settings.section.signals`,rows:[C(`account.long`,`markers.longColor`,w(n.DEFAULT_SIGNAL_STYLE.longColor)),C(`account.short`,`markers.shortColor`,w(n.DEFAULT_SIGNAL_STYLE.shortColor)),C(`markers.neutral`,`markers.neutralColor`,w(n.DEFAULT_SIGNAL_STYLE.neutralColor))]},{title:`settings.section.tradeZones`,rows:[C(`settings.profit`,`tradeZones.profitColor`,w(n.DEFAULT_TRADE_ZONE_STYLE.profitColor)),C(`settings.loss`,`tradeZones.lossColor`,w(n.DEFAULT_TRADE_ZONE_STYLE.lossColor)),C(`settings.openTrade`,`tradeZones.activeColor`,w(n.DEFAULT_TRADE_ZONE_STYLE.activeColor))]}],we={upColor:`settings.up`,downColor:`settings.down`,wickUpColor:`settings.upWick`,wickDownColor:`settings.downWick`,color:`drawingSettings.color`,lineColor:`drawingSettings.color`,lineWidth:`drawingSettings.lineWidth`,topColor:`settings.areaTop`,bottomColor:`settings.areaBottom`},Te=new Set([`candlestick`,`heikinAshi`,`volumeCandles`,`equivolume`]);function Ee(e){let t=`series.${e}.`;return Object.keys(n.CHART_STYLE_KEYS).filter(e=>e.startsWith(t)).map(n=>{let r=n.slice(t.length),i=we[r]??`drawingSettings.color`;return Te.has(e)&&r===`upColor`&&(i=`settings.upBody`),Te.has(e)&&r===`downColor`&&(i=`settings.downBody`),e===`baseline`&&r===`upColor`&&(i=`settings.aboveBase`),e===`baseline`&&r===`downColor`&&(i=`settings.belowBase`),S(i,n)})}var T=[...new Set([...Object.keys(n.CHART_STYLE_KEYS).filter(e=>e.startsWith(`series.`)),...[...ye,...Se,...Ce].flatMap(e=>e.rows.flatMap(e=>e.keys)),...[...be,...xe].flatMap(e=>e.keys)])],De=`/* === TradeCanvas Widget — Premium Styles === */
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../LayoutSession-nlhT-EH7.cjs`),t=require(`../i18n-D7B7uFrN.cjs`);let n=require(`@tradecanvas/commons`),r=require(`@tradecanvas/core`);function i(e,t,r={}){return(0,n.resampleBars)(e,t,{weekStartsOn:r.weekStartsOn??1,timeZone:r.timeZone})}function a(e){if(e.length<2)return 0;let t=[];for(let n=1;n<e.length;n++){let r=e[n].time-e[n-1].time;r>0&&t.push(r)}return t.length===0?0:(t.sort((e,t)=>e-t),t[Math.floor(t.length/2)])}var o=[{zone:`Pacific/Honolulu`,city:`Honolulu`},{zone:`America/Los_Angeles`,city:`Los Angeles`},{zone:`America/Denver`,city:`Denver`},{zone:`America/Chicago`,city:`Chicago`},{zone:`America/New_York`,city:`New York`},{zone:`America/Toronto`,city:`Toronto`},{zone:`America/Sao_Paulo`,city:`São Paulo`},{zone:`UTC`,city:`UTC`},{zone:`Europe/London`,city:`London`},{zone:`Europe/Berlin`,city:`Frankfurt`},{zone:`Europe/Paris`,city:`Paris`},{zone:`Europe/Zurich`,city:`Zurich`},{zone:`Africa/Johannesburg`,city:`Johannesburg`},{zone:`Europe/Istanbul`,city:`Istanbul`},{zone:`Europe/Moscow`,city:`Moscow`},{zone:`Asia/Dubai`,city:`Dubai`},{zone:`Asia/Kolkata`,city:`Mumbai`},{zone:`Asia/Bangkok`,city:`Bangkok`},{zone:`Asia/Ho_Chi_Minh`,city:`Ho Chi Minh City`},{zone:`Asia/Jakarta`,city:`Jakarta`},{zone:`Asia/Singapore`,city:`Singapore`},{zone:`Asia/Hong_Kong`,city:`Hong Kong`},{zone:`Asia/Shanghai`,city:`Shanghai`},{zone:`Asia/Taipei`,city:`Taipei`},{zone:`Asia/Seoul`,city:`Seoul`},{zone:`Asia/Tokyo`,city:`Tokyo`},{zone:`Australia/Sydney`,city:`Sydney`},{zone:`Pacific/Auckland`,city:`Auckland`}],s=/^-?\d+$/,c=840;function l(e){if(!s.test(e))return null;let t=Number(e);return Math.abs(t)<=c?t:null}function u(e){return!e||e===`local`?null:e===`exchange`?`exchange`:s.test(e)?l(e):(0,n.isValidTimeZone)(e)?e:null}function d(e){return e===null?`local`:String(e)}function f(e,t,r,i){let a=(0,n.offsetAt)(null,t),s=o.filter(({zone:e})=>(0,n.isValidTimeZone)(e)).map(({zone:e,city:r})=>{let i=(0,n.offsetAt)(e,t);return{value:e,label:e===`UTC`?`UTC`:`(${(0,n.tzLabel)(i)}) ${r}`,offset:i}}),c=u(e);typeof c==`number`&&s.push({value:e,label:(0,n.tzLabel)(c),offset:c}),s.sort((e,t)=>e.offset-t.offset);let l=[{value:`local`,label:`${r} (${(0,n.tzLabel)(a)})`,offset:a}];if(i){let e=(0,n.offsetAt)(i.zone&&(0,n.isValidTimeZone)(i.zone)?i.zone:`UTC`,t);l.push({value:`exchange`,label:`${i.label} (${(0,n.tzLabel)(e)})`,offset:e})}return[...l,...s]}var p=6,m=8,h=120;function ee(e,t,n=`left`){let r=e.style,i=t.getBoundingClientRect();r.position=`fixed`,r.margin=`0`,r.top=r.bottom=r.left=r.right=``;let a=window.innerHeight-i.bottom-p-m,o=i.top-p-m;e.scrollHeight<=a||a>=o?(r.top=`${i.bottom+p}px`,r.bottom=`auto`,r.maxHeight=`${Math.max(h,a)}px`):(r.top=`auto`,r.bottom=`${window.innerHeight-i.top+p}px`,r.maxHeight=`${Math.max(h,o)}px`);let s=getComputedStyle(t).direction===`rtl`,c=n===`right`!==s,l=e.offsetWidth,u=c?i.right-l:i.left;r.left=`${Math.max(m,Math.min(u,window.innerWidth-l-m))}px`}var te=700,g=class{select=null;panel=null;rows=[];active=-1;typed=``;typedAt=0;onOutside=e=>{let t=e.target;this.panel?.contains(t)||this.select?.contains(t)||this.close(!1)};onAway=()=>this.close(!1);onScroll=e=>{e.target instanceof Node&&this.panel?.contains(e.target)||this.close(!1)};watch=new MutationObserver(()=>{this.select&&!this.select.isConnected&&this.close(!1)});constructor(e){this.layer=e}isOpenFor(e){return this.select===e}owns(e){return e!==null&&(e===this.select||this.panel?.contains(e)===!0)}open(e){this.close(!1),this.select=e;let t=document.createElement(`div`);t.className=`tcw-dropdown tcw-select-menu`,t.setAttribute(`role`,`listbox`),t.id=`tcw-select-menu-${Math.random().toString(36).slice(2,9)}`;let n=e.getAttribute(`aria-label`)??e.labels?.[0]?.textContent??``;n&&t.setAttribute(`aria-label`,n.trim()),t.style.minWidth=`${e.getBoundingClientRect().width}px`,this.rows=[];for(let n of e.children)if(n instanceof HTMLOptGroupElement){let e=document.createElement(`div`);e.className=`tcw-select-group`,e.textContent=n.label,t.appendChild(e);for(let e of n.querySelectorAll(`option`))this.addRow(t,e,n.disabled)}else n instanceof HTMLOptionElement&&this.addRow(t,n,!1);t.addEventListener(`mousedown`,e=>e.preventDefault());let r=e=>this.rows.findIndex(t=>t.el.contains(e.target));t.addEventListener(`click`,e=>{let t=r(e);t>=0&&this.pick(t)}),t.addEventListener(`mousemove`,e=>{let t=r(e);t>=0&&t!==this.active&&this.enabled(t)&&this.setActive(t,!1)}),this.layer().appendChild(t),this.panel=t,ee(t,e),e.setAttribute(`aria-expanded`,`true`),e.setAttribute(`aria-controls`,t.id),this.setActive(this.rows.findIndex(e=>e.option.selected)),document.addEventListener(`pointerdown`,this.onOutside,!0),window.addEventListener(`resize`,this.onAway),document.addEventListener(`scroll`,this.onScroll,{capture:!0,passive:!0}),this.watch.observe(document.documentElement,{childList:!0,subtree:!0})}close(e){let t=this.select;t&&(document.removeEventListener(`pointerdown`,this.onOutside,!0),window.removeEventListener(`resize`,this.onAway),document.removeEventListener(`scroll`,this.onScroll,{capture:!0}),this.watch.disconnect(),this.panel?.remove(),this.panel=null,this.rows=[],this.select=null,t.setAttribute(`aria-expanded`,`false`),t.removeAttribute(`aria-controls`),t.removeAttribute(`aria-activedescendant`),e&&t.isConnected&&t.focus())}key(e){if(!this.select)return!1;switch(e.key){case`ArrowDown`:return this.step(1),!0;case`ArrowUp`:return this.step(-1),!0;case`Home`:return this.setActive(this.nextEnabled(-1,1)),!0;case`End`:return this.setActive(this.nextEnabled(this.rows.length,-1)),!0;case`PageDown`:return this.step(8),!0;case`PageUp`:return this.step(-8),!0;case` `:return this.typed&&Date.now()-this.typedAt<=te?(this.typeahead(` `),!0):(this.active>=0?this.pick(this.active):this.close(!0),!0);case`Enter`:return this.active>=0?this.pick(this.active):this.close(!0),!0;case`Escape`:return this.close(!0),!0;case`Tab`:return this.close(!1),!1;default:return e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey?(this.typeahead(e.key),!0):!1}}destroy(){this.close(!1)}addRow(e,t,n){let r=document.createElement(`div`);r.className=`tcw-select-option`,r.id=`${e.id}-${this.rows.length}`,r.setAttribute(`role`,`option`),r.setAttribute(`aria-selected`,String(t.selected)),(t.disabled||n)&&r.setAttribute(`aria-disabled`,`true`);let i=document.createElement(`span`);i.className=`tcw-select-option-text`,i.textContent=t.label||t.textContent||``,t.dir&&(i.dir=t.dir);let a=document.createElement(`span`);a.className=`tcw-select-check`,a.setAttribute(`aria-hidden`,`true`),r.append(a,i),e.appendChild(r),this.rows.push({option:t,el:r})}enabled(e){return this.rows[e]?.el.getAttribute(`aria-disabled`)!==`true`}nextEnabled(e,t){for(let n=e+t;n>=0&&n<this.rows.length;n+=t)if(this.enabled(n))return n;return-1}step(e){let t=e>0?1:-1,n=this.active;for(let r=0;r<Math.abs(e);r++){let e=this.nextEnabled(n,t);if(e<0)break;n=e}n>=0&&this.setActive(n)}setActive(e,t=!0){this.rows[this.active]?.el.classList.remove(`tcw-active`),this.active=e;let n=this.rows[e];n&&(n.el.classList.add(`tcw-active`),this.select?.setAttribute(`aria-activedescendant`,n.el.id),t&&n.el.scrollIntoView?.({block:`nearest`}))}typeahead(e){let t=Date.now();this.typed=t-this.typedAt>te?e.toLowerCase():this.typed+e.toLowerCase(),this.typedAt=t;let n=e=>this.enabled(e)&&(this.rows[e].el.textContent??``).trim().toLowerCase().startsWith(this.typed),r=this.typed.length===1?this.active+1:Math.max(0,this.active);for(let e=0;e<this.rows.length;e++){let t=(r+e)%this.rows.length;if(n(t)){this.setActive(t);return}}}pick(e){let t=this.select,n=this.rows[e];if(!t||!n||!this.enabled(e))return;let r=!n.option.selected;n.option.selected=!0,this.close(!0),r&&(t.dispatchEvent(new Event(`input`,{bubbles:!0})),t.dispatchEvent(new Event(`change`,{bubbles:!0})))}},_=42,v=7,ne=new Set([`US`,`CA`,`MX`,`BR`,`JP`,`KR`,`TW`,`HK`,`IL`,`PH`,`IN`,`ZA`,`AU`,`TH`,`SA`,`PE`,`CO`]);function y(e){try{let t=new Intl.Locale(e),n=t.getWeekInfo?.()??t.weekInfo;return n?n.firstDay===7?0:1:+!ne.has(t.maximize().region??``)}catch{return 1}}function b(e,t,n){let r=(new Date(Date.UTC(e,t,1)).getUTCDay()-n+v)%v,i=[];for(let n=0;n<_;n++){let a=new Date(Date.UTC(e,t,1-r+n));i.push({year:a.getUTCFullYear(),month:a.getUTCMonth(),day:a.getUTCDate()})}return i}var re=e=>String(e).padStart(2,`0`),x=e=>`${String(e.year).padStart(4,`0`)}-${re(e.month+1)}-${re(e.day)}`;function ie(e){let t=/^(\d{4})-(\d{2})-(\d{2})$/.exec(e??``);return t?{year:Number(t[1]),month:Number(t[2])-1,day:Number(t[3])}:null}function ae(){let e=new Date;return{year:e.getFullYear(),month:e.getMonth(),day:e.getDate()}}function oe(e,t){let n=new Date(Date.UTC(e.year,e.month,e.day+t));return{year:n.getUTCFullYear(),month:n.getUTCMonth(),day:n.getUTCDate()}}var se=class{element;grid;titleEl;chosen=``;limits={};today=x(ae());view={year:0,month:0};focusDay=ae();constructor(e,t,n){this.locale=t,this.onPick=n;let r=document.createElement(`div`);r.className=`tcw-calendar`;let i=document.createElement(`div`);i.className=`tcw-calendar-head`;let a=document.createElement(`div`);a.className=`tcw-calendar-title`,a.setAttribute(`aria-live`,`polite`),i.append(this.navButton(e.prevMonth,-1),a,this.navButton(e.nextMonth,1));let o=document.createElement(`div`);o.className=`tcw-calendar-weekdays`,o.setAttribute(`aria-hidden`,`true`);let s=y(t),c=new Intl.DateTimeFormat(t,{weekday:`narrow`,timeZone:`UTC`});for(let e=0;e<v;e++){let t=document.createElement(`span`);t.className=`tcw-calendar-weekday`,t.textContent=c.format(new Date(Date.UTC(2023,0,1+(s+e)%v))),o.appendChild(t)}let l=document.createElement(`div`);l.className=`tcw-calendar-grid`,l.setAttribute(`role`,`grid`),l.addEventListener(`keydown`,e=>this.onKey(e)),l.addEventListener(`click`,e=>{let t=e.target.closest(`.tcw-calendar-day`);t&&!t.disabled&&t.dataset.date&&this.pick(t.dataset.date)});let u=document.createElement(`div`);u.className=`tcw-calendar-foot`;let d=document.createElement(`button`);d.type=`button`,d.className=`tcw-calendar-today`,d.textContent=e.today,d.addEventListener(`click`,()=>this.pick(this.today)),u.appendChild(d),r.append(i,o,l,u),this.element=r,this.grid=l,this.titleEl=a}show(e,t={}){this.chosen=e,this.limits=t,this.today=ie(t.today)?t.today:x(ae());let n=this.clamp(ie(e)??ie(this.today));this.focusDay=n,this.view={year:n.year,month:n.month},this.render()}focusGrid(){this.grid.querySelector(`[tabindex="0"]`)?.focus()}navButton(e,t){let n=document.createElement(`button`);return n.type=`button`,n.className=`tcw-calendar-nav`,n.setAttribute(`aria-label`,e),n.innerHTML=t<0?`<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M10 3.5L5.5 8l4.5 4.5"/></svg>`:`<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M6 3.5L10.5 8 6 12.5"/></svg>`,n.addEventListener(`click`,()=>this.turn(t)),n}turn(e){let t=new Date(Date.UTC(this.view.year,this.view.month+e,1));this.view={year:t.getUTCFullYear(),month:t.getUTCMonth()};let n=new Date(Date.UTC(this.view.year,this.view.month+1,0)).getUTCDate();this.focusDay=this.clamp({...this.view,day:Math.min(this.focusDay.day,n)}),this.view={year:this.focusDay.year,month:this.focusDay.month},this.render()}clamp(e){let t=x(e),n=ie(this.limits.min),r=ie(this.limits.max);return n&&t<x(n)?n:r&&t>x(r)?r:e}allowed(e){let{min:t,max:n}=this.limits;return!(t&&e<t)&&!(n&&e>n)}render(){let e=this.locale;this.titleEl.textContent=new Intl.DateTimeFormat(e,{month:`long`,year:`numeric`,timeZone:`UTC`}).format(new Date(Date.UTC(this.view.year,this.view.month,1)));let t=this.today,n=x(this.focusDay),r=new Intl.DateTimeFormat(e,{dateStyle:`full`,timeZone:`UTC`});this.grid.textContent=``;let i=null;for(let[a,o]of b(this.view.year,this.view.month,y(e)).entries()){a%v===0&&(i=document.createElement(`div`),i.className=`tcw-calendar-week`,i.setAttribute(`role`,`row`),this.grid.appendChild(i));let e=x(o),s=document.createElement(`button`);s.type=`button`,s.className=`tcw-calendar-day`,s.dataset.date=e,s.setAttribute(`role`,`gridcell`),s.textContent=String(o.day),s.setAttribute(`aria-label`,r.format(new Date(Date.UTC(o.year,o.month,o.day)))),s.setAttribute(`aria-selected`,String(e===this.chosen)),s.tabIndex=e===n?0:-1,o.month!==this.view.month&&s.classList.add(`tcw-outside`),e===t&&s.classList.add(`tcw-today`),this.allowed(e)||(s.disabled=!0),i?.appendChild(s)}}onKey(e){let t={ArrowLeft:-1,ArrowRight:1,ArrowUp:-v,ArrowDown:v},n=this.element.isConnected&&getComputedStyle(this.element).direction===`rtl`;if(e.key in t){let r=n&&(e.key===`ArrowLeft`||e.key===`ArrowRight`)?-t[e.key]:t[e.key];this.moveFocus(oe(this.focusDay,r))}else if(e.key===`PageUp`||e.key===`PageDown`)this.turn(e.key===`PageUp`?-1:1),this.focusGrid();else if(e.key===`Home`||e.key===`End`){let t=new Date(Date.UTC(this.view.year,this.view.month+1,0)).getUTCDate();this.moveFocus({...this.view,day:e.key===`Home`?1:t})}else if(e.key===`Enter`||e.key===` `)this.pick(x(this.focusDay));else return;e.preventDefault()}moveFocus(e){let t=this.clamp(e);this.focusDay=t,(t.year!==this.view.year||t.month!==this.view.month)&&(this.view={year:t.year,month:t.month}),this.render(),this.focusGrid()}pick(e){this.allowed(e)&&this.onPick(e)}},ce=class{input=null;view=null;onOutside=e=>{let t=e.target;this.view?.element.contains(t)||this.input?.contains(t)||this.close(!1)};onAway=()=>this.close(!1);onScroll=e=>{e.target instanceof Node&&this.view?.element.contains(e.target)||this.close(!1)};watch=new MutationObserver(()=>{this.input&&!this.input.isConnected&&this.close(!1)});constructor(e,t,n){this.layer=e,this.labels=t,this.locale=n}isOpenFor(e){return this.input===e}owns(e){return e!==null&&(e===this.input||this.view?.element.contains(e)===!0)}open(e){this.close(!1),this.input=e;let t=new se(this.labels(),this.locale(),e=>this.pick(e));t.show(e.value,{min:e.min||void 0,max:e.max||void 0});let n=t.element;n.setAttribute(`role`,`dialog`);let r=e.getAttribute(`aria-label`)??e.labels?.[0]?.textContent??``;r&&n.setAttribute(`aria-label`,r.trim()),n.addEventListener(`mousedown`,e=>{e.target.closest(`button`)||e.preventDefault()}),n.addEventListener(`keydown`,e=>{e.stopPropagation(),e.key===`Escape`&&(e.preventDefault(),this.close(!0))}),this.view=t,this.layer().appendChild(n),ee(n,e),document.addEventListener(`pointerdown`,this.onOutside,!0),window.addEventListener(`resize`,this.onAway),document.addEventListener(`scroll`,this.onScroll,{capture:!0,passive:!0}),this.watch.observe(document.documentElement,{childList:!0,subtree:!0})}close(e){let t=this.input;t&&(document.removeEventListener(`pointerdown`,this.onOutside,!0),window.removeEventListener(`resize`,this.onAway),document.removeEventListener(`scroll`,this.onScroll,{capture:!0}),this.watch.disconnect(),this.view?.element.remove(),this.view=null,this.input=null,e&&t.isConnected&&t.focus())}focusGrid(){this.view?.focusGrid()}destroy(){this.close(!1)}pick(e){let t=this.input;if(!t)return;let n=t.value!==e;t.value=e,this.close(!0),n&&(t.dispatchEvent(new Event(`input`,{bubbles:!0})),t.dispatchEvent(new Event(`change`,{bubbles:!0})))}},le=()=>typeof matchMedia==`function`&&matchMedia(`(pointer: coarse)`).matches,ue=()=>typeof CSS>`u`||typeof CSS.supports!=`function`||CSS.supports(`selector(::-webkit-calendar-picker-indicator)`);function de(e){if(!(e instanceof Element))return null;let t=e.closest(`select`);return!t||t.matches(`:disabled`)||t.multiple||t.size>1?null:t}function fe(e){return!(e instanceof HTMLInputElement)||e.type!==`date`||e.dataset.tcwCalendar===`inline`||e.matches(`:disabled`)||e.readOnly?null:e}function pe(e,t){let n=new g(t.layer),r=new ce(t.layer,t.labels,t.locale),i=t.native??le,a=t.calendar??ue,o=new WeakSet,s=e=>o.has(e)?!1:(o.add(e),!0),c=e=>{if(e.button!==0||i()||!s(e))return;let t=de(e.target);if(t){if(e.preventDefault(),n.isOpenFor(t)){n.close(!0);return}t.focus(),n.open(t)}},l=e=>{if(i()||!a()||!s(e))return;let t=fe(e.target);t&&(e.preventDefault(),r.isOpenFor(t)||r.open(t))},u=e=>{if(i()||!s(e))return;let t=de(e.target);if(t){if(n.isOpenFor(t)){n.key(e)&&(e.preventDefault(),e.stopPropagation());return}(e.key===`Enter`||e.key===` `||e.altKey&&(e.key===`ArrowDown`||e.key===`ArrowUp`)||e.key===`F4`)&&(e.preventDefault(),e.stopPropagation(),n.open(t));return}let o=fe(e.target);!o||!a()||(e.key===`Escape`&&r.isOpenFor(o)?(e.preventDefault(),e.stopPropagation(),r.close(!0)):(e.altKey&&e.key===`ArrowDown`||e.key===`F4`)&&(e.preventDefault(),r.isOpenFor(o)||r.open(o),r.focusGrid()))},d=e=>{if(!s(e))return;let t=e.target instanceof Node?e.target:null,i=e.relatedTarget instanceof Node?e.relatedTarget:null;n.owns(t)&&!n.owns(i)&&n.close(!1),r.owns(t)&&!r.owns(i)&&r.close(!1)};for(let t of e)t.addEventListener(`mousedown`,c,!0),t.addEventListener(`click`,l,!0),t.addEventListener(`keydown`,u,!0),t.addEventListener(`focusout`,d,!0);return()=>{for(let t of e)t.removeEventListener(`mousedown`,c,!0),t.removeEventListener(`click`,l,!0),t.removeEventListener(`keydown`,u,!0),t.removeEventListener(`focusout`,d,!0);n.destroy(),r.destroy()}}var me=[{label:`Candlestick`,value:`candlestick`},{label:`Line`,value:`line`},{label:`Area`,value:`area`},{label:`Bar`,value:`bar`},{label:`Heikin-Ashi`,value:`heikinAshi`},{label:`Hollow Candle`,value:`hollowCandle`},{label:`Baseline`,value:`baseline`},{label:`Volume Candles`,value:`volumeCandles`},{label:`Equivolume`,value:`equivolume`},{label:`HLC Area`,value:`hlcArea`},{label:`Step Line`,value:`stepLine`},{label:`Line + Markers`,value:`lineWithMarkers`},{label:`High-Low`,value:`hiLo`},{label:`Renko`,value:`renko`},{label:`Line Break`,value:`lineBreak`},{label:`Kagi`,value:`kagi`},{label:`Point & Figure`,value:`pointAndFigure`},{label:`Range Bars`,value:`rangeBars`}],he=[{label:`Lines`,section:`lines`,tools:[{label:`Trend Line`,value:`trendLine`},{label:`Ray`,value:`ray`},{label:`Extended Line`,value:`extendedLine`},{label:`Info Line`,value:`infoLine`},{label:`Trend Angle`,value:`trendAngle`}]},{label:`Horizontal/Vertical`,section:`lines`,tools:[{label:`Horizontal Line`,value:`horizontalLine`},{label:`Horizontal Ray`,value:`horizontalRay`},{label:`Vertical Line`,value:`verticalLine`},{label:`Cross Line`,value:`crossLine`}]},{label:`Channels`,section:`lines`,tools:[{label:`Parallel Channel`,value:`parallelChannel`},{label:`Regression Channel`,value:`regressionChannel`}]},{label:`Fibonacci`,section:`fibonacci`,tools:[{label:`Fib Retracement`,value:`fibRetracement`},{label:`Fib Extension`,value:`fibExtension`},{label:`Fib Channel`,value:`fibChannel`},{label:`Fib Time Zones`,value:`fibTimeZones`},{label:`Fib Speed Resistance Fan`,value:`fibSpeedResistanceFan`},{label:`Fib Speed Resistance Arcs`,value:`fibArcs`},{label:`Fib Circles`,value:`fibCircles`},{label:`Fib Spiral`,value:`fibSpiral`},{label:`Fib Wedge`,value:`fibWedge`}]},{label:`Gann & Pitchforks`,section:`fibonacci`,tools:[{label:`Pitchfork`,value:`pitchfork`},{label:`Schiff Pitchfork`,value:`schiffPitchfork`},{label:`Modified Schiff Pitchfork`,value:`modifiedSchiffPitchfork`},{label:`Gann Fan`,value:`gannFan`},{label:`Gann Box`,value:`gannBox`},{label:`Gann Square`,value:`gannSquare`},{label:`Pitchfan`,value:`pitchfan`}]},{label:`Cycles`,section:`fibonacci`,tools:[{label:`Cyclic Lines`,value:`cyclicLines`},{label:`Time Cycles`,value:`timeCycles`},{label:`Sine Line`,value:`sineLine`}]},{label:`Patterns`,section:`patterns`,tools:[{label:`XABCD Pattern`,value:`xabcdPattern`},{label:`ABCD Pattern`,value:`abcdPattern`},{label:`Head and Shoulders`,value:`headAndShoulders`},{label:`Cypher Pattern`,value:`cypherPattern`},{label:`Three Drives Pattern`,value:`threeDrives`}]},{label:`Elliott Waves`,section:`patterns`,tools:[{label:`Elliott Wave`,value:`elliottWave`},{label:`Elliott Impulse Wave`,value:`elliottImpulse`},{label:`Elliott Correction Wave`,value:`elliottCorrection`},{label:`Elliott Triangle Wave`,value:`elliottTriangle`},{label:`Elliott Double Combo Wave`,value:`elliottDoubleCombo`},{label:`Elliott Triple Combo Wave`,value:`elliottTripleCombo`}]},{label:`Forecasting`,section:`forecasting`,tools:[{label:`Long/Short Position`,value:`riskReward`},{label:`Anchored VWAP`,value:`anchoredVWAP`},{label:`Fixed Range Volume Profile`,value:`volumeProfileRange`},{label:`Forecast`,value:`forecast`},{label:`Projection`,value:`projection`},{label:`Bars Pattern`,value:`barsPattern`}]},{label:`Measure`,section:`forecasting`,tools:[{label:`Price Range`,value:`priceRange`},{label:`Date Range`,value:`dateRange`},{label:`Date and Price Range`,value:`dateAndPriceRange`},{label:`Measure`,value:`measure`}]},{label:`Shapes`,section:`annotation`,tools:[{label:`Rectangle`,value:`rectangle`},{label:`Circle`,value:`circle`},{label:`Ellipse`,value:`ellipse`},{label:`Triangle`,value:`triangle`},{label:`Polyline`,value:`polyline`},{label:`Curve`,value:`curve`},{label:`Arc`,value:`arc`}]},{label:`Brushes`,section:`annotation`,tools:[{label:`Brush`,value:`brush`},{label:`Highlighter`,value:`highlighter`},{label:`Path`,value:`path`}]},{label:`Annotation`,section:`annotation`,tools:[{label:`Text`,value:`text`},{label:`Price Label`,value:`priceLabel`},{label:`Arrow`,value:`arrow`},{label:`Note`,value:`note`},{label:`Callout`,value:`callout`},{label:`Flag Mark`,value:`flag`},{label:`Arrow Mark`,value:`arrowMark`},{label:`Icon`,value:`icon`}]}],ge=[`BTCUSDT`,`ETHUSDT`,`SOLUSDT`,`BNBUSDT`],_e={gridVisible:!0,volumeVisible:!0,volumeProfileVisible:!1,marketProfileVisible:!1,marketProfileSplit:!1,marketProfileLetters:!1,marketProfileBuckets:48,marketProfileOpacity:.32,depthHeatmapVisible:!1,depthHeatmapOpacity:.7,sessionShadingVisible:!1,pivotMarkersVisible:!1,pivotStrength:5,pivotStructureLabels:!1,periodLevelsVisible:!1,periodLevelsPeriod:`day`,legendVisible:!0,barCountdown:!0,indicatorValueLabels:!1,logScale:!1,scaleMode:`regular`,autoScale:!0,invertScale:!1,leftPriceScale:!1,crosshairMode:`magnet`,numberLocale:`en-US`,timezone:`local`,highLowLines:!1,mainSeriesVisible:!0,extendedHours:!0,chartTypeOptions:{}},S=(e,...t)=>({label:e,keys:t}),C=(e,t,n={})=>({label:e,keys:[t],auto:n}),w=e=>({hint:e}),ve={from:`panes.titleColor`},ye={title:`settings.section.lastPrice`,rows:[S(`settings.priceLine`,`lastPrice.visible`),S(`settings.up`,`lastPrice.upColor`),S(`settings.down`,`lastPrice.downColor`),S(`drawingSettings.lineStyle`,`lastPrice.style`),S(`drawingSettings.lineWidth`,`lastPrice.width`)]},be={title:`settings.volume`,rows:[S(`settings.up`,`volume.upColor`),S(`settings.down`,`volume.downColor`)]},xe={title:`settings.highLowLines`,rows:[C(`drawingSettings.color`,`highLow.color`,ve)]},Se=[ye,be,xe],Ce=[S(`settings.legendText`,`legend.textColor`),S(`settings.legendLabels`,`legend.labelColor`)],we=[...Ce,S(`settings.paneTitles`,`panes.titleColor`)],Te=[S(`drawingSettings.text`,`axis.price.textColor`,`axis.time.textColor`),S(`settings.scaleLines`,`axis.price.lineColor`,`axis.time.lineColor`)],Ee=[{title:`settings.section.background`,rows:[S(`settings.background`,`background.color`),S(`settings.paneBackground`,`panes.background`),S(`settings.paneSeparator`,`panes.separatorColor`),C(`settings.watermark`,`watermark.color`,ve)]},{title:`settings.gridLines`,rows:[S(`settings.horizontal`,`grid.horizontal.visible`),S(`settings.vertical`,`grid.vertical.visible`),S(`drawingSettings.color`,`grid.horizontal.color`,`grid.vertical.color`),S(`drawingSettings.lineStyle`,`grid.horizontal.style`,`grid.vertical.style`),S(`drawingSettings.lineWidth`,`grid.horizontal.width`,`grid.vertical.width`)]},{title:`settings.crosshairMode`,rows:[S(`settings.horizontal`,`crosshair.horizontal.visible`),S(`settings.vertical`,`crosshair.vertical.visible`),S(`drawingSettings.color`,`crosshair.horizontal.color`,`crosshair.vertical.color`),S(`drawingSettings.lineStyle`,`crosshair.horizontal.style`,`crosshair.vertical.style`),S(`drawingSettings.lineWidth`,`crosshair.horizontal.width`,`crosshair.vertical.width`),S(`settings.labelBackground`,`crosshair.labelBackground`),S(`settings.labelText`,`crosshair.labelTextColor`)]},{title:`settings.sessionBreaks`,rows:[C(`drawingSettings.color`,`sessionBreaks.color`,{from:`axis.price.lineColor`}),C(`drawingSettings.lineStyle`,`sessionBreaks.style`),C(`drawingSettings.lineWidth`,`sessionBreaks.width`)]},{title:`objects.drawings`,rows:[C(`settings.handles`,`drawings.handleColor`,w(`#ffffff`))]}],De=[{title:`settings.section.orders`,trading:!0,rows:[C(`ticket.buy`,`trading.buyColor`,w(n.DEFAULT_TRADING_CONFIG.orderColors?.buy)),C(`ticket.sell`,`trading.sellColor`,w(n.DEFAULT_TRADING_CONFIG.orderColors?.sell)),C(`settings.profit`,`trading.profitColor`,w(n.DEFAULT_TRADING_CONFIG.positionColors?.profit)),C(`settings.loss`,`trading.lossColor`,w(n.DEFAULT_TRADING_CONFIG.positionColors?.loss)),C(`account.entry`,`trading.entryColor`,w(n.DEFAULT_TRADING_CONFIG.positionColors?.entry))]},{title:`settings.section.signals`,rows:[C(`account.long`,`markers.longColor`,w(n.DEFAULT_SIGNAL_STYLE.longColor)),C(`account.short`,`markers.shortColor`,w(n.DEFAULT_SIGNAL_STYLE.shortColor)),C(`markers.neutral`,`markers.neutralColor`,w(n.DEFAULT_SIGNAL_STYLE.neutralColor))]},{title:`settings.section.tradeZones`,rows:[C(`settings.profit`,`tradeZones.profitColor`,w(n.DEFAULT_TRADE_ZONE_STYLE.profitColor)),C(`settings.loss`,`tradeZones.lossColor`,w(n.DEFAULT_TRADE_ZONE_STYLE.lossColor)),C(`settings.openTrade`,`tradeZones.activeColor`,w(n.DEFAULT_TRADE_ZONE_STYLE.activeColor))]}],Oe={upColor:`settings.up`,downColor:`settings.down`,wickUpColor:`settings.upWick`,wickDownColor:`settings.downWick`,color:`drawingSettings.color`,lineColor:`drawingSettings.color`,lineWidth:`drawingSettings.lineWidth`,topColor:`settings.areaTop`,bottomColor:`settings.areaBottom`},ke=new Set([`candlestick`,`heikinAshi`,`volumeCandles`,`equivolume`]);function Ae(e){let t=`series.${e}.`;return Object.keys(n.CHART_STYLE_KEYS).filter(e=>e.startsWith(t)).map(n=>{let r=n.slice(t.length),i=Oe[r]??`drawingSettings.color`;return ke.has(e)&&r===`upColor`&&(i=`settings.upBody`),ke.has(e)&&r===`downColor`&&(i=`settings.downBody`),e===`baseline`&&r===`upColor`&&(i=`settings.aboveBase`),e===`baseline`&&r===`downColor`&&(i=`settings.belowBase`),S(i,n)})}var T=[...new Set([...Object.keys(n.CHART_STYLE_KEYS).filter(e=>e.startsWith(`series.`)),...[...Se,...Ee,...De].flatMap(e=>e.rows.flatMap(e=>e.keys)),...[...we,...Te].flatMap(e=>e.keys)])],je=`/* === TradeCanvas Widget — Premium Styles === */
2
2
 
3
3
  /*
4
4
  * The HTML \`hidden\` attribute only sets \`display: none\` via the UA stylesheet,
@@ -1033,6 +1033,13 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=requi
1033
1033
  color: var(--tcw-accent);
1034
1034
  }
1035
1035
 
1036
+ /* A compared symbol's name opens nothing. */
1037
+ .tcw-ind-legend-row--compare .tcw-ind-legend-name,
1038
+ .tcw-ind-legend-row--compare .tcw-ind-legend-name:hover {
1039
+ color: var(--tcw-text);
1040
+ cursor: default;
1041
+ }
1042
+
1036
1043
  /* The values are one line of text: a narrow chart cuts the line, so the values
1037
1044
  before the cut stay whole and the one it falls in ends in an ellipsis. Values
1038
1045
  shrinking each on its own cut them all at once. */
@@ -1054,26 +1061,53 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=requi
1054
1061
  visibility: hidden;
1055
1062
  }
1056
1063
 
1064
+ /* A compare's line colour, as a short stroke of it before the name. */
1065
+ .tcw-ind-legend-swatch {
1066
+ flex: none;
1067
+ align-self: center;
1068
+ width: 10px;
1069
+ height: 3px;
1070
+ margin-inline-end: var(--tcw-space-2);
1071
+ border-radius: 1px;
1072
+ }
1073
+
1074
+ .tcw-ind-legend-row--hidden .tcw-ind-legend-swatch,
1057
1075
  .tcw-ind-legend-row--hidden .tcw-ind-legend-name,
1058
1076
  .tcw-ind-legend-row--hidden .tcw-ind-legend-values {
1059
1077
  opacity: 0.45;
1060
1078
  }
1061
1079
 
1062
- /* Show / settings / remove: on hover or keyboard focus (always on touch). */
1080
+ /* Show / settings / remove: on hover or keyboard focus (always on touch). Out of sight, not out of the
1081
+ page, so Tab reaches them in a row with nothing else to focus (a compare's) and a screen reader finds
1082
+ them; a button focused shows them all. */
1063
1083
  .tcw-ind-legend-actions {
1064
- display: none;
1084
+ display: inline-flex;
1085
+ position: absolute;
1086
+ width: 1px;
1087
+ height: 1px;
1088
+ overflow: hidden;
1089
+ clip-path: inset(50%);
1090
+ white-space: nowrap;
1065
1091
  gap: 1px;
1066
1092
  margin-left: -2px;
1067
1093
  }
1068
1094
 
1069
1095
  .tcw-ind-legend-row:hover .tcw-ind-legend-actions,
1070
1096
  .tcw-ind-legend-row:focus-within .tcw-ind-legend-actions {
1071
- display: inline-flex;
1097
+ position: static;
1098
+ width: auto;
1099
+ height: auto;
1100
+ overflow: visible;
1101
+ clip-path: none;
1072
1102
  }
1073
1103
 
1074
1104
  @media (hover: none) {
1075
1105
  .tcw-ind-legend-actions {
1076
- display: inline-flex;
1106
+ position: static;
1107
+ width: auto;
1108
+ height: auto;
1109
+ overflow: visible;
1110
+ clip-path: none;
1077
1111
  }
1078
1112
 
1079
1113
  /* Finger-sized targets. */
@@ -1495,6 +1529,25 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=requi
1495
1529
  border-top: 1px solid var(--tcw-divider);
1496
1530
  }
1497
1531
 
1532
+ /* A number field's hint goes on a line of its own, under the field. */
1533
+ .tcw-settings-row--number {
1534
+ flex-wrap: wrap;
1535
+ }
1536
+
1537
+ .tcw-settings-hint {
1538
+ flex-basis: 100%;
1539
+ padding-top: var(--tcw-space-2);
1540
+ color: var(--tcw-red);
1541
+ font-size: var(--tcw-font-size-xs);
1542
+ line-height: 1.35;
1543
+ text-align: end;
1544
+ }
1545
+
1546
+ /* Empty, it takes no room but stays rendered: a live region that appears with its text is often not read out. */
1547
+ .tcw-settings-hint:empty {
1548
+ padding-top: 0;
1549
+ }
1550
+
1498
1551
  .tcw-settings-label {
1499
1552
  font-size: var(--tcw-font-size);
1500
1553
  color: var(--tcw-text-dim);
@@ -2118,7 +2171,14 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=requi
2118
2171
  color: var(--tcw-red);
2119
2172
  }
2120
2173
 
2121
- /* === Replay scrubber === */
2174
+ /* === Replay bar ===
2175
+ * A transport over the foot of the main pane: step back / play / step
2176
+ * forward, where the replay is (its date and a track with the played part
2177
+ * filled), its pace (speed, step), and the ways out (pick another bar, back
2178
+ * to now). Only --tcw-* tokens; its sizes come from the look's own ladder.
2179
+ * The widget sets where it sits (--tcw-replay-foot, --tcw-replay-plot-*)
2180
+ * from the main pane, and the tier (data-fit) from the room it has.
2181
+ */
2122
2182
 
2123
2183
  /* Picking the replay start: the bars right of the pointer would be hidden. */
2124
2184
  .tcw-replay-shade {
@@ -2129,177 +2189,296 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=requi
2129
2189
  border-inline-start: 1.5px dashed var(--tcw-accent);
2130
2190
  }
2131
2191
 
2132
- .tcw-replay-group {
2133
- display: inline-flex;
2134
- align-items: center;
2135
- gap: 6px;
2136
- }
2137
-
2138
- .tcw-replay-group[hidden] { display: none; }
2139
-
2140
- .tcw-replay-hint {
2141
- display: inline-flex;
2142
- align-items: center;
2143
- gap: 6px;
2144
- padding: 0 4px;
2145
- color: var(--tcw-text-dim);
2146
- white-space: nowrap;
2147
- }
2148
-
2149
- .tcw-replay-text-btn {
2150
- height: 26px;
2151
- padding: 0 10px;
2152
- border: 1px solid var(--tcw-border);
2153
- border-radius: var(--tcw-control-radius);
2154
- background: transparent;
2155
- color: var(--tcw-text);
2156
- font: inherit;
2157
- font-weight: var(--tcw-weight);
2158
- white-space: nowrap;
2159
- cursor: pointer;
2160
- transition: background var(--tcw-dur-fast), border-color var(--tcw-dur-fast), color var(--tcw-dur-fast);
2161
- }
2162
-
2163
- .tcw-replay-text-btn:hover { background: var(--tcw-hover-bg); border-color: var(--tcw-border-strong); }
2164
- .tcw-replay-text-btn:focus-visible { outline: none; box-shadow: var(--tcw-ring); }
2165
-
2166
- /* At the last bar: the way out is the next thing to do. */
2167
- .tcw-replay-bar--ended .tcw-replay-realtime {
2168
- background: var(--tcw-accent);
2169
- border-color: var(--tcw-accent);
2170
- color: var(--tcw-accent-ink);
2171
- }
2172
-
2173
- .tcw-replay-btn:disabled { opacity: 0.4; cursor: default; }
2174
-
2175
- @media (max-width: 640px) {
2176
- .tcw-replay-bar {
2177
- flex-wrap: wrap;
2178
- justify-content: center;
2179
- max-width: calc(100% - 24px);
2180
- border-radius: var(--tcw-panel-radius);
2181
- }
2182
- .tcw-replay-hint { white-space: normal; }
2183
- }
2184
-
2185
2192
  .tcw-replay-bar {
2193
+ /* Buttons are the look's controls; Play two small steps above them. */
2194
+ --tcw-replay-btn: var(--tcw-control-h);
2195
+ --tcw-replay-play: calc(var(--tcw-control-h) + 2 * var(--tcw-space-2));
2196
+ --tcw-replay-track-w: calc(var(--tcw-space-7) * 6);
2197
+ --tcw-replay-track-min: calc(var(--tcw-space-7) * 3);
2198
+ --tcw-replay-rail: var(--tcw-space-2);
2199
+ --tcw-replay-head-w: var(--tcw-space-2);
2200
+ --tcw-replay-head-h: var(--tcw-space-5);
2186
2201
  position: absolute;
2187
- left: 50%;
2188
- /* Above the 30px time axis, so its dates stay readable. */
2189
- bottom: 40px;
2190
- transform: translateX(-50%);
2202
+ /* On the main pane's foot (over the volume, clear of the bottom panes), above the time axis without them. */
2203
+ bottom: calc(var(--tcw-replay-foot, 30px) + var(--tcw-space-4));
2204
+ inset-inline: var(--tcw-replay-plot-start, 0px) var(--tcw-replay-plot-end, 0px);
2205
+ /* Centred on the plot by its margins: an entrance on \`transform\` would undo a translate. */
2206
+ margin-inline: auto;
2207
+ box-sizing: border-box;
2208
+ width: max-content;
2209
+ max-width: calc(100% - var(--tcw-replay-plot-start, 0px) - var(--tcw-replay-plot-end, 0px) - 2 * var(--tcw-space-4));
2191
2210
  z-index: 25;
2192
2211
  display: flex;
2193
2212
  align-items: center;
2194
- gap: 6px;
2195
- padding: 6px 10px;
2213
+ gap: var(--tcw-space-4);
2214
+ padding: var(--tcw-space-3);
2196
2215
  background: var(--tcw-bg-elevated);
2197
- border: 1px solid var(--tcw-border);
2198
- border-radius: var(--tcw-panel-radius);
2199
- box-shadow: var(--tcw-menu-shadow);
2216
+ background: color-mix(in srgb, var(--tcw-bg-elevated) var(--tcw-surface-opacity, 100%), transparent);
2200
2217
  backdrop-filter: blur(var(--tcw-blur));
2201
2218
  -webkit-backdrop-filter: blur(var(--tcw-blur));
2202
- font-size: var(--tcw-font-size-sm);
2219
+ /* The look's menu shadow carries its hairline (Print, Terminal, Capsule): no border of its own on top. */
2220
+ border-radius: var(--tcw-panel-radius);
2221
+ box-shadow: var(--tcw-menu-shadow);
2203
2222
  color: var(--tcw-text);
2204
- animation: tcw-pop-in var(--tcw-dur-normal) var(--tcw-ease-out);
2223
+ font-size: var(--tcw-font-size-sm);
2224
+ line-height: 1.2;
2225
+ animation: tcw-sel-in var(--tcw-dur-normal) var(--tcw-ease-out);
2205
2226
  }
2206
2227
 
2207
- .tcw-replay-btn {
2208
- width: 28px;
2209
- height: 28px;
2228
+ .tcw-replay-group,
2229
+ .tcw-replay-slot {
2210
2230
  display: inline-flex;
2211
2231
  align-items: center;
2212
- justify-content: center;
2213
- border: none;
2232
+ gap: var(--tcw-space-2);
2233
+ min-width: 0;
2234
+ }
2235
+ .tcw-replay-bar [hidden] { display: none !important; }
2236
+ /* The step field on a single step: nothing there, no gap for it. */
2237
+ .tcw-replay-slot:empty { display: none; }
2238
+
2239
+ /* Hairlines between the groups where the look draws separators (Print, Terminal); a gap in the others. */
2240
+ .tcw-replay-sep {
2241
+ flex: none;
2242
+ align-self: stretch;
2243
+ width: var(--tcw-sep-w);
2244
+ margin-block: var(--tcw-space-2);
2245
+ background: var(--tcw-divider);
2246
+ }
2247
+
2248
+ /* --- Buttons --- */
2249
+ .tcw-replay-btn {
2250
+ flex: none;
2251
+ display: inline-grid;
2252
+ place-items: center;
2253
+ inline-size: var(--tcw-replay-btn);
2254
+ block-size: var(--tcw-replay-btn);
2255
+ padding: 0;
2256
+ border: 0;
2257
+ border-radius: var(--tcw-control-radius);
2214
2258
  background: transparent;
2215
2259
  color: var(--tcw-text-dim);
2216
- border-radius: var(--tcw-control-radius);
2260
+ font: inherit;
2217
2261
  cursor: pointer;
2218
- font-family: inherit;
2219
- transition: background var(--tcw-dur-fast) var(--tcw-ease), color var(--tcw-dur-fast) var(--tcw-ease);
2220
- }
2221
-
2222
- .tcw-replay-btn:hover {
2223
- background: var(--tcw-hover-bg);
2224
- color: var(--tcw-text);
2262
+ transition:
2263
+ background-color var(--tcw-dur-fast) var(--tcw-ease),
2264
+ color var(--tcw-dur-fast) var(--tcw-ease),
2265
+ transform var(--tcw-dur-fast) var(--tcw-ease);
2225
2266
  }
2267
+ .tcw-replay-btn > svg,
2268
+ .tcw-replay-text-btn svg { width: var(--tcw-icon); height: var(--tcw-icon); flex: none; }
2269
+ .tcw-replay-btn:hover { background: var(--tcw-hover-bg); color: var(--tcw-text); }
2270
+ .tcw-replay-btn:active { background: var(--tcw-active-bg); transform: scale(0.94); }
2271
+ .tcw-replay-btn:focus-visible { outline: none; box-shadow: var(--tcw-ring); }
2226
2272
 
2273
+ /* Play: the one filled control. Its focus ring stands off the fill, or it would vanish into it. */
2227
2274
  .tcw-replay-btn.tcw-replay-play {
2275
+ inline-size: var(--tcw-replay-play);
2276
+ block-size: var(--tcw-replay-play);
2228
2277
  background: var(--tcw-accent);
2229
2278
  color: var(--tcw-accent-ink);
2230
- width: 32px;
2231
- height: 32px;
2232
- box-shadow: 0 0 0 3px var(--tcw-accent-glow);
2279
+ }
2280
+ .tcw-replay-btn.tcw-replay-play:hover { background: var(--tcw-accent-hover); color: var(--tcw-accent-ink); }
2281
+ .tcw-replay-btn.tcw-replay-play:focus-visible {
2282
+ box-shadow: 0 0 0 var(--tcw-space-1) var(--tcw-bg-elevated), 0 0 0 calc(2 * var(--tcw-space-1)) var(--tcw-accent-line);
2233
2283
  }
2234
2284
 
2235
- .tcw-replay-btn.tcw-replay-play:hover {
2236
- background: var(--tcw-accent-hover);
2285
+ .tcw-replay-btn:disabled,
2286
+ .tcw-replay-text-btn:disabled,
2287
+ .tcw-replay-scrubber:disabled,
2288
+ .tcw-replay-speed:disabled { opacity: 0.4; cursor: default; transform: none; }
2289
+ /* Nothing left to play: a muted fill, not a faded accent that reads as pressed. */
2290
+ .tcw-replay-btn.tcw-replay-play:disabled { background: var(--tcw-active-bg); color: var(--tcw-text-muted); opacity: 1; }
2291
+
2292
+ /* --- Where the replay is --- */
2293
+ .tcw-replay-timeline {
2294
+ flex: 1 1 auto;
2295
+ gap: var(--tcw-space-4);
2296
+ }
2297
+ .tcw-replay-time {
2298
+ flex: none;
2299
+ font-family: var(--tcw-font-mono);
2300
+ font-size: var(--tcw-font-size-sm);
2301
+ font-variant-numeric: tabular-nums;
2302
+ color: var(--tcw-text);
2303
+ white-space: nowrap;
2237
2304
  }
2305
+ .tcw-replay-group[aria-busy='true'] .tcw-replay-time,
2306
+ .tcw-replay-group[aria-busy='true'] .tcw-replay-hint { color: var(--tcw-text-muted); }
2238
2307
 
2239
- .tcw-replay-scrubber {
2308
+ .tcw-root input[type='range'].tcw-replay-scrubber {
2309
+ --tcw-replay-rest: var(--tcw-border-strong);
2310
+ flex: 1 1 var(--tcw-replay-track-w);
2311
+ min-inline-size: var(--tcw-replay-track-min);
2312
+ inline-size: var(--tcw-replay-track-w);
2313
+ block-size: var(--tcw-replay-btn);
2314
+ margin: 0;
2315
+ padding: 0;
2240
2316
  appearance: none;
2241
2317
  -webkit-appearance: none;
2242
- width: 220px;
2243
- height: 4px;
2244
- background: var(--tcw-border-strong);
2245
- border-radius: 2px;
2246
- outline: none;
2318
+ background: transparent;
2319
+ border: 0;
2320
+ border-radius: var(--tcw-control-radius);
2247
2321
  cursor: pointer;
2248
2322
  }
2249
-
2250
- .tcw-replay-scrubber::-webkit-slider-thumb {
2323
+ /* Measured at its least: the bar's width with no slack in the track. */
2324
+ .tcw-replay-bar[data-measure] { max-width: none; animation: none; }
2325
+ .tcw-replay-bar[data-measure] input[type='range'].tcw-replay-scrubber { inline-size: var(--tcw-replay-track-min); flex: none; }
2326
+ .tcw-root input[type='range'].tcw-replay-scrubber:hover { --tcw-replay-rest: var(--tcw-text-muted); }
2327
+ .tcw-root input[type='range'].tcw-replay-scrubber:focus-visible { outline: none; box-shadow: var(--tcw-ring); }
2328
+ /* The played part in the accent, the rest a rail; Firefox fills it itself. */
2329
+ .tcw-root input[type='range'].tcw-replay-scrubber::-webkit-slider-runnable-track {
2330
+ block-size: var(--tcw-replay-rail);
2331
+ border-radius: var(--tcw-radius-xs);
2332
+ background: linear-gradient(to right, var(--tcw-accent) 0 var(--tcw-replay-done, 0%), var(--tcw-replay-rest) var(--tcw-replay-done, 0%) 100%);
2333
+ }
2334
+ .tcw-root input[type='range'].tcw-replay-scrubber::-moz-range-track { block-size: var(--tcw-replay-rail); border-radius: var(--tcw-radius-xs); background: var(--tcw-replay-rest); }
2335
+ .tcw-root input[type='range'].tcw-replay-scrubber::-moz-range-progress { block-size: var(--tcw-replay-rail); border-radius: var(--tcw-radius-xs); background: var(--tcw-accent); }
2336
+ /* A playhead, as the chart marks the replay's cut: a short upright in ink, rounded as the look rounds. */
2337
+ .tcw-root input[type='range'].tcw-replay-scrubber::-webkit-slider-thumb {
2251
2338
  -webkit-appearance: none;
2252
2339
  appearance: none;
2253
- width: 14px;
2254
- height: 14px;
2255
- border-radius: 50%;
2256
- background: var(--tcw-accent);
2257
- border: 2px solid var(--tcw-bg-elevated);
2258
- box-shadow: 0 0 0 1px var(--tcw-accent), 0 2px 6px rgba(0, 0, 0, 0.3);
2259
- cursor: pointer;
2340
+ inline-size: var(--tcw-replay-head-w);
2341
+ block-size: var(--tcw-replay-head-h);
2342
+ margin-top: calc((var(--tcw-replay-rail) - var(--tcw-replay-head-h)) / 2);
2343
+ border: 0;
2344
+ border-radius: var(--tcw-radius-xs);
2345
+ background: var(--tcw-text);
2346
+ box-shadow: 0 0 0 var(--tcw-space-1) var(--tcw-bg-elevated);
2347
+ transition: transform var(--tcw-dur-fast) var(--tcw-ease);
2260
2348
  }
2261
-
2262
- .tcw-replay-scrubber::-moz-range-thumb {
2263
- width: 14px;
2264
- height: 14px;
2265
- border-radius: 50%;
2266
- background: var(--tcw-accent);
2267
- border: 2px solid var(--tcw-bg-elevated);
2268
- box-shadow: 0 0 0 1px var(--tcw-accent), 0 2px 6px rgba(0, 0, 0, 0.3);
2269
- cursor: pointer;
2349
+ .tcw-root input[type='range'].tcw-replay-scrubber:hover::-webkit-slider-thumb,
2350
+ .tcw-root input[type='range'].tcw-replay-scrubber:active::-webkit-slider-thumb { transform: scaleY(1.25); }
2351
+ .tcw-root input[type='range'].tcw-replay-scrubber::-moz-range-thumb {
2352
+ inline-size: var(--tcw-replay-head-w);
2353
+ block-size: var(--tcw-replay-head-h);
2354
+ border: 0;
2355
+ border-radius: var(--tcw-radius-xs);
2356
+ background: var(--tcw-text);
2357
+ box-shadow: 0 0 0 var(--tcw-space-1) var(--tcw-bg-elevated);
2270
2358
  }
2271
2359
 
2272
- .tcw-replay-progress {
2360
+ /* --- Pace: speed and step, each a labelled field --- */
2361
+ .tcw-replay-chip {
2362
+ display: inline-flex;
2363
+ align-items: center;
2364
+ gap: var(--tcw-space-3);
2365
+ flex: none;
2366
+ }
2367
+ .tcw-replay-chip-label {
2273
2368
  font-size: var(--tcw-font-size-xs);
2274
- font-family: var(--tcw-font-mono);
2369
+ text-transform: var(--tcw-label-case);
2370
+ letter-spacing: var(--tcw-label-tracking);
2275
2371
  color: var(--tcw-text-muted);
2276
- min-width: 64px;
2277
- text-align: center;
2372
+ white-space: nowrap;
2278
2373
  }
2279
-
2280
- .tcw-replay-speed {
2281
- padding: 4px 8px;
2282
- font-size: var(--tcw-font-size-xs);
2374
+ .tcw-root .tcw-replay-chip select.tcw-replay-speed {
2375
+ block-size: var(--tcw-replay-btn);
2376
+ padding-block: 0;
2377
+ padding-inline-start: var(--tcw-space-4);
2283
2378
  font-family: var(--tcw-font-mono);
2379
+ font-size: var(--tcw-font-size-sm);
2284
2380
  font-variant-numeric: tabular-nums;
2285
- background: var(--tcw-bg-surface);
2286
- border: 1px solid var(--tcw-border);
2381
+ }
2382
+
2383
+ /* --- The ways out, and picking --- */
2384
+ .tcw-replay-text-btn {
2385
+ flex: none;
2386
+ display: inline-flex;
2387
+ align-items: center;
2388
+ gap: var(--tcw-space-3);
2389
+ block-size: var(--tcw-replay-btn);
2390
+ padding-inline: var(--tcw-space-4);
2391
+ border: 0;
2287
2392
  border-radius: var(--tcw-control-radius);
2393
+ background: transparent;
2288
2394
  color: var(--tcw-text-dim);
2395
+ font: inherit;
2396
+ font-weight: var(--tcw-weight);
2397
+ white-space: nowrap;
2289
2398
  cursor: pointer;
2399
+ transition: background-color var(--tcw-dur-fast) var(--tcw-ease), color var(--tcw-dur-fast) var(--tcw-ease), transform var(--tcw-dur-fast) var(--tcw-ease);
2290
2400
  }
2401
+ .tcw-replay-text-btn:hover { background: var(--tcw-hover-bg); color: var(--tcw-text); }
2402
+ .tcw-replay-text-btn:active { background: var(--tcw-active-bg); transform: scale(0.97); }
2403
+ .tcw-replay-text-btn:focus-visible { outline: none; box-shadow: var(--tcw-ring); }
2404
+ /* Random bar: outlined, the one thing to press while picking. */
2405
+ .tcw-replay-text-btn.tcw-replay-ghost { border: var(--tcw-border-w) solid var(--tcw-border-strong); color: var(--tcw-text); }
2406
+ /* The close glyph is the phone's: on wider bars the words say it. */
2407
+ .tcw-replay-close-icon { display: none; }
2408
+ /* At the last bar, the way back to now is the next thing to do. */
2409
+ .tcw-replay-bar--ended .tcw-replay-realtime { background: var(--tcw-accent); color: var(--tcw-accent-ink); }
2410
+ .tcw-replay-bar--ended .tcw-replay-realtime:hover { background: var(--tcw-accent-hover); color: var(--tcw-accent-ink); }
2291
2411
 
2292
- .tcw-replay-speed:hover {
2293
- border-color: var(--tcw-border-strong);
2412
+ .tcw-replay-hint {
2413
+ display: inline-flex;
2414
+ align-items: center;
2415
+ gap: var(--tcw-space-3);
2416
+ padding-inline: var(--tcw-space-3);
2417
+ color: var(--tcw-text-dim);
2418
+ white-space: nowrap;
2294
2419
  }
2420
+ .tcw-replay-hint > svg { flex: none; width: var(--tcw-icon); height: var(--tcw-icon); color: var(--tcw-accent); }
2295
2421
 
2296
- @media (max-width: 640px) {
2297
- .tcw-replay-scrubber {
2298
- width: 140px;
2299
- }
2300
- .tcw-replay-progress {
2301
- display: none;
2302
- }
2422
+ /* --- Narrower: the fields lose their captions (they stay their names) --- */
2423
+ .tcw-replay-bar:is([data-fit='compact'], [data-fit='stack']) .tcw-replay-chip-label {
2424
+ position: absolute;
2425
+ width: 1px;
2426
+ height: 1px;
2427
+ overflow: hidden;
2428
+ clip-path: inset(50%);
2429
+ white-space: nowrap;
2430
+ }
2431
+
2432
+ /* --- A phone, or a narrow chart: two rows across the plot, where the replay is on top --- */
2433
+ .tcw-replay-bar[data-fit='stack'] {
2434
+ /* Touch targets: 40 px (44 for Play) at least, as the toolbar's on a phone. */
2435
+ --tcw-replay-btn: max(40px, var(--tcw-control-h));
2436
+ --tcw-replay-play: max(44px, calc(var(--tcw-control-h) + 2 * var(--tcw-space-2)));
2437
+ inset-inline: var(--tcw-space-4);
2438
+ width: auto;
2439
+ max-width: none;
2440
+ margin-inline: 0;
2441
+ flex-wrap: wrap;
2442
+ gap: var(--tcw-space-2);
2443
+ }
2444
+ .tcw-replay-bar[data-fit='stack'] .tcw-replay-sep { display: none; }
2445
+ .tcw-replay-bar[data-fit='stack'] .tcw-replay-timeline {
2446
+ order: -2;
2447
+ /* The first row, beside the close button; the rest wraps below. */
2448
+ flex: 1 1 calc(100% - var(--tcw-replay-btn) - 2 * var(--tcw-space-2));
2449
+ box-sizing: border-box;
2450
+ padding-inline-start: var(--tcw-space-3);
2451
+ }
2452
+ .tcw-replay-bar[data-fit='stack'] input[type='range'].tcw-replay-scrubber { block-size: var(--tcw-menu-item-h); min-inline-size: 0; }
2453
+ /* Back to realtime closes the bar from the first row, a glyph touch users know. */
2454
+ .tcw-replay-bar[data-fit='stack'] .tcw-replay-exits { display: contents; }
2455
+ .tcw-replay-bar[data-fit='stack'] .tcw-replay-realtime { order: -1; inline-size: var(--tcw-replay-btn); padding: 0; justify-content: center; }
2456
+ .tcw-replay-bar[data-fit='stack'] .tcw-replay-realtime .tcw-replay-text { display: none; }
2457
+ .tcw-replay-bar[data-fit='stack'] .tcw-replay-close-icon { display: inline-flex; }
2458
+ .tcw-replay-bar[data-fit='stack'] .tcw-replay-transport { flex: 1 0 auto; }
2459
+ .tcw-replay-bar[data-fit='stack'] .tcw-replay-hint { white-space: normal; flex: 1 0 100%; padding-block: var(--tcw-space-2); }
2460
+ .tcw-replay-bar[data-fit='stack'] .tcw-replay-picking { display: contents; }
2461
+
2462
+ /* While the bar holds the plot's foot, what lives there makes room: the toasts and the phone's drawing button. */
2463
+ .tcw-root[data-tcw-replay] > .tcw-toast:not(.tcw-toast-over) {
2464
+ bottom: calc(var(--tcw-replay-lift, 0px) + var(--tcw-space-4));
2465
+ }
2466
+ .tcw-root[data-tcw-narrow][data-tcw-replay] > .tcw-body > .tcw-sidebar-fab {
2467
+ bottom: calc(var(--tcw-replay-lift, 0px) + var(--tcw-space-4));
2468
+ }
2469
+
2470
+ @media (forced-colors: active) {
2471
+ .tcw-replay-bar { border: 1px solid CanvasText; }
2472
+ .tcw-replay-btn.tcw-replay-play { border: 1px solid ButtonText; }
2473
+ .tcw-root input[type='range'].tcw-replay-scrubber::-webkit-slider-runnable-track { background: GrayText; }
2474
+ .tcw-root input[type='range'].tcw-replay-scrubber::-webkit-slider-thumb { background: Highlight; }
2475
+ }
2476
+
2477
+ @media (prefers-reduced-motion: reduce) {
2478
+ .tcw-replay-bar { animation: none; }
2479
+ .tcw-replay-btn,
2480
+ .tcw-replay-text-btn,
2481
+ .tcw-root input[type='range'].tcw-replay-scrubber::-webkit-slider-thumb { transition: none; }
2303
2482
  }
2304
2483
 
2305
2484
  /* === Responsive === */
@@ -2333,14 +2512,6 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=requi
2333
2512
  width: 94vw;
2334
2513
  border-radius: var(--tcw-dialog-radius);
2335
2514
  }
2336
-
2337
- /* Replay scrubber compact mode */
2338
- .tcw-replay-scrubber {
2339
- width: 120px;
2340
- }
2341
- .tcw-replay-progress {
2342
- display: none;
2343
- }
2344
2515
  }
2345
2516
 
2346
2517
  /* === Mobile bottom-sheet pattern ===
@@ -2721,7 +2892,7 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=requi
2721
2892
  text-overflow: ellipsis;
2722
2893
  }
2723
2894
  /* The replay bar has the chart's foot while it shows: the bracket's goes to the top. */
2724
- .tcw-chart-container:has(> .tcw-replay-bar) > .tcw-bracket-bar {
2895
+ .tcw-root[data-tcw-replay] .tcw-bracket-bar {
2725
2896
  top: var(--tcw-space-4);
2726
2897
  bottom: auto;
2727
2898
  }
@@ -3139,6 +3310,26 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=requi
3139
3310
  text-overflow: ellipsis;
3140
3311
  white-space: nowrap;
3141
3312
  }
3313
+ /* A compare: its colour and symbol, then how it is compared, taking the room left before its button. */
3314
+ .tcw-tree-compare {
3315
+ justify-content: flex-start;
3316
+ }
3317
+ .tcw-tree-compare .tcw-tree-name {
3318
+ flex: 0 1 auto;
3319
+ }
3320
+ .tcw-tree-compare .tcw-tree-del {
3321
+ flex: none;
3322
+ margin-inline-start: auto;
3323
+ }
3324
+ .tcw-tree-way {
3325
+ flex: 1 1 0;
3326
+ min-width: 0;
3327
+ overflow: hidden;
3328
+ color: var(--tcw-text-dim);
3329
+ font-size: var(--tcw-font-size-xs);
3330
+ text-overflow: ellipsis;
3331
+ white-space: nowrap;
3332
+ }
3142
3333
  .tcw-tree-actions {
3143
3334
  display: flex;
3144
3335
  align-items: center;
@@ -4613,7 +4804,7 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=requi
4613
4804
  min-height: 44px;
4614
4805
  }
4615
4806
  }
4616
- `,Oe=`/* === Base controls: fields, selects, checks, sliders, calendar, scrollbars ===
4807
+ `,Me=`/* === Base controls: fields, selects, checks, sliders, calendar, scrollbars ===
4617
4808
  *
4618
4809
  * One look for every form control in the widget, from tokens. Fields are
4619
4810
  * quiet until used: a faint fill and hairline, a firmer line on hover, and
@@ -4734,9 +4925,11 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=requi
4734
4925
  .tcw-indi-input,
4735
4926
  .tcw-watchlist-input,
4736
4927
  .tcw-goto-input,
4737
- .tcw-alerts-form input
4738
- ):is([aria-invalid='true'], [aria-invalid='']):is(*, :hover, :focus) {
4739
- /* As specific as the hover rule and later, so a wrong value stays red under the pointer and in focus. */
4928
+ .tcw-alerts-form input:not([type='checkbox']),
4929
+ .tcw-settings-number
4930
+ ):is([aria-invalid='true']):is(*, :hover, :focus) {
4931
+ /* As specific as the hover rule (its list holds the same :not) and later, so a wrong value stays red
4932
+ under the pointer and in focus. */
4740
4933
  border-color: var(--tcw-red);
4741
4934
  box-shadow: none;
4742
4935
  }
@@ -4769,6 +4962,14 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=requi
4769
4962
  background-position: left 8px center;
4770
4963
  }
4771
4964
 
4965
+ /* A select laid out left to right inside a right-to-left widget (the chart's
4966
+ * own area is LTR, the replay's figures too) keeps its chevron on the right,
4967
+ * where its padding is. */
4968
+ .tcw-root[dir='rtl'] [dir='ltr'] select:not([multiple]):not([size]),
4969
+ .tcw-root[dir='rtl'] select[dir='ltr']:not([multiple]):not([size]) {
4970
+ background-position: right 8px center;
4971
+ }
4972
+
4772
4973
  /* Number fields: the steppers show only on a field in use. */
4773
4974
  .tcw-root input[type='number']::-webkit-inner-spin-button,
4774
4975
  .tcw-root input[type='number']::-webkit-outer-spin-button {
@@ -5277,7 +5478,7 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=requi
5277
5478
  .tcw-stepper-btn:focus-visible { outline: 2px solid Highlight; outline-offset: -2px; }
5278
5479
  .tcw-stepper:focus-within { outline: 2px solid Highlight; }
5279
5480
  }
5280
- `,ke=`/* === The indicators dialog === */
5481
+ `,Ne=`/* === The indicators dialog === */
5281
5482
 
5282
5483
  /* 610 wide, a Fibonacci number: the groups take 233 and the list 377 beside them (377 : 233 = phi).
5283
5484
  A fixed height, so the dialog keeps still while a search shortens the list. */
@@ -7010,7 +7211,7 @@ img.tcw-ss-badge {
7010
7211
  .tcw-ticket-side-btn:focus-visible,
7011
7212
  .tcw-ticket-place:focus-visible { outline: 2px solid Highlight; outline-offset: 2px; }
7012
7213
  }
7013
- `,Ae=`/* === The dock: the panels by the chart, and their rail === */
7214
+ `,Pe=`/* === The dock: the panels by the chart, and their rail === */
7014
7215
 
7015
7216
  /* In the body's row after the chart: the panel of the page open beside the chart, the rail at the outer edge
7016
7217
  (both mirror in a right-to-left widget). */
@@ -7421,27 +7622,42 @@ img.tcw-ss-badge {
7421
7622
  .tcw-ladder-cell:focus-visible { outline: 2px solid Highlight; outline-offset: -2px; }
7422
7623
  .tcw-ladder-own { border: 1px solid CanvasText; }
7423
7624
  }
7424
- `,je=`toolbar,sidebar,statusBar,dock,alerts,objectTree,symbolInfo,symbolSearch,settings,indicatorSettings,drawingSettings,dataWindow,commandPalette,hotkeySheet,goToDate,replay,screenshot,copyImage,shareView,autoFib,themeToggle,fullscreen,accountPanel,orderTicket,bracketOrders,depthLadder,layouts,indicatorTemplates,compare,indicatorLegend,navigation,customTimeframes,intervalTyping,symbolTyping,dragDropImport,hotkeys,toasts,toolbar.symbol,toolbar.symbolInfo,toolbar.timeframes,toolbar.timeframeMenu,toolbar.chartType,toolbar.indicators,toolbar.layouts,toolbar.replay,toolbar.bracketOrders,toolbar.depthLadder,toolbar.accountPanel,toolbar.objectTree,toolbar.alerts,toolbar.screenshot,toolbar.settings,toolbar.themeToggle,toolbar.fullscreen,toolbar.compare,toolbar.undo,toolbar.redo,toolbar.trade,sidebar.cursor,sidebar.favorites,sidebar.lines,sidebar.fibonacci,sidebar.patterns,sidebar.forecasting,sidebar.annotation,sidebar.style,sidebar.magnet,sidebar.eraser,sidebar.zoomArea,sidebar.stayInDrawing,sidebar.undo,sidebar.redo,sidebar.clear,sidebar.lockAll,sidebar.hideAll,dock.watchlist,dock.alerts,dock.objectTree,dock.dataWindow,dock.symbolInfo,dock.depthLadder,statusBar.range,statusBar.goToDate,statusBar.market,statusBar.connection,statusBar.symbol,statusBar.clock,statusBar.scale,statusBar.rangeTimeframe,indicatorLegend.values,indicatorLegend.visibility,indicatorLegend.settings,indicatorLegend.remove,indicatorLegend.more,pane.move,pane.collapse,pane.maximize,navigation.zoom,navigation.scroll,navigation.reset,menu.chart,menu.chart.alert,menu.chart.order,menu.chart.orderTicket,menu.chart.horizontalLine,menu.chart.resetView,menu.chart.drawings,menu.chart.exportData,menu.chart.settings,menu.chart.scale,menu.chart.goToDate,menu.chart.paneScale,menu.priceAxisAdd,menu.chart.indicators,menu.chart.timezone,menu.drawing,menu.drawing.settings,menu.drawing.alert,menu.drawing.order,menu.drawing.group,menu.drawing.lock,menu.drawing.hide,menu.drawing.duplicate,menu.drawing.delete,selectionToolbar,hotkeys.commandPalette,hotkeys.symbolSearch,hotkeys.save,hotkeys.tools,hotkeys.invertScale,hotkeys.goToDate,hotkeys.help,hotkeys.resetView`.split(`,`),Me=new Set(je),Ne={toolbar:[`toolbar`],drawingTools:[`sidebar`,`drawingSettings`,`hotkeys.tools`,`menu.chart.horizontalLine`],settings:[`settings`],statusBar:[`statusBar`,`goToDate`],rangeBar:[`statusBar.range`,`statusBar.rangeTimeframe`,`goToDate`],indicatorLegend:[`indicatorLegend`],fullscreen:[`fullscreen`],alerts:[`alerts`],objectTree:[`objectTree`],accountPanel:[`accountPanel`,`orderTicket`],indicatorTemplates:[`indicatorTemplates`],intervalTyping:[`intervalTyping`],symbolInfo:[`symbolInfo`],navigation:[`navigation`],dragDropImport:[`dragDropImport`],customTimeframes:[`customTimeframes`]},Pe={alert:[`alerts`,`menu.chart.alert`],buyLimit:[`menu.chart.order`],buyStop:[`menu.chart.order`],sellLimit:[`menu.chart.order`],sellStop:[`menu.chart.order`],orderTicket:[`orderTicket`,`menu.chart.orderTicket`],horizontalLine:[`menu.chart.horizontalLine`],resetView:[`menu.chart.resetView`],paste:[`menu.chart.drawings`],hideDrawings:[`menu.chart.drawings`],showDrawings:[`menu.chart.drawings`],removeDrawings:[`menu.chart.drawings`],removeIndicators:[`menu.chart.indicators`],settings:[`settings`,`menu.chart.settings`],exportData:[`menu.chart.exportData`],resetPriceScale:[`menu.chart.scale`],autoScale:[`menu.chart.scale`],invertScale:[`menu.chart.scale`],leftScale:[`menu.chart.scale`],regularScale:[`menu.chart.scale`],logScale:[`menu.chart.scale`],percentScale:[`menu.chart.scale`],indexedScale:[`menu.chart.scale`],labels:[`menu.chart.scale`],indicatorValueLabels:[`menu.chart.scale`],barCountdown:[`menu.chart.scale`],lines:[`menu.chart.scale`],highLowLines:[`menu.chart.scale`],lastPriceLine:[`menu.chart.scale`],goToDate:[`goToDate`,`menu.chart.goToDate`],timezone:[`menu.chart.timezone`],paneLog:[`menu.chart.paneScale`],paneInvert:[`menu.chart.paneScale`],panePercent:[`menu.chart.paneScale`]},Fe={settings:[`drawingSettings`,`menu.drawing.settings`],alert:[`alerts`,`menu.drawing.alert`],front:[`menu.drawing.order`],forward:[`menu.drawing.order`],backward:[`menu.drawing.order`],back:[`menu.drawing.order`],group:[`menu.drawing.group`],ungroup:[`menu.drawing.group`],lock:[`menu.drawing.lock`],unlock:[`menu.drawing.lock`],hide:[`menu.drawing.hide`],duplicate:[`menu.drawing.duplicate`],delete:[`menu.drawing.delete`]},Ie={symbolSearch:`symbolSearch`,compare:`compare`,goToDate:`goToDate`,saveLayout:`layouts`,alerts:`alerts`,objectTree:`objectTree`,hotkeys:`hotkeySheet`,screenshot:`screenshot`,copyImage:`copyImage`,toggleTheme:`themeToggle`,settings:`settings`,shareView:`shareView`,autoFib:`autoFib`,dataWindow:`dataWindow`,symbolInfo:`symbolInfo`};function Le(e){if(typeof e!=`object`||!e||Array.isArray(e))return{};let t={},n=[];for(let[r,i]of Object.entries(e))Me.has(r)&&typeof i==`boolean`?t[r]=i:n.push(r);return n.length>0&&console.warn(`[ChartWidget] Unknown or non-boolean feature switches left out: ${n.join(`, `)}.`),t}function Re(e){let t=Object.fromEntries(je.map(e=>[e,!0]));for(let[n,r]of Object.entries(Ne))if(e[n]===!1)for(let e of r)t[e]=!1;return{...t,...Le(e.features)}}function ze(e){return je.filter(t=>!e[t]).join(` `)}var Be=`tcw-divider-off`,Ve=[{names:[`navigation.zoom`,`navigation.scroll`,`navigation.reset`],selector:`.tcw-nav`},{names:[`pane.move`,`pane.collapse`,`pane.maximize`],selector:`.tcw-pane-controls`},{names:[`indicatorLegend.visibility`,`indicatorLegend.settings`,`indicatorLegend.more`,`indicatorLegend.remove`],selector:`.tcw-ind-legend-actions`}];function He(){return[...je.map(e=>`.tcw-root[data-tcw-off~="${e}"] [data-tcw-part~="${e}"]{display:none!important}`),...Ve.map(({names:e,selector:t})=>`.tcw-root${e.map(e=>`[data-tcw-off~="${e}"]`).join(``)} ${t}{display:none!important}`),`.${Be}{display:none!important}`].join(`
7425
- `)}function E(e,...t){e.dataset.tcwPart=t.join(` `)}function Ue(...e){return`data-tcw-part="${e.join(` `)}"`}function We(e){return Object.prototype.hasOwnProperty.call(Ie,e)?Ie[e]:void 0}function Ge(e,t,n){let r=[...e.children],i=e=>e.classList.contains(t);for(let e of r)i(e)&&e.classList.remove(Be);let a=e=>!e.hidden&&getComputedStyle(e).display!==`none`,o=e=>a(e)&&(e instanceof HTMLButtonElement||e.childElementCount>0||e.textContent!==``),s=!1,c=null;for(let e of r)if(n!==void 0&&e.classList.contains(n))c?.classList.add(Be),c=null,s=!1;else if(i(e)){if(!a(e))continue;s?(c=e,s=!1):e.classList.add(Be)}else o(e)&&(s=!0,c=null);c?.classList.add(Be)}function Ke(e,t,n){let r=e.flatMap(e=>{if(e===`separator`)return[e];if(!(t[e.id]??[]).every(e=>n[e]))return[];if(!e.submenu)return[e];let r=Ke(e.submenu,t,n);return r.length>0?[{...e,submenu:r}]:[]});return r.filter((e,t)=>{if(e!==`separator`)return!0;let n=r.slice(0,t).some(e=>e!==`separator`),i=r[t+1];return n&&i!==void 0&&i!==`separator`})}var qe=0,Je=`tcw-styles`;function Ye(){if(qe++,qe>1||document.getElementById(Je))return;let e=document.createElement(`style`);e.id=Je,e.textContent=`${De}
7426
- ${Oe}
7427
- ${ke}
7428
- ${Ae}
7429
- ${He()}`,document.head.insertBefore(e,document.head.firstChild)}function Xe(){if(qe--,qe>0)return;let e=document.getElementById(Je);e&&e.remove()}var Ze=(e,t)=>Object.prototype.hasOwnProperty.call(e,t)?e[t]:void 0;function D(e,t=14){let r=Ze(n.UI_ICONS,e);return r?(0,n.iconSvg)(r,t):``}function Qe(e,t=16){return(0,n.iconSvg)(Ze(n.DRAWING_TOOL_ICONS,e)??n.UI_ICONS.penLine,t)}function $e(e,t=14){return(0,n.iconSvg)(Ze(n.CHART_TYPE_ICONS,e)??n.UI_ICONS.barChart,t)}function O(e){return e.replace(/[&<>"']/g,e=>({"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&#39;`})[e])}var et=class{trigger;panel;_isOpen=!1;onOutsideClick;onEscapeKey;onTriggerClick;layer;align;onAway=()=>this.close();onScroll=e=>{e.target instanceof Node&&this.panel.contains(e.target)||this.close()};constructor(e,t={}){this.trigger=e,this.layer=t.layer??null,this.align=t.align??`left`,this.panel=document.createElement(`div`),this.panel.className=`tcw-dropdown`,this.panel.style.minWidth=t.width??`200px`,this.panel.style.display=`none`,this.layer?(this.layer().appendChild(this.panel),this.panel.addEventListener(`click`,()=>this.close())):(this.align===`right`?this.panel.style.insetInlineEnd=`0px`:this.panel.style.insetInlineStart=`0px`,e.style.position=`relative`,e.appendChild(this.panel)),this.onTriggerClick=()=>{this._isOpen?this.close():this.open()},this.onOutsideClick=e=>{let t=e.target;!this.trigger.contains(t)&&!this.panel.contains(t)&&this.close()},this.onEscapeKey=e=>{e.key===`Escape`&&this.close()},e.addEventListener(`click`,this.onTriggerClick)}setContent(e){this.panel.innerHTML=e}open(){if(!this._isOpen){if(this._isOpen=!0,this.layer){let e=this.layer();this.panel.parentElement!==e&&e.appendChild(this.panel)}this.panel.style.display=``,this.layer&&(this.place(),window.addEventListener(`resize`,this.onAway),document.addEventListener(`scroll`,this.onScroll,{capture:!0,passive:!0})),document.addEventListener(`pointerdown`,this.onOutsideClick),document.addEventListener(`keydown`,this.onEscapeKey)}}close(){this._isOpen&&(this._isOpen=!1,this.panel.style.display=`none`,document.removeEventListener(`pointerdown`,this.onOutsideClick),document.removeEventListener(`keydown`,this.onEscapeKey),window.removeEventListener(`resize`,this.onAway),document.removeEventListener(`scroll`,this.onScroll,{capture:!0}))}isOpen(){return this._isOpen}destroy(){this.close(),this.trigger.removeEventListener(`click`,this.onTriggerClick),this.panel.remove()}place(){p(this.panel,this.trigger,this.align)}},tt=4,nt=2,rt=150,it=`[role=menuitem], [role=menuitemcheckbox], [role=menuitemradio]`,at=`(max-width: 640px)`,ot=`tcw:back`,st=new Set;function ct(e,t,n,r=e,i=!1){let a=i?r-t>=0?r-t:e:e+t>n?r-t:e;return Math.max(0,Math.min(a,n-t))}function lt(e){return e.radio?`menuitemradio`:e.checked===void 0?`menuitem`:`menuitemcheckbox`}function ut(e){let t=`<span class="tcw-context-icon"></span>`;return e.radio?e.checked?`<span class="tcw-context-icon tcw-context-dot"></span>`:t:e.checked?D(`check`,14):e.icon&&D(e.icon,14)||t}var k=class e{el;onPick=null;onRemove=null;returnFocus=null;anchor=null;child=null;parent=null;hoverTimer=null;hoverItem=null;onDocPointer=e=>{let t=e.target;this.holds(t)||this.anchor?.contains(t)||this.close()};onWheel=e=>{this.holds(e.target)||this.close()};onAway=()=>this.close();constructor(e,t,n=``){this.host=e,this.backLabel=n,this.el=document.createElement(`div`),this.el.className=`tcw-context-menu`,this.el.setAttribute(`role`,`menu`),this.el.setAttribute(`aria-label`,t),this.el.hidden=!0,this.el.addEventListener(`keydown`,e=>this.onKeyDown(e)),e.appendChild(this.el)}open(e,t,n,r,i,a,o=t,s=!1){this.show(e,{x:t,y:n,xBack:o,yBack:n,before:s},r,i,a,!0)}openUnder(e,t,n,r=`start`,i=nt){let a=t.getBoundingClientRect(),o=this.host.getBoundingClientRect(),s=r===`end`!==this.rtl();this.open(e,a.left-o.left,a.bottom-o.top+i,n,t,void 0,a.right-o.left,s)}static closeAnchoredTo(e){let t=[...st].filter(t=>t.anchor===e);for(let e of t)e.close();return t.length>0}static focusedAnchor(){return[...st].find(e=>e.anchor!==null&&e.hasFocus())?.anchor??null}close(){if(this.clearHover(),this.child?.close(),this.el.hidden)return;st.delete(this);let e=!this.parent||this.el.contains(document.activeElement);this.el.hidden=!0,this.onPick=null,this.onRemove=null,this.anchor?.setAttribute(`aria-expanded`,`false`),this.anchor=null,document.removeEventListener(`pointerdown`,this.onDocPointer,!0),document.removeEventListener(`wheel`,this.onWheel,{capture:!0}),window.removeEventListener(`resize`,this.onAway),window.removeEventListener(`blur`,this.onAway),e&&this.returnFocus?.isConnected&&this.returnFocus.focus({preventScroll:!0}),this.returnFocus=null}isOpen(){return!this.el.hidden}hasFocus(){return document.activeElement!==null&&this.holds(document.activeElement)}destroy(){this.close(),this.child?.destroy(),this.el.remove()}show(e,t,n,r,i,a){this.clearHover(),this.child?.close(),this.returnFocus=document.activeElement instanceof HTMLElement?document.activeElement:null,this.onPick=n,this.onRemove=i??null,this.anchor=r??null,this.anchor?.setAttribute(`aria-expanded`,`true`),this.el.replaceChildren(...e.map(e=>this.entry(e))),this.el.hidden=!1,st.add(this);let o=this.host.getBoundingClientRect(),s=Math.min(this.host.clientWidth,window.innerWidth-o.left)-tt,c=Math.min(this.host.clientHeight,window.innerHeight-o.top)-tt;this.el.style.maxHeight=`${Math.max(0,c-this.frameHeight())}px`,this.el.style.left=`${ct(t.x,this.el.offsetWidth,s,t.xBack,t.before)}px`,this.el.style.top=`${ct(t.y,this.el.offsetHeight,c,t.yBack)}px`,document.addEventListener(`pointerdown`,this.onDocPointer,!0),document.addEventListener(`wheel`,this.onWheel,{capture:!0,passive:!0}),window.addEventListener(`resize`,this.onAway),window.addEventListener(`blur`,this.onAway);let l=this.revealChoice();a&&(l??this.items()[0])?.focus({preventScroll:!0})}frameHeight(){let e=getComputedStyle(this.el);if(e.boxSizing===`border-box`)return 0;let t=e=>parseFloat(e)||0;return t(e.paddingTop)+t(e.paddingBottom)+t(e.borderTopWidth)+t(e.borderBottomWidth)}revealChoice(){let e=this.el.querySelector(`[role=menuitemradio][aria-checked=true]`);return!e||e.offsetTop+e.offsetHeight<=this.el.clientHeight?null:(this.el.scrollTop=e.offsetTop-(this.el.clientHeight-e.offsetHeight)/2,e)}rtl(){return this.host.closest(`[dir]`)?.getAttribute(`dir`)===`rtl`}holds(e){return this.el.contains(e)||(this.child?.holds(e)??!1)}entry(e){if(e===`separator`){let e=document.createElement(`div`);return e.className=`tcw-context-sep`,e.setAttribute(`role`,`separator`),e}let t=document.createElement(`button`);t.type=`button`,t.className=`tcw-context-item${e.danger?` tcw-context-danger`:``}`,t.setAttribute(`role`,lt(e)),(e.radio||e.checked!==void 0)&&t.setAttribute(`aria-checked`,String(e.checked??!1)),t.tabIndex=-1,t.dataset.id=e.id,t.innerHTML=ut(e);let n=document.createElement(`span`);n.className=`tcw-context-label`,n.textContent=e.label,t.appendChild(n),this.appendEnd(t,e);let r=e.submenu;return t.addEventListener(`pointermove`,n=>{n.pointerType!==`touch`&&this.hover(t,e.label,r)}),t.addEventListener(`click`,()=>{r?this.openSubmenu(t,e.label,r,!0):this.pick(e.id)}),e.remove?this.removableRow(t,e.remove):t}appendEnd(e,t){if(t.shortcut){e.setAttribute(`aria-keyshortcuts`,t.shortcut);let n=document.createElement(`kbd`);n.className=`tcw-context-key`,n.setAttribute(`aria-hidden`,`true`),n.textContent=t.shortcut,e.appendChild(n)}t.submenu&&(e.setAttribute(`aria-haspopup`,`menu`),e.setAttribute(`aria-expanded`,`false`),e.insertAdjacentHTML(`beforeend`,D(`chevronRight`,12)),e.lastElementChild?.classList.add(`tcw-context-more`))}removableRow(e,t){e.setAttribute(`aria-keyshortcuts`,`Delete`);let n=document.createElement(`button`);n.type=`button`,n.className=`tcw-context-remove`,n.tabIndex=-1,n.setAttribute(`aria-hidden`,`true`),n.title=t,n.innerHTML=D(`x`,12),n.addEventListener(`click`,()=>this.remove(e));let r=document.createElement(`div`);return r.className=`tcw-context-row`,r.setAttribute(`role`,`none`),r.append(e,n),r}openSubmenu(e,t,n,r){this.clearHover();let i=this.child??this.makeChild();if(i.isOpen()&&i.anchor===e){r&&i.items()[0]?.focus({preventScroll:!0});return}i.close(),i.el.setAttribute(`aria-label`,t);let a=this.host.getBoundingClientRect(),o=e.getBoundingClientRect(),s={x:o.right-a.left,y:o.top-a.top,xBack:o.left-a.left,yBack:o.bottom-a.top,before:this.rtl()},c=window.matchMedia?.(at).matches??!1,l=c?[{id:ot,label:t,icon:`chevronLeft`},`separator`,...n]:n;i.show(l,s,e=>{e!==ot&&this.pick(e)},e,e=>this.onRemove?.(e),r);let u=c?i.el.querySelector(`[data-id="${ot}"]`):null;u?.classList.add(`tcw-context-back`),u&&this.backLabel&&u.setAttribute(`aria-label`,`${this.backLabel}: ${t}`),i.returnFocus=e}makeChild(){let t=new e(this.host,``,this.backLabel);return t.parent=this,t.el.addEventListener(`pointerenter`,()=>this.clearHover()),this.child=t,t}hover(e,t,n){if(this.hoverTimer!==null&&this.hoverItem===e)return;this.clearHover();let r=this.child?.isOpen()?this.child.anchor:null;(n?r===e:r===null)||(this.hoverItem=e,this.hoverTimer=setTimeout(()=>{this.hoverTimer=null,this.hoverItem=null,n?this.openSubmenu(e,t,n,!1):this.child?.close()},rt))}clearHover(){this.hoverItem=null,this.hoverTimer!==null&&(clearTimeout(this.hoverTimer),this.hoverTimer=null)}remove(e){let t=e.dataset.id,n=e.closest(`.tcw-context-row`);if(!t||!n)return;let r=this.items().indexOf(e);this.onRemove?.(t),n.remove();let i=[...this.el.children].filter((e,t,n)=>e.classList.contains(`tcw-context-sep`)&&(t===0||t===n.length-1||n[t-1].classList.contains(`tcw-context-sep`)));for(let e of i)e.remove();let a=this.items();if(a.length===0){this.close();return}a[Math.min(r,a.length-1)].focus({preventScroll:!0})}pick(e){let t=this.onPick;this.close(),t?.(e)}items(){return[...this.el.querySelectorAll(it)]}onKeyDown(e){let t=this.items(),n=t.indexOf(document.activeElement),[r,i]=this.rtl()?[`ArrowLeft`,`ArrowRight`]:[`ArrowRight`,`ArrowLeft`],a=-1;if(e.key===`ArrowDown`)a=(n+1)%t.length;else if(e.key===`ArrowUp`)a=(n-1+t.length)%t.length;else if(e.key===`Home`)a=0;else if(e.key===`End`)a=t.length-1;else if(e.key===r&&t[n]?.hasAttribute(`aria-haspopup`)){e.preventDefault(),t[n].click();return}else if(e.key===i&&this.parent){e.preventDefault(),this.close();return}else if(e.key===`Delete`&&n>=0){e.preventDefault(),this.remove(t[n]);return}else if(e.key===`Escape`||e.key===`Tab`){e.preventDefault(),e.stopPropagation();let t=this;for(;e.key===`Tab`&&t.parent;)t=t.parent;t.close();return}else return;e.preventDefault(),this.child?.close(),t[a]?.focus({preventScroll:!0})}},dt=[`en-US`,`en-GB`,`en-IN`,`de-DE`,`fr-FR`,`es-ES`,`it-IT`,`pt-BR`,`ru-RU`,`tr-TR`,`vi-VN`,`id-ID`,`th-TH`,`zh-CN`,`zh-TW`,`ja-JP`,`ko-KR`],ft=65234;function pt(e){return(e&&!dt.includes(e)?[e,...dt]:dt).map(e=>{let t;try{t=new Intl.NumberFormat(e,{minimumFractionDigits:2,maximumFractionDigits:2}).format(ft)}catch{t=``}return{value:e,label:t?`${e} (${t})`:e}})}var mt={Lines:`toolGroup.lines`,"Horizontal/Vertical":`toolGroup.horizontalVertical`,Channels:`toolGroup.channels`,Fibonacci:`toolGroup.fibonacci`,Shapes:`toolGroup.shapes`,"Gann & Pitchforks":`toolGroup.gannPitchforks`,Patterns:`toolGroup.patterns`,Measure:`toolGroup.measure`,Annotation:`toolGroup.annotation`,Forecasting:`toolGroup.forecasting`,Brushes:`toolGroup.brushes`,Cycles:`toolGroup.cycles`,"Elliott Waves":`toolGroup.elliott`};function ht(e,t){let n=`chartType.${e.value}`,r=t(n);return r===n?e.label:r}function gt(e,t){return e.map(e=>({...e,label:mt[e.label]?t(mt[e.label]):e.label,tools:e.tools.map(e=>{let n=`tool.${e.value}`,r=t(n);return{...e,label:r===n?e.label:r}})}))}var _t=[`1m`,`3m`,`5m`,`15m`,`30m`,`1h`,`2h`,`4h`,`1d`,`1w`,`1M`],vt=[`1m`,`5m`,`15m`,`1h`,`4h`,`1d`],yt=6;function bt(e){let t=e.slice(-1);return t===`h`||t===`d`||t===`w`?e.slice(0,-1)+t.toUpperCase():e}var xt=e=>Number.isFinite((0,n.timeframeToMs)(e))||(0,n.tickBarCount)(e)!==null,St=(e,t)=>{let r=(0,n.tickBarCount)(e),i=(0,n.tickBarCount)(t);return r!==null||i!==null?r===null?1:i===null?-1:r-i:(0,n.timeframeToMs)(e)-(0,n.timeframeToMs)(t)};function Ct(e,t){let n=t?.length?t:null,r=e?.length?e:n??_t;return[...new Set(r)].filter(e=>xt(e)&&(!n||n.includes(e))).sort(St)}function wt(e,t,n=!1){if(t?.length)return e.filter(e=>t.includes(e));if(n)return[...e];let r=e.filter(e=>vt.includes(e));return r.length>0?r:e.slice(0,yt)}var Tt=9999,Et={"":`m`,s:`s`,S:`s`,m:`m`,h:`h`,H:`h`,d:`d`,D:`d`,w:`w`,W:`w`,M:`M`},Dt={s:[`m`,60],m:[`h`,60],h:[`d`,24]};function Ot(e){let t=/^(\d+)([a-zA-Z]?)$/.exec(e.trim());if(!t)return null;if(t[2]===`T`||t[2]===`t`){let e=`${Number(t[1])}T`;return Number(t[1])<=Tt&&(0,n.tickBarCount)(e)!==null?e:null}let r=Number(t[1]),i=Et[t[2]];if(!i||!Number.isSafeInteger(r)||r<1)return null;for(let e=Dt[i];e&&r%e[1]===0;e=Dt[i])r/=e[1],i=e[0];if(r>Tt)return null;let a=`${r}${i}`;return(0,n.isTimeFrame)(a)?a:null}function kt(e,t,n){let r=n?.length?n:null,i=t.filter(e=>xt(e)&&(!r||r.includes(e)));return[...new Set([...e,...i])].sort(St)}var At=[`T`,`s`,`m`,`h`,`d`,`w`,`M`];function jt(e){let t=e=>{let t=e.slice(-1);return At.includes(t)?t:`m`};return At.map(n=>({unit:n,timeframes:e.filter(e=>t(e.value)===n)})).filter(e=>e.timeframes.length>0)}var Mt=864e5,Nt=5/7;function Pt(e){let t=(0,n.timeframeToMs)(e.current),r=(0,n.timeframeToMs)(e.chosen);if(!Number.isFinite(t)||!Number.isFinite(r)||!(e.width>0)||!(e.spanMs>0))return e.current;let i=n=>{if(n===t)return e.barsInSpan;if(n<Mt)return e.barsInSpan*t/n;let r=e.spanMs/n;return n===Mt?r*(e.dayShare??Nt):r},a=[...new Set([...e.available,e.current])].filter(e=>{let t=(0,n.timeframeToMs)(e);return Number.isFinite(t)&&t>=r}).sort(St);for(let t of a)if(i((0,n.timeframeToMs)(t))*2<=e.width)return t;return a[a.length-1]??e.current}var Ft={ticket:`receipt`,long:`trendingUp`,short:`trendingDown`,ladder:`ladder`,account:`layers`},It=[`ladder`,`account`];function Lt(e,t){let n=[];e.onOrderTicket&&n.push({id:`ticket`,label:t(`chartMenu.orderTicket`),parts:[`orderTicket`],run:e.onOrderTicket});let r=e.onBracket;return r&&(n.push({id:`long`,label:t(`toolbar.longBracket`),parts:[`bracketOrders`,`toolbar.bracketOrders`],run:()=>r(`buy`)}),n.push({id:`short`,label:t(`toolbar.shortBracket`),parts:[`bracketOrders`,`toolbar.bracketOrders`],run:()=>r(`sell`)})),e.onToggleLadder&&n.push({id:`ladder`,label:t(`toolbar.depthLadder`),parts:[`depthLadder`,`toolbar.depthLadder`],run:e.onToggleLadder}),e.onToggleAccount&&n.push({id:`account`,label:t(`toolbar.account`),parts:[`accountPanel`,`toolbar.accountPanel`],run:e.onToggleAccount}),n}var Rt=class e{button;menu=null;open=new Set;static create(t,n,r,i){let a=Lt(t,n);return a.length>0?new e(a,n,r,i):null}constructor(e,t,n,r){this.items=e,this.t=t,this.root=n;let i=document.createElement(`button`);i.type=`button`,i.className=`tcw-dropdown-trigger tcw-toolbar-overflow`,i.dataset.role=`trade`,i.dataset.icon=`trendingUp`,i.title=t(`toolbar.trade`),i.setAttribute(`aria-haspopup`,`menu`),i.setAttribute(`aria-expanded`,`false`),E(i,`toolbar.trade`),i.innerHTML=`${D(`trendingUp`,14)} <span class="tcw-trigger-label">${O(t(`toolbar.trade`))}</span> ${D(`chevronDown`,12)}`,i.addEventListener(`click`,()=>this.toggle(r(i))),this.button=i}tidy(){this.button.hidden=this.items.every(e=>this.isOff(e.parts))}setOpen(e,t){let n=It.find(t=>t===e);n&&(t?this.open.add(n):this.open.delete(n))}destroy(){this.menu?.destroy(),this.button.remove()}isOff(e){let t=new Set((this.root().getAttribute(`data-tcw-off`)??``).split(/\s+/).filter(Boolean));return e.some(e=>t.has(e))}toggle(e){if(this.menu?.isOpen()){this.menu.close();return}let t=this.items.filter(e=>!this.isOff(e.parts));if(t.length===0)return;let n=t.filter(e=>!It.includes(e.id)),r=t.filter(e=>It.includes(e.id)),i=[...n.map(e=>({id:e.id,label:e.label,icon:Ft[e.id]})),...n.length>0&&r.length>0?[`separator`]:[],...r.map(e=>({id:e.id,label:e.label,checked:this.open.has(e.id)}))],a=this.root();this.menu??=new k(a,this.t(`toolbar.trade`)),this.menu.openUnder(i,e,e=>{t.find(t=>t.id===e)?.run()})}},zt=2048,Bt=65536,Vt=/^data:image\/(png|jpeg|gif|webp|avif|svg\+xml)[;,]/i,Ht=new Set([`https:`,`http:`,`blob:`]),Ut=new Set([`description`,`exchange`,`type`,`logo`]);function Wt(e){if(typeof e!=`string`)return null;let t=e.trim();return t&&t.length<=64?t:null}function Gt(e){let t=[],n=new Map;if(!Array.isArray(e))return{names:t,info:n};let r=new Set;for(let i of e){let e=typeof i==`object`&&!!i,a=Wt(e?i.symbol:i);!a||r.has(a)||(r.add(a),t.push(a),e&&n.set(a,Kt(i,a)))}return{names:t,info:n}}function Kt(e,t){return{...Object.fromEntries(Object.entries(e).filter(([e,t])=>e!==`__proto__`&&(!Ut.has(e)||typeof t==`string`&&t.trim()!==``))),symbol:t}}function qt(e){return Array.isArray(e)?e.filter(e=>typeof e==`object`&&!!e&&typeof e.symbol==`string`&&e.symbol!==``).map(e=>Kt(e,e.symbol)):[]}function Jt(e,t){if(!t)return e;if(!e)return t;let n=Object.entries(t).filter(([,e])=>e!=null);return Object.fromEntries([...Object.entries(e),...n])}function Yt(e){let t=e.lastIndexOf(`:`);return t<=0||t===e.length-1?{venue:``,ticker:e}:{venue:e.slice(0,t+1),ticker:e.slice(t+1)}}var Xt=e=>Yt(e).ticker.toUpperCase();function Zt(e,t){return!t||typeof t.symbol!=`string`?null:t.symbol.toUpperCase()===e.toUpperCase()||t.symbol.includes(`:`)!==e.includes(`:`)&&Xt(t.symbol)===Xt(e)?t:null}function Qt(e){return[e?.description,e?.exchange].filter(Boolean).join(` · `)||null}var $t=()=>typeof document>`u`?void 0:document.baseURI;function en(e,t=$t()){if(typeof e!=`string`)return null;let n=e.trim();if(!n||n.length>Bt)return null;let r;try{r=new URL(n,t)}catch{return null}return r.protocol===`data:`?Vt.test(r.href)&&r.href.length<=Bt?r.href:null:Ht.has(r.protocol)&&r.href.length<=zt?r.href:null}var tn=0,A=`data-tcw-folded`,nn=1/64,rn=[`venue`,`ticker`,`cut`],an={T:`toolbar.timeframes.ticks`,s:`toolbar.timeframes.seconds`,m:`toolbar.timeframes.minutes`,h:`toolbar.timeframes.hours`,d:`toolbar.timeframes.days`,w:`toolbar.timeframes.weeks`,M:`toolbar.timeframes.months`};function on(e,t){let n=e.querySelector(`.tcw-host-btn-text`)?.textContent??``;n===t?e.removeAttribute(`aria-label`):e.setAttribute(`aria-label`,n?`${t}: ${n}`:t)}var sn=class{config;callbacks;t;el;chartTypeDropdown=null;tfGroup=null;tfDropdown=null;tfFavorites=[];uid=(tn++).toString(36);tfRendered=``;themeBtn=null;fullscreenBtn=null;hostLeft=null;hostRight=null;moreMenu=null;tfCurrent=null;resizeObserver=null;hostObserver=null;moreBtn=null;fitFrame=0;destroyed=!1;undoBtn=null;redoBtn=null;trade=null;layoutShown=``;symbolShown=null;constructor(e,t,n,r,i){if(this.host=e,this.layer=i,this.config=t,this.callbacks=n,this.t=r,this.el=document.createElement(`div`),this.el.className=`tcw-toolbar`,E(this.el,`toolbar`),this.build(),e.appendChild(this.el),typeof ResizeObserver<`u`){this.resizeObserver=new ResizeObserver(()=>this.fit()),this.resizeObserver.observe(this.el),this.hostObserver=new ResizeObserver(()=>this.scheduleFit());for(let e of[this.hostLeft,this.hostRight])e&&this.hostObserver.observe(e)}document.fonts?.ready.then(()=>this.scheduleFit())}scheduleFit(){this.destroyed||this.fitFrame||typeof requestAnimationFrame>`u`||(this.fitFrame=requestAnimationFrame(()=>{this.fitFrame=0,this.destroyed||this.fit()}))}menuAnchor(e){return(e.hasAttribute(A)||this.el.closest(`[data-tcw-narrow]`)!==null)&&this.moreBtn?this.moreBtn:e}fit(){let e=this.toolbarFocus(),t=this.foldedState();this.refit(),this.foldedState()!==t&&this.closeStaleMenus(),e&&this.keepFocus(e)}refit(){let{el:e}=this,t=()=>this.fits(),n=[...e.querySelectorAll(`.tcw-toolbar-overflow`)];for(let e of n)e.removeAttribute(A);if(e.classList.remove(`tcw-toolbar--collapsed`,`tcw-toolbar--icons`),delete e.dataset.tcwSqueeze,!(e.clientWidth===0||t())){e.classList.add(`tcw-toolbar--collapsed`);for(let e=n.length-1;e>=0;e--)if(n[e].setAttribute(A,``),t())return;e.classList.add(`tcw-toolbar--icons`);for(let e of n)if(e.removeAttribute(A),!t()){e.setAttribute(A,``);break}for(let n of rn){if(t())return;e.dataset.tcwSqueeze=n}}}fits(){let{el:e}=this,t=e.getBoundingClientRect(),n=e.offsetWidth>0&&Math.abs(t.width-e.offsetWidth)>=1?t.width/e.offsetWidth:1,r=getComputedStyle(e),i=r.direction===`rtl`,a=e=>parseFloat(e)||0,o=t.width/n-(i?a(r.borderLeftWidth)+a(r.paddingLeft):a(r.borderRightWidth)+a(r.paddingRight)),s=0;for(let r of e.children){if(r.getClientRects().length===0)continue;let e=r.getBoundingClientRect();s=Math.max(s,(i?t.right-e.left:e.right-t.left)/n)}return Math.ceil(s-nn)<=Math.floor(o+nn)}foldedState(){let e=[...this.el.querySelectorAll(`.tcw-toolbar-overflow`)];return`${this.el.classList.contains(`tcw-toolbar--collapsed`)}:${e.map(e=>Number(e.hasAttribute(A))).join(``)}`}closeStaleMenus(){this.moreBtn&&k.closeAnchoredTo(this.moreBtn);for(let e of this.el.querySelectorAll(`[${A}], [${A}] button`))k.closeAnchoredTo(e)}toolbarFocus(){let e=k.focusedAnchor();if(e&&this.el.contains(e))return e;let t=document.activeElement;return t instanceof HTMLElement&&this.el.contains(t)?t:null}keepFocus(e){if(k.focusedAnchor())return;let t=e;this.shows(e)||(t=(this.moreBtn&&e!==this.moreBtn&&this.shows(this.moreBtn)?this.moreBtn:null)??this.overflowButtons().filter(e=>this.shows(e)).at(-1)),t&&document.activeElement!==t&&t.focus({preventScroll:!0})}overflowButtons(){return[...this.el.querySelectorAll(`button.tcw-toolbar-overflow, .tcw-toolbar-overflow button`)]}shows(e){if(e.closest(`[hidden]`)||e.closest(`[${A}]`)||this.isOff(e))return!1;let t=this.el.closest(`[data-tcw-narrow]`)!==null;return e===this.moreBtn?t||this.el.classList.contains(`tcw-toolbar--collapsed`):!(t&&e.closest(`.tcw-toolbar-overflow`))}isOff(e){let t=new Set((this.rootEl().getAttribute(`data-tcw-off`)??``).split(/\s+/).filter(Boolean));for(let n=e;n&&n!==this.el;n=n.parentElement)if((n.dataset.tcwPart??``).split(/\s+/).some(e=>t.has(e)))return!0;return!1}build(){let{config:e,callbacks:t,el:n}=this,r=document.createElement(`button`);if(r.className=`tcw-toolbar-symbol`,r.dataset.role=`symbol`,r.dir=`ltr`,E(r,`toolbar.symbol`),r.addEventListener(`click`,t.onSymbolClick),n.appendChild(r),t.onSymbolInfo){let e=this.iconBtn(`info`,this.t(`symbolInfo.title`),t.onSymbolInfo);e.classList.remove(`tcw-toolbar-overflow`),e.dataset.role=`symbolInfo`,E(e,`symbolInfo`,`toolbar.symbolInfo`),n.appendChild(e)}if(n.appendChild(this.sep()),this.tfFavorites=[...e.timeframeFavorites??e.timeframes.map(e=>e.value)],this.tfGroup=document.createElement(`div`),this.tfGroup.className=`tcw-toolbar-group tcw-tf-group`,E(this.tfGroup,`toolbar.timeframes`),n.appendChild(this.tfGroup),t.onToggleTimeframeFavorite&&e.timeframes.length>0){let e=document.createElement(`div`);e.style.position=`relative`,e.style.display=`inline-flex`,E(e,`toolbar.timeframeMenu`);let t=document.createElement(`button`);t.className=`tcw-btn tcw-tf-more`,t.dataset.role=`timeframes`,t.title=this.t(`toolbar.timeframes`),t.setAttribute(`aria-label`,this.t(`toolbar.timeframes`)),this.tfCurrent=document.createElement(`span`),this.tfCurrent.className=`tcw-tf-current`,t.appendChild(this.tfCurrent),t.insertAdjacentHTML(`beforeend`,D(`chevronDown`,12)),e.appendChild(t),n.appendChild(e),this.tfDropdown=new et(e,{width:`150px`,layer:this.layer}),n.classList.add(`tcw-toolbar--tf-menu`),this.buildTimeframeMenu()}n.appendChild(this.sep());let i=document.createElement(`div`);i.style.position=`relative`,i.style.display=`inline-flex`,E(i,`toolbar.chartType`);let a=document.createElement(`button`);a.className=`tcw-dropdown-trigger`,a.dataset.role=`charttype`,i.appendChild(a),n.appendChild(i),this.chartTypeDropdown=new et(i,{width:`160px`,layer:this.layer}),this.buildChartTypeMenu(),n.appendChild(this.sep());let o=document.createElement(`button`);if(o.type=`button`,o.className=`tcw-dropdown-trigger`,o.dataset.role=`indicators`,o.setAttribute(`aria-haspopup`,`dialog`),o.setAttribute(`aria-expanded`,`false`),E(o,`toolbar.indicators`),o.addEventListener(`click`,()=>t.onIndicators()),n.appendChild(o),t.onCompare){let e=document.createElement(`button`);e.type=`button`,e.className=`tcw-dropdown-trigger`,e.dataset.role=`compare`,E(e,`compare`,`toolbar.compare`);let r=this.t(`objects.compare`);e.setAttribute(`aria-label`,r),e.title=r,e.innerHTML=`${D(`plus`,14)} <span class="tcw-trigger-label">${O(r)}</span>`,e.addEventListener(`click`,t.onCompare),n.appendChild(e)}if(this.hostLeft=this.hostGroup(),n.appendChild(this.hostLeft),t.onUndo&&t.onRedo&&(n.appendChild(this.sep()),this.undoBtn=this.iconBtn(`undo`,this.t(`drawing.undo`),t.onUndo),this.undoBtn.dataset.role=`undo`,E(this.undoBtn,`toolbar.undo`,`sidebar.undo`),this.redoBtn=this.iconBtn(`redo`,this.t(`drawing.redo`),t.onRedo),this.redoBtn.dataset.role=`redo`,E(this.redoBtn,`toolbar.redo`,`sidebar.redo`),n.append(this.undoBtn,this.redoBtn),this.setHistory(!1,!1)),n.appendChild(this.spacer()),t.onLayouts){let e=t.onLayouts,r=document.createElement(`button`);r.type=`button`,r.className=`tcw-dropdown-trigger tcw-layouts-btn tcw-toolbar-overflow`,r.dataset.role=`layouts`,r.dataset.icon=`save`,E(r,`layouts`,`toolbar.layouts`),r.setAttribute(`aria-haspopup`,`menu`),r.addEventListener(`click`,()=>e(this.menuAnchor(r))),n.appendChild(r),this.setLayout(null,!1)}if(this.hostRight=this.hostGroup(),n.appendChild(this.hostRight),n.appendChild(this.sep()),t.onToggleReplay){let e=this.iconBtn(`play`,this.t(`toolbar.replay`),t.onToggleReplay);e.dataset.role=`replay`,E(e,`replay`,`toolbar.replay`),n.appendChild(e)}if(t.onToggleObjects){let e=this.iconBtn(`layers`,this.t(`toolbar.objects`),t.onToggleObjects);e.dataset.role=`objects`,e.setAttribute(`aria-pressed`,`false`),E(e,`objectTree`,`toolbar.objectTree`),n.appendChild(e)}if(t.onToggleAlerts){let e=this.iconBtn(`bell`,this.t(`toolbar.priceAlerts`),t.onToggleAlerts);e.dataset.role=`alerts`,e.setAttribute(`aria-pressed`,`false`),E(e,`alerts`,`toolbar.alerts`),n.appendChild(e)}this.trade=Rt.create(t,this.t,()=>this.rootEl(),e=>this.menuAnchor(e)),this.trade&&n.appendChild(this.trade.button),n.appendChild(this.sep());let s=this.iconBtn(`camera`,this.t(`toolbar.screenshot`),t.onScreenshot);E(s,`screenshot`,`toolbar.screenshot`),n.appendChild(s);let c=this.iconBtn(`settings`,this.t(`toolbar.settings`),t.onSettings);E(c,`settings`,`toolbar.settings`),n.appendChild(c),this.themeBtn=this.iconBtn(`moon`,this.t(`toolbar.toggleTheme`),t.onToggleTheme),this.themeBtn.dataset.role=`theme`,E(this.themeBtn,`themeToggle`,`toolbar.themeToggle`),n.appendChild(this.themeBtn),t.onToggleFullscreen&&(this.fullscreenBtn=this.iconBtn(`maximize`,this.t(`toolbar.fullscreen`),t.onToggleFullscreen),this.fullscreenBtn.dataset.role=`fullscreen`,E(this.fullscreenBtn,`fullscreen`,`toolbar.fullscreen`),this.fullscreenBtn.setAttribute(`aria-pressed`,`false`),n.appendChild(this.fullscreenBtn));let l=document.createElement(`button`);l.type=`button`,l.className=`tcw-btn-icon tcw-toolbar-more`,l.title=this.t(`toolbar.more`),l.setAttribute(`aria-haspopup`,`menu`),l.setAttribute(`aria-expanded`,`false`),l.innerHTML=D(`more`,16),l.addEventListener(`click`,()=>this.toggleMore(l)),n.appendChild(l),this.moreBtn=l}toggleMore(e){if(k.closeAnchoredTo(e))return;let t=this.rootEl(),n=this.el.closest(`[data-tcw-narrow]`)!==null,r=[];for(let e of this.el.querySelectorAll(`.tcw-toolbar-overflow`)){if(this.isOff(e)||!n&&!e.hasAttribute(A))continue;let t=e instanceof HTMLButtonElement?[e]:[...e.querySelectorAll(`button`)];r.push(...t.filter(e=>!e.hidden&&!e.disabled&&!this.isOff(e)))}if(r.length===0)return;let i=r.map((e,t)=>{let n=e.getAttribute(`aria-label`)||e.title||e.textContent?.trim()||``,r=e.getAttribute(`aria-pressed`);return r===null?{id:String(t),label:n,icon:e.dataset.icon}:{id:String(t),label:n,icon:e.dataset.icon,checked:r===`true`}});this.moreMenu??=new k(t,this.t(`toolbar.more`)),this.moreMenu.openUnder(i,e,e=>r[Number(e)]?.click(),`end`)}addHostButton(e){let t=document.createElement(`button`);t.type=`button`,t.className=`${e.text||!e.icon?`tcw-btn`:`tcw-btn-icon`} tcw-host-btn tcw-toolbar-overflow`,t.dataset.hostButton=e.id,typeof e.icon==`string`&&(t.dataset.icon=e.icon),t.title=e.label,e.toggle&&t.setAttribute(`aria-pressed`,`false`),typeof e.icon==`string`?t.innerHTML=D(e.icon,14):e.icon&&t.appendChild(e.icon);let n=e.text??(e.icon?``:e.label);if(n){let e=document.createElement(`span`);e.className=`tcw-host-btn-text`,e.textContent=n,t.appendChild(e)}return on(t,e.label),t.addEventListener(`click`,()=>e.onClick(t)),(e.side===`left`?this.hostLeft:this.hostRight)?.appendChild(t),this.scheduleFit(),t}hostSlot(e){return e===`left`?this.hostLeft:this.hostRight}hostGroup(){let e=document.createElement(`div`);return e.className=`tcw-toolbar-host`,e}setSymbolSearch(e){let t=this.el.querySelector(`[data-role="symbol"]`);t&&(e?t.removeAttribute(`aria-disabled`):t.setAttribute(`aria-disabled`,`true`))}tidy(){this.trade?.tidy(),Ge(this.el,`tcw-toolbar-sep`,`tcw-toolbar-spacer`),this.scheduleFit()}setHistory(e,t){this.undoBtn&&(this.undoBtn.disabled=!e),this.redoBtn&&(this.redoBtn.disabled=!t)}rootEl(){return this.el.closest(`.tcw-root`)??this.host}setActive(e,t){this.trade?.setOpen(e,t);let n=this.el.querySelector(`[data-role="${e}"]`);n&&(n.classList.toggle(`tcw-active`,t),n.setAttribute(`aria-pressed`,String(t)))}setRailed(e,t){let n=this.el.querySelector(`[data-role="${e}"]`);n&&(n.hidden=t)}setLayout(e,t){let n=this.el.querySelector(`[data-role="layouts"]`);if(!n)return;let r=e??this.t(`layouts.unnamed`);if(this.layoutShown===`${t}:${r}`)return;this.layoutShown=`${t}:${r}`;let i=`${this.t(`toolbar.layouts`)}: ${r}${t?` (${this.t(`layouts.unsavedChanges`)})`:``}`;n.innerHTML=`${D(`save`,14)}<span class="tcw-layouts-label">${O(r)}</span>`+(t?`<span class="tcw-layouts-dirty" aria-hidden="true"></span>`:``)+D(`chevronDown`,12),n.title=i,n.setAttribute(`aria-label`,i),this.scheduleFit()}setFullscreen(e){if(!this.fullscreenBtn)return;let t=this.t(e?`toolbar.exitFullscreen`:`toolbar.fullscreen`);this.fullscreenBtn.innerHTML=D(e?`minimize`:`maximize`,14),this.fullscreenBtn.title=t,this.fullscreenBtn.setAttribute(`aria-pressed`,String(e))}chartTypeLabel(e){return ht(e,this.t)}buildChartTypeMenu(){if(!this.chartTypeDropdown)return;let e=this.config.chartTypes.map(e=>`<button class="tcw-dropdown-item tcw-dropdown-item--icon" data-ct="${O(e.value)}">${$e(e.value,16)}<span>${O(this.chartTypeLabel(e))}</span></button>`).join(``);this.chartTypeDropdown.setContent(e),this.chartTypeDropdown.panel.querySelectorAll(`.tcw-dropdown-item`).forEach(e=>{e.addEventListener(`click`,e=>{let t=e.currentTarget.dataset.ct;this.callbacks.onChartType(t),this.chartTypeDropdown?.close()})})}setSymbolDescription(e){let t=this.el.querySelector(`[data-role="symbol"]`);t&&(e?t.title=e:t.removeAttribute(`title`))}setTimeframes(e,t){this.config={...this.config,timeframes:e},this.setTimeframeFavorites(t)}setTimeframeFavorites(e){this.tfFavorites=[...e],this.tfRendered=``,this.buildTimeframeMenu()}buildTimeframeMenu(){if(!this.tfDropdown)return;let e=O(this.t(`toolbar.timeframes.pin`)),t=O(this.t(`toolbar.timeframes.remove`)),n=``;for(let{unit:r,timeframes:i}of jt(this.config.timeframes)){n+=`<div class="tcw-tf-section" data-tf-section="${r}" role="group" aria-label="${O(this.t(an[r]))}"><div class="tcw-dropdown-label">${O(this.t(an[r]))}</div>`;for(let r of i){let i=this.tfFavorites.includes(r.value),[a,o]=[O(r.value),O(r.label)];n+=`<div class="tcw-tf-row"><button class="tcw-dropdown-item" data-tf-pick="${a}">${o}</button>`+(r.custom&&this.callbacks.onRemoveTimeframe?`<button class="tcw-tf-remove" data-tf-remove="${a}" title="${t}" aria-label="${t}: ${o}">${D(`x`,12)}</button>`:``)+`<button class="tcw-tf-star${i?` tcw-active`:``}" data-tf-star="${a}" aria-pressed="${i}" title="${e}" aria-label="${e}: ${o}">${D(`star`,12)}</button></div>`}n+=`</div>`}if(this.callbacks.onAddTimeframe){let e=O(this.t(`toolbar.timeframes.custom`)),t=O(this.t(`toolbar.timeframes.add`));n+=`<form class="tcw-tf-custom" ${Ue(`customTimeframes`)} novalidate><input class="tcw-tf-custom-input" type="text" autocomplete="off" spellcheck="false" maxlength="6" placeholder="7m, 90m, 2h…" aria-label="${e}" aria-describedby="tcw-tf-hint-${this.uid}"><button type="submit" class="tcw-tf-custom-add" title="${t}" aria-label="${t}">${D(`plus`,12)}</button><div class="tcw-tf-custom-hint" id="tcw-tf-hint-${this.uid}" role="status"></div></form>`}this.tfDropdown.setContent(n);let r=this.tfDropdown.panel;r.querySelectorAll(`[data-tf-pick]`).forEach(e=>{e.addEventListener(`click`,()=>this.callbacks.onTimeframe(e.dataset.tfPick))}),r.querySelectorAll(`[data-tf-star]`).forEach(e=>{e.addEventListener(`click`,t=>{t.stopPropagation(),this.callbacks.onToggleTimeframeFavorite?.(e.dataset.tfStar)})}),r.querySelectorAll(`[data-tf-remove]`).forEach(e=>{e.addEventListener(`click`,t=>{t.stopPropagation(),this.callbacks.onRemoveTimeframe?.(e.dataset.tfRemove)})});let i=r.querySelector(`.tcw-tf-custom`);i&&this.wireCustomTimeframe(i)}wireCustomTimeframe(e){let t=e.querySelector(`.tcw-tf-custom-input`),n=e.querySelector(`.tcw-tf-custom-hint`);e.addEventListener(`click`,e=>e.stopPropagation()),t.addEventListener(`input`,()=>{t.removeAttribute(`aria-invalid`),n.textContent=``}),e.addEventListener(`submit`,e=>{e.preventDefault(),e.stopPropagation(),this.callbacks.onAddTimeframe?.(t.value)?(t.value=``,n.textContent=``,this.tfDropdown?.close(),this.el.querySelector(`[data-role="timeframes"]`)?.focus()):(t.setAttribute(`aria-invalid`,`true`),n.textContent=this.t(`toolbar.timeframes.invalid`))})}renderTimeframes(e){if(!this.tfGroup)return;let t=this.config.timeframes.filter(t=>this.tfFavorites.includes(t.value)||t.value===e),n=`${t.map(e=>e.value).join(`,`)}|${e}`;n!==this.tfRendered&&(this.tfRendered=n,this.tfCurrent&&(this.tfCurrent.textContent=this.config.timeframes.find(t=>t.value===e)?.label??e),this.tfGroup.replaceChildren(...t.map(t=>{let n=document.createElement(`button`);return n.className=`tcw-btn`,n.textContent=t.label,n.dataset.tf=t.value,n.classList.toggle(`tcw-active`,t.value===e),n.addEventListener(`click`,()=>this.callbacks.onTimeframe(t.value)),n})),(this.tfDropdown?.panel)?.querySelectorAll(`[data-tf-pick]`).forEach(t=>{t.classList.toggle(`tcw-active`,t.dataset.tfPick===e)}))}setIndicatorsOpen(e){this.el.querySelector(`[data-role="indicators"]`)?.setAttribute(`aria-expanded`,String(e))}renderSymbol(e){let t=this.el.querySelector(`[data-role="symbol"]`);if(!t||this.symbolShown===e)return;this.symbolShown=e;let{venue:n,ticker:r}=Yt(e),i=(e,t)=>{let n=document.createElement(`span`);return n.className=e,n.textContent=t,n};t.replaceChildren(...n?[i(`tcw-toolbar-venue`,n)]:[],i(`tcw-toolbar-ticker`,r)),t.classList.toggle(`tcw-toolbar-symbol--venue`,n!==``),t.setAttribute(`aria-label`,e)}update(e){this.renderSymbol(e.symbol),this.renderTimeframes(e.timeframe);let t=this.el.querySelector(`[data-role="charttype"]`);if(t){let n=this.config.chartTypes.find(t=>t.value===e.chartType),r=n?this.chartTypeLabel(n):e.chartType;t.innerHTML=$e(e.chartType,16),t.title=r,t.setAttribute(`aria-label`,r)}let n=this.el.querySelector(`[data-role="indicators"]`);if(n){let t=e.activeIndicators.size,r=`${D(`trendingUp`,14)} <span class="tcw-trigger-label">${O(this.t(`toolbar.indicators`))}</span>`;n.setAttribute(`aria-label`,this.t(`toolbar.indicators`)),t>0&&(r+=` <span class="tcw-badge-count">${t}</span>`),n.innerHTML=r}if(this.themeBtn){let t=e.isDark?`moon`:`sun`;this.themeBtn.innerHTML=D(t,14),this.themeBtn.dataset.icon=t}this.scheduleFit()}sep(){let e=document.createElement(`span`);return e.className=`tcw-toolbar-sep`,e}spacer(){let e=document.createElement(`span`);return e.className=`tcw-toolbar-spacer`,e}iconBtn(e,t,n){let r=document.createElement(`button`);return r.className=`tcw-btn-icon tcw-toolbar-overflow`,r.dataset.icon=e,r.title=t,r.innerHTML=D(e,14),r.addEventListener(`click`,n),r}destroy(){this.destroyed=!0,this.resizeObserver?.disconnect(),this.hostObserver?.disconnect(),this.fitFrame&&cancelAnimationFrame(this.fitFrame),this.chartTypeDropdown?.destroy(),this.tfDropdown?.destroy(),this.moreMenu?.destroy(),this.trade?.destroy(),this.el.remove()}};function cn(e,t,n){e.classList.toggle(`tcw-active`,t),n&&e.setAttribute(`aria-pressed`,String(t))}function ln(e,t,n){let r=n==null?``:String(n),i=e.querySelector(`.tcw-host-btn-text`);return(i?.textContent??``)===r?!1:(i||(i=document.createElement(`span`),i.className=`tcw-host-btn-text`,e.appendChild(i)),i.textContent=r,on(e,t),!0)}var un=16,dn=150,fn=4;function pn(e){let t=`sidebar.${e}`;return je.includes(t)?t:null}function mn(e,t){for(let n of e){let e=n.tools.find(e=>e.value===t);if(e)return e.label}return t}var hn=class{config;callbacks;el;groupWraps=[];groupButtons=[];groupIcons=[];groupTools=[];cursorBtn=null;magnetBtn=null;eraserBtn=null;zoomBtn=null;stayBtn=null;lockAllBtn=null;hideAllBtn=null;drawings={locked:!1,hidden:!1};flyoutEl=null;flyoutIdx=-1;flyoutHideTimer=null;hostEl=null;favoritesEl=null;favoritesDivider=null;favorites=[];fab;fabShows=``;onPressAway=e=>{let t=e.target;t&&(this.el.contains(t)||this.fab.contains(t)||this.flyoutEl?.contains(t))||this.setOpen(!1)};onEscape=e=>{e.key===`Escape`&&!this.flyoutEl&&this.setOpen(!1)};constructor(e,n,r,i=t.t){this.host=e,this.t=i,this.config=n,this.callbacks=r,this.el=document.createElement(`div`),this.el.className=`tcw-sidebar`,E(this.el,`sidebar`),this.build(),this.el.addEventListener(`scroll`,()=>this.hideFlyout(),{passive:!0}),e.appendChild(this.el),this.fab=document.createElement(`button`),this.fab.type=`button`,this.fab.className=`tcw-sidebar-fab`,this.fab.setAttribute(`aria-label`,this.t(`drawing.tools`)),this.fab.setAttribute(`aria-expanded`,`false`),this.fab.innerHTML=D(`penLine`,18),E(this.fab,`sidebar`),this.fab.addEventListener(`click`,()=>this.setOpen(!this.isOpen())),e.appendChild(this.fab)}isNarrow(){return this.el.closest(`[data-tcw-narrow]`)!==null}isOpen(){return this.el.classList.contains(`tcw-sidebar-open`)}setOpen(e){if(e!==this.isOpen())if(this.el.classList.toggle(`tcw-sidebar-open`,e),this.fab.setAttribute(`aria-expanded`,String(e)),e)document.addEventListener(`pointerdown`,this.onPressAway,!0),document.addEventListener(`keydown`,this.onEscape);else{let e=this.el.contains(document.activeElement)||!!this.flyoutEl?.contains(document.activeElement);this.hideFlyout(),document.removeEventListener(`pointerdown`,this.onPressAway,!0),document.removeEventListener(`keydown`,this.onEscape),e&&this.isNarrow()&&this.fab.focus({preventScroll:!0})}}closeOverlay(){this.setOpen(!1)}closeForChart(){this.isNarrow()&&this.setOpen(!1)}pick(e){this.callbacks.onDrawingTool(e),this.closeForChart()}build(){let{config:e,callbacks:t,el:n}=this;this.cursorBtn=document.createElement(`button`),this.cursorBtn.className=`tcw-sidebar-btn`,this.cursorBtn.title=this.t(`drawing.cursor`),this.cursorBtn.innerHTML=D(`cursor`,14),this.cursorBtn.addEventListener(`click`,()=>{t.onCancelDrawing(),this.closeForChart()}),E(this.cursorBtn,`sidebar.cursor`),n.appendChild(this.cursorBtn),n.appendChild(this.divider()),t.onToggleFavorite&&(this.favorites=[...e.favorites??[]],this.favoritesEl=document.createElement(`div`),this.favoritesEl.className=`tcw-sidebar-favorites`,E(this.favoritesEl,`sidebar.favorites`),n.appendChild(this.favoritesEl),this.favoritesDivider=this.divider(),E(this.favoritesDivider,`sidebar.favorites`),n.appendChild(this.favoritesDivider),this.renderFavorites());let r;e.drawingToolGroups.forEach((e,t)=>{if(!e.tools[0])return;e.section!==void 0&&r!==void 0&&e.section!==r&&this.appendDivider(),r=e.section;let i=document.createElement(`div`);i.className=`tcw-tool-group-wrap`;let a=pn(e.section);a&&E(i,a);let o=document.createElement(`button`);o.className=`tcw-sidebar-btn`;let s=e.tools[0].value;e.tools.length>1?o.setAttribute(`aria-label`,`${e.label}: ${e.tools[0].label}`):o.title=e.label;let c=document.createElement(`span`);if(c.className=`tcw-sidebar-icon`,c.innerHTML=Qe(s,un),o.appendChild(c),this.groupIcons.push(c),this.groupTools.push(s),e.tools.length>1){let e=document.createElement(`span`);e.className=`tcw-multi-dot`,o.appendChild(e)}o.addEventListener(`click`,()=>{if(this.isNarrow()&&e.tools.length>1){this.flyoutEl&&this.flyoutIdx===t?this.hideFlyout():this.showFlyout(t);return}this.pick(this.groupTools[t])}),i.appendChild(o),i.addEventListener(`mouseenter`,()=>{this.isNarrow()||this.showFlyout(t)}),i.addEventListener(`mouseleave`,()=>{this.isNarrow()||this.scheduleHideFlyout()}),e.tools.length>1&&(o.setAttribute(`aria-haspopup`,`menu`),o.setAttribute(`aria-expanded`,`false`),o.addEventListener(`keydown`,e=>{e.key===`ArrowRight`||e.key===`ArrowDown`?(e.preventDefault(),this.showFlyout(t),this.focusFlyoutItem(0)):e.key===`Escape`&&this.flyoutEl&&(e.stopPropagation(),this.hideFlyout())})),i.addEventListener(`focusout`,e=>{let t=e.relatedTarget;!i.contains(t)&&!this.flyoutEl?.contains(t)&&this.scheduleHideFlyout()}),n.appendChild(i),this.groupWraps.push(i),this.groupButtons.push(o)});let i=document.createElement(`div`);if(i.className=`tcw-sidebar-spacer`,n.appendChild(i),n.appendChild(this.divider()),t.onToggleStyle){let e=document.createElement(`button`);e.className=`tcw-sidebar-btn`,e.title=this.t(`drawing.style`),e.dataset.role=`style`,E(e,`sidebar.style`),e.innerHTML=D(`palette`,14);let r=t.onToggleStyle;e.addEventListener(`click`,()=>{r(),this.closeForChart()}),n.appendChild(e)}if(t.onToggleMagnet&&(this.magnetBtn=document.createElement(`button`),this.magnetBtn.className=`tcw-sidebar-btn`,this.magnetBtn.title=this.t(`drawing.magnet`),this.magnetBtn.innerHTML=D(`magnet`,14),this.magnetBtn.addEventListener(`click`,t.onToggleMagnet),E(this.magnetBtn,`sidebar.magnet`),n.appendChild(this.magnetBtn)),t.onToggleEraser){let e=t.onToggleEraser;this.eraserBtn=this.toggleButton(`eraser`,this.t(`drawing.eraser`),()=>{e(),this.closeForChart()}),E(this.eraserBtn,`sidebar.eraser`),n.appendChild(this.eraserBtn)}if(t.onToggleZoomArea){let e=t.onToggleZoomArea;this.zoomBtn=this.toggleButton(`zoomIn`,this.t(`drawing.zoomArea`),()=>{e(),this.closeForChart()}),E(this.zoomBtn,`sidebar.zoomArea`),n.appendChild(this.zoomBtn)}if(t.onToggleStayInDrawing&&(this.stayBtn=document.createElement(`button`),this.stayBtn.className=`tcw-sidebar-btn`,this.stayBtn.dataset.role=`stay`,this.stayBtn.title=this.t(`drawing.stay`),this.stayBtn.setAttribute(`aria-pressed`,`false`),this.stayBtn.innerHTML=D(`repeat`,14),this.stayBtn.addEventListener(`click`,t.onToggleStayInDrawing),E(this.stayBtn,`sidebar.stayInDrawing`),n.appendChild(this.stayBtn)),this.hostEl=document.createElement(`div`),this.hostEl.className=`tcw-sidebar-host`,n.appendChild(this.hostEl),this.appendDivider(),t.onLockAll){let e=t.onLockAll;this.lockAllBtn=this.toggleButton(`lock`,this.t(`drawing.lockAll`),()=>e(!this.drawings.locked)),this.lockAllBtn.dataset.role=`lockAll`,E(this.lockAllBtn,`sidebar.lockAll`),n.appendChild(this.lockAllBtn)}if(t.onHideAll){let e=t.onHideAll;this.hideAllBtn=this.toggleButton(`eyeOff`,this.t(`drawing.hideAll`),()=>e(!this.drawings.hidden)),this.hideAllBtn.dataset.role=`hideAll`,E(this.hideAllBtn,`sidebar.hideAll`),n.appendChild(this.hideAllBtn)}let a=document.createElement(`button`);a.className=`tcw-sidebar-btn tcw-danger`,a.title=this.t(`drawing.clearAll`),a.innerHTML=D(`trash`,14),a.addEventListener(`click`,t.onClearDrawings),E(a,`sidebar.clear`),n.appendChild(a)}setDrawingsState(e){if(!(e.locked===this.drawings.locked&&e.hidden===this.drawings.hidden)){this.drawings={...e};for(let[t,n]of[[this.lockAllBtn,e.locked],[this.hideAllBtn,e.hidden]])t?.setAttribute(`aria-pressed`,String(n)),t?.classList.toggle(`tcw-active`,n)}}setFavorites(e){this.favorites=[...e],this.renderFavorites();for(let e of this.flyoutEl?.querySelectorAll(`.tcw-flyout-row`)??[]){let t=this.favorites.includes(e.dataset.toolValue??``);e.classList.toggle(`tcw-flyout-faved`,t),e.querySelector(`[data-pin]`)?.setAttribute(`aria-pressed`,String(t))}}renderFavorites(){if(!this.favoritesEl)return;this.favoritesEl.replaceChildren();let e=this.favorites.length>0;this.favoritesEl.style.display=e?``:`none`,this.favoritesDivider&&(this.favoritesDivider.style.display=e?``:`none`);for(let e of this.favorites){let n=document.createElement(`button`);n.className=`tcw-sidebar-btn`,n.title=t.r(this.t(`sidebar.unpinHint`),{tool:mn(this.config.drawingToolGroups,e)}),n.dataset.toolValue=e,n.innerHTML=Qe(e,un),n.addEventListener(`click`,()=>this.pick(e)),n.addEventListener(`contextmenu`,t=>{t.preventDefault(),this.callbacks.onToggleFavorite?.(e)}),this.favoritesEl.appendChild(n)}}showFlyout(e){if(this.cancelHideFlyout(),this.flyoutEl&&this.flyoutIdx===e)return;let t=this.config.drawingToolGroups[e];if(!t||t.tools.length<=1){this.hideFlyout();return}this.hideFlyout();let n=document.createElement(`div`);n.className=`tcw-flyout`,n.setAttribute(`role`,`menu`),n.setAttribute(`aria-label`,t.label),n.addEventListener(`keydown`,t=>this.onFlyoutKey(t,e));let r=document.createElement(`div`);r.className=`tcw-flyout-header`,r.textContent=t.label,n.appendChild(r);let i=this.t(`drawing.pinFavorite`);for(let e of t.tools){let t=document.createElement(`div`);t.className=`tcw-flyout-row`,t.setAttribute(`role`,`none`),t.dataset.toolValue=e.value;let r=document.createElement(`button`);r.className=`tcw-flyout-item`,r.setAttribute(`role`,`menuitem`),r.tabIndex=-1,r.innerHTML=Qe(e.value,un);let a=document.createElement(`span`);a.className=`tcw-flyout-name`,a.textContent=e.label,r.appendChild(a);let o=this.config.shortcuts?.[e.value];if(o){let e=document.createElement(`kbd`);e.className=`tcw-flyout-key`,e.textContent=o,E(e,`hotkeys`,`hotkeys.tools`),r.appendChild(e)}if(r.dataset.toolValue=e.value,r.addEventListener(`click`,()=>{this.hideFlyout(),this.pick(e.value)}),t.appendChild(r),this.callbacks.onToggleFavorite){let n=this.favorites.includes(e.value);t.classList.toggle(`tcw-flyout-faved`,n);let a=document.createElement(`button`);a.type=`button`,a.className=`tcw-flyout-pin`,a.dataset.pin=e.value,a.tabIndex=-1,a.title=i,a.setAttribute(`aria-label`,`${i}: ${e.label}`),a.setAttribute(`aria-pressed`,String(n)),a.innerHTML=D(`star`,12),a.addEventListener(`click`,t=>{t.stopPropagation(),this.callbacks.onToggleFavorite?.(e.value)}),t.appendChild(a),r.addEventListener(`contextmenu`,t=>{t.preventDefault(),this.callbacks.onToggleFavorite?.(e.value)})}n.appendChild(t)}n.addEventListener(`mouseenter`,()=>this.cancelHideFlyout()),n.addEventListener(`mouseleave`,()=>this.scheduleHideFlyout()),n.addEventListener(`focusout`,t=>{let r=t.relatedTarget;!n.contains(r)&&!this.groupWraps[e].contains(r)&&this.scheduleHideFlyout()}),this.flyoutEl=n,this.flyoutIdx=e,this.host.appendChild(n),this.placeFlyout(n,this.groupButtons[e]),this.groupButtons[e].setAttribute(`aria-expanded`,`true`)}flyoutItems(){return this.flyoutEl?[...this.flyoutEl.querySelectorAll(`.tcw-flyout-item`)]:[]}focusFlyoutItem(e){let t=this.flyoutItems();t.length!==0&&t[(e+t.length)%t.length].focus()}onFlyoutKey(e,t){let n=this.flyoutItems(),r=n.indexOf(document.activeElement);switch(e.key){case`ArrowDown`:this.focusFlyoutItem(r+1);break;case`ArrowUp`:this.focusFlyoutItem(r-1);break;case`Home`:this.focusFlyoutItem(0);break;case`End`:this.focusFlyoutItem(n.length-1);break;case`Escape`:case`ArrowLeft`:e.stopPropagation(),this.hideFlyout(),this.groupButtons[t]?.focus();break;case`Tab`:this.hideFlyout(),this.groupButtons[t]?.focus();return;default:return}e.preventDefault()}placeFlyout(e,t){let n=this.host.getBoundingClientRect(),r=t.getBoundingClientRect();e.style.maxHeight=`${Math.max(0,this.host.clientHeight-fn*2)}px`;let i=this.host.clientHeight-e.offsetHeight-fn;this.host.closest(`[dir]`)?.getAttribute(`dir`)===`rtl`?(e.style.left=``,e.style.right=`${n.right-r.left}px`):(e.style.right=``,e.style.left=`${r.right-n.left}px`),e.style.top=`${Math.max(0,Math.min(r.top-n.top,i))}px`}scheduleHideFlyout(){this.cancelHideFlyout(),this.flyoutHideTimer=setTimeout(()=>{this.flyoutHideTimer=null,this.hideFlyout()},dn)}cancelHideFlyout(){this.flyoutHideTimer!==null&&(clearTimeout(this.flyoutHideTimer),this.flyoutHideTimer=null)}hideFlyout(){this.cancelHideFlyout(),this.flyoutEl&&=(this.flyoutEl.remove(),null),this.groupButtons[this.flyoutIdx]?.setAttribute(`aria-expanded`,`false`),this.flyoutIdx=-1}update(e){this.cursorBtn&&this.cursorBtn.classList.toggle(`tcw-active`,e.activeTool===null);let t=e.activeTool??``;t!==this.fabShows&&(this.fabShows=t,this.fab.innerHTML=e.activeTool?Qe(e.activeTool,18):D(`penLine`,18)),this.fab.classList.toggle(`tcw-active`,e.activeTool!==null||e.eraser||e.zoomArea);let{drawingToolGroups:n}=this.config;for(let t=0;t<n.length;t++){let r=n[t].tools.some(t=>t.value===e.activeTool);this.groupButtons[t].classList.toggle(`tcw-active`,r),r&&e.activeTool&&e.activeTool!==this.groupTools[t]&&(this.groupTools[t]=e.activeTool,this.groupIcons[t].innerHTML=Qe(e.activeTool,un),n[t].tools.length>1&&this.groupButtons[t].setAttribute(`aria-label`,`${n[t].label}: ${mn(n,e.activeTool)}`))}if(this.flyoutEl&&this.flyoutEl.querySelectorAll(`.tcw-flyout-item`).forEach(t=>{let n=t;n.classList.toggle(`tcw-active`,n.dataset.toolValue===e.activeTool)}),this.magnetBtn){let t=e.magnetEnabled&&e.magnetStrong;this.magnetBtn.classList.toggle(`tcw-active`,e.magnetEnabled),this.magnetBtn.innerHTML=D(t?`magnetStrong`:`magnet`,14),this.magnetBtn.title=t?this.t(`drawing.magnetStrong`):e.magnetEnabled?this.t(`drawing.magnetOn`):this.t(`drawing.magnetOff`),this.magnetBtn.setAttribute(`aria-label`,this.magnetBtn.title)}for(let[t,n]of[[this.eraserBtn,e.eraser],[this.zoomBtn,e.zoomArea]])t&&(t.classList.toggle(`tcw-active`,n),t.setAttribute(`aria-pressed`,String(n)));this.stayBtn&&(this.stayBtn.classList.toggle(`tcw-active`,e.stayInDrawing),this.stayBtn.setAttribute(`aria-pressed`,String(e.stayInDrawing)))}addHostButton(e){let t=document.createElement(`button`);return t.type=`button`,t.className=`tcw-sidebar-btn tcw-host-btn`,t.dataset.hostButton=e.id,t.title=e.label,t.setAttribute(`aria-label`,e.label),e.toggle&&t.setAttribute(`aria-pressed`,`false`),typeof e.icon==`string`?t.innerHTML=D(e.icon,14):t.appendChild(e.icon),t.addEventListener(`click`,()=>e.onClick(t)),this.hostEl?.appendChild(t),this.tidy(),t}hostSlot(){return this.hostEl}tidy(){Ge(this.el,`tcw-sidebar-divider`,`tcw-sidebar-spacer`)}toggleButton(e,t,n){let r=document.createElement(`button`);return r.className=`tcw-sidebar-btn`,r.title=t,r.setAttribute(`aria-label`,t),r.setAttribute(`aria-pressed`,`false`),r.innerHTML=D(e,14),r.addEventListener(`click`,n),r}appendDivider(){this.el.lastElementChild?.classList.contains(`tcw-sidebar-divider`)||this.el.appendChild(this.divider())}divider(){let e=document.createElement(`div`);return e.className=`tcw-sidebar-divider`,e}destroy(){this.setOpen(!1),this.hideFlyout(),this.fab.remove(),this.el.remove()}},gn=`button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])`;function j(e,t){if(e.key!==`Tab`)return;let n=document.activeElement,r=[...t.querySelectorAll(gn)].filter(e=>e.tabIndex>=0&&(e.getClientRects().length>0||e===n));if(r.length===0)return;let i=r[0],a=r[r.length-1],o=n instanceof Node&&t.contains(n),s=(e,t)=>(e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_PRECEDING)!==0;e.shiftKey&&(!o||n===i||s(i,n))?(e.preventDefault(),a.focus()):!e.shiftKey&&(!o||n===a||s(n,a))&&(e.preventDefault(),i.focus())}function M(e,t){let n=document.createElement(`label`);n.className=`tcw-settings-row`;let r=document.createElement(`span`);return r.className=`tcw-settings-label`,r.textContent=e,n.append(r,t),n}function _n(e,t,n){let r=document.createElement(`label`);r.className=`tcw-settings-row tcw-check-row`;let i=document.createElement(`input`);i.type=`checkbox`,i.checked=t,i.addEventListener(`change`,()=>n(i.checked));let a=document.createElement(`span`);return a.className=`tcw-settings-label`,a.textContent=e,r.append(i,a),r}function vn(e,t){let n=document.createElement(`button`);return n.type=`button`,n.className=`tcw-toggle${e?` tcw-on`:``}`,n.setAttribute(`role`,`switch`),n.setAttribute(`aria-checked`,String(e)),n.addEventListener(`click`,()=>{let e=!n.classList.contains(`tcw-on`);n.classList.toggle(`tcw-on`,e),n.setAttribute(`aria-checked`,String(e)),t(e)}),n}function N(e,t,n){let r=document.createElement(`input`);return r.type=`number`,r.className=`tcw-indi-input`,r.value=String(e),r.step=String(t.step??(Number.isInteger(e)?1:.001)),t.min!==void 0&&(r.min=String(t.min)),t.max!==void 0&&(r.max=String(t.max)),r.addEventListener(`change`,()=>{if(r.value.trim()===``)return;let e=Number(r.value);Number.isFinite(e)&&(t.min!==void 0&&(e=Math.max(t.min,e)),t.max!==void 0&&(e=Math.min(t.max,e)),r.value=String(e),n(e))}),r}function yn(e,t){let n=document.createElement(`input`);return n.type=`color`,n.className=`tcw-indi-color`,n.value=F(e),n.addEventListener(`input`,()=>t(n.value)),n}function P(e,t,n){let r=document.createElement(`select`);r.className=`tcw-indi-input tcw-indi-select`;for(let t of e){let e=document.createElement(`option`);e.value=t.value,e.textContent=t.label,r.appendChild(e)}return r.value=t,r.addEventListener(`change`,()=>n(r.value)),r}function F(e){if(typeof e!=`string`)return`#000000`;let t=e.trim();if(/^#[0-9a-f]{6}$/i.test(t))return t.toLowerCase();if(/^#[0-9a-f]{8}$/i.test(t))return t.slice(0,7).toLowerCase();if(/^#[0-9a-f]{3,4}$/i.test(t))return`#${t[1]}${t[1]}${t[2]}${t[2]}${t[3]}${t[3]}`.toLowerCase();let n=/^rgba?\(\s*(\d+)[\s,]+(\d+)[\s,]+(\d+)/i.exec(t);if(n)return`#${[n[1],n[2],n[3]].map(e=>Math.min(255,Number(e)).toString(16).padStart(2,`0`)).join(``)}`;let r=bn(t);return r!==null&&r!==t?F(r):`#000000`}var I;function bn(e){if(I===void 0)try{I=typeof document<`u`?document.createElement(`canvas`).getContext(`2d`):null}catch{I=null}if(!I)return null;I.fillStyle=`#010203`,I.fillStyle=e;let t=String(I.fillStyle);return t===`#010203`?null:t}function xn(e){if(typeof e!=`string`)return 1;let t=/^rgba\([^)]*,\s*([\d.]+)\s*\)$/i.exec(e.trim());return t?Math.max(0,Math.min(1,Number(t[1]))):1}function Sn(e,t){let n=F(e),[r,i,a]=[1,3,5].map(e=>parseInt(n.slice(e,e+2),16));return`rgba(${r}, ${i}, ${a}, ${Math.round(t*100)/100})`}var Cn={ArrowRight:1,ArrowDown:1,ArrowLeft:-1,ArrowUp:-1};function wn(e,t,n,r){let i=document.createElement(`div`);i.className=`tcw-segmented`,i.setAttribute(`role`,`radiogroup`),i.setAttribute(`aria-label`,r);let a=e.map(e=>{let t=document.createElement(`button`);return t.type=`button`,t.className=`tcw-segment`,t.setAttribute(`role`,`radio`),t.dataset.value=e.value,t.textContent=e.label,t.addEventListener(`click`,()=>s(e.value)),t}),o=e=>{let t=Math.max(0,a.findIndex(t=>t.dataset.value===e));a.forEach((n,r)=>{n.setAttribute(`aria-checked`,String(n.dataset.value===e)),n.tabIndex=r===t?0:-1})},s=e=>{o(e),n(e)};return i.addEventListener(`keydown`,t=>{let n=a.findIndex(e=>e===t.target);if(n<0||t.altKey||t.ctrlKey||t.metaKey)return;let r=a.length-1,o;if(t.key===`Home`)o=0;else if(t.key===`End`)o=r;else if(t.key in Cn){let e=i.closest(`[dir]`)?.getAttribute(`dir`)===`rtl`,r=t.key===`ArrowLeft`||t.key===`ArrowRight`;o=(n+(e&&r?-Cn[t.key]:Cn[t.key])+a.length)%a.length}else return;t.preventDefault(),a[o].focus(),s(e[o].value)}),o(t),i.append(...a),i}function Tn(e,t,r){if(!(r>0)||!Number.isFinite(e))return e;let i=e/r,a=Math.round(i),o=Math.abs(i-a)<1e-9*Math.max(1,Math.abs(i)),s=t>0?o?a+1:Math.ceil(i):o?a-1:Math.floor(i);return s<1?e:Number((s*r).toFixed((0,n.stepDecimals)(r)))}function En(e,t){let n=document.createElement(`div`);n.className=`tcw-stepper`,n.dir=`ltr`;let r=n=>{let r=Number(e.value),i=e.value.trim()!==``&&Number.isFinite(r)?r:t.fallback?.()??0,a=Tn(i,n,t.step(i,n));e.value=t.format?t.format(a):String(a),e.dispatchEvent(new Event(`input`))},i=(e,t)=>{let n=document.createElement(`button`);return n.type=`button`,n.className=`tcw-stepper-btn`,n.tabIndex=-1,n.setAttribute(`aria-label`,t),n.innerHTML=D(e>0?`plus`:`minus`,14),n.addEventListener(`click`,()=>r(e)),n};e.addEventListener(`keydown`,e=>{e.key!==`ArrowUp`&&e.key!==`ArrowDown`||(e.preventDefault(),r(e.key===`ArrowUp`?1:-1))});let a=i(-1,t.labels.down),o=i(1,t.labels.up);return n.append(a,e,o),{element:n,down:a,up:o}}var Dn=0;function On(e){let t=document.createElement(`div`);if(t.className=`tcw-settings-section`,e){let n=document.createElement(`div`);n.className=`tcw-settings-section-title`,n.textContent=e,t.appendChild(n),t.setAttribute(`role`,`group`),t.setAttribute(`aria-label`,e)}return t}function kn(e){let t=document.createElement(`div`);t.className=`tcw-settings-row`;let n=document.createElement(`span`);return n.className=`tcw-settings-label`,n.textContent=e,t.appendChild(n),t}function An(e,t,n,r,i){let a=kn(e),o=document.createElement(`div`);o.className=`tcw-color-picker-wrap`;let s=document.createElement(`input`);s.type=`color`,s.setAttribute(`aria-label`,e);let c=document.createElement(`span`);c.className=`tcw-color-hex`,c.id=`tcw-color-${++Dn}`,s.setAttribute(`aria-describedby`,c.id);let l=null,u=t=>{s.value=F(t??r.start?.()),c.textContent=t??i(`settings.auto`),a.classList.toggle(`tcw-color-auto`,t===null),t!==null&&r.start&&!l?(l=document.createElement(`button`),l.type=`button`,l.className=`tcw-color-auto-btn`,l.textContent=i(`settings.auto`),l.setAttribute(`aria-label`,`${e}: ${i(`settings.auto`)}`),l.addEventListener(`click`,()=>{n(null),s.focus(),u(r.read())}),o.appendChild(l)):t===null&&l&&(l.remove(),l=null)};return s.addEventListener(`input`,()=>{n(s.value),u(s.value)}),o.append(s,c),a.appendChild(o),u(t),{row:a,sync:()=>u(r.read())}}function L(e,t,n){let r=kn(e),i=document.createElement(`button`);return i.type=`button`,i.className=`tcw-toggle${t?` tcw-on`:``}`,i.setAttribute(`role`,`switch`),i.setAttribute(`aria-checked`,String(t)),i.setAttribute(`aria-label`,e),i.addEventListener(`click`,()=>{let e=!i.classList.contains(`tcw-on`);i.classList.toggle(`tcw-on`,e),i.setAttribute(`aria-checked`,String(e)),n(e)}),r.appendChild(i),r}function R(e,t,n,r){let i=kn(e),a=document.createElement(`select`);a.className=`tcw-settings-select`,a.setAttribute(`aria-label`,e);for(let e of n){let n=document.createElement(`option`);n.value=e.value,n.textContent=e.label,e.value===t&&(n.selected=!0),a.appendChild(n)}return n.some(e=>e.value===t)||(a.selectedIndex=-1),a.addEventListener(`change`,()=>r(a.value)),i.appendChild(a),i}function jn(e,t,n,r,i=e=>String(e)){let a=kn(e),o=document.createElement(`div`);o.className=`tcw-settings-range`;let s=document.createElement(`input`);s.type=`range`,s.min=String(n.min),s.max=String(n.max),s.step=String(n.step),s.value=String(t),s.setAttribute(`aria-label`,e);let c=document.createElement(`span`);return c.className=`tcw-settings-range-val`,c.textContent=i(t),s.addEventListener(`input`,()=>{let e=Number(s.value);c.textContent=i(e),r(e)}),o.append(s,c),a.appendChild(o),a}function Mn(e,t,n,r,i){let a=document.createElement(`div`);a.className=`tcw-settings-row`;let o=document.createElement(`label`);o.className=`tcw-settings-label`,o.textContent=e,a.appendChild(o);let s=document.createElement(`input`);return s.type=`number`,s.className=`tcw-settings-number`,s.min=`0`,s.step=n.step,Number.isFinite(n.max)&&(s.max=String(n.max)),s.placeholder=i(`settings.auto`),s.value=t===null?``:String(t),s.setAttribute(`aria-label`,e),s.addEventListener(`change`,()=>{if(s.value.trim()===``){s.removeAttribute(`aria-invalid`),r(null);return}let e=Number(s.value),t=Number.isFinite(e)&&e>0&&e<=n.max&&(n.step!==`1`||Number.isInteger(e));s.toggleAttribute(`aria-invalid`,!t),t&&r(e)}),a.appendChild(s),a}var z=[{id:`symbol`,icon:`chartType:candlestick`},{id:`statusLine`,icon:`type`},{id:`scales`,icon:`ruler`},{id:`appearance`,icon:`palette`},{id:`layers`,icon:`layers`},{id:`trading`,icon:`trendingUp`}],Nn=[1,2,3,4],Pn=`t:`,Fn=1,In=class{callbacks;t;backdrop=null;modal=null;bodyEl=null;tabButtons=[];templateBtn=null;menu=null;currentTab=`symbol`;currentSettings=null;chartType=null;lookRows=[];returnFocus=null;uid=Fn++;constructor(e,t,n={},r=()=>document.body){this.available=n,this.host=r,this.callbacks=e,this.t=t}open(e,t=null,n=`symbol`){this.modal&&this.remove(),this.returnFocus=document.activeElement instanceof HTMLElement?document.activeElement:null,this.currentSettings={...e},this.chartType=t,this.currentTab=n,this.buildModal(),this.tabButtons.find(e=>e.dataset.tab===n)?.focus()}isOpen(){return this.modal!==null}refresh(e,t){this.modal&&(this.currentSettings={...e},t!==void 0&&(this.chartType=t),this.renderTabContent())}close(){this.finish(!0)}destroy(){this.remove()}finish(e){this.modal&&(e?this.callbacks.onClose():this.callbacks.onCancel?.(),this.remove(),this.returnFocus?.isConnected&&this.returnFocus.focus(),this.returnFocus=null)}remove(){this.menu?.destroy(),this.menu=null,this.backdrop?.remove(),this.backdrop=this.modal=this.bodyEl=this.templateBtn=null,this.tabButtons=[]}buildModal(){let e=document.createElement(`div`);e.className=`tcw-modal-backdrop`;let t=!1;e.addEventListener(`pointerdown`,n=>{t=n.target===e}),e.addEventListener(`click`,n=>{n.target===e&&t&&this.finish(!1),t=!1});let n=document.createElement(`div`);n.className=`tcw-modal tcw-set`,n.setAttribute(`role`,`dialog`),n.setAttribute(`aria-modal`,`true`),n.setAttribute(`aria-labelledby`,`tcw-set-title-${this.uid}`),n.tabIndex=-1,n.addEventListener(`keydown`,e=>{if(e.key===`Escape`){e.preventDefault(),e.stopPropagation(),this.finish(!1);return}j(e,n)}),this.backdrop=e,this.modal=n,n.append(this.buildHeader(),this.buildBody(),this.buildFooter()),e.appendChild(n),this.host().appendChild(e),this.markTabs(),this.renderTabContent()}buildHeader(){let e=document.createElement(`div`);e.className=`tcw-modal-header`;let t=document.createElement(`h3`);t.id=`tcw-set-title-${this.uid}`,t.textContent=this.t(`settings.title`);let n=document.createElement(`button`);return n.type=`button`,n.className=`tcw-modal-close`,n.setAttribute(`aria-label`,this.t(`common.close`)),n.innerHTML=D(`x`,16),n.addEventListener(`click`,()=>this.finish(!1)),e.append(t,n),e}buildBody(){let e=document.createElement(`div`);e.className=`tcw-set-body`;let t=document.createElement(`div`);t.className=`tcw-set-nav`,t.setAttribute(`role`,`tablist`),t.setAttribute(`aria-orientation`,`vertical`),t.setAttribute(`aria-label`,this.t(`settings.title`)),t.addEventListener(`keydown`,e=>this.onTabKey(e)),this.tabButtons=z.map(({id:e,icon:t})=>{let n=document.createElement(`button`);return n.type=`button`,n.className=`tcw-set-tab`,n.id=`tcw-set-tab-${this.uid}-${e}`,n.dataset.tab=e,n.setAttribute(`role`,`tab`),n.setAttribute(`aria-controls`,`tcw-set-panel-${this.uid}`),n.innerHTML=`${t.startsWith(`chartType:`)?$e(t.slice(10),16):D(t,16)}<span></span>`,n.querySelector(`span`).textContent=this.t(`settings.tab.${e}`),n.addEventListener(`click`,()=>this.selectTab(e)),n}),t.append(...this.tabButtons);let n=document.createElement(`div`);return n.className=`tcw-modal-body tcw-set-panel`,n.id=`tcw-set-panel-${this.uid}`,n.setAttribute(`role`,`tabpanel`),this.bodyEl=n,e.append(t,n),e}buildFooter(){let e=document.createElement(`div`);e.className=`tcw-modal-footer`;let t=this.footerButton(`template`,`tcw-footer-menu`,()=>this.openTemplates());t.setAttribute(`aria-haspopup`,`menu`),t.setAttribute(`aria-expanded`,`false`),t.innerHTML=`<span></span>${D(`chevronDown`,12)}`,t.querySelector(`span`).textContent=this.t(`settings.template`),this.templateBtn=t;let n=document.createElement(`div`);return n.className=`tcw-footer-end`,n.append(this.footerButton(`cancel`,`tcw-footer-cancel`,()=>this.finish(!1),this.t(`common.cancel`)),this.footerButton(`ok`,`tcw-done-btn`,()=>this.finish(!0),this.t(`drawingSettings.ok`))),e.append(t,n),e}footerButton(e,t,n,r){let i=document.createElement(`button`);return i.type=`button`,i.className=t,i.dataset.act=e,r&&(i.textContent=r),i.addEventListener(`click`,n),i}markTabs(){for(let e of this.tabButtons){let t=e.dataset.tab===this.currentTab;e.classList.toggle(`tcw-active`,t),e.setAttribute(`aria-selected`,String(t)),e.tabIndex=t?0:-1,t&&this.bodyEl?.setAttribute(`aria-labelledby`,e.id)}}selectTab(e,t=!1){this.currentTab=e,this.markTabs(),this.renderTabContent(),t&&this.tabButtons.find(t=>t.dataset.tab===e)?.focus()}onTabKey(e){let t=z.findIndex(e=>e.id===this.currentTab),n=e.key===`ArrowDown`||e.key===`ArrowRight`?(t+1)%z.length:e.key===`ArrowUp`||e.key===`ArrowLeft`?(t-1+z.length)%z.length:e.key===`Home`?0:e.key===`End`?z.length-1:-1;n<0||(e.preventDefault(),this.selectTab(z[n].id,!0))}openTemplates(){let e=this.templateBtn;if(!this.modal||!e)return;if(this.menu?.isOpen()){this.menu.close();return}let n=this.callbacks.templates,r=(n?.list()??[]).map(e=>({id:`${Pn}${e}`,label:e,icon:`layers`,remove:t.r(this.t(`templates.delete`),{name:e})})),i=[...r,...r.length>0?[`separator`]:[],...n?[{id:`save`,label:this.t(`settings.saveTemplate`),icon:`save`}]:[],{id:`reset`,label:this.t(`settings.resetToDefaults`),icon:`reset`}];this.menu??=new k(this.modal,this.t(`settings.template`));let a=e.getBoundingClientRect(),o=this.modal.getBoundingClientRect();this.menu.open(i,a.left-o.left,a.top-o.top,e=>{e===`reset`?this.callbacks.onReset():e===`save`?n?.save():e.startsWith(Pn)&&n?.apply(e.slice(2))},e,e=>n?.remove(e.slice(2)))}renderTabContent(){if(!(!this.bodyEl||!this.currentSettings))switch(this.bodyEl.replaceChildren(),this.lookRows=[],this.currentTab){case`symbol`:this.renderSymbolTab(this.currentSettings);break;case`statusLine`:this.renderStatusLineTab(this.currentSettings);break;case`scales`:this.renderScalesTab(this.currentSettings);break;case`appearance`:this.renderAppearanceTab(this.currentSettings);break;case`layers`:this.renderLayersTab(this.currentSettings);break;case`trading`:for(let e of Ce)(!e.trading||this.available.trading!==!1)&&this.renderLookSection(e);break}}renderSymbolTab(e){this.renderChartTypeSection(),this.addSection(void 0,[L(this.t(`settings.mainSeries`),e.mainSeriesVisible,e=>this.patch({mainSeriesVisible:e})),L(this.t(`settings.extendedHours`),e.extendedHours,e=>this.patch({extendedHours:e}))]);let t=this.t(`common.show`);this.renderLookSection(ge),this.renderLookSection(_e,[L(t,e.volumeVisible,e=>this.patch({volumeVisible:e}))]),this.renderLookSection(ve,[L(t,e.highLowLines,e=>this.patch({highLowLines:e}))])}renderStatusLineTab(e){this.addSection(void 0,[L(this.t(`settings.ohlcLegend`),e.legendVisible,e=>this.patch({legendVisible:e})),...be.map(e=>this.lookRow(e))])}renderScalesTab(e){let t=[{value:`regular`,label:this.t(`settings.scale.regular`)},{value:`logarithmic`,label:this.t(`settings.scale.logarithmic`)},{value:`percentage`,label:this.t(`settings.scale.percentage`)},{value:`indexedTo100`,label:this.t(`settings.scale.indexedTo100`)}].filter(e=>e.value!==`logarithmic`||this.available.logScale!==!1),n=this.available.exchangeZone?.(),r=l(e.timezone,Date.now(),this.t(`settings.timezone.local`),n===void 0?void 0:{label:this.t(`settings.timezone.exchange`),zone:n});this.addSection(void 0,[R(this.t(`settings.priceScale`),e.scaleMode,t,e=>this.patch({scaleMode:e})),L(this.t(`settings.autoScale`),e.autoScale,e=>this.patch({autoScale:e})),L(this.t(`settings.invertScale`),e.invertScale,e=>this.patch({invertScale:e})),L(this.t(`settings.leftScale`),e.leftPriceScale,e=>this.patch({leftPriceScale:e})),L(this.t(`settings.indicatorValues`),e.indicatorValueLabels,e=>this.patch({indicatorValueLabels:e})),...this.available.barCountdown===!1?[]:[L(this.t(`settings.barCountdown`),e.barCountdown,e=>this.patch({barCountdown:e}))],R(this.t(`settings.timezone`),e.timezone,r,e=>this.patch({timezone:e})),R(this.t(`settings.numberLocale`),e.numberLocale,pt(e.numberLocale),e=>this.patch({numberLocale:e}))]),this.addSection(this.t(`settings.section.axes`),xe.map(e=>this.lookRow(e)))}renderAppearanceTab(e){let[t,n,r,...i]=Se;this.renderLookSection(t),this.renderLookSection(n,[L(this.t(`common.show`),e.gridVisible,e=>this.patch({gridVisible:e}))]),this.renderLookSection(r,[R(this.t(`settings.crosshairMode`),e.crosshairMode,[{label:this.t(`settings.crosshair.magnet`),value:`magnet`},{label:this.t(`settings.crosshair.normal`),value:`normal`},{label:this.t(`settings.crosshair.hidden`),value:`hidden`}],e=>this.patch({crosshairMode:e}))]);for(let e of i)this.renderLookSection(e)}renderLayersTab(e){let t=e=>`${Math.round(e*100)}%`,n=e=>this.t(e);this.addSection(void 0,[L(n(`settings.volumeProfile`),e.volumeProfileVisible,e=>this.patch({volumeProfileVisible:e}))]),this.addSection(void 0,[L(n(`settings.marketProfile`),e.marketProfileVisible,e=>this.patch({marketProfileVisible:e})),L(n(`settings.marketProfileSplit`),e.marketProfileSplit,e=>this.patch({marketProfileSplit:e})),L(n(`settings.marketProfileLetters`),e.marketProfileLetters,e=>this.patch({marketProfileLetters:e})),jn(n(`settings.marketProfileBuckets`),e.marketProfileBuckets,{min:8,max:200,step:1},e=>this.patch({marketProfileBuckets:e})),jn(n(`settings.marketProfileOpacity`),e.marketProfileOpacity,{min:.05,max:1,step:.05},e=>this.patch({marketProfileOpacity:e}),t)]),this.addSection(void 0,[L(n(`settings.depthHeatmap`),e.depthHeatmapVisible,e=>this.patch({depthHeatmapVisible:e})),jn(n(`settings.depthHeatmapOpacity`),e.depthHeatmapOpacity,{min:.1,max:1,step:.05},e=>this.patch({depthHeatmapOpacity:e}),t)]),this.addSection(void 0,[L(n(`settings.swingMarkers`),e.pivotMarkersVisible,e=>this.patch({pivotMarkersVisible:e})),jn(n(`settings.swingStrength`),e.pivotStrength,{min:2,max:20,step:1},e=>this.patch({pivotStrength:e})),L(n(`settings.swingStructure`),e.pivotStructureLabels,e=>this.patch({pivotStructureLabels:e}))]),this.addSection(void 0,[L(n(`settings.sessionShading`),e.sessionShadingVisible,e=>this.patch({sessionShadingVisible:e})),L(n(`settings.periodLevels`),e.periodLevelsVisible,e=>this.patch({periodLevelsVisible:e})),R(n(`settings.periodLevelsBasis`),e.periodLevelsPeriod,[{value:`day`,label:n(`settings.priorDay`)},{value:`week`,label:n(`settings.priorWeek`)}],e=>this.patch({periodLevelsPeriod:e}))])}addSection(e,t){let n=On(e);return n.append(...t),this.bodyEl?.appendChild(n),n}renderLookSection(e,t=[]){this.addSection(this.t(e.title),[...t,...e.rows.map(e=>this.lookRow(e))])}lookRow(e){let t=this.t(e.label),r=()=>this.callbacks.styleValue(e.keys[0]),i=()=>{let t=e.keys.map(e=>this.callbacks.styleValue(e));return t.every(e=>e===t[0])&&t[0]!==null?String(t[0]):``},a,o=t=>{this.callbacks.onStyleChange(Object.fromEntries(e.keys.map(e=>[e,t])));for(let e of this.lookRows)e.el!==a&&e.sync()},s=e.auto?[{value:``,label:this.t(`settings.auto`)}]:[],c;switch(n.CHART_STYLE_KEYS[e.keys[0]]){case`boolean`:{a=L(t,r()===!0,o);let e=a.querySelector(`button`);c=()=>{let t=r()===!0;e.classList.toggle(`tcw-on`,t),e.setAttribute(`aria-checked`,String(t))};break}case`lineStyle`:a=R(t,i(),[...s,...this.lineStyles()],e=>o(e===``?null:Rn(e))),c=()=>{a.querySelector(`select`).value=i()};break;case`width`:{let e=r(),n=typeof e==`number`&&!Nn.includes(e)?[...Nn,e].sort((e,t)=>e-t):Nn;a=R(t,i(),[...s,...n.map(e=>({value:String(e),label:`${e}px`}))],e=>o(e===``?null:Number(e))),c=()=>{a.querySelector(`select`).value=i()};break}default:{let n=r(),i=An(t,typeof n==`string`?n:null,o,{read:()=>{let e=r();return typeof e==`string`?e:null},start:e.auto?()=>(e.auto?.from?this.callbacks.styleValue(e.auto.from):e.auto?.hint)??null:void 0},this.t);a=i.row,c=i.sync}}return this.lookRows.push({el:a,sync:c}),a}lineStyles(){return[{value:`solid`,label:this.t(`drawingSettings.lineStyle.solid`)},{value:`dashed`,label:this.t(`drawingSettings.lineStyle.dashed`)},{value:`dotted`,label:this.t(`drawingSettings.lineStyle.dotted`)}]}renderChartTypeSection(){if(!this.bodyEl||!this.currentSettings||!this.chartType)return;let e=this.chartType,t=this.currentSettings.chartTypeOptions??{},n=de.find(t=>t.value===e),r=On(n?ht(n,this.t):e),i=()=>this.currentSettings?.chartTypeOptions??{},a=(e,t)=>this.patch({chartTypeOptions:{...i(),[e]:t}}),o=(e,t,n,i,a)=>r.appendChild(Mn(this.t(e),t,{step:n,max:i},a,this.t));switch(e){case`renko`:{let e=t.renko??{};o(`settings.boxSize`,typeof e.boxSize==`number`?e.boxSize:null,`any`,1/0,e=>a(`renko`,{...i().renko??{},boxSize:e??`atr`})),o(`settings.atrPeriod`,e.atrPeriod??null,`1`,500,e=>a(`renko`,Ln(i().renko,`atrPeriod`,e)));break}case`lineBreak`:o(`settings.lineBreakLines`,t.lineBreak?.lines??null,`1`,10,e=>a(`lineBreak`,Ln(i().lineBreak,`lines`,e)));break;case`kagi`:o(`settings.reversal`,t.kagi?.reversal??null,`any`,1/0,e=>a(`kagi`,Ln(i().kagi,`reversal`,e))),r.appendChild(R(this.t(`settings.reversalType`),t.kagi?.reversalType??`percent`,[{value:`percent`,label:this.t(`settings.reversalType.percent`)},{value:`price`,label:this.t(`settings.reversalType.price`)}],e=>a(`kagi`,{...i().kagi??{},reversalType:e===`price`?`price`:`percent`})));break;case`pointAndFigure`:o(`settings.boxSize`,typeof t.pointAndFigure?.boxSize==`number`?t.pointAndFigure.boxSize:null,`any`,1/0,e=>a(`pointAndFigure`,{...i().pointAndFigure??{},boxSize:e??`auto`})),o(`settings.reversalBoxes`,t.pointAndFigure?.reversal??null,`1`,10,e=>a(`pointAndFigure`,Ln(i().pointAndFigure,`reversal`,e)));break;case`rangeBars`:o(`settings.barRange`,typeof t.rangeBars?.range==`number`?t.rangeBars.range:null,`any`,1/0,e=>a(`rangeBars`,{range:e??`auto`}));break;default:break}for(let t of Ee(e))r.appendChild(this.lookRow(t));this.bodyEl.appendChild(r)}patch(e){this.currentSettings&&Object.assign(this.currentSettings,e),this.callbacks.onChange(e)}};function Ln(e,t,n){let r={...e??{}};return n===null?delete r[t]:r[t]=n,r}function Rn(e){return e===`dashed`||e===`dotted`?e:`solid`}var zn=`data-tcw-folded`,Bn=`tcw-statusbar--folded`,Vn=`tcw-statusbar--short-market`,Hn=1,Un=13,Wn=`goto`,Gn=`Alt+G`,Kn=e=>e.goToKeys?e.goToKeys():Gn;function qn(e,t){let n=document.createElement(`span`);return n.className=e,n.textContent=t,n}var Jn=class{el;dotEl;messageEl;marketEl;hostLeft;hostRight;clockBtn=null;clockMenu=null;scaleBtns=null;scaleShown=``;marketShown=``;rightEl;rangeEl=null;presetBtns=[];moreBtn=null;goToBtn=null;rangeMenu=null;resizeObserver=null;fitFrame=0;destroyed=!1;constructor(e,t,n={}){this.host=e,this.extras=n,this.el=document.createElement(`div`),this.el.className=`tcw-statusbar`,E(this.el,`statusBar`),n.label&&(this.el.setAttribute(`role`,`group`),this.el.setAttribute(`aria-label`,n.label)),t&&this.el.appendChild(this.buildRange(t)),this.hostLeft=this.hostGroup(),this.el.appendChild(this.hostLeft);let r=document.createElement(`div`);r.className=`tcw-status-right`,this.rightEl=r,this.hostRight=this.hostGroup(),r.appendChild(this.hostRight);let i=document.createElement(`div`);i.className=`tcw-status-indicator`,E(i,`statusBar.connection`),this.dotEl=document.createElement(`span`),this.dotEl.className=`tcw-status-dot`,i.appendChild(this.dotEl),this.messageEl=document.createElement(`span`),i.appendChild(this.messageEl),this.marketEl=document.createElement(`span`),this.marketEl.className=`tcw-status-market`,this.marketEl.hidden=!0,E(this.marketEl,`statusBar.market`),r.appendChild(this.marketEl),r.appendChild(i),n.clock&&r.appendChild(this.buildClock(n.clock)),n.scale&&r.appendChild(this.buildScale(n.scale)),this.el.appendChild(r),e.appendChild(this.el),this.watchWidths(r)}watchWidths(e){if(typeof ResizeObserver<`u`){this.resizeObserver=new ResizeObserver(()=>this.scheduleFit());for(let t of[this.el,e,this.hostLeft])this.resizeObserver.observe(t)}document.fonts?.ready.then(()=>this.scheduleFit())}scheduleFit(){this.destroyed||this.fitFrame||typeof requestAnimationFrame>`u`||(this.fitFrame=requestAnimationFrame(()=>{this.fitFrame=0,this.destroyed||this.fit()}))}fit(){let e=this.foldedCount(),t=this.rangeFocus();this.refit(),this.foldedCount()!==e&&this.rangeMenu?.close(),this.keepFocus(t)}refit(){let e=this.foldSteps(),t=this.goToBtn?[...this.presetBtns,this.goToBtn]:this.presetBtns,n=n=>{let r=new Set(e.slice(0,n));for(let e of t)e.toggleAttribute(zn,r.has(e));this.el.classList.toggle(Bn,n>0)};if(n(0),this.el.classList.remove(Vn),this.el.clientWidth===0||this.fits())return;let r=0;for(;r<e.length;)if(n(++r),this.fits())return;if(!(this.marketEl.hidden||this.isOff(this.marketEl))){for(this.el.classList.add(Vn);r>0;r--)if(n(r-1),!this.fits()){n(r);return}}}fits(){return this.rangeFits()&&this.rightFits()}rangeFits(){let e=this.rangeEl;return!e||e.scrollWidth<=e.clientWidth+Hn}rightFits(){if(this.rightEl.offsetParent!==this.el)return!0;let e=getComputedStyle(this.el),t=this.rightEl.offsetLeft;return(e.direction===`rtl`?(parseFloat(e.paddingLeft)||0)-t:t+this.rightEl.offsetWidth-(this.el.clientWidth-(parseFloat(e.paddingRight)||0)))<=Hn}foldedCount(){return this.rangeEl?.querySelectorAll(`[${zn}]`).length??0}rangeFocus(){if(this.rangeMenu?.hasFocus())return this.moreBtn;let e=document.activeElement;return e instanceof HTMLElement&&this.rangeEl?.contains(e)?e:null}keepFocus(e){if(!e||this.rangeMenu?.isOpen())return;let t=this.focusAfterRefit(e);t===this.el?this.focusBar():document.activeElement!==t&&t.focus({preventScroll:!0})}focusAfterRefit(e){if(this.shows(e))return e;let t=this.presetBtns.filter(e=>this.shows(e)).at(-1);return[e===this.moreBtn?null:this.moreBtn,this.goToBtn,t].find(e=>e!=null&&this.shows(e))??this.firstOtherControl()??this.el}firstOtherControl(){return[...this.el.querySelectorAll(`button`)].filter(e=>!this.rangeEl?.contains(e)).find(e=>!e.disabled&&e.getClientRects().length>0)??null}focusBar(){if(document.activeElement===this.el)return;let e=()=>this.el.removeAttribute(`tabindex`);this.el.tabIndex=-1,this.el.addEventListener(`blur`,e,{once:!0}),this.el.focus({preventScroll:!0}),document.activeElement!==this.el&&(this.el.removeEventListener(`blur`,e),e())}shows(e){return e===this.moreBtn&&!this.el.classList.contains(Bn)?!1:!e.hasAttribute(zn)&&!this.isOff(e)}foldSteps(){if(this.presetBtns.length===0||this.isOff(this.presetBtns[0]))return[];let e=[...this.presetBtns].reverse();return this.goToBtn&&e.push(this.goToBtn),e}isOff(e){let t=((this.el.closest(`.tcw-root`)??this.host).getAttribute(`data-tcw-off`)??``).split(/\s+/).filter(Boolean);return(e.dataset.tcwPart??``).split(/\s+/).some(e=>t.includes(e))}update(e){this.dotEl.className=`tcw-status-dot`,e.connectionState===`connected`?this.dotEl.classList.add(`tcw-connected`):e.connectionState===`error`&&this.dotEl.classList.add(`tcw-error`),this.messageEl.textContent=e.message}tick(){if(!this.clockBtn||!this.extras.clock)return;let{time:e,zone:t}=this.extras.clock.now(),n=`${e} ${t}`;this.clockBtn.textContent!==n&&(this.clockBtn.textContent=n)}setScale(e){let t=`${e.mode}|${e.auto}`;!this.scaleBtns||t===this.scaleShown||(this.scaleShown=t,this.scaleBtns.percent?.setAttribute(`aria-pressed`,String(e.mode===`percentage`)),this.scaleBtns.log?.setAttribute(`aria-pressed`,String(e.mode===`logarithmic`)),this.scaleBtns.auto?.setAttribute(`aria-pressed`,String(e.auto)))}setMarket(e,t,n=t){let r=`${e}|${t}|${n}`;if(r===this.marketShown)return;if(this.marketShown=r,this.marketEl.hidden=e===`always`,this.marketEl.dataset.state=e,e===`always`){this.marketEl.replaceChildren(),this.marketEl.removeAttribute(`title`);return}this.marketEl.title=t;let i=qn(`tcw-status-market-short`,n);i.setAttribute(`aria-hidden`,`true`),this.marketEl.replaceChildren(qn(`tcw-status-market-text`,t),i)}addHostItem(e){let t=e.onClick,n=t?document.createElement(`button`):document.createElement(`span`);return n.className=t?`tcw-status-host-item tcw-status-host-btn`:`tcw-status-host-item`,n.dataset.hostItem=e.id,n.dir=`auto`,n.textContent=e.text,e.label&&(n.title=e.label,t||n.setAttribute(`role`,`group`),e.label!==e.text&&n.setAttribute(`aria-label`,`${e.label}: ${e.text}`)),n instanceof HTMLButtonElement&&t&&(n.type=`button`,n.addEventListener(`click`,()=>t(n))),(e.side===`left`?this.hostLeft:this.hostRight).appendChild(n),n}hostSlot(e){return e===`left`?this.hostLeft:this.hostRight}destroy(){this.destroyed=!0,this.resizeObserver?.disconnect(),this.fitFrame&&cancelAnimationFrame(this.fitFrame),this.clockMenu?.destroy(),this.rangeMenu?.destroy(),this.el.remove()}buildClock(e){let t=document.createElement(`button`);return t.type=`button`,t.className=`tcw-status-clock`,t.dataset.role=`clock`,t.dir=`auto`,t.title=e.label,t.setAttribute(`aria-haspopup`,`menu`),E(t,`statusBar.clock`),t.addEventListener(`click`,()=>this.toggleZones(t,e)),this.clockBtn=t,this.tick(),t}toggleRangeMenu(e,t){if(this.rangeMenu?.isOpen()){this.rangeMenu.close();return}let n=e=>e.hasAttribute(zn)&&!this.isOff(e),r=t.presets.filter((e,t)=>n(this.presetBtns[t])).map(e=>({id:e,label:t.presetLabels?.[e]??e}));if(this.goToBtn&&n(this.goToBtn)&&(r.length>0&&r.push(`separator`),r.push({id:Wn,label:t.goToLabel,icon:`calendar`,shortcut:Kn(t)})),r.length===0)return;this.rangeMenu??=new k(this.host,t.groupLabel);let i=e.getBoundingClientRect(),a=this.host.getBoundingClientRect();this.rangeMenu.open(r,i.left-a.left,i.top-a.top,e=>e===Wn?t.onGoTo():t.onPreset(e),e,void 0,i.right-a.left)}toggleZones(e,t){if(this.clockMenu?.isOpen()){this.clockMenu.close();return}let{current:n,list:r}=t.options();this.clockMenu??=new k(this.host,t.label);let i=e.getBoundingClientRect(),a=this.host.getBoundingClientRect();this.clockMenu.open(r.map(e=>({id:e.value,label:e.label,checked:e.value===n})),i.left-a.left,i.top-a.top,e=>t.onPick(e),e,void 0,i.right-a.left)}buildScale(e){let t=document.createElement(`div`);t.className=`tcw-status-scale`,t.setAttribute(`role`,`group`),e.labels.group&&t.setAttribute(`aria-label`,e.labels.group),E(t,`statusBar.scale`);let n=(n,r,i)=>{let a=document.createElement(`button`);return a.type=`button`,a.className=`tcw-status-scale-btn`,a.dataset.scale=n,a.textContent=r,a.title=e.labels[n],a.setAttribute(`aria-label`,e.labels[n]),a.setAttribute(`aria-pressed`,`false`),a.addEventListener(`click`,i),t.appendChild(a),a};return this.scaleBtns={percent:n(`percent`,`%`,e.onPercent),...e.onLog?{log:n(`log`,e.texts?.log??`log`,e.onLog)}:{},auto:n(`auto`,e.texts?.auto??`auto`,e.onAuto)},t}hostGroup(){let e=document.createElement(`div`);return e.className=`tcw-status-host`,e}buildRange(e){let t=document.createElement(`div`);t.className=`tcw-range-bar`,t.setAttribute(`role`,`group`),t.setAttribute(`aria-label`,e.groupLabel);for(let n of e.presets){let r=document.createElement(`button`);r.type=`button`,r.className=`tcw-range-btn`,r.dataset.range=n,E(r,`statusBar.range`),r.textContent=e.presetLabels?.[n]??n,r.addEventListener(`click`,()=>e.onPreset(n)),t.appendChild(r),this.presetBtns.push(r)}let n=this.rangeIconBtn(`tcw-range-more`,`rangeMore`,`more`,e.moreLabel);E(n,`statusBar.range`),n.setAttribute(`aria-haspopup`,`menu`),n.setAttribute(`aria-expanded`,`false`),n.addEventListener(`click`,()=>this.toggleRangeMenu(n,e)),t.appendChild(n),this.moreBtn=n;let r=this.rangeIconBtn(`tcw-range-goto`,`goto`,`calendar`,e.goToLabel);E(r,`goToDate`,`statusBar.goToDate`);let i=()=>{let t=Kn(e);r.title=t?`${e.goToLabel} (${t})`:e.goToLabel};return i(),r.addEventListener(`pointerover`,i),r.addEventListener(`focusin`,i),r.addEventListener(`click`,e.onGoTo),t.appendChild(r),this.goToBtn=r,this.rangeEl=t,t}rangeIconBtn(e,t,n,r){let i=document.createElement(`button`);return i.type=`button`,i.className=`tcw-range-btn ${e}`,i.dataset.role=t,i.title=r,i.setAttribute(`aria-label`,r),i.innerHTML=D(n,Un),i}},Yn=typeof navigator<`u`&&/mac|iphone|ipad|ipod/i.test(navigator.platform||navigator.userAgent)?`⌘`:`Ctrl`,Xn=e=>e.toLowerCase().replace(/[\s+]+/g,``).replace(/[\u2010-\u2015\u2212]/g,`-`),Zn=5,Qn=229,$n=[`action`,`drawing`,`chartType`,`timeframe`,`indicator`],er={indicator:`palette.group.indicator`,chartType:`palette.group.chartType`,drawing:`palette.group.drawing`,timeframe:`palette.group.timeframe`,action:`palette.group.action`},tr=e=>`${e.category}:${e.id}`;function nr(e,t){let n=e.label.toLowerCase(),r=Xn(n);return e.id.toLowerCase()===t||r===t?5:r.startsWith(t)?4:n.split(/[\s/()-]+/).some(e=>e.startsWith(t))?3:r.includes(t)||e.id.toLowerCase().includes(t)?2:e.shortcut&&Xn(e.shortcut).includes(t)?1:0}var rr=0,ir=class{backdrop=null;input=null;list=null;emptyEl=null;liveEl=null;items=[];shown=[];selectedIndex=0;returnFocus=null;uid=++rr;constructor(e,n=()=>document.body,r=t.t,i){this.callbacks=e,this.host=n,this.t=r,this.recents=i}open(e){this.backdrop||(this.returnFocus=document.activeElement instanceof HTMLElement?document.activeElement:null,this.items=e,this.build(),this.render(),this.input?.focus())}close(){if(!this.backdrop)return;this.backdrop.remove(),this.backdrop=this.input=this.list=this.emptyEl=this.liveEl=null,this.callbacks.onClose();let e=this.returnFocus;this.returnFocus=null,e?.isConnected&&e.focus()}isOpen(){return this.backdrop!==null}destroy(){this.close()}build(){let e=document.createElement(`div`);e.className=`tcw-modal-backdrop`;let t=!1;e.addEventListener(`pointerdown`,n=>{t=n.target===e}),e.addEventListener(`click`,n=>{n.target===e&&t&&this.close(),t=!1});let n=document.createElement(`div`);n.className=`tcw-modal tcw-cp`,n.setAttribute(`role`,`dialog`),n.setAttribute(`aria-modal`,`true`),n.setAttribute(`aria-label`,this.t(`hotkeys.commandPalette`)),n.tabIndex=-1,n.addEventListener(`keydown`,e=>this.onKeyDown(e,n));let r=document.createElement(`label`);r.className=`tcw-ss-search tcw-cp-search`,r.innerHTML=D(`search`,16);let i=document.createElement(`input`);i.type=`search`,i.className=`tcw-cp-input`,i.placeholder=this.t(`palette.placeholder`),i.setAttribute(`aria-label`,this.t(`palette.placeholder`)),i.setAttribute(`role`,`combobox`),i.setAttribute(`aria-expanded`,`true`),i.setAttribute(`aria-autocomplete`,`list`),i.setAttribute(`aria-controls`,`tcw-cp-list-${this.uid}`),i.autocomplete=`off`,i.spellcheck=!1,i.addEventListener(`input`,()=>this.render()),r.appendChild(i);let a=document.createElement(`div`);a.className=`tcw-cp-results`;let o=document.createElement(`div`);o.className=`tcw-cp-list`,o.id=`tcw-cp-list-${this.uid}`,o.setAttribute(`role`,`listbox`),o.setAttribute(`aria-label`,this.t(`hotkeys.commandPalette`));let s=document.createElement(`div`);s.className=`tcw-cp-empty`,a.append(o,s),a.addEventListener(`mousedown`,e=>e.preventDefault());let c=document.createElement(`div`);c.className=`tcw-cp-live tcw-visually-hidden`,c.setAttribute(`aria-live`,`polite`),n.append(r,a,c),e.appendChild(n),this.host().appendChild(e),this.backdrop=e,this.input=i,this.list=o,this.emptyEl=s,this.liveEl=c}groups(){let e=Xn((this.input?.value??``).trim()),t=[];if(!e){let e=new Map(this.items.map(e=>[tr(e),e])),n=(this.recents?.list()??[]).map(t=>e.get(t)).filter(e=>!!e).slice(0,Zn);n.length>0&&t.push({key:`recent`,label:this.t(`palette.group.recent`),items:n})}for(let n of $n){let r=this.items.filter(e=>e.category===n);e&&(r=r.map((t,n)=>({item:t,at:n,s:nr(t,e)})).filter(e=>e.s>0).sort((e,t)=>t.s-e.s||e.at-t.at).map(e=>e.item)),r.length>0&&t.push({key:n,label:this.t(er[n]),items:r})}return e&&t.sort((t,n)=>nr(n.items[0],e)-nr(t.items[0],e)),t}render(){let e=this.list;if(!e)return;let t=this.groups();this.shown=t.flatMap(e=>e.items),this.selectedIndex=0;let n=0;e.replaceChildren(...t.map(e=>{let t=document.createElement(`div`);t.setAttribute(`role`,`group`),t.className=`tcw-cp-group`;let r=document.createElement(`div`);return r.className=`tcw-cp-heading`,r.id=`tcw-cp-${e.key}-${this.uid}`,r.setAttribute(`role`,`presentation`),r.textContent=e.label,t.setAttribute(`aria-labelledby`,r.id),t.append(r,...e.items.map(e=>this.row(e,n++))),t}));let r=this.shown.length===0?this.t(`palette.empty`):``;this.emptyEl&&(this.emptyEl.textContent=r),this.emptyEl?.toggleAttribute(`hidden`,this.shown.length>0),this.liveEl&&(this.liveEl.textContent=r),this.markSelection()}row(e,t){let n=document.createElement(`div`);n.className=`tcw-cp-row`,n.id=`tcw-cp-opt-${this.uid}-${t}`,n.dataset.id=e.id,n.setAttribute(`role`,`option`),n.classList.toggle(`tcw-on`,!!e.active);let r=document.createElement(`span`);if(r.className=`tcw-cp-label`,r.textContent=e.label,n.appendChild(r),e.shortcut){let t=document.createElement(`kbd`);t.className=`tcw-cp-key`,t.dir=`ltr`,t.textContent=e.shortcut,n.appendChild(t)}if(e.active){let e=document.createElement(`span`);e.className=`tcw-cp-check`,e.innerHTML=D(`check`,14),n.appendChild(e)}return n.addEventListener(`click`,()=>this.run(t)),n.addEventListener(`mousemove`,()=>{this.selectedIndex!==t&&(this.selectedIndex=t,this.markSelection())}),n}markSelection(){let e=this.list?.querySelectorAll(`.tcw-cp-row`)??[],t=null;e.forEach((e,n)=>{let r=n===this.selectedIndex;e.setAttribute(`aria-selected`,String(r)),e.classList.toggle(`tcw-selected`,r),r&&(t=e)});let n=t;n?(this.input?.setAttribute(`aria-activedescendant`,n.id),n.scrollIntoView?.({block:`nearest`})):this.input?.removeAttribute(`aria-activedescendant`)}run(e){let t=this.shown[e];if(t)switch(this.recents?.add(tr(t)),this.close(),t.category){case`indicator`:this.callbacks.onIndicator(t.id);break;case`chartType`:this.callbacks.onChartType(t.id);break;case`drawing`:this.callbacks.onDrawingTool(t.id);break;case`timeframe`:this.callbacks.onTimeframe(t.id);break;case`action`:this.callbacks.onAction(t.id);break}}onKeyDown(e,t){if(e.stopPropagation(),e.isComposing||e.keyCode===Qn)return;let n=(e.ctrlKey||e.metaKey)&&e.key.toLowerCase()===`k`;if(e.key===`Escape`||n){e.preventDefault(),this.close();return}if(j(e,t),e.target!==this.input)return;let r=this.shown.length;if(e.key===`ArrowDown`||e.key===`ArrowUp`){if(e.preventDefault(),r===0)return;this.selectedIndex=(this.selectedIndex+(e.key===`ArrowDown`?1:-1)+r)%r,this.markSelection()}else e.key===`Enter`&&(e.preventDefault(),e.repeat||this.run(this.selectedIndex))}},ar=20,or=1e3,sr=new Set,cr={stock:1,stocks:1,equity:1,share:1,shares:1,"cổ phiếu":1,株式:1,株:1,股票:1,주식:1,futures:2,future:2,derivative:2,derivatives:2,option:2,options:2,"phái sinh":2,先物:2,期货:2,期貨:2,선물:2,warrant:2,warrants:2,"covered warrant":2,"chứng quyền":2,index:3,indices:3,"chỉ số":3,指数:3,指數:3,지수:3,fund:3,funds:3,etf:3,etfs:3,"chứng chỉ quỹ":3,crypto:4,cryptocurrency:4,perpetual:4,perpetuals:4,perp:4,perps:4,"tiền mã hóa":4,"tiền mã hoá":4,"tiền điện tử":4,暗号資産:4,仮想通貨:4,加密货币:4,加密貨幣:4,数字货币:4,數字貨幣:4,虚拟货币:4,虛擬貨幣:4,암호화폐:4,가상자산:4,가상화폐:4,forex:5,fx:5,currency:5,"ngoại hối":5,為替:5,外国為替:5,外汇:5,外匯:5,외환:5,bond:5,bonds:5,"trái phiếu":5},lr=1e3,ur=new Map,dr=/i\u0307|\u0131/g;function fr(e){if(typeof e!=`string`)return``;let t=ur.get(e);return t===void 0&&(t=e.trim().normalize(`NFC`).toLowerCase().replace(dr,`i`),ur.size>=lr&&ur.clear(),ur.set(e,t)),t}function pr(e){let t=fr(e);return t?Object.prototype.hasOwnProperty.call(cr,t)?cr[t]:1+mr(t)%5:0}function mr(e){let t=2166136261;for(let n of e)t^=n.codePointAt(0),t=Math.imul(t,16777619)>>>0;return t}function hr(e){let{ticker:t}=Yt(e),n=/[\p{L}\p{N}]/u.exec(t);return n?n[0].toUpperCase():``}function gr(e,t){let n=en(t?.logo);if(!n||sr.has(n))return vr(e,t);let r=document.createElement(`img`);return r.className=`tcw-ss-badge`,r.alt=``,r.width=ar,r.height=ar,r.draggable=!1,r.setAttribute(`aria-hidden`,`true`),r.setAttribute(`loading`,`lazy`),r.setAttribute(`decoding`,`async`),r.setAttribute(`referrerpolicy`,`no-referrer`),r.addEventListener(`error`,()=>{_r(n),r.replaceWith(vr(e,t))},{once:!0}),r.src=n,r}function _r(e){sr.size>=or&&sr.clear(),sr.add(e)}function vr(e,t){let n=document.createElement(`span`);return n.className=`tcw-ss-badge`,n.setAttribute(`aria-hidden`,`true`),n.dataset.kind=String(pr(t?.type)),n.textContent=hr(e),n}var yr=180,br=150,xr=50;function Sr(e){return{upper:e.toUpperCase(),folded:Er(e)}}function Cr(e,t,n){return Math.max(wr(e.toUpperCase(),n.upper),Tr(t,n.folded))}function wr(e,t){if(e===t)return 1e3;if(e.startsWith(t))return 500+(50-Math.min(50,e.length-t.length));if(e.includes(t))return 200+(50-Math.min(50,e.length-t.length));let n=0,r=-1,i=0;for(let a=0;a<e.length&&n<t.length;a++)e[a]===t[n]&&(r>=0&&(i+=a-r-1),r=a,n++);return n<t.length?0:100-Math.min(99,i)}function Tr(e,t){if(!e||!t)return 0;if(e.startsWith(t))return yr;let n=e.indexOf(t);return n<0?0:br-Math.min(xr,n)}function Er(e){return e.normalize(`NFD`).replace(/\p{M}+/gu,``).replace(/[đĐ]/g,`D`).toUpperCase()}function Dr(e,t,n=0,r=e.length){let i=t?Or(e.toUpperCase(),t):new Set,a=``;for(let t=n;t<r;t++)a+=i.has(t)?`<mark>${O(e[t])}</mark>`:O(e[t]);return a}function Or(e,t){let n=new Set,r=e.indexOf(t);if(r>=0){for(let e=r;e<r+t.length;e++)n.add(e);return n}let i=0;for(let r=0;r<e.length&&i<t.length;r++)e[r]===t[i]&&(n.add(r),i++);return i<t.length?new Set:n}function kr(e,t){let n=document.createElement(`span`);n.className=`tcw-ss-symbol`,n.dir=`ltr`;let{venue:r}=Yt(e),i=(n,r,i)=>{let a=document.createElement(`span`);return a.className=n,a.innerHTML=Dr(e,t,r,i),a};return r&&n.appendChild(i(`tcw-ss-venue`,0,r.length)),n.appendChild(i(`tcw-ss-ticker`,r.length,e.length)),n}var Ar=fr,jr=2,Mr=1,Nr=class{el;kindsEl;exchangeEl;kinds=new Map;exchanges=new Map;kind=null;exchange=null;resize;constructor(e,t){this.t=e,this.onChange=t,this.el=document.createElement(`div`),this.el.className=`tcw-ss-filters`,this.el.hidden=!0,this.kindsEl=document.createElement(`div`),this.kindsEl.className=`tcw-ss-kinds`,this.kindsEl.setAttribute(`role`,`group`),this.kindsEl.setAttribute(`aria-label`,e(`symbolSearch.kinds`)),this.kindsEl.hidden=!0,this.kindsEl.addEventListener(`scroll`,()=>this.markMore(),{passive:!0}),this.resize=typeof ResizeObserver>`u`?null:new ResizeObserver(()=>this.markMore()),this.resize?.observe(this.kindsEl),this.exchangeEl=document.createElement(`select`),this.exchangeEl.className=`tcw-settings-select tcw-ss-exchange-filter`,this.exchangeEl.setAttribute(`aria-label`,e(`symbolSearch.exchange`)),this.exchangeEl.hidden=!0,this.exchangeEl.addEventListener(`change`,()=>{this.exchange=Ar(this.exchangeEl.value)||null,this.onChange(!1)}),this.el.append(this.kindsEl,this.exchangeEl)}see(e){let t=this.kinds.size,n=this.exchanges.size;for(let t of e)Pr(this.kinds,t?.type),Pr(this.exchanges,t?.exchange);this.kinds.size!==t&&this.renderKinds(),this.exchanges.size!==n&&this.renderExchanges(),this.kindsEl.hidden=this.kinds.size===0,this.exchangeEl.hidden=this.exchanges.size<jr,this.el.hidden=this.kindsEl.hidden&&this.exchangeEl.hidden,this.markMore()}destroy(){this.resize?.disconnect()}markMore(){let e=this.kindsEl,t=Math.abs(e.scrollLeft),n=e.scrollWidth-e.clientWidth,r=[t>Mr?`start`:``,t<n-Mr?`end`:``].filter(Boolean);r.length>0?e.dataset.more=r.join(` `):delete e.dataset.more}passes(e,t){return Fr(this.kind,Ar(e?.type),t)&&Fr(this.exchange,Ar(e?.exchange),t)}renderKinds(){let e=(e,t)=>{let n=document.createElement(`button`);return n.type=`button`,n.className=`tcw-ss-type`,n.textContent=t,e!==null&&(n.dir=`auto`),n.setAttribute(`aria-pressed`,String(this.kind===e)),n.addEventListener(`click`,()=>{this.kind=e;for(let e of this.kindsEl.children)e.setAttribute(`aria-pressed`,String(e===n));this.onChange(!0)}),n},t=[...this.kinds].map(([t,n])=>e(t,n));this.kindsEl.replaceChildren(e(null,this.t(`symbolSearch.allKinds`)),...t)}renderExchanges(){let e=(e,t)=>{let n=document.createElement(`option`);return n.value=e,n.textContent=t,e&&(n.dir=`auto`),n},t=[...this.exchanges.values()].map(t=>e(t,t));this.exchangeEl.replaceChildren(e(``,this.t(`symbolSearch.allExchanges`)),...t),this.exchangeEl.value=this.exchange===null?``:this.exchanges.get(this.exchange)??``}};function Pr(e,t){let n=Ar(t);n&&!e.has(n)&&e.set(n,t.trim())}function Fr(e,t,n){return e===null||t===e||n&&t===``}var Ir=229,Lr=1,Rr=class{backdrop=null;input=null;list=null;results=null;live=null;columns=null;filters=null;mode=null;given=[];rows=[];rowsGiven=!1;shown=[];compared=[];way=``;selectedIndex=0;searchFn=null;searchTimer=null;searchAbort=null;status=`idle`;pickOnResults=!1;heard=new Map;givenInfo=new Map;foldedNames=new Map;returnFocus=null;uid=Lr++;constructor(e,n=()=>document.body,r=t.t){this.callbacks=e,this.host=n,this.t=r}open(e){this.begin({kind:`search`,start:e})}openCompare(e){this.compared=e.compared,this.way=e.ways.some(t=>t.id===e.way)?e.way:e.ways[0]?.id??``,this.begin({kind:`compare`,start:e})}setCompared(e){if(this.compared=e,this.mode?.kind!==`compare`||!this.results)return;let t=this.results.contains(document.activeElement);this.renderList(),t&&!this.results.contains(document.activeElement)&&this.input?.focus()}close(){if(!this.backdrop)return;this.cancelSearch(),this.pickOnResults=!1,this.searchFn=null,this.backdrop.remove(),this.backdrop=this.input=this.list=this.results=this.live=this.columns=null,this.filters?.destroy(),this.filters=null,this.mode=null,this.callbacks.onClose();let e=this.returnFocus;this.returnFocus=null,e?.isConnected&&e.focus()}isOpen(){return this.backdrop!==null}isComparing(){return this.mode?.kind===`compare`}destroy(){this.close()}begin(e){this.backdrop&&this.close(),this.returnFocus=document.activeElement instanceof HTMLElement?document.activeElement:null,this.mode=e,this.searchFn=e.start.search??null,this.status=`idle`,this.learnGiven(e),this.build(e);let t=e.kind===`search`?e.start.query??``:``;this.input&&(this.input.value=t),t?(this.filter(),this.searchFn&&this.searchNow()):this.listGiven(),this.input?.focus()}learnGiven(e){let t=Gt(e.start.symbols);this.given=t.names,this.givenInfo=t.info,this.foldedNames=new Map;let n=e.start.current,r=e.kind===`search`?e.start.currentInfo:null;if(r&&typeof r==`object`&&n){let{description:e,logo:t}=Kt(r,n);this.givenInfo.set(n,Jt({symbol:n,description:e,logo:t},this.givenInfo.get(n)))}}infoOf(e){return Jt(this.givenInfo.get(e),this.heard.get(e))}build(e){let t=document.createElement(`div`);t.className=`tcw-modal-backdrop`;let n=!1;t.addEventListener(`pointerdown`,e=>{n=e.target===t}),t.addEventListener(`click`,e=>{e.target===t&&n&&this.close(),n=!1});let r=document.createElement(`div`);r.className=`tcw-modal tcw-ss${e.kind===`compare`?` tcw-ss--compare`:``}`,E(r,e.kind===`compare`?`compare`:`symbolSearch`),r.setAttribute(`role`,`dialog`),r.setAttribute(`aria-modal`,`true`),r.setAttribute(`aria-labelledby`,`tcw-ss-title-${this.uid}`),r.tabIndex=-1,r.addEventListener(`keydown`,e=>this.onKeyDown(e,r)),r.append(this.buildHeader(e),this.buildSearch()),e.kind===`compare`&&r.appendChild(this.buildWay(e.start));let i=new Nr(this.t,e=>{this.afterResults(!1),e&&this.input?.focus()}),a=document.createElement(`div`);a.className=`tcw-ss-list`,a.id=`tcw-ss-list-${this.uid}`,a.setAttribute(`role`,`listbox`);let o=document.createElement(`div`);o.className=`tcw-ss-results`;let s=this.buildColumns();o.append(s,a),o.addEventListener(`mousedown`,e=>{e.target.closest(`button`)||e.preventDefault()});let c=document.createElement(`div`);c.className=`tcw-ss-live tcw-visually-hidden`,c.setAttribute(`aria-live`,`polite`),r.append(i.el,o,c);let l=e.kind===`search`?e.start.hint:void 0;if(l){let e=document.createElement(`div`);e.className=`tcw-ss-foot`,e.textContent=l,r.appendChild(e)}t.appendChild(r),this.host().appendChild(t),this.backdrop=t,this.filters=i,this.columns=s,this.list=a,this.results=o,this.live=c}buildColumns(){let e=document.createElement(`div`);e.className=`tcw-ss-columns`,e.setAttribute(`aria-hidden`,`true`);let t=[``,this.t(`symbolSearch.symbol`),this.t(`symbolSearch.description`),this.t(`symbolSearch.type`),this.t(`symbolSearch.exchange`)];return e.append(...t.map(e=>this.tag(`tcw-ss-head`,e))),e}buildHeader(e){let t=document.createElement(`div`);t.className=`tcw-modal-header`;let n=document.createElement(`h3`);n.id=`tcw-ss-title-${this.uid}`,n.textContent=this.t(e.kind===`compare`?`compare.title`:`symbolSearch.title`);let r=document.createElement(`button`);return r.type=`button`,r.className=`tcw-modal-close`,r.setAttribute(`aria-label`,this.t(`common.close`)),r.innerHTML=D(`x`,16),r.addEventListener(`click`,()=>this.close()),t.append(n,r),t}buildSearch(){let e=document.createElement(`label`);e.className=`tcw-ss-search`,e.innerHTML=D(`search`,16);let t=document.createElement(`input`);return t.type=`search`,t.className=`tcw-ss-input`,t.placeholder=this.t(`symbolSearch.placeholder`),t.setAttribute(`aria-label`,this.t(`symbolSearch.placeholder`)),t.setAttribute(`role`,`combobox`),t.setAttribute(`aria-expanded`,`true`),t.setAttribute(`aria-controls`,`tcw-ss-list-${this.uid}`),t.setAttribute(`aria-autocomplete`,`list`),t.autocomplete=`off`,t.spellcheck=!1,t.addEventListener(`input`,()=>this.filter()),e.appendChild(t),this.input=t,e}buildWay(e){let t=document.createElement(`label`);t.className=`tcw-ss-way`;let n=document.createElement(`span`);n.textContent=this.t(`compare.addAs`);let r=document.createElement(`select`);r.className=`tcw-settings-select tcw-ss-way-select`;for(let t of e.ways){let e=document.createElement(`option`);e.value=t.id,e.textContent=t.label,r.appendChild(e)}return r.value=this.way,r.addEventListener(`change`,()=>{this.way=r.value}),t.append(n,r),t}listGiven(){this.rows=this.given.map(e=>({symbol:e,score:0,info:this.infoOf(e)})),this.rowsGiven=!0,this.afterResults(!0)}filter(){this.pickOnResults=!1;let e=this.input?.value.trim()??``;if(this.searchFn&&e){this.scheduleSearch(e);return}if(this.cancelSearch(),this.status=`idle`,!e){this.listGiven();return}let t=Sr(e);this.rows=this.given.map(e=>{let n=this.infoOf(e);return{symbol:e,score:Cr(e,this.foldedName(n?.description),t),info:n}}).filter(e=>e.score>0).sort((e,t)=>t.score-e.score),this.rowsGiven=!0,this.afterResults(!1)}foldedName(e){if(!e)return``;let t=this.foldedNames.get(e);return t===void 0&&(t=Er(e),this.foldedNames.set(e,t)),t}scheduleSearch(e){this.searchTimer!==null&&clearTimeout(this.searchTimer),this.searchTimer=setTimeout(()=>{this.searchTimer=null,this.runSearch(e)},150)}searchNow(){this.searchTimer!==null&&clearTimeout(this.searchTimer),this.searchTimer=null,this.runSearch(this.input?.value.trim()??``)}async runSearch(e){let t=this.searchFn;if(!t)return;this.searchAbort?.abort();let n=new AbortController;this.searchAbort=n,this.status=`searching`,this.shown.length===0&&this.renderList();try{let r=await t(e,n.signal);if(n.signal.aborted)return;let i=qt(r);for(let e of i)this.heard.set(e.symbol,Jt(this.heard.get(e.symbol),e));this.rows=i.map(e=>({symbol:e.symbol,score:0,info:this.infoOf(e.symbol)})),this.status=`idle`}catch{if(n.signal.aborted)return;this.rows=[],this.status=`failed`}this.rowsGiven=!1,this.afterResults(!1),this.pickOnResults&&(this.pickOnResults=!1,this.pick(0))}cancelSearch(){this.searchTimer!==null&&clearTimeout(this.searchTimer),this.searchTimer=null,this.searchAbort?.abort(),this.searchAbort=null}afterResults(e){let t=this.listableRows();this.filters?.see(t.map(e=>e.info)),this.shown=this.visibleRows(t);let n=e?this.shown.findIndex(e=>e.symbol===this.mode?.start.current):-1;this.selectedIndex=n>=0&&n<this.listedCount()?n:0,this.renderList()}listedCount(){return Math.min(this.shown.length,200)}listableRows(){if(this.mode?.kind!==`compare`)return this.rows;let e=this.mode.start.current;return this.rows.filter(t=>t.symbol!==e)}visibleRows(e){let t=this.filters;return t?e.filter(e=>t.passes(e.info,this.rowsGiven)):[...e]}renderList(){let e=this.list,t=this.results;if(!e||!t)return;let n=(this.input?.value??``).trim(),r=this.mode?.kind===`compare`,i=[];if(r&&!n&&this.compared.length>0){let t=this.heading(this.t(`compare.onChart`),`added`),n=document.createElement(`div`);n.className=`tcw-ss-added`,n.setAttribute(`role`,`group`),n.setAttribute(`aria-labelledby`,t.id),n.append(...this.compared.map(e=>this.addedRow(e)));let r=this.heading(this.t(`compare.symbols`),`symbols`);r.hidden=this.shown.length===0,i.push(t,n,r),e.setAttribute(`aria-labelledby`,r.id)}else e.setAttribute(`aria-labelledby`,`tcw-ss-title-${this.uid}`);let a=n.toUpperCase(),o=new Set(this.compared.map(e=>e.symbol)),s=this.shown.slice(0,200);e.replaceChildren(...s.map((e,t)=>this.row(e,t,a,r&&o.has(e.symbol))));let c=this.shown.length===0?this.emptyNote(n,r):this.moreNote(this.shown.length-s.length);t.replaceChildren(...this.columns?[this.columns]:[],...i,e,...c?[c]:[]),this.live&&(this.live.textContent=this.shown.length===0?c?.textContent??``:``),this.markSelection()}emptyNote(e,t){let n;if(this.status===`searching`)n=this.t(`symbolSearch.searching`);else if(this.status===`failed`)n=this.t(`symbolSearch.failed`);else if(t&&!e){if(this.compared.length>0)return null;n=this.t(`compare.empty`)}else n=this.t(`symbolSearch.empty`);let r=document.createElement(`div`);return r.className=`tcw-ss-empty`,r.textContent=n,r}moreNote(e){if(e<=0)return null;let n=document.createElement(`div`);return n.className=`tcw-ss-more`,n.textContent=t.r(this.t(`symbolSearch.more`),{count:e}),n}heading(e,t){let n=document.createElement(`div`);return n.className=`tcw-ss-heading`,n.id=`tcw-ss-${t}-${this.uid}`,n.textContent=e,n}row(e,t,n,r){let i=document.createElement(`div`);i.className=`tcw-ss-row`,i.id=`tcw-ss-opt-${this.uid}-${t}`,i.dataset.symbol=e.symbol,i.setAttribute(`role`,`option`);let a=this.mode?.kind===`search`&&e.symbol===this.mode.start.current;i.classList.toggle(`tcw-current`,a),i.classList.toggle(`tcw-on-chart`,r),a&&i.setAttribute(`aria-current`,`true`);let o=this.tag(`tcw-ss-kind`,e.info?.type?.trim()??``),s=this.tag(`tcw-ss-exchange`,e.info?.exchange?.trim()??``);if(o.dir=s.dir=`auto`,i.append(gr(e.symbol,e.info),kr(e.symbol,n),this.descriptionCell(e),o,s),a||r){let e=document.createElement(`span`);e.className=`tcw-ss-check`,e.innerHTML=D(`check`,14),i.appendChild(e)}return r&&i.appendChild(this.tag(`tcw-visually-hidden`,this.t(`compare.onChart`))),i.addEventListener(`click`,()=>this.pick(t)),i.addEventListener(`mousemove`,()=>{this.selectedIndex!==t&&(this.selectedIndex=t,this.markSelection())}),i}descriptionCell(e){let t=document.createElement(`span`);t.className=`tcw-ss-desc-cell`;let n=e.info?.description&&e.info.description!==e.symbol?e.info.description:``;if(n){let e=this.tag(`tcw-ss-desc`,n);e.dir=`auto`,t.appendChild(e)}return t}addedRow(e){let n=document.createElement(`div`);if(n.className=`tcw-ss-added-row`,n.setAttribute(`role`,`presentation`),e.color){let t=document.createElement(`span`);t.className=`tcw-ss-swatch`,t.style.background=e.color,n.appendChild(t)}let r=document.createElement(`span`);r.className=`tcw-ss-way-cell`,r.appendChild(this.tag(`tcw-ss-way-label`,e.way));let i=document.createElement(`button`);i.type=`button`,i.className=`tcw-ss-remove`;let a=t.r(this.t(`compare.remove`),{symbol:e.symbol});return i.title=a,i.setAttribute(`aria-label`,a),i.innerHTML=D(`x`,12),i.addEventListener(`click`,()=>{this.mode?.kind===`compare`&&this.mode.start.onRemove(e.id)}),n.append(kr(e.symbol,``),r,i),n}tag(e,t){let n=document.createElement(`span`);return n.className=e,n.textContent=t,n}markSelection(){let e=this.list?.querySelectorAll(`.tcw-ss-row`)??[],t=null;e.forEach((e,n)=>{let r=n===this.selectedIndex;e.setAttribute(`aria-selected`,String(r)),e.classList.toggle(`tcw-selected`,r),r&&(t=e)});let n=t;n?(this.input?.setAttribute(`aria-activedescendant`,n.id),n.scrollIntoView?.({block:`nearest`})):this.input?.removeAttribute(`aria-activedescendant`)}pick(e){let t=this.shown[e],n=this.mode;if(!t||!n)return;if(n.kind===`compare`){this.selectedIndex=e,this.markSelection(),n.start.onAdd(t.symbol,this.way);return}let r=n.start.onPick??this.callbacks.onPick;this.close(),r(t.symbol)}onKeyDown(e,t){if(e.stopPropagation(),e.isComposing||e.keyCode===Ir)return;if(e.key===`Escape`){e.preventDefault(),this.close();return}if(j(e,t),e.target!==this.input)return;let n=this.listedCount();if(e.key===`ArrowDown`||e.key===`ArrowUp`){if(e.preventDefault(),n===0)return;this.selectedIndex=(this.selectedIndex+(e.key===`ArrowDown`?1:-1)+n)%n,this.markSelection()}else if(e.key===`Enter`){if(e.preventDefault(),e.repeat&&this.mode?.kind===`compare`)return;if(this.searchTimer!==null||this.status===`searching`){this.pickOnResults=!0,this.searchTimer!==null&&this.searchNow();return}this.pick(this.selectedIndex)}}},zr=229,Br={"Search & navigation":`hotkeys.group.searchNavigation`,"Chart manipulation":`hotkeys.group.chartManipulation`,"Touch (mobile / tablet)":`hotkeys.group.touch`,Keyboard:`hotkeys.group.keyboard`,Drawing:`hotkeys.group.drawing`,More:`hotkeys.group.more`},B=Yn,Vr=[{title:`Search & navigation`,entries:[{keys:[B,`K`],label:`hotkeys.commandPalette`,feature:`hotkeys.commandPalette`},{keys:[B,`P`],label:`hotkeys.symbolSearch`,feature:`hotkeys.symbolSearch`},{keys:[`Alt`,`G`],label:`hotkeys.goToDate`,feature:`hotkeys.goToDate`},{keys:[`Alt`,`I`],label:`hotkeys.invertScale`,feature:`hotkeys.invertScale`},{keys:[`Alt`,`R`],label:`chartMenu.resetView`,feature:`hotkeys.resetView`},{keys:[B,`S`],label:`hotkeys.saveLayout`,feature:`hotkeys.save`},{keys:[`0–9`],label:`hotkeys.typeInterval`,feature:`intervalTyping`},{keys:[`A–Z`],label:`hotkeys.typeSymbol`,feature:`symbolTyping`},{keys:[`?`],label:`hotkeys.showSheet`,feature:`hotkeys.help`}]},{title:`Chart manipulation`,entries:[{keys:[`key.drag`],label:`hotkeys.pan`},{keys:[B,`key.drag`],label:`hotkeys.boxSelect`},{keys:[B,`key.click`],label:`hotkeys.toggleSelect`},{keys:[`Shift`,`key.drag`],label:`hotkeys.measure`},{keys:[`key.drag`,`key.priceAxis`],label:`hotkeys.scalePrice`},{keys:[`key.drag`,`key.timeAxis`],label:`hotkeys.zoomTime`},{keys:[`key.doubleClick`,`key.priceAxis`],label:`hotkeys.autoScale`},{keys:[`key.doubleClick`,`key.timeAxis`],label:`hotkeys.fit`},{keys:[`key.scroll`],label:`hotkeys.zoomCursor`}]},{title:`Touch (mobile / tablet)`,entries:[{keys:[`key.oneFinger`,`key.drag`],label:`hotkeys.touchPan`},{keys:[`key.twoFingers`,`key.pinch`],label:`hotkeys.pinch`},{keys:[`key.longPress`],label:`hotkeys.longPress`},{keys:[`key.drag`,`key.axisStrip`],label:`hotkeys.touchAxis`}]},{title:`Keyboard`,entries:[{keys:[`←`,`→`],label:`hotkeys.panBar`},{keys:[`+`,`−`],label:`hotkeys.zoomInOut`},{keys:[`Home`],label:`hotkeys.toStart`},{keys:[`End`],label:`hotkeys.toEnd`},{keys:[`F`],label:`hotkeys.fit`}]},{title:`Drawing`,entries:[{keys:[B,`Z`],label:`hotkeys.undo`},{keys:[B,`Shift`,`Z`],label:`hotkeys.redo`},{keys:[`Esc`],label:`hotkeys.cancelDrawing`},{keys:[B,`C`],label:`hotkeys.copy`},{keys:[B,`V`],label:`hotkeys.paste`},{keys:[`key.rightClick`],label:`hotkeys.drawingMenu`},{keys:[`key.doubleClick`],label:`hotkeys.drawingSettings`},{keys:[B,`G`],label:`hotkeys.group`},{keys:[B,`Shift`,`G`],label:`hotkeys.ungroup`},{keys:[B,`]`,`[`],label:`hotkeys.orderStep`},{keys:[B,`Shift`,`]`,`[`],label:`hotkeys.orderEnd`},{keys:[`Enter`],label:`hotkeys.finishPath`},{keys:[`Alt`,`T`],label:`tool.trendLine`,feature:`hotkeys.tools`},{keys:[`Alt`,`H`],label:`tool.horizontalLine`,feature:`hotkeys.tools`},{keys:[`Alt`,`J`],label:`tool.horizontalRay`,feature:`hotkeys.tools`},{keys:[`Alt`,`V`],label:`tool.verticalLine`,feature:`hotkeys.tools`},{keys:[`Alt`,`C`],label:`tool.crossLine`,feature:`hotkeys.tools`},{keys:[`Alt`,`F`],label:`tool.fibRetracement`,feature:`hotkeys.tools`}]}],Hr=0,Ur=class{backdrop=null;bodyEl=null;searchEl=null;liveEl=null;groups=[];returnFocus=null;uid=++Hr;constructor(e,t,n=()=>document.body){this.callbacks=e,this.t=t,this.host=n}open(e={}){if(this.backdrop)return;this.returnFocus=document.activeElement instanceof HTMLElement?document.activeElement:null;let t=e.isOn??(()=>!0),n=new Set((e.extra??[]).map(e=>e.keys.join(`+`).toLowerCase()));this.groups=Vr.map(e=>({title:e.title,entries:e.entries.filter(e=>(!e.feature||t(e.feature))&&!n.has(e.keys.join(`+`).toLowerCase()))})).filter(e=>e.entries.length>0),e.extra&&e.extra.length>0&&this.groups.push({title:`More`,entries:[...e.extra]}),this.build(t(`hotkeys.help`)),this.render(),this.searchEl?.focus()}close(){if(!this.backdrop)return;this.backdrop.remove(),this.backdrop=this.bodyEl=this.searchEl=this.liveEl=null,this.callbacks.onClose();let e=this.returnFocus;this.returnFocus=null,e?.isConnected&&e.focus()}isOpen(){return this.backdrop!==null}destroy(){this.close()}build(e){let t=document.createElement(`div`);t.className=`tcw-modal-backdrop`;let n=!1;t.addEventListener(`pointerdown`,e=>{n=e.target===t}),t.addEventListener(`click`,e=>{e.target===t&&n&&this.close(),n=!1});let r=document.createElement(`div`);r.className=`tcw-modal tcw-hotkey-sheet`,r.setAttribute(`role`,`dialog`),r.setAttribute(`aria-modal`,`true`),r.setAttribute(`aria-labelledby`,`tcw-hotkey-title-${this.uid}`),r.tabIndex=-1,r.addEventListener(`keydown`,e=>{if(e.stopPropagation(),e.key===`Escape`&&!e.isComposing&&e.keyCode!==zr){e.preventDefault(),this.close();return}j(e,r)});let i=document.createElement(`div`);i.className=`tcw-modal-header`;let a=document.createElement(`h3`);a.id=`tcw-hotkey-title-${this.uid}`,a.textContent=this.t(`hotkeys.title`);let o=document.createElement(`button`);o.type=`button`,o.className=`tcw-modal-close`,o.setAttribute(`aria-label`,this.t(`hotkeys.close`)),o.innerHTML=D(`x`,16),o.addEventListener(`click`,()=>this.close()),i.append(a,o);let s=document.createElement(`label`);s.className=`tcw-ss-search tcw-hotkey-search`,s.innerHTML=D(`search`,16);let c=document.createElement(`input`);c.type=`search`,c.placeholder=this.t(`hotkeys.search`),c.setAttribute(`aria-label`,this.t(`hotkeys.search`)),c.autocomplete=`off`,c.spellcheck=!1,c.addEventListener(`input`,()=>this.render()),s.appendChild(c);let l=document.createElement(`div`);l.className=`tcw-hotkey-body`;let u=document.createElement(`div`);if(u.className=`tcw-hotkey-live tcw-visually-hidden`,u.setAttribute(`aria-live`,`polite`),r.append(i,s,l,u),e){let e=document.createElement(`div`);e.className=`tcw-hotkey-foot`,e.textContent=this.t(`hotkeys.footer`),r.appendChild(e)}t.appendChild(r),this.host().appendChild(t),this.backdrop=t,this.bodyEl=l,this.searchEl=c,this.liveEl=u}render(){let e=this.bodyEl;if(!e)return;let t=Xn((this.searchEl?.value??``).trim()),n=[];for(let e of this.groups){let r=t?e.entries.filter(e=>this.matches(e,t)):e.entries;if(r.length===0)continue;let i=document.createElement(`section`);i.className=`tcw-hotkey-group`;let a=document.createElement(`div`);a.className=`tcw-hotkey-heading`;let o=Br[e.title];a.textContent=o?this.t(o):e.title,i.append(a,...r.map(e=>this.row(e))),n.push(i)}if(this.liveEl&&(this.liveEl.textContent=n.length===0?this.t(`hotkeys.noMatch`):``),n.length===0){let t=document.createElement(`div`);t.className=`tcw-hotkey-empty`,t.textContent=this.t(`hotkeys.noMatch`),e.replaceChildren(t);return}let r=document.createElement(`div`);r.className=`tcw-hotkey-columns`,r.append(...n),e.replaceChildren(r)}label(e){return`text`in e?e.text:this.t(e.label)}keyText(e){return e.startsWith(`key.`)?this.t(e):e}matches(e,t){return Xn(this.label(e)).includes(t)?!0:Xn(e.keys.map(e=>this.keyText(e)).join(`+`)).includes(t)}row(e){let t=document.createElement(`div`);t.className=`tcw-hotkey-row`;let n=document.createElement(`span`);n.className=`tcw-hotkey-label`,n.textContent=this.label(e);let r=document.createElement(`span`);return r.className=`tcw-hotkey-keys`,r.dir=`ltr`,e.keys.forEach((e,t)=>{if(t>0){let e=document.createElement(`span`);e.className=`tcw-hotkey-sep`,e.textContent=`+`,r.appendChild(e)}let n=e.startsWith(`key.`),i=document.createElement(n?`span`:`kbd`);i.className=n?`tcw-hotkey-gesture`:`tcw-hotkey-key`,i.textContent=this.keyText(e),r.appendChild(i)}),t.append(n,r),t}},Wr={selectHint:`Click a bar to start the replay`,random:`Random bar`,realtime:`Back to realtime`,barsPerSecond:`bars/s`,play:`Play`,pause:`Pause`,stepBack:`Step back (Shift+←)`,stepForward:`Step forward (Shift+→)`,replay:`Replay`,position:`Replay position`,speed:`Speed`,step:`Step`},Gr=[1,2,3,5,10,25,50],Kr=class{root=null;scrubber=null;progressLabel=null;playBtn=null;realtimeBtn=null;state=`stopped`;mode=`select`;ended=!1;total=0;speed=5;steps=[];step=`bar`;labels;constructor(e,t={}){this.callbacks=e,this.labels={...Wr,...t}}mount(e,t){this.root||(this.total=Math.max(0,t.total),this.speed=t.speed??5,this.steps=t.steps??[],this.step=t.step??`bar`,this.state=`paused`,this.mode=t.mode??`select`,this.root=document.createElement(`div`),this.root.className=`tcw-replay-bar`,E(this.root,`replay`),this.root.setAttribute(`role`,`toolbar`),this.root.setAttribute(`aria-label`,this.labels.replay),this.root.innerHTML=this.markup(),e.appendChild(this.root),this.wireEvents(),this.syncUi())}unmount(){this.root?.remove(),this.root=null,this.scrubber=null,this.progressLabel=null,this.playBtn=null,this.realtimeBtn=null,this.state=`stopped`,this.ended=!1}isMounted(){return this.root!==null}getMode(){return this.mode}setMode(e){let t=!!this.root?.contains(document.activeElement);this.mode=e,this.syncUi(),t&&e===`replay`&&this.playBtn?.focus()}setState(e){this.state=e,this.syncUi()}setEnded(e){this.ended!==e&&(this.ended=e,this.syncUi())}setProgress(e,t){this.total=t,this.scrubber&&(this.scrubber.max=String(Math.max(0,t-1)),this.scrubber.value=String(e)),this.progressLabel&&(this.progressLabel.textContent=`${Math.min(e+1,t)} / ${t}`)}destroy(){this.unmount()}markup(){let e=this.labels,t=Gr.map(t=>`<option value="${t}"${t===this.speed?` selected`:``}>${t} ${O(e.barsPerSecond)}</option>`).join(``);return`
7430
- <span class="tcw-replay-group" data-mode="select">
7431
- <span class="tcw-replay-hint" role="status">${Zr()}${O(e.selectHint)}</span>
7432
- <button class="tcw-replay-text-btn" data-act="random">${O(e.random)}</button>
7625
+ `,Fe=`toolbar,sidebar,statusBar,dock,alerts,objectTree,symbolInfo,symbolSearch,settings,indicatorSettings,drawingSettings,dataWindow,commandPalette,hotkeySheet,goToDate,replay,screenshot,copyImage,shareView,autoFib,themeToggle,fullscreen,accountPanel,orderTicket,bracketOrders,depthLadder,layouts,indicatorTemplates,compare,indicatorLegend,navigation,customTimeframes,intervalTyping,symbolTyping,dragDropImport,hotkeys,toasts,toolbar.symbol,toolbar.symbolInfo,toolbar.timeframes,toolbar.timeframeMenu,toolbar.chartType,toolbar.indicators,toolbar.layouts,toolbar.replay,toolbar.bracketOrders,toolbar.depthLadder,toolbar.accountPanel,toolbar.objectTree,toolbar.alerts,toolbar.screenshot,toolbar.settings,toolbar.themeToggle,toolbar.fullscreen,toolbar.compare,toolbar.undo,toolbar.redo,toolbar.trade,sidebar.cursor,sidebar.favorites,sidebar.lines,sidebar.fibonacci,sidebar.patterns,sidebar.forecasting,sidebar.annotation,sidebar.style,sidebar.magnet,sidebar.eraser,sidebar.zoomArea,sidebar.stayInDrawing,sidebar.undo,sidebar.redo,sidebar.clear,sidebar.lockAll,sidebar.hideAll,dock.watchlist,dock.alerts,dock.objectTree,dock.dataWindow,dock.symbolInfo,dock.depthLadder,statusBar.range,statusBar.goToDate,statusBar.market,statusBar.connection,statusBar.symbol,statusBar.clock,statusBar.scale,statusBar.rangeTimeframe,indicatorLegend.values,indicatorLegend.visibility,indicatorLegend.settings,indicatorLegend.remove,indicatorLegend.more,pane.move,pane.collapse,pane.maximize,navigation.zoom,navigation.scroll,navigation.reset,menu.chart,menu.chart.alert,menu.chart.order,menu.chart.orderTicket,menu.chart.horizontalLine,menu.chart.resetView,menu.chart.drawings,menu.chart.exportData,menu.chart.settings,menu.chart.scale,menu.chart.goToDate,menu.chart.paneScale,menu.priceAxisAdd,menu.chart.indicators,menu.chart.timezone,menu.drawing,menu.drawing.settings,menu.drawing.alert,menu.drawing.order,menu.drawing.group,menu.drawing.lock,menu.drawing.hide,menu.drawing.duplicate,menu.drawing.delete,selectionToolbar,hotkeys.commandPalette,hotkeys.symbolSearch,hotkeys.save,hotkeys.tools,hotkeys.invertScale,hotkeys.goToDate,hotkeys.help,hotkeys.resetView`.split(`,`),Ie=new Set(Fe),Le={toolbar:[`toolbar`],drawingTools:[`sidebar`,`drawingSettings`,`hotkeys.tools`,`menu.chart.horizontalLine`],settings:[`settings`],statusBar:[`statusBar`,`goToDate`],rangeBar:[`statusBar.range`,`statusBar.rangeTimeframe`,`goToDate`],indicatorLegend:[`indicatorLegend`],fullscreen:[`fullscreen`],alerts:[`alerts`],objectTree:[`objectTree`],accountPanel:[`accountPanel`,`orderTicket`],indicatorTemplates:[`indicatorTemplates`],intervalTyping:[`intervalTyping`],symbolInfo:[`symbolInfo`],navigation:[`navigation`],dragDropImport:[`dragDropImport`],customTimeframes:[`customTimeframes`]},Re={alert:[`alerts`,`menu.chart.alert`],buyLimit:[`menu.chart.order`],buyStop:[`menu.chart.order`],sellLimit:[`menu.chart.order`],sellStop:[`menu.chart.order`],orderTicket:[`orderTicket`,`menu.chart.orderTicket`],horizontalLine:[`menu.chart.horizontalLine`],resetView:[`menu.chart.resetView`],paste:[`menu.chart.drawings`],hideDrawings:[`menu.chart.drawings`],showDrawings:[`menu.chart.drawings`],removeDrawings:[`menu.chart.drawings`],removeIndicators:[`menu.chart.indicators`],settings:[`settings`,`menu.chart.settings`],exportData:[`menu.chart.exportData`],resetPriceScale:[`menu.chart.scale`],autoScale:[`menu.chart.scale`],invertScale:[`menu.chart.scale`],leftScale:[`menu.chart.scale`],regularScale:[`menu.chart.scale`],logScale:[`menu.chart.scale`],percentScale:[`menu.chart.scale`],indexedScale:[`menu.chart.scale`],labels:[`menu.chart.scale`],indicatorValueLabels:[`menu.chart.scale`],barCountdown:[`menu.chart.scale`],lines:[`menu.chart.scale`],highLowLines:[`menu.chart.scale`],lastPriceLine:[`menu.chart.scale`],goToDate:[`goToDate`,`menu.chart.goToDate`],timezone:[`menu.chart.timezone`],paneLog:[`menu.chart.paneScale`],paneInvert:[`menu.chart.paneScale`],panePercent:[`menu.chart.paneScale`]},ze={settings:[`drawingSettings`,`menu.drawing.settings`],alert:[`alerts`,`menu.drawing.alert`],front:[`menu.drawing.order`],forward:[`menu.drawing.order`],backward:[`menu.drawing.order`],back:[`menu.drawing.order`],group:[`menu.drawing.group`],ungroup:[`menu.drawing.group`],lock:[`menu.drawing.lock`],unlock:[`menu.drawing.lock`],hide:[`menu.drawing.hide`],duplicate:[`menu.drawing.duplicate`],delete:[`menu.drawing.delete`]},Be={symbolSearch:`symbolSearch`,compare:`compare`,goToDate:`goToDate`,saveLayout:`layouts`,alerts:`alerts`,objectTree:`objectTree`,hotkeys:`hotkeySheet`,screenshot:`screenshot`,copyImage:`copyImage`,toggleTheme:`themeToggle`,settings:`settings`,shareView:`shareView`,autoFib:`autoFib`,dataWindow:`dataWindow`,symbolInfo:`symbolInfo`};function Ve(e){if(typeof e!=`object`||!e||Array.isArray(e))return{};let t={},n=[];for(let[r,i]of Object.entries(e))Ie.has(r)&&typeof i==`boolean`?t[r]=i:n.push(r);return n.length>0&&console.warn(`[ChartWidget] Unknown or non-boolean feature switches left out: ${n.join(`, `)}.`),t}function He(e){let t=Object.fromEntries(Fe.map(e=>[e,!0]));for(let[n,r]of Object.entries(Le))if(e[n]===!1)for(let e of r)t[e]=!1;return{...t,...Ve(e.features)}}function Ue(e){return Fe.filter(t=>!e[t]).join(` `)}var We=`tcw-divider-off`,Ge=[{names:[`navigation.zoom`,`navigation.scroll`,`navigation.reset`],selector:`.tcw-nav`},{names:[`pane.move`,`pane.collapse`,`pane.maximize`],selector:`.tcw-pane-controls`},{names:[`indicatorLegend.visibility`,`indicatorLegend.settings`,`indicatorLegend.more`,`indicatorLegend.remove`],selector:`.tcw-ind-legend-actions`}];function Ke(){return[...Fe.map(e=>`.tcw-root[data-tcw-off~="${e}"] [data-tcw-part~="${e}"]{display:none!important}`),...Ge.map(({names:e,selector:t})=>`.tcw-root${e.map(e=>`[data-tcw-off~="${e}"]`).join(``)} ${t}{display:none!important}`),`.${We}{display:none!important}`].join(`
7626
+ `)}function E(e,...t){e.dataset.tcwPart=t.join(` `)}function qe(...e){return`data-tcw-part="${e.join(` `)}"`}function Je(e){return Object.prototype.hasOwnProperty.call(Be,e)?Be[e]:void 0}function Ye(e,t,n){let r=[...e.children],i=e=>e.classList.contains(t);for(let e of r)i(e)&&e.classList.remove(We);let a=e=>!e.hidden&&getComputedStyle(e).display!==`none`,o=e=>a(e)&&(e instanceof HTMLButtonElement||e.childElementCount>0||e.textContent!==``),s=!1,c=null;for(let e of r)if(n!==void 0&&e.classList.contains(n))c?.classList.add(We),c=null,s=!1;else if(i(e)){if(!a(e))continue;s?(c=e,s=!1):e.classList.add(We)}else o(e)&&(s=!0,c=null);c?.classList.add(We)}function Xe(e,t,n){let r=e.flatMap(e=>{if(e===`separator`)return[e];if(!(t[e.id]??[]).every(e=>n[e]))return[];if(!e.submenu)return[e];let r=Xe(e.submenu,t,n);return r.length>0?[{...e,submenu:r}]:[]});return r.filter((e,t)=>{if(e!==`separator`)return!0;let n=r.slice(0,t).some(e=>e!==`separator`),i=r[t+1];return n&&i!==void 0&&i!==`separator`})}var Ze=0,Qe=`tcw-styles`;function $e(){if(Ze++,Ze>1||document.getElementById(Qe))return;let e=document.createElement(`style`);e.id=Qe,e.textContent=`${je}
7627
+ ${Me}
7628
+ ${Ne}
7629
+ ${Pe}
7630
+ ${Ke()}`,document.head.insertBefore(e,document.head.firstChild)}function et(){if(Ze--,Ze>0)return;let e=document.getElementById(Qe);e&&e.remove()}var tt=(e,t)=>Object.prototype.hasOwnProperty.call(e,t)?e[t]:void 0;function D(e,t=14){let r=tt(n.UI_ICONS,e);return r?(0,n.iconSvg)(r,t):``}function nt(e,t=16){return(0,n.iconSvg)(tt(n.DRAWING_TOOL_ICONS,e)??n.UI_ICONS.penLine,t)}function rt(e,t=14){return(0,n.iconSvg)(tt(n.CHART_TYPE_ICONS,e)??n.UI_ICONS.barChart,t)}function O(e){return e.replace(/[&<>"']/g,e=>({"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&#39;`})[e])}var it=class{trigger;panel;_isOpen=!1;onOutsideClick;onEscapeKey;onTriggerClick;layer;align;onAway=()=>this.close();onScroll=e=>{e.target instanceof Node&&this.panel.contains(e.target)||this.close()};constructor(e,t={}){this.trigger=e,this.layer=t.layer??null,this.align=t.align??`left`,this.panel=document.createElement(`div`),this.panel.className=`tcw-dropdown`,this.panel.style.minWidth=t.width??`200px`,this.panel.style.display=`none`,this.layer?(this.layer().appendChild(this.panel),this.panel.addEventListener(`click`,()=>this.close())):(this.align===`right`?this.panel.style.insetInlineEnd=`0px`:this.panel.style.insetInlineStart=`0px`,e.style.position=`relative`,e.appendChild(this.panel)),this.onTriggerClick=()=>{this._isOpen?this.close():this.open()},this.onOutsideClick=e=>{let t=e.target;!this.trigger.contains(t)&&!this.panel.contains(t)&&this.close()},this.onEscapeKey=e=>{e.key===`Escape`&&this.close()},e.addEventListener(`click`,this.onTriggerClick)}setContent(e){this.panel.innerHTML=e}open(){if(!this._isOpen){if(this._isOpen=!0,this.layer){let e=this.layer();this.panel.parentElement!==e&&e.appendChild(this.panel)}this.panel.style.display=``,this.layer&&(this.place(),window.addEventListener(`resize`,this.onAway),document.addEventListener(`scroll`,this.onScroll,{capture:!0,passive:!0})),document.addEventListener(`pointerdown`,this.onOutsideClick),document.addEventListener(`keydown`,this.onEscapeKey)}}close(){this._isOpen&&(this._isOpen=!1,this.panel.style.display=`none`,document.removeEventListener(`pointerdown`,this.onOutsideClick),document.removeEventListener(`keydown`,this.onEscapeKey),window.removeEventListener(`resize`,this.onAway),document.removeEventListener(`scroll`,this.onScroll,{capture:!0}))}isOpen(){return this._isOpen}destroy(){this.close(),this.trigger.removeEventListener(`click`,this.onTriggerClick),this.panel.remove()}place(){ee(this.panel,this.trigger,this.align)}},at=4,ot=2,st=150,ct=`[role=menuitem], [role=menuitemcheckbox], [role=menuitemradio]`,lt=`(max-width: 640px)`,ut=`tcw:back`,dt=new Set;function ft(e,t,n,r=e,i=!1){let a=i?r-t>=0?r-t:e:e+t>n?r-t:e;return Math.max(0,Math.min(a,n-t))}function pt(e){return e.radio?`menuitemradio`:e.checked===void 0?`menuitem`:`menuitemcheckbox`}function mt(e){let t=`<span class="tcw-context-icon"></span>`;return e.radio?e.checked?`<span class="tcw-context-icon tcw-context-dot"></span>`:t:e.checked?D(`check`,14):e.icon&&D(e.icon,14)||t}var k=class e{el;onPick=null;onRemove=null;returnFocus=null;anchor=null;child=null;parent=null;hoverTimer=null;hoverItem=null;onDocPointer=e=>{let t=e.target;this.holds(t)||this.anchor?.contains(t)||this.close()};onWheel=e=>{this.holds(e.target)||this.close()};onAway=()=>this.close();constructor(e,t,n=``){this.host=e,this.backLabel=n,this.el=document.createElement(`div`),this.el.className=`tcw-context-menu`,this.el.setAttribute(`role`,`menu`),this.el.setAttribute(`aria-label`,t),this.el.hidden=!0,this.el.addEventListener(`keydown`,e=>this.onKeyDown(e)),e.appendChild(this.el)}open(e,t,n,r,i,a,o=t,s=!1){this.show(e,{x:t,y:n,xBack:o,yBack:n,before:s},r,i,a,!0)}openUnder(e,t,n,r=`start`,i=ot){let a=t.getBoundingClientRect(),o=this.host.getBoundingClientRect(),s=r===`end`!==this.rtl();this.open(e,a.left-o.left,a.bottom-o.top+i,n,t,void 0,a.right-o.left,s)}static closeAnchoredTo(e){let t=[...dt].filter(t=>t.anchor===e);for(let e of t)e.close();return t.length>0}static focusedAnchor(){return[...dt].find(e=>e.anchor!==null&&e.hasFocus())?.anchor??null}close(){if(this.clearHover(),this.child?.close(),this.el.hidden)return;dt.delete(this);let e=!this.parent||this.el.contains(document.activeElement);this.el.hidden=!0,this.onPick=null,this.onRemove=null,this.anchor?.setAttribute(`aria-expanded`,`false`),this.anchor=null,document.removeEventListener(`pointerdown`,this.onDocPointer,!0),document.removeEventListener(`wheel`,this.onWheel,{capture:!0}),window.removeEventListener(`resize`,this.onAway),window.removeEventListener(`blur`,this.onAway),e&&this.returnFocus?.isConnected&&this.returnFocus.focus({preventScroll:!0}),this.returnFocus=null}isOpen(){return!this.el.hidden}hasFocus(){return document.activeElement!==null&&this.holds(document.activeElement)}destroy(){this.close(),this.child?.destroy(),this.el.remove()}show(e,t,n,r,i,a){this.clearHover(),this.child?.close(),this.returnFocus=document.activeElement instanceof HTMLElement?document.activeElement:null,this.onPick=n,this.onRemove=i??null,this.anchor=r??null,this.anchor?.setAttribute(`aria-expanded`,`true`),this.el.replaceChildren(...e.map(e=>this.entry(e))),this.el.hidden=!1,dt.add(this);let o=this.host.getBoundingClientRect(),s=Math.min(this.host.clientWidth,window.innerWidth-o.left)-at,c=Math.min(this.host.clientHeight,window.innerHeight-o.top)-at;this.el.style.maxHeight=`${Math.max(0,c-this.frameHeight())}px`,this.el.style.left=`${ft(t.x,this.el.offsetWidth,s,t.xBack,t.before)}px`,this.el.style.top=`${ft(t.y,this.el.offsetHeight,c,t.yBack)}px`,document.addEventListener(`pointerdown`,this.onDocPointer,!0),document.addEventListener(`wheel`,this.onWheel,{capture:!0,passive:!0}),window.addEventListener(`resize`,this.onAway),window.addEventListener(`blur`,this.onAway);let l=this.revealChoice();a&&(l??this.items()[0])?.focus({preventScroll:!0})}frameHeight(){let e=getComputedStyle(this.el);if(e.boxSizing===`border-box`)return 0;let t=e=>parseFloat(e)||0;return t(e.paddingTop)+t(e.paddingBottom)+t(e.borderTopWidth)+t(e.borderBottomWidth)}revealChoice(){let e=this.el.querySelector(`[role=menuitemradio][aria-checked=true]`);return!e||e.offsetTop+e.offsetHeight<=this.el.clientHeight?null:(this.el.scrollTop=e.offsetTop-(this.el.clientHeight-e.offsetHeight)/2,e)}rtl(){return this.host.closest(`[dir]`)?.getAttribute(`dir`)===`rtl`}holds(e){return this.el.contains(e)||(this.child?.holds(e)??!1)}entry(e){if(e===`separator`){let e=document.createElement(`div`);return e.className=`tcw-context-sep`,e.setAttribute(`role`,`separator`),e}let t=document.createElement(`button`);t.type=`button`,t.className=`tcw-context-item${e.danger?` tcw-context-danger`:``}`,t.setAttribute(`role`,pt(e)),(e.radio||e.checked!==void 0)&&t.setAttribute(`aria-checked`,String(e.checked??!1)),t.tabIndex=-1,t.dataset.id=e.id,t.innerHTML=mt(e);let n=document.createElement(`span`);n.className=`tcw-context-label`,n.textContent=e.label,t.appendChild(n),this.appendEnd(t,e);let r=e.submenu;return t.addEventListener(`pointermove`,n=>{n.pointerType!==`touch`&&this.hover(t,e.label,r)}),t.addEventListener(`click`,()=>{r?this.openSubmenu(t,e.label,r,!0):this.pick(e.id)}),e.remove?this.removableRow(t,e.remove):t}appendEnd(e,t){if(t.shortcut){e.setAttribute(`aria-keyshortcuts`,t.shortcut);let n=document.createElement(`kbd`);n.className=`tcw-context-key`,n.setAttribute(`aria-hidden`,`true`),n.textContent=t.shortcut,e.appendChild(n)}t.submenu&&(e.setAttribute(`aria-haspopup`,`menu`),e.setAttribute(`aria-expanded`,`false`),e.insertAdjacentHTML(`beforeend`,D(`chevronRight`,12)),e.lastElementChild?.classList.add(`tcw-context-more`))}removableRow(e,t){e.setAttribute(`aria-keyshortcuts`,`Delete`);let n=document.createElement(`button`);n.type=`button`,n.className=`tcw-context-remove`,n.tabIndex=-1,n.setAttribute(`aria-hidden`,`true`),n.title=t,n.innerHTML=D(`x`,12),n.addEventListener(`click`,()=>this.remove(e));let r=document.createElement(`div`);return r.className=`tcw-context-row`,r.setAttribute(`role`,`none`),r.append(e,n),r}openSubmenu(e,t,n,r){this.clearHover();let i=this.child??this.makeChild();if(i.isOpen()&&i.anchor===e){r&&i.items()[0]?.focus({preventScroll:!0});return}i.close(),i.el.setAttribute(`aria-label`,t);let a=this.host.getBoundingClientRect(),o=e.getBoundingClientRect(),s={x:o.right-a.left,y:o.top-a.top,xBack:o.left-a.left,yBack:o.bottom-a.top,before:this.rtl()},c=window.matchMedia?.(lt).matches??!1,l=c?[{id:ut,label:t,icon:`chevronLeft`},`separator`,...n]:n;i.show(l,s,e=>{e!==ut&&this.pick(e)},e,e=>this.onRemove?.(e),r);let u=c?i.el.querySelector(`[data-id="${ut}"]`):null;u?.classList.add(`tcw-context-back`),u&&this.backLabel&&u.setAttribute(`aria-label`,`${this.backLabel}: ${t}`),i.returnFocus=e}makeChild(){let t=new e(this.host,``,this.backLabel);return t.parent=this,t.el.addEventListener(`pointerenter`,()=>this.clearHover()),this.child=t,t}hover(e,t,n){if(this.hoverTimer!==null&&this.hoverItem===e)return;this.clearHover();let r=this.child?.isOpen()?this.child.anchor:null;(n?r===e:r===null)||(this.hoverItem=e,this.hoverTimer=setTimeout(()=>{this.hoverTimer=null,this.hoverItem=null,n?this.openSubmenu(e,t,n,!1):this.child?.close()},st))}clearHover(){this.hoverItem=null,this.hoverTimer!==null&&(clearTimeout(this.hoverTimer),this.hoverTimer=null)}remove(e){let t=e.dataset.id,n=e.closest(`.tcw-context-row`);if(!t||!n)return;let r=this.items().indexOf(e);this.onRemove?.(t),n.remove();let i=[...this.el.children].filter((e,t,n)=>e.classList.contains(`tcw-context-sep`)&&(t===0||t===n.length-1||n[t-1].classList.contains(`tcw-context-sep`)));for(let e of i)e.remove();let a=this.items();if(a.length===0){this.close();return}a[Math.min(r,a.length-1)].focus({preventScroll:!0})}pick(e){let t=this.onPick;this.close(),t?.(e)}items(){return[...this.el.querySelectorAll(ct)]}onKeyDown(e){let t=this.items(),n=t.indexOf(document.activeElement),[r,i]=this.rtl()?[`ArrowLeft`,`ArrowRight`]:[`ArrowRight`,`ArrowLeft`],a=-1;if(e.key===`ArrowDown`)a=(n+1)%t.length;else if(e.key===`ArrowUp`)a=(n-1+t.length)%t.length;else if(e.key===`Home`)a=0;else if(e.key===`End`)a=t.length-1;else if(e.key===r&&t[n]?.hasAttribute(`aria-haspopup`)){e.preventDefault(),t[n].click();return}else if(e.key===i&&this.parent){e.preventDefault(),this.close();return}else if(e.key===`Delete`&&n>=0){e.preventDefault(),this.remove(t[n]);return}else if(e.key===`Escape`||e.key===`Tab`){e.preventDefault(),e.stopPropagation();let t=this;for(;e.key===`Tab`&&t.parent;)t=t.parent;t.close();return}else return;e.preventDefault(),this.child?.close(),t[a]?.focus({preventScroll:!0})}},ht=[`en-US`,`en-GB`,`en-IN`,`de-DE`,`fr-FR`,`es-ES`,`it-IT`,`pt-BR`,`ru-RU`,`tr-TR`,`vi-VN`,`id-ID`,`th-TH`,`zh-CN`,`zh-TW`,`ja-JP`,`ko-KR`],gt=65234;function _t(e){return(e&&!ht.includes(e)?[e,...ht]:ht).map(e=>{let t;try{t=new Intl.NumberFormat(e,{minimumFractionDigits:2,maximumFractionDigits:2}).format(gt)}catch{t=``}return{value:e,label:t?`${e} (${t})`:e}})}var vt={Lines:`toolGroup.lines`,"Horizontal/Vertical":`toolGroup.horizontalVertical`,Channels:`toolGroup.channels`,Fibonacci:`toolGroup.fibonacci`,Shapes:`toolGroup.shapes`,"Gann & Pitchforks":`toolGroup.gannPitchforks`,Patterns:`toolGroup.patterns`,Measure:`toolGroup.measure`,Annotation:`toolGroup.annotation`,Forecasting:`toolGroup.forecasting`,Brushes:`toolGroup.brushes`,Cycles:`toolGroup.cycles`,"Elliott Waves":`toolGroup.elliott`};function yt(e,t){let n=`chartType.${e.value}`,r=t(n);return r===n?e.label:r}function bt(e,t){return e.map(e=>({...e,label:vt[e.label]?t(vt[e.label]):e.label,tools:e.tools.map(e=>{let n=`tool.${e.value}`,r=t(n);return{...e,label:r===n?e.label:r}})}))}var xt=[`1m`,`3m`,`5m`,`15m`,`30m`,`1h`,`2h`,`4h`,`1d`,`1w`,`1M`],St=[`1m`,`5m`,`15m`,`1h`,`4h`,`1d`],Ct=6;function wt(e){let t=e.slice(-1);return t===`h`||t===`d`||t===`w`?e.slice(0,-1)+t.toUpperCase():e}var Tt=e=>Number.isFinite((0,n.timeframeToMs)(e))||(0,n.tickBarCount)(e)!==null,Et=(e,t)=>{let r=(0,n.tickBarCount)(e),i=(0,n.tickBarCount)(t);return r!==null||i!==null?r===null?1:i===null?-1:r-i:(0,n.timeframeToMs)(e)-(0,n.timeframeToMs)(t)};function Dt(e,t){let n=t?.length?t:null,r=e?.length?e:n??xt;return[...new Set(r)].filter(e=>Tt(e)&&(!n||n.includes(e))).sort(Et)}function Ot(e,t,n=!1){if(t?.length)return e.filter(e=>t.includes(e));if(n)return[...e];let r=e.filter(e=>St.includes(e));return r.length>0?r:e.slice(0,Ct)}var kt=9999,At={"":`m`,s:`s`,S:`s`,m:`m`,h:`h`,H:`h`,d:`d`,D:`d`,w:`w`,W:`w`,M:`M`},jt={s:[`m`,60],m:[`h`,60],h:[`d`,24]};function Mt(e){let t=/^(\d+)([a-zA-Z]?)$/.exec(e.trim());if(!t)return null;if(t[2]===`T`||t[2]===`t`){let e=`${Number(t[1])}T`;return Number(t[1])<=kt&&(0,n.tickBarCount)(e)!==null?e:null}let r=Number(t[1]),i=At[t[2]];if(!i||!Number.isSafeInteger(r)||r<1)return null;for(let e=jt[i];e&&r%e[1]===0;e=jt[i])r/=e[1],i=e[0];if(r>kt)return null;let a=`${r}${i}`;return(0,n.isTimeFrame)(a)?a:null}function Nt(e,t,n){let r=n?.length?n:null,i=t.filter(e=>Tt(e)&&(!r||r.includes(e)));return[...new Set([...e,...i])].sort(Et)}var Pt=[`T`,`s`,`m`,`h`,`d`,`w`,`M`];function Ft(e){let t=e=>{let t=e.slice(-1);return Pt.includes(t)?t:`m`};return Pt.map(n=>({unit:n,timeframes:e.filter(e=>t(e.value)===n)})).filter(e=>e.timeframes.length>0)}var It=864e5,Lt=5/7;function Rt(e){let t=(0,n.timeframeToMs)(e.current),r=(0,n.timeframeToMs)(e.chosen);if(!Number.isFinite(t)||!Number.isFinite(r)||!(e.width>0)||!(e.spanMs>0))return e.current;let i=n=>{if(n===t)return e.barsInSpan;if(n<It)return e.barsInSpan*t/n;let r=e.spanMs/n;return n===It?r*(e.dayShare??Lt):r},a=[...new Set([...e.available,e.current])].filter(e=>{let t=(0,n.timeframeToMs)(e);return Number.isFinite(t)&&t>=r}).sort(Et);for(let t of a)if(i((0,n.timeframeToMs)(t))*2<=e.width)return t;return a[a.length-1]??e.current}var zt={ticket:`receipt`,long:`trendingUp`,short:`trendingDown`,ladder:`ladder`,account:`layers`},Bt=[`ladder`,`account`];function Vt(e,t){let n=[];e.onOrderTicket&&n.push({id:`ticket`,label:t(`chartMenu.orderTicket`),parts:[`orderTicket`],run:e.onOrderTicket});let r=e.onBracket;return r&&(n.push({id:`long`,label:t(`toolbar.longBracket`),parts:[`bracketOrders`,`toolbar.bracketOrders`],run:()=>r(`buy`)}),n.push({id:`short`,label:t(`toolbar.shortBracket`),parts:[`bracketOrders`,`toolbar.bracketOrders`],run:()=>r(`sell`)})),e.onToggleLadder&&n.push({id:`ladder`,label:t(`toolbar.depthLadder`),parts:[`depthLadder`,`toolbar.depthLadder`],run:e.onToggleLadder}),e.onToggleAccount&&n.push({id:`account`,label:t(`toolbar.account`),parts:[`accountPanel`,`toolbar.accountPanel`],run:e.onToggleAccount}),n}var Ht=class e{button;menu=null;open=new Set;static create(t,n,r,i){let a=Vt(t,n);return a.length>0?new e(a,n,r,i):null}constructor(e,t,n,r){this.items=e,this.t=t,this.root=n;let i=document.createElement(`button`);i.type=`button`,i.className=`tcw-dropdown-trigger tcw-toolbar-overflow`,i.dataset.role=`trade`,i.dataset.icon=`trendingUp`,i.title=t(`toolbar.trade`),i.setAttribute(`aria-haspopup`,`menu`),i.setAttribute(`aria-expanded`,`false`),E(i,`toolbar.trade`),i.innerHTML=`${D(`trendingUp`,14)} <span class="tcw-trigger-label">${O(t(`toolbar.trade`))}</span> ${D(`chevronDown`,12)}`,i.addEventListener(`click`,()=>this.toggle(r(i))),this.button=i}tidy(){this.button.hidden=this.items.every(e=>this.isOff(e.parts))}setOpen(e,t){let n=Bt.find(t=>t===e);n&&(t?this.open.add(n):this.open.delete(n))}destroy(){this.menu?.destroy(),this.button.remove()}isOff(e){let t=new Set((this.root().getAttribute(`data-tcw-off`)??``).split(/\s+/).filter(Boolean));return e.some(e=>t.has(e))}toggle(e){if(this.menu?.isOpen()){this.menu.close();return}let t=this.items.filter(e=>!this.isOff(e.parts));if(t.length===0)return;let n=t.filter(e=>!Bt.includes(e.id)),r=t.filter(e=>Bt.includes(e.id)),i=[...n.map(e=>({id:e.id,label:e.label,icon:zt[e.id]})),...n.length>0&&r.length>0?[`separator`]:[],...r.map(e=>({id:e.id,label:e.label,checked:this.open.has(e.id)}))],a=this.root();this.menu??=new k(a,this.t(`toolbar.trade`)),this.menu.openUnder(i,e,e=>{t.find(t=>t.id===e)?.run()})}},Ut=2048,Wt=65536,Gt=/^data:image\/(png|jpeg|gif|webp|avif|svg\+xml)[;,]/i,Kt=new Set([`https:`,`http:`,`blob:`]),qt=new Set([`description`,`exchange`,`type`,`logo`]);function Jt(e){if(typeof e!=`string`)return null;let t=e.trim();return t&&t.length<=64?t:null}function Yt(e){let t=[],n=new Map;if(!Array.isArray(e))return{names:t,info:n};let r=new Set;for(let i of e){let e=typeof i==`object`&&!!i,a=Jt(e?i.symbol:i);!a||r.has(a)||(r.add(a),t.push(a),e&&n.set(a,Xt(i,a)))}return{names:t,info:n}}function Xt(e,t){return{...Object.fromEntries(Object.entries(e).filter(([e,t])=>e!==`__proto__`&&(!qt.has(e)||typeof t==`string`&&t.trim()!==``))),symbol:t}}function Zt(e){return Array.isArray(e)?e.filter(e=>typeof e==`object`&&!!e&&typeof e.symbol==`string`&&e.symbol!==``).map(e=>Xt(e,e.symbol)):[]}function Qt(e,t){if(!t)return e;if(!e)return t;let n=Object.entries(t).filter(([,e])=>e!=null);return Object.fromEntries([...Object.entries(e),...n])}function $t(e){let t=e.lastIndexOf(`:`);return t<=0||t===e.length-1?{venue:``,ticker:e}:{venue:e.slice(0,t+1),ticker:e.slice(t+1)}}var en=e=>$t(e).ticker.toUpperCase();function tn(e,t){return!t||typeof t.symbol!=`string`?null:t.symbol.toUpperCase()===e.toUpperCase()||t.symbol.includes(`:`)!==e.includes(`:`)&&en(t.symbol)===en(e)?t:null}function nn(e){return[e?.description,e?.exchange].filter(Boolean).join(` · `)||null}var rn=()=>typeof document>`u`?void 0:document.baseURI;function an(e,t=rn()){if(typeof e!=`string`)return null;let n=e.trim();if(!n||n.length>Wt)return null;let r;try{r=new URL(n,t)}catch{return null}return r.protocol===`data:`?Gt.test(r.href)&&r.href.length<=Wt?r.href:null:Kt.has(r.protocol)&&r.href.length<=Ut?r.href:null}var on=0,A=`data-tcw-folded`,sn=1/64,cn=[`venue`,`ticker`,`cut`],ln={T:`toolbar.timeframes.ticks`,s:`toolbar.timeframes.seconds`,m:`toolbar.timeframes.minutes`,h:`toolbar.timeframes.hours`,d:`toolbar.timeframes.days`,w:`toolbar.timeframes.weeks`,M:`toolbar.timeframes.months`};function un(e,t){let n=e.querySelector(`.tcw-host-btn-text`)?.textContent??``;n===t?e.removeAttribute(`aria-label`):e.setAttribute(`aria-label`,n?`${t}: ${n}`:t)}var dn=class{config;callbacks;t;el;chartTypeDropdown=null;tfGroup=null;tfDropdown=null;tfFavorites=[];uid=(on++).toString(36);tfRendered=``;themeBtn=null;fullscreenBtn=null;hostLeft=null;hostRight=null;moreMenu=null;tfCurrent=null;resizeObserver=null;hostObserver=null;moreBtn=null;fitFrame=0;destroyed=!1;undoBtn=null;redoBtn=null;trade=null;layoutShown=``;symbolShown=null;constructor(e,t,n,r,i){if(this.host=e,this.layer=i,this.config=t,this.callbacks=n,this.t=r,this.el=document.createElement(`div`),this.el.className=`tcw-toolbar`,E(this.el,`toolbar`),this.build(),e.appendChild(this.el),typeof ResizeObserver<`u`){this.resizeObserver=new ResizeObserver(()=>this.fit()),this.resizeObserver.observe(this.el),this.hostObserver=new ResizeObserver(()=>this.scheduleFit());for(let e of[this.hostLeft,this.hostRight])e&&this.hostObserver.observe(e)}document.fonts?.ready.then(()=>this.scheduleFit())}scheduleFit(){this.destroyed||this.fitFrame||typeof requestAnimationFrame>`u`||(this.fitFrame=requestAnimationFrame(()=>{this.fitFrame=0,this.destroyed||this.fit()}))}menuAnchor(e){return(e.hasAttribute(A)||this.el.closest(`[data-tcw-narrow]`)!==null)&&this.moreBtn?this.moreBtn:e}fit(){let e=this.toolbarFocus(),t=this.foldedState();this.refit(),this.foldedState()!==t&&this.closeStaleMenus(),e&&this.keepFocus(e)}refit(){let{el:e}=this,t=()=>this.fits(),n=[...e.querySelectorAll(`.tcw-toolbar-overflow`)];for(let e of n)e.removeAttribute(A);if(e.classList.remove(`tcw-toolbar--collapsed`,`tcw-toolbar--icons`),delete e.dataset.tcwSqueeze,!(e.clientWidth===0||t())){e.classList.add(`tcw-toolbar--collapsed`);for(let e=n.length-1;e>=0;e--)if(n[e].setAttribute(A,``),t())return;e.classList.add(`tcw-toolbar--icons`);for(let e of n)if(e.removeAttribute(A),!t()){e.setAttribute(A,``);break}for(let n of cn){if(t())return;e.dataset.tcwSqueeze=n}}}fits(){let{el:e}=this,t=e.getBoundingClientRect(),n=e.offsetWidth>0&&Math.abs(t.width-e.offsetWidth)>=1?t.width/e.offsetWidth:1,r=getComputedStyle(e),i=r.direction===`rtl`,a=e=>parseFloat(e)||0,o=t.width/n-(i?a(r.borderLeftWidth)+a(r.paddingLeft):a(r.borderRightWidth)+a(r.paddingRight)),s=0;for(let r of e.children){if(r.getClientRects().length===0)continue;let e=r.getBoundingClientRect();s=Math.max(s,(i?t.right-e.left:e.right-t.left)/n)}return Math.ceil(s-sn)<=Math.floor(o+sn)}foldedState(){let e=[...this.el.querySelectorAll(`.tcw-toolbar-overflow`)];return`${this.el.classList.contains(`tcw-toolbar--collapsed`)}:${e.map(e=>Number(e.hasAttribute(A))).join(``)}`}closeStaleMenus(){this.moreBtn&&k.closeAnchoredTo(this.moreBtn);for(let e of this.el.querySelectorAll(`[${A}], [${A}] button`))k.closeAnchoredTo(e)}toolbarFocus(){let e=k.focusedAnchor();if(e&&this.el.contains(e))return e;let t=document.activeElement;return t instanceof HTMLElement&&this.el.contains(t)?t:null}keepFocus(e){if(k.focusedAnchor())return;let t=e;this.shows(e)||(t=(this.moreBtn&&e!==this.moreBtn&&this.shows(this.moreBtn)?this.moreBtn:null)??this.overflowButtons().filter(e=>this.shows(e)).at(-1)),t&&document.activeElement!==t&&t.focus({preventScroll:!0})}overflowButtons(){return[...this.el.querySelectorAll(`button.tcw-toolbar-overflow, .tcw-toolbar-overflow button`)]}shows(e){if(e.closest(`[hidden]`)||e.closest(`[${A}]`)||this.isOff(e))return!1;let t=this.el.closest(`[data-tcw-narrow]`)!==null;return e===this.moreBtn?t||this.el.classList.contains(`tcw-toolbar--collapsed`):!(t&&e.closest(`.tcw-toolbar-overflow`))}isOff(e){let t=new Set((this.rootEl().getAttribute(`data-tcw-off`)??``).split(/\s+/).filter(Boolean));for(let n=e;n&&n!==this.el;n=n.parentElement)if((n.dataset.tcwPart??``).split(/\s+/).some(e=>t.has(e)))return!0;return!1}build(){let{config:e,callbacks:t,el:n}=this,r=document.createElement(`button`);if(r.className=`tcw-toolbar-symbol`,r.dataset.role=`symbol`,r.dir=`ltr`,E(r,`toolbar.symbol`),r.addEventListener(`click`,t.onSymbolClick),n.appendChild(r),t.onSymbolInfo){let e=this.iconBtn(`info`,this.t(`symbolInfo.title`),t.onSymbolInfo);e.classList.remove(`tcw-toolbar-overflow`),e.dataset.role=`symbolInfo`,E(e,`symbolInfo`,`toolbar.symbolInfo`),n.appendChild(e)}if(n.appendChild(this.sep()),this.tfFavorites=[...e.timeframeFavorites??e.timeframes.map(e=>e.value)],this.tfGroup=document.createElement(`div`),this.tfGroup.className=`tcw-toolbar-group tcw-tf-group`,E(this.tfGroup,`toolbar.timeframes`),n.appendChild(this.tfGroup),t.onToggleTimeframeFavorite&&e.timeframes.length>0){let e=document.createElement(`div`);e.style.position=`relative`,e.style.display=`inline-flex`,E(e,`toolbar.timeframeMenu`);let t=document.createElement(`button`);t.className=`tcw-btn tcw-tf-more`,t.dataset.role=`timeframes`,t.title=this.t(`toolbar.timeframes`),t.setAttribute(`aria-label`,this.t(`toolbar.timeframes`)),this.tfCurrent=document.createElement(`span`),this.tfCurrent.className=`tcw-tf-current`,t.appendChild(this.tfCurrent),t.insertAdjacentHTML(`beforeend`,D(`chevronDown`,12)),e.appendChild(t),n.appendChild(e),this.tfDropdown=new it(e,{width:`150px`,layer:this.layer}),n.classList.add(`tcw-toolbar--tf-menu`),this.buildTimeframeMenu()}n.appendChild(this.sep());let i=document.createElement(`div`);i.style.position=`relative`,i.style.display=`inline-flex`,E(i,`toolbar.chartType`);let a=document.createElement(`button`);a.className=`tcw-dropdown-trigger`,a.dataset.role=`charttype`,i.appendChild(a),n.appendChild(i),this.chartTypeDropdown=new it(i,{width:`160px`,layer:this.layer}),this.buildChartTypeMenu(),n.appendChild(this.sep());let o=document.createElement(`button`);if(o.type=`button`,o.className=`tcw-dropdown-trigger`,o.dataset.role=`indicators`,o.setAttribute(`aria-haspopup`,`dialog`),o.setAttribute(`aria-expanded`,`false`),E(o,`toolbar.indicators`),o.addEventListener(`click`,()=>t.onIndicators()),n.appendChild(o),t.onCompare){let e=document.createElement(`button`);e.type=`button`,e.className=`tcw-dropdown-trigger`,e.dataset.role=`compare`,E(e,`compare`,`toolbar.compare`);let r=this.t(`objects.compare`);e.setAttribute(`aria-label`,r),e.title=r,e.innerHTML=`${D(`plus`,14)} <span class="tcw-trigger-label">${O(r)}</span>`,e.addEventListener(`click`,t.onCompare),n.appendChild(e)}if(this.hostLeft=this.hostGroup(),n.appendChild(this.hostLeft),t.onUndo&&t.onRedo&&(n.appendChild(this.sep()),this.undoBtn=this.iconBtn(`undo`,this.t(`drawing.undo`),t.onUndo),this.undoBtn.dataset.role=`undo`,E(this.undoBtn,`toolbar.undo`,`sidebar.undo`),this.redoBtn=this.iconBtn(`redo`,this.t(`drawing.redo`),t.onRedo),this.redoBtn.dataset.role=`redo`,E(this.redoBtn,`toolbar.redo`,`sidebar.redo`),n.append(this.undoBtn,this.redoBtn),this.setHistory(!1,!1)),n.appendChild(this.spacer()),t.onLayouts){let e=t.onLayouts,r=document.createElement(`button`);r.type=`button`,r.className=`tcw-dropdown-trigger tcw-layouts-btn tcw-toolbar-overflow`,r.dataset.role=`layouts`,r.dataset.icon=`save`,E(r,`layouts`,`toolbar.layouts`),r.setAttribute(`aria-haspopup`,`menu`),r.addEventListener(`click`,()=>e(this.menuAnchor(r))),n.appendChild(r),this.setLayout(null,!1)}if(this.hostRight=this.hostGroup(),n.appendChild(this.hostRight),n.appendChild(this.sep()),t.onToggleReplay){let e=this.iconBtn(`play`,this.t(`toolbar.replay`),t.onToggleReplay);e.dataset.role=`replay`,E(e,`replay`,`toolbar.replay`),n.appendChild(e)}if(t.onToggleObjects){let e=this.iconBtn(`layers`,this.t(`toolbar.objects`),t.onToggleObjects);e.dataset.role=`objects`,e.setAttribute(`aria-pressed`,`false`),E(e,`objectTree`,`toolbar.objectTree`),n.appendChild(e)}if(t.onToggleAlerts){let e=this.iconBtn(`bell`,this.t(`toolbar.priceAlerts`),t.onToggleAlerts);e.dataset.role=`alerts`,e.setAttribute(`aria-pressed`,`false`),E(e,`alerts`,`toolbar.alerts`),n.appendChild(e)}this.trade=Ht.create(t,this.t,()=>this.rootEl(),e=>this.menuAnchor(e)),this.trade&&n.appendChild(this.trade.button),n.appendChild(this.sep());let s=this.iconBtn(`camera`,this.t(`toolbar.screenshot`),t.onScreenshot);E(s,`screenshot`,`toolbar.screenshot`),n.appendChild(s);let c=this.iconBtn(`settings`,this.t(`toolbar.settings`),t.onSettings);E(c,`settings`,`toolbar.settings`),n.appendChild(c),this.themeBtn=this.iconBtn(`moon`,this.t(`toolbar.toggleTheme`),t.onToggleTheme),this.themeBtn.dataset.role=`theme`,E(this.themeBtn,`themeToggle`,`toolbar.themeToggle`),n.appendChild(this.themeBtn),t.onToggleFullscreen&&(this.fullscreenBtn=this.iconBtn(`maximize`,this.t(`toolbar.fullscreen`),t.onToggleFullscreen),this.fullscreenBtn.dataset.role=`fullscreen`,E(this.fullscreenBtn,`fullscreen`,`toolbar.fullscreen`),this.fullscreenBtn.setAttribute(`aria-pressed`,`false`),n.appendChild(this.fullscreenBtn));let l=document.createElement(`button`);l.type=`button`,l.className=`tcw-btn-icon tcw-toolbar-more`,l.title=this.t(`toolbar.more`),l.setAttribute(`aria-haspopup`,`menu`),l.setAttribute(`aria-expanded`,`false`),l.innerHTML=D(`more`,16),l.addEventListener(`click`,()=>this.toggleMore(l)),n.appendChild(l),this.moreBtn=l}toggleMore(e){if(k.closeAnchoredTo(e))return;let t=this.rootEl(),n=this.el.closest(`[data-tcw-narrow]`)!==null,r=[];for(let e of this.el.querySelectorAll(`.tcw-toolbar-overflow`)){if(this.isOff(e)||!n&&!e.hasAttribute(A))continue;let t=e instanceof HTMLButtonElement?[e]:[...e.querySelectorAll(`button`)];r.push(...t.filter(e=>!e.hidden&&!e.disabled&&!this.isOff(e)))}if(r.length===0)return;let i=r.map((e,t)=>{let n=e.getAttribute(`aria-label`)||e.title||e.textContent?.trim()||``,r=e.getAttribute(`aria-pressed`);return r===null?{id:String(t),label:n,icon:e.dataset.icon}:{id:String(t),label:n,icon:e.dataset.icon,checked:r===`true`}});this.moreMenu??=new k(t,this.t(`toolbar.more`)),this.moreMenu.openUnder(i,e,e=>r[Number(e)]?.click(),`end`)}addHostButton(e){let t=document.createElement(`button`);t.type=`button`,t.className=`${e.text||!e.icon?`tcw-btn`:`tcw-btn-icon`} tcw-host-btn tcw-toolbar-overflow`,t.dataset.hostButton=e.id,typeof e.icon==`string`&&(t.dataset.icon=e.icon),t.title=e.label,e.toggle&&t.setAttribute(`aria-pressed`,`false`),typeof e.icon==`string`?t.innerHTML=D(e.icon,14):e.icon&&t.appendChild(e.icon);let n=e.text??(e.icon?``:e.label);if(n){let e=document.createElement(`span`);e.className=`tcw-host-btn-text`,e.textContent=n,t.appendChild(e)}return un(t,e.label),t.addEventListener(`click`,()=>e.onClick(t)),(e.side===`left`?this.hostLeft:this.hostRight)?.appendChild(t),this.scheduleFit(),t}hostSlot(e){return e===`left`?this.hostLeft:this.hostRight}hostGroup(){let e=document.createElement(`div`);return e.className=`tcw-toolbar-host`,e}setSymbolSearch(e){let t=this.el.querySelector(`[data-role="symbol"]`);t&&(e?t.removeAttribute(`aria-disabled`):t.setAttribute(`aria-disabled`,`true`))}tidy(){this.trade?.tidy(),Ye(this.el,`tcw-toolbar-sep`,`tcw-toolbar-spacer`),this.scheduleFit()}setHistory(e,t){this.undoBtn&&(this.undoBtn.disabled=!e),this.redoBtn&&(this.redoBtn.disabled=!t)}rootEl(){return this.el.closest(`.tcw-root`)??this.host}setActive(e,t){this.trade?.setOpen(e,t);let n=this.el.querySelector(`[data-role="${e}"]`);n&&(n.classList.toggle(`tcw-active`,t),n.setAttribute(`aria-pressed`,String(t)))}setRailed(e,t){let n=this.el.querySelector(`[data-role="${e}"]`);n&&(n.hidden=t)}setLayout(e,t){let n=this.el.querySelector(`[data-role="layouts"]`);if(!n)return;let r=e??this.t(`layouts.unnamed`);if(this.layoutShown===`${t}:${r}`)return;this.layoutShown=`${t}:${r}`;let i=`${this.t(`toolbar.layouts`)}: ${r}${t?` (${this.t(`layouts.unsavedChanges`)})`:``}`;n.innerHTML=`${D(`save`,14)}<span class="tcw-layouts-label">${O(r)}</span>`+(t?`<span class="tcw-layouts-dirty" aria-hidden="true"></span>`:``)+D(`chevronDown`,12),n.title=i,n.setAttribute(`aria-label`,i),this.scheduleFit()}setFullscreen(e){if(!this.fullscreenBtn)return;let t=this.t(e?`toolbar.exitFullscreen`:`toolbar.fullscreen`);this.fullscreenBtn.innerHTML=D(e?`minimize`:`maximize`,14),this.fullscreenBtn.title=t,this.fullscreenBtn.setAttribute(`aria-pressed`,String(e))}chartTypeLabel(e){return yt(e,this.t)}buildChartTypeMenu(){if(!this.chartTypeDropdown)return;let e=this.config.chartTypes.map(e=>`<button class="tcw-dropdown-item tcw-dropdown-item--icon" data-ct="${O(e.value)}">${rt(e.value,16)}<span>${O(this.chartTypeLabel(e))}</span></button>`).join(``);this.chartTypeDropdown.setContent(e),this.chartTypeDropdown.panel.querySelectorAll(`.tcw-dropdown-item`).forEach(e=>{e.addEventListener(`click`,e=>{let t=e.currentTarget.dataset.ct;this.callbacks.onChartType(t),this.chartTypeDropdown?.close()})})}setSymbolDescription(e){let t=this.el.querySelector(`[data-role="symbol"]`);t&&(e?t.title=e:t.removeAttribute(`title`))}setTimeframes(e,t){this.config={...this.config,timeframes:e},this.setTimeframeFavorites(t)}setTimeframeFavorites(e){this.tfFavorites=[...e],this.tfRendered=``,this.buildTimeframeMenu()}buildTimeframeMenu(){if(!this.tfDropdown)return;let e=O(this.t(`toolbar.timeframes.pin`)),t=O(this.t(`toolbar.timeframes.remove`)),n=``;for(let{unit:r,timeframes:i}of Ft(this.config.timeframes)){n+=`<div class="tcw-tf-section" data-tf-section="${r}" role="group" aria-label="${O(this.t(ln[r]))}"><div class="tcw-dropdown-label">${O(this.t(ln[r]))}</div>`;for(let r of i){let i=this.tfFavorites.includes(r.value),[a,o]=[O(r.value),O(r.label)];n+=`<div class="tcw-tf-row"><button class="tcw-dropdown-item" data-tf-pick="${a}">${o}</button>`+(r.custom&&this.callbacks.onRemoveTimeframe?`<button class="tcw-tf-remove" data-tf-remove="${a}" title="${t}" aria-label="${t}: ${o}">${D(`x`,12)}</button>`:``)+`<button class="tcw-tf-star${i?` tcw-active`:``}" data-tf-star="${a}" aria-pressed="${i}" title="${e}" aria-label="${e}: ${o}">${D(`star`,12)}</button></div>`}n+=`</div>`}if(this.callbacks.onAddTimeframe){let e=O(this.t(`toolbar.timeframes.custom`)),t=O(this.t(`toolbar.timeframes.add`));n+=`<form class="tcw-tf-custom" ${qe(`customTimeframes`)} novalidate><input class="tcw-tf-custom-input" type="text" autocomplete="off" spellcheck="false" maxlength="6" placeholder="7m, 90m, 2h…" aria-label="${e}" aria-describedby="tcw-tf-hint-${this.uid}"><button type="submit" class="tcw-tf-custom-add" title="${t}" aria-label="${t}">${D(`plus`,12)}</button><div class="tcw-tf-custom-hint" id="tcw-tf-hint-${this.uid}" role="status"></div></form>`}this.tfDropdown.setContent(n);let r=this.tfDropdown.panel;r.querySelectorAll(`[data-tf-pick]`).forEach(e=>{e.addEventListener(`click`,()=>this.callbacks.onTimeframe(e.dataset.tfPick))}),r.querySelectorAll(`[data-tf-star]`).forEach(e=>{e.addEventListener(`click`,t=>{t.stopPropagation(),this.callbacks.onToggleTimeframeFavorite?.(e.dataset.tfStar)})}),r.querySelectorAll(`[data-tf-remove]`).forEach(e=>{e.addEventListener(`click`,t=>{t.stopPropagation(),this.callbacks.onRemoveTimeframe?.(e.dataset.tfRemove)})});let i=r.querySelector(`.tcw-tf-custom`);i&&this.wireCustomTimeframe(i)}wireCustomTimeframe(e){let t=e.querySelector(`.tcw-tf-custom-input`),n=e.querySelector(`.tcw-tf-custom-hint`);e.addEventListener(`click`,e=>e.stopPropagation()),t.addEventListener(`input`,()=>{t.removeAttribute(`aria-invalid`),n.textContent=``}),e.addEventListener(`submit`,e=>{e.preventDefault(),e.stopPropagation(),this.callbacks.onAddTimeframe?.(t.value)?(t.value=``,n.textContent=``,this.tfDropdown?.close(),this.el.querySelector(`[data-role="timeframes"]`)?.focus()):(t.setAttribute(`aria-invalid`,`true`),n.textContent=this.t(`toolbar.timeframes.invalid`))})}renderTimeframes(e){if(!this.tfGroup)return;let t=this.config.timeframes.filter(t=>this.tfFavorites.includes(t.value)||t.value===e),n=`${t.map(e=>e.value).join(`,`)}|${e}`;n!==this.tfRendered&&(this.tfRendered=n,this.tfCurrent&&(this.tfCurrent.textContent=this.config.timeframes.find(t=>t.value===e)?.label??e),this.tfGroup.replaceChildren(...t.map(t=>{let n=document.createElement(`button`);return n.className=`tcw-btn`,n.textContent=t.label,n.dataset.tf=t.value,n.classList.toggle(`tcw-active`,t.value===e),n.addEventListener(`click`,()=>this.callbacks.onTimeframe(t.value)),n})),(this.tfDropdown?.panel)?.querySelectorAll(`[data-tf-pick]`).forEach(t=>{t.classList.toggle(`tcw-active`,t.dataset.tfPick===e)}))}setIndicatorsOpen(e){this.el.querySelector(`[data-role="indicators"]`)?.setAttribute(`aria-expanded`,String(e))}renderSymbol(e){let t=this.el.querySelector(`[data-role="symbol"]`);if(!t||this.symbolShown===e)return;this.symbolShown=e;let{venue:n,ticker:r}=$t(e),i=(e,t)=>{let n=document.createElement(`span`);return n.className=e,n.textContent=t,n};t.replaceChildren(...n?[i(`tcw-toolbar-venue`,n)]:[],i(`tcw-toolbar-ticker`,r)),t.classList.toggle(`tcw-toolbar-symbol--venue`,n!==``),t.setAttribute(`aria-label`,e)}update(e){this.renderSymbol(e.symbol),this.renderTimeframes(e.timeframe);let t=this.el.querySelector(`[data-role="charttype"]`);if(t){let n=this.config.chartTypes.find(t=>t.value===e.chartType),r=n?this.chartTypeLabel(n):e.chartType;t.innerHTML=rt(e.chartType,16),t.title=r,t.setAttribute(`aria-label`,r)}let n=this.el.querySelector(`[data-role="indicators"]`);if(n){let t=e.activeIndicators.size,r=`${D(`trendingUp`,14)} <span class="tcw-trigger-label">${O(this.t(`toolbar.indicators`))}</span>`;n.setAttribute(`aria-label`,this.t(`toolbar.indicators`)),t>0&&(r+=` <span class="tcw-badge-count">${t}</span>`),n.innerHTML=r}if(this.themeBtn){let t=e.isDark?`moon`:`sun`;this.themeBtn.innerHTML=D(t,14),this.themeBtn.dataset.icon=t}this.scheduleFit()}sep(){let e=document.createElement(`span`);return e.className=`tcw-toolbar-sep`,e}spacer(){let e=document.createElement(`span`);return e.className=`tcw-toolbar-spacer`,e}iconBtn(e,t,n){let r=document.createElement(`button`);return r.className=`tcw-btn-icon tcw-toolbar-overflow`,r.dataset.icon=e,r.title=t,r.innerHTML=D(e,14),r.addEventListener(`click`,n),r}destroy(){this.destroyed=!0,this.resizeObserver?.disconnect(),this.hostObserver?.disconnect(),this.fitFrame&&cancelAnimationFrame(this.fitFrame),this.chartTypeDropdown?.destroy(),this.tfDropdown?.destroy(),this.moreMenu?.destroy(),this.trade?.destroy(),this.el.remove()}};function fn(e,t,n){e.classList.toggle(`tcw-active`,t),n&&e.setAttribute(`aria-pressed`,String(t))}function pn(e,t,n){let r=n==null?``:String(n),i=e.querySelector(`.tcw-host-btn-text`);return(i?.textContent??``)===r?!1:(i||(i=document.createElement(`span`),i.className=`tcw-host-btn-text`,e.appendChild(i)),i.textContent=r,un(e,t),!0)}var mn=16,hn=150,gn=4;function _n(e){let t=`sidebar.${e}`;return Fe.includes(t)?t:null}function vn(e,t){for(let n of e){let e=n.tools.find(e=>e.value===t);if(e)return e.label}return t}var yn=class{config;callbacks;el;groupWraps=[];groupButtons=[];groupIcons=[];groupTools=[];cursorBtn=null;magnetBtn=null;eraserBtn=null;zoomBtn=null;stayBtn=null;lockAllBtn=null;hideAllBtn=null;drawings={locked:!1,hidden:!1};flyoutEl=null;flyoutIdx=-1;flyoutHideTimer=null;hostEl=null;favoritesEl=null;favoritesDivider=null;favorites=[];fab;fabShows=``;onPressAway=e=>{let t=e.target;t&&(this.el.contains(t)||this.fab.contains(t)||this.flyoutEl?.contains(t))||this.setOpen(!1)};onEscape=e=>{e.key===`Escape`&&!this.flyoutEl&&this.setOpen(!1)};constructor(e,n,r,i=t.t){this.host=e,this.t=i,this.config=n,this.callbacks=r,this.el=document.createElement(`div`),this.el.className=`tcw-sidebar`,E(this.el,`sidebar`),this.build(),this.el.addEventListener(`scroll`,()=>this.hideFlyout(),{passive:!0}),e.appendChild(this.el),this.fab=document.createElement(`button`),this.fab.type=`button`,this.fab.className=`tcw-sidebar-fab`,this.fab.setAttribute(`aria-label`,this.t(`drawing.tools`)),this.fab.setAttribute(`aria-expanded`,`false`),this.fab.innerHTML=D(`penLine`,18),E(this.fab,`sidebar`),this.fab.addEventListener(`click`,()=>this.setOpen(!this.isOpen())),e.appendChild(this.fab)}isNarrow(){return this.el.closest(`[data-tcw-narrow]`)!==null}isOpen(){return this.el.classList.contains(`tcw-sidebar-open`)}setOpen(e){if(e!==this.isOpen())if(this.el.classList.toggle(`tcw-sidebar-open`,e),this.fab.setAttribute(`aria-expanded`,String(e)),e)document.addEventListener(`pointerdown`,this.onPressAway,!0),document.addEventListener(`keydown`,this.onEscape);else{let e=this.el.contains(document.activeElement)||!!this.flyoutEl?.contains(document.activeElement);this.hideFlyout(),document.removeEventListener(`pointerdown`,this.onPressAway,!0),document.removeEventListener(`keydown`,this.onEscape),e&&this.isNarrow()&&this.fab.focus({preventScroll:!0})}}closeOverlay(){this.setOpen(!1)}closeForChart(){this.isNarrow()&&this.setOpen(!1)}pick(e){this.callbacks.onDrawingTool(e),this.closeForChart()}build(){let{config:e,callbacks:t,el:n}=this;this.cursorBtn=document.createElement(`button`),this.cursorBtn.className=`tcw-sidebar-btn`,this.cursorBtn.title=this.t(`drawing.cursor`),this.cursorBtn.innerHTML=D(`cursor`,14),this.cursorBtn.addEventListener(`click`,()=>{t.onCancelDrawing(),this.closeForChart()}),E(this.cursorBtn,`sidebar.cursor`),n.appendChild(this.cursorBtn),n.appendChild(this.divider()),t.onToggleFavorite&&(this.favorites=[...e.favorites??[]],this.favoritesEl=document.createElement(`div`),this.favoritesEl.className=`tcw-sidebar-favorites`,E(this.favoritesEl,`sidebar.favorites`),n.appendChild(this.favoritesEl),this.favoritesDivider=this.divider(),E(this.favoritesDivider,`sidebar.favorites`),n.appendChild(this.favoritesDivider),this.renderFavorites());let r;e.drawingToolGroups.forEach((e,t)=>{if(!e.tools[0])return;e.section!==void 0&&r!==void 0&&e.section!==r&&this.appendDivider(),r=e.section;let i=document.createElement(`div`);i.className=`tcw-tool-group-wrap`;let a=_n(e.section);a&&E(i,a);let o=document.createElement(`button`);o.className=`tcw-sidebar-btn`;let s=e.tools[0].value;e.tools.length>1?o.setAttribute(`aria-label`,`${e.label}: ${e.tools[0].label}`):o.title=e.label;let c=document.createElement(`span`);if(c.className=`tcw-sidebar-icon`,c.innerHTML=nt(s,mn),o.appendChild(c),this.groupIcons.push(c),this.groupTools.push(s),e.tools.length>1){let e=document.createElement(`span`);e.className=`tcw-multi-dot`,o.appendChild(e)}o.addEventListener(`click`,()=>{if(this.isNarrow()&&e.tools.length>1){this.flyoutEl&&this.flyoutIdx===t?this.hideFlyout():this.showFlyout(t);return}this.pick(this.groupTools[t])}),i.appendChild(o),i.addEventListener(`mouseenter`,()=>{this.isNarrow()||this.showFlyout(t)}),i.addEventListener(`mouseleave`,()=>{this.isNarrow()||this.scheduleHideFlyout()}),e.tools.length>1&&(o.setAttribute(`aria-haspopup`,`menu`),o.setAttribute(`aria-expanded`,`false`),o.addEventListener(`keydown`,e=>{e.key===`ArrowRight`||e.key===`ArrowDown`?(e.preventDefault(),this.showFlyout(t),this.focusFlyoutItem(0)):e.key===`Escape`&&this.flyoutEl&&(e.stopPropagation(),this.hideFlyout())})),i.addEventListener(`focusout`,e=>{let t=e.relatedTarget;!i.contains(t)&&!this.flyoutEl?.contains(t)&&this.scheduleHideFlyout()}),n.appendChild(i),this.groupWraps.push(i),this.groupButtons.push(o)});let i=document.createElement(`div`);if(i.className=`tcw-sidebar-spacer`,n.appendChild(i),n.appendChild(this.divider()),t.onToggleStyle){let e=document.createElement(`button`);e.className=`tcw-sidebar-btn`,e.title=this.t(`drawing.style`),e.dataset.role=`style`,E(e,`sidebar.style`),e.innerHTML=D(`palette`,14);let r=t.onToggleStyle;e.addEventListener(`click`,()=>{r(),this.closeForChart()}),n.appendChild(e)}if(t.onToggleMagnet&&(this.magnetBtn=document.createElement(`button`),this.magnetBtn.className=`tcw-sidebar-btn`,this.magnetBtn.title=this.t(`drawing.magnet`),this.magnetBtn.innerHTML=D(`magnet`,14),this.magnetBtn.addEventListener(`click`,t.onToggleMagnet),E(this.magnetBtn,`sidebar.magnet`),n.appendChild(this.magnetBtn)),t.onToggleEraser){let e=t.onToggleEraser;this.eraserBtn=this.toggleButton(`eraser`,this.t(`drawing.eraser`),()=>{e(),this.closeForChart()}),E(this.eraserBtn,`sidebar.eraser`),n.appendChild(this.eraserBtn)}if(t.onToggleZoomArea){let e=t.onToggleZoomArea;this.zoomBtn=this.toggleButton(`zoomIn`,this.t(`drawing.zoomArea`),()=>{e(),this.closeForChart()}),E(this.zoomBtn,`sidebar.zoomArea`),n.appendChild(this.zoomBtn)}if(t.onToggleStayInDrawing&&(this.stayBtn=document.createElement(`button`),this.stayBtn.className=`tcw-sidebar-btn`,this.stayBtn.dataset.role=`stay`,this.stayBtn.title=this.t(`drawing.stay`),this.stayBtn.setAttribute(`aria-pressed`,`false`),this.stayBtn.innerHTML=D(`repeat`,14),this.stayBtn.addEventListener(`click`,t.onToggleStayInDrawing),E(this.stayBtn,`sidebar.stayInDrawing`),n.appendChild(this.stayBtn)),this.hostEl=document.createElement(`div`),this.hostEl.className=`tcw-sidebar-host`,n.appendChild(this.hostEl),this.appendDivider(),t.onLockAll){let e=t.onLockAll;this.lockAllBtn=this.toggleButton(`lock`,this.t(`drawing.lockAll`),()=>e(!this.drawings.locked)),this.lockAllBtn.dataset.role=`lockAll`,E(this.lockAllBtn,`sidebar.lockAll`),n.appendChild(this.lockAllBtn)}if(t.onHideAll){let e=t.onHideAll;this.hideAllBtn=this.toggleButton(`eyeOff`,this.t(`drawing.hideAll`),()=>e(!this.drawings.hidden)),this.hideAllBtn.dataset.role=`hideAll`,E(this.hideAllBtn,`sidebar.hideAll`),n.appendChild(this.hideAllBtn)}let a=document.createElement(`button`);a.className=`tcw-sidebar-btn tcw-danger`,a.title=this.t(`drawing.clearAll`),a.innerHTML=D(`trash`,14),a.addEventListener(`click`,t.onClearDrawings),E(a,`sidebar.clear`),n.appendChild(a)}setDrawingsState(e){if(!(e.locked===this.drawings.locked&&e.hidden===this.drawings.hidden)){this.drawings={...e};for(let[t,n]of[[this.lockAllBtn,e.locked],[this.hideAllBtn,e.hidden]])t?.setAttribute(`aria-pressed`,String(n)),t?.classList.toggle(`tcw-active`,n)}}setFavorites(e){this.favorites=[...e],this.renderFavorites();for(let e of this.flyoutEl?.querySelectorAll(`.tcw-flyout-row`)??[]){let t=this.favorites.includes(e.dataset.toolValue??``);e.classList.toggle(`tcw-flyout-faved`,t),e.querySelector(`[data-pin]`)?.setAttribute(`aria-pressed`,String(t))}}renderFavorites(){if(!this.favoritesEl)return;this.favoritesEl.replaceChildren();let e=this.favorites.length>0;this.favoritesEl.style.display=e?``:`none`,this.favoritesDivider&&(this.favoritesDivider.style.display=e?``:`none`);for(let e of this.favorites){let n=document.createElement(`button`);n.className=`tcw-sidebar-btn`,n.title=t.r(this.t(`sidebar.unpinHint`),{tool:vn(this.config.drawingToolGroups,e)}),n.dataset.toolValue=e,n.innerHTML=nt(e,mn),n.addEventListener(`click`,()=>this.pick(e)),n.addEventListener(`contextmenu`,t=>{t.preventDefault(),this.callbacks.onToggleFavorite?.(e)}),this.favoritesEl.appendChild(n)}}showFlyout(e){if(this.cancelHideFlyout(),this.flyoutEl&&this.flyoutIdx===e)return;let t=this.config.drawingToolGroups[e];if(!t||t.tools.length<=1){this.hideFlyout();return}this.hideFlyout();let n=document.createElement(`div`);n.className=`tcw-flyout`,n.setAttribute(`role`,`menu`),n.setAttribute(`aria-label`,t.label),n.addEventListener(`keydown`,t=>this.onFlyoutKey(t,e));let r=document.createElement(`div`);r.className=`tcw-flyout-header`,r.textContent=t.label,n.appendChild(r);let i=this.t(`drawing.pinFavorite`);for(let e of t.tools){let t=document.createElement(`div`);t.className=`tcw-flyout-row`,t.setAttribute(`role`,`none`),t.dataset.toolValue=e.value;let r=document.createElement(`button`);r.className=`tcw-flyout-item`,r.setAttribute(`role`,`menuitem`),r.tabIndex=-1,r.innerHTML=nt(e.value,mn);let a=document.createElement(`span`);a.className=`tcw-flyout-name`,a.textContent=e.label,r.appendChild(a);let o=this.config.shortcuts?.[e.value];if(o){let e=document.createElement(`kbd`);e.className=`tcw-flyout-key`,e.textContent=o,E(e,`hotkeys`,`hotkeys.tools`),r.appendChild(e)}if(r.dataset.toolValue=e.value,r.addEventListener(`click`,()=>{this.hideFlyout(),this.pick(e.value)}),t.appendChild(r),this.callbacks.onToggleFavorite){let n=this.favorites.includes(e.value);t.classList.toggle(`tcw-flyout-faved`,n);let a=document.createElement(`button`);a.type=`button`,a.className=`tcw-flyout-pin`,a.dataset.pin=e.value,a.tabIndex=-1,a.title=i,a.setAttribute(`aria-label`,`${i}: ${e.label}`),a.setAttribute(`aria-pressed`,String(n)),a.innerHTML=D(`star`,12),a.addEventListener(`click`,t=>{t.stopPropagation(),this.callbacks.onToggleFavorite?.(e.value)}),t.appendChild(a),r.addEventListener(`contextmenu`,t=>{t.preventDefault(),this.callbacks.onToggleFavorite?.(e.value)})}n.appendChild(t)}n.addEventListener(`mouseenter`,()=>this.cancelHideFlyout()),n.addEventListener(`mouseleave`,()=>this.scheduleHideFlyout()),n.addEventListener(`focusout`,t=>{let r=t.relatedTarget;!n.contains(r)&&!this.groupWraps[e].contains(r)&&this.scheduleHideFlyout()}),this.flyoutEl=n,this.flyoutIdx=e,this.host.appendChild(n),this.placeFlyout(n,this.groupButtons[e]),this.groupButtons[e].setAttribute(`aria-expanded`,`true`)}flyoutItems(){return this.flyoutEl?[...this.flyoutEl.querySelectorAll(`.tcw-flyout-item`)]:[]}focusFlyoutItem(e){let t=this.flyoutItems();t.length!==0&&t[(e+t.length)%t.length].focus()}onFlyoutKey(e,t){let n=this.flyoutItems(),r=n.indexOf(document.activeElement);switch(e.key){case`ArrowDown`:this.focusFlyoutItem(r+1);break;case`ArrowUp`:this.focusFlyoutItem(r-1);break;case`Home`:this.focusFlyoutItem(0);break;case`End`:this.focusFlyoutItem(n.length-1);break;case`Escape`:case`ArrowLeft`:e.stopPropagation(),this.hideFlyout(),this.groupButtons[t]?.focus();break;case`Tab`:this.hideFlyout(),this.groupButtons[t]?.focus();return;default:return}e.preventDefault()}placeFlyout(e,t){let n=this.host.getBoundingClientRect(),r=t.getBoundingClientRect();e.style.maxHeight=`${Math.max(0,this.host.clientHeight-gn*2)}px`;let i=this.host.clientHeight-e.offsetHeight-gn;this.host.closest(`[dir]`)?.getAttribute(`dir`)===`rtl`?(e.style.left=``,e.style.right=`${n.right-r.left}px`):(e.style.right=``,e.style.left=`${r.right-n.left}px`),e.style.top=`${Math.max(0,Math.min(r.top-n.top,i))}px`}scheduleHideFlyout(){this.cancelHideFlyout(),this.flyoutHideTimer=setTimeout(()=>{this.flyoutHideTimer=null,this.hideFlyout()},hn)}cancelHideFlyout(){this.flyoutHideTimer!==null&&(clearTimeout(this.flyoutHideTimer),this.flyoutHideTimer=null)}hideFlyout(){this.cancelHideFlyout(),this.flyoutEl&&=(this.flyoutEl.remove(),null),this.groupButtons[this.flyoutIdx]?.setAttribute(`aria-expanded`,`false`),this.flyoutIdx=-1}update(e){this.cursorBtn&&this.cursorBtn.classList.toggle(`tcw-active`,e.activeTool===null);let t=e.activeTool??``;t!==this.fabShows&&(this.fabShows=t,this.fab.innerHTML=e.activeTool?nt(e.activeTool,18):D(`penLine`,18)),this.fab.classList.toggle(`tcw-active`,e.activeTool!==null||e.eraser||e.zoomArea);let{drawingToolGroups:n}=this.config;for(let t=0;t<n.length;t++){let r=n[t].tools.some(t=>t.value===e.activeTool);this.groupButtons[t].classList.toggle(`tcw-active`,r),r&&e.activeTool&&e.activeTool!==this.groupTools[t]&&(this.groupTools[t]=e.activeTool,this.groupIcons[t].innerHTML=nt(e.activeTool,mn),n[t].tools.length>1&&this.groupButtons[t].setAttribute(`aria-label`,`${n[t].label}: ${vn(n,e.activeTool)}`))}if(this.flyoutEl&&this.flyoutEl.querySelectorAll(`.tcw-flyout-item`).forEach(t=>{let n=t;n.classList.toggle(`tcw-active`,n.dataset.toolValue===e.activeTool)}),this.magnetBtn){let t=e.magnetEnabled&&e.magnetStrong;this.magnetBtn.classList.toggle(`tcw-active`,e.magnetEnabled),this.magnetBtn.innerHTML=D(t?`magnetStrong`:`magnet`,14),this.magnetBtn.title=t?this.t(`drawing.magnetStrong`):e.magnetEnabled?this.t(`drawing.magnetOn`):this.t(`drawing.magnetOff`),this.magnetBtn.setAttribute(`aria-label`,this.magnetBtn.title)}for(let[t,n]of[[this.eraserBtn,e.eraser],[this.zoomBtn,e.zoomArea]])t&&(t.classList.toggle(`tcw-active`,n),t.setAttribute(`aria-pressed`,String(n)));this.stayBtn&&(this.stayBtn.classList.toggle(`tcw-active`,e.stayInDrawing),this.stayBtn.setAttribute(`aria-pressed`,String(e.stayInDrawing)))}addHostButton(e){let t=document.createElement(`button`);return t.type=`button`,t.className=`tcw-sidebar-btn tcw-host-btn`,t.dataset.hostButton=e.id,t.title=e.label,t.setAttribute(`aria-label`,e.label),e.toggle&&t.setAttribute(`aria-pressed`,`false`),typeof e.icon==`string`?t.innerHTML=D(e.icon,14):t.appendChild(e.icon),t.addEventListener(`click`,()=>e.onClick(t)),this.hostEl?.appendChild(t),this.tidy(),t}hostSlot(){return this.hostEl}tidy(){Ye(this.el,`tcw-sidebar-divider`,`tcw-sidebar-spacer`)}toggleButton(e,t,n){let r=document.createElement(`button`);return r.className=`tcw-sidebar-btn`,r.title=t,r.setAttribute(`aria-label`,t),r.setAttribute(`aria-pressed`,`false`),r.innerHTML=D(e,14),r.addEventListener(`click`,n),r}appendDivider(){this.el.lastElementChild?.classList.contains(`tcw-sidebar-divider`)||this.el.appendChild(this.divider())}divider(){let e=document.createElement(`div`);return e.className=`tcw-sidebar-divider`,e}destroy(){this.setOpen(!1),this.hideFlyout(),this.fab.remove(),this.el.remove()}},bn=`button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])`;function j(e,t){if(e.key!==`Tab`)return;let n=document.activeElement,r=[...t.querySelectorAll(bn)].filter(e=>e.tabIndex>=0&&(e.getClientRects().length>0||e===n));if(r.length===0)return;let i=r[0],a=r[r.length-1],o=n instanceof Node&&t.contains(n),s=(e,t)=>(e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_PRECEDING)!==0;e.shiftKey&&(!o||n===i||s(i,n))?(e.preventDefault(),a.focus()):!e.shiftKey&&(!o||n===a||s(n,a))&&(e.preventDefault(),i.focus())}function M(e,t){let n=document.createElement(`label`);n.className=`tcw-settings-row`;let r=document.createElement(`span`);return r.className=`tcw-settings-label`,r.textContent=e,n.append(r,t),n}function xn(e,t,n){let r=document.createElement(`label`);r.className=`tcw-settings-row tcw-check-row`;let i=document.createElement(`input`);i.type=`checkbox`,i.checked=t,i.addEventListener(`change`,()=>n(i.checked));let a=document.createElement(`span`);return a.className=`tcw-settings-label`,a.textContent=e,r.append(i,a),r}function Sn(e,t){let n=document.createElement(`button`);return n.type=`button`,n.className=`tcw-toggle${e?` tcw-on`:``}`,n.setAttribute(`role`,`switch`),n.setAttribute(`aria-checked`,String(e)),n.addEventListener(`click`,()=>{let e=!n.classList.contains(`tcw-on`);n.classList.toggle(`tcw-on`,e),n.setAttribute(`aria-checked`,String(e)),t(e)}),n}function N(e,t,n){let r=document.createElement(`input`);return r.type=`number`,r.className=`tcw-indi-input`,r.value=String(e),r.step=String(t.step??(Number.isInteger(e)?1:.001)),t.min!==void 0&&(r.min=String(t.min)),t.max!==void 0&&(r.max=String(t.max)),r.addEventListener(`change`,()=>{if(r.value.trim()===``)return;let e=Number(r.value);Number.isFinite(e)&&(t.min!==void 0&&(e=Math.max(t.min,e)),t.max!==void 0&&(e=Math.min(t.max,e)),r.value=String(e),n(e))}),r}function Cn(e,t){let n=document.createElement(`input`);return n.type=`color`,n.className=`tcw-indi-color`,n.value=F(e),n.addEventListener(`input`,()=>t(n.value)),n}function P(e,t,n){let r=document.createElement(`select`);r.className=`tcw-indi-input tcw-indi-select`;for(let t of e){let e=document.createElement(`option`);e.value=t.value,e.textContent=t.label,r.appendChild(e)}return r.value=t,r.addEventListener(`change`,()=>n(r.value)),r}function F(e){if(typeof e!=`string`)return`#000000`;let t=e.trim();if(/^#[0-9a-f]{6}$/i.test(t))return t.toLowerCase();if(/^#[0-9a-f]{8}$/i.test(t))return t.slice(0,7).toLowerCase();if(/^#[0-9a-f]{3,4}$/i.test(t))return`#${t[1]}${t[1]}${t[2]}${t[2]}${t[3]}${t[3]}`.toLowerCase();let n=/^rgba?\(\s*(\d+)[\s,]+(\d+)[\s,]+(\d+)/i.exec(t);if(n)return`#${[n[1],n[2],n[3]].map(e=>Math.min(255,Number(e)).toString(16).padStart(2,`0`)).join(``)}`;let r=wn(t);return r!==null&&r!==t?F(r):`#000000`}var I;function wn(e){if(I===void 0)try{I=typeof document<`u`?document.createElement(`canvas`).getContext(`2d`):null}catch{I=null}if(!I)return null;I.fillStyle=`#010203`,I.fillStyle=e;let t=String(I.fillStyle);return t===`#010203`?null:t}function Tn(e){if(typeof e!=`string`)return 1;let t=/^rgba\([^)]*,\s*([\d.]+)\s*\)$/i.exec(e.trim());return t?Math.max(0,Math.min(1,Number(t[1]))):1}function En(e,t){let n=F(e),[r,i,a]=[1,3,5].map(e=>parseInt(n.slice(e,e+2),16));return`rgba(${r}, ${i}, ${a}, ${Math.round(t*100)/100})`}var Dn={ArrowRight:1,ArrowDown:1,ArrowLeft:-1,ArrowUp:-1};function On(e,t,n,r){let i=document.createElement(`div`);i.className=`tcw-segmented`,i.setAttribute(`role`,`radiogroup`),i.setAttribute(`aria-label`,r);let a=e.map(e=>{let t=document.createElement(`button`);return t.type=`button`,t.className=`tcw-segment`,t.setAttribute(`role`,`radio`),t.dataset.value=e.value,t.textContent=e.label,t.addEventListener(`click`,()=>s(e.value)),t}),o=e=>{let t=Math.max(0,a.findIndex(t=>t.dataset.value===e));a.forEach((n,r)=>{n.setAttribute(`aria-checked`,String(n.dataset.value===e)),n.tabIndex=r===t?0:-1})},s=e=>{o(e),n(e)};return i.addEventListener(`keydown`,t=>{let n=a.findIndex(e=>e===t.target);if(n<0||t.altKey||t.ctrlKey||t.metaKey)return;let r=a.length-1,o;if(t.key===`Home`)o=0;else if(t.key===`End`)o=r;else if(t.key in Dn){let e=i.closest(`[dir]`)?.getAttribute(`dir`)===`rtl`,r=t.key===`ArrowLeft`||t.key===`ArrowRight`;o=(n+(e&&r?-Dn[t.key]:Dn[t.key])+a.length)%a.length}else return;t.preventDefault(),a[o].focus(),s(e[o].value)}),o(t),i.append(...a),i}function kn(e,t,r){if(!(r>0)||!Number.isFinite(e))return e;let i=e/r,a=Math.round(i),o=Math.abs(i-a)<1e-9*Math.max(1,Math.abs(i)),s=t>0?o?a+1:Math.ceil(i):o?a-1:Math.floor(i);return s<1?e:Number((s*r).toFixed((0,n.stepDecimals)(r)))}function An(e,t){let n=document.createElement(`div`);n.className=`tcw-stepper`,n.dir=`ltr`;let r=n=>{let r=Number(e.value),i=e.value.trim()!==``&&Number.isFinite(r)?r:t.fallback?.()??0,a=kn(i,n,t.step(i,n));e.value=t.format?t.format(a):String(a),e.dispatchEvent(new Event(`input`))},i=(e,t)=>{let n=document.createElement(`button`);return n.type=`button`,n.className=`tcw-stepper-btn`,n.tabIndex=-1,n.setAttribute(`aria-label`,t),n.innerHTML=D(e>0?`plus`:`minus`,14),n.addEventListener(`click`,()=>r(e)),n};e.addEventListener(`keydown`,e=>{e.key!==`ArrowUp`&&e.key!==`ArrowDown`||(e.preventDefault(),r(e.key===`ArrowUp`?1:-1))});let a=i(-1,t.labels.down),o=i(1,t.labels.up);return n.append(a,e,o),{element:n,down:a,up:o}}var jn=0,Mn=0,Nn=20;function Pn(e){let t=document.createElement(`div`);if(t.className=`tcw-settings-section`,e){let n=document.createElement(`div`);n.className=`tcw-settings-section-title`,n.textContent=e,t.appendChild(n),t.setAttribute(`role`,`group`),t.setAttribute(`aria-label`,e)}return t}function Fn(e){let t=document.createElement(`div`);t.className=`tcw-settings-row`;let n=document.createElement(`span`);return n.className=`tcw-settings-label`,n.textContent=e,t.appendChild(n),t}function In(e,t,n,r,i){let a=Fn(e),o=document.createElement(`div`);o.className=`tcw-color-picker-wrap`;let s=document.createElement(`input`);s.type=`color`,s.setAttribute(`aria-label`,e);let c=document.createElement(`span`);c.className=`tcw-color-hex`,c.id=`tcw-color-${++jn}`,s.setAttribute(`aria-describedby`,c.id);let l=null,u=t=>{s.value=F(t??r.start?.()),c.textContent=t??i(`settings.auto`),a.classList.toggle(`tcw-color-auto`,t===null),t!==null&&r.start&&!l?(l=document.createElement(`button`),l.type=`button`,l.className=`tcw-color-auto-btn`,l.textContent=i(`settings.auto`),l.setAttribute(`aria-label`,`${e}: ${i(`settings.auto`)}`),l.addEventListener(`click`,()=>{n(null),s.focus(),u(r.read())}),o.appendChild(l)):t===null&&l&&(l.remove(),l=null)};return s.addEventListener(`input`,()=>{n(s.value),u(s.value)}),o.append(s,c),a.appendChild(o),u(t),{row:a,sync:()=>u(r.read())}}function L(e,t,n){let r=Fn(e),i=document.createElement(`button`);return i.type=`button`,i.className=`tcw-toggle${t?` tcw-on`:``}`,i.setAttribute(`role`,`switch`),i.setAttribute(`aria-checked`,String(t)),i.setAttribute(`aria-label`,e),i.addEventListener(`click`,()=>{let e=!i.classList.contains(`tcw-on`);i.classList.toggle(`tcw-on`,e),i.setAttribute(`aria-checked`,String(e)),n(e)}),r.appendChild(i),r}function R(e,t,n,r){let i=Fn(e),a=document.createElement(`select`);a.className=`tcw-settings-select`,a.setAttribute(`aria-label`,e);for(let e of n){let n=document.createElement(`option`);n.value=e.value,n.textContent=e.label,e.value===t&&(n.selected=!0),a.appendChild(n)}return n.some(e=>e.value===t)||(a.selectedIndex=-1),a.addEventListener(`change`,()=>r(a.value)),i.appendChild(a),i}function Ln(e,t,n,r,i=e=>String(e)){let a=Fn(e),o=document.createElement(`div`);o.className=`tcw-settings-range`;let s=document.createElement(`input`);s.type=`range`,s.min=String(n.min),s.max=String(n.max),s.step=String(n.step),s.value=String(t),s.setAttribute(`aria-label`,e);let c=document.createElement(`span`);return c.className=`tcw-settings-range-val`,c.textContent=i(t),s.addEventListener(`input`,()=>{let e=Number(s.value);c.textContent=i(e),r(e)}),o.append(s,c),a.appendChild(o),a}function Rn(e,n,r){let i=new Intl.NumberFormat(r,{maximumFractionDigits:Nn}).format;return e.step===`1`&&Number.isFinite(e.max)?t.r(n(`settings.numberWhole`),{min:i(Math.max(1,e.min??1)),max:i(e.max)}):t.r(n(`settings.numberAtLeast`),{min:i(e.min??0)})}function zn(e,t,n,r,i,a=`en-US`){let o=document.createElement(`div`);o.className=`tcw-settings-row tcw-settings-row--number`;let s=document.createElement(`label`);s.className=`tcw-settings-label`,s.textContent=e,o.appendChild(s);let c=document.createElement(`input`);c.type=`number`,c.className=`tcw-settings-number`,c.min=`0`,c.step=n.step,Number.isFinite(n.max)&&(c.max=String(n.max)),c.placeholder=i(`settings.auto`),c.value=t===null?``:String(t),c.setAttribute(`aria-label`,e);let l=document.createElement(`div`);l.className=`tcw-settings-hint`,l.id=`tcw-number-hint-${++Mn}`,l.setAttribute(`role`,`status`),c.setAttribute(`aria-describedby`,l.id);let u=e=>{e?c.removeAttribute(`aria-invalid`):c.setAttribute(`aria-invalid`,`true`),l.textContent=e?``:Rn(n,i,a)};return c.addEventListener(`change`,()=>{if(c.value.trim()===``){u(!0),r(null);return}let e=Number(c.value),t=Number.isFinite(e)&&e>0&&e>=(n.min??0)&&e<=n.max&&(n.step!==`1`||Number.isInteger(e));u(t),t&&r(e)}),o.append(c,l),o}var z=[{id:`symbol`,icon:`chartType:candlestick`},{id:`statusLine`,icon:`type`},{id:`scales`,icon:`ruler`},{id:`appearance`,icon:`palette`},{id:`layers`,icon:`layers`},{id:`trading`,icon:`trendingUp`}],Bn=[1,2,3,4],Vn=`t:`,Hn={step:`any`,max:1/0,min:1e-8},Un=1,Wn=class{callbacks;t;backdrop=null;modal=null;bodyEl=null;tabButtons=[];templateBtn=null;menu=null;currentTab=`symbol`;currentSettings=null;chartType=null;lookRows=[];returnFocus=null;uid=Un++;constructor(e,t,n={},r=()=>document.body){this.available=n,this.host=r,this.callbacks=e,this.t=t}open(e,t=null,n=`symbol`){this.modal&&this.remove(),this.returnFocus=document.activeElement instanceof HTMLElement?document.activeElement:null,this.currentSettings={...e},this.chartType=t,this.currentTab=n,this.buildModal(),this.tabButtons.find(e=>e.dataset.tab===n)?.focus()}isOpen(){return this.modal!==null}refresh(e,t){if(!this.modal)return;this.currentSettings={...e},t!==void 0&&(this.chartType=t);let n=this.focusedControl();this.renderTabContent(),n!==null&&this.focusControl(n)}focusedControl(){let e=document.activeElement;if(!this.bodyEl||!(e instanceof HTMLElement)||!this.bodyEl.contains(e))return null;let t=this.panelControls().indexOf(e);return t<0?null:t}focusControl(e){let t=this.panelControls();(t[Math.min(e,t.length-1)]??this.tabButtons.find(e=>e.dataset.tab===this.currentTab))?.focus()}panelControls(){return this.bodyEl?[...this.bodyEl.querySelectorAll(bn)]:[]}close(){this.finish(!0)}destroy(){this.remove()}finish(e){this.modal&&(e?this.callbacks.onClose():this.callbacks.onCancel?.(),this.remove(),this.returnFocus?.isConnected&&this.returnFocus.focus(),this.returnFocus=null)}remove(){this.menu?.destroy(),this.menu=null,this.backdrop?.remove(),this.backdrop=this.modal=this.bodyEl=this.templateBtn=null,this.tabButtons=[]}buildModal(){let e=document.createElement(`div`);e.className=`tcw-modal-backdrop`;let t=!1;e.addEventListener(`pointerdown`,n=>{t=n.target===e}),e.addEventListener(`click`,n=>{n.target===e&&t&&this.finish(!1),t=!1});let n=document.createElement(`div`);n.className=`tcw-modal tcw-set`,n.setAttribute(`role`,`dialog`),n.setAttribute(`aria-modal`,`true`),n.setAttribute(`aria-labelledby`,`tcw-set-title-${this.uid}`),n.tabIndex=-1,n.addEventListener(`keydown`,e=>{if(e.key===`Escape`){e.preventDefault(),e.stopPropagation(),this.finish(!1);return}j(e,n)}),this.backdrop=e,this.modal=n,n.append(this.buildHeader(),this.buildBody(),this.buildFooter()),e.appendChild(n),this.host().appendChild(e),this.markTabs(),this.renderTabContent()}buildHeader(){let e=document.createElement(`div`);e.className=`tcw-modal-header`;let t=document.createElement(`h3`);t.id=`tcw-set-title-${this.uid}`,t.textContent=this.t(`settings.title`);let n=document.createElement(`button`);return n.type=`button`,n.className=`tcw-modal-close`,n.setAttribute(`aria-label`,this.t(`common.close`)),n.innerHTML=D(`x`,16),n.addEventListener(`click`,()=>this.finish(!1)),e.append(t,n),e}buildBody(){let e=document.createElement(`div`);e.className=`tcw-set-body`;let t=document.createElement(`div`);t.className=`tcw-set-nav`,t.setAttribute(`role`,`tablist`),t.setAttribute(`aria-orientation`,`vertical`),t.setAttribute(`aria-label`,this.t(`settings.title`)),t.addEventListener(`keydown`,e=>this.onTabKey(e)),this.tabButtons=z.map(({id:e,icon:t})=>{let n=document.createElement(`button`);return n.type=`button`,n.className=`tcw-set-tab`,n.id=`tcw-set-tab-${this.uid}-${e}`,n.dataset.tab=e,n.setAttribute(`role`,`tab`),n.setAttribute(`aria-controls`,`tcw-set-panel-${this.uid}`),n.innerHTML=`${t.startsWith(`chartType:`)?rt(t.slice(10),16):D(t,16)}<span></span>`,n.querySelector(`span`).textContent=this.t(`settings.tab.${e}`),n.addEventListener(`click`,()=>this.selectTab(e)),n}),t.append(...this.tabButtons);let n=document.createElement(`div`);return n.className=`tcw-modal-body tcw-set-panel`,n.id=`tcw-set-panel-${this.uid}`,n.setAttribute(`role`,`tabpanel`),this.bodyEl=n,e.append(t,n),e}buildFooter(){let e=document.createElement(`div`);e.className=`tcw-modal-footer`;let t=this.footerButton(`template`,`tcw-footer-menu`,()=>this.openTemplates());t.setAttribute(`aria-haspopup`,`menu`),t.setAttribute(`aria-expanded`,`false`),t.innerHTML=`<span></span>${D(`chevronDown`,12)}`,t.querySelector(`span`).textContent=this.t(`settings.template`),this.templateBtn=t;let n=document.createElement(`div`);return n.className=`tcw-footer-end`,n.append(this.footerButton(`cancel`,`tcw-footer-cancel`,()=>this.finish(!1),this.t(`common.cancel`)),this.footerButton(`ok`,`tcw-done-btn`,()=>this.finish(!0),this.t(`drawingSettings.ok`))),e.append(t,n),e}footerButton(e,t,n,r){let i=document.createElement(`button`);return i.type=`button`,i.className=t,i.dataset.act=e,r&&(i.textContent=r),i.addEventListener(`click`,n),i}markTabs(){for(let e of this.tabButtons){let t=e.dataset.tab===this.currentTab;e.classList.toggle(`tcw-active`,t),e.setAttribute(`aria-selected`,String(t)),e.tabIndex=t?0:-1,t&&this.bodyEl?.setAttribute(`aria-labelledby`,e.id)}}selectTab(e,t=!1){this.currentTab=e,this.markTabs(),this.renderTabContent(),t&&this.tabButtons.find(t=>t.dataset.tab===e)?.focus()}onTabKey(e){let t=z.findIndex(e=>e.id===this.currentTab),n=e.key===`ArrowDown`||e.key===`ArrowRight`?(t+1)%z.length:e.key===`ArrowUp`||e.key===`ArrowLeft`?(t-1+z.length)%z.length:e.key===`Home`?0:e.key===`End`?z.length-1:-1;n<0||(e.preventDefault(),this.selectTab(z[n].id,!0))}openTemplates(){let e=this.templateBtn;if(!this.modal||!e)return;if(this.menu?.isOpen()){this.menu.close();return}let n=this.callbacks.templates,r=(n?.list()??[]).map(e=>({id:`${Vn}${e}`,label:e,icon:`layers`,remove:t.r(this.t(`templates.delete`),{name:e})})),i=[...r,...r.length>0?[`separator`]:[],...n?[{id:`save`,label:this.t(`settings.saveTemplate`),icon:`save`}]:[],{id:`reset`,label:this.t(`settings.resetToDefaults`),icon:`reset`}];this.menu??=new k(this.modal,this.t(`settings.template`));let a=e.getBoundingClientRect(),o=this.modal.getBoundingClientRect();this.menu.open(i,a.left-o.left,a.top-o.top,e=>{e===`reset`?this.callbacks.onReset():e===`save`?n?.save():e.startsWith(Vn)&&n?.apply(e.slice(2))},e,e=>n?.remove(e.slice(2)))}renderTabContent(){if(!(!this.bodyEl||!this.currentSettings))switch(this.bodyEl.replaceChildren(),this.lookRows=[],this.currentTab){case`symbol`:this.renderSymbolTab(this.currentSettings);break;case`statusLine`:this.renderStatusLineTab(this.currentSettings);break;case`scales`:this.renderScalesTab(this.currentSettings);break;case`appearance`:this.renderAppearanceTab(this.currentSettings);break;case`layers`:this.renderLayersTab(this.currentSettings);break;case`trading`:for(let e of De)(!e.trading||this.available.trading!==!1)&&this.renderLookSection(e);break}}renderSymbolTab(e){this.renderChartTypeSection(),this.addSection(void 0,[L(this.t(`settings.mainSeries`),e.mainSeriesVisible,e=>this.patch({mainSeriesVisible:e})),L(this.t(`settings.extendedHours`),e.extendedHours,e=>this.patch({extendedHours:e}))]);let t=this.t(`common.show`);this.renderLookSection(ye),this.available.volume!==!1&&this.renderLookSection(be,[L(t,e.volumeVisible,e=>this.patch({volumeVisible:e}))]),this.renderLookSection(xe,[L(t,e.highLowLines,e=>this.patch({highLowLines:e}))])}renderStatusLineTab(e){let t=this.available.legend!==!1,n=t?we:we.filter(e=>!Ce.includes(e));this.addSection(void 0,[...t?[L(this.t(`settings.ohlcLegend`),e.legendVisible,e=>this.patch({legendVisible:e}))]:[],...n.map(e=>this.lookRow(e))])}renderScalesTab(e){let t=[{value:`regular`,label:this.t(`settings.scale.regular`)},{value:`logarithmic`,label:this.t(`settings.scale.logarithmic`)},{value:`percentage`,label:this.t(`settings.scale.percentage`)},{value:`indexedTo100`,label:this.t(`settings.scale.indexedTo100`)}].filter(e=>e.value!==`logarithmic`||this.available.logScale!==!1),n=this.available.exchangeZone?.(),r=f(e.timezone,Date.now(),this.t(`settings.timezone.local`),n===void 0?void 0:{label:this.t(`settings.timezone.exchange`),zone:n});this.addSection(void 0,[R(this.t(`settings.priceScale`),e.scaleMode,t,e=>this.patch({scaleMode:e})),L(this.t(`settings.autoScale`),e.autoScale,e=>this.patch({autoScale:e})),L(this.t(`settings.invertScale`),e.invertScale,e=>this.patch({invertScale:e})),L(this.t(`settings.leftScale`),e.leftPriceScale,e=>this.patch({leftPriceScale:e})),L(this.t(`settings.indicatorValues`),e.indicatorValueLabels,e=>this.patch({indicatorValueLabels:e})),...this.available.barCountdown===!1?[]:[L(this.t(`settings.barCountdown`),e.barCountdown,e=>this.patch({barCountdown:e}))],R(this.t(`settings.timezone`),e.timezone,r,e=>this.patch({timezone:e})),R(this.t(`settings.numberLocale`),e.numberLocale,_t(e.numberLocale),e=>this.patch({numberLocale:e}))]),this.addSection(this.t(`settings.section.axes`),Te.map(e=>this.lookRow(e)))}renderAppearanceTab(e){let[t,n,r,...i]=Ee;this.renderLookSection(t),this.renderLookSection(n,[L(this.t(`common.show`),e.gridVisible,e=>this.patch({gridVisible:e}))]),this.renderLookSection(r,[R(this.t(`settings.crosshairMode`),e.crosshairMode,[{label:this.t(`settings.crosshair.magnet`),value:`magnet`},{label:this.t(`settings.crosshair.normal`),value:`normal`},{label:this.t(`settings.crosshair.hidden`),value:`hidden`}],e=>this.patch({crosshairMode:e}))]);for(let e of i)this.renderLookSection(e)}renderLayersTab(e){let t=e=>`${Math.round(e*100)}%`,n=e=>this.t(e);this.addSection(void 0,[L(n(`settings.volumeProfile`),e.volumeProfileVisible,e=>this.patch({volumeProfileVisible:e}))]),this.addSection(void 0,[L(n(`settings.marketProfile`),e.marketProfileVisible,e=>this.patch({marketProfileVisible:e})),L(n(`settings.marketProfileSplit`),e.marketProfileSplit,e=>this.patch({marketProfileSplit:e})),L(n(`settings.marketProfileLetters`),e.marketProfileLetters,e=>this.patch({marketProfileLetters:e})),Ln(n(`settings.marketProfileBuckets`),e.marketProfileBuckets,{min:8,max:200,step:1},e=>this.patch({marketProfileBuckets:e})),Ln(n(`settings.marketProfileOpacity`),e.marketProfileOpacity,{min:.05,max:1,step:.05},e=>this.patch({marketProfileOpacity:e}),t)]),this.addSection(void 0,[L(n(`settings.depthHeatmap`),e.depthHeatmapVisible,e=>this.patch({depthHeatmapVisible:e})),Ln(n(`settings.depthHeatmapOpacity`),e.depthHeatmapOpacity,{min:.1,max:1,step:.05},e=>this.patch({depthHeatmapOpacity:e}),t)]),this.addSection(void 0,[L(n(`settings.swingMarkers`),e.pivotMarkersVisible,e=>this.patch({pivotMarkersVisible:e})),Ln(n(`settings.swingStrength`),e.pivotStrength,{min:2,max:20,step:1},e=>this.patch({pivotStrength:e})),L(n(`settings.swingStructure`),e.pivotStructureLabels,e=>this.patch({pivotStructureLabels:e}))]),this.addSection(void 0,[L(n(`settings.sessionShading`),e.sessionShadingVisible,e=>this.patch({sessionShadingVisible:e})),L(n(`settings.periodLevels`),e.periodLevelsVisible,e=>this.patch({periodLevelsVisible:e})),R(n(`settings.periodLevelsBasis`),e.periodLevelsPeriod,[{value:`day`,label:n(`settings.priorDay`)},{value:`week`,label:n(`settings.priorWeek`)}],e=>this.patch({periodLevelsPeriod:e}))])}addSection(e,t){let n=Pn(e);return n.append(...t),this.bodyEl?.appendChild(n),n}renderLookSection(e,t=[]){this.addSection(this.t(e.title),[...t,...e.rows.map(e=>this.lookRow(e))])}lookRow(e){let t=this.t(e.label),r=()=>this.callbacks.styleValue(e.keys[0]),i=()=>{let t=e.keys.map(e=>this.callbacks.styleValue(e));return t.every(e=>e===t[0])&&t[0]!==null?String(t[0]):``},a,o=t=>{this.callbacks.onStyleChange(Object.fromEntries(e.keys.map(e=>[e,t])));for(let e of this.lookRows)e.el!==a&&e.sync()},s=e.auto?[{value:``,label:this.t(`settings.auto`)}]:[],c;switch(n.CHART_STYLE_KEYS[e.keys[0]]){case`boolean`:{a=L(t,r()===!0,o);let e=a.querySelector(`button`);c=()=>{let t=r()===!0;e.classList.toggle(`tcw-on`,t),e.setAttribute(`aria-checked`,String(t))};break}case`lineStyle`:a=R(t,i(),[...s,...this.lineStyles()],e=>o(e===``?null:Kn(e))),c=()=>{a.querySelector(`select`).value=i()};break;case`width`:{let e=r(),n=typeof e==`number`&&!Bn.includes(e)?[...Bn,e].sort((e,t)=>e-t):Bn;a=R(t,i(),[...s,...n.map(e=>({value:String(e),label:`${e}px`}))],e=>o(e===``?null:Number(e))),c=()=>{a.querySelector(`select`).value=i()};break}default:{let n=r(),i=In(t,typeof n==`string`?n:null,o,{read:()=>{let e=r();return typeof e==`string`?e:null},start:e.auto?()=>(e.auto?.from?this.callbacks.styleValue(e.auto.from):e.auto?.hint)??null:void 0},this.t);a=i.row,c=i.sync}}return this.lookRows.push({el:a,sync:c}),a}lineStyles(){return[{value:`solid`,label:this.t(`drawingSettings.lineStyle.solid`)},{value:`dashed`,label:this.t(`drawingSettings.lineStyle.dashed`)},{value:`dotted`,label:this.t(`drawingSettings.lineStyle.dotted`)}]}renderChartTypeSection(){if(!this.bodyEl||!this.currentSettings||!this.chartType)return;let e=this.chartType,t=this.currentSettings.chartTypeOptions??{},n=me.find(t=>t.value===e),r=Pn(n?yt(n,this.t):e),i=()=>this.currentSettings?.chartTypeOptions??{},a=(e,t)=>this.patch({chartTypeOptions:{...i(),[e]:t}}),o=(e,t,n,i)=>r.appendChild(zn(this.t(e),t,n,i,this.t,this.currentSettings?.numberLocale||void 0));switch(e){case`renko`:{let e=t.renko??{};o(`settings.boxSize`,typeof e.boxSize==`number`?e.boxSize:null,Hn,e=>a(`renko`,{...i().renko??{},boxSize:e??`atr`})),o(`settings.atrPeriod`,e.atrPeriod??null,{step:`1`,max:500},e=>a(`renko`,Gn(i().renko,`atrPeriod`,e)));break}case`lineBreak`:o(`settings.lineBreakLines`,t.lineBreak?.lines??null,{step:`1`,max:10},e=>a(`lineBreak`,Gn(i().lineBreak,`lines`,e)));break;case`kagi`:o(`settings.reversal`,t.kagi?.reversal??null,Hn,e=>a(`kagi`,Gn(i().kagi,`reversal`,e))),r.appendChild(R(this.t(`settings.reversalType`),t.kagi?.reversalType??`percent`,[{value:`percent`,label:this.t(`settings.reversalType.percent`)},{value:`price`,label:this.t(`settings.reversalType.price`)}],e=>a(`kagi`,{...i().kagi??{},reversalType:e===`price`?`price`:`percent`})));break;case`pointAndFigure`:o(`settings.boxSize`,typeof t.pointAndFigure?.boxSize==`number`?t.pointAndFigure.boxSize:null,Hn,e=>a(`pointAndFigure`,{...i().pointAndFigure??{},boxSize:e??`auto`})),o(`settings.reversalBoxes`,t.pointAndFigure?.reversal??null,{step:`1`,max:10},e=>a(`pointAndFigure`,Gn(i().pointAndFigure,`reversal`,e)));break;case`rangeBars`:o(`settings.barRange`,typeof t.rangeBars?.range==`number`?t.rangeBars.range:null,Hn,e=>a(`rangeBars`,{range:e??`auto`}));break;default:break}for(let t of Ae(e))r.appendChild(this.lookRow(t));this.bodyEl.appendChild(r)}patch(e){this.currentSettings&&Object.assign(this.currentSettings,e),this.callbacks.onChange(e)}};function Gn(e,t,n){let r={...e??{}};return n===null?delete r[t]:r[t]=n,r}function Kn(e){return e===`dashed`||e===`dotted`?e:`solid`}var qn=`data-tcw-folded`,Jn=`tcw-statusbar--folded`,Yn=`tcw-statusbar--short-market`,Xn=1,Zn=13,Qn=`goto`,$n=`Alt+G`,er=e=>e.goToKeys?e.goToKeys():$n;function tr(e,t){let n=document.createElement(`span`);return n.className=e,n.textContent=t,n}var nr=class{el;dotEl;messageEl;marketEl;hostLeft;hostRight;clockBtn=null;clockMenu=null;scaleBtns=null;scaleShown=``;marketShown=``;rightEl;rangeEl=null;presetBtns=[];moreBtn=null;goToBtn=null;rangeMenu=null;resizeObserver=null;fitFrame=0;destroyed=!1;constructor(e,t,n={}){this.host=e,this.extras=n,this.el=document.createElement(`div`),this.el.className=`tcw-statusbar`,E(this.el,`statusBar`),n.label&&(this.el.setAttribute(`role`,`group`),this.el.setAttribute(`aria-label`,n.label)),t&&this.el.appendChild(this.buildRange(t)),this.hostLeft=this.hostGroup(),this.el.appendChild(this.hostLeft);let r=document.createElement(`div`);r.className=`tcw-status-right`,this.rightEl=r,this.hostRight=this.hostGroup(),r.appendChild(this.hostRight);let i=document.createElement(`div`);i.className=`tcw-status-indicator`,E(i,`statusBar.connection`),this.dotEl=document.createElement(`span`),this.dotEl.className=`tcw-status-dot`,i.appendChild(this.dotEl),this.messageEl=document.createElement(`span`),i.appendChild(this.messageEl),this.marketEl=document.createElement(`span`),this.marketEl.className=`tcw-status-market`,this.marketEl.hidden=!0,E(this.marketEl,`statusBar.market`),r.appendChild(this.marketEl),r.appendChild(i),n.clock&&r.appendChild(this.buildClock(n.clock)),n.scale&&r.appendChild(this.buildScale(n.scale)),this.el.appendChild(r),e.appendChild(this.el),this.watchWidths(r)}watchWidths(e){if(typeof ResizeObserver<`u`){this.resizeObserver=new ResizeObserver(()=>this.scheduleFit());for(let t of[this.el,e,this.hostLeft])this.resizeObserver.observe(t)}document.fonts?.ready.then(()=>this.scheduleFit())}scheduleFit(){this.destroyed||this.fitFrame||typeof requestAnimationFrame>`u`||(this.fitFrame=requestAnimationFrame(()=>{this.fitFrame=0,this.destroyed||this.fit()}))}fit(){let e=this.foldedCount(),t=this.rangeFocus();this.refit(),this.foldedCount()!==e&&this.rangeMenu?.close(),this.keepFocus(t)}refit(){let e=this.foldSteps(),t=this.goToBtn?[...this.presetBtns,this.goToBtn]:this.presetBtns,n=n=>{let r=new Set(e.slice(0,n));for(let e of t)e.toggleAttribute(qn,r.has(e));this.el.classList.toggle(Jn,n>0)};if(n(0),this.el.classList.remove(Yn),this.el.clientWidth===0||this.fits())return;let r=0;for(;r<e.length;)if(n(++r),this.fits())return;if(!(this.marketEl.hidden||this.isOff(this.marketEl))){for(this.el.classList.add(Yn);r>0;r--)if(n(r-1),!this.fits()){n(r);return}}}fits(){return this.rangeFits()&&this.rightFits()}rangeFits(){let e=this.rangeEl;return!e||e.scrollWidth<=e.clientWidth+Xn}rightFits(){if(this.rightEl.offsetParent!==this.el)return!0;let e=getComputedStyle(this.el),t=this.rightEl.offsetLeft;return(e.direction===`rtl`?(parseFloat(e.paddingLeft)||0)-t:t+this.rightEl.offsetWidth-(this.el.clientWidth-(parseFloat(e.paddingRight)||0)))<=Xn}foldedCount(){return this.rangeEl?.querySelectorAll(`[${qn}]`).length??0}rangeFocus(){if(this.rangeMenu?.hasFocus())return this.moreBtn;let e=document.activeElement;return e instanceof HTMLElement&&this.rangeEl?.contains(e)?e:null}keepFocus(e){if(!e||this.rangeMenu?.isOpen())return;let t=this.focusAfterRefit(e);t===this.el?this.focusBar():document.activeElement!==t&&t.focus({preventScroll:!0})}focusAfterRefit(e){if(this.shows(e))return e;let t=this.presetBtns.filter(e=>this.shows(e)).at(-1);return[e===this.moreBtn?null:this.moreBtn,this.goToBtn,t].find(e=>e!=null&&this.shows(e))??this.firstOtherControl()??this.el}firstOtherControl(){return[...this.el.querySelectorAll(`button`)].filter(e=>!this.rangeEl?.contains(e)).find(e=>!e.disabled&&e.getClientRects().length>0)??null}focusBar(){if(document.activeElement===this.el)return;let e=()=>this.el.removeAttribute(`tabindex`);this.el.tabIndex=-1,this.el.addEventListener(`blur`,e,{once:!0}),this.el.focus({preventScroll:!0}),document.activeElement!==this.el&&(this.el.removeEventListener(`blur`,e),e())}shows(e){return e===this.moreBtn&&!this.el.classList.contains(Jn)?!1:!e.hasAttribute(qn)&&!this.isOff(e)}foldSteps(){if(this.presetBtns.length===0||this.isOff(this.presetBtns[0]))return[];let e=[...this.presetBtns].reverse();return this.goToBtn&&e.push(this.goToBtn),e}isOff(e){let t=((this.el.closest(`.tcw-root`)??this.host).getAttribute(`data-tcw-off`)??``).split(/\s+/).filter(Boolean);return(e.dataset.tcwPart??``).split(/\s+/).some(e=>t.includes(e))}update(e){this.dotEl.className=`tcw-status-dot`,e.connectionState===`connected`?this.dotEl.classList.add(`tcw-connected`):e.connectionState===`error`&&this.dotEl.classList.add(`tcw-error`),this.messageEl.textContent=e.message}tick(){if(!this.clockBtn||!this.extras.clock)return;let{time:e,zone:t}=this.extras.clock.now(),n=`${e} ${t}`;this.clockBtn.textContent!==n&&(this.clockBtn.textContent=n)}setScale(e){let t=`${e.mode}|${e.auto}`;!this.scaleBtns||t===this.scaleShown||(this.scaleShown=t,this.scaleBtns.percent?.setAttribute(`aria-pressed`,String(e.mode===`percentage`)),this.scaleBtns.log?.setAttribute(`aria-pressed`,String(e.mode===`logarithmic`)),this.scaleBtns.auto?.setAttribute(`aria-pressed`,String(e.auto)))}setMarket(e,t,n=t){let r=`${e}|${t}|${n}`;if(r===this.marketShown)return;if(this.marketShown=r,this.marketEl.hidden=e===`always`,this.marketEl.dataset.state=e,e===`always`){this.marketEl.replaceChildren(),this.marketEl.removeAttribute(`title`);return}this.marketEl.title=t;let i=tr(`tcw-status-market-short`,n);i.setAttribute(`aria-hidden`,`true`),this.marketEl.replaceChildren(tr(`tcw-status-market-text`,t),i)}addHostItem(e){let t=e.onClick,n=t?document.createElement(`button`):document.createElement(`span`);return n.className=t?`tcw-status-host-item tcw-status-host-btn`:`tcw-status-host-item`,n.dataset.hostItem=e.id,n.dir=`auto`,n.textContent=e.text,e.label&&(n.title=e.label,t||n.setAttribute(`role`,`group`),e.label!==e.text&&n.setAttribute(`aria-label`,`${e.label}: ${e.text}`)),n instanceof HTMLButtonElement&&t&&(n.type=`button`,n.addEventListener(`click`,()=>t(n))),(e.side===`left`?this.hostLeft:this.hostRight).appendChild(n),n}hostSlot(e){return e===`left`?this.hostLeft:this.hostRight}destroy(){this.destroyed=!0,this.resizeObserver?.disconnect(),this.fitFrame&&cancelAnimationFrame(this.fitFrame),this.clockMenu?.destroy(),this.rangeMenu?.destroy(),this.el.remove()}buildClock(e){let t=document.createElement(`button`);return t.type=`button`,t.className=`tcw-status-clock`,t.dataset.role=`clock`,t.dir=`auto`,t.title=e.label,t.setAttribute(`aria-haspopup`,`menu`),E(t,`statusBar.clock`),t.addEventListener(`click`,()=>this.toggleZones(t,e)),this.clockBtn=t,this.tick(),t}toggleRangeMenu(e,t){if(this.rangeMenu?.isOpen()){this.rangeMenu.close();return}let n=e=>e.hasAttribute(qn)&&!this.isOff(e),r=t.presets.filter((e,t)=>n(this.presetBtns[t])).map(e=>({id:e,label:t.presetLabels?.[e]??e}));if(this.goToBtn&&n(this.goToBtn)&&(r.length>0&&r.push(`separator`),r.push({id:Qn,label:t.goToLabel,icon:`calendar`,shortcut:er(t)})),r.length===0)return;this.rangeMenu??=new k(this.host,t.groupLabel);let i=e.getBoundingClientRect(),a=this.host.getBoundingClientRect();this.rangeMenu.open(r,i.left-a.left,i.top-a.top,e=>e===Qn?t.onGoTo():t.onPreset(e),e,void 0,i.right-a.left)}toggleZones(e,t){if(this.clockMenu?.isOpen()){this.clockMenu.close();return}let{current:n,list:r}=t.options();this.clockMenu??=new k(this.host,t.label);let i=e.getBoundingClientRect(),a=this.host.getBoundingClientRect();this.clockMenu.open(r.map(e=>({id:e.value,label:e.label,checked:e.value===n})),i.left-a.left,i.top-a.top,e=>t.onPick(e),e,void 0,i.right-a.left)}buildScale(e){let t=document.createElement(`div`);t.className=`tcw-status-scale`,t.setAttribute(`role`,`group`),e.labels.group&&t.setAttribute(`aria-label`,e.labels.group),E(t,`statusBar.scale`);let n=(n,r,i)=>{let a=document.createElement(`button`);return a.type=`button`,a.className=`tcw-status-scale-btn`,a.dataset.scale=n,a.textContent=r,a.title=e.labels[n],a.setAttribute(`aria-label`,e.labels[n]),a.setAttribute(`aria-pressed`,`false`),a.addEventListener(`click`,i),t.appendChild(a),a};return this.scaleBtns={percent:n(`percent`,`%`,e.onPercent),...e.onLog?{log:n(`log`,e.texts?.log??`log`,e.onLog)}:{},auto:n(`auto`,e.texts?.auto??`auto`,e.onAuto)},t}hostGroup(){let e=document.createElement(`div`);return e.className=`tcw-status-host`,e}buildRange(e){let t=document.createElement(`div`);t.className=`tcw-range-bar`,t.setAttribute(`role`,`group`),t.setAttribute(`aria-label`,e.groupLabel);for(let n of e.presets){let r=document.createElement(`button`);r.type=`button`,r.className=`tcw-range-btn`,r.dataset.range=n,E(r,`statusBar.range`),r.textContent=e.presetLabels?.[n]??n,r.addEventListener(`click`,()=>e.onPreset(n)),t.appendChild(r),this.presetBtns.push(r)}let n=this.rangeIconBtn(`tcw-range-more`,`rangeMore`,`more`,e.moreLabel);E(n,`statusBar.range`),n.setAttribute(`aria-haspopup`,`menu`),n.setAttribute(`aria-expanded`,`false`),n.addEventListener(`click`,()=>this.toggleRangeMenu(n,e)),t.appendChild(n),this.moreBtn=n;let r=this.rangeIconBtn(`tcw-range-goto`,`goto`,`calendar`,e.goToLabel);E(r,`goToDate`,`statusBar.goToDate`);let i=()=>{let t=er(e);r.title=t?`${e.goToLabel} (${t})`:e.goToLabel};return i(),r.addEventListener(`pointerover`,i),r.addEventListener(`focusin`,i),r.addEventListener(`click`,e.onGoTo),t.appendChild(r),this.goToBtn=r,this.rangeEl=t,t}rangeIconBtn(e,t,n,r){let i=document.createElement(`button`);return i.type=`button`,i.className=`tcw-range-btn ${e}`,i.dataset.role=t,i.title=r,i.setAttribute(`aria-label`,r),i.innerHTML=D(n,Zn),i}},rr=typeof navigator<`u`&&/mac|iphone|ipad|ipod/i.test(navigator.platform||navigator.userAgent)?`⌘`:`Ctrl`,ir=e=>e.toLowerCase().replace(/[\s+]+/g,``).replace(/[\u2010-\u2015\u2212]/g,`-`),ar=5,or=229,sr=[`action`,`drawing`,`chartType`,`timeframe`,`indicator`],cr={indicator:`palette.group.indicator`,chartType:`palette.group.chartType`,drawing:`palette.group.drawing`,timeframe:`palette.group.timeframe`,action:`palette.group.action`},lr=e=>`${e.category}:${e.id}`;function ur(e,t){let n=e.label.toLowerCase(),r=ir(n);return e.id.toLowerCase()===t||r===t?5:r.startsWith(t)?4:n.split(/[\s/()-]+/).some(e=>e.startsWith(t))?3:r.includes(t)||e.id.toLowerCase().includes(t)?2:e.shortcut&&ir(e.shortcut).includes(t)?1:0}var dr=0,fr=class{backdrop=null;input=null;list=null;emptyEl=null;liveEl=null;items=[];shown=[];selectedIndex=0;returnFocus=null;uid=++dr;constructor(e,n=()=>document.body,r=t.t,i){this.callbacks=e,this.host=n,this.t=r,this.recents=i}open(e){this.backdrop||(this.returnFocus=document.activeElement instanceof HTMLElement?document.activeElement:null,this.items=e,this.build(),this.render(),this.input?.focus())}close(){if(!this.backdrop)return;this.backdrop.remove(),this.backdrop=this.input=this.list=this.emptyEl=this.liveEl=null,this.callbacks.onClose();let e=this.returnFocus;this.returnFocus=null,e?.isConnected&&e.focus()}isOpen(){return this.backdrop!==null}destroy(){this.close()}build(){let e=document.createElement(`div`);e.className=`tcw-modal-backdrop`;let t=!1;e.addEventListener(`pointerdown`,n=>{t=n.target===e}),e.addEventListener(`click`,n=>{n.target===e&&t&&this.close(),t=!1});let n=document.createElement(`div`);n.className=`tcw-modal tcw-cp`,n.setAttribute(`role`,`dialog`),n.setAttribute(`aria-modal`,`true`),n.setAttribute(`aria-label`,this.t(`hotkeys.commandPalette`)),n.tabIndex=-1,n.addEventListener(`keydown`,e=>this.onKeyDown(e,n));let r=document.createElement(`label`);r.className=`tcw-ss-search tcw-cp-search`,r.innerHTML=D(`search`,16);let i=document.createElement(`input`);i.type=`search`,i.className=`tcw-cp-input`,i.placeholder=this.t(`palette.placeholder`),i.setAttribute(`aria-label`,this.t(`palette.placeholder`)),i.setAttribute(`role`,`combobox`),i.setAttribute(`aria-expanded`,`true`),i.setAttribute(`aria-autocomplete`,`list`),i.setAttribute(`aria-controls`,`tcw-cp-list-${this.uid}`),i.autocomplete=`off`,i.spellcheck=!1,i.addEventListener(`input`,()=>this.render()),r.appendChild(i);let a=document.createElement(`div`);a.className=`tcw-cp-results`;let o=document.createElement(`div`);o.className=`tcw-cp-list`,o.id=`tcw-cp-list-${this.uid}`,o.setAttribute(`role`,`listbox`),o.setAttribute(`aria-label`,this.t(`hotkeys.commandPalette`));let s=document.createElement(`div`);s.className=`tcw-cp-empty`,a.append(o,s),a.addEventListener(`mousedown`,e=>e.preventDefault());let c=document.createElement(`div`);c.className=`tcw-cp-live tcw-visually-hidden`,c.setAttribute(`aria-live`,`polite`),n.append(r,a,c),e.appendChild(n),this.host().appendChild(e),this.backdrop=e,this.input=i,this.list=o,this.emptyEl=s,this.liveEl=c}groups(){let e=ir((this.input?.value??``).trim()),t=[];if(!e){let e=new Map(this.items.map(e=>[lr(e),e])),n=(this.recents?.list()??[]).map(t=>e.get(t)).filter(e=>!!e).slice(0,ar);n.length>0&&t.push({key:`recent`,label:this.t(`palette.group.recent`),items:n})}for(let n of sr){let r=this.items.filter(e=>e.category===n);e&&(r=r.map((t,n)=>({item:t,at:n,s:ur(t,e)})).filter(e=>e.s>0).sort((e,t)=>t.s-e.s||e.at-t.at).map(e=>e.item)),r.length>0&&t.push({key:n,label:this.t(cr[n]),items:r})}return e&&t.sort((t,n)=>ur(n.items[0],e)-ur(t.items[0],e)),t}render(){let e=this.list;if(!e)return;let t=this.groups();this.shown=t.flatMap(e=>e.items),this.selectedIndex=0;let n=0;e.replaceChildren(...t.map(e=>{let t=document.createElement(`div`);t.setAttribute(`role`,`group`),t.className=`tcw-cp-group`;let r=document.createElement(`div`);return r.className=`tcw-cp-heading`,r.id=`tcw-cp-${e.key}-${this.uid}`,r.setAttribute(`role`,`presentation`),r.textContent=e.label,t.setAttribute(`aria-labelledby`,r.id),t.append(r,...e.items.map(e=>this.row(e,n++))),t}));let r=this.shown.length===0?this.t(`palette.empty`):``;this.emptyEl&&(this.emptyEl.textContent=r),this.emptyEl?.toggleAttribute(`hidden`,this.shown.length>0),this.liveEl&&(this.liveEl.textContent=r),this.markSelection()}row(e,t){let n=document.createElement(`div`);n.className=`tcw-cp-row`,n.id=`tcw-cp-opt-${this.uid}-${t}`,n.dataset.id=e.id,n.setAttribute(`role`,`option`),n.classList.toggle(`tcw-on`,!!e.active);let r=document.createElement(`span`);if(r.className=`tcw-cp-label`,r.textContent=e.label,n.appendChild(r),e.shortcut){let t=document.createElement(`kbd`);t.className=`tcw-cp-key`,t.dir=`ltr`,t.textContent=e.shortcut,n.appendChild(t)}if(e.active){let e=document.createElement(`span`);e.className=`tcw-cp-check`,e.innerHTML=D(`check`,14),n.appendChild(e)}return n.addEventListener(`click`,()=>this.run(t)),n.addEventListener(`mousemove`,()=>{this.selectedIndex!==t&&(this.selectedIndex=t,this.markSelection())}),n}markSelection(){let e=this.list?.querySelectorAll(`.tcw-cp-row`)??[],t=null;e.forEach((e,n)=>{let r=n===this.selectedIndex;e.setAttribute(`aria-selected`,String(r)),e.classList.toggle(`tcw-selected`,r),r&&(t=e)});let n=t;n?(this.input?.setAttribute(`aria-activedescendant`,n.id),n.scrollIntoView?.({block:`nearest`})):this.input?.removeAttribute(`aria-activedescendant`)}run(e){let t=this.shown[e];if(t)switch(this.recents?.add(lr(t)),this.close(),t.category){case`indicator`:this.callbacks.onIndicator(t.id);break;case`chartType`:this.callbacks.onChartType(t.id);break;case`drawing`:this.callbacks.onDrawingTool(t.id);break;case`timeframe`:this.callbacks.onTimeframe(t.id);break;case`action`:this.callbacks.onAction(t.id);break}}onKeyDown(e,t){if(e.stopPropagation(),e.isComposing||e.keyCode===or)return;let n=(e.ctrlKey||e.metaKey)&&e.key.toLowerCase()===`k`;if(e.key===`Escape`||n){e.preventDefault(),this.close();return}if(j(e,t),e.target!==this.input)return;let r=this.shown.length;if(e.key===`ArrowDown`||e.key===`ArrowUp`){if(e.preventDefault(),r===0)return;this.selectedIndex=(this.selectedIndex+(e.key===`ArrowDown`?1:-1)+r)%r,this.markSelection()}else e.key===`Enter`&&(e.preventDefault(),e.repeat||this.run(this.selectedIndex))}},pr=20,mr=1e3,hr=new Set,gr={stock:1,stocks:1,equity:1,share:1,shares:1,"cổ phiếu":1,株式:1,株:1,股票:1,주식:1,futures:2,future:2,derivative:2,derivatives:2,option:2,options:2,"phái sinh":2,先物:2,期货:2,期貨:2,선물:2,warrant:2,warrants:2,"covered warrant":2,"chứng quyền":2,index:3,indices:3,"chỉ số":3,指数:3,指數:3,지수:3,fund:3,funds:3,etf:3,etfs:3,"chứng chỉ quỹ":3,crypto:4,cryptocurrency:4,perpetual:4,perpetuals:4,perp:4,perps:4,"tiền mã hóa":4,"tiền mã hoá":4,"tiền điện tử":4,暗号資産:4,仮想通貨:4,加密货币:4,加密貨幣:4,数字货币:4,數字貨幣:4,虚拟货币:4,虛擬貨幣:4,암호화폐:4,가상자산:4,가상화폐:4,forex:5,fx:5,currency:5,"ngoại hối":5,為替:5,外国為替:5,外汇:5,外匯:5,외환:5,bond:5,bonds:5,"trái phiếu":5},_r=1e3,vr=new Map,yr=/i\u0307|\u0131/g;function br(e){if(typeof e!=`string`)return``;let t=vr.get(e);return t===void 0&&(t=e.trim().normalize(`NFC`).toLowerCase().replace(yr,`i`),vr.size>=_r&&vr.clear(),vr.set(e,t)),t}function xr(e){let t=br(e);return t?Object.prototype.hasOwnProperty.call(gr,t)?gr[t]:1+Sr(t)%5:0}function Sr(e){let t=2166136261;for(let n of e)t^=n.codePointAt(0),t=Math.imul(t,16777619)>>>0;return t}function Cr(e){let{ticker:t}=$t(e),n=/[\p{L}\p{N}]/u.exec(t);return n?n[0].toUpperCase():``}function wr(e,t){let n=an(t?.logo);if(!n||hr.has(n))return Er(e,t);let r=document.createElement(`img`);return r.className=`tcw-ss-badge`,r.alt=``,r.width=pr,r.height=pr,r.draggable=!1,r.setAttribute(`aria-hidden`,`true`),r.setAttribute(`loading`,`lazy`),r.setAttribute(`decoding`,`async`),r.setAttribute(`referrerpolicy`,`no-referrer`),r.addEventListener(`error`,()=>{Tr(n),r.replaceWith(Er(e,t))},{once:!0}),r.src=n,r}function Tr(e){hr.size>=mr&&hr.clear(),hr.add(e)}function Er(e,t){let n=document.createElement(`span`);return n.className=`tcw-ss-badge`,n.setAttribute(`aria-hidden`,`true`),n.dataset.kind=String(xr(t?.type)),n.textContent=Cr(e),n}var Dr=180,Or=150,kr=50;function Ar(e){return{upper:e.toUpperCase(),folded:Pr(e)}}function jr(e,t,n){return Math.max(Mr(e.toUpperCase(),n.upper),Nr(t,n.folded))}function Mr(e,t){if(e===t)return 1e3;if(e.startsWith(t))return 500+(50-Math.min(50,e.length-t.length));if(e.includes(t))return 200+(50-Math.min(50,e.length-t.length));let n=0,r=-1,i=0;for(let a=0;a<e.length&&n<t.length;a++)e[a]===t[n]&&(r>=0&&(i+=a-r-1),r=a,n++);return n<t.length?0:100-Math.min(99,i)}function Nr(e,t){if(!e||!t)return 0;if(e.startsWith(t))return Dr;let n=e.indexOf(t);return n<0?0:Or-Math.min(kr,n)}function Pr(e){return e.normalize(`NFD`).replace(/\p{M}+/gu,``).replace(/[đĐ]/g,`D`).toUpperCase()}function Fr(e,t,n=0,r=e.length){let i=t?Ir(e.toUpperCase(),t):new Set,a=``;for(let t=n;t<r;t++)a+=i.has(t)?`<mark>${O(e[t])}</mark>`:O(e[t]);return a}function Ir(e,t){let n=new Set,r=e.indexOf(t);if(r>=0){for(let e=r;e<r+t.length;e++)n.add(e);return n}let i=0;for(let r=0;r<e.length&&i<t.length;r++)e[r]===t[i]&&(n.add(r),i++);return i<t.length?new Set:n}function Lr(e,t){let n=document.createElement(`span`);n.className=`tcw-ss-symbol`,n.dir=`ltr`;let{venue:r}=$t(e),i=(n,r,i)=>{let a=document.createElement(`span`);return a.className=n,a.innerHTML=Fr(e,t,r,i),a};return r&&n.appendChild(i(`tcw-ss-venue`,0,r.length)),n.appendChild(i(`tcw-ss-ticker`,r.length,e.length)),n}var Rr=br,zr=2,Br=1,Vr=class{el;kindsEl;exchangeEl;kinds=new Map;exchanges=new Map;kind=null;exchange=null;resize;constructor(e,t){this.t=e,this.onChange=t,this.el=document.createElement(`div`),this.el.className=`tcw-ss-filters`,this.el.hidden=!0,this.kindsEl=document.createElement(`div`),this.kindsEl.className=`tcw-ss-kinds`,this.kindsEl.setAttribute(`role`,`group`),this.kindsEl.setAttribute(`aria-label`,e(`symbolSearch.kinds`)),this.kindsEl.hidden=!0,this.kindsEl.addEventListener(`scroll`,()=>this.markMore(),{passive:!0}),this.resize=typeof ResizeObserver>`u`?null:new ResizeObserver(()=>this.markMore()),this.resize?.observe(this.kindsEl),this.exchangeEl=document.createElement(`select`),this.exchangeEl.className=`tcw-settings-select tcw-ss-exchange-filter`,this.exchangeEl.setAttribute(`aria-label`,e(`symbolSearch.exchange`)),this.exchangeEl.hidden=!0,this.exchangeEl.addEventListener(`change`,()=>{this.exchange=Rr(this.exchangeEl.value)||null,this.onChange(!1)}),this.el.append(this.kindsEl,this.exchangeEl)}see(e){let t=this.kinds.size,n=this.exchanges.size;for(let t of e)Hr(this.kinds,t?.type),Hr(this.exchanges,t?.exchange);this.kinds.size!==t&&this.renderKinds(),this.exchanges.size!==n&&this.renderExchanges(),this.kindsEl.hidden=this.kinds.size===0,this.exchangeEl.hidden=this.exchanges.size<zr,this.el.hidden=this.kindsEl.hidden&&this.exchangeEl.hidden,this.markMore()}destroy(){this.resize?.disconnect()}markMore(){let e=this.kindsEl,t=Math.abs(e.scrollLeft),n=e.scrollWidth-e.clientWidth,r=[t>Br?`start`:``,t<n-Br?`end`:``].filter(Boolean);r.length>0?e.dataset.more=r.join(` `):delete e.dataset.more}passes(e,t){return Ur(this.kind,Rr(e?.type),t)&&Ur(this.exchange,Rr(e?.exchange),t)}renderKinds(){let e=(e,t)=>{let n=document.createElement(`button`);return n.type=`button`,n.className=`tcw-ss-type`,n.textContent=t,e!==null&&(n.dir=`auto`),n.setAttribute(`aria-pressed`,String(this.kind===e)),n.addEventListener(`click`,()=>{this.kind=e;for(let e of this.kindsEl.children)e.setAttribute(`aria-pressed`,String(e===n));this.onChange(!0)}),n},t=[...this.kinds].map(([t,n])=>e(t,n));this.kindsEl.replaceChildren(e(null,this.t(`symbolSearch.allKinds`)),...t)}renderExchanges(){let e=(e,t)=>{let n=document.createElement(`option`);return n.value=e,n.textContent=t,e&&(n.dir=`auto`),n},t=[...this.exchanges.values()].map(t=>e(t,t));this.exchangeEl.replaceChildren(e(``,this.t(`symbolSearch.allExchanges`)),...t),this.exchangeEl.value=this.exchange===null?``:this.exchanges.get(this.exchange)??``}};function Hr(e,t){let n=Rr(t);n&&!e.has(n)&&e.set(n,t.trim())}function Ur(e,t,n){return e===null||t===e||n&&t===``}var Wr=229,Gr=1,Kr=class{backdrop=null;input=null;list=null;results=null;live=null;columns=null;filters=null;mode=null;given=[];rows=[];rowsGiven=!1;shown=[];compared=[];way=``;selectedIndex=0;searchFn=null;searchTimer=null;searchAbort=null;status=`idle`;pickOnResults=!1;heard=new Map;givenInfo=new Map;foldedNames=new Map;returnFocus=null;uid=Gr++;constructor(e,n=()=>document.body,r=t.t){this.callbacks=e,this.host=n,this.t=r}open(e){this.begin({kind:`search`,start:e})}openCompare(e){this.compared=e.compared,this.way=e.ways.some(t=>t.id===e.way)?e.way:e.ways[0]?.id??``,this.begin({kind:`compare`,start:e})}setCompared(e){if(this.compared=e,this.mode?.kind!==`compare`||!this.results)return;let t=this.results.contains(document.activeElement);this.renderList(),t&&!this.results.contains(document.activeElement)&&this.input?.focus()}close(){if(!this.backdrop)return;this.cancelSearch(),this.pickOnResults=!1,this.searchFn=null,this.backdrop.remove(),this.backdrop=this.input=this.list=this.results=this.live=this.columns=null,this.filters?.destroy(),this.filters=null,this.mode=null,this.callbacks.onClose();let e=this.returnFocus;this.returnFocus=null,e?.isConnected&&e.focus()}isOpen(){return this.backdrop!==null}isComparing(){return this.mode?.kind===`compare`}destroy(){this.close()}begin(e){this.backdrop&&this.close(),this.returnFocus=document.activeElement instanceof HTMLElement?document.activeElement:null,this.mode=e,this.searchFn=e.start.search??null,this.status=`idle`,this.learnGiven(e),this.build(e);let t=e.kind===`search`?e.start.query??``:``;this.input&&(this.input.value=t),t?(this.filter(),this.searchFn&&this.searchNow()):this.listGiven(),this.input?.focus()}learnGiven(e){let t=Yt(e.start.symbols);this.given=t.names,this.givenInfo=t.info,this.foldedNames=new Map;let n=e.start.current,r=e.kind===`search`?e.start.currentInfo:null;if(r&&typeof r==`object`&&n){let{description:e,logo:t}=Xt(r,n);this.givenInfo.set(n,Qt({symbol:n,description:e,logo:t},this.givenInfo.get(n)))}}infoOf(e){return Qt(this.givenInfo.get(e),this.heard.get(e))}build(e){let t=document.createElement(`div`);t.className=`tcw-modal-backdrop`;let n=!1;t.addEventListener(`pointerdown`,e=>{n=e.target===t}),t.addEventListener(`click`,e=>{e.target===t&&n&&this.close(),n=!1});let r=document.createElement(`div`);r.className=`tcw-modal tcw-ss${e.kind===`compare`?` tcw-ss--compare`:``}`,E(r,e.kind===`compare`?`compare`:`symbolSearch`),r.setAttribute(`role`,`dialog`),r.setAttribute(`aria-modal`,`true`),r.setAttribute(`aria-labelledby`,`tcw-ss-title-${this.uid}`),r.tabIndex=-1,r.addEventListener(`keydown`,e=>this.onKeyDown(e,r)),r.append(this.buildHeader(e),this.buildSearch()),e.kind===`compare`&&r.appendChild(this.buildWay(e.start));let i=new Vr(this.t,e=>{this.afterResults(!1),e&&this.input?.focus()}),a=document.createElement(`div`);a.className=`tcw-ss-list`,a.id=`tcw-ss-list-${this.uid}`,a.setAttribute(`role`,`listbox`);let o=document.createElement(`div`);o.className=`tcw-ss-results`;let s=this.buildColumns();o.append(s,a),o.addEventListener(`mousedown`,e=>{e.target.closest(`button`)||e.preventDefault()});let c=document.createElement(`div`);c.className=`tcw-ss-live tcw-visually-hidden`,c.setAttribute(`aria-live`,`polite`),r.append(i.el,o,c);let l=e.kind===`search`?e.start.hint:void 0;if(l){let e=document.createElement(`div`);e.className=`tcw-ss-foot`,e.textContent=l,r.appendChild(e)}t.appendChild(r),this.host().appendChild(t),this.backdrop=t,this.filters=i,this.columns=s,this.list=a,this.results=o,this.live=c}buildColumns(){let e=document.createElement(`div`);e.className=`tcw-ss-columns`,e.setAttribute(`aria-hidden`,`true`);let t=[``,this.t(`symbolSearch.symbol`),this.t(`symbolSearch.description`),this.t(`symbolSearch.type`),this.t(`symbolSearch.exchange`)];return e.append(...t.map(e=>this.tag(`tcw-ss-head`,e))),e}buildHeader(e){let t=document.createElement(`div`);t.className=`tcw-modal-header`;let n=document.createElement(`h3`);n.id=`tcw-ss-title-${this.uid}`,n.textContent=this.t(e.kind===`compare`?`compare.title`:`symbolSearch.title`);let r=document.createElement(`button`);return r.type=`button`,r.className=`tcw-modal-close`,r.setAttribute(`aria-label`,this.t(`common.close`)),r.innerHTML=D(`x`,16),r.addEventListener(`click`,()=>this.close()),t.append(n,r),t}buildSearch(){let e=document.createElement(`label`);e.className=`tcw-ss-search`,e.innerHTML=D(`search`,16);let t=document.createElement(`input`);return t.type=`search`,t.className=`tcw-ss-input`,t.placeholder=this.t(`symbolSearch.placeholder`),t.setAttribute(`aria-label`,this.t(`symbolSearch.placeholder`)),t.setAttribute(`role`,`combobox`),t.setAttribute(`aria-expanded`,`true`),t.setAttribute(`aria-controls`,`tcw-ss-list-${this.uid}`),t.setAttribute(`aria-autocomplete`,`list`),t.autocomplete=`off`,t.spellcheck=!1,t.addEventListener(`input`,()=>this.filter()),e.appendChild(t),this.input=t,e}buildWay(e){let t=document.createElement(`label`);t.className=`tcw-ss-way`;let n=document.createElement(`span`);n.textContent=this.t(`compare.addAs`);let r=document.createElement(`select`);r.className=`tcw-settings-select tcw-ss-way-select`;for(let t of e.ways){let e=document.createElement(`option`);e.value=t.id,e.textContent=t.label,r.appendChild(e)}return r.value=this.way,r.addEventListener(`change`,()=>{this.way=r.value}),t.append(n,r),t}listGiven(){this.rows=this.given.map(e=>({symbol:e,score:0,info:this.infoOf(e)})),this.rowsGiven=!0,this.afterResults(!0)}filter(){this.pickOnResults=!1;let e=this.input?.value.trim()??``;if(this.searchFn&&e){this.scheduleSearch(e);return}if(this.cancelSearch(),this.status=`idle`,!e){this.listGiven();return}let t=Ar(e);this.rows=this.given.map(e=>{let n=this.infoOf(e);return{symbol:e,score:jr(e,this.foldedName(n?.description),t),info:n}}).filter(e=>e.score>0).sort((e,t)=>t.score-e.score),this.rowsGiven=!0,this.afterResults(!1)}foldedName(e){if(!e)return``;let t=this.foldedNames.get(e);return t===void 0&&(t=Pr(e),this.foldedNames.set(e,t)),t}scheduleSearch(e){this.searchTimer!==null&&clearTimeout(this.searchTimer),this.searchTimer=setTimeout(()=>{this.searchTimer=null,this.runSearch(e)},150)}searchNow(){this.searchTimer!==null&&clearTimeout(this.searchTimer),this.searchTimer=null,this.runSearch(this.input?.value.trim()??``)}async runSearch(e){let t=this.searchFn;if(!t)return;this.searchAbort?.abort();let n=new AbortController;this.searchAbort=n,this.status=`searching`,this.shown.length===0&&this.renderList();try{let r=await t(e,n.signal);if(n.signal.aborted)return;let i=Zt(r);for(let e of i)this.heard.set(e.symbol,Qt(this.heard.get(e.symbol),e));this.rows=i.map(e=>({symbol:e.symbol,score:0,info:this.infoOf(e.symbol)})),this.status=`idle`}catch{if(n.signal.aborted)return;this.rows=[],this.status=`failed`}this.rowsGiven=!1,this.afterResults(!1),this.pickOnResults&&(this.pickOnResults=!1,this.pick(0))}cancelSearch(){this.searchTimer!==null&&clearTimeout(this.searchTimer),this.searchTimer=null,this.searchAbort?.abort(),this.searchAbort=null}afterResults(e){let t=this.listableRows();this.filters?.see(t.map(e=>e.info)),this.shown=this.visibleRows(t);let n=e?this.shown.findIndex(e=>e.symbol===this.mode?.start.current):-1;this.selectedIndex=n>=0&&n<this.listedCount()?n:0,this.renderList()}listedCount(){return Math.min(this.shown.length,200)}listableRows(){if(this.mode?.kind!==`compare`)return this.rows;let e=this.mode.start.current;return this.rows.filter(t=>t.symbol!==e)}visibleRows(e){let t=this.filters;return t?e.filter(e=>t.passes(e.info,this.rowsGiven)):[...e]}renderList(){let e=this.list,t=this.results;if(!e||!t)return;let n=(this.input?.value??``).trim(),r=this.mode?.kind===`compare`,i=[];if(r&&!n&&this.compared.length>0){let t=this.heading(this.t(`compare.onChart`),`added`),n=document.createElement(`div`);n.className=`tcw-ss-added`,n.setAttribute(`role`,`group`),n.setAttribute(`aria-labelledby`,t.id),n.append(...this.compared.map(e=>this.addedRow(e)));let r=this.heading(this.t(`compare.symbols`),`symbols`);r.hidden=this.shown.length===0,i.push(t,n,r),e.setAttribute(`aria-labelledby`,r.id)}else e.setAttribute(`aria-labelledby`,`tcw-ss-title-${this.uid}`);let a=n.toUpperCase(),o=new Set(this.compared.map(e=>e.symbol)),s=this.shown.slice(0,200);e.replaceChildren(...s.map((e,t)=>this.row(e,t,a,r&&o.has(e.symbol))));let c=this.shown.length===0?this.emptyNote(n,r):this.moreNote(this.shown.length-s.length);t.replaceChildren(...this.columns?[this.columns]:[],...i,e,...c?[c]:[]),this.live&&(this.live.textContent=this.shown.length===0?c?.textContent??``:``),this.markSelection()}emptyNote(e,t){let n;if(this.status===`searching`)n=this.t(`symbolSearch.searching`);else if(this.status===`failed`)n=this.t(`symbolSearch.failed`);else if(t&&!e){if(this.compared.length>0)return null;n=this.t(`compare.empty`)}else n=this.t(`symbolSearch.empty`);let r=document.createElement(`div`);return r.className=`tcw-ss-empty`,r.textContent=n,r}moreNote(e){if(e<=0)return null;let n=document.createElement(`div`);return n.className=`tcw-ss-more`,n.textContent=t.r(this.t(`symbolSearch.more`),{count:e}),n}heading(e,t){let n=document.createElement(`div`);return n.className=`tcw-ss-heading`,n.id=`tcw-ss-${t}-${this.uid}`,n.textContent=e,n}row(e,t,n,r){let i=document.createElement(`div`);i.className=`tcw-ss-row`,i.id=`tcw-ss-opt-${this.uid}-${t}`,i.dataset.symbol=e.symbol,i.setAttribute(`role`,`option`);let a=this.mode?.kind===`search`&&e.symbol===this.mode.start.current;i.classList.toggle(`tcw-current`,a),i.classList.toggle(`tcw-on-chart`,r),a&&i.setAttribute(`aria-current`,`true`);let o=this.tag(`tcw-ss-kind`,e.info?.type?.trim()??``),s=this.tag(`tcw-ss-exchange`,e.info?.exchange?.trim()??``);if(o.dir=s.dir=`auto`,i.append(wr(e.symbol,e.info),Lr(e.symbol,n),this.descriptionCell(e),o,s),a||r){let e=document.createElement(`span`);e.className=`tcw-ss-check`,e.innerHTML=D(`check`,14),i.appendChild(e)}return r&&i.appendChild(this.tag(`tcw-visually-hidden`,this.t(`compare.onChart`))),i.addEventListener(`click`,()=>this.pick(t)),i.addEventListener(`mousemove`,()=>{this.selectedIndex!==t&&(this.selectedIndex=t,this.markSelection())}),i}descriptionCell(e){let t=document.createElement(`span`);t.className=`tcw-ss-desc-cell`;let n=e.info?.description&&e.info.description!==e.symbol?e.info.description:``;if(n){let e=this.tag(`tcw-ss-desc`,n);e.dir=`auto`,t.appendChild(e)}return t}addedRow(e){let n=document.createElement(`div`);if(n.className=`tcw-ss-added-row`,n.setAttribute(`role`,`presentation`),e.color){let t=document.createElement(`span`);t.className=`tcw-ss-swatch`,t.style.background=e.color,n.appendChild(t)}let r=document.createElement(`span`);r.className=`tcw-ss-way-cell`,r.appendChild(this.tag(`tcw-ss-way-label`,e.way));let i=document.createElement(`button`);i.type=`button`,i.className=`tcw-ss-remove`;let a=t.r(this.t(`compare.remove`),{symbol:e.symbol});return i.title=a,i.setAttribute(`aria-label`,a),i.innerHTML=D(`x`,12),i.addEventListener(`click`,()=>{this.mode?.kind===`compare`&&this.mode.start.onRemove(e.id)}),n.append(Lr(e.symbol,``),r,i),n}tag(e,t){let n=document.createElement(`span`);return n.className=e,n.textContent=t,n}markSelection(){let e=this.list?.querySelectorAll(`.tcw-ss-row`)??[],t=null;e.forEach((e,n)=>{let r=n===this.selectedIndex;e.setAttribute(`aria-selected`,String(r)),e.classList.toggle(`tcw-selected`,r),r&&(t=e)});let n=t;n?(this.input?.setAttribute(`aria-activedescendant`,n.id),n.scrollIntoView?.({block:`nearest`})):this.input?.removeAttribute(`aria-activedescendant`)}pick(e){let t=this.shown[e],n=this.mode;if(!t||!n)return;if(n.kind===`compare`){this.selectedIndex=e,this.markSelection(),n.start.onAdd(t.symbol,this.way);return}let r=n.start.onPick??this.callbacks.onPick;this.close(),r(t.symbol)}onKeyDown(e,t){if(e.stopPropagation(),e.isComposing||e.keyCode===Wr)return;if(e.key===`Escape`){e.preventDefault(),this.close();return}if(j(e,t),e.target!==this.input)return;let n=this.listedCount();if(e.key===`ArrowDown`||e.key===`ArrowUp`){if(e.preventDefault(),n===0)return;this.selectedIndex=(this.selectedIndex+(e.key===`ArrowDown`?1:-1)+n)%n,this.markSelection()}else if(e.key===`Enter`){if(e.preventDefault(),e.repeat&&this.mode?.kind===`compare`)return;if(this.searchTimer!==null||this.status===`searching`){this.pickOnResults=!0,this.searchTimer!==null&&this.searchNow();return}this.pick(this.selectedIndex)}}},qr=229,Jr={"Search & navigation":`hotkeys.group.searchNavigation`,"Chart manipulation":`hotkeys.group.chartManipulation`,"Touch (mobile / tablet)":`hotkeys.group.touch`,Keyboard:`hotkeys.group.keyboard`,"Bar replay":`toolbar.replay`,Drawing:`hotkeys.group.drawing`,More:`hotkeys.group.more`},B=rr,Yr=[{title:`Search & navigation`,entries:[{keys:[B,`K`],label:`hotkeys.commandPalette`,feature:`hotkeys.commandPalette`},{keys:[B,`P`],label:`hotkeys.symbolSearch`,feature:`hotkeys.symbolSearch`},{keys:[`Alt`,`G`],label:`hotkeys.goToDate`,feature:`hotkeys.goToDate`},{keys:[`Alt`,`I`],label:`hotkeys.invertScale`,feature:`hotkeys.invertScale`},{keys:[`Alt`,`R`],label:`chartMenu.resetView`,feature:`hotkeys.resetView`},{keys:[B,`S`],label:`hotkeys.saveLayout`,feature:`hotkeys.save`},{keys:[`0–9`],label:`hotkeys.typeInterval`,feature:`intervalTyping`},{keys:[`A–Z`],label:`hotkeys.typeSymbol`,feature:`symbolTyping`},{keys:[`?`],label:`hotkeys.showSheet`,feature:`hotkeys.help`}]},{title:`Chart manipulation`,entries:[{keys:[`key.drag`],label:`hotkeys.pan`},{keys:[B,`key.drag`],label:`hotkeys.boxSelect`},{keys:[B,`key.click`],label:`hotkeys.toggleSelect`},{keys:[`Shift`,`key.drag`],label:`hotkeys.measure`},{keys:[`key.drag`,`key.priceAxis`],label:`hotkeys.scalePrice`},{keys:[`key.drag`,`key.timeAxis`],label:`hotkeys.zoomTime`},{keys:[`key.doubleClick`,`key.priceAxis`],label:`hotkeys.autoScale`},{keys:[`key.doubleClick`,`key.timeAxis`],label:`hotkeys.fit`},{keys:[`key.scroll`],label:`hotkeys.zoomCursor`}]},{title:`Touch (mobile / tablet)`,entries:[{keys:[`key.oneFinger`,`key.drag`],label:`hotkeys.touchPan`},{keys:[`key.twoFingers`,`key.pinch`],label:`hotkeys.pinch`},{keys:[`key.longPress`],label:`hotkeys.longPress`},{keys:[`key.drag`,`key.axisStrip`],label:`hotkeys.touchAxis`}]},{title:`Keyboard`,entries:[{keys:[`←`,`→`],label:`hotkeys.panBar`},{keys:[`+`,`−`],label:`hotkeys.zoomInOut`},{keys:[`Home`],label:`hotkeys.toStart`},{keys:[`End`],label:`hotkeys.toEnd`},{keys:[`Space`],label:`hotkeys.fit`}]},{title:`Bar replay`,entries:[{keys:[`Shift`,`←`,`→`],label:`hotkeys.replayStep`,feature:`replay`},{keys:[`Space`],label:`hotkeys.replayPlay`,feature:`replay`},{keys:[`Esc`],label:`hotkeys.replayCancel`,feature:`replay`}]},{title:`Drawing`,entries:[{keys:[B,`Z`],label:`hotkeys.undo`},{keys:[B,`Shift`,`Z`],label:`hotkeys.redo`},{keys:[`Esc`],label:`hotkeys.cancelDrawing`},{keys:[B,`C`],label:`hotkeys.copy`},{keys:[B,`V`],label:`hotkeys.paste`},{keys:[`key.rightClick`],label:`hotkeys.drawingMenu`},{keys:[`key.doubleClick`],label:`hotkeys.drawingSettings`},{keys:[B,`G`],label:`hotkeys.group`},{keys:[B,`Shift`,`G`],label:`hotkeys.ungroup`},{keys:[B,`]`,`[`],label:`hotkeys.orderStep`},{keys:[B,`Shift`,`]`,`[`],label:`hotkeys.orderEnd`},{keys:[`Enter`],label:`hotkeys.finishPath`},{keys:[`Alt`,`T`],label:`tool.trendLine`,feature:`hotkeys.tools`},{keys:[`Alt`,`H`],label:`tool.horizontalLine`,feature:`hotkeys.tools`},{keys:[`Alt`,`J`],label:`tool.horizontalRay`,feature:`hotkeys.tools`},{keys:[`Alt`,`V`],label:`tool.verticalLine`,feature:`hotkeys.tools`},{keys:[`Alt`,`C`],label:`tool.crossLine`,feature:`hotkeys.tools`},{keys:[`Alt`,`F`],label:`tool.fibRetracement`,feature:`hotkeys.tools`}]}],Xr=0,Zr=class{backdrop=null;bodyEl=null;searchEl=null;liveEl=null;groups=[];returnFocus=null;uid=++Xr;constructor(e,t,n=()=>document.body){this.callbacks=e,this.t=t,this.host=n}open(e={}){if(this.backdrop)return;this.returnFocus=document.activeElement instanceof HTMLElement?document.activeElement:null;let t=e.isOn??(()=>!0),n=new Set((e.extra??[]).map(e=>e.keys.join(`+`).toLowerCase()));this.groups=Yr.map(e=>({title:e.title,entries:e.entries.filter(e=>(!e.feature||t(e.feature))&&!n.has(e.keys.join(`+`).toLowerCase()))})).filter(e=>e.entries.length>0),e.extra&&e.extra.length>0&&this.groups.push({title:`More`,entries:[...e.extra]}),this.build(t(`hotkeys.help`)),this.render(),this.searchEl?.focus()}close(){if(!this.backdrop)return;this.backdrop.remove(),this.backdrop=this.bodyEl=this.searchEl=this.liveEl=null,this.callbacks.onClose();let e=this.returnFocus;this.returnFocus=null,e?.isConnected&&e.focus()}isOpen(){return this.backdrop!==null}destroy(){this.close()}build(e){let t=document.createElement(`div`);t.className=`tcw-modal-backdrop`;let n=!1;t.addEventListener(`pointerdown`,e=>{n=e.target===t}),t.addEventListener(`click`,e=>{e.target===t&&n&&this.close(),n=!1});let r=document.createElement(`div`);r.className=`tcw-modal tcw-hotkey-sheet`,r.setAttribute(`role`,`dialog`),r.setAttribute(`aria-modal`,`true`),r.setAttribute(`aria-labelledby`,`tcw-hotkey-title-${this.uid}`),r.tabIndex=-1,r.addEventListener(`keydown`,e=>{if(e.stopPropagation(),e.key===`Escape`&&!e.isComposing&&e.keyCode!==qr){e.preventDefault(),this.close();return}j(e,r)});let i=document.createElement(`div`);i.className=`tcw-modal-header`;let a=document.createElement(`h3`);a.id=`tcw-hotkey-title-${this.uid}`,a.textContent=this.t(`hotkeys.title`);let o=document.createElement(`button`);o.type=`button`,o.className=`tcw-modal-close`,o.setAttribute(`aria-label`,this.t(`hotkeys.close`)),o.innerHTML=D(`x`,16),o.addEventListener(`click`,()=>this.close()),i.append(a,o);let s=document.createElement(`label`);s.className=`tcw-ss-search tcw-hotkey-search`,s.innerHTML=D(`search`,16);let c=document.createElement(`input`);c.type=`search`,c.placeholder=this.t(`hotkeys.search`),c.setAttribute(`aria-label`,this.t(`hotkeys.search`)),c.autocomplete=`off`,c.spellcheck=!1,c.addEventListener(`input`,()=>this.render()),s.appendChild(c);let l=document.createElement(`div`);l.className=`tcw-hotkey-body`;let u=document.createElement(`div`);if(u.className=`tcw-hotkey-live tcw-visually-hidden`,u.setAttribute(`aria-live`,`polite`),r.append(i,s,l,u),e){let e=document.createElement(`div`);e.className=`tcw-hotkey-foot`,e.textContent=this.t(`hotkeys.footer`),r.appendChild(e)}t.appendChild(r),this.host().appendChild(t),this.backdrop=t,this.bodyEl=l,this.searchEl=c,this.liveEl=u}render(){let e=this.bodyEl;if(!e)return;let t=ir((this.searchEl?.value??``).trim()),n=[];for(let e of this.groups){let r=t?e.entries.filter(e=>this.matches(e,t)):e.entries;if(r.length===0)continue;let i=document.createElement(`section`);i.className=`tcw-hotkey-group`;let a=document.createElement(`div`);a.className=`tcw-hotkey-heading`;let o=Jr[e.title];a.textContent=o?this.t(o):e.title,i.append(a,...r.map(e=>this.row(e))),n.push(i)}if(this.liveEl&&(this.liveEl.textContent=n.length===0?this.t(`hotkeys.noMatch`):``),n.length===0){let t=document.createElement(`div`);t.className=`tcw-hotkey-empty`,t.textContent=this.t(`hotkeys.noMatch`),e.replaceChildren(t);return}let r=document.createElement(`div`);r.className=`tcw-hotkey-columns`,r.append(...n),e.replaceChildren(r)}label(e){return`text`in e?e.text:this.t(e.label)}keyText(e){return e.startsWith(`key.`)?this.t(e):e}matches(e,t){return ir(this.label(e)).includes(t)?!0:ir(e.keys.map(e=>this.keyText(e)).join(`+`)).includes(t)}row(e){let t=document.createElement(`div`);t.className=`tcw-hotkey-row`;let n=document.createElement(`span`);n.className=`tcw-hotkey-label`,n.textContent=this.label(e);let r=document.createElement(`span`);return r.className=`tcw-hotkey-keys`,r.dir=`ltr`,e.keys.forEach((e,t)=>{if(t>0){let e=document.createElement(`span`);e.className=`tcw-hotkey-sep`,e.textContent=`+`,r.appendChild(e)}let n=e.startsWith(`key.`),i=document.createElement(n?`span`:`kbd`);i.className=n?`tcw-hotkey-gesture`:`tcw-hotkey-key`,i.textContent=this.keyText(e),r.appendChild(i)}),t.append(n,r),t}},Qr={selectHint:`Click a bar to start the replay`,random:`Random bar`,realtime:`Back to realtime`,play:`Play`,pause:`Pause`,stepBack:`Step back (Shift+←)`,stepForward:`Step forward (Shift+→)`,replay:`Replay`,position:`Replay position`,speed:`Speed`,step:`Step`,loading:`Loading chart...`,selectBar:`Select bar`,cancel:`Cancel`,rate:`{rate}×`,rateHint:`1× plays one bar a second`,playingAt:`Playing at {rate}`,pausedAt:`Paused at {time}`,endedAt:`Replay ended at {time}`},$r=[.1,.2,.3,.5,1,2,3,5,10,20,30,50],ei=[`full`,`compact`,`stack`],ti=300,ni=2,ri=[`random`,`stepBack`,`stepForward`,`seek`,`step`,`selectBar`],ii=class{root=null;scrubber=null;timeLabel=null;playBtn=null;realtimeBtn=null;liveRegion=null;hintText=null;state=`stopped`;mode=`select`;ended=!1;pending=!1;total=0;rate=1;steps=[];step=`bar`;dir=`ltr`;formatRate;where=``;announceTimer=null;widths=new Map;labels;constructor(e,t={}){this.callbacks=e,this.labels={...Qr,...t},this.formatRate=e=>this.labels.rate.replace(`{rate}`,String(e))}mount(e,t){this.root||(this.total=Math.max(0,t.total),this.rate=t.rate??1,this.steps=t.steps??[],this.step=t.step??`bar`,this.dir=t.dir??`ltr`,t.formatRate&&(this.formatRate=t.formatRate),this.state=`paused`,this.mode=t.mode??`select`,this.root=document.createElement(`div`),this.root.className=`tcw-replay-bar`,E(this.root,`replay`),this.root.setAttribute(`role`,`group`),this.root.setAttribute(`aria-label`,this.labels.replay),this.root.dataset.fit=`full`,this.root.innerHTML=this.markup(),e.appendChild(this.root),this.wireEvents(),this.syncUi())}unmount(){this.announceTimer&&clearTimeout(this.announceTimer),this.announceTimer=null,this.root?.remove(),this.root=null,this.hintText=null,this.scrubber=null,this.timeLabel=null,this.playBtn=null,this.realtimeBtn=null,this.liveRegion=null,this.state=`stopped`,this.ended=!1,this.where=``}isMounted(){return this.root!==null}element(){return this.root}getMode(){return this.mode}setMode(e){let t=!!this.root?.contains(document.activeElement);this.mode=e,this.syncUi(),t&&(e===`replay`?(this.playBtn&&!this.playBtn.disabled?this.playBtn:this.realtimeBtn)?.focus():this.root?.querySelector(`[data-act="random"]`)?.focus())}setState(e){e!==this.state&&(this.state=e,this.syncUi(),this.mode===`replay`&&(e===`playing`?this.announce(this.labels.playingAt.replace(`{rate}`,this.formatRate(this.rate))):e===`paused`&&this.where&&this.announce(this.labels.pausedAt.replace(`{time}`,this.where))))}setEnded(e){this.ended!==e&&(this.ended=e,this.syncUi(),e&&this.where&&this.announce(this.labels.endedAt.replace(`{time}`,this.where)))}setPending(e){if(this.pending===e)return;this.pending=e;let t=document.activeElement;e&&t&&t!==this.playBtn&&this.root?.contains(t)&&ri.includes(t.dataset.act??``)&&this.playBtn?.focus(),this.syncUi(),e&&this.mode===`replay`&&this.announce(this.labels.loading)}isPending(){return this.pending}setSteps(e,t){this.steps=e,this.step=t,this.widths.clear();let n=this.root?.querySelector(`[data-tcw="stepSlot"]`);n&&(n.innerHTML=this.stepMarkup(),this.wireStep(),this.syncUi())}setProgress(e,t,n){this.total=t;let r=n??`${Math.min(e+1,t)} / ${t}`,i=r!==this.where;if(this.where=r,this.scrubber){this.scrubber.max=String(Math.max(0,t-1)),this.scrubber.value=String(e),this.scrubber.setAttribute(`aria-valuetext`,r);let n=t>1?Math.min(e,t-1)/(t-1)*100:0;this.scrubber.style.setProperty(`--tcw-replay-done`,`${Number(n.toFixed(ni))}%`)}if(this.timeLabel){this.timeLabel.textContent=r;let e=Number.parseFloat(this.timeLabel.style.minInlineSize)||0;r.length>e&&(this.timeLabel.style.minInlineSize=`${r.length}ch`)}let a=this.scrubber!==null&&document.activeElement===this.scrubber;i&&this.mode===`replay`&&this.state!==`playing`&&!a&&this.announce(r)}setRoom(e){let t=this.root;if(t){for(let n of ei)if(n===`stack`||this.widthIn(n)<=e){t.dataset.fit=n,this.orderFor(n);return}}}orderFor(e){let t=this.root,n=t?.querySelector(`.tcw-replay-timeline`),r=t?.querySelector(`.tcw-replay-transport`),i=this.realtimeBtn;if(!t||!n||!r||!i)return;let a=e===`stack`;if(a===(n.nextElementSibling===i))return;let o=document.activeElement;a?r.before(n,i):(r.nextElementSibling?.after(n),t.querySelector(`[data-act="cancel"]`)?.before(i)),o&&t.contains(o)&&document.activeElement!==o&&o.focus()}getFit(){return this.root?.dataset.fit??`full`}destroy(){this.unmount()}widthIn(e){let t=this.root,n=`${this.mode}|${this.steps.length}|${e}`,r=this.widths.get(n);if(r!==void 0)return r;let i=t.dataset.fit;t.dataset.fit=e,t.dataset.measure=``;let a=t.getBoundingClientRect().width;return delete t.dataset.measure,i&&(t.dataset.fit=i),a>0&&this.widths.set(n,a),a}markup(){let e=this.labels,t=`dir="${this.dir}"`,n=$r.map(e=>`<option value="${e}"${e===this.rate?` selected`:``}>${O(this.formatRate(e))}</option>`).join(``),r=(e,t,n,r=`tcw-replay-btn`,i=``)=>`<button type="button" class="${r}" data-act="${e}" title="${O(t)}" aria-label="${O(t)}"${i}>${n}</button>`;return`
7631
+ <span class="tcw-replay-group tcw-replay-picking" data-mode="select">
7632
+ <span class="tcw-replay-hint" ${t}>${D(`cursor`,14)}<span data-tcw="hint">${O(e.selectHint)}</span></span>
7633
+ <button type="button" class="tcw-replay-text-btn tcw-replay-ghost" data-act="random" ${t}>${O(e.random)}</button>
7634
+ </span>
7635
+ <span class="tcw-replay-group tcw-replay-transport" data-mode="replay">
7636
+ ${r(`stepBack`,e.stepBack,D(`stepBack`,14))}
7637
+ ${r(`play`,e.play,D(`play`,14),`tcw-replay-btn tcw-replay-play`,` aria-keyshortcuts="Space"`)}
7638
+ ${r(`stepForward`,e.stepForward,D(`stepForward`,14))}
7639
+ </span>
7640
+ <span class="tcw-replay-sep" data-mode="replay" aria-hidden="true"></span>
7641
+ <span class="tcw-replay-group tcw-replay-timeline" data-mode="replay">
7642
+ <output class="tcw-replay-time" data-tcw="time" aria-hidden="true" ${t}></output>
7643
+ <input type="range" class="tcw-replay-scrubber" data-act="seek" min="0" max="${Math.max(0,this.total-1)}" value="0" step="1" aria-label="${O(e.position)}" />
7644
+ </span>
7645
+ <span class="tcw-replay-sep" aria-hidden="true"></span>
7646
+ <span class="tcw-replay-group tcw-replay-pace">
7647
+ <label class="tcw-replay-chip" data-mode="replay" title="${O(e.rateHint)}">
7648
+ <span class="tcw-replay-chip-label" ${t}>${O(e.speed)}</span>
7649
+ <select class="tcw-replay-speed" data-act="speed" dir="ltr">${n}</select>
7650
+ </label>
7651
+ <span class="tcw-replay-slot" data-tcw="stepSlot">${this.stepMarkup()}</span>
7433
7652
  </span>
7434
- <span class="tcw-replay-group" data-mode="replay">
7435
- <button class="tcw-replay-btn" data-act="stepBack" title="${O(e.stepBack)}" aria-label="${O(e.stepBack)}">${Yr()}</button>
7436
- <button class="tcw-replay-btn tcw-replay-play" data-act="play" title="${O(e.play)}" aria-label="${O(e.play)}">${qr()}</button>
7437
- <button class="tcw-replay-btn" data-act="stepForward" title="${O(e.stepForward)}" aria-label="${O(e.stepForward)}">${Xr()}</button>
7438
- <input type="range" class="tcw-replay-scrubber" data-act="seek" min="0" max="${Math.max(0,this.total-1)}" value="0" step="1" aria-label="${O(this.labels.position)}" />
7439
- <span class="tcw-replay-progress" data-tcw="progress">1 / ${this.total}</span>
7440
- <select class="tcw-replay-speed" data-act="speed" aria-label="${O(this.labels.speed)}">${t}</select>
7653
+ <span class="tcw-replay-sep" aria-hidden="true"></span>
7654
+ <span class="tcw-replay-group tcw-replay-exits">
7655
+ <span data-mode="replay" class="tcw-replay-slot">${r(`selectBar`,e.selectBar,D(`replayPick`,14))}</span>
7656
+ <button type="button" class="tcw-replay-text-btn tcw-replay-realtime" data-act="realtime" data-mode="replay" aria-label="${O(e.realtime)}" title="${O(e.realtime)}"><span class="tcw-replay-close-icon">${D(`x`,14)}</span><span class="tcw-replay-text" ${t}>${O(e.realtime)}</span></button>
7657
+ <button type="button" class="tcw-replay-text-btn" data-act="cancel" data-mode="select" ${t}>${O(e.cancel)}</button>
7441
7658
  </span>
7442
- ${this.steps.length>1?`<select class="tcw-replay-speed tcw-replay-step" data-act="step" aria-label="${O(e.step)}" title="${O(e.step)}">${this.steps.map(e=>`<option value="${O(e.value)}"${e.value===this.step?` selected`:``}>${O(e.label)}</option>`).join(``)}</select>`:``}
7443
- <button class="tcw-replay-text-btn tcw-replay-realtime" data-act="realtime">${O(e.realtime)}</button>
7444
- `}wireEvents(){let e=this.root;e&&(this.scrubber=e.querySelector(`input[data-act="seek"]`),this.progressLabel=e.querySelector(`[data-tcw="progress"]`),this.playBtn=e.querySelector(`button[data-act="play"]`),this.realtimeBtn=e.querySelector(`button[data-act="realtime"]`),this.realtimeBtn?.addEventListener(`click`,()=>this.callbacks.onClose()),e.querySelector(`[data-act="random"]`)?.addEventListener(`click`,()=>this.callbacks.onRandomStart()),e.querySelector(`[data-act="stepBack"]`)?.addEventListener(`click`,()=>this.callbacks.onStepBack()),e.querySelector(`[data-act="stepForward"]`)?.addEventListener(`click`,()=>this.callbacks.onStepForward()),this.playBtn?.addEventListener(`click`,()=>{this.state===`playing`?this.callbacks.onPause():this.callbacks.onPlay()}),this.scrubber?.addEventListener(`input`,()=>this.callbacks.onSeek(Number(this.scrubber.value))),e.querySelector(`[data-act="speed"]`)?.addEventListener(`change`,e=>{let t=Number(e.target.value);this.speed=t,this.callbacks.onSpeedChange(t)}),e.querySelector(`[data-act="step"]`)?.addEventListener(`change`,e=>{this.step=e.target.value,this.callbacks.onStepChange?.(this.step)}))}syncUi(){let e=this.root;if(e){for(let t of e.querySelectorAll(`.tcw-replay-group`))t.hidden=t.dataset.mode!==this.mode;if(e.classList.toggle(`tcw-replay-bar--ended`,this.ended),this.playBtn){let e=this.state===`playing`;this.playBtn.innerHTML=e?Jr():qr(),this.playBtn.title=e?this.labels.pause:this.labels.play,this.playBtn.setAttribute(`aria-label`,this.playBtn.title);let t=this.ended&&!e;t&&document.activeElement===this.playBtn&&this.realtimeBtn?.focus(),this.playBtn.disabled=t}}}},qr=()=>D(`play`,14),Jr=()=>D(`pause`,14),Yr=()=>D(`stepBack`,14),Xr=()=>D(`stepForward`,14),Zr=()=>D(`cursor`,14),Qr=class{el;headerEl;nameBtn;menuEl;listEl;rowMap=new Map;entries=new Map;lists=[];activeList=``;active=null;locale;dragging=null;onOutside=e=>{this.headerEl.contains(e.target)||this.closeMenu()};constructor(e,t,n){this.callbacks=t,this.labels=n,this.el=document.createElement(`div`),this.el.className=`tcw-watchlist`,this.el.setAttribute(`aria-label`,n.title),this.headerEl=document.createElement(`div`),this.headerEl.className=`tcw-watchlist-header`,this.nameBtn=document.createElement(`button`),this.nameBtn.type=`button`,this.nameBtn.className=`tcw-watchlist-name`,this.nameBtn.setAttribute(`aria-haspopup`,`menu`),this.nameBtn.setAttribute(`aria-expanded`,`false`),this.nameBtn.title=n.lists,this.nameBtn.addEventListener(`click`,()=>this.menuEl.hidden?this.openMenu():this.closeMenu());let r=document.createElement(`button`);r.type=`button`,r.className=`tcw-watchlist-add`,r.innerHTML=D(`plus`,14),r.title=n.add,r.setAttribute(`aria-label`,n.add),r.hidden=!t.onAdd,r.addEventListener(`click`,()=>t.onAdd?.());let i=document.createElement(`button`);i.type=`button`,i.className=`tcw-watchlist-close`,i.setAttribute(`aria-label`,n.close??n.title),i.innerHTML=D(`x`,14),i.hidden=!t.onClose,i.addEventListener(`click`,()=>t.onClose?.()),this.menuEl=document.createElement(`div`),this.menuEl.className=`tcw-dropdown tcw-watchlist-menu`,this.menuEl.setAttribute(`role`,`menu`),this.menuEl.hidden=!0,this.headerEl.append(this.nameBtn,r,i,this.menuEl),this.el.appendChild(this.headerEl),this.listEl=document.createElement(`div`),this.listEl.className=`tcw-watchlist-list`,this.listEl.setAttribute(`role`,`list`),this.el.appendChild(this.listEl),e.appendChild(this.el)}get element(){return this.el}setLists(e,t){this.lists=e.map(e=>({...e,symbols:[...e.symbols]})),this.activeList=e.some(e=>e.id===t)?t:e[0]?.id??``;let n=this.shownList();this.nameBtn.textContent=n?.name??this.labels.title,this.renderRows(n?.symbols??[]),this.menuEl.hidden||this.renderMenu()}redraw(){for(let e of this.rowMap.keys())this.renderRow(e)}setLocale(e){this.locale=e;for(let e of this.rowMap.keys())this.renderRow(e)}setActive(e){this.active=e;for(let[t,n]of this.rowMap){let r=t===e;n.row.classList.toggle(`tcw-watchlist-active`,r),r?n.row.setAttribute(`aria-current`,`true`):n.row.removeAttribute(`aria-current`)}}setEntry(e,t){let n=this.entries.get(e)??{symbol:e};this.entries.set(e,{...n,...t,symbol:e}),this.renderRow(e)}destroy(){this.closeMenu(),this.el.remove(),this.rowMap.clear(),this.entries.clear()}shownList(){return this.lists.find(e=>e.id===this.activeList)}renderRows(e){for(let t of[...this.rowMap.keys()])e.includes(t)||(this.rowMap.get(t).row.remove(),this.rowMap.delete(t));for(let t of e)this.rowMap.has(t)||this.makeRow(t);if(this.listEl.replaceChildren(...e.map(e=>this.rowMap.get(e).row)),e.length===0){let e=document.createElement(`div`);e.className=`tcw-watchlist-empty`,e.textContent=this.labels.empty,this.listEl.appendChild(e)}this.active&&this.setActive(this.active)}makeRow(e){let n=document.createElement(`div`);n.className=`tcw-watchlist-row`,n.setAttribute(`role`,`listitem`),n.dataset.symbol=e,n.tabIndex=0,n.draggable=!!this.callbacks.onMove;let r=document.createElement(`div`);r.className=`tcw-watchlist-symbol`,r.textContent=$r(e);let i=document.createElement(`canvas`);i.className=`tcw-watchlist-spark`,i.width=64,i.height=22;let a=document.createElement(`div`);a.className=`tcw-watchlist-stats`;let o=document.createElement(`span`);o.className=`tcw-watchlist-price`,o.textContent=`—`;let s=document.createElement(`span`);if(s.className=`tcw-watchlist-change`,a.append(o,s),n.append(r,i,a),this.callbacks.onRemove){let r=document.createElement(`button`);r.type=`button`,r.className=`tcw-watchlist-remove`,r.innerHTML=D(`x`,12),r.tabIndex=-1;let i=t.r(this.labels.remove,{symbol:e});r.title=i,r.setAttribute(`aria-label`,i),r.addEventListener(`click`,t=>{t.stopPropagation(),this.callbacks.onRemove?.(e)}),n.appendChild(r)}n.addEventListener(`click`,()=>this.callbacks.onSelect(e)),n.addEventListener(`keydown`,t=>this.onRowKey(t,e)),n.addEventListener(`dragstart`,t=>{this.dragging=e,t.dataTransfer?.setData(`text/plain`,e),t.dataTransfer&&(t.dataTransfer.effectAllowed=`move`),n.classList.add(`tcw-watchlist-dragging`)}),n.addEventListener(`dragend`,()=>{this.dragging=null,n.classList.remove(`tcw-watchlist-dragging`)}),n.addEventListener(`dragover`,t=>{this.dragging&&this.dragging!==e&&t.preventDefault()}),n.addEventListener(`drop`,t=>{t.preventDefault();let n=this.dragging;if(this.dragging=null,!n||n===e)return;let r=this.shownList()?.symbols??[];this.callbacks.onMove?.(n,r.indexOf(e))}),this.rowMap.set(e,{row:n,priceEl:o,changeEl:s,sparkCanvas:i}),this.renderRow(e)}onRowKey(e,t){let n=this.shownList()?.symbols??[],r=n.indexOf(t);if([`Enter`,` `,`Delete`,`Backspace`,`ArrowDown`,`ArrowUp`].includes(e.key)&&e.stopPropagation(),e.key===`Enter`||e.key===` `)e.preventDefault(),this.callbacks.onSelect(t);else if((e.key===`Delete`||e.key===`Backspace`)&&this.callbacks.onRemove){e.preventDefault();let i=n[r+1]??n[r-1];this.callbacks.onRemove(t),i&&this.rowMap.get(i)?.row.focus()}else if(e.key===`ArrowDown`||e.key===`ArrowUp`){e.preventDefault();let i=r+(e.key===`ArrowDown`?1:-1);if(i<0||i>=n.length)return;e.altKey?(this.callbacks.onMove?.(t,i),this.rowMap.get(t)?.row.focus()):this.rowMap.get(n[i])?.row.focus()}}renderRow(e){let t=this.rowMap.get(e),n=this.entries.get(e);if(!(!t||!n)){if(n.lastPrice!==void 0&&(t.priceEl.textContent=ei(n.lastPrice,this.locale)),n.lastPrice!==void 0&&n.refPrice!==void 0&&n.refPrice!==0){let e=n.lastPrice-n.refPrice,r=e/n.refPrice*100,i=e>=0?`+`:`-`,a=Math.abs(r).toLocaleString(this.locale,{minimumFractionDigits:2,maximumFractionDigits:2});t.changeEl.textContent=`${i}${a}%`,t.changeEl.className=`tcw-watchlist-change ${e>=0?`tcw-up`:`tcw-down`}`}else t.changeEl.textContent=``;n.sparkline&&n.sparkline.length>=2&&ti(t.sparkCanvas,n.sparkline,n.refPrice??n.sparkline[0])}}openMenu(){this.renderMenu(),this.menuEl.hidden=!1,this.nameBtn.setAttribute(`aria-expanded`,`true`),document.addEventListener(`mousedown`,this.onOutside)}closeMenu(){this.menuEl.hidden=!0,this.nameBtn.setAttribute(`aria-expanded`,`false`),document.removeEventListener(`mousedown`,this.onOutside)}renderMenu(){let e=(e,t)=>{let n=document.createElement(`button`);return n.type=`button`,n.className=`tcw-dropdown-item`,n.setAttribute(`role`,`menuitem`),n.textContent=e,n.addEventListener(`click`,t),n},n=this.lists.map(t=>{let n=e(``,()=>{this.closeMenu(),this.callbacks.onPickList?.(t.id)});n.dataset.list=t.id,n.classList.toggle(`tcw-active`,t.id===this.activeList);let r=document.createElement(`span`);r.textContent=t.name;let i=document.createElement(`span`);return i.className=`tcw-watchlist-count`,i.textContent=String(t.symbols.length),n.append(r,i),n}),r=document.createElement(`div`);if(r.className=`tcw-dropdown-divider`,n.push(r),this.callbacks.onCreateList){let t=e(this.labels.newList,()=>this.editName(``,e=>this.callbacks.onCreateList?.(e)));t.dataset.action=`new`,n.push(t)}let i=this.shownList();if(i&&this.callbacks.onRenameList){let t=e(this.labels.rename,()=>this.editName(i.name,e=>this.callbacks.onRenameList?.(i.id,e)));t.dataset.action=`rename`,n.push(t)}if(i&&this.callbacks.onDeleteList&&this.lists.length>1){let r=!1,a=e(this.labels.deleteList,()=>{if(!r){r=!0,a.textContent=t.r(this.labels.confirmDelete,{name:i.name}),a.classList.add(`tcw-danger`);return}this.closeMenu(),this.callbacks.onDeleteList?.(i.id)});a.dataset.action=`delete`,n.push(a)}this.menuEl.replaceChildren(...n)}editName(e,t){this.closeMenu();let n=document.createElement(`input`);n.className=`tcw-watchlist-input`,n.type=`text`,n.maxLength=60,n.value=e,n.placeholder=this.labels.listName,n.setAttribute(`aria-label`,this.labels.listName),this.nameBtn.hidden=!0,this.headerEl.insertBefore(n,this.nameBtn);let r=!1,i=i=>{if(r)return;r=!0;let a=n.value.trim();n.remove(),this.nameBtn.hidden=!1,i&&a&&a!==e&&t(a),this.nameBtn.focus()};n.addEventListener(`keydown`,e=>{e.stopPropagation(),e.key===`Enter`?(e.preventDefault(),i(!0)):e.key===`Escape`&&(e.preventDefault(),e.stopPropagation(),i(!1))}),n.addEventListener(`blur`,()=>i(!1)),n.focus()}};function $r(e){for(let t of[`USDT`,`USD`,`BTC`,`ETH`,`EUR`])if(e.length>t.length&&e.endsWith(t))return e.slice(0,-t.length)+`/`+t;return e}function ei(e,t){if(e===0)return`0`;let n=Math.abs(e);return n>=1e3?e.toLocaleString(t,{minimumFractionDigits:2,maximumFractionDigits:2}):n>=1?e.toLocaleString(t,{minimumFractionDigits:4,maximumFractionDigits:4}):Number(e.toPrecision(4)).toLocaleString(t,{maximumFractionDigits:10})}function ti(e,t,n){let r=e.getContext(`2d`);if(!r)return;let i=window.devicePixelRatio||1;e.width!==e.clientWidth*i&&(e.width=(e.clientWidth||64)*i,e.height=(e.clientHeight||22)*i);let a=e.width,o=e.height,s=1/0,c=-1/0;for(let e of t)e<s&&(s=e),e>c&&(c=e);let l=Math.max(c-s,1e-9),u=t[t.length-1]>=n?`#1fa874`:`#e8505b`;r.clearRect(0,0,a,o),r.lineWidth=1.4*i,r.strokeStyle=u,r.beginPath();let d=a/(t.length-1);for(let e=0;e<t.length;e++){let n=e*d,i=o-(t[e]-s)/l*(o-4)-2;e===0?r.moveTo(n,i):r.lineTo(n,i)}r.stroke()}var ni=50,ri=500,ii=60,ai=e=>typeof e==`string`&&e.trim().slice(0,ii)||null;function oi(e){let t=[];for(let n of e){let e=Wt(n);if(e&&!t.includes(e)&&t.push(e),t.length===ri)break}return t}function si(e){if(!e||typeof e!=`object`)return null;let t=e;if(!Array.isArray(t.lists))return null;let n=[];for(let e of t.lists){if(n.length===ni)break;if(!e||typeof e!=`object`)continue;let t=e,r=typeof t.id==`string`&&t.id&&t.id.length<=64?t.id:null,i=ai(t.name);!r||!i||n.some(e=>e.id===r)||n.push({id:r,name:i,symbols:Array.isArray(t.symbols)?oi(t.symbols):[]})}return n.length===0?null:{lists:n,active:typeof t.active==`string`&&n.some(e=>e.id===t.active)?t.active:n[0].id}}var ci=e=>({...e,symbols:[...e.symbols]}),li=class{lists;active;listeners=new Set;storage;storageKey;constructor(e){this.storage=e.storage??null,this.storageKey=e.storageKey??`tcw:watchlists`;let t=this.load(),n=e.lists?si({lists:e.lists,active:e.activeList}):null,r=t??n??{lists:[{id:`default`,name:ai(e.defaultName)??`Watchlist`,symbols:oi(e.symbols??[])}],active:`default`};this.lists=r.lists,this.active=r.active}getLists(){return this.lists.map(ci)}getActive(){return ci(this.activeList())}setActive(e){e===this.active||!this.lists.some(t=>t.id===e)||(this.active=e,this.changed())}replace(e,t){let n=si({lists:e,active:t??this.active});n&&(this.lists=n.lists,this.active=n.active,this.changed())}create(e){let t=ai(e);if(!t||this.lists.length>=ni)return null;let n=this.lists.length+1;for(;this.lists.some(e=>e.id===`list-${n}`);)n++;let r={id:`list-${n}`,name:t,symbols:[]};return this.lists=[...this.lists,r],this.active=r.id,this.changed(),ci(r)}rename(e,t){let n=ai(t);n&&this.update(e,e=>({...e,name:n}))}remove(e){this.lists.length<=1||!this.lists.some(t=>t.id===e)||(this.lists=this.lists.filter(t=>t.id!==e),this.active===e&&(this.active=this.lists[0].id),this.changed())}add(e,t=this.active){let n=Wt(e),r=this.lists.find(e=>e.id===t);return!n||!r||r.symbols.includes(n)||r.symbols.length>=ri?!1:(this.update(t,e=>({...e,symbols:[...e.symbols,n]})),!0)}removeSymbol(e,t=this.active){this.lists.find(e=>e.id===t)?.symbols.includes(e)&&this.update(t,t=>({...t,symbols:t.symbols.filter(t=>t!==e)}))}move(e,t,n=this.active){let r=this.lists.find(e=>e.id===n);if(!r)return;let i=r.symbols.indexOf(e);if(i<0)return;let a=r.symbols.filter(t=>t!==e),o=Math.max(0,Math.min(Math.round(t),a.length));o!==i&&this.update(n,t=>({...t,symbols:[...a.slice(0,o),e,...a.slice(o)]}))}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}activeList(){return this.lists.find(e=>e.id===this.active)??this.lists[0]}update(e,t){this.lists=this.lists.map(n=>n.id===e?t(n):n),this.changed()}changed(){this.save();for(let e of this.listeners)e()}load(){if(!this.storage)return null;try{let e=this.storage.getItem(this.storageKey);return e?si(JSON.parse(e)):null}catch{return null}}save(){if(this.storage)try{this.storage.setItem(this.storageKey,JSON.stringify({lists:this.lists,active:this.active}))}catch{}}},ui=class{el;bodyEl;newsEl;shown=!1;constructor(e,n=t.t,r={}){this.t=n,this.callbacks=r,this.el=document.createElement(`div`),this.el.className=`tcw-syminfo`,E(this.el,`symbolInfo`),this.el.setAttribute(`role`,`dialog`),this.el.setAttribute(`aria-label`,n(`symbolInfo.title`)),this.el.hidden=!0;let i=document.createElement(`div`);i.className=`tcw-syminfo-header`;let a=document.createElement(`span`);a.textContent=n(`symbolInfo.title`);let o=document.createElement(`button`);o.type=`button`,o.className=`tcw-syminfo-close`,o.setAttribute(`aria-label`,n(`common.close`)),o.innerHTML=D(`x`,14),o.addEventListener(`click`,()=>this.callbacks.onClose?this.callbacks.onClose():this.close()),i.append(a,o),this.bodyEl=document.createElement(`div`),this.bodyEl.className=`tcw-syminfo-body`,this.newsEl=document.createElement(`div`),this.newsEl.className=`tcw-syminfo-news`,this.newsEl.hidden=!0,this.el.append(i,this.bodyEl,this.newsEl),e.appendChild(this.el)}get element(){return this.el}isOpen(){return this.shown}toggle(){this.shown?this.close():this.open()}open(){this.shown||(this.shown=!0,this.el.hidden=!1,this.callbacks.onToggle?.(!0))}close(){this.shown&&(this.shown=!1,this.el.hidden=!0,this.callbacks.onToggle?.(!1))}render(e){let t=document.createElement(`div`);t.className=`tcw-syminfo-head`,t.append(V(`div`,`tcw-syminfo-symbol`,e.symbol)),e.description&&t.append(V(`div`,`tcw-syminfo-desc`,e.description)),e.meta&&t.append(V(`div`,`tcw-syminfo-meta`,e.meta));let n=document.createElement(`div`);if(n.className=`tcw-syminfo-quote`,e.price&&n.append(V(`span`,`tcw-syminfo-price`,e.price)),e.change){let t=V(`span`,`tcw-syminfo-change`,e.change.text);t.classList.add(e.change.up?`tcw-up`:`tcw-down`),n.append(t)}let r=V(`div`,`tcw-syminfo-status`,e.status.text);r.dataset.state=e.status.state;let i=document.createElement(`dl`);i.className=`tcw-syminfo-stats`;for(let t of e.stats){let e=document.createElement(`div`);e.className=`tcw-syminfo-stat`,e.append(V(`dt`,``,t.label),V(`dd`,``,t.value)),i.append(e)}this.bodyEl.replaceChildren(t,n,r,i)}renderNews(e){if(this.newsEl.hidden=e.kind===`none`,e.kind===`none`){this.newsEl.replaceChildren();return}let t=V(`div`,`tcw-syminfo-news-title`,this.t(`symbolInfo.news`));if(e.kind===`loading`||e.kind===`failed`||e.items.length===0){let t=e.kind===`loading`?`symbolInfo.loading`:e.kind===`failed`?`symbolInfo.newsFailed`:`symbolInfo.noNews`;this.newsEl.replaceChildren(V(`div`,`tcw-syminfo-news-note`,this.t(t)));return}let n=document.createElement(`ul`);n.className=`tcw-syminfo-news-list`;for(let t of e.items){let e=document.createElement(`li`);if(e.className=`tcw-syminfo-news-item`,t.url){let n=document.createElement(`a`);n.href=t.url,n.target=`_blank`,n.rel=`noopener noreferrer`,n.textContent=t.title,e.append(n)}else e.append(V(`span`,``,t.title));t.meta&&e.append(V(`div`,`tcw-syminfo-news-meta`,t.meta)),n.append(e)}this.newsEl.replaceChildren(t,n)}destroy(){this.el.remove()}};function V(e,t,n){let r=document.createElement(e);return t&&(r.className=t),r.textContent=n,r}var di=10,fi=5*6e4,pi=864e5;function mi(e){let{info:r,quote:i,t:a,textLocale:o}=e,s=(0,n.symbolTimeZone)(r),c=gi(e.bars,s),l=e.formatPrice,u=i?.last??c?.close,d=i?.prevClose??c?.prevClose,f=i?.change??(u!==void 0&&d!==void 0?u-d:void 0),p=u!==void 0&&f!==void 0?u-f:void 0,m=i?.changePercent??(f!==void 0&&p?f/p*100:void 0),h=(0,n.marketStatus)(r,e.now),ee=a(h.state===`open`?`symbolInfo.open`:h.state===`closed`?`symbolInfo.closed`:`symbolInfo.always`);if(h.state!==`always`&&h.next!==null){let n=_i(h.next-e.now,o);ee+=` · ${t.r(a(h.state===`open`?`symbolInfo.closesIn`:`symbolInfo.opensIn`),{when:n})}`}let g=[],_=(e,t)=>{t&&g.push({label:e,value:t})},v=e=>e===void 0?void 0:l(e);_(a(`dataWindow.open`),v(i?.open??c?.open)),_(a(`dataWindow.high`),v(i?.high??c?.high)),_(a(`dataWindow.low`),v(i?.low??c?.low)),_(a(`symbolInfo.prevClose`),v(d));let y=i?.volume??c?.volume;_(a(`dataWindow.volume`),y===void 0?void 0:vi(y,e.numberLocale)),_(a(`symbolInfo.bid`),v(i?.bid)),_(a(`symbolInfo.ask`),v(i?.ask)),_(a(`symbolInfo.tick`),r?.minTick===void 0?void 0:String(r.minTick)),_(a(`symbolInfo.currency`),r?.currency),_(a(`symbolInfo.timezone`),s),_(a(`symbolInfo.hours`),yi(r,o));let te=(f??0)>=0?`+`:`-`,b=e.names===void 0?r:e.names;return{symbol:e.symbol,description:b?.description,meta:[b?.exchange,b?.type].filter(Boolean).join(` · `)||void 0,price:u===void 0?void 0:l(u),change:f===void 0?void 0:{text:`${te}${l(Math.abs(f))}${m===void 0?``:` (${te}${Math.abs(m).toFixed(2)}%)`}`,up:f>=0},status:{state:h.state,text:ee},stats:g}}var hi=class{request=0;cache=new Map;load(e,t,r,i,a){let o=++this.request;if(!t){r({kind:`none`});return}let s=e=>{let t=Date.now();r({kind:`items`,items:e.map(e=>({title:e.title,url:e.url,meta:[e.source,_i(e.time-t,i)].filter(Boolean).join(` · `)}))})},c=this.cache.get(e);if(c&&Date.now()-c.at<fi){s(c.items);return}r({kind:`loading`}),Promise.resolve().then(()=>t(e,di)).then(t=>{if(o!==this.request||a())return;let r=(0,n.readNews)(t,di);this.cache.set(e,{at:Date.now(),items:r}),s(r)}).catch(()=>{o===this.request&&!a()&&r({kind:`failed`})})}};function gi(e,t){if(e.length===0)return null;let r=t&&(0,n.isValidTimeZone)(t)?t:null,i=(0,n.barTimeUnit)(e),a=e=>{let t=e*i;return Math.floor((t+(r?(0,n.zoneOffsetMinutes)(r,t)*6e4:0))/pi)},o=e[e.length-1],s=a(o.time),c=e.length-1;for(;c>0&&a(e[c-1].time)===s;)c--;let l=-1/0,u=1/0,d=0;for(let t=c;t<e.length;t++)l=Math.max(l,e[t].high),u=Math.min(u,e[t].low),d+=e[t].volume??0;return{open:e[c].open,high:l,low:u,close:o.close,volume:d,prevClose:c>0?e[c-1].close:void 0}}function _i(e,t){let n=e/6e4,[r,i]=Math.abs(n)<60?[Math.round(n)||Math.sign(n)||1,`minute`]:Math.abs(n)<1440?[Math.round(n/60),`hour`]:[Math.round(n/1440),`day`];try{return new Intl.RelativeTimeFormat(t,{numeric:`auto`}).format(r,i)}catch{return new Intl.RelativeTimeFormat(`en`,{numeric:`auto`}).format(r,i)}}function vi(e,t){try{return new Intl.NumberFormat(t,{notation:`compact`,maximumFractionDigits:2}).format(e)}catch{return String(e)}}function yi(e,t){let n=e?.sessions??[];if(n.length===0)return;let r;try{let e=new Intl.DateTimeFormat(t,{weekday:`short`,timeZone:`UTC`});r=Array.from({length:7},(t,n)=>e.format(Date.UTC(1970,0,4+n)))}catch{r=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`]}let i=e=>{let t=[...new Set((e??[]).filter(e=>Number.isInteger(e)&&e>=0&&e<=6))].sort((e,t)=>e-t);return t.length===0||t.length===7?``:t.every((e,n)=>n===0||e===t[n-1]+1)&&t.length>2?`${r[t[0]]}–${r[t[t.length-1]]}`:t.map(e=>r[e]).join(`, `)};return n.map(e=>[`⁦${e.start}–${e.end}⁩`,i(e.days)].filter(Boolean).join(` `)).join(`, `)}var bi={KeyT:`trendLine`,KeyH:`horizontalLine`,KeyJ:`horizontalRay`,KeyV:`verticalLine`,KeyC:`crossLine`,KeyF:`fibRetracement`};function xi(){let e={};for(let[t,n]of Object.entries(bi))e[n]=`Alt+${t.replace(/^Key/,``)}`;return e}var Si=300,Ci=80,wi=n.PHI**-3,Ti=80,Ei=class{el;holdTimer=null;repeatTimer=null;pressed=!1;keyboardFocus=!1;onMove=e=>{if(e.pointerType!==`touch`&&!(this.holdTimer||this.repeatTimer)){if(!this.nearBottom(e)&&!this.keyboardFocus){this.el.classList.remove(`tcw-nav-shown`),this.stopHold();return}this.el.classList.contains(`tcw-nav-shown`)||this.place(),this.el.classList.add(`tcw-nav-shown`)}};onLeave=()=>{this.el.classList.remove(`tcw-nav-shown`),this.stopHold()};constructor(e,n,r=t.t){this.host=e,this.actions=n,this.el=document.createElement(`div`),this.el.className=`tcw-nav`,E(this.el,`navigation`),this.el.setAttribute(`role`,`toolbar`),this.el.setAttribute(`aria-label`,r(`nav.label`));let i=[[`zoomOut`,`minus`,r(`nav.zoomOut`),`navigation.zoom`],[`zoomIn`,`plus`,r(`nav.zoomIn`),`navigation.zoom`],[`scrollLeft`,`chevronLeft`,r(`nav.scrollLeft`),`navigation.scroll`],[`scrollRight`,`chevronRight`,r(`nav.scrollRight`),`navigation.scroll`],[`reset`,`reset`,r(`nav.reset`),`navigation.reset`]];for(let[e,t,r,a]of i){let i=document.createElement(`button`);if(i.type=`button`,i.className=`tcw-nav-btn`,i.dataset.nav=e,E(i,a),i.title=r,i.setAttribute(`aria-label`,r),i.innerHTML=D(t,16),e===`scrollLeft`||e===`scrollRight`){let t=e===`scrollRight`?1:-1;i.addEventListener(`pointerdown`,e=>{if(e.button===0){e.preventDefault();try{i.setPointerCapture(e.pointerId)}catch{}this.startHold(t)}});for(let e of[`pointerup`,`pointercancel`,`pointerleave`])i.addEventListener(e,()=>this.stopHold());i.addEventListener(`click`,e=>{e.detail===0&&n.scroll(t)})}else i.addEventListener(`click`,()=>{e===`zoomIn`?n.zoomIn():e===`zoomOut`?n.zoomOut():n.reset()});this.el.appendChild(i)}for(let e of[`dblclick`,`contextmenu`,`pointerdown`,`mousedown`])this.el.addEventListener(e,e=>e.stopPropagation());this.el.addEventListener(`pointerdown`,()=>{this.pressed=!0},{capture:!0}),this.el.addEventListener(`pointerup`,()=>{this.pressed=!1},{capture:!0}),this.el.addEventListener(`focusin`,()=>{this.keyboardFocus=!this.pressed,this.pressed=!1,this.place(),this.el.classList.add(`tcw-nav-shown`)}),this.el.addEventListener(`focusout`,e=>{this.el.contains(e.relatedTarget)||(this.keyboardFocus=!1,this.el.classList.remove(`tcw-nav-shown`))}),e.appendChild(this.el),e.addEventListener(`pointermove`,this.onMove),e.addEventListener(`pointerleave`,this.onLeave)}destroy(){this.stopHold(),this.host.removeEventListener(`pointermove`,this.onMove),this.host.removeEventListener(`pointerleave`,this.onLeave),this.el.remove()}nearBottom(e){let t=this.actions.plotRect(),n=this.host.getBoundingClientRect(),r=e.clientX-n.left,i=e.clientY-n.top,a=Math.max(Ti,t.height*wi);return r>=t.x&&r<=t.x+t.width&&i<=t.y+t.height&&i>=t.y+t.height-a}place(){let e=this.actions.plotRect();this.el.style.left=`${Math.round(e.x+e.width/2)}px`,this.el.style.top=`${Math.round(e.y+e.height)}px`}startHold(e){this.stopHold(),this.actions.scroll(e),this.holdTimer=setTimeout(()=>{this.repeatTimer=setInterval(()=>this.actions.scroll(e),Ci)},Si)}stopHold(){this.holdTimer&&clearTimeout(this.holdTimer),this.repeatTimer&&clearInterval(this.repeatTimer),this.holdTimer=null,this.repeatTimer=null}};function Di(e,n,r,i=!1){let a=e.label??n(`alerts.source.price`),o=Mi.get(e.condition),s=o?n(o):e.condition;if(ki.includes(e.condition))return`${a} ${s} ${t.r(n(`alerts.moveSummary`),{percent:e.percent??0,bars:e.bars??0})}`;if(e.target)return`${a} ${s} ${e.targetLabel??e.target}`;let c=e.channel&&e.channel!==`price`,l=Number.isFinite(e.price)?c?Pi(e.price):r(e.price):`—`;return`${(c||e.drawingId)&&e.label?`${e.label} `:i?`${a} `:``}${s} ${l}`}var Oi=[{value:`crossing`,key:`alerts.condition.crossing`},{value:`crossingUp`,key:`alerts.condition.crossingUp`},{value:`crossingDown`,key:`alerts.condition.crossingDown`},{value:`greaterThan`,key:`alerts.condition.greaterThan`},{value:`lessThan`,key:`alerts.condition.lessThan`},{value:`movesUp`,key:`alerts.condition.movesUp`},{value:`movesDown`,key:`alerts.condition.movesDown`}],ki=[`movesUp`,`movesDown`],Ai={hour:36e5,day:864e5,week:7*864e5,month:30*864e5},ji=``,Mi=new Map(Oi.map(e=>[e.value,e.key]));function Ni(e){return Math.round(e*1e6)/1e6}function Pi(e){let t=Math.abs(e);return t>=1e3||t>=1?e.toFixed(2):e.toPrecision(4)}var Fi=class{el;listEl;priceInput;conditionSelect;sourceSelect;targetSelect;percentInput;barsInput;levelRow;moveRow;closeCheck;expirySelect;messageInput;emptyEl;callbacks;open=!1;alerts=[];sources;constructor(e,n,i=t.t){this.t=i,this.callbacks=n,this.sources=[{channel:`price`,label:this.t(`alerts.source.price`)}],this.el=document.createElement(`div`),this.el.className=`tcw-alerts-panel`,E(this.el,`alerts`),this.el.hidden=!0;let a=document.createElement(`div`);a.className=`tcw-alerts-header`;let o=document.createElement(`span`);o.textContent=this.t(`alerts.title`);let s=document.createElement(`button`);s.className=`tcw-alerts-close`,s.type=`button`,s.setAttribute(`aria-label`,this.t(`alerts.close`)),s.innerHTML=D(`x`,14),s.addEventListener(`click`,()=>this.callbacks.onClose?this.callbacks.onClose():this.close()),a.appendChild(o),a.appendChild(s),this.el.appendChild(a);let c=document.createElement(`form`);c.className=`tcw-alerts-form`,c.noValidate=!0,this.sourceSelect=document.createElement(`select`),this.sourceSelect.className=`tcw-alerts-source`,this.sourceSelect.setAttribute(`aria-label`,this.t(`alerts.source`)),this.sourceSelect.addEventListener(`change`,()=>{this.renderTargets(),this.prefillPrice()}),this.conditionSelect=document.createElement(`select`),this.conditionSelect.className=`tcw-alerts-condition`,this.conditionSelect.setAttribute(`aria-label`,this.t(`alerts.conditionLabel`));for(let e of Oi){let t=document.createElement(`option`);t.value=e.value,t.textContent=this.t(e.key),this.conditionSelect.appendChild(t)}this.conditionSelect.addEventListener(`change`,()=>this.showFields()),this.levelRow=document.createElement(`div`),this.levelRow.className=`tcw-alerts-row-fields`,this.targetSelect=document.createElement(`select`),this.targetSelect.className=`tcw-alerts-target`,this.targetSelect.setAttribute(`aria-label`,this.t(`alerts.compareWith`)),this.targetSelect.addEventListener(`change`,()=>this.showFields()),this.priceInput=document.createElement(`input`),this.priceInput.type=`number`,this.priceInput.step=`any`,this.priceInput.placeholder=this.t(`alerts.value`),this.priceInput.setAttribute(`aria-label`,this.t(`alerts.value`)),this.priceInput.className=`tcw-alerts-price`,this.levelRow.append(this.targetSelect,this.priceInput),this.moveRow=document.createElement(`div`),this.moveRow.className=`tcw-alerts-row-fields`,this.percentInput=this.numberField(`tcw-alerts-percent`,this.t(`alerts.percent`),`1`,`0.01`),this.barsInput=this.numberField(`tcw-alerts-bars`,this.t(`alerts.bars`),`10`,`1`),this.barsInput.min=String(r.MIN_ALERT_BARS),this.barsInput.max=String(r.MAX_ALERT_BARS),this.moveRow.append(this.percentInput,this.barsInput);let l=document.createElement(`div`);l.className=`tcw-alerts-row-fields tcw-alerts-options`;let u=document.createElement(`label`);u.className=`tcw-alerts-check`,this.closeCheck=document.createElement(`input`),this.closeCheck.type=`checkbox`,u.append(this.closeCheck,document.createTextNode(this.t(`alerts.onBarClose`))),this.expirySelect=document.createElement(`select`),this.expirySelect.className=`tcw-alerts-expiry`,this.expirySelect.setAttribute(`aria-label`,this.t(`alerts.expires`));for(let e of[`never`,`hour`,`day`,`week`,`month`]){let t=document.createElement(`option`);t.value=e,t.textContent=this.t(`alerts.expires.${e}`),this.expirySelect.appendChild(t)}l.append(u,this.expirySelect),this.messageInput=document.createElement(`input`),this.messageInput.type=`text`,this.messageInput.placeholder=this.t(`alerts.note`),this.messageInput.setAttribute(`aria-label`,this.t(`alerts.note`)),this.messageInput.className=`tcw-alerts-message`;let d=document.createElement(`button`);d.type=`submit`,d.className=`tcw-alerts-add`,d.innerHTML=`${D(`plus`,14)}<span>${O(this.t(`alerts.add`))}</span>`,c.append(this.sourceSelect,this.conditionSelect,this.levelRow,this.moveRow,l,this.messageInput,d),c.addEventListener(`submit`,e=>{e.preventDefault(),this.submitForm()}),this.el.appendChild(c),this.listEl=document.createElement(`div`),this.listEl.className=`tcw-alerts-list`,this.el.appendChild(this.listEl),this.emptyEl=document.createElement(`div`),this.emptyEl.className=`tcw-alerts-empty`,this.emptyEl.textContent=this.t(`alerts.empty`),this.listEl.appendChild(this.emptyEl),this.renderSources(),this.showFields(),e.appendChild(this.el)}numberField(e,t,n,r){let i=document.createElement(`input`);return i.type=`number`,i.step=r,i.min=`0`,i.value=n,i.className=e,i.placeholder=t,i.setAttribute(`aria-label`,t),i}showFields(){let e=ki.includes(this.conditionSelect.value);this.moveRow.hidden=!e,this.levelRow.hidden=e,this.priceInput.hidden=this.targetSelect.value!==ji}renderTargets(){let e=this.targetSelect.value,t=this.sourceSelect.value||`price`;this.targetSelect.replaceChildren();let n=document.createElement(`option`);n.value=ji,n.textContent=this.t(`alerts.compare.value`),this.targetSelect.appendChild(n);for(let e of this.sources){if(e.channel===t)continue;let n=document.createElement(`option`);n.value=e.channel,n.textContent=e.label,this.targetSelect.appendChild(n)}this.targetSelect.value=[...this.targetSelect.options].some(t=>t.value===e)?e:ji,this.showFields()}setSources(e){this.sources=e.length>0?e:[{channel:`price`,label:this.t(`alerts.source.price`)}],this.renderSources()}renderSources(){let e=this.sourceSelect.value||`price`;this.sourceSelect.replaceChildren();for(let e of this.sources){let t=document.createElement(`option`);t.value=e.channel,t.textContent=e.label,this.sourceSelect.appendChild(t)}this.sourceSelect.value=this.sources.some(t=>t.channel===e)?e:`price`,this.renderTargets()}get element(){return this.el}isOpen(){return this.open}toggle(){this.open?this.close():this.openPanel()}openPanel(){this.open=!0,this.el.hidden=!1,this.priceInput.value===``&&this.prefillPrice()}prefillPrice(){let e=this.callbacks.getChannelValue(this.sourceSelect.value||`price`);this.priceInput.value=e===null?``:String(Ni(e))}close(){this.open=!1,this.el.hidden=!0}setAlerts(e){this.alerts=e,this.renderList()}destroy(){this.el.remove()}submitForm(){let e=this.conditionSelect.value,t=this.messageInput.value.trim()||void 0,n=this.sourceSelect.value||`price`,i=this.sources.find(e=>e.channel===n)?.label??this.t(`alerts.source.price`),a={},o=NaN;if(ki.includes(e)){a.percent=Number(this.percentInput.value),a.bars=Number(this.barsInput.value);let e=Number.isInteger(a.bars)&&a.bars>=r.MIN_ALERT_BARS&&a.bars<=r.MAX_ALERT_BARS;if(!(a.percent>0)||!e){this.markInvalid(a.percent>0?this.barsInput:this.percentInput);return}}else if(this.targetSelect.value!==ji)a.target=this.targetSelect.value;else if(o=Number(this.priceInput.value),this.priceInput.value.trim()===``||!Number.isFinite(o)){this.markInvalid(this.priceInput);return}this.closeCheck.checked&&(a.onBarClose=!0);let s=Ai[this.expirySelect.value];s&&(a.expiresAt=(this.callbacks.now??Date.now)()+s),this.callbacks.onAdd({price:o,condition:e,message:t,channel:n,label:i,options:a})!==!1&&(this.messageInput.value=``,this.prefillPrice())}markInvalid(e){e.setAttribute(`aria-invalid`,`true`),e.focus(),e.addEventListener(`input`,()=>e.removeAttribute(`aria-invalid`),{once:!0})}describe(e){return Di(e,this.t,this.callbacks.formatPrice)}renderList(){if(this.listEl.replaceChildren(),this.alerts.length===0){this.listEl.appendChild(this.emptyEl);return}for(let e of[...this.alerts].reverse()){let n=document.createElement(`div`);n.className=`tcw-alerts-row`+(e.triggered?` tcw-alerts-triggered`:``)+(e.expired?` tcw-alerts-expired`:``);let r=document.createElement(`div`);r.className=`tcw-alerts-info`;let i=document.createElement(`div`);i.className=`tcw-alerts-row-main`,i.textContent=this.describe(e),r.appendChild(i);let a=[];if(e.onBarClose&&a.push(this.t(`alerts.onClose`)),e.expiresAt!==void 0&&!e.expired){let n=this.callbacks.formatTime?.(e.expiresAt)??new Date(e.expiresAt).toISOString();a.push(t.r(this.t(`alerts.until`),{time:n}))}if(a.length>0){let e=document.createElement(`div`);e.className=`tcw-alerts-row-meta`,e.textContent=a.join(` · `),r.appendChild(e)}if(e.message){let t=document.createElement(`div`);t.className=`tcw-alerts-row-note`,t.textContent=e.message,r.appendChild(t)}if(e.triggered||e.expired){let t=document.createElement(`span`);t.className=`tcw-alerts-badge`,t.textContent=this.t(e.expired?`alerts.expired`:`alerts.triggered`),i.appendChild(t)}let o=document.createElement(`button`);o.type=`button`,o.className=`tcw-alerts-del`,o.setAttribute(`aria-label`,this.t(`alerts.delete`)),o.innerHTML=D(`trash`,14),o.addEventListener(`click`,()=>this.callbacks.onRemove(e.id)),n.appendChild(r),n.appendChild(o),this.listEl.appendChild(n)}}},Ii=`print`,Li=3,Ri=10;function zi(e,t){return Math.max(Ri,(0,n.phiStep)(e,t,Li))}var Bi=`system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif`,Vi=`'JetBrains Mono', 'SF Mono', 'Cascadia Code', 'Fira Code', 'Consolas', ui-monospace, monospace`,Hi={print:{radius:{xs:1,sm:2,md:3,lg:5,xl:8},components:{tag:2,toolbar:0,sidebar:0},sizes:{toolbar:42,control:26,controlSmall:20,icon:16,sidebar:42,menuItem:33},density:{compact:{toolbar:33,control:20,controlSmall:20,icon:16,sidebar:33,menuItem:26},spacious:{toolbar:53,control:33,controlSmall:26,icon:20,sidebar:53,menuItem:42}},font:{family:n.SANS_FONT_FAMILY,mono:`'Cascadia Mono', 'SF Mono', ui-monospace, Menlo, Consolas, monospace`,size:13,weight:400,strongWeight:600,labelCase:`uppercase`,labelTracking:.06},borders:{width:1,separators:!0},shadows:{menu:`0 0 0 1px var(--tcw-border), var(--tcw-shadow-md)`,dialog:`0 0 0 1px var(--tcw-border), var(--tcw-shadow-lg)`,tooltip:`var(--tcw-shadow-sm)`},blur:0,active:`solid`,toolbar:`docked`,sidebar:`docked`,intervals:`plain`,tagRadius:2},studio:{radius:{xs:3,sm:5,md:7,lg:11,xl:16},components:{toolbar:0,sidebar:0},sizes:{toolbar:46,control:30,controlSmall:24,icon:18,sidebar:48,menuItem:30},font:{family:`'Manrope', 'Inter', ${Bi}`,mono:Vi,size:13,weight:500,strongWeight:600,labelCase:`none`,labelTracking:0},borders:{width:1,separators:!1},shadows:{menu:`var(--tcw-shadow-lg)`,dialog:`var(--tcw-shadow-xl)`,tooltip:`var(--tcw-shadow-md)`},blur:0,active:`tint`,toolbar:`docked`,sidebar:`docked`,intervals:`segmented`,tagRadius:4},terminal:{radius:{xs:1,sm:2,md:2,lg:2,xl:3},components:{tag:0,toolbar:0,sidebar:0},sizes:{toolbar:36,control:26,controlSmall:20,icon:16,sidebar:40,menuItem:26},font:{family:`'IBM Plex Sans Condensed', 'Roboto Condensed', 'Arial Narrow', ${Bi}`,mono:`'IBM Plex Mono', ui-monospace, monospace`,size:12,weight:500,strongWeight:600,labelCase:`uppercase`,labelTracking:.08},borders:{width:1,separators:!0},shadows:{menu:`0 0 0 1px var(--tcw-border-strong)`,dialog:`0 0 0 1px var(--tcw-border-strong), var(--tcw-shadow-lg)`,tooltip:`none`},blur:0,active:`underline`,toolbar:`docked`,sidebar:`docked`,intervals:`plain`,tagRadius:0},capsule:{radius:{xs:6,sm:10,md:999,lg:18,xl:24},components:{tooltip:10,toolbar:999,sidebar:999,toast:999,tag:999},sizes:{toolbar:44,control:32,controlSmall:26,icon:18,sidebar:48,menuItem:34},font:{family:`'Sora', 'Manrope', ${Bi}`,mono:Vi,size:13,weight:500,strongWeight:600,labelCase:`none`,labelTracking:0},borders:{width:1,separators:!1},shadows:{menu:`0 0 0 1px var(--tcw-divider), var(--tcw-shadow-xl)`,dialog:`0 0 0 1px var(--tcw-divider), var(--tcw-shadow-xl)`,tooltip:`var(--tcw-shadow-lg)`},blur:16,active:`solid`,toolbar:`floating`,sidebar:`floating`,intervals:`segmented`,tagRadius:999}},Ui={compact:{toolbar:38,control:26,controlSmall:20,icon:16,sidebar:40,menuItem:26},spacious:{toolbar:52,control:34,controlSmall:28,icon:20,sidebar:54,menuItem:34}};function Wi(e,t){return{control:e.md,input:e.md,menu:e.lg,dialog:e.xl,panel:e.lg,tooltip:e.sm,tag:e.sm,toast:e.lg,toolbar:0,sidebar:0,...t}}var Gi=Object.freeze(Object.fromEntries(Object.keys(Hi).map(e=>[e,qi(Ki(e))])));function Ki(e){let{density:t,...n}=Hi[e];return{...n,preset:e,density:`comfortable`,radius:{...n.radius},components:Wi(n.radius,n.components),sizes:{...n.sizes},font:{...n.font},borders:{...n.borders},shadows:{...n.shadows}}}function qi(e){for(let t of Object.values(e))t&&typeof t==`object`&&qi(t);return Object.freeze(e)}var Ji=e=>typeof e==`string`&&Object.prototype.hasOwnProperty.call(Hi,e),H=(e,t,n)=>typeof e==`number`&&Number.isFinite(e)&&e>=t&&e<=n,Yi=e=>typeof e==`string`&&e.trim().length>0&&e.length<=300&&!/[;{}<>\\]|url\s*\(|expression\s*\(|\/\*/i.test(e)&&Xi(e);function Xi(e){let t=0,n=``;for(let r of e)if(n)r===n&&(n=``);else if(r===`"`||r===`'`)n=r;else if(r===`(`)t++;else if(r===`)`&&--t<0)return!1;return t===0&&!n}var Zi=(e,t)=>typeof e==`string`&&t.includes(e);function Qi(e,t,n){let r={...e};if(!t||typeof t!=`object`)return r;for(let i of Object.keys(e)){let e=t[i];e!==void 0&&n(i,e)&&(r[i]=e)}return r}function U(e){let t=typeof e==`string`?{preset:e}:e??{},n=Ji(t.preset)?t.preset:Ii,r=Hi[n],i=Qi(r.radius,t.radius,(e,t)=>H(t,0,999)),a=Zi(t.density,[`compact`,`comfortable`,`spacious`,`airy`])?t.density:`comfortable`,o=a===`airy`?`spacious`:a,s=Qi(o===`compact`||o===`spacious`?(r.density??Ui)[o]:r.sizes,t.sizes,(e,t)=>e===`icon`?H(t,10,32):H(t,16,80)),c=Qi(r.font,t.font,(e,t)=>e===`family`||e===`mono`?Yi(t):e===`size`?H(t,11,20):e===`weight`||e===`strongWeight`?H(t,100,900):e===`labelCase`?t===`none`||t===`uppercase`:H(t,0,.5)),l=a===`airy`&&t.font?.mono===void 0?{...c,mono:c.family}:c;return{preset:n,density:a,radius:i,components:Qi(Wi(i,r.components),t.components,(e,t)=>H(t,0,999)),sizes:s,font:l,borders:Qi(r.borders,t.borders,(e,t)=>e===`width`?H(t,0,4):typeof t==`boolean`),shadows:Qi(r.shadows,t.shadows,(e,t)=>Yi(t)),blur:H(t.blur,0,40)?t.blur:r.blur,active:Zi(t.active,[`tint`,`solid`,`underline`])?t.active:r.active,toolbar:Zi(t.toolbar,[`docked`,`floating`])?t.toolbar:r.toolbar,sidebar:Zi(t.sidebar,[`docked`,`floating`])?t.sidebar:r.sidebar,intervals:Zi(t.intervals,[`plain`,`segmented`])?t.intervals:r.intervals,tagRadius:H(t.tagRadius,0,999)?t.tagRadius:r.tagRadius}}function $i(e){let t=e=>`${e}px`,n=e.radius,r=e.components,i=e.sizes,a=e.font;return{"--tcw-radius-xs":t(n.xs),"--tcw-radius-sm":t(n.sm),"--tcw-radius":t(n.md),"--tcw-radius-lg":t(n.lg),"--tcw-radius-xl":t(n.xl),"--tcw-control-radius":t(r.control),"--tcw-input-radius":t(r.input),"--tcw-menu-radius":t(r.menu),"--tcw-dialog-radius":t(r.dialog),"--tcw-panel-radius":t(r.panel),"--tcw-tooltip-radius":t(r.tooltip),"--tcw-tag-radius":t(r.tag),"--tcw-toast-radius":t(r.toast),"--tcw-toolbar-radius":t(r.toolbar),"--tcw-sidebar-radius":t(r.sidebar),"--tcw-toolbar-h":t(i.toolbar),"--tcw-control-h":t(i.control),"--tcw-control-h-sm":t(i.controlSmall),"--tcw-icon":t(i.icon),"--tcw-sidebar-w":t(i.sidebar),"--tcw-menu-item-h":t(i.menuItem),"--tcw-font":a.family,"--tcw-font-mono":a.mono,"--tcw-font-size":t(a.size),"--tcw-font-size-sm":t(zi(a.size,-1)),"--tcw-font-size-xs":t(zi(a.size,-2)),"--tcw-font-size-lg":t(zi(a.size,1)),"--tcw-font-size-xl":t(zi(a.size,2)),"--tcw-font-size-display":t(zi(a.size,3)),"--tcw-weight":String(a.weight),"--tcw-weight-strong":String(a.strongWeight),"--tcw-label-case":a.labelCase,"--tcw-label-tracking":`${a.labelTracking}em`,"--tcw-border-w":t(e.borders.width),"--tcw-sep-w":e.borders.separators?t(Math.max(1,e.borders.width)):`0px`,"--tcw-menu-shadow":e.shadows.menu,"--tcw-dialog-shadow":e.shadows.dialog,"--tcw-tooltip-shadow":e.shadows.tooltip,"--tcw-blur":t(e.blur),"--tcw-surface-opacity":e.blur>0?`82%`:`100%`}}function W(e,t,n={}){let r=n.variables!==!1;for(let[n,i]of Object.entries($i(t)))r?e.style.setProperty(n,i):e.style.removeProperty(n);e.dataset.tcwUi=t.preset,e.dataset.tcwActive=t.active,e.dataset.tcwToolbar=t.toolbar,e.dataset.tcwSidebar=t.sidebar,e.dataset.tcwIntervals=t.intervals,e.dataset.tcwSeparators=t.borders.separators?`on`:`off`}var ea=class{el;indicatorsEl;drawingsEl;compareEl=null;callbacks;open=!1;constructor(e,n,r=t.t){this.t=r,this.callbacks=n,this.el=document.createElement(`div`),this.el.className=`tcw-tree-panel`,E(this.el,`objectTree`),this.el.hidden=!0;let i=document.createElement(`div`);i.className=`tcw-tree-header`;let a=document.createElement(`span`);a.textContent=this.t(`objects.title`);let o=document.createElement(`button`);if(o.type=`button`,o.className=`tcw-tree-close`,o.setAttribute(`aria-label`,this.t(`objects.close`)),o.innerHTML=D(`x`,14),o.addEventListener(`click`,()=>this.callbacks.onClose?this.callbacks.onClose():this.close()),i.appendChild(a),i.appendChild(o),this.el.appendChild(i),this.indicatorsEl=this.makeSection(this.t(`objects.indicators`)),this.drawingsEl=this.makeSection(this.t(`objects.drawings`)),this.callbacks.onAddCompare){this.compareEl=this.makeSection(this.t(`objects.compare`),{label:this.t(`objects.addCompare`),run:()=>this.callbacks.onAddCompare?.()});let e=this.compareEl.parentElement?.querySelector(`.tcw-tree-add`);e&&E(e,`compare`)}e.appendChild(this.el)}get element(){return this.el}isOpen(){return this.open}toggle(){this.open?this.close():this.openPanel()}openPanel(){this.open=!0,this.el.hidden=!1}close(){this.open=!1,this.el.hidden=!0}destroy(){this.el.remove()}setObjects(e,t,n=[]){this.renderIndicators(e),this.renderDrawings(t),this.renderCompares(n)}makeSection(e,t){let n=document.createElement(`div`);n.className=`tcw-tree-section`;let r=document.createElement(`div`);r.className=`tcw-tree-section-head`;let i=document.createElement(`span`);if(i.textContent=e,r.appendChild(i),t){let e=document.createElement(`button`);e.type=`button`,e.className=`tcw-tree-add`,e.setAttribute(`aria-label`,t.label),e.title=t.label,e.innerHTML=D(`plus`,13),e.addEventListener(`click`,t.run),r.appendChild(e)}let a=document.createElement(`div`);return a.className=`tcw-tree-list`,n.appendChild(r),n.appendChild(a),this.el.appendChild(n),a}renderIndicators(e){if(this.indicatorsEl.replaceChildren(),e.length===0){this.indicatorsEl.appendChild(this.emptyRow(this.t(`objects.noIndicators`)));return}for(let t of e){let e=this.row(t.name);t.visible||e.classList.add(`tcw-tree-hidden`);let n=document.createElement(`div`);if(n.className=`tcw-tree-actions`,this.callbacks.onToggleIndicatorVisible&&n.appendChild(this.iconButton(t.visible?`eye`:`eyeOff`,t.visible?this.t(`common.hide`):this.t(`common.show`),``,()=>this.callbacks.onToggleIndicatorVisible?.(t.instanceId,!t.visible))),this.callbacks.onConfigureIndicator){let e=this.iconButton(`settings`,this.t(`objects.indicatorSettings`),``,()=>this.callbacks.onConfigureIndicator?.(t.instanceId));E(e,`indicatorSettings`),n.appendChild(e)}n.appendChild(this.iconButton(`trash`,this.t(`objects.removeIndicator`),`tcw-tree-del`,()=>this.callbacks.onRemoveIndicator(t.instanceId))),e.appendChild(n),this.indicatorsEl.appendChild(e)}}renderDrawings(e){if(this.drawingsEl.replaceChildren(),e.length===0){this.drawingsEl.appendChild(this.emptyRow(this.t(`objects.noDrawings`)));return}let t=new Set;for(let n of e){if(!n.group){this.drawingsEl.appendChild(this.drawingRow(n));continue}if(t.has(n.group.id))continue;t.add(n.group.id);let r=n.group.id,i=e.filter(e=>e.group?.id===r);this.drawingsEl.appendChild(this.groupRow(r,n.group.name,i));for(let e of i){let t=this.drawingRow(e);t.classList.add(`tcw-tree-member`),this.drawingsEl.appendChild(t)}}}groupRow(e,t,n){let r=this.row(t);r.classList.add(`tcw-tree-group`);let i=n.some(e=>e.visible),a=n.every(e=>e.locked);i||r.classList.add(`tcw-tree-hidden`);let o=r.querySelector(`.tcw-tree-name`);o.innerHTML=D(`layers`,13),o.append(` ${t}`);let s=document.createElement(`div`);return s.className=`tcw-tree-actions`,this.callbacks.onRenameGroup&&(o.addEventListener(`dblclick`,()=>this.renameGroup(o,e,t)),s.appendChild(this.iconButton(`penLine`,this.t(`objects.renameGroup`),``,()=>this.renameGroup(o,e,t)))),this.callbacks.onToggleGroupVisible&&s.appendChild(this.iconButton(i?`eye`:`eyeOff`,i?this.t(`common.hide`):this.t(`common.show`),``,()=>this.callbacks.onToggleGroupVisible?.(e,!i))),this.callbacks.onToggleGroupLocked&&s.appendChild(this.iconButton(a?`lock`:`unlock`,a?this.t(`common.unlock`):this.t(`common.lock`),a?`tcw-tree-on`:``,()=>this.callbacks.onToggleGroupLocked?.(e,!a))),this.callbacks.onUngroup&&s.appendChild(this.iconButton(`x`,this.t(`drawingMenu.ungroup`),``,()=>this.callbacks.onUngroup?.(e))),r.appendChild(s),r}renameGroup(e,t,n){if(!e.isConnected)return;let r=document.createElement(`input`);r.type=`text`,r.className=`tcw-tree-rename`,r.value=n,r.maxLength=80,r.setAttribute(`aria-label`,this.t(`objects.renameGroup`));let i=!1,a=a=>{if(i)return;i=!0;let o=r.value.trim();r.isConnected&&r.replaceWith(e),a&&o&&o!==n&&this.callbacks.onRenameGroup?.(t,o)};r.addEventListener(`keydown`,e=>{e.key===`Enter`?a(!0):e.key===`Escape`&&(e.stopPropagation(),a(!1))}),r.addEventListener(`blur`,()=>a(!0)),e.replaceWith(r),r.focus(),r.select()}drawingRow(e){let t=this.row(e.label);(!e.visible||e.offInterval)&&t.classList.add(`tcw-tree-hidden`),e.offInterval&&(t.title=this.t(`indicatorSettings.offInterval`));let n=document.createElement(`div`);if(n.className=`tcw-tree-actions`,n.appendChild(this.iconButton(e.visible?`eye`:`eyeOff`,e.visible?this.t(`common.hide`):this.t(`common.show`),``,()=>this.callbacks.onToggleDrawingVisible(e.id,!e.visible))),n.appendChild(this.iconButton(e.locked?`lock`:`unlock`,e.locked?this.t(`common.unlock`):this.t(`common.lock`),e.locked?`tcw-tree-on`:``,()=>this.callbacks.onToggleDrawingLocked(e.id,!e.locked))),this.callbacks.onConfigureDrawing){let t=this.iconButton(`settings`,this.t(`objects.drawingSettings`),``,()=>this.callbacks.onConfigureDrawing?.(e.id));E(t,`drawingSettings`),n.appendChild(t)}return n.appendChild(this.iconButton(`trash`,this.t(`objects.removeDrawing`),`tcw-tree-del`,()=>this.callbacks.onRemoveDrawing(e.id))),t.appendChild(n),t}renderCompares(e){if(this.compareEl){if(this.compareEl.replaceChildren(),e.length===0){this.compareEl.appendChild(this.emptyRow(this.t(`objects.noComparisons`)));return}for(let t of e){let e=this.row(t.label),n=document.createElement(`span`);n.className=`tcw-tree-dot`,n.style.background=t.color,e.insertBefore(n,e.firstChild),this.callbacks.onRemoveCompare&&e.appendChild(this.iconButton(`trash`,this.t(`objects.removeComparison`),`tcw-tree-del`,()=>this.callbacks.onRemoveCompare?.(t.id))),this.compareEl.appendChild(e)}}}row(e){let t=document.createElement(`div`);t.className=`tcw-tree-row`;let n=document.createElement(`span`);return n.className=`tcw-tree-name`,n.textContent=e,n.title=e,t.appendChild(n),t}emptyRow(e){let t=document.createElement(`div`);return t.className=`tcw-tree-empty`,t.textContent=e,t}iconButton(e,t,n,r){let i=document.createElement(`button`);return i.type=`button`,i.className=`tcw-tree-btn ${n}`.trim(),i.setAttribute(`aria-label`,t),i.title=t,i.innerHTML=D(e,14),i.addEventListener(`click`,r),i}},ta={trendLine:`Trend Line`,ray:`Ray`,extendedLine:`Extended Line`,horizontalLine:`Horizontal Line`,horizontalRay:`Horizontal Ray`,crossLine:`Cross Line`,infoLine:`Info Line`,trendAngle:`Trend Angle`,circle:`Circle`,fibChannel:`Fib Channel`,fibSpeedResistanceFan:`Fib Speed Resistance Fan`,schiffPitchfork:`Schiff Pitchfork`,modifiedSchiffPitchfork:`Modified Schiff Pitchfork`,xabcdPattern:`XABCD Pattern`,abcdPattern:`ABCD Pattern`,headAndShoulders:`Head and Shoulders`,dateAndPriceRange:`Date and Price Range`,cyclicLines:`Cyclic Lines`,priceLabel:`Price Label`,verticalLine:`Vertical Line`,rectangle:`Rectangle`,ellipse:`Ellipse`,triangle:`Triangle`,arrow:`Arrow`,parallelChannel:`Parallel Channel`,regressionChannel:`Regression Channel`,pitchfork:`Pitchfork`,fibRetracement:`Fib Retracement`,fibExtension:`Fib Extension`,fibTimeZones:`Fib Time Zones`,gannBox:`Gann Box`,gannFan:`Gann Fan`,elliottWave:`Elliott Wave`,priceRange:`Price Range`,dateRange:`Date Range`,measure:`Measure`,text:`Text`,textAnnotation:`Text`,anchoredVWAP:`Anchored VWAP`,volumeProfileRange:`Volume Profile`,riskReward:`Long/Short Position`};function na(e,t){let n=`tool.${e}`,r=t?.(n);return r&&r!==n?r:ta[e]??e}var ra=[1,1.5,2,3,4],ia=[`solid`,`dashed`,`dotted`],aa=`#4c8dff`,oa=10,sa={ticks:`toolbar.timeframes.ticks`,seconds:`toolbar.timeframes.seconds`,minutes:`toolbar.timeframes.minutes`,hours:`toolbar.timeframes.hours`,days:`toolbar.timeframes.days`,weeks:`toolbar.timeframes.weeks`,months:`toolbar.timeframes.months`};function ca(e,t,n,r,i){let a=pa();for(let e of[...t.plots].sort((e,t)=>e.color-t.color))a.appendChild(la(e,t,n,r));let o=P(ra.map(e=>({value:String(e),label:`${e} px`})),String(t.lineWidth),e=>n.lineWidth(Number(e)));if(o.dataset.role=`line-width`,a.appendChild(M(r(`indicatorSettings.lineWidth`),o)),t.scale&&n.scale){let e=P([{value:`right`,label:r(`indicatorSettings.scale.right`)},{value:`left`,label:r(`indicatorSettings.scale.left`)}],t.scale,e=>n.scale?.(e===`left`?`left`:`right`));e.dataset.role=`scale`,a.appendChild(M(r(`indicatorSettings.scale`),e))}e.appendChild(a),t.levels&&n.levels&&e.appendChild(ua([...t.levels],n.levels,r,i))}function la(e,t,n,r){let i=t.plotStyles[e.key]??{},a=document.createElement(`div`);a.className=`tcw-settings-row tcw-indi-plot`,a.dataset.plot=e.key;let o=document.createElement(`label`);o.className=`tcw-indi-plot-name`;let s=document.createElement(`input`);s.type=`checkbox`,s.checked=i.visible!==!1,s.addEventListener(`change`,()=>n.plot(e.key,{visible:s.checked}));let c=document.createElement(`span`);c.className=`tcw-settings-label`,c.textContent=e.title,o.append(s,c);let l=document.createElement(`span`);l.className=`tcw-indi-plot-controls`;let u=(e,r)=>{let i=yn(t.colors[e]??t.colors[0]??aa,t=>n.color(e,t));return i.setAttribute(`aria-label`,r),i};if(e.tone!==void 0&&e.downColor!==void 0?l.append(u(e.color,`${e.title} ${r(`indicatorSettings.up`)}`),u(e.downColor,`${e.title} ${r(`indicatorSettings.down`)}`)):l.appendChild(u(e.color,e.title)),(e.kind??`line`)===`line`||e.kind===`step`){let t=P(ia.map(e=>({value:e,label:r(`drawingSettings.lineStyle.${e}`)})),i.lineStyle??`solid`,t=>n.plot(e.key,{lineStyle:t}));t.setAttribute(`aria-label`,`${e.title}: ${r(`drawingSettings.lineStyle`)}`),l.appendChild(t)}return a.append(o,l),a}function ua(e,t,n,r){let i=pa(),a=e,o=()=>{let e=document.createElement(`div`);e.className=`tcw-settings-section-title`,e.textContent=n(`indicatorSettings.tab.levels`);let t=a.map((e,t)=>c(e,t)),r=document.createElement(`button`);r.type=`button`,r.className=`tcw-reset-link tcw-indi-add`,r.textContent=`+ ${n(`indicatorSettings.addLevel`)}`,r.addEventListener(`click`,()=>{let e=a[a.length-1];s([...a,e===void 0?0:e+oa]);let t=i.querySelectorAll(`.tcw-indi-level input`);t[t.length-1]?.focus()}),i.replaceChildren(e,...a.length===0?[ma(n(`indicatorSettings.noLevels`))]:t,r)},s=e=>{a=e,t([...e]),o()},c=(e,o)=>{let c=N(e,{step:`any`},e=>{a=a.map((t,n)=>n===o?e:t),t([...a])});c.id=`tcw-indi-level-${r}-${o}`;let l=document.createElement(`button`);l.type=`button`,l.className=`tcw-indi-remove`,l.innerHTML=D(`x`,12);let u=n(`indicatorSettings.removeLevel`);l.title=u,l.setAttribute(`aria-label`,`${u} ${o+1}`),l.addEventListener(`click`,()=>{s(a.filter((e,t)=>t!==o)),(i.querySelectorAll(`.tcw-indi-remove`)[o]??i.querySelector(`.tcw-indi-add`))?.focus()});let d=document.createElement(`span`);d.className=`tcw-indi-level`,d.append(c,l);let f=document.createElement(`div`);f.className=`tcw-settings-row`;let p=document.createElement(`label`);return p.className=`tcw-settings-label`,p.htmlFor=c.id,p.textContent=`${n(`indicatorSettings.level`)} ${o+1}`,f.append(p,d),f};return o(),i}function da(e,t,n,i){let a=new Map(r.INTERVAL_UNITS.map(e=>{let n=t?.[e],i=Array.isArray(n)?n:[1,r.INTERVAL_LIMITS[e]];return[e,{on:n!==!1,from:i[0],to:i[1]}]})),o=()=>{let e={};for(let[t,{on:n,from:i,to:o}]of a){let[a,s]=[Math.min(i,o),Math.max(i,o)];n?(a>1||s<r.INTERVAL_LIMITS[t])&&(e[t]=[a,s]):e[t]=!1}n(Object.keys(e).length>0?e:null)},s=pa();for(let e of r.INTERVAL_UNITS)s.appendChild(fa(e,a.get(e),o,i));e.appendChild(s)}function fa(e,t,n,i){let a=document.createElement(`div`);a.className=`tcw-settings-row tcw-indi-unit`,a.dataset.unit=e;let o=document.createElement(`label`);o.className=`tcw-indi-plot-name`;let s=document.createElement(`input`);s.type=`checkbox`,s.checked=t.on;let c=document.createElement(`span`);c.className=`tcw-settings-label`,c.textContent=i(sa[e]),o.append(s,c),a.appendChild(o);let l=[];if(e!==`ticks`){let o=(a,o)=>{let s=N(t[a],{min:1,max:r.INTERVAL_LIMITS[e],step:1},e=>{t[a]=Math.round(e),s.value=String(t[a]),n()});return s.setAttribute(`aria-label`,`${i(sa[e])}: ${i(o)}`),s.disabled=!t.on,l.push(s),s},s=document.createElement(`span`);s.className=`tcw-indi-range`;let c=document.createElement(`span`);c.setAttribute(`aria-hidden`,`true`),c.textContent=`–`,s.append(o(`from`,`indicatorSettings.rangeFrom`),c,o(`to`,`indicatorSettings.rangeTo`)),a.appendChild(s)}return s.addEventListener(`change`,()=>{t.on=s.checked;for(let e of l)e.disabled=!s.checked;n()}),a}function pa(){let e=document.createElement(`div`);return e.className=`tcw-settings-section`,e}function ma(e){let t=document.createElement(`div`);return t.className=`tcw-settings-label`,t.textContent=e,t}var ha=1,ga=/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/,_a=1.5,va={visible:!0,lineStyle:`solid`},ya=(e,t)=>JSON.stringify(e)===JSON.stringify(t),ba=e=>JSON.parse(JSON.stringify(e));function xa(e){return e.replace(/_/g,` `).replace(/([a-z0-9])([A-Z])/g,`$1 $2`).replace(/^./,e=>e.toUpperCase())}function Sa(e,t){return Object.fromEntries([...new Set([...Object.keys(e),...Object.keys(t)])].map(e=>[e,{...va,...t[e]}]))}var Ca=class{backdrop;modal;bodyEl;titleEl;tabsEl;defaultsBtn;menu=null;callbacks;target=null;draft={};initial=null;look={colors:[],lineWidth:_a,plots:{},levels:[],intervals:null};tab=`inputs`;tabButtons=[];returnFocus=null;uid=ha++;t;constructor(e,n,r){this.callbacks=n,this.t=r??(e=>t.c[e]),this.backdrop=document.createElement(`div`),this.backdrop.className=`tcw-modal-backdrop`,this.backdrop.hidden=!0;let i=!1;this.backdrop.addEventListener(`pointerdown`,e=>{i=e.target===this.backdrop}),this.backdrop.addEventListener(`click`,e=>{e.target===this.backdrop&&i&&this.finish(!1),i=!1}),this.modal=document.createElement(`div`),this.modal.className=`tcw-modal tcw-modal-narrow tcw-indi`,this.modal.setAttribute(`role`,`dialog`),this.modal.setAttribute(`aria-modal`,`true`),this.modal.setAttribute(`aria-labelledby`,`tcw-indi-title-${this.uid}`),this.modal.tabIndex=-1,this.modal.addEventListener(`keydown`,e=>this.onKeyDown(e));let a=document.createElement(`div`);a.className=`tcw-modal-header`,this.titleEl=document.createElement(`h3`),this.titleEl.id=`tcw-indi-title-${this.uid}`;let o=document.createElement(`button`);o.type=`button`,o.className=`tcw-modal-close`,o.setAttribute(`aria-label`,this.t(`indicatorSettings.close`)),o.innerHTML=D(`x`,16),o.addEventListener(`click`,()=>this.finish(!1)),a.append(this.titleEl,o),this.tabsEl=document.createElement(`div`),this.tabsEl.className=`tcw-modal-tabs`,this.tabsEl.setAttribute(`role`,`tablist`),this.tabsEl.addEventListener(`keydown`,e=>this.onTabKey(e)),this.bodyEl=document.createElement(`div`),this.bodyEl.className=`tcw-modal-body`,this.bodyEl.id=`tcw-indi-panel-${this.uid}`,this.bodyEl.setAttribute(`role`,`tabpanel`),this.defaultsBtn=this.footerButton(`defaults`,`tcw-footer-menu`,()=>this.openDefaults()),this.modal.append(a,this.tabsEl,this.bodyEl,this.buildFooter()),this.backdrop.appendChild(this.modal),e.appendChild(this.backdrop)}buildFooter(){this.defaultsBtn.setAttribute(`aria-haspopup`,`menu`),this.defaultsBtn.setAttribute(`aria-expanded`,`false`),this.defaultsBtn.innerHTML=`<span></span>${D(`chevronDown`,12)}`,this.defaultsBtn.querySelector(`span`).textContent=this.t(`indicatorSettings.defaults`);let e=document.createElement(`div`);e.className=`tcw-footer-end`,e.append(this.footerButton(`cancel`,`tcw-footer-cancel`,()=>this.finish(!1),this.t(`common.cancel`)),this.footerButton(`ok`,`tcw-done-btn`,()=>this.finish(!0),this.t(`drawingSettings.ok`)));let t=document.createElement(`div`);return t.className=`tcw-modal-footer`,t.append(this.defaultsBtn,e),t}open(e){this.target&&this.finish(!0),this.backdrop.hidden&&(this.returnFocus=document.activeElement instanceof HTMLElement?document.activeElement:null),this.target=e,this.titleEl.textContent=this.t(`indicatorSettings.title`).replace(`{name}`,e.name),this.draft={},this.look={colors:[...e.colors??[]],lineWidth:e.lineWidth??_a,plots:Object.fromEntries(Object.entries(e.plotStyles??{}).map(([e,t])=>[e,{...t}])),levels:[...e.levels??[]],scale:e.scale,intervals:e.intervals??null},this.initial={params:this.currentParams(),look:ba(this.look)},this.tab=`inputs`,this.renderTabs(),this.renderBody(),this.backdrop.hidden=!1;let t=this.tabsEl.hidden?null:this.tabButtons[0]??null;(this.bodyEl.querySelector(`button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])`)??t??this.modal).focus()}close(){this.finish(!0)}isOpen(){return!this.backdrop.hidden}destroy(){this.menu?.destroy(),this.backdrop.remove()}finish(e){if(this.target){if(e){let e=document.activeElement;(e instanceof HTMLInputElement||e instanceof HTMLSelectElement)&&this.modal.contains(e)&&e.dispatchEvent(new Event(`change`))}else this.revert();this.target=null,this.menu?.close(),this.backdrop.hidden=!0,this.callbacks.onClose(),this.returnFocus?.isConnected&&this.returnFocus.focus(),this.returnFocus=null}}revert(){let e=this.target,t=this.initial;if(!e||!t)return;let n=e.instanceId;ya(this.currentParams(),t.params)||this.callbacks.onApply(n,{...t.params});let r=t.look,i={};ya(this.look.colors,r.colors)||(i.colors=[...r.colors]),this.look.lineWidth!==r.lineWidth&&(i.lineWidths=[r.lineWidth]),ya(this.look.plots,r.plots)||(i.plots=Sa(this.look.plots,r.plots)),Object.keys(i).length>0&&this.callbacks.onStyle?.(n,i),ya(this.look.levels,r.levels)||this.callbacks.onLevels?.(n,e.ownLevels?[...r.levels]:null),this.look.scale!==r.scale&&r.scale&&this.callbacks.onScale?.(n,r.scale),ya(this.look.intervals,r.intervals)||this.callbacks.onIntervals?.(n,r.intervals)}currentParams(){let e=this.target;return e?{...e.defaults,...e.params,...this.draft}:{}}tabs(){let e=this.target;if(!e)return[];let t=!!(e.plots?.length&&e.colors&&this.callbacks.onStyle),n=!!(e.levels&&this.callbacks.onLevels);return[`inputs`,...t||n?[`style`]:[],...this.callbacks.onIntervals?[`visibility`]:[]]}renderTabs(){let e=this.tabs();this.tabsEl.hidden=e.length<2,this.tabButtons=e.map(e=>{let t=document.createElement(`button`);return t.type=`button`,t.className=`tcw-modal-tab`,t.id=`tcw-indi-tab-${this.uid}-${e}`,t.setAttribute(`role`,`tab`),t.setAttribute(`aria-controls`,this.bodyEl.id),t.dataset.tab=e,t.textContent=this.t(`indicatorSettings.tab.${e}`),t.addEventListener(`click`,()=>this.selectTab(e)),t}),this.tabsEl.replaceChildren(...this.tabButtons),this.markTabs()}markTabs(){for(let e of this.tabButtons){let t=e.dataset.tab===this.tab;e.classList.toggle(`tcw-active`,t),e.setAttribute(`aria-selected`,String(t)),e.tabIndex=t?0:-1,t&&this.bodyEl.setAttribute(`aria-labelledby`,e.id)}}selectTab(e,t=!1){this.tab=e,this.markTabs(),this.renderBody(),t&&this.tabButtons.find(t=>t.dataset.tab===e)?.focus()}onTabKey(e){let t=this.tabButtons.map(e=>e.dataset.tab),n=t.indexOf(this.tab),[r,i]=this.modal.closest(`[dir]`)?.getAttribute(`dir`)===`rtl`?[`ArrowLeft`,`ArrowRight`]:[`ArrowRight`,`ArrowLeft`],a=e.key===r?(n+1)%t.length:e.key===i?(n-1+t.length)%t.length:e.key===`Home`?0:e.key===`End`?t.length-1:-1;a<0||t.length===0||(e.preventDefault(),this.selectTab(t[a],!0))}onKeyDown(e){if(e.key===`Escape`){e.preventDefault(),e.stopPropagation(),this.finish(!1);return}j(e,this.modal)}renderBody(){this.bodyEl.replaceChildren();let e=this.target;e&&(this.tab===`style`?this.renderStyle(e):this.tab===`visibility`?da(this.bodyEl,this.look.intervals,e=>this.setIntervals(e),this.t):this.renderInputs())}currentValue(e){if(e in this.draft)return this.draft[e];let t=this.target?.params[e],n=this.target?.defaults[e];return t??n}setValue(e,t){this.target&&(this.draft[e]=t,this.callbacks.onApply(this.target.instanceId,{...this.draft}))}renderInputs(){let e=document.createElement(`div`);e.className=`tcw-settings-section`;let t=Object.keys(this.target.defaults);t.length===0&&e.appendChild(this.note(this.t(`indicatorSettings.noInputs`)));for(let n of t)e.appendChild(this.fieldRow(n));this.bodyEl.appendChild(e)}fieldRow(e){let t=this.target?.inputs?.[e],n=this.currentValue(e),r=typeof(this.target?.defaults[e]??n),i;if(t?.source)i=this.sourceControl(e,String(n??`close`));else if(t?.options)i=this.choiceControl(e,t.options,n);else if(r===`boolean`)i=vn(!!n,t=>this.setValue(e,t));else if(r===`number`){let r=Number(n);i=N(r,{min:t?.min,max:t?.max,step:t?.step??(Number.isInteger(r)?1:.1)},t=>this.setValue(e,t))}else i=typeof n==`string`&&ga.test(n)?yn(n,t=>this.setValue(e,t)):this.textControl(e,String(n??``));return M(t?.label??xa(e),i)}sourceControl(e,t){let r=document.createElement(`select`);r.className=`tcw-indi-input tcw-indi-select`;let i=document.createElement(`optgroup`);i.label=this.t(`indicatorSettings.source.prices`);for(let e of n.PRICE_SOURCES)i.appendChild(this.option(e,e));r.appendChild(i);let a=this.target?.lineSources??[];if(a.length){let e=document.createElement(`optgroup`);e.label=this.t(`indicatorSettings.source.indicators`);for(let t of a)e.appendChild(this.option(t.value,t.label));r.appendChild(e)}return r.value=t,r.value!==t&&(r.value=`close`),r.addEventListener(`change`,()=>this.setValue(e,r.value)),r}choiceControl(e,t,n){let r=document.createElement(`select`);r.className=`tcw-indi-input tcw-indi-select`;for(let e of t)r.appendChild(this.option(String(e),String(e)));return r.value=String(n),r.addEventListener(`change`,()=>{let n=t.find(e=>String(e)===r.value);n!==void 0&&this.setValue(e,n)}),r}textControl(e,t){let n=document.createElement(`input`);return n.type=`text`,n.className=`tcw-indi-input`,n.value=t,n.addEventListener(`change`,()=>this.setValue(e,n.value)),n}renderStyle(e){let t=e.instanceId,n=()=>this.target===e,r=e=>n()&&this.callbacks.onStyle?.(t,e),i=e=>n()&&this.callbacks.onLevels?.(t,e),a=e=>n()&&this.callbacks.onScale?.(t,e);ca(this.bodyEl,{plots:e.colors&&this.callbacks.onStyle?e.plots??[]:[],colors:this.look.colors,plotStyles:this.look.plots,lineWidth:this.look.lineWidth,scale:e.scale&&this.callbacks.onScale?this.look.scale:void 0,levels:e.levels&&this.callbacks.onLevels?this.look.levels:void 0},{color:(e,t)=>{if(!n())return;let i=[...this.look.colors];for(;i.length<=e;)i.push(i[0]??t);i[e]=t,this.look.colors=i,r({colors:[...i]})},plot:(e,t)=>{n()&&(this.look.plots={...this.look.plots,[e]:{...this.look.plots[e],...t}},r({plots:{[e]:t}}))},lineWidth:e=>{n()&&(this.look.lineWidth=e,r({lineWidths:[e]}))},scale:e=>{n()&&(this.look.scale=e,a(e))},levels:e=>{n()&&(this.look.levels=e,i([...e]))}},this.t,this.uid)}setIntervals(e){this.target&&(this.look.intervals=e,this.callbacks.onIntervals?.(this.target.instanceId,e))}openDefaults(){if(this.menu?.isOpen()){this.menu.close();return}this.menu??=new k(this.modal,this.t(`indicatorSettings.defaults`));let e=this.defaultsBtn.getBoundingClientRect(),t=this.modal.getBoundingClientRect(),n=[{id:`reset`,label:this.t(`indicatorSettings.resetSettings`),icon:`reset`},...this.callbacks.onSaveDefault?[{id:`save`,label:this.t(`indicatorSettings.saveAsDefault`),icon:`save`}]:[]];this.menu.open(n,e.left-t.left,e.top-t.top,e=>{e===`reset`?this.resetAll():this.saveDefault()},this.defaultsBtn)}resetAll(){let e=this.target;if(!e)return;let t=e.instanceId,n={...e.defaults};this.draft={...n},this.callbacks.onApply(t,{...n}),Object.keys(this.look.plots).length>0&&(this.callbacks.onStyle?.(t,{plots:Sa(this.look.plots,{})}),this.look.plots={}),e.levels&&this.callbacks.onLevels&&(this.callbacks.onLevels(t,null),this.look.levels=[...e.defaultLevels??[]]),this.look.intervals&&this.setIntervals(null),this.renderBody()}saveDefault(){let e=this.target;if(!e)return;let t=Object.fromEntries(Object.entries(this.currentParams()).filter(([t,r])=>!ya(r,e.defaults[t])&&!(typeof r==`string`&&(0,n.parseIndicatorSource)(r)))),i={};(0,r.isSeriesPalette)(this.look.colors)||(i.colors=[...this.look.colors]),this.look.lineWidth!==_a&&(i.lineWidths=[this.look.lineWidth]),Object.keys(this.look.plots).length>0&&(i.plots=ba(this.look.plots)),this.callbacks.onSaveDefault?.(e.indicatorId,{params:t,style:i})}footerButton(e,t,n,r){let i=document.createElement(`button`);return i.type=`button`,i.className=t,i.dataset.act=e,r&&(i.textContent=r),i.addEventListener(`click`,n),i}note(e){let t=document.createElement(`div`);return t.className=`tcw-settings-label`,t.textContent=e,t}option(e,t){let n=document.createElement(`option`);return n.value=e,n.textContent=t,n}};function wa(e){return e.normalize(`NFD`).replace(/[̀-ͯ]/g,``).toLowerCase()}var Ta=/[\s/()%-]+/;function Ea(e,t){let n=wa(e.shortName),r=wa(e.name);return n===t||wa(e.id)===t?0:n.startsWith(t)||r.startsWith(t)?1:[...r.split(Ta),...n.split(Ta)].some(e=>e.startsWith(t))?2:r.includes(t)||n.includes(t)?3:null}function Da(e,t){let n=wa(t.trim());return n?e.map(e=>({item:e,rank:Ea(e,n)})).filter(e=>e.rank!==null).sort((e,t)=>e.rank-t.rank||e.item.name.localeCompare(t.item.name)).map(e=>e.item):[]}var Oa=1,ka=(e,t)=>e.name.localeCompare(t.name),Aa=class{backdrop=null;listEl=null;navEl=null;searchEl=null;liveEl=null;content={items:[],favorites:[],templates:[]};favorites=new Set;counts=new Map;view=`all`;lastView=null;query=``;returnFocus=null;uid=Oa++;constructor(e,t,n){this.layer=e,this.callbacks=t,this.t=n}open(e){this.backdrop&&this.close(!1),this.returnFocus=document.activeElement instanceof HTMLElement?document.activeElement:null,this.content=e,this.favorites=new Set(e.favorites),this.counts=e.counts??new Map,this.query=``,this.view=this.startView(),this.build(),this.searchEl?.focus()}close(e=!0){this.backdrop&&(this.backdrop.remove(),this.backdrop=this.listEl=this.navEl=this.searchEl=this.liveEl=null,this.callbacks.onClose?.(),e&&this.returnFocus?.isConnected&&this.returnFocus.focus(),this.returnFocus=null)}isOpen(){return this.backdrop!==null}setTemplates(e){if(this.content={...this.content,templates:[...e]},!this.listEl||this.view!==`templates`||this.query)return;let t=this.listEl.contains(document.activeElement);this.renderList(),t&&!this.listEl.contains(document.activeElement)&&this.listEl.querySelector(`[data-tpl-save]`)?.focus()}setCounts(e){this.counts=e,this.listEl?.querySelectorAll(`.tcw-ip-row[data-ind]`).forEach(e=>this.markCount(e))}destroy(){this.close(!1)}startView(){let e=this.views();return this.lastView&&e.includes(this.lastView)&&!(this.lastView===`favorites`&&this.favorites.size===0)?this.lastView:this.favorites.size>0?`favorites`:`all`}views(){let e=new Set(this.content.items.map(e=>e.category));return[`favorites`,...this.callbacks.templates&&this.content.templates?[`templates`]:[],`all`,...r.INDICATOR_CATEGORIES.filter(t=>e.has(t))]}viewLabel(e){return e===`favorites`?this.t(`indicatorPicker.favorites`):e===`templates`?this.t(`toolbar.indicators.templates`):e===`all`?this.t(`toolbar.indicators.all`):this.t(`indicatorCategory.${e}`)}build(){let e=document.createElement(`div`);e.className=`tcw-modal-backdrop`,e.addEventListener(`click`,t=>{t.target===e&&this.close()});let t=document.createElement(`div`);t.className=`tcw-modal tcw-ip`,t.setAttribute(`role`,`dialog`),t.setAttribute(`aria-modal`,`true`),t.setAttribute(`aria-labelledby`,`tcw-ip-title-${this.uid}`),t.tabIndex=-1,t.addEventListener(`keydown`,e=>this.onKeyDown(e,t));let n=document.createElement(`div`);n.className=`tcw-visually-hidden`,n.setAttribute(`aria-live`,`polite`),t.append(this.buildHeader(),this.buildSearch(),this.buildBody(),n),e.appendChild(t),this.layer().appendChild(e),this.backdrop=e,this.liveEl=n,this.renderNav(),this.renderList()}buildHeader(){let e=document.createElement(`div`);e.className=`tcw-modal-header`;let t=document.createElement(`h3`);t.id=`tcw-ip-title-${this.uid}`,t.textContent=this.t(`toolbar.indicators`);let n=document.createElement(`button`);return n.type=`button`,n.className=`tcw-modal-close`,n.setAttribute(`aria-label`,this.t(`indicatorSettings.close`)),n.innerHTML=D(`x`,16),n.addEventListener(`click`,()=>this.close()),e.append(t,n),e}buildSearch(){let e=document.createElement(`label`);e.className=`tcw-ip-search`;let t=document.createElement(`input`);return t.type=`search`,t.id=`tcw-ip-search-${this.uid}`,t.placeholder=this.t(`indicatorPicker.search`),t.setAttribute(`aria-label`,this.t(`indicatorPicker.search`)),t.autocomplete=`off`,t.spellcheck=!1,t.addEventListener(`input`,()=>{this.query=t.value,this.renderList()}),t.addEventListener(`keydown`,e=>this.onSearchKey(e)),e.innerHTML=D(`search`,16),e.appendChild(t),this.searchEl=t,e}buildBody(){let e=document.createElement(`div`);e.className=`tcw-ip-body`;let t=document.createElement(`div`);t.className=`tcw-ip-nav`,t.setAttribute(`role`,`tablist`),t.setAttribute(`aria-orientation`,`vertical`),t.setAttribute(`aria-label`,this.t(`indicatorPicker.groups`)),t.addEventListener(`keydown`,e=>this.onNavKey(e));let n=document.createElement(`div`);return n.className=`tcw-ip-list`,n.id=`tcw-ip-list-${this.uid}`,n.setAttribute(`role`,`tabpanel`),n.addEventListener(`keydown`,e=>this.onListKey(e)),n.addEventListener(`focusin`,e=>this.rove(e.target)),e.append(t,n),this.navEl=t,this.listEl=n,e}renderNav(){let e=this.navEl;e&&(e.replaceChildren(...this.views().map(e=>{let t=document.createElement(`button`);return t.type=`button`,t.className=`tcw-ip-tab`,t.id=`tcw-ip-tab-${this.uid}-${e}`,t.dataset.view=e,t.setAttribute(`role`,`tab`),t.setAttribute(`aria-controls`,`tcw-ip-list-${this.uid}`),t.innerHTML=`${e===`favorites`?D(`star`,14):e===`templates`?D(`layers`,14):``}<span></span>`,t.querySelector(`span`).textContent=this.viewLabel(e),e===`templates`&&E(t,`indicatorTemplates`),t.addEventListener(`click`,()=>this.select(e)),t})),this.markNav())}markNav(){this.navEl?.querySelectorAll(`.tcw-ip-tab`).forEach(e=>{let t=e.dataset.view===this.view;e.setAttribute(`aria-selected`,String(t)),e.classList.toggle(`tcw-active`,t),e.tabIndex=t?0:-1}),this.labelList()}labelList(){let e=this.query.trim()!==``;this.listEl?.setAttribute(`aria-labelledby`,e?`tcw-ip-search-${this.uid}`:`tcw-ip-tab-${this.uid}-${this.view}`)}select(e,t=!1){this.view=this.lastView=e,this.searchEl&&this.query&&(this.searchEl.value=this.query=``),this.markNav(),this.renderList(),t&&this.navEl?.querySelector(`[data-view="${e}"]`)?.focus()}renderList(){let e=this.listEl;if(!e)return;e.replaceChildren();let n=this.content.items;if(this.navEl?.classList.toggle(`tcw-ip-nav--searching`,this.query.trim()!==``),this.labelList(),this.query.trim()){let r=Da(n,this.query);r.length===0?e.appendChild(this.note(t.r(this.t(`indicatorPicker.noMatch`),{query:this.query.trim()}))):e.append(...r.map(e=>this.row(e)))}else if(this.view===`templates`)this.renderTemplates(e);else if(this.view===`favorites`){let t=n.filter(e=>this.favorites.has(e.id)).sort(ka);t.length===0?e.appendChild(this.note(this.t(`indicatorPicker.noFavorites`))):e.append(...t.map(e=>this.row(e)))}else if(this.view===`all`)for(let t of r.INDICATOR_CATEGORIES){let r=n.filter(e=>e.category===t).sort(ka);if(r.length===0)continue;let i=document.createElement(`div`);i.className=`tcw-ip-heading`,i.textContent=this.viewLabel(t),e.append(i,...r.map(e=>this.row(e)))}else e.append(...n.filter(e=>e.category===this.view).sort(ka).map(e=>this.row(e)));e.querySelector(`.tcw-ip-add`)?.setAttribute(`tabindex`,`0`)}row(e){let t=document.createElement(`div`);t.className=`tcw-ip-row`,t.dataset.ind=e.id;let n=document.createElement(`button`);n.type=`button`,n.className=`tcw-ip-add`,n.dataset.ind=e.id,n.tabIndex=-1;let r=document.createElement(`span`);r.className=`tcw-ip-name`,r.textContent=e.name,n.appendChild(r),e.shortName&&e.shortName!==e.name&&n.appendChild(this.tag(`tcw-ip-short`,e.shortName)),n.appendChild(this.tag(`tcw-ip-kind`,this.t(`indicatorType.${e.placement}`))),n.addEventListener(`click`,()=>this.add(e));let i=document.createElement(`button`);return i.type=`button`,i.className=`tcw-ip-aside tcw-ip-star`,i.tabIndex=-1,i.title=this.t(`indicatorPicker.favorite`),i.setAttribute(`aria-label`,`${this.t(`indicatorPicker.favorite`)}: ${e.name}`),i.setAttribute(`aria-pressed`,String(this.favorites.has(e.id))),i.innerHTML=D(`star`,14),i.addEventListener(`click`,()=>this.toggleFavorite(e.id,i)),t.append(n,i),this.markCount(t),t}renderTemplates(e){let n=document.createElement(`button`);n.type=`button`,n.className=`tcw-ip-add tcw-ip-save`,n.tabIndex=-1,n.dataset.tplSave=``,n.innerHTML=`${D(`save`,14)}<span class="tcw-ip-name"></span>`,n.querySelector(`span`).textContent=this.t(`templates.save`),n.addEventListener(`click`,()=>{this.close(),this.callbacks.templates?.onSave()}),e.appendChild(n);let r=this.content.templates??[];r.length===0&&e.appendChild(this.note(this.t(`indicatorPicker.noTemplates`)));for(let n of r){let r=document.createElement(`div`);r.className=`tcw-ip-row`;let i=document.createElement(`button`);i.type=`button`,i.className=`tcw-ip-add`,i.tabIndex=-1,i.dataset.tplApply=n,i.innerHTML=`${D(`layers`,14)}<span class="tcw-ip-name"></span>`,i.querySelector(`span`).textContent=n,i.addEventListener(`click`,()=>{this.close(),this.callbacks.templates?.onApply(n)});let a=document.createElement(`button`);a.type=`button`,a.className=`tcw-ip-aside tcw-ip-remove`,a.tabIndex=-1,a.dataset.tplDelete=n;let o=t.r(this.t(`templates.delete`),{name:n});a.title=o,a.setAttribute(`aria-label`,o),a.innerHTML=D(`x`,12),a.addEventListener(`click`,()=>this.callbacks.templates?.onDelete(n)),r.append(i,a),e.appendChild(r)}}add(e){if(this.callbacks.onAdd(e.id)===!1||!this.liveEl)return;let n=t.r(this.t(`indicatorPicker.added`),{name:e.name});this.liveEl.textContent=this.liveEl.textContent===n?`${n}\u00a0`:n}toggleFavorite(e,t){let n=!this.favorites.has(e);if(n?this.favorites.add(e):this.favorites.delete(e),this.callbacks.onFavorite(e,n),t.setAttribute(`aria-pressed`,String(n)),this.view!==`favorites`||this.query||n)return;let r=[...this.listEl?.querySelectorAll(`.tcw-ip-star`)??[]].indexOf(t),i=document.activeElement===t;if(this.renderList(),!i)return;let a=[...this.listEl?.querySelectorAll(`.tcw-ip-star`)??[]];(a[r]??a[a.length-1]??this.searchEl)?.focus()}markCount(e){let n=this.counts.get(e.dataset.ind??``)??0,r=e.querySelector(`.tcw-ip-add`),i=e.querySelector(`.tcw-ip-count`);if(n===0){i?.remove();return}i||(i=this.tag(`tcw-ip-count`,``),r?.appendChild(i)),i.textContent=String(n),i.title=t.r(this.t(`indicatorPicker.onChart`),{count:String(n)})}tag(e,t){let n=document.createElement(`span`);return n.className=e,n.textContent=t,n}note(e){let t=document.createElement(`div`);return t.className=`tcw-ip-empty`,t.textContent=e,t}rove(e){!(e instanceof HTMLElement)||!e.classList.contains(`tcw-ip-add`)||(this.listEl?.querySelectorAll(`.tcw-ip-add[tabindex="0"]`).forEach(t=>{t!==e&&(t.tabIndex=-1)}),e.tabIndex=0)}onKeyDown(e,t){if(e.key===`Escape`){e.preventDefault(),e.stopPropagation(),this.close();return}j(e,t)}onSearchKey(e){let t=this.listEl?.querySelector(`.tcw-ip-add`);e.key===`ArrowDown`&&t?(e.preventDefault(),t.focus()):e.key===`Enter`&&this.query.trim()&&t&&(e.preventDefault(),t.click())}onNavKey(e){let t=this.views(),n=t.indexOf(this.view),r=e.key===`ArrowDown`?Math.min(t.length-1,n+1):e.key===`ArrowUp`?Math.max(0,n-1):e.key===`Home`?0:e.key===`End`?t.length-1:-1;r<0||(e.preventDefault(),this.select(t[r],!0))}onListKey(e){let t=e.target,n=t.closest(`.tcw-ip-row, .tcw-ip-save`),r=[...this.listEl?.querySelectorAll(`.tcw-ip-add`)??[]],i=n?.classList.contains(`tcw-ip-save`)?n:n?.querySelector(`.tcw-ip-add`),a=i?r.indexOf(i):-1,o=null;e.key===`ArrowDown`?o=r[a+1]:e.key===`ArrowUp`?o=a>0?r[a-1]:this.searchEl:e.key===`Home`?o=r[0]:e.key===`End`?o=r[r.length-1]:e.key===`ArrowRight`&&t===i?o=n?.querySelector(`.tcw-ip-aside`):e.key===`ArrowLeft`&&t!==i&&(o=i),o&&(e.preventDefault(),o.focus())}};function ja(){try{return typeof localStorage<`u`?localStorage:null}catch{return null}}var Ma=e=>typeof e==`object`&&!!e&&!Array.isArray(e);function Na(e){return Ma(e)?Object.fromEntries(Object.entries(e).filter(([,e])=>typeof e==`number`&&Number.isFinite(e)||typeof e==`string`&&!(0,n.parseIndicatorSource)(e)||typeof e==`boolean`)):{}}function Pa(e){if(!Ma(e))return{};let t={};if(Array.isArray(e.colors)){let n=e.colors.filter(e=>typeof e==`string`&&e.trim()!==``);n.length>0&&(t.colors=n)}if(Array.isArray(e.lineWidths)){let n=e.lineWidths.filter(e=>typeof e==`number`&&Number.isFinite(e)&&e>0);n.length>0&&(t.lineWidths=n)}let r=(0,n.readIndicatorPlotStyles)(e.plots);return r&&(t.plots=r),t}var Fa=class{constructor(e=`tcw:indicator-defaults`,t=ja()){this.key=e,this.storage=t}all(){let e=new Map,t;try{t=JSON.parse(this.storage?.getItem(this.key)??`{}`)}catch{return e}if(!Ma(t))return e;for(let[n,r]of Object.entries(t))Ma(r)&&e.set(n,{params:Na(r.params),style:Pa(r.style)});return e}get(e){return this.all().get(e)??null}save(e,t){if(!this.storage)return!1;let n=Object.fromEntries([...this.all(),[e,{params:Na(t.params),style:Pa(t.style)}]]);try{return this.storage.setItem(this.key,JSON.stringify(n)),!0}catch{return!1}}},Ia=new Set([`timezone`,`numberLocale`,`chartTypeOptions`,`logScale`,`autoScale`]),La=80,Ra={crosshairMode:[`normal`,`magnet`,`hidden`],scaleMode:[`regular`,`logarithmic`,`percentage`,`indexedTo100`],periodLevelsPeriod:[`day`,`week`]},za=e=>typeof e==`object`&&!!e&&!Array.isArray(e);function Ba(e){if(!za(e))return{};let t={};for(let[n,r]of Object.entries(me)){if(Ia.has(n)||!(n in e))continue;let i=e[n];if(typeof i!=typeof r||typeof i==`number`&&!Number.isFinite(i))continue;let a=Ra[n];a&&!a.includes(i)||(t[n]=i)}return t}function Va(e){let{overrides:t}=(0,n.readChartStyleOverrides)(e);return Object.fromEntries(Object.entries(t).filter(([e,t])=>t!==null&&T.includes(e)))}function Ha(){try{return typeof localStorage<`u`?localStorage:null}catch{return null}}var Ua=class{constructor(e=`tcw:chart-templates`,t=Ha()){this.key=e,this.storage=t}list(){let e;try{e=JSON.parse(this.storage?.getItem(this.key)??`[]`)}catch{return[]}if(!Array.isArray(e))return[];let t=[];for(let n of e)!za(n)||typeof n.name!=`string`||!n.name.trim()||t.push({name:n.name.slice(0,La).trim(),settings:Ba(n.settings),style:Va(n.style)});return t.sort((e,t)=>e.name.localeCompare(t.name))}get(e){return this.list().find(t=>t.name===e)??null}save(e,t,n){let r=e.replace(/\s+/g,` `).slice(0,La).trim();if(!r||!this.storage)return!1;let i=[...this.list().filter(e=>e.name!==r),{name:r,settings:Ba(t),style:Va(n)}];try{return this.storage.setItem(this.key,JSON.stringify(i)),!0}catch{return!1}}remove(e){try{this.storage?.setItem(this.key,JSON.stringify(this.list().filter(t=>t.name!==e)))}catch{}}};function Wa(){try{return typeof localStorage<`u`?localStorage:null}catch{return null}}var Ga=80;function Ka(e){let{text:t,...r}=(0,n.sanitizeDrawingStyle)(e);return r}function qa(e){let t={name:e.name,style:{...e.style}};return e.type&&(t.type=e.type),e.options&&(t.options=structuredClone(e.options)),t}var Ja=class{templates=[];constructor(e=`tcw:draw-templates`,t=Wa()){this.storageKey=e,this.storage=t,this.load()}list(e){return this.templates.filter(t=>!t.type||t.type===e).map(qa)}get(e,t){let n=this.templates.find(n=>n.name===e&&n.type===t);return n?qa(n):null}save(e,t,n){let r=e.trim().slice(0,Ga);if(!r)return;let i={name:r,style:Ka(t)};n&&(i.type=n.type,i.options=structuredClone(n.options)),this.templates=this.templates.filter(e=>!(e.name===r&&e.type===i.type)),this.templates.push(i),this.persist()}remove(e,t){this.templates=this.templates.filter(n=>!(n.name===e&&n.type===t)),this.persist()}clear(){this.templates=[],this.persist()}load(){if(this.storage)try{let e=this.storage.getItem(this.storageKey);if(!e)return;let t=JSON.parse(e);if(!Array.isArray(t))return;this.templates=t.filter(e=>e&&typeof e.name==`string`&&e.name.trim()!==``).map(e=>{let t={name:e.name.trim().slice(0,Ga),style:Ka(e.style)};return typeof e.type==`string`&&(t.type=e.type),e.options&&typeof e.options==`object`&&!Array.isArray(e.options)&&(t.options=e.options),t})}catch{}}persist(){if(this.storage)try{this.storage.setItem(this.storageKey,JSON.stringify(this.templates))}catch{}}},Ya=class{defaults={};constructor(e=`tcw:drawing-defaults`,t=Wa()){this.storageKey=e,this.storage=t;try{let e=this.storage?.getItem(this.storageKey),t=e?JSON.parse(e):null;if(t&&typeof t==`object`&&!Array.isArray(t))for(let[e,n]of Object.entries(t))n&&typeof n==`object`&&!Array.isArray(n)&&(this.defaults[e]=n)}catch{}}all(){return structuredClone(this.defaults)}set(e,t){t&&Object.keys(t).length>0?this.defaults[e]=structuredClone(t):delete this.defaults[e];try{this.storage?.setItem(this.storageKey,JSON.stringify(this.defaults))}catch{}}},Xa=[`#4c8dff`,`#1fa874`,`#e8505b`,`#f2a93b`,`#a57cff`,`#1398a8`,`#ffffff`,`#7d8696`],Za=[1,2,3,4],Qa=[`solid`,`dashed`,`dotted`],$a=class{el;templatesEl;nameInput;callbacks;store;open=!1;constructor(e,n,r,i=t.t){this.t=i,this.callbacks=n,this.store=r,this.el=document.createElement(`div`),this.el.className=`tcw-style-panel`,this.el.hidden=!0;let a=document.createElement(`div`);a.className=`tcw-style-header`;let o=document.createElement(`span`);o.textContent=this.t(`drawingStyle.title`);let s=document.createElement(`button`);s.type=`button`,s.className=`tcw-style-close`,s.setAttribute(`aria-label`,this.t(`common.close`)),s.innerHTML=D(`x`,14),s.addEventListener(`click`,()=>this.close()),a.appendChild(o),a.appendChild(s),this.el.appendChild(a),this.el.appendChild(this.colorRow()),this.el.appendChild(this.widthRow()),this.el.appendChild(this.lineStyleRow());let c=document.createElement(`div`);c.className=`tcw-style-subhead`,c.textContent=this.t(`drawingStyle.templates`),this.el.appendChild(c);let l=document.createElement(`div`);l.className=`tcw-style-save`,this.nameInput=document.createElement(`input`),this.nameInput.type=`text`,this.nameInput.placeholder=this.t(`drawingStyle.templateName`),this.nameInput.className=`tcw-style-name`;let u=document.createElement(`button`);u.type=`button`,u.className=`tcw-style-savebtn`,u.innerHTML=`${D(`plus`,13)}<span>${O(this.t(`common.save`))}</span>`,u.addEventListener(`click`,()=>this.saveTemplate()),l.appendChild(this.nameInput),l.appendChild(u),this.el.appendChild(l),this.templatesEl=document.createElement(`div`),this.templatesEl.className=`tcw-style-templates`,this.el.appendChild(this.templatesEl),e.appendChild(this.el),this.renderTemplates()}isOpen(){return this.open}toggle(){this.open?this.close():this.openPanel()}openPanel(){this.open=!0,this.el.hidden=!1,this.syncActiveControls(),this.renderTemplates()}close(){this.open=!1,this.el.hidden=!0}destroy(){this.el.remove()}colorRow(){let e=document.createElement(`div`);e.className=`tcw-style-row tcw-style-colors`;for(let t of Xa){let n=document.createElement(`button`);n.type=`button`,n.className=`tcw-style-swatch`,n.style.background=t,n.dataset.color=t,n.setAttribute(`aria-label`,t),n.addEventListener(`click`,()=>this.applyStyle({color:t})),e.appendChild(n)}let t=document.createElement(`input`);return t.type=`color`,t.className=`tcw-style-picker`,t.addEventListener(`input`,()=>this.applyStyle({color:t.value})),e.appendChild(t),e}widthRow(){let e=document.createElement(`div`);e.className=`tcw-style-row tcw-style-widths`;for(let t of Za){let n=document.createElement(`button`);n.type=`button`,n.className=`tcw-style-width`,n.dataset.width=String(t);let r=document.createElement(`span`);r.style.height=`${t}px`,n.appendChild(r),n.addEventListener(`click`,()=>this.applyStyle({lineWidth:t})),e.appendChild(n)}return e}lineStyleRow(){let e=document.createElement(`div`);e.className=`tcw-style-row tcw-style-dashes`;for(let t of Qa){let n=document.createElement(`button`);n.type=`button`,n.className=`tcw-style-dash`,n.dataset.linestyle=t,n.textContent=t===`solid`?`──`:t===`dashed`?`╌╌`:`┄┄`,n.title=t,n.addEventListener(`click`,()=>this.applyStyle({lineStyle:t})),e.appendChild(n)}return e}applyStyle(e){this.callbacks.onStyleChange(e),this.syncActiveControls()}syncActiveControls(){let e=this.callbacks.getStyle();this.el.querySelectorAll(`.tcw-style-swatch`).forEach(t=>{t.classList.toggle(`tcw-on`,t.dataset.color?.toLowerCase()===e.color?.toLowerCase())}),this.el.querySelectorAll(`.tcw-style-width`).forEach(t=>{t.classList.toggle(`tcw-on`,Number(t.dataset.width)===e.lineWidth)}),this.el.querySelectorAll(`.tcw-style-dash`).forEach(t=>{t.classList.toggle(`tcw-on`,t.dataset.linestyle===e.lineStyle)})}saveTemplate(){let e=this.nameInput.value.trim();e&&(this.store.save(e,this.callbacks.getStyle()),this.nameInput.value=``,this.renderTemplates())}renderTemplates(){this.templatesEl.replaceChildren();let e=this.store.list();if(e.length===0){let e=document.createElement(`div`);e.className=`tcw-style-empty`,e.textContent=this.t(`drawingStyle.noTemplates`),this.templatesEl.appendChild(e);return}for(let t of e){let e=document.createElement(`div`);e.className=`tcw-style-template`;let n=document.createElement(`button`);n.type=`button`,n.className=`tcw-style-apply`;let r=document.createElement(`span`);r.className=`tcw-style-tdot`,r.style.background=t.style.color??`var(--tcw-text-muted)`;let i=document.createElement(`span`);i.textContent=t.name,n.appendChild(r),n.appendChild(i),n.addEventListener(`click`,()=>{this.callbacks.onStyleChange({...t.style}),this.syncActiveControls()});let a=document.createElement(`button`);a.type=`button`,a.className=`tcw-style-tdel`,a.setAttribute(`aria-label`,this.t(`drawingStyle.deleteTemplate`)),a.innerHTML=D(`trash`,13),a.addEventListener(`click`,()=>{this.store.remove(t.name),this.renderTemplates()}),e.appendChild(n),e.appendChild(a),this.templatesEl.appendChild(e)}}},eo=10,G=4,to=4,no=20,ro=/^(#[0-9a-f]{3,8}|(rgb|hsl)a?\([\d\s.,%/+-]+\)|[a-z]+)$/i;function io(e){return typeof e==`string`&&ro.test(e.trim())?e.trim():`#7d8696`}function ao(e){let t=Number(e);return Number.isFinite(t)&&t>0?Math.min(t,no):1}function oo(e){return Qa.includes(e)?e:`solid`}var so=class{el;pop;target=null;built=``;size=null;openPop=null;pinned=null;drag=null;onDragMove=e=>{!this.drag||!this.target||e.pointerId!==this.drag.id||(this.pinned={left:this.drag.left+e.clientX-this.drag.x,top:this.drag.top+e.clientY-this.drag.y},this.place(this.target))};onDragEnd=e=>{e&&this.drag&&e.pointerId!==this.drag.id||(this.drag=null,document.removeEventListener(`pointermove`,this.onDragMove),document.removeEventListener(`pointerup`,this.onDragEnd),document.removeEventListener(`pointercancel`,this.onDragEnd))};onDocDown=e=>{this.openPop&&!this.el.contains(e.target)&&!this.pop.contains(e.target)&&this.closePop()};constructor(e,n,r=t.t){this.host=e,this.callbacks=n,this.t=r,this.el=document.createElement(`div`),this.el.className=`tcw-sel-toolbar`,this.el.setAttribute(`role`,`toolbar`),this.el.setAttribute(`aria-label`,r(`selectionToolbar.label`)),this.el.hidden=!0,this.pop=document.createElement(`div`),this.pop.className=`tcw-sel-pop`,this.pop.setAttribute(`role`,`dialog`),this.pop.hidden=!0,e.append(this.el,this.pop),this.el.addEventListener(`click`,e=>this.onClick(e)),this.el.addEventListener(`keydown`,e=>this.onKey(e)),this.pop.addEventListener(`click`,e=>this.onPick(e)),this.pop.addEventListener(`keydown`,e=>this.onPopKey(e));for(let e of[this.el,this.pop])e.addEventListener(`pointerdown`,e=>e.stopPropagation());this.el.addEventListener(`pointerdown`,e=>{e.target.closest(`.tcw-sel-grip`)&&(e.preventDefault(),this.closePop(),this.drag={id:e.pointerId,x:e.clientX,y:e.clientY,left:parseFloat(this.el.style.left)||0,top:parseFloat(this.el.style.top)||0},document.addEventListener(`pointermove`,this.onDragMove),document.addEventListener(`pointerup`,this.onDragEnd),document.addEventListener(`pointercancel`,this.onDragEnd))}),this.el.addEventListener(`dblclick`,e=>{!e.target.closest(`.tcw-sel-grip`)||!this.target||(this.pinned=null,this.place(this.target))}),document.addEventListener(`pointerdown`,this.onDocDown,!0)}isOpen(){return!this.el.hidden}show(e){this.target=e;let t=e.style,n=[io(t.color),ao(t.lineWidth),oo(t.lineStyle),e.locked,e.canDelete,e.canSettings,e.canAlert].join(`|`);n!==this.built&&(this.built=n,this.render(e),this.size=null),this.el.hidden=!1,this.size||={w:this.el.offsetWidth,h:this.el.offsetHeight},this.place(e),this.openPop&&this.placePop()}hide(){this.closePop(),this.el.hidden=!0,this.target=null}destroy(){this.onDragEnd(),document.removeEventListener(`pointerdown`,this.onDocDown,!0),this.el.remove(),this.pop.remove()}render(e){let t=this.t,n=io(e.style.color),r=ao(e.style.lineWidth),i=oo(e.style.lineStyle),a=e.locked,o=this.el.contains(document.activeElement)?document.activeElement.dataset.action:void 0,s=(e,t,n,r=``)=>`<button type="button" class="tcw-sel-btn${r}" data-action="${e}" aria-label="${O(t)}" title="${O(t)}">${n}</button>`,c=(e,t,n)=>s(e,t,n,` tcw-sel-has-pop`).replace(`<button `,`<button aria-haspopup="dialog" aria-expanded="false" `);this.el.innerHTML=[`<span class="tcw-sel-grip" aria-hidden="true"></span>`,c(`color`,t(`drawingSettings.color`),`<span class="tcw-sel-color" style="background:${O(n)}"></span>`),c(`width`,t(`drawingSettings.lineWidth`),`<span class="tcw-sel-width" style="--w:${r}px"></span><span class="tcw-sel-num">${r}px</span>`),c(`lineStyle`,t(`drawingSettings.lineStyle`),co(i)),`<span class="tcw-sel-sep" aria-hidden="true"></span>`,e.canSettings?s(`settings`,t(`legend.settings`),D(`settings`,15)):``,e.canAlert?s(`alert`,t(`drawingSettings.addAlert`),D(`bell`,15)):``,s(`lock`,t(a?`common.unlock`:`common.lock`),D(a?`lock`:`unlock`,15),a?` tcw-sel-on`:``).replace(`<button `,`<button aria-pressed="${a}" `),s(`more`,t(`legend.more`),D(`more`,15)),e.canDelete?s(`delete`,t(`drawingMenu.delete`),D(`trash`,15),` tcw-sel-danger`):``].join(``);let l=this.buttons(),u=l.find(e=>e.dataset.action===o)??(o?l.find(e=>e.dataset.action===`lock`):void 0);this.rove(u??l[0],u!==void 0)}buttons(){return[...this.el.querySelectorAll(`button`)]}rove(e,t){for(let t of this.buttons())t.tabIndex=t===e?0:-1;t&&e?.focus()}place(e){let{rect:t,bounds:n}=e,{w:r,h:i}=this.size??{w:0,h:0};if(this.pinned){let e=Math.max(n.x+G,Math.min(this.pinned.left,n.x+n.width-r-G)),t=Math.max(n.y+G,Math.min(this.pinned.top,n.y+n.height-i-G));this.el.style.left=`${Math.round(e)}px`,this.el.style.top=`${Math.round(t)}px`;return}let a=t.x+t.width/2-r/2;a=Math.max(n.x+G,Math.min(a,n.x+n.width-r-G));let o=t.y-i-eo;o<n.y+G&&(o=Math.min(t.y+t.height+eo,n.y+n.height-i-G)),o=Math.max(o,n.y+G),this.el.style.left=`${Math.round(a)}px`,this.el.style.top=`${Math.round(o)}px`}onClick(e){let t=e.target.closest(`[data-action]`);if(!t)return;this.rove(t,!1);let n=t.dataset.action;if(n===`color`||n===`width`||n===`lineStyle`){this.openPop===n?this.closePop():this.openPopover(n,t);return}if(this.closePop(),n===`settings`)this.callbacks.onSettings();else if(n===`alert`)this.callbacks.onAlert();else if(n===`lock`)this.callbacks.onLock(!this.target?.locked);else if(n===`delete`)this.callbacks.onDelete();else if(n===`more`){let e=t.getBoundingClientRect(),n=this.host.getBoundingClientRect();this.callbacks.onMore(e.left-n.left,e.bottom-n.top+G)}}onKey(e){if(e.key===`Escape`&&this.openPop){e.stopPropagation(),this.closePop(!0);return}let t=this.buttons(),n=t.indexOf(document.activeElement);if(n<0)return;let r=e.key===`ArrowRight`?(n+1)%t.length:e.key===`ArrowLeft`?(n-1+t.length)%t.length:e.key===`Home`?0:e.key===`End`?t.length-1:-1;r<0||(e.preventDefault(),this.rove(t[r],!0))}openPopover(e,t){let n=this.target.style,r=io(n.color).toLowerCase(),i=ao(n.lineWidth),a=oo(n.lineStyle),o=(e,t,n,r=``)=>`<button type="button" class="${e}${t?` tcw-sel-on`:``}" aria-pressed="${t}" ${n}>${r}</button>`;this.openPop=e,e===`color`?this.pop.innerHTML=Xa.map(e=>o(`tcw-sel-swatch`,e.toLowerCase()===r,`data-color="${e}" style="background:${e}" aria-label="${e}"`)).join(``):e===`width`?this.pop.innerHTML=Za.map(e=>o(`tcw-sel-option`,e===i,`data-width="${e}"`,`<span class="tcw-sel-width" style="--w:${e}px"></span>${e}px`)).join(``):this.pop.innerHTML=Qa.map(e=>o(`tcw-sel-option`,e===a,`data-style="${e}"`,co(e)+O(this.t(`drawingSettings.lineStyle.${e}`)))).join(``),this.pop.className=`tcw-sel-pop tcw-sel-pop--${e}`,this.pop.setAttribute(`aria-label`,t.getAttribute(`aria-label`)??``),this.pop.hidden=!1;for(let e of this.el.querySelectorAll(`[aria-expanded="true"]`))e.setAttribute(`aria-expanded`,`false`);t.setAttribute(`aria-expanded`,`true`),this.placePop(),this.pop.querySelector(`.tcw-sel-on, button`)?.focus()}onPopKey(e){if(e.key===`Escape`){e.stopPropagation(),this.closePop(!0);return}let t=[...this.pop.querySelectorAll(`button`)],n=t.indexOf(document.activeElement);if(n<0)return;let r=this.openPop===`color`?to:1,i=e.key===`ArrowRight`?1:e.key===`ArrowLeft`?-1:e.key===`ArrowDown`?r:e.key===`ArrowUp`?-r:0;i&&(e.preventDefault(),t[(n+i+t.length)%t.length].focus())}placePop(){let e=this.el.querySelector(`[data-action="${this.openPop}"]`);e&&(this.pop.style.left=`${this.el.offsetLeft+e.offsetLeft}px`,this.pop.style.top=`${this.el.offsetTop+this.el.offsetHeight+6}px`)}onPick(e){let t=e.target.closest(`button`);t&&(t.dataset.color?this.callbacks.onStyle({color:t.dataset.color}):t.dataset.width?this.callbacks.onStyle({lineWidth:Number(t.dataset.width)}):t.dataset.style&&this.callbacks.onStyle({lineStyle:oo(t.dataset.style)}),this.closePop(!0))}closePop(e=!1){if(!this.openPop)return;let t=this.el.querySelector(`[data-action="${this.openPop}"]`);t?.setAttribute(`aria-expanded`,`false`),this.openPop=null,this.pop.hidden=!0,e&&t?.focus()}};function co(e){return`<svg class="tcw-sel-line" width="22" height="10" viewBox="0 0 22 10" aria-hidden="true"><line x1="1" y1="5" x2="21" y2="5" stroke="currentColor" stroke-width="2"${e===`dashed`?` stroke-dasharray="4 3"`:e===`dotted`?` stroke-dasharray="1 3" stroke-linecap="round"`:``}/></svg>`}var lo=[1,2,3,4],uo=[`solid`,`dashed`,`dotted`],fo=[10,11,12,14,16,18,20,24,28,32],po=48,mo=.5,ho=.1,go=[`leftEnd`,`rightEnd`];function _o(e,t,n){let r=`drawingOption.${t}`,i=e(r);return i===r?n:i}function vo(){let e=document.createElement(`div`);return e.className=`tcw-settings-section`,e}function yo(e,...t){let n=document.createElement(`div`);n.className=`tcw-settings-row`;let r=document.createElement(`span`);r.className=`tcw-settings-label`,r.textContent=e;let i=document.createElement(`span`);return i.className=`tcw-indi-plot-controls`,i.append(...t),n.append(r,i),n}function K(e,t){return e.setAttribute(`aria-label`,t),e}function bo(e,t,n,r){let i=[],a=vo();a.appendChild(xo(t.style(),n,i,r));let o=go.filter(e=>t.defs[e]?.kind===`choice`);o.length>0&&a.appendChild(yo(r(`drawingSettings.lineEnds`),...o.map(e=>K(P([{value:`normal`,label:r(`drawingSettings.lineEnd.normal`)},{value:`arrow`,label:r(`drawingSettings.lineEnd.arrow`)}],String(t.options()[e]??`normal`),t=>n.options({[e]:t})),_o(r,e,t.defs[e].label))))),t.fill&&a.appendChild(So(t.style(),n,i,r)),e.appendChild(a);let s=Object.entries(t.defs).filter(([e,t])=>t.kind!==`levels`&&!o.includes(e));if(s.length>0){let i=vo();for(let[e,a]of s)i.appendChild(Co(e,a,t.options(),n,r));e.appendChild(i)}for(let[a,o]of Object.entries(t.defs))o.kind===`levels`&&e.appendChild(wo(a,o,t,n,i,r))}function xo(e,t,n,r){let i=K(yn(e.color,e=>{t.style({color:e});for(let t of n)t(e)}),r(`drawingSettings.color`)),a=K(P(lo.map(e=>({value:String(e),label:`${e} px`})),String(e.lineWidth),e=>t.style({lineWidth:Number(e)})),r(`drawingSettings.lineWidth`)),o=K(P(uo.map(e=>({value:e,label:r(`drawingSettings.lineStyle.${e}`)})),e.lineStyle,e=>t.style({lineStyle:e})),r(`drawingSettings.lineStyle`));return yo(r(`drawingSettings.line`),i,a,o)}function So(e,t,n,r){let i=e.fillColor??Sn(e.color,ho),a=F(i),o=xn(i),s=e.fillColor!==void 0,c=()=>{s=!0,t.style({fillColor:Sn(a,o),fillOpacity:o})},l=K(yn(a,e=>{a=e,c()}),r(`drawingSettings.fill`));n.push(e=>{s||(a=F(e),l.value=a)});let u=K(N(Math.round(o*100),{min:0,max:100,step:5},e=>{o=e/100,c()}),r(`drawingSettings.opacity`)),d=document.createElement(`span`);return d.className=`tcw-unit`,d.setAttribute(`aria-hidden`,`true`),d.textContent=`%`,yo(r(`drawingSettings.fill`),l,u,d)}function Co(e,t,n,r,i){let a=_o(i,e,t.label),o=n[e];switch(t.kind){case`boolean`:return _n(a,!!o,t=>r.options({[e]:t}));case`number`:return M(a,N(Number(o),{min:t.min,max:t.max,step:t.step},t=>r.options({[e]:t})));case`choice`:return M(a,P(t.choices.map(t=>({value:t.value,label:_o(i,`${e}.${t.value}`,t.label)})),String(o),t=>r.options({[e]:t})));case`text`:{let t=document.createElement(`input`);return t.type=`text`,t.className=`tcw-indi-input`,t.value=String(o??``),t.addEventListener(`change`,()=>r.options({[e]:t.value})),M(a,t)}}}function wo(e,t,n,r,i,a){let o=document.createElement(`div`);o.className=`tcw-settings-section tcw-levels-editor`;let s=document.createElement(`div`);s.className=`tcw-settings-section-title`,s.textContent=_o(a,e,t.label),o.appendChild(s);let c=()=>{let t=n.options()[e];return Array.isArray(t)?t:[]},l=t=>r.options({[e]:t}),u=document.createElement(`div`);u.className=`tcw-levels-grid`,c().forEach((e,t)=>{let o=document.createElement(`div`);o.className=`tcw-level-row`;let s=` ${t+1}`,d=document.createElement(`input`);d.type=`checkbox`,d.checked=e.visible,d.setAttribute(`aria-label`,a(`drawingSettings.levelVisible`)+s),d.addEventListener(`change`,()=>l(c().map((e,n)=>n===t?{...e,visible:d.checked}:e)));let f=K(N(e.value,{step:.001},e=>l(c().map((n,r)=>r===t?{...n,value:e}:n))),a(`drawingSettings.levelValue`)+s),p=K(yn(e.color??n.style().color,e=>l(c().map((n,r)=>r===t?{...n,color:e}:n))),a(`drawingSettings.levelColor`)+s);i.push(e=>{c()[t]?.color===void 0&&(p.value=F(e))});let m=document.createElement(`button`);m.type=`button`,m.className=`tcw-level-remove`,m.setAttribute(`aria-label`,a(`drawingSettings.removeLevel`)+s),m.innerHTML=D(`x`,12),m.addEventListener(`click`,()=>{l(c().filter((e,n)=>n!==t)),r.redraw([`.tcw-level-row:nth-child(${t+1}) .tcw-level-remove`,`.tcw-level-row:last-child .tcw-level-remove`,`.tcw-level-add`])}),o.append(d,f,p,m),u.appendChild(o)}),o.appendChild(u);let d=document.createElement(`button`);return d.type=`button`,d.className=`tcw-reset-link tcw-level-add`,d.textContent=a(`drawingSettings.addLevel`),d.disabled=c().length>=po,d.addEventListener(`click`,()=>{let e=c().at(-1)?.value??0;l([...c(),{value:Math.round((e+mo)*1e3)/1e3,visible:!0}]),r.redraw([`.tcw-level-row:last-child input[type="number"]`])}),o.appendChild(d),o}function To(e,t,n,r){let i=vo(),a=document.createElement(`textarea`);a.className=`tcw-indi-input tcw-drawing-text`,a.rows=3,a.value=t.text??``,a.addEventListener(`input`,()=>n({text:a.value}));let o=M(r(`drawingSettings.text`),a);o.classList.add(`tcw-text-row`),i.appendChild(o),i.appendChild(M(r(`drawingSettings.fontSize`),P(fo.map(e=>({value:String(e),label:`${e} px`})),String(t.fontSize??12),e=>n({fontSize:Number(e)})))),e.appendChild(i)}function Eo(e,n,r,i){let a=vo();n.forEach((e,n)=>{let o=t.r(i(`drawingSettings.point`),{n:n+1}),s=r.toWallTime(e.time),c=document.createElement(`input`);c.type=`date`,c.className=`tcw-indi-input`,c.value=s.date;let l=document.createElement(`input`);l.type=`time`,l.className=`tcw-indi-input`,l.value=s.time;let u=()=>{let e=r.fromWallTime(c.value,l.value);e!==null&&r.move(n,{time:e})};c.addEventListener(`change`,u),l.addEventListener(`change`,u);let d=yo(o,K(Do(e.price,r,e=>r.move(n,{price:e})),`${o}: ${i(`drawingSettings.price`)}`),K(c,`${o}: ${i(`drawingSettings.date`)}`),K(l,`${o}: ${i(`drawingSettings.time`)}`));d.classList.add(`tcw-draw-point`),a.appendChild(d)}),e.appendChild(a)}function Do(e,t,n){let r=t.roundPrice??(e=>e),i=t.priceStep?.(),a=N(r(e),{step:i!==void 0&&i>0?i:`any`},e=>{let t=r(e);a.value=String(t),n(t)});return a}var Oo=12,ko=`t:`,Ao=1,jo=class{backdrop;modal;titleEl;tabsEl;bodyEl;templateBtn;menu=null;tabButtons=[];target=null;style;options={};anchors=[];intervals=null;tab=`style`;returnFocus=null;uid=Ao++;constructor(e,n,r=t.t){this.callbacks=n,this.t=r,this.backdrop=document.createElement(`div`),this.backdrop.className=`tcw-modal-backdrop`,this.backdrop.hidden=!0;let i=!1;this.backdrop.addEventListener(`pointerdown`,e=>{i=e.target===this.backdrop}),this.backdrop.addEventListener(`click`,e=>{e.target===this.backdrop&&i&&this.close(!0),i=!1}),this.modal=document.createElement(`div`),this.modal.className=`tcw-modal tcw-modal-narrow tcw-drawing-settings`,this.modal.setAttribute(`role`,`dialog`),this.modal.setAttribute(`aria-modal`,`true`),this.modal.setAttribute(`aria-labelledby`,`tcw-draw-title-${this.uid}`),this.modal.tabIndex=-1,this.modal.addEventListener(`keydown`,e=>this.onKeyDown(e));let a=document.createElement(`div`);a.className=`tcw-modal-header`,this.titleEl=document.createElement(`h3`),this.titleEl.id=`tcw-draw-title-${this.uid}`;let o=document.createElement(`button`);o.type=`button`,o.className=`tcw-modal-close`,o.setAttribute(`aria-label`,this.t(`common.close`)),o.innerHTML=D(`x`,16),o.addEventListener(`click`,()=>this.close(!0)),a.append(this.titleEl,o),this.tabsEl=document.createElement(`div`),this.tabsEl.className=`tcw-modal-tabs`,this.tabsEl.setAttribute(`role`,`tablist`),this.tabsEl.addEventListener(`keydown`,e=>this.onTabKey(e)),this.bodyEl=document.createElement(`div`),this.bodyEl.className=`tcw-modal-body`,this.bodyEl.id=`tcw-draw-panel-${this.uid}`,this.bodyEl.setAttribute(`role`,`tabpanel`),this.templateBtn=this.footerButton(`template`,`tcw-footer-menu`,()=>this.openTemplates()),this.modal.append(a,this.tabsEl,this.bodyEl,this.buildFooter()),this.backdrop.appendChild(this.modal),e.appendChild(this.backdrop)}buildFooter(){this.templateBtn.setAttribute(`aria-haspopup`,`menu`),this.templateBtn.setAttribute(`aria-expanded`,`false`),this.templateBtn.innerHTML=`<span></span>${D(`chevronDown`,12)}`,this.templateBtn.querySelector(`span`).textContent=this.t(`settings.template`);let e=document.createElement(`div`);e.className=`tcw-footer-end`,e.append(this.footerButton(`cancel`,`tcw-footer-cancel`,()=>this.close(!0),this.t(`common.cancel`)),this.footerButton(`ok`,`tcw-done-btn`,()=>this.close(!1),this.t(`drawingSettings.ok`)));let t=document.createElement(`div`);return t.className=`tcw-modal-footer`,t.append(this.templateBtn,e),t}open(e){this.target&&this.close(!1),this.returnFocus=document.activeElement instanceof HTMLElement?document.activeElement:null,this.target=e,this.style={...e.style},this.options=structuredClone(e.options),this.anchors=e.anchors.map(e=>({...e})),this.intervals=e.intervals??null,this.titleEl.textContent=e.name,this.tab=`style`,this.callbacks.onBegin(e.id);try{this.renderTabs(),this.renderBody()}catch(t){throw this.target=null,this.callbacks.onEnd(e.id,!0),t}this.backdrop.hidden=!1,(this.tabButtons[0]??this.modal).focus()}close(e){let t=this.target;if(!t)return;let n=document.activeElement;!e&&(n instanceof HTMLInputElement||n instanceof HTMLTextAreaElement)&&this.modal.contains(n)&&n.dispatchEvent(new Event(`change`)),this.target=null,this.menu?.close(),this.backdrop.hidden=!0,this.callbacks.onEnd(t.id,e),this.returnFocus?.isConnected&&this.returnFocus.focus(),this.returnFocus=null}isOpen(){return this.target!==null}editing(){return this.target?.id??null}destroy(){this.close(!0),this.menu?.destroy(),this.backdrop.remove()}tabs(){let e=this.target;return e?[`style`,...e.text?[`text`]:[],...e.anchors.length<=Oo?[`coordinates`]:[],`visibility`]:[]}renderTabs(){this.tabButtons=this.tabs().map(e=>{let t=document.createElement(`button`);return t.type=`button`,t.className=`tcw-modal-tab`,t.id=`tcw-draw-tab-${this.uid}-${e}`,t.setAttribute(`role`,`tab`),t.setAttribute(`aria-controls`,this.bodyEl.id),t.dataset.tab=e,t.textContent=this.t(`drawingSettings.tab.${e}`),t.addEventListener(`click`,()=>this.selectTab(e)),t}),this.tabsEl.replaceChildren(...this.tabButtons),this.markTabs()}markTabs(){for(let e of this.tabButtons){let t=e.dataset.tab===this.tab;e.classList.toggle(`tcw-active`,t),e.setAttribute(`aria-selected`,String(t)),e.tabIndex=t?0:-1,t&&this.bodyEl.setAttribute(`aria-labelledby`,e.id)}}selectTab(e,t=!1){this.tab=e,this.markTabs(),this.renderBody(),t&&this.tabButtons.find(t=>t.dataset.tab===e)?.focus()}onTabKey(e){let t=this.tabButtons.map(e=>e.dataset.tab),n=t.indexOf(this.tab),[r,i]=this.modal.closest(`[dir]`)?.getAttribute(`dir`)===`rtl`?[`ArrowLeft`,`ArrowRight`]:[`ArrowRight`,`ArrowLeft`],a=e.key===r?(n+1)%t.length:e.key===i?(n-1+t.length)%t.length:e.key===`Home`?0:e.key===`End`?t.length-1:-1;a<0||(e.preventDefault(),this.selectTab(t[a],!0))}onKeyDown(e){if(e.key===`Escape`){e.preventDefault(),e.stopPropagation(),this.close(!0);return}j(e,this.modal)}renderBody(){this.bodyEl.replaceChildren();let e=this.target;if(e)switch(this.tab){case`text`:To(this.bodyEl,this.style,e=>this.setStyle(e),this.t);break;case`coordinates`:Eo(this.bodyEl,this.anchors,{toWallTime:this.callbacks.toWallTime,fromWallTime:this.callbacks.fromWallTime,roundPrice:this.callbacks.roundPrice,priceStep:this.callbacks.priceStep,move:(e,t)=>this.setAnchor(e,t)},this.t);break;case`visibility`:da(this.bodyEl,this.intervals,e=>this.setIntervals(e),this.t);break;default:bo(this.bodyEl,{style:()=>this.style,options:()=>this.options,defs:e.defs,fill:e.fill},{style:e=>this.setStyle(e),options:e=>this.setOptions(e),redraw:(e=[])=>{this.renderBody();for(let t of e){let e=this.bodyEl.querySelector(t);if(e){e.focus();break}}}},this.t)}}change(e){this.target&&this.callbacks.onChange(this.target.id,e)}setStyle(e){this.target&&(this.style={...this.style,...e},this.change({style:e}))}setOptions(e){this.target&&(this.options={...this.options,...structuredClone(e)},this.change({options:e}))}setAnchor(e,t){this.target&&(this.anchors=this.anchors.map((n,r)=>r===e?{...n,...t}:n),this.change({anchors:this.anchors.map(e=>({...e}))}))}setIntervals(e){this.target&&(this.intervals=e,this.change({intervals:e}))}openTemplates(){let e=this.target;if(!e)return;if(this.menu?.isOpen()){this.menu.close();return}let n=this.callbacks.templates,r=n?.list(e.type)??[],i=[...r.map((e,n)=>({id:`${ko}${n}`,label:e.name,icon:`layers`,remove:t.r(this.t(`templates.delete`),{name:e.name})})),...r.length>0?[`separator`]:[],...n?[{id:`save`,label:this.t(`settings.saveTemplate`),icon:`save`}]:[],...this.callbacks.onSaveDefault?[{id:`default`,label:this.t(`drawingSettings.saveDefault`),icon:`pin`}]:[],{id:`reset`,label:this.t(`settings.resetToDefaults`),icon:`reset`}],a=e=>r[Number(e.slice(2))];this.menu??=new k(this.modal,this.t(`settings.template`));let o=this.templateBtn.getBoundingClientRect(),s=this.modal.getBoundingClientRect();this.menu.open(i,o.left-s.left,o.top-s.top,t=>{t===`save`?n?.save({type:e.type,style:{...this.style},options:structuredClone(this.options)}):t===`default`?this.callbacks.onSaveDefault?.(e.type,structuredClone(this.options)):t===`reset`?this.resetOptions():t.startsWith(ko)&&this.applyTemplate(a(t))},this.templateBtn,e=>{let t=a(e);t&&n?.remove(t.name,t.type)})}applyTemplate(e){let t=this.target;!e||!t||(Object.keys(e.style).length>0&&this.setStyle(e.style),e.options&&this.setOptions((0,n.sanitizeDrawingOptions)(t.defs,e.options)),this.renderBody())}resetOptions(){let e=this.target;if(!e)return;let t={};for(let[n,r]of Object.entries(e.defs))t[n]=structuredClone(r.default);this.setOptions(t),this.renderBody()}footerButton(e,t,n,r){let i=document.createElement(`button`);return i.type=`button`,i.className=t,i.dataset.act=e,r&&(i.textContent=r),i.addEventListener(`click`,n),i}};function Mo(e,t){let{selected:n}=e,r=n.length===1,i=new Set(n.map(e=>e.groupId)),a=i.size===1&&!i.has(null),o=[];e.canConfigure&&r&&o.push({id:`settings`,label:t(`drawingMenu.settings`),icon:`settings`}),e.canAlert&&r&&o.push({id:`alert`,label:t(`drawingSettings.addAlert`),icon:`bell`}),o.length>0&&o.push(`separator`),r&&o.push({id:`front`,label:t(`drawingMenu.front`)},{id:`forward`,label:t(`drawingMenu.forward`)},{id:`backward`,label:t(`drawingMenu.backward`)},{id:`back`,label:t(`drawingMenu.back`)},`separator`),n.length>1&&!a&&o.push({id:`group`,label:t(`drawingMenu.group`),icon:`layers`}),n.some(e=>e.groupId)&&o.push({id:`ungroup`,label:t(`drawingMenu.ungroup`),icon:`layers`});let s=n.every(e=>e.locked);return o.push(s?{id:`unlock`,label:t(`common.unlock`),icon:`unlock`}:{id:`lock`,label:t(`common.lock`),icon:`lock`},{id:`hide`,label:t(`common.hide`),icon:`eyeOff`}),r&&o.push({id:`duplicate`,label:t(`drawingMenu.duplicate`),icon:`plus`}),s||o.push(`separator`,{id:`delete`,label:t(`drawingMenu.delete`),icon:`trash`,danger:!0}),o}var No=[{id:`regularScale`,mode:`regular`,label:`settings.scale.regular`},{id:`logScale`,mode:`logarithmic`,label:`settings.scale.logarithmic`},{id:`percentScale`,mode:`percentage`,label:`settings.scale.percentage`},{id:`indexedScale`,mode:`indexedTo100`,label:`settings.scale.indexedTo100`}],Po=[{action:`resetView`,keys:`Alt+R`,feature:`hotkeys.resetView`},{action:`invertScale`,keys:`Alt+I`,feature:`hotkeys.invertScale`},{action:`goToDate`,keys:`Alt+G`,feature:`hotkeys.goToDate`}];function Fo(e){return No.find(t=>t.id===e)?.mode}function Io(...e){return e.filter(e=>e.length>0).flatMap((e,t)=>t===0?[...e]:[`separator`,...e])}function Lo(e,t){let n=t.keys[e.id];return n?{...e,shortcut:n}:e}function Ro(e,n){if(e.price===void 0||!Number.isFinite(e.price))return[];let r=e.formatPrice(e.price),i=[];if(e.canAlert&&i.push({id:`alert`,label:t.r(n(`chartMenu.addAlert`),{price:r}),icon:`bell`}),e.canTrade){let a=e.lastPrice===null||e.price<=e.lastPrice;i.push(a?{id:`buyLimit`,label:t.r(n(`chartMenu.buyLimit`),{price:r}),icon:`trendingUp`}:{id:`buyStop`,label:t.r(n(`chartMenu.buyStop`),{price:r}),icon:`trendingUp`},a?{id:`sellStop`,label:t.r(n(`chartMenu.sellStop`),{price:r}),icon:`trendingDown`}:{id:`sellLimit`,label:t.r(n(`chartMenu.sellLimit`),{price:r}),icon:`trendingDown`}),e.canOrderTicket&&i.push({id:`orderTicket`,label:n(`chartMenu.orderTicket`),icon:`receipt`})}return e.canDraw&&i.push({id:`horizontalLine`,label:t.r(n(`chartMenu.horizontalLine`),{price:r}),icon:`minus`}),i}var zo=e=>({id:`settings`,label:e(`chartMenu.settings`),icon:`settings`});function Bo(e,t){let n=[Lo({id:`resetView`,label:t(`chartMenu.resetView`)},e)];e.canPaste&&n.push({id:`paste`,label:t(`chartMenu.paste`)});let r=[];e.hasDrawings&&r.push(e.drawingsHidden?{id:`showDrawings`,label:t(`chartMenu.showDrawings`),icon:`eye`}:{id:`hideDrawings`,label:t(`chartMenu.hideDrawings`),icon:`eyeOff`},{id:`removeDrawings`,label:t(`chartMenu.removeDrawings`),icon:`trash`,danger:!0}),e.hasIndicators&&r.push({id:`removeIndicators`,label:t(`chartMenu.removeIndicators`),icon:`trash`,danger:!0});let i=e.canExport?[{id:`exportData`,label:t(`chartMenu.exportData`),icon:`save`}]:[];return Io(Ro(e,t),n,r,[...i,zo(t)])}function Vo(e,t){let n=[{id:`resetPriceScale`,label:t(`chartMenu.resetPriceScale`)},{id:`autoScale`,label:t(`settings.autoScale`),checked:e.autoScale},Lo({id:`invertScale`,label:t(`chartMenu.invertScale`),checked:e.inverted},e),{id:`leftScale`,label:t(`settings.leftScale`),checked:e.leftScale}],r=No.filter(t=>t.mode!==`logarithmic`||e.canLog).map(n=>({id:n.id,label:t(n.label),radio:!0,checked:e.scaleMode===n.mode})),i=[{id:`indicatorValueLabels`,label:t(`settings.indicatorValues`),checked:e.labels.values}];e.labels.countdown!==void 0&&i.push({id:`barCountdown`,label:t(`settings.barCountdown`),checked:e.labels.countdown});let a=[{id:`highLowLines`,label:t(`settings.highLowLines`),checked:e.lines.highLow},{id:`lastPriceLine`,label:t(`chartMenu.lastPriceLine`),checked:e.lines.lastPrice}];return Io(n,r,[{id:`labels`,label:t(`chartMenu.labels`),submenu:i},{id:`lines`,label:t(`chartMenu.lines`),submenu:a}],Ro({...e,canTrade:!1,canDraw:!1},t),[zo(t)])}function Ho(e,t){let n=[Lo({id:`resetView`,label:t(`chartMenu.resetTimeScale`)},e)];e.canGoToDate&&n.push(Lo({id:`goToDate`,label:t(`chartMenu.goToDate`),icon:`calendar`},e));let r=e.timezone.options.map(t=>({id:`tz:${t.value}`,label:t.label,radio:!0,checked:t.value===e.timezone.current}));return Io(n,r.length>0?[{id:`timezone`,label:t(`settings.timezone`),submenu:r}]:[])}function Uo(e,t){let n=e.pane?[{id:`paneLog`,label:t(`chartMenu.paneLog`),checked:e.pane.log},{id:`paneInvert`,label:t(`chartMenu.paneInvert`),checked:e.pane.invert},{id:`panePercent`,label:t(`chartMenu.panePercent`),checked:e.pane.percent}]:[];return Io([Lo({id:`resetView`,label:t(`chartMenu.resetView`)},e)],n,[zo(t)])}function Wo(e,t,n){switch(e){case`priceAxis`:return Vo(t,n);case`timeAxis`:return Ho(t,n);case`pane`:return Uo(t,n);default:return Bo(t,n)}}var Go=/^[-+−]/;function Ko(e,t,n){let r=e.replace(Go,``);return r===n.replace(Go,``)?r:t>0?`+${r}`:t<0?`-${r}`:r}function qo(e){return e.startsWith(`+`)?`up`:e.startsWith(`-`)?`down`:null}var Jo=[`positions`,`orders`,`history`],Yo=[`order`,`close`,`reverse`,`stopLoss`,`takeProfit`],Xo=[`market`,`limit`,`stop`],Zo=[`gtc`,`day`],Qo=`—`,$o=`{pnl}`,es=3;function ts(e,t,n){return e.includes(t??``)?t:n}function ns(e,t){return e.length===t.length&&e.every((e,n)=>e===t[n])}function rs(e,t){if(t===null)return null;let n=e.quantity-(e.closedQuantity??0),r=e.side===`buy`?1:-1;return{pnl:(t-e.entryPrice)*n*r,pct:e.entryPrice===0?0:(t-e.entryPrice)/e.entryPrice*100*r}}function is(e){let t=document.createElement(`span`);return t.dir=`ltr`,t.textContent=e,t}function as(e){let t=qo(e);return t?`tcw-account-${t}`:``}var os=class{el;tabButtons=new Map;tabLabels=new Map;tabCounts=new Map;totalsEl;content;tab=`positions`;snapshot={positions:[],orders:[],fills:[],price:null};open=!1;live=[];constructor(e,n,r=t.t){this.callbacks=n,this.t=r,this.el=document.createElement(`section`),this.el.className=`tcw-account`,this.el.hidden=!0,this.el.setAttribute(`aria-label`,this.t(`account.title`));let i=document.createElement(`div`);i.className=`tcw-account-head`;let a=document.createElement(`div`);a.className=`tcw-account-tabs`,a.setAttribute(`role`,`tablist`),a.addEventListener(`keydown`,e=>this.onTabKey(e));for(let e of Jo){let t=document.createElement(`button`);t.type=`button`,t.className=`tcw-account-tab`,t.setAttribute(`role`,`tab`),t.id=`tcw-account-tab-${e}`;let n=document.createElement(`span`);n.className=`tcw-account-tab-label`,n.textContent=this.t(`account.${e}`);let r=document.createElement(`span`);r.className=`tcw-account-count`,t.append(n,r),t.addEventListener(`click`,()=>this.selectTab(e)),this.tabButtons.set(e,t),this.tabLabels.set(e,n.textContent),this.tabCounts.set(e,r),a.appendChild(t)}this.totalsEl=document.createElement(`div`),this.totalsEl.className=`tcw-account-totals`;let o=document.createElement(`button`);o.type=`button`,o.className=`tcw-account-new`,E(o,`orderTicket`),o.innerHTML=D(`plus`,13),o.append(this.t(`account.newOrder`)),o.addEventListener(`click`,()=>this.callbacks.onNewOrder());let s=document.createElement(`button`);s.type=`button`,s.className=`tcw-tree-close`,s.setAttribute(`aria-label`,this.t(`account.close`)),s.innerHTML=D(`x`,14),s.addEventListener(`click`,()=>this.closePanel()),i.append(a,this.totalsEl,o,s),this.content=document.createElement(`div`),this.content.className=`tcw-account-body`,this.content.setAttribute(`role`,`tabpanel`),this.el.append(i,this.content),e.appendChild(this.el),this.renderTabs()}isOpen(){return this.open}toggle(){this.open?this.closePanel():this.openPanel()}openPanel(){this.open=!0,this.el.hidden=!1,this.render(),this.callbacks.onToggle?.(!0)}closePanel(){this.open&&(this.open=!1,this.el.hidden=!0,this.callbacks.onToggle?.(!1))}update(e){let t=this.snapshot;if(this.snapshot=e,ns(t.positions,e.positions)&&ns(t.orders,e.orders)&&ns(t.fills,e.fills)&&t.realisedPnl===e.realisedPnl){t.price!==e.price&&(this.renderTotals(),this.open&&this.tab===`positions`&&this.patchPrices());return}this.renderTabs(),this.open&&this.render()}destroy(){this.el.remove()}selectTab(e){this.tab=e,this.renderTabs(),this.render()}onTabKey(e){let t=Jo.indexOf(this.tab),n=e.key===`ArrowRight`?t+1:e.key===`ArrowLeft`?t-1:-2;if(n===-2)return;e.preventDefault();let r=Jo[(n+Jo.length)%Jo.length];this.selectTab(r),this.tabButtons.get(r)?.focus()}renderTabs(){let e={positions:this.snapshot.positions.length,orders:this.snapshot.orders.length,history:this.snapshot.fills.length};for(let[t,n]of this.tabButtons){let r=t===this.tab;this.tabCounts.get(t).textContent=String(e[t]),n.setAttribute(`aria-label`,`${this.tabLabels.get(t)} (${e[t]})`),n.setAttribute(`aria-selected`,String(r)),n.tabIndex=r?0:-1,r&&this.content.setAttribute(`aria-labelledby`,n.id)}this.renderTotals()}renderTotals(){let{positions:e,price:t,fills:n,realisedPnl:r}=this.snapshot,i=[],a=e.reduce((e,n)=>{let r=rs(n,t);return r===null?e:(e??0)+r.pnl},null);a!==null&&i.push(this.total(`account.openPnl`,a)),(n.length>0||r!==void 0&&r!==0)&&i.push(this.total(`account.realised`,r??n.reduce((e,t)=>e+(t.pnl??0),0))),this.totalsEl.replaceChildren(...i)}total(e,t){let n=document.createElement(`span`),r=this.amount(t);n.className=`tcw-account-total ${as(r)}`.trim();let i=this.t(e),a=i.indexOf($o),o=is(r);return a<0?n.append(`${i} `,o):n.append(i.slice(0,a),o,i.slice(a+5)),n}render(){let e=document.activeElement,t=e instanceof HTMLElement&&this.content.contains(e)?e.dataset.focusKey:void 0;this.live=[],this.tab===`positions`?this.renderPositions():this.tab===`orders`?this.renderOrders():this.renderHistory(),t&&[...this.content.querySelectorAll(`[data-focus-key]`)].find(e=>e.dataset.focusKey===t)?.focus()}patchPrices(){let{price:e}=this.snapshot;for(let t of this.live)t.price.textContent=e===null?Qo:this.callbacks.formatPrice(e),this.writePnl(t.pnl,rs(t.position,e))}amount(e){return Ko(this.money(Math.abs(e)),e,this.money(0))}money(e){return this.callbacks.formatAmount?this.callbacks.formatAmount(e):e.toFixed(2)}percent(e){let t=e=>this.callbacks.formatNumber?this.callbacks.formatNumber(e,2):e.toFixed(2);return`${Ko(t(Math.abs(e)),e,t(0))}%`}writePnl(e,t){if(t===null){e.className=``,e.textContent=Qo;return}let n=this.amount(t.pnl);e.className=as(n),e.textContent=`${n} · ${this.percent(t.pct)}`}table(e,t,n){if(t.length===0){let e=document.createElement(`p`);return e.className=`tcw-account-empty`,e.textContent=this.t(n),this.content.replaceChildren(e),null}let r=e.map(e=>e.key?this.t(e.key):``),i=document.createElement(`table`);i.className=`tcw-account-table`,i.setAttribute(`role`,`table`);let a=i.createTHead().insertRow();a.setAttribute(`role`,`row`),e.forEach((e,t)=>{let n=document.createElement(`th`);n.scope=`col`,n.setAttribute(`role`,`columnheader`),n.textContent=r[t],e.num&&(n.className=`tcw-num`),a.appendChild(n)});let o=i.createTBody();for(let n of t){let t=o.insertRow();t.setAttribute(`role`,`row`),n.forEach((n,i)=>{let a=t.insertCell();a.setAttribute(`role`,`cell`),a.dataset.label=r[i],e[i].num&&(a.className=`tcw-num`),typeof n==`string`?a.textContent=n:a.appendChild(n)})}return this.content.replaceChildren(i),i}sideCell(e,t=`position`){let n=document.createElement(`span`);return n.className=`tcw-account-side tcw-account-${e}`,n.textContent=this.sideText(e,t),n}sideText(e,t){return t===`trade`?this.t(e===`buy`?`ticket.buy`:`ticket.sell`):this.t(e===`buy`?`account.long`:`account.short`)}actions(...e){let t=document.createElement(`div`);t.className=`tcw-account-actions`;for(let n of e){let e=document.createElement(`button`);e.type=`button`,e.className=`tcw-tree-btn${n.danger?` tcw-tree-del`:``}`,e.setAttribute(`aria-label`,n.label),e.title=n.label,e.dataset.focusKey=n.key,e.innerHTML=D(n.icon,14),e.addEventListener(`click`,n.run),t.appendChild(e)}return t}price(e){return e===void 0?Qo:this.callbacks.formatPrice(e)}renderPositions(){let{formatPrice:e}=this.callbacks,{price:t}=this.snapshot,n=[],r=this.snapshot.positions.map(r=>{let i=r.quantity-(r.closedQuantity??0),a=is(``);this.writePnl(a,rs(r,t)),n.push(a);let o=`${this.sideText(r.side,`position`)} ${i} @ ${e(r.entryPrice)}`;return[this.sideCell(r.side),String(i),e(r.entryPrice),t===null?Qo:e(t),a,this.price(r.stopLoss),this.price(r.takeProfit),this.actions({icon:`arrowUpDown`,label:`${this.t(`account.reverse`)}: ${o}`,key:`reverse:${r.id}`,run:()=>this.callbacks.onReversePosition(r.id)},{icon:`x`,label:`${this.t(`account.closePosition`)}: ${o}`,key:`close:${r.id}`,run:()=>this.callbacks.onClosePosition(r.id),danger:!0})]}),i=this.table([{key:`account.side`},{key:`account.quantity`,num:!0},{key:`account.entry`,num:!0},{key:`account.price`,num:!0},{key:`account.pnl`,num:!0},{key:`account.stopLoss`,num:!0},{key:`account.takeProfit`,num:!0},{key:null}],r,`account.noPositions`);if(!i)return;let a=[...i.tBodies[0].rows];this.snapshot.positions.forEach((e,t)=>this.live.push({position:e,price:a[t].cells[es],pnl:n[t]}))}renderOrders(){let{formatPrice:e}=this.callbacks,t=this.snapshot.orders.map(t=>{let n=ts(Xo,t.type===`stopLimit`?`stop`:t.type,`limit`),r=`${this.sideText(t.side,`trade`)} ${t.quantity} @ ${e(t.price)}`;return[this.sideCell(t.side,`trade`),this.t(`ticket.type.${n}`),String(t.quantity),e(t.price),this.price(t.stopLoss),this.price(t.takeProfit),t.timeInForce?this.t(`ticket.tif.${ts(Zo,t.timeInForce,`gtc`)}`):Qo,this.actions({icon:`x`,label:`${this.t(`account.cancelOrder`)}: ${r}`,key:`cancel:${t.id}`,run:()=>this.callbacks.onCancelOrder(t.id),danger:!0})]});this.table([{key:`account.side`},{key:`ticket.type`},{key:`account.quantity`,num:!0},{key:`account.price`,num:!0},{key:`account.stopLoss`,num:!0},{key:`account.takeProfit`,num:!0},{key:`ticket.timeInForce`},{key:null}],t,`account.noOrders`)}renderHistory(){let{formatPrice:e,formatTime:t}=this.callbacks,n=[...this.snapshot.fills].reverse().map(n=>{let r=is(``);return n.pnl===void 0?r.textContent=Qo:(r.textContent=this.amount(n.pnl),r.className=as(r.textContent)),[t(n.time),this.sideCell(n.side,`trade`),String(n.quantity),e(n.price),this.t(`account.reason.${ts(Yo,n.reason,`order`)}`),r]});this.table([{key:`account.time`},{key:`account.side`},{key:`account.quantity`,num:!0},{key:`account.price`,num:!0},{key:`account.reason`},{key:`account.pnl`,num:!0}],n,`account.noFills`)}},ss=1e-9;function cs(e,t){return e.type===`market`?t:e.price}function ls(e,t,n={}){let r=[];(!(e.quantity>0)||!Number.isFinite(e.quantity))&&r.push(`quantity`),e.type!==`market`&&(!(e.price>0)||!Number.isFinite(e.price))&&r.push(`price`),e.type===`market`&&!((t??e.price)>0)&&r.push(`market`);let i=e.side===`buy`;if(t!==null&&e.type!==`market`&&e.price>0){let n=e.price<t;e.type===`limit`&&n!==i&&e.price!==t&&r.push(`limitSide`),e.type===`stop`&&n===i&&e.price!==t&&r.push(`stopSide`)}let a=e=>e===null||Number.isFinite(e)&&e>0;a(e.stopLoss)||r.push(`stopLoss`),a(e.takeProfit)||r.push(`takeProfit`);let o=cs(e,t);return o!==null&&o>0&&(e.stopLoss!==null&&a(e.stopLoss)&&(i?e.stopLoss>=o:e.stopLoss<=o)&&r.push(`stopLossSide`),e.takeProfit!==null&&a(e.takeProfit)&&(i?e.takeProfit<=o:e.takeProfit>=o)&&r.push(`takeProfitSide`)),[...r,...us(e,n)]}function us(e,t){let n=[],r=e.type===`market`?null:e.price,i=[r,e.stopLoss,e.takeProfit].filter(e=>e!==null&&Number.isFinite(e)&&e>0),{roundPrice:a,limits:o,lot:s}=t;return a&&i.some(e=>Math.abs(a(e)-e)>ss)&&n.push(`priceStep`),o&&r!==null&&r>0&&(r>o.ceiling+ss||r<o.floor-ss)&&n.push(`priceLimits`),s!==void 0&&s>1&&e.quantity>s&&e.quantity%s!==0&&n.push(`lot`),n}function ds(e,t){let n={side:e.side,type:e.type,price:e.type===`market`?t??e.price:e.price,quantity:e.quantity};return e.type===`stop`&&(n.stopPrice=e.price),e.type!==`market`&&(n.timeInForce=e.timeInForce),e.stopLoss!==null&&(n.stopLoss=e.stopLoss),e.takeProfit!==null&&(n.takeProfit=e.takeProfit),n}function fs(e,t){let n=cs(e,t);if(n===null||e.stopLoss===null||e.takeProfit===null)return null;let r=Math.abs(n-e.stopLoss);return r>0?Math.abs(e.takeProfit-n)/r:null}function ps(e,t,n,r=1){let i=cs(e,t);if(i===null||!(i>0)||!Number.isFinite(n)||!(e.quantity>0))return null;let a=e.side===`buy`?1:-1;return{pct:(n-i)/i*100*a,amount:(n-i)*e.quantity*a*r}}function ms(e,t,n={}){let r=n.multiplier!==void 0&&n.multiplier>0?n.multiplier:1,i=cs(e,t),a=i!==null&&i>0&&e.quantity>0?i*e.quantity*r:null,o=ls(e,t),s=(n,i)=>n===null||o.includes(i)?null:ps(e,t,n,r)?.amount??null,c=s(e.stopLoss,`stopLossSide`),l=s(e.takeProfit,`takeProfitSide`);return{value:a,risk:c,reward:l,ratio:c!==null&&l!==null?fs(e,t):null}}var hs=229,gs=1,_s=2,vs=.999999999,ys=0,bs=class{backdrop;modal;symbolEl;body;summaryEl;problemsEl;submit;draft=null;lastPrice=null;rules={};step=Ss;round=e=>Cs(e,e);typed=new Map;returnFocus=null;uid=++ys;constructor(e,n,r=t.t){this.callbacks=n,this.t=r,this.backdrop=document.createElement(`div`),this.backdrop.className=`tcw-modal-backdrop`,this.backdrop.hidden=!0;let i=!1;this.backdrop.addEventListener(`pointerdown`,e=>{i=e.target===this.backdrop}),this.backdrop.addEventListener(`click`,e=>{e.target===this.backdrop&&i&&this.close(),i=!1}),this.modal=document.createElement(`div`),this.modal.className=`tcw-modal tcw-order-ticket`,this.modal.setAttribute(`role`,`dialog`),this.modal.setAttribute(`aria-modal`,`true`),this.modal.setAttribute(`aria-labelledby`,`tcw-ticket-title-${this.uid}`),this.modal.addEventListener(`keydown`,e=>{if(e.key===`Escape`&&!e.isComposing&&e.keyCode!==hs){e.stopPropagation(),this.close();return}j(e,this.modal)});let a=document.createElement(`div`);a.className=`tcw-modal-header`;let o=document.createElement(`div`);o.className=`tcw-ticket-heading`;let s=document.createElement(`h3`);s.id=`tcw-ticket-title-${this.uid}`,s.textContent=this.t(`ticket.title`),this.symbolEl=document.createElement(`span`),this.symbolEl.className=`tcw-ticket-symbol`,o.append(s,this.symbolEl);let c=document.createElement(`button`);c.type=`button`,c.className=`tcw-modal-close`,c.setAttribute(`aria-label`,this.t(`common.close`)),c.innerHTML=D(`x`,16),c.addEventListener(`click`,()=>this.close()),a.append(o,c),this.body=document.createElement(`div`),this.body.className=`tcw-modal-body tcw-ticket-body`,this.summaryEl=document.createElement(`div`),this.summaryEl.className=`tcw-ticket-summary`,this.problemsEl=document.createElement(`div`),this.problemsEl.className=`tcw-ticket-problems`,this.problemsEl.setAttribute(`aria-live`,`polite`);let l=document.createElement(`div`);l.className=`tcw-modal-footer`;let u=document.createElement(`button`);u.type=`button`,u.className=`tcw-footer-cancel`,u.textContent=this.t(`common.cancel`),u.addEventListener(`click`,()=>this.close()),this.submit=document.createElement(`button`),this.submit.type=`button`,this.submit.className=`tcw-ticket-place`,this.submit.addEventListener(`click`,()=>this.place());let d=document.createElement(`div`);d.className=`tcw-footer-end`,d.append(u,this.submit),l.append(d),this.modal.append(a,this.body,this.summaryEl,this.problemsEl,l),this.backdrop.appendChild(this.modal),e.appendChild(this.backdrop)}open(e){this.returnFocus=document.activeElement instanceof HTMLElement?document.activeElement:null,this.lastPrice=e.lastPrice,this.rules=e.rules??{},this.step=e.step??Ss,this.round=e.round??(e=>Cs(e,e)),this.typed.clear(),this.symbolEl.textContent=e.symbol??``;let t=this.round(e.price??e.lastPrice??0),n=e.side??`buy`,r=`market`;e.price!==void 0&&e.lastPrice!==null&&t!==e.lastPrice&&(r=t<e.lastPrice==(n===`buy`)?`limit`:`stop`),this.draft={side:n,type:r,quantity:this.lot(),price:t,stopLoss:null,takeProfit:null,timeInForce:`gtc`},this.problemsEl.replaceChildren(),this.render(),this.backdrop.hidden=!1,this.body.querySelector(`button[aria-pressed="true"]`)?.focus()}close(){this.backdrop.hidden||(this.backdrop.hidden=!0,this.draft=null,this.returnFocus?.isConnected&&this.returnFocus.focus(),this.returnFocus=null)}isOpen(){return!this.backdrop.hidden}setLastPrice(e){if(!this.draft||e===this.lastPrice)return;this.lastPrice=e;let t=this.body.querySelector(`.tcw-ticket-market`);t&&(t.textContent=this.marketText()),this.check()}destroy(){this.close(),this.backdrop.remove()}lot(){return this.rules.lot!==void 0&&this.rules.lot>1?this.rules.lot:1}quantityStep(e){if(this.rules.lot!==void 0&&this.rules.lot>1)return this.rules.lot;let t=Number.isFinite(e)?(0,n.stepDecimals)(e):0;return t>0?Number((10**-t).toFixed(t)):1}priceStep(e,t){return this.step(t>0?e:e*vs)}writePrice(e){return Number.isFinite(e)?this.step===Ss?String(e):e.toFixed((0,n.stepDecimals)(this.step(e))):``}place(){let e=this.draft;!e||ls(e,this.lastPrice,this.rules).length>0||(this.callbacks.onSubmit(ds(e,this.lastPrice)),this.close())}set(e,t=!1){this.draft&&(this.draft={...this.draft,...e},t?this.render():this.check())}render(){let e=this.draft;if(!e)return;let t=this.focusedField();if(this.modal.dataset.side=e.side,this.body.replaceChildren(this.sideToggle(e.side),this.row(`ticket.type`,this.choices(`type`,[`market`,`limit`,`stop`],e.type,`ticket.type`,e=>this.set({type:e},!0))),this.row(`ticket.quantity`,this.stepped(`quantity`,e.quantity,e=>this.quantityStep(e),()=>this.lot(),String,e=>this.set({quantity:e})))),e.type===`market`){let e=document.createElement(`span`);e.className=`tcw-ticket-market`,e.textContent=this.marketText(),this.body.append(this.row(`ticket.price`,e))}else this.body.append(this.row(`ticket.price`,this.priceField(`price`,e.price,e=>this.set({price:e}))),this.row(`ticket.timeInForce`,this.choices(`timeInForce`,[`gtc`,`day`],e.timeInForce,`ticket.timeInForce`,e=>this.set({timeInForce:e}))));this.body.append(this.optionalPrice(`stopLoss`,e.stopLoss),this.optionalPrice(`takeProfit`,e.takeProfit)),t&&this.body.querySelector(t)?.focus(),this.check()}focusedField(){let e=document.activeElement;if(!(e instanceof HTMLElement)||!this.body.contains(e))return null;let t=e.dataset.ticketField;return t?`[data-ticket-field="${t}"]`:null}row(e,t){let n=document.createElement(`div`);n.className=`tcw-settings-row tcw-ticket-row`;let r=document.createElement(`span`);return r.className=`tcw-settings-label`,r.textContent=this.t(e),n.append(r,t),n}choices(e,t,n,r,i){let a=e===`type`?`ticket.type`:`ticket.tif`,o=xs(e,wn(t.map(e=>({value:e,label:this.t(`${a}.${e}`)})),n,i,this.t(r)));for(let t of o.querySelectorAll(`[role=radio]`))t.dataset.ticketField=`${e}-${t.dataset.value}`;return o}marketText(){let e=this.t(`ticket.type.market`);return this.lastPrice===null?e:`${e} · ${this.callbacks.formatPrice(this.lastPrice)}`}typeFor(e,t){return e.type===`market`||this.lastPrice===null||!(e.price>0)||e.price===this.lastPrice?e.type:e.price<this.lastPrice==(t===`buy`)?`limit`:`stop`}sideToggle(e){let t=document.createElement(`div`);t.className=`tcw-ticket-side`,t.setAttribute(`role`,`group`),t.setAttribute(`aria-label`,`${this.t(`ticket.buy`)} / ${this.t(`ticket.sell`)}`);for(let n of[`buy`,`sell`]){let r=document.createElement(`button`);r.type=`button`,r.className=`tcw-ticket-side-btn tcw-ticket-${n}`,r.textContent=this.t(`ticket.${n}`),r.setAttribute(`aria-pressed`,String(e===n)),r.dataset.ticketField=`side-${n}`,r.addEventListener(`click`,()=>{let e=this.draft;!e||e.side===n||this.set({side:n,type:this.typeFor(e,n)},!0)}),t.appendChild(r)}return t}priceField(e,t,n){return this.stepped(e,t,(e,t)=>this.priceStep(e,t),()=>this.lastPrice??this.draft?.price??0,e=>this.writePrice(e),n)}stepped(e,n,r,i,a,o){let s=xs(e,document.createElement(`input`));s.type=`number`,s.className=`tcw-indi-input`,s.step=`any`,s.min=`0`,s.value=this.typed.get(e)??a(n);let c=this.t(`ticket.${e}`);s.setAttribute(`aria-label`,c),s.addEventListener(`input`,()=>{this.typed.set(e,s.value),o(s.value.trim()===``?NaN:Number(s.value))});let l=En(s,{step:r,fallback:i,format:a,labels:{down:t.r(this.t(`ticket.stepDown`),{field:c}),up:t.r(this.t(`ticket.stepUp`),{field:c})}});return l.down.dataset.ticketField=`${e}-down`,l.up.dataset.ticketField=`${e}-up`,l.element}optionalPrice(e,t){let n=e===`stopLoss`?`ticket.stopLoss`:`ticket.takeProfit`,r=document.createElement(`div`);r.className=`tcw-settings-row tcw-ticket-optional`;let i=vn(t!==null,t=>{this.typed.delete(e),this.set({[e]:t?this.startOf(e):null},!0)});i.setAttribute(`aria-label`,this.t(n)),i.dataset.ticketField=`${e}-switch`;let a=document.createElement(`div`);a.className=`tcw-ticket-optional-name`;let o=document.createElement(`span`);if(o.className=`tcw-settings-label`,o.textContent=this.t(n),a.appendChild(o),r.append(i,a),t!==null){let n=document.createElement(`span`);n.className=`tcw-ticket-away`,n.dataset.for=e,n.dir=`ltr`,a.appendChild(n),r.appendChild(this.priceField(e,t,t=>this.set({[e]:Number.isFinite(t)?t:NaN})))}return r}startOf(e){let t=this.draft;if(!t)return NaN;let n=t.type===`market`?this.lastPrice??t.price:t.price;if(!(n>0))return NaN;let r=e===`stopLoss`?-gs:_s;return this.round(n*(1+(t.side===`buy`?r:-r)/100))}check(){let e=this.draft;if(!e)return;let t=ls(e,this.lastPrice,this.rules),n=t.map(e=>this.problemText(e));n.join(`
7659
+ <span class="tcw-visually-hidden" role="status" aria-live="polite" data-tcw="announce" ${t}></span>
7660
+ `}stepMarkup(){let e=this.labels;if(this.steps.length<=1)return``;let t=this.steps.map(e=>`<option value="${O(e.value)}"${e.value===this.step?` selected`:``}>${O(e.label)}</option>`).join(``);return`<label class="tcw-replay-chip"><span class="tcw-replay-chip-label" dir="${this.dir}">${O(e.step)}</span><select class="tcw-replay-speed tcw-replay-step" data-act="step" dir="ltr">${t}</select></label>`}wireStep(){(this.root?.querySelector(`[data-act="step"]`))?.addEventListener(`change`,e=>{this.step=e.target.value,this.callbacks.onStepChange?.(this.step)})}wireEvents(){let e=this.root;if(!e)return;this.hintText=e.querySelector(`[data-tcw="hint"]`),this.scrubber=e.querySelector(`input[data-act="seek"]`),this.timeLabel=e.querySelector(`[data-tcw="time"]`),this.playBtn=e.querySelector(`button[data-act="play"]`),this.realtimeBtn=e.querySelector(`button[data-act="realtime"]`),this.liveRegion=e.querySelector(`[data-tcw="announce"]`);let t=(t,n)=>e.querySelector(`[data-act="${t}"]`)?.addEventListener(`click`,n);t(`realtime`,()=>this.callbacks.onClose()),t(`random`,()=>this.callbacks.onRandomStart()),t(`stepBack`,()=>this.callbacks.onStepBack()),t(`stepForward`,()=>this.callbacks.onStepForward()),t(`selectBar`,()=>this.callbacks.onSelectBar?.()),t(`cancel`,()=>(this.callbacks.onCancelPick??this.callbacks.onClose)()),t(`play`,()=>this.togglePlay()),this.scrubber?.addEventListener(`input`,()=>this.callbacks.onSeek(Number(this.scrubber.value))),e.querySelector(`[data-act="speed"]`)?.addEventListener(`change`,e=>{let t=Number(e.target.value);this.rate=t,this.callbacks.onSpeedChange(t)}),e.addEventListener(`keydown`,this.onKeydown),this.wireStep()}togglePlay(){this.state===`playing`?this.callbacks.onPause():this.callbacks.onPlay()}onKeydown=e=>{if(e.key!==` `||this.mode!==`replay`||e.defaultPrevented)return;let t=e.target;t!==this.scrubber&&t!==this.root||(e.preventDefault(),e.stopPropagation(),this.playBtn?.disabled||this.togglePlay())};announce(e){this.announceTimer&&clearTimeout(this.announceTimer),this.announceTimer=setTimeout(()=>{this.announceTimer=null,this.liveRegion&&(this.liveRegion.textContent=e)},ti)}syncUi(){let e=this.root;if(e){for(let t of e.querySelectorAll(`[data-mode]`))t.hidden=t.dataset.mode!==this.mode;if(e.dataset.mode=this.mode,e.classList.toggle(`tcw-replay-bar--ended`,this.ended),this.syncPending(e),this.playBtn){let e=this.state===`playing`;this.playBtn.innerHTML=D(e?`pause`:`play`,14),this.playBtn.title=e?this.labels.pause:this.labels.play,this.playBtn.setAttribute(`aria-label`,this.playBtn.title);let t=this.ended&&!e;t&&document.activeElement===this.playBtn&&this.realtimeBtn?.focus(),this.playBtn.disabled=t}}}syncPending(e){for(let t of e.querySelectorAll(`.tcw-replay-group`))this.pending?t.setAttribute(`aria-busy`,`true`):t.removeAttribute(`aria-busy`);this.hintText&&(this.hintText.textContent=this.pending?this.labels.loading:this.labels.selectHint);for(let t of ri){let n=e.querySelector(`[data-act="${t}"]`);n&&(n.disabled=this.pending)}}},ai=class{el;headerEl;nameBtn;menuEl;listEl;rowMap=new Map;entries=new Map;lists=[];activeList=``;active=null;locale;dragging=null;onOutside=e=>{this.headerEl.contains(e.target)||this.closeMenu()};constructor(e,t,n){this.callbacks=t,this.labels=n,this.el=document.createElement(`div`),this.el.className=`tcw-watchlist`,this.el.setAttribute(`aria-label`,n.title),this.headerEl=document.createElement(`div`),this.headerEl.className=`tcw-watchlist-header`,this.nameBtn=document.createElement(`button`),this.nameBtn.type=`button`,this.nameBtn.className=`tcw-watchlist-name`,this.nameBtn.setAttribute(`aria-haspopup`,`menu`),this.nameBtn.setAttribute(`aria-expanded`,`false`),this.nameBtn.title=n.lists,this.nameBtn.addEventListener(`click`,()=>this.menuEl.hidden?this.openMenu():this.closeMenu());let r=document.createElement(`button`);r.type=`button`,r.className=`tcw-watchlist-add`,r.innerHTML=D(`plus`,14),r.title=n.add,r.setAttribute(`aria-label`,n.add),r.hidden=!t.onAdd,r.addEventListener(`click`,()=>t.onAdd?.());let i=document.createElement(`button`);i.type=`button`,i.className=`tcw-watchlist-close`,i.setAttribute(`aria-label`,n.close??n.title),i.innerHTML=D(`x`,14),i.hidden=!t.onClose,i.addEventListener(`click`,()=>t.onClose?.()),this.menuEl=document.createElement(`div`),this.menuEl.className=`tcw-dropdown tcw-watchlist-menu`,this.menuEl.setAttribute(`role`,`menu`),this.menuEl.hidden=!0,this.headerEl.append(this.nameBtn,r,i,this.menuEl),this.el.appendChild(this.headerEl),this.listEl=document.createElement(`div`),this.listEl.className=`tcw-watchlist-list`,this.listEl.setAttribute(`role`,`list`),this.el.appendChild(this.listEl),e.appendChild(this.el)}get element(){return this.el}setLists(e,t){this.lists=e.map(e=>({...e,symbols:[...e.symbols]})),this.activeList=e.some(e=>e.id===t)?t:e[0]?.id??``;let n=this.shownList();this.nameBtn.textContent=n?.name??this.labels.title,this.renderRows(n?.symbols??[]),this.menuEl.hidden||this.renderMenu()}redraw(){for(let e of this.rowMap.keys())this.renderRow(e)}setLocale(e){this.locale=e;for(let e of this.rowMap.keys())this.renderRow(e)}setActive(e){this.active=e;for(let[t,n]of this.rowMap){let r=t===e;n.row.classList.toggle(`tcw-watchlist-active`,r),r?n.row.setAttribute(`aria-current`,`true`):n.row.removeAttribute(`aria-current`)}}setEntry(e,t){let n=this.entries.get(e)??{symbol:e};this.entries.set(e,{...n,...t,symbol:e}),this.renderRow(e)}destroy(){this.closeMenu(),this.el.remove(),this.rowMap.clear(),this.entries.clear()}shownList(){return this.lists.find(e=>e.id===this.activeList)}renderRows(e){for(let t of[...this.rowMap.keys()])e.includes(t)||(this.rowMap.get(t).row.remove(),this.rowMap.delete(t));for(let t of e)this.rowMap.has(t)||this.makeRow(t);if(this.listEl.replaceChildren(...e.map(e=>this.rowMap.get(e).row)),e.length===0){let e=document.createElement(`div`);e.className=`tcw-watchlist-empty`,e.textContent=this.labels.empty,this.listEl.appendChild(e)}this.active&&this.setActive(this.active)}makeRow(e){let n=document.createElement(`div`);n.className=`tcw-watchlist-row`,n.setAttribute(`role`,`listitem`),n.dataset.symbol=e,n.tabIndex=0,n.draggable=!!this.callbacks.onMove;let r=document.createElement(`div`);r.className=`tcw-watchlist-symbol`,r.textContent=oi(e);let i=document.createElement(`canvas`);i.className=`tcw-watchlist-spark`,i.width=64,i.height=22;let a=document.createElement(`div`);a.className=`tcw-watchlist-stats`;let o=document.createElement(`span`);o.className=`tcw-watchlist-price`,o.textContent=`—`;let s=document.createElement(`span`);if(s.className=`tcw-watchlist-change`,a.append(o,s),n.append(r,i,a),this.callbacks.onRemove){let r=document.createElement(`button`);r.type=`button`,r.className=`tcw-watchlist-remove`,r.innerHTML=D(`x`,12),r.tabIndex=-1;let i=t.r(this.labels.remove,{symbol:e});r.title=i,r.setAttribute(`aria-label`,i),r.addEventListener(`click`,t=>{t.stopPropagation(),this.callbacks.onRemove?.(e)}),n.appendChild(r)}n.addEventListener(`click`,()=>this.callbacks.onSelect(e)),n.addEventListener(`keydown`,t=>this.onRowKey(t,e)),n.addEventListener(`dragstart`,t=>{this.dragging=e,t.dataTransfer?.setData(`text/plain`,e),t.dataTransfer&&(t.dataTransfer.effectAllowed=`move`),n.classList.add(`tcw-watchlist-dragging`)}),n.addEventListener(`dragend`,()=>{this.dragging=null,n.classList.remove(`tcw-watchlist-dragging`)}),n.addEventListener(`dragover`,t=>{this.dragging&&this.dragging!==e&&t.preventDefault()}),n.addEventListener(`drop`,t=>{t.preventDefault();let n=this.dragging;if(this.dragging=null,!n||n===e)return;let r=this.shownList()?.symbols??[];this.callbacks.onMove?.(n,r.indexOf(e))}),this.rowMap.set(e,{row:n,priceEl:o,changeEl:s,sparkCanvas:i}),this.renderRow(e)}onRowKey(e,t){let n=this.shownList()?.symbols??[],r=n.indexOf(t);if([`Enter`,` `,`Delete`,`Backspace`,`ArrowDown`,`ArrowUp`].includes(e.key)&&e.stopPropagation(),e.key===`Enter`||e.key===` `)e.preventDefault(),this.callbacks.onSelect(t);else if((e.key===`Delete`||e.key===`Backspace`)&&this.callbacks.onRemove){e.preventDefault();let i=n[r+1]??n[r-1];this.callbacks.onRemove(t),i&&this.rowMap.get(i)?.row.focus()}else if(e.key===`ArrowDown`||e.key===`ArrowUp`){e.preventDefault();let i=r+(e.key===`ArrowDown`?1:-1);if(i<0||i>=n.length)return;e.altKey?(this.callbacks.onMove?.(t,i),this.rowMap.get(t)?.row.focus()):this.rowMap.get(n[i])?.row.focus()}}renderRow(e){let t=this.rowMap.get(e),n=this.entries.get(e);if(!(!t||!n)){if(n.lastPrice!==void 0&&(t.priceEl.textContent=si(n.lastPrice,this.locale)),n.lastPrice!==void 0&&n.refPrice!==void 0&&n.refPrice!==0){let e=n.lastPrice-n.refPrice,r=e/n.refPrice*100,i=e>=0?`+`:`-`,a=Math.abs(r).toLocaleString(this.locale,{minimumFractionDigits:2,maximumFractionDigits:2});t.changeEl.textContent=`${i}${a}%`,t.changeEl.className=`tcw-watchlist-change ${e>=0?`tcw-up`:`tcw-down`}`}else t.changeEl.textContent=``;n.sparkline&&n.sparkline.length>=2&&ci(t.sparkCanvas,n.sparkline,n.refPrice??n.sparkline[0])}}openMenu(){this.renderMenu(),this.menuEl.hidden=!1,this.nameBtn.setAttribute(`aria-expanded`,`true`),document.addEventListener(`mousedown`,this.onOutside)}closeMenu(){this.menuEl.hidden=!0,this.nameBtn.setAttribute(`aria-expanded`,`false`),document.removeEventListener(`mousedown`,this.onOutside)}renderMenu(){let e=(e,t)=>{let n=document.createElement(`button`);return n.type=`button`,n.className=`tcw-dropdown-item`,n.setAttribute(`role`,`menuitem`),n.textContent=e,n.addEventListener(`click`,t),n},n=this.lists.map(t=>{let n=e(``,()=>{this.closeMenu(),this.callbacks.onPickList?.(t.id)});n.dataset.list=t.id,n.classList.toggle(`tcw-active`,t.id===this.activeList);let r=document.createElement(`span`);r.textContent=t.name;let i=document.createElement(`span`);return i.className=`tcw-watchlist-count`,i.textContent=String(t.symbols.length),n.append(r,i),n}),r=document.createElement(`div`);if(r.className=`tcw-dropdown-divider`,n.push(r),this.callbacks.onCreateList){let t=e(this.labels.newList,()=>this.editName(``,e=>this.callbacks.onCreateList?.(e)));t.dataset.action=`new`,n.push(t)}let i=this.shownList();if(i&&this.callbacks.onRenameList){let t=e(this.labels.rename,()=>this.editName(i.name,e=>this.callbacks.onRenameList?.(i.id,e)));t.dataset.action=`rename`,n.push(t)}if(i&&this.callbacks.onDeleteList&&this.lists.length>1){let r=!1,a=e(this.labels.deleteList,()=>{if(!r){r=!0,a.textContent=t.r(this.labels.confirmDelete,{name:i.name}),a.classList.add(`tcw-danger`);return}this.closeMenu(),this.callbacks.onDeleteList?.(i.id)});a.dataset.action=`delete`,n.push(a)}this.menuEl.replaceChildren(...n)}editName(e,t){this.closeMenu();let n=document.createElement(`input`);n.className=`tcw-watchlist-input`,n.type=`text`,n.maxLength=60,n.value=e,n.placeholder=this.labels.listName,n.setAttribute(`aria-label`,this.labels.listName),this.nameBtn.hidden=!0,this.headerEl.insertBefore(n,this.nameBtn);let r=!1,i=i=>{if(r)return;r=!0;let a=n.value.trim();n.remove(),this.nameBtn.hidden=!1,i&&a&&a!==e&&t(a),this.nameBtn.focus()};n.addEventListener(`keydown`,e=>{e.stopPropagation(),e.key===`Enter`?(e.preventDefault(),i(!0)):e.key===`Escape`&&(e.preventDefault(),e.stopPropagation(),i(!1))}),n.addEventListener(`blur`,()=>i(!1)),n.focus()}};function oi(e){for(let t of[`USDT`,`USD`,`BTC`,`ETH`,`EUR`])if(e.length>t.length&&e.endsWith(t))return e.slice(0,-t.length)+`/`+t;return e}function si(e,t){if(e===0)return`0`;let n=Math.abs(e);return n>=1e3?e.toLocaleString(t,{minimumFractionDigits:2,maximumFractionDigits:2}):n>=1?e.toLocaleString(t,{minimumFractionDigits:4,maximumFractionDigits:4}):Number(e.toPrecision(4)).toLocaleString(t,{maximumFractionDigits:10})}function ci(e,t,n){let r=e.getContext(`2d`);if(!r)return;let i=window.devicePixelRatio||1;e.width!==e.clientWidth*i&&(e.width=(e.clientWidth||64)*i,e.height=(e.clientHeight||22)*i);let a=e.width,o=e.height,s=1/0,c=-1/0;for(let e of t)e<s&&(s=e),e>c&&(c=e);let l=Math.max(c-s,1e-9),u=t[t.length-1]>=n?`#1fa874`:`#e8505b`;r.clearRect(0,0,a,o),r.lineWidth=1.4*i,r.strokeStyle=u,r.beginPath();let d=a/(t.length-1);for(let e=0;e<t.length;e++){let n=e*d,i=o-(t[e]-s)/l*(o-4)-2;e===0?r.moveTo(n,i):r.lineTo(n,i)}r.stroke()}var li=50,ui=500,di=60,fi=e=>typeof e==`string`&&e.trim().slice(0,di)||null;function pi(e){let t=[];for(let n of e){let e=Jt(n);if(e&&!t.includes(e)&&t.push(e),t.length===ui)break}return t}function mi(e){if(!e||typeof e!=`object`)return null;let t=e;if(!Array.isArray(t.lists))return null;let n=[];for(let e of t.lists){if(n.length===li)break;if(!e||typeof e!=`object`)continue;let t=e,r=typeof t.id==`string`&&t.id&&t.id.length<=64?t.id:null,i=fi(t.name);!r||!i||n.some(e=>e.id===r)||n.push({id:r,name:i,symbols:Array.isArray(t.symbols)?pi(t.symbols):[]})}return n.length===0?null:{lists:n,active:typeof t.active==`string`&&n.some(e=>e.id===t.active)?t.active:n[0].id}}var hi=e=>({...e,symbols:[...e.symbols]}),gi=class{lists;active;listeners=new Set;storage;storageKey;constructor(e){this.storage=e.storage??null,this.storageKey=e.storageKey??`tcw:watchlists`;let t=this.load(),n=e.lists?mi({lists:e.lists,active:e.activeList}):null,r=t??n??{lists:[{id:`default`,name:fi(e.defaultName)??`Watchlist`,symbols:pi(e.symbols??[])}],active:`default`};this.lists=r.lists,this.active=r.active}getLists(){return this.lists.map(hi)}getActive(){return hi(this.activeList())}setActive(e){e===this.active||!this.lists.some(t=>t.id===e)||(this.active=e,this.changed())}replace(e,t){let n=mi({lists:e,active:t??this.active});n&&(this.lists=n.lists,this.active=n.active,this.changed())}create(e){let t=fi(e);if(!t||this.lists.length>=li)return null;let n=this.lists.length+1;for(;this.lists.some(e=>e.id===`list-${n}`);)n++;let r={id:`list-${n}`,name:t,symbols:[]};return this.lists=[...this.lists,r],this.active=r.id,this.changed(),hi(r)}rename(e,t){let n=fi(t);n&&this.update(e,e=>({...e,name:n}))}remove(e){this.lists.length<=1||!this.lists.some(t=>t.id===e)||(this.lists=this.lists.filter(t=>t.id!==e),this.active===e&&(this.active=this.lists[0].id),this.changed())}add(e,t=this.active){let n=Jt(e),r=this.lists.find(e=>e.id===t);return!n||!r||r.symbols.includes(n)||r.symbols.length>=ui?!1:(this.update(t,e=>({...e,symbols:[...e.symbols,n]})),!0)}removeSymbol(e,t=this.active){this.lists.find(e=>e.id===t)?.symbols.includes(e)&&this.update(t,t=>({...t,symbols:t.symbols.filter(t=>t!==e)}))}move(e,t,n=this.active){let r=this.lists.find(e=>e.id===n);if(!r)return;let i=r.symbols.indexOf(e);if(i<0)return;let a=r.symbols.filter(t=>t!==e),o=Math.max(0,Math.min(Math.round(t),a.length));o!==i&&this.update(n,t=>({...t,symbols:[...a.slice(0,o),e,...a.slice(o)]}))}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}activeList(){return this.lists.find(e=>e.id===this.active)??this.lists[0]}update(e,t){this.lists=this.lists.map(n=>n.id===e?t(n):n),this.changed()}changed(){this.save();for(let e of this.listeners)e()}load(){if(!this.storage)return null;try{let e=this.storage.getItem(this.storageKey);return e?mi(JSON.parse(e)):null}catch{return null}}save(){if(this.storage)try{this.storage.setItem(this.storageKey,JSON.stringify({lists:this.lists,active:this.active}))}catch{}}},_i=class{el;bodyEl;newsEl;shown=!1;constructor(e,n=t.t,r={}){this.t=n,this.callbacks=r,this.el=document.createElement(`div`),this.el.className=`tcw-syminfo`,E(this.el,`symbolInfo`),this.el.setAttribute(`role`,`dialog`),this.el.setAttribute(`aria-label`,n(`symbolInfo.title`)),this.el.hidden=!0;let i=document.createElement(`div`);i.className=`tcw-syminfo-header`;let a=document.createElement(`span`);a.textContent=n(`symbolInfo.title`);let o=document.createElement(`button`);o.type=`button`,o.className=`tcw-syminfo-close`,o.setAttribute(`aria-label`,n(`common.close`)),o.innerHTML=D(`x`,14),o.addEventListener(`click`,()=>this.callbacks.onClose?this.callbacks.onClose():this.close()),i.append(a,o),this.bodyEl=document.createElement(`div`),this.bodyEl.className=`tcw-syminfo-body`,this.newsEl=document.createElement(`div`),this.newsEl.className=`tcw-syminfo-news`,this.newsEl.hidden=!0,this.el.append(i,this.bodyEl,this.newsEl),e.appendChild(this.el)}get element(){return this.el}isOpen(){return this.shown}toggle(){this.shown?this.close():this.open()}open(){this.shown||(this.shown=!0,this.el.hidden=!1,this.callbacks.onToggle?.(!0))}close(){this.shown&&(this.shown=!1,this.el.hidden=!0,this.callbacks.onToggle?.(!1))}render(e){let t=document.createElement(`div`);t.className=`tcw-syminfo-head`,t.append(V(`div`,`tcw-syminfo-symbol`,e.symbol)),e.description&&t.append(V(`div`,`tcw-syminfo-desc`,e.description)),e.meta&&t.append(V(`div`,`tcw-syminfo-meta`,e.meta));let n=document.createElement(`div`);if(n.className=`tcw-syminfo-quote`,e.price&&n.append(V(`span`,`tcw-syminfo-price`,e.price)),e.change){let t=V(`span`,`tcw-syminfo-change`,e.change.text);t.classList.add(e.change.up?`tcw-up`:`tcw-down`),n.append(t)}let r=V(`div`,`tcw-syminfo-status`,e.status.text);r.dataset.state=e.status.state;let i=document.createElement(`dl`);i.className=`tcw-syminfo-stats`;for(let t of e.stats){let e=document.createElement(`div`);e.className=`tcw-syminfo-stat`,e.append(V(`dt`,``,t.label),V(`dd`,``,t.value)),i.append(e)}this.bodyEl.replaceChildren(t,n,r,i)}renderNews(e){if(this.newsEl.hidden=e.kind===`none`,e.kind===`none`){this.newsEl.replaceChildren();return}let t=V(`div`,`tcw-syminfo-news-title`,this.t(`symbolInfo.news`));if(e.kind===`loading`||e.kind===`failed`||e.items.length===0){let t=e.kind===`loading`?`symbolInfo.loading`:e.kind===`failed`?`symbolInfo.newsFailed`:`symbolInfo.noNews`;this.newsEl.replaceChildren(V(`div`,`tcw-syminfo-news-note`,this.t(t)));return}let n=document.createElement(`ul`);n.className=`tcw-syminfo-news-list`;for(let t of e.items){let e=document.createElement(`li`);if(e.className=`tcw-syminfo-news-item`,t.url){let n=document.createElement(`a`);n.href=t.url,n.target=`_blank`,n.rel=`noopener noreferrer`,n.textContent=t.title,e.append(n)}else e.append(V(`span`,``,t.title));t.meta&&e.append(V(`div`,`tcw-syminfo-news-meta`,t.meta)),n.append(e)}this.newsEl.replaceChildren(t,n)}destroy(){this.el.remove()}};function V(e,t,n){let r=document.createElement(e);return t&&(r.className=t),r.textContent=n,r}var vi=10,yi=5*6e4,bi=864e5,xi=2;function Si(e){let{info:r,quote:i,t:a,textLocale:o}=e,s=(0,n.symbolTimeZone)(r),c=wi(e.bars,s),l=e.formatPrice,u=i?.last??c?.close,d=i?.prevClose??c?.prevClose,f=i?.change??(u!==void 0&&d!==void 0?u-d:void 0),p=u!==void 0&&f!==void 0?u-f:void 0,m=i?.changePercent??(f!==void 0&&p?f/p*100:void 0),h=(0,n.marketStatus)(r,e.now),ee=a(h.state===`open`?`symbolInfo.open`:h.state===`closed`?`symbolInfo.closed`:`symbolInfo.always`);if(h.state!==`always`&&h.next!==null){let n=Ti(h.next-e.now,o);ee+=` · ${t.r(a(h.state===`open`?`symbolInfo.closesIn`:`symbolInfo.opensIn`),{when:n})}`}let te=[],g=(e,t)=>{t&&te.push({label:e,value:t})},_=e=>e===void 0?void 0:l(e);g(a(`dataWindow.open`),_(i?.open??c?.open)),g(a(`dataWindow.high`),_(i?.high??c?.high)),g(a(`dataWindow.low`),_(i?.low??c?.low)),g(a(`symbolInfo.prevClose`),_(d));let v=i?.volume??c?.volume;g(a(`dataWindow.volume`),v===void 0?void 0:Di(v,e.numberLocale)),g(a(`symbolInfo.bid`),_(i?.bid)),g(a(`symbolInfo.ask`),_(i?.ask)),g(a(`symbolInfo.tick`),r?.minTick===void 0?void 0:String(r.minTick)),g(a(`symbolInfo.currency`),r?.currency),g(a(`symbolInfo.timezone`),s),g(a(`symbolInfo.hours`),Oi(r,o));let ne=(f??0)>=0?`+`:`-`,y=e.names===void 0?r:e.names;return{symbol:e.symbol,description:y?.description,meta:[y?.exchange,y?.type].filter(Boolean).join(` · `)||void 0,price:u===void 0?void 0:l(u),change:f===void 0?void 0:{text:`${ne}${l(Math.abs(f))}${m===void 0?``:` (${ne}${Ei(Math.abs(m),xi,e.numberLocale)}%)`}`,up:f>=0},status:{state:h.state,text:ee},stats:te}}var Ci=class{request=0;cache=new Map;load(e,t,r,i,a){let o=++this.request;if(!t){r({kind:`none`});return}let s=e=>{let t=Date.now();r({kind:`items`,items:e.map(e=>({title:e.title,url:e.url,meta:[e.source,Ti(e.time-t,i)].filter(Boolean).join(` · `)}))})},c=this.cache.get(e);if(c&&Date.now()-c.at<yi){s(c.items);return}r({kind:`loading`}),Promise.resolve().then(()=>t(e,vi)).then(t=>{if(o!==this.request||a())return;let r=(0,n.readNews)(t,vi);this.cache.set(e,{at:Date.now(),items:r}),s(r)}).catch(()=>{o===this.request&&!a()&&r({kind:`failed`})})}};function wi(e,t){if(e.length===0)return null;let r=t&&(0,n.isValidTimeZone)(t)?t:null,i=(0,n.barTimeUnit)(e),a=e=>{let t=e*i;return Math.floor((t+(r?(0,n.zoneOffsetMinutes)(r,t)*6e4:0))/bi)},o=e[e.length-1],s=a(o.time),c=e.length-1;for(;c>0&&a(e[c-1].time)===s;)c--;let l=-1/0,u=1/0,d=0;for(let t=c;t<e.length;t++)l=Math.max(l,e[t].high),u=Math.min(u,e[t].low),d+=e[t].volume??0;return{open:e[c].open,high:l,low:u,close:o.close,volume:d,prevClose:c>0?e[c-1].close:void 0}}function Ti(e,t){let n=e/6e4,[r,i]=Math.abs(n)<60?[Math.round(n)||Math.sign(n)||1,`minute`]:Math.abs(n)<1440?[Math.round(n/60),`hour`]:[Math.round(n/1440),`day`];try{return new Intl.RelativeTimeFormat(t,{numeric:`auto`}).format(r,i)}catch{return new Intl.RelativeTimeFormat(`en`,{numeric:`auto`}).format(r,i)}}function Ei(e,t,r){try{return(0,n.formatPrice)(e,t,r)}catch{return e.toFixed(t)}}function Di(e,t){try{return new Intl.NumberFormat(t,{notation:`compact`,maximumFractionDigits:2}).format(e)}catch{return String(e)}}function Oi(e,t){let n=e?.sessions??[];if(n.length===0)return;let r;try{let e=new Intl.DateTimeFormat(t,{weekday:`short`,timeZone:`UTC`});r=Array.from({length:7},(t,n)=>e.format(Date.UTC(1970,0,4+n)))}catch{r=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`]}let i=e=>{let t=[...new Set((e??[]).filter(e=>Number.isInteger(e)&&e>=0&&e<=6))].sort((e,t)=>e-t);return t.length===0||t.length===7?``:t.every((e,n)=>n===0||e===t[n-1]+1)&&t.length>2?`${r[t[0]]}–${r[t[t.length-1]]}`:t.map(e=>r[e]).join(`, `)};return n.map(e=>[`⁦${e.start}–${e.end}⁩`,i(e.days)].filter(Boolean).join(` `)).join(`, `)}var ki={KeyT:`trendLine`,KeyH:`horizontalLine`,KeyJ:`horizontalRay`,KeyV:`verticalLine`,KeyC:`crossLine`,KeyF:`fibRetracement`};function Ai(){let e={};for(let[t,n]of Object.entries(ki))e[n]=`Alt+${t.replace(/^Key/,``)}`;return e}var ji=300,Mi=80,Ni=n.PHI**-3,Pi=80,Fi=class{el;holdTimer=null;repeatTimer=null;pressed=!1;keyboardFocus=!1;onMove=e=>{if(e.pointerType!==`touch`&&!(this.holdTimer||this.repeatTimer)){if(!this.nearBottom(e)&&!this.keyboardFocus){this.el.classList.remove(`tcw-nav-shown`),this.stopHold();return}this.el.classList.contains(`tcw-nav-shown`)||this.place(),this.el.classList.add(`tcw-nav-shown`)}};onLeave=()=>{this.el.classList.remove(`tcw-nav-shown`),this.stopHold()};constructor(e,n,r=t.t){this.host=e,this.actions=n,this.el=document.createElement(`div`),this.el.className=`tcw-nav`,E(this.el,`navigation`),this.el.setAttribute(`role`,`toolbar`),this.el.setAttribute(`aria-label`,r(`nav.label`));let i=[[`zoomOut`,`minus`,r(`nav.zoomOut`),`navigation.zoom`],[`zoomIn`,`plus`,r(`nav.zoomIn`),`navigation.zoom`],[`scrollLeft`,`chevronLeft`,r(`nav.scrollLeft`),`navigation.scroll`],[`scrollRight`,`chevronRight`,r(`nav.scrollRight`),`navigation.scroll`],[`reset`,`reset`,r(`nav.reset`),`navigation.reset`]];for(let[e,t,r,a]of i){let i=document.createElement(`button`);if(i.type=`button`,i.className=`tcw-nav-btn`,i.dataset.nav=e,E(i,a),i.title=r,i.setAttribute(`aria-label`,r),i.innerHTML=D(t,16),e===`scrollLeft`||e===`scrollRight`){let t=e===`scrollRight`?1:-1;i.addEventListener(`pointerdown`,e=>{if(e.button===0){e.preventDefault();try{i.setPointerCapture(e.pointerId)}catch{}this.startHold(t)}});for(let e of[`pointerup`,`pointercancel`,`pointerleave`])i.addEventListener(e,()=>this.stopHold());i.addEventListener(`click`,e=>{e.detail===0&&n.scroll(t)})}else i.addEventListener(`click`,()=>{e===`zoomIn`?n.zoomIn():e===`zoomOut`?n.zoomOut():n.reset()});this.el.appendChild(i)}for(let e of[`dblclick`,`contextmenu`,`pointerdown`,`mousedown`])this.el.addEventListener(e,e=>e.stopPropagation());this.el.addEventListener(`pointerdown`,()=>{this.pressed=!0},{capture:!0}),this.el.addEventListener(`pointerup`,()=>{this.pressed=!1},{capture:!0}),this.el.addEventListener(`focusin`,()=>{this.keyboardFocus=!this.pressed,this.pressed=!1,this.place(),this.el.classList.add(`tcw-nav-shown`)}),this.el.addEventListener(`focusout`,e=>{this.el.contains(e.relatedTarget)||(this.keyboardFocus=!1,this.el.classList.remove(`tcw-nav-shown`))}),e.appendChild(this.el),e.addEventListener(`pointermove`,this.onMove),e.addEventListener(`pointerleave`,this.onLeave)}destroy(){this.stopHold(),this.host.removeEventListener(`pointermove`,this.onMove),this.host.removeEventListener(`pointerleave`,this.onLeave),this.el.remove()}nearBottom(e){let t=this.actions.plotRect(),n=this.host.getBoundingClientRect(),r=e.clientX-n.left,i=e.clientY-n.top,a=Math.max(Pi,t.height*Ni);return r>=t.x&&r<=t.x+t.width&&i<=t.y+t.height&&i>=t.y+t.height-a}place(){let e=this.actions.plotRect();this.el.style.left=`${Math.round(e.x+e.width/2)}px`,this.el.style.top=`${Math.round(e.y+e.height)}px`}startHold(e){this.stopHold(),this.actions.scroll(e),this.holdTimer=setTimeout(()=>{this.repeatTimer=setInterval(()=>this.actions.scroll(e),Mi)},ji)}stopHold(){this.holdTimer&&clearTimeout(this.holdTimer),this.repeatTimer&&clearInterval(this.repeatTimer),this.holdTimer=null,this.repeatTimer=null}};function Ii(e,n,r,i=!1){let a=e.label??n(`alerts.source.price`),o=Vi.get(e.condition),s=o?n(o):e.condition;if(Ri.includes(e.condition))return`${a} ${s} ${t.r(n(`alerts.moveSummary`),{percent:e.percent??0,bars:e.bars??0})}`;if(e.target)return`${a} ${s} ${e.targetLabel??e.target}`;let c=e.channel&&e.channel!==`price`,l=Number.isFinite(e.price)?c?Ui(e.price):r(e.price):`—`;return`${(c||e.drawingId)&&e.label?`${e.label} `:i?`${a} `:``}${s} ${l}`}var Li=[{value:`crossing`,key:`alerts.condition.crossing`},{value:`crossingUp`,key:`alerts.condition.crossingUp`},{value:`crossingDown`,key:`alerts.condition.crossingDown`},{value:`greaterThan`,key:`alerts.condition.greaterThan`},{value:`lessThan`,key:`alerts.condition.lessThan`},{value:`movesUp`,key:`alerts.condition.movesUp`},{value:`movesDown`,key:`alerts.condition.movesDown`}],Ri=[`movesUp`,`movesDown`],zi={hour:36e5,day:864e5,week:7*864e5,month:30*864e5},Bi=``,Vi=new Map(Li.map(e=>[e.value,e.key]));function Hi(e){return Math.round(e*1e6)/1e6}function Ui(e){let t=Math.abs(e);return t>=1e3||t>=1?e.toFixed(2):e.toPrecision(4)}var Wi=class{el;listEl;priceInput;conditionSelect;sourceSelect;targetSelect;percentInput;barsInput;levelRow;moveRow;closeCheck;expirySelect;messageInput;emptyEl;callbacks;open=!1;alerts=[];sources;constructor(e,n,i=t.t){this.t=i,this.callbacks=n,this.sources=[{channel:`price`,label:this.t(`alerts.source.price`)}],this.el=document.createElement(`div`),this.el.className=`tcw-alerts-panel`,E(this.el,`alerts`),this.el.hidden=!0;let a=document.createElement(`div`);a.className=`tcw-alerts-header`;let o=document.createElement(`span`);o.textContent=this.t(`alerts.title`);let s=document.createElement(`button`);s.className=`tcw-alerts-close`,s.type=`button`,s.setAttribute(`aria-label`,this.t(`alerts.close`)),s.innerHTML=D(`x`,14),s.addEventListener(`click`,()=>this.callbacks.onClose?this.callbacks.onClose():this.close()),a.appendChild(o),a.appendChild(s),this.el.appendChild(a);let c=document.createElement(`form`);c.className=`tcw-alerts-form`,c.noValidate=!0,this.sourceSelect=document.createElement(`select`),this.sourceSelect.className=`tcw-alerts-source`,this.sourceSelect.setAttribute(`aria-label`,this.t(`alerts.source`)),this.sourceSelect.addEventListener(`change`,()=>{this.renderTargets(),this.prefillPrice()}),this.conditionSelect=document.createElement(`select`),this.conditionSelect.className=`tcw-alerts-condition`,this.conditionSelect.setAttribute(`aria-label`,this.t(`alerts.conditionLabel`));for(let e of Li){let t=document.createElement(`option`);t.value=e.value,t.textContent=this.t(e.key),this.conditionSelect.appendChild(t)}this.conditionSelect.addEventListener(`change`,()=>this.showFields()),this.levelRow=document.createElement(`div`),this.levelRow.className=`tcw-alerts-row-fields`,this.targetSelect=document.createElement(`select`),this.targetSelect.className=`tcw-alerts-target`,this.targetSelect.setAttribute(`aria-label`,this.t(`alerts.compareWith`)),this.targetSelect.addEventListener(`change`,()=>this.showFields()),this.priceInput=document.createElement(`input`),this.priceInput.type=`number`,this.priceInput.step=`any`,this.priceInput.placeholder=this.t(`alerts.value`),this.priceInput.setAttribute(`aria-label`,this.t(`alerts.value`)),this.priceInput.className=`tcw-alerts-price`,this.levelRow.append(this.targetSelect,this.priceInput),this.moveRow=document.createElement(`div`),this.moveRow.className=`tcw-alerts-row-fields`,this.percentInput=this.numberField(`tcw-alerts-percent`,this.t(`alerts.percent`),`1`,`0.01`),this.barsInput=this.numberField(`tcw-alerts-bars`,this.t(`alerts.bars`),`10`,`1`),this.barsInput.min=String(r.MIN_ALERT_BARS),this.barsInput.max=String(r.MAX_ALERT_BARS),this.moveRow.append(this.percentInput,this.barsInput);let l=document.createElement(`div`);l.className=`tcw-alerts-row-fields tcw-alerts-options`;let u=document.createElement(`label`);u.className=`tcw-alerts-check`,this.closeCheck=document.createElement(`input`),this.closeCheck.type=`checkbox`,u.append(this.closeCheck,document.createTextNode(this.t(`alerts.onBarClose`))),this.expirySelect=document.createElement(`select`),this.expirySelect.className=`tcw-alerts-expiry`,this.expirySelect.setAttribute(`aria-label`,this.t(`alerts.expires`));for(let e of[`never`,`hour`,`day`,`week`,`month`]){let t=document.createElement(`option`);t.value=e,t.textContent=this.t(`alerts.expires.${e}`),this.expirySelect.appendChild(t)}l.append(u,this.expirySelect),this.messageInput=document.createElement(`input`),this.messageInput.type=`text`,this.messageInput.placeholder=this.t(`alerts.note`),this.messageInput.setAttribute(`aria-label`,this.t(`alerts.note`)),this.messageInput.className=`tcw-alerts-message`;let d=document.createElement(`button`);d.type=`submit`,d.className=`tcw-alerts-add`,d.innerHTML=`${D(`plus`,14)}<span>${O(this.t(`alerts.add`))}</span>`,c.append(this.sourceSelect,this.conditionSelect,this.levelRow,this.moveRow,l,this.messageInput,d),c.addEventListener(`submit`,e=>{e.preventDefault(),this.submitForm()}),this.el.appendChild(c),this.listEl=document.createElement(`div`),this.listEl.className=`tcw-alerts-list`,this.el.appendChild(this.listEl),this.emptyEl=document.createElement(`div`),this.emptyEl.className=`tcw-alerts-empty`,this.emptyEl.textContent=this.t(`alerts.empty`),this.listEl.appendChild(this.emptyEl),this.renderSources(),this.showFields(),e.appendChild(this.el)}numberField(e,t,n,r){let i=document.createElement(`input`);return i.type=`number`,i.step=r,i.min=`0`,i.value=n,i.className=e,i.placeholder=t,i.setAttribute(`aria-label`,t),i}showFields(){let e=Ri.includes(this.conditionSelect.value);this.moveRow.hidden=!e,this.levelRow.hidden=e,this.priceInput.hidden=this.targetSelect.value!==Bi}renderTargets(){let e=this.targetSelect.value,t=this.sourceSelect.value||`price`;this.targetSelect.replaceChildren();let n=document.createElement(`option`);n.value=Bi,n.textContent=this.t(`alerts.compare.value`),this.targetSelect.appendChild(n);for(let e of this.sources){if(e.channel===t)continue;let n=document.createElement(`option`);n.value=e.channel,n.textContent=e.label,this.targetSelect.appendChild(n)}this.targetSelect.value=[...this.targetSelect.options].some(t=>t.value===e)?e:Bi,this.showFields()}setSources(e){this.sources=e.length>0?e:[{channel:`price`,label:this.t(`alerts.source.price`)}],this.renderSources()}renderSources(){let e=this.sourceSelect.value||`price`;this.sourceSelect.replaceChildren();for(let e of this.sources){let t=document.createElement(`option`);t.value=e.channel,t.textContent=e.label,this.sourceSelect.appendChild(t)}this.sourceSelect.value=this.sources.some(t=>t.channel===e)?e:`price`,this.renderTargets()}get element(){return this.el}isOpen(){return this.open}toggle(){this.open?this.close():this.openPanel()}openPanel(){this.open=!0,this.el.hidden=!1,this.priceInput.value===``&&this.prefillPrice()}prefillPrice(){let e=this.callbacks.getChannelValue(this.sourceSelect.value||`price`);this.priceInput.value=e===null?``:String(Hi(e))}close(){this.open=!1,this.el.hidden=!0}setAlerts(e){this.alerts=e,this.renderList()}destroy(){this.el.remove()}submitForm(){let e=this.conditionSelect.value,t=this.messageInput.value.trim()||void 0,n=this.sourceSelect.value||`price`,i=this.sources.find(e=>e.channel===n)?.label??this.t(`alerts.source.price`),a={},o=NaN;if(Ri.includes(e)){a.percent=Number(this.percentInput.value),a.bars=Number(this.barsInput.value);let e=Number.isInteger(a.bars)&&a.bars>=r.MIN_ALERT_BARS&&a.bars<=r.MAX_ALERT_BARS;if(!(a.percent>0)||!e){this.markInvalid(a.percent>0?this.barsInput:this.percentInput);return}}else if(this.targetSelect.value!==Bi)a.target=this.targetSelect.value;else if(o=Number(this.priceInput.value),this.priceInput.value.trim()===``||!Number.isFinite(o)){this.markInvalid(this.priceInput);return}this.closeCheck.checked&&(a.onBarClose=!0);let s=zi[this.expirySelect.value];s&&(a.expiresAt=(this.callbacks.now??Date.now)()+s),this.callbacks.onAdd({price:o,condition:e,message:t,channel:n,label:i,options:a})!==!1&&(this.messageInput.value=``,this.prefillPrice())}markInvalid(e){e.setAttribute(`aria-invalid`,`true`),e.focus(),e.addEventListener(`input`,()=>e.removeAttribute(`aria-invalid`),{once:!0})}describe(e){return Ii(e,this.t,this.callbacks.formatPrice)}renderList(){if(this.listEl.replaceChildren(),this.alerts.length===0){this.listEl.appendChild(this.emptyEl);return}for(let e of[...this.alerts].reverse()){let n=document.createElement(`div`);n.className=`tcw-alerts-row`+(e.triggered?` tcw-alerts-triggered`:``)+(e.expired?` tcw-alerts-expired`:``);let r=document.createElement(`div`);r.className=`tcw-alerts-info`;let i=document.createElement(`div`);i.className=`tcw-alerts-row-main`,i.textContent=this.describe(e),r.appendChild(i);let a=[];if(e.onBarClose&&a.push(this.t(`alerts.onClose`)),e.expiresAt!==void 0&&!e.expired){let n=this.callbacks.formatTime?.(e.expiresAt)??new Date(e.expiresAt).toISOString();a.push(t.r(this.t(`alerts.until`),{time:n}))}if(a.length>0){let e=document.createElement(`div`);e.className=`tcw-alerts-row-meta`,e.textContent=a.join(` · `),r.appendChild(e)}if(e.message){let t=document.createElement(`div`);t.className=`tcw-alerts-row-note`,t.textContent=e.message,r.appendChild(t)}if(e.triggered||e.expired){let t=document.createElement(`span`);t.className=`tcw-alerts-badge`,t.textContent=this.t(e.expired?`alerts.expired`:`alerts.triggered`),i.appendChild(t)}let o=document.createElement(`button`);o.type=`button`,o.className=`tcw-alerts-del`,o.setAttribute(`aria-label`,this.t(`alerts.delete`)),o.innerHTML=D(`trash`,14),o.addEventListener(`click`,()=>this.callbacks.onRemove(e.id)),n.appendChild(r),n.appendChild(o),this.listEl.appendChild(n)}}};function Gi(e){return Object.prototype.hasOwnProperty.call(t.c,e)}function Ki(e,t){let n=`indicatorInput.${e}`;return Gi(n)?t(n):null}function qi(e,t,n){let r=`indicatorInput.${e}.${t}`;return Gi(r)?n(r):null}function Ji(t,n){let{defaultConfig:r,shortName:i,inputs:a}=t.descriptor,o=Object.entries(a??{}).flatMap(([e,i])=>{let a=t.params[e];return!i.options||typeof a!=`string`&&typeof a!=`number`||a===r[e]?[]:qi(e,a,n)??[]});return[e.O(t.id,t.params,r,i),...o].join(` `)}var Yi=`print`,Xi=3,Zi=10;function Qi(e,t){return Math.max(Zi,(0,n.phiStep)(e,t,Xi))}var $i=`system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif`,ea=`'JetBrains Mono', 'SF Mono', 'Cascadia Code', 'Fira Code', 'Consolas', ui-monospace, monospace`,ta={print:{radius:{xs:1,sm:2,md:3,lg:5,xl:8},components:{tag:2,toolbar:0,sidebar:0},sizes:{toolbar:42,control:26,controlSmall:20,icon:16,sidebar:42,menuItem:33},density:{compact:{toolbar:33,control:20,controlSmall:20,icon:16,sidebar:33,menuItem:26},spacious:{toolbar:53,control:33,controlSmall:26,icon:20,sidebar:53,menuItem:42}},font:{family:n.SANS_FONT_FAMILY,mono:`'Cascadia Mono', 'SF Mono', ui-monospace, Menlo, Consolas, monospace`,size:13,weight:400,strongWeight:600,labelCase:`uppercase`,labelTracking:.06},borders:{width:1,separators:!0},shadows:{menu:`0 0 0 1px var(--tcw-border), var(--tcw-shadow-md)`,dialog:`0 0 0 1px var(--tcw-border), var(--tcw-shadow-lg)`,tooltip:`var(--tcw-shadow-sm)`},blur:0,active:`solid`,toolbar:`docked`,sidebar:`docked`,intervals:`plain`,tagRadius:2},studio:{radius:{xs:3,sm:5,md:7,lg:11,xl:16},components:{toolbar:0,sidebar:0},sizes:{toolbar:46,control:30,controlSmall:24,icon:18,sidebar:48,menuItem:30},font:{family:`'Manrope', 'Inter', ${$i}`,mono:ea,size:13,weight:500,strongWeight:600,labelCase:`none`,labelTracking:0},borders:{width:1,separators:!1},shadows:{menu:`var(--tcw-shadow-lg)`,dialog:`var(--tcw-shadow-xl)`,tooltip:`var(--tcw-shadow-md)`},blur:0,active:`tint`,toolbar:`docked`,sidebar:`docked`,intervals:`segmented`,tagRadius:4},terminal:{radius:{xs:1,sm:2,md:2,lg:2,xl:3},components:{tag:0,toolbar:0,sidebar:0},sizes:{toolbar:36,control:26,controlSmall:20,icon:16,sidebar:40,menuItem:26},font:{family:`'IBM Plex Sans Condensed', 'Roboto Condensed', 'Arial Narrow', ${$i}`,mono:`'IBM Plex Mono', ui-monospace, monospace`,size:12,weight:500,strongWeight:600,labelCase:`uppercase`,labelTracking:.08},borders:{width:1,separators:!0},shadows:{menu:`0 0 0 1px var(--tcw-border-strong)`,dialog:`0 0 0 1px var(--tcw-border-strong), var(--tcw-shadow-lg)`,tooltip:`none`},blur:0,active:`underline`,toolbar:`docked`,sidebar:`docked`,intervals:`plain`,tagRadius:0},capsule:{radius:{xs:6,sm:10,md:999,lg:18,xl:24},components:{tooltip:10,toolbar:999,sidebar:999,toast:999,tag:999},sizes:{toolbar:44,control:32,controlSmall:26,icon:18,sidebar:48,menuItem:34},font:{family:`'Sora', 'Manrope', ${$i}`,mono:ea,size:13,weight:500,strongWeight:600,labelCase:`none`,labelTracking:0},borders:{width:1,separators:!1},shadows:{menu:`0 0 0 1px var(--tcw-divider), var(--tcw-shadow-xl)`,dialog:`0 0 0 1px var(--tcw-divider), var(--tcw-shadow-xl)`,tooltip:`var(--tcw-shadow-lg)`},blur:16,active:`solid`,toolbar:`floating`,sidebar:`floating`,intervals:`segmented`,tagRadius:999}},na={compact:{toolbar:38,control:26,controlSmall:20,icon:16,sidebar:40,menuItem:26},spacious:{toolbar:52,control:34,controlSmall:28,icon:20,sidebar:54,menuItem:34}};function ra(e,t){return{control:e.md,input:e.md,menu:e.lg,dialog:e.xl,panel:e.lg,tooltip:e.sm,tag:e.sm,toast:e.lg,toolbar:0,sidebar:0,...t}}var ia=Object.freeze(Object.fromEntries(Object.keys(ta).map(e=>[e,oa(aa(e))])));function aa(e){let{density:t,...n}=ta[e];return{...n,preset:e,density:`comfortable`,radius:{...n.radius},components:ra(n.radius,n.components),sizes:{...n.sizes},font:{...n.font},borders:{...n.borders},shadows:{...n.shadows}}}function oa(e){for(let t of Object.values(e))t&&typeof t==`object`&&oa(t);return Object.freeze(e)}var sa=e=>typeof e==`string`&&Object.prototype.hasOwnProperty.call(ta,e),H=(e,t,n)=>typeof e==`number`&&Number.isFinite(e)&&e>=t&&e<=n,ca=e=>typeof e==`string`&&e.trim().length>0&&e.length<=300&&!/[;{}<>\\]|url\s*\(|expression\s*\(|\/\*/i.test(e)&&la(e);function la(e){let t=0,n=``;for(let r of e)if(n)r===n&&(n=``);else if(r===`"`||r===`'`)n=r;else if(r===`(`)t++;else if(r===`)`&&--t<0)return!1;return t===0&&!n}var ua=(e,t)=>typeof e==`string`&&t.includes(e);function da(e,t,n){let r={...e};if(!t||typeof t!=`object`)return r;for(let i of Object.keys(e)){let e=t[i];e!==void 0&&n(i,e)&&(r[i]=e)}return r}function U(e){let t=typeof e==`string`?{preset:e}:e??{},n=sa(t.preset)?t.preset:Yi,r=ta[n],i=da(r.radius,t.radius,(e,t)=>H(t,0,999)),a=ua(t.density,[`compact`,`comfortable`,`spacious`,`airy`])?t.density:`comfortable`,o=a===`airy`?`spacious`:a,s=da(o===`compact`||o===`spacious`?(r.density??na)[o]:r.sizes,t.sizes,(e,t)=>e===`icon`?H(t,10,32):H(t,16,80)),c=da(r.font,t.font,(e,t)=>e===`family`||e===`mono`?ca(t):e===`size`?H(t,11,20):e===`weight`||e===`strongWeight`?H(t,100,900):e===`labelCase`?t===`none`||t===`uppercase`:H(t,0,.5)),l=a===`airy`&&t.font?.mono===void 0?{...c,mono:c.family}:c;return{preset:n,density:a,radius:i,components:da(ra(i,r.components),t.components,(e,t)=>H(t,0,999)),sizes:s,font:l,borders:da(r.borders,t.borders,(e,t)=>e===`width`?H(t,0,4):typeof t==`boolean`),shadows:da(r.shadows,t.shadows,(e,t)=>ca(t)),blur:H(t.blur,0,40)?t.blur:r.blur,active:ua(t.active,[`tint`,`solid`,`underline`])?t.active:r.active,toolbar:ua(t.toolbar,[`docked`,`floating`])?t.toolbar:r.toolbar,sidebar:ua(t.sidebar,[`docked`,`floating`])?t.sidebar:r.sidebar,intervals:ua(t.intervals,[`plain`,`segmented`])?t.intervals:r.intervals,tagRadius:H(t.tagRadius,0,999)?t.tagRadius:r.tagRadius}}function fa(e){let t=e=>`${e}px`,n=e.radius,r=e.components,i=e.sizes,a=e.font;return{"--tcw-radius-xs":t(n.xs),"--tcw-radius-sm":t(n.sm),"--tcw-radius":t(n.md),"--tcw-radius-lg":t(n.lg),"--tcw-radius-xl":t(n.xl),"--tcw-control-radius":t(r.control),"--tcw-input-radius":t(r.input),"--tcw-menu-radius":t(r.menu),"--tcw-dialog-radius":t(r.dialog),"--tcw-panel-radius":t(r.panel),"--tcw-tooltip-radius":t(r.tooltip),"--tcw-tag-radius":t(r.tag),"--tcw-toast-radius":t(r.toast),"--tcw-toolbar-radius":t(r.toolbar),"--tcw-sidebar-radius":t(r.sidebar),"--tcw-toolbar-h":t(i.toolbar),"--tcw-control-h":t(i.control),"--tcw-control-h-sm":t(i.controlSmall),"--tcw-icon":t(i.icon),"--tcw-sidebar-w":t(i.sidebar),"--tcw-menu-item-h":t(i.menuItem),"--tcw-font":a.family,"--tcw-font-mono":a.mono,"--tcw-font-size":t(a.size),"--tcw-font-size-sm":t(Qi(a.size,-1)),"--tcw-font-size-xs":t(Qi(a.size,-2)),"--tcw-font-size-lg":t(Qi(a.size,1)),"--tcw-font-size-xl":t(Qi(a.size,2)),"--tcw-font-size-display":t(Qi(a.size,3)),"--tcw-weight":String(a.weight),"--tcw-weight-strong":String(a.strongWeight),"--tcw-label-case":a.labelCase,"--tcw-label-tracking":`${a.labelTracking}em`,"--tcw-border-w":t(e.borders.width),"--tcw-sep-w":e.borders.separators?t(Math.max(1,e.borders.width)):`0px`,"--tcw-menu-shadow":e.shadows.menu,"--tcw-dialog-shadow":e.shadows.dialog,"--tcw-tooltip-shadow":e.shadows.tooltip,"--tcw-blur":t(e.blur),"--tcw-surface-opacity":e.blur>0?`82%`:`100%`}}function W(e,t,n={}){let r=n.variables!==!1;for(let[n,i]of Object.entries(fa(t)))r?e.style.setProperty(n,i):e.style.removeProperty(n);e.dataset.tcwUi=t.preset,e.dataset.tcwActive=t.active,e.dataset.tcwToolbar=t.toolbar,e.dataset.tcwSidebar=t.sidebar,e.dataset.tcwIntervals=t.intervals,e.dataset.tcwSeparators=t.borders.separators?`on`:`off`}var pa=class{el;indicatorsEl;drawingsEl;compareEl=null;callbacks;open=!1;constructor(e,n,r=t.t){this.t=r,this.callbacks=n,this.el=document.createElement(`div`),this.el.className=`tcw-tree-panel`,E(this.el,`objectTree`),this.el.hidden=!0;let i=document.createElement(`div`);i.className=`tcw-tree-header`;let a=document.createElement(`span`);a.textContent=this.t(`objects.title`);let o=document.createElement(`button`);if(o.type=`button`,o.className=`tcw-tree-close`,o.setAttribute(`aria-label`,this.t(`objects.close`)),o.innerHTML=D(`x`,14),o.addEventListener(`click`,()=>this.callbacks.onClose?this.callbacks.onClose():this.close()),i.appendChild(a),i.appendChild(o),this.el.appendChild(i),this.indicatorsEl=this.makeSection(this.t(`objects.indicators`)),this.drawingsEl=this.makeSection(this.t(`objects.drawings`)),this.callbacks.onAddCompare){this.compareEl=this.makeSection(this.t(`objects.compare`),{label:this.t(`objects.addCompare`),run:()=>this.callbacks.onAddCompare?.()});let e=this.compareEl.parentElement?.querySelector(`.tcw-tree-add`);e&&E(e,`compare`)}e.appendChild(this.el)}get element(){return this.el}isOpen(){return this.open}toggle(){this.open?this.close():this.openPanel()}openPanel(){this.open=!0,this.el.hidden=!1}close(){this.open=!1,this.el.hidden=!0}destroy(){this.el.remove()}setObjects(e,t,n=[]){this.renderIndicators(e),this.renderDrawings(t),this.renderCompares(n)}makeSection(e,t){let n=document.createElement(`div`);n.className=`tcw-tree-section`;let r=document.createElement(`div`);r.className=`tcw-tree-section-head`;let i=document.createElement(`span`);if(i.textContent=e,r.appendChild(i),t){let e=document.createElement(`button`);e.type=`button`,e.className=`tcw-tree-add`,e.setAttribute(`aria-label`,t.label),e.title=t.label,e.innerHTML=D(`plus`,13),e.addEventListener(`click`,t.run),r.appendChild(e)}let a=document.createElement(`div`);return a.className=`tcw-tree-list`,n.appendChild(r),n.appendChild(a),this.el.appendChild(n),a}renderIndicators(e){if(this.indicatorsEl.replaceChildren(),e.length===0){this.indicatorsEl.appendChild(this.emptyRow(this.t(`objects.noIndicators`)));return}for(let t of e){let e=this.row(t.name,t.title);t.visible||e.classList.add(`tcw-tree-hidden`);let n=document.createElement(`div`);if(n.className=`tcw-tree-actions`,this.callbacks.onToggleIndicatorVisible&&n.appendChild(this.iconButton(t.visible?`eye`:`eyeOff`,t.visible?this.t(`common.hide`):this.t(`common.show`),``,()=>this.callbacks.onToggleIndicatorVisible?.(t.instanceId,!t.visible))),this.callbacks.onConfigureIndicator){let e=this.iconButton(`settings`,this.t(`objects.indicatorSettings`),``,()=>this.callbacks.onConfigureIndicator?.(t.instanceId));E(e,`indicatorSettings`),n.appendChild(e)}n.appendChild(this.iconButton(`trash`,this.t(`objects.removeIndicator`),`tcw-tree-del`,()=>this.callbacks.onRemoveIndicator(t.instanceId))),e.appendChild(n),this.indicatorsEl.appendChild(e)}}renderDrawings(e){if(this.drawingsEl.replaceChildren(),e.length===0){this.drawingsEl.appendChild(this.emptyRow(this.t(`objects.noDrawings`)));return}let t=new Set;for(let n of e){if(!n.group){this.drawingsEl.appendChild(this.drawingRow(n));continue}if(t.has(n.group.id))continue;t.add(n.group.id);let r=n.group.id,i=e.filter(e=>e.group?.id===r);this.drawingsEl.appendChild(this.groupRow(r,n.group.name,i));for(let e of i){let t=this.drawingRow(e);t.classList.add(`tcw-tree-member`),this.drawingsEl.appendChild(t)}}}groupRow(e,t,n){let r=this.row(t);r.classList.add(`tcw-tree-group`);let i=n.some(e=>e.visible),a=n.every(e=>e.locked);i||r.classList.add(`tcw-tree-hidden`);let o=r.querySelector(`.tcw-tree-name`);o.innerHTML=D(`layers`,13),o.append(` ${t}`);let s=document.createElement(`div`);return s.className=`tcw-tree-actions`,this.callbacks.onRenameGroup&&(o.addEventListener(`dblclick`,()=>this.renameGroup(o,e,t)),s.appendChild(this.iconButton(`penLine`,this.t(`objects.renameGroup`),``,()=>this.renameGroup(o,e,t)))),this.callbacks.onToggleGroupVisible&&s.appendChild(this.iconButton(i?`eye`:`eyeOff`,i?this.t(`common.hide`):this.t(`common.show`),``,()=>this.callbacks.onToggleGroupVisible?.(e,!i))),this.callbacks.onToggleGroupLocked&&s.appendChild(this.iconButton(a?`lock`:`unlock`,a?this.t(`common.unlock`):this.t(`common.lock`),a?`tcw-tree-on`:``,()=>this.callbacks.onToggleGroupLocked?.(e,!a))),this.callbacks.onUngroup&&s.appendChild(this.iconButton(`x`,this.t(`drawingMenu.ungroup`),``,()=>this.callbacks.onUngroup?.(e))),r.appendChild(s),r}renameGroup(e,t,n){if(!e.isConnected)return;let r=document.createElement(`input`);r.type=`text`,r.className=`tcw-tree-rename`,r.value=n,r.maxLength=80,r.setAttribute(`aria-label`,this.t(`objects.renameGroup`));let i=!1,a=a=>{if(i)return;i=!0;let o=r.value.trim();r.isConnected&&r.replaceWith(e),a&&o&&o!==n&&this.callbacks.onRenameGroup?.(t,o)};r.addEventListener(`keydown`,e=>{e.key===`Enter`?a(!0):e.key===`Escape`&&(e.stopPropagation(),a(!1))}),r.addEventListener(`blur`,()=>a(!0)),e.replaceWith(r),r.focus(),r.select()}drawingRow(e){let t=this.row(e.label);(!e.visible||e.offInterval)&&t.classList.add(`tcw-tree-hidden`),e.offInterval&&(t.title=this.t(`indicatorSettings.offInterval`));let n=document.createElement(`div`);if(n.className=`tcw-tree-actions`,n.appendChild(this.iconButton(e.visible?`eye`:`eyeOff`,e.visible?this.t(`common.hide`):this.t(`common.show`),``,()=>this.callbacks.onToggleDrawingVisible(e.id,!e.visible))),n.appendChild(this.iconButton(e.locked?`lock`:`unlock`,e.locked?this.t(`common.unlock`):this.t(`common.lock`),e.locked?`tcw-tree-on`:``,()=>this.callbacks.onToggleDrawingLocked(e.id,!e.locked))),this.callbacks.onConfigureDrawing){let t=this.iconButton(`settings`,this.t(`objects.drawingSettings`),``,()=>this.callbacks.onConfigureDrawing?.(e.id));E(t,`drawingSettings`),n.appendChild(t)}return n.appendChild(this.iconButton(`trash`,this.t(`objects.removeDrawing`),`tcw-tree-del`,()=>this.callbacks.onRemoveDrawing(e.id))),t.appendChild(n),t}renderCompares(e){if(!this.compareEl)return;if(this.compareEl.replaceChildren(),e.length===0){this.compareEl.appendChild(this.emptyRow(this.t(`objects.noComparisons`)));return}let t=e.some(e=>e.color);for(let n of e){let e=this.row(n.label);if(e.classList.add(`tcw-tree-compare`),t){let t=document.createElement(`span`);t.className=`tcw-tree-dot`,n.color&&(t.style.background=n.color),e.insertBefore(t,e.firstChild)}if(n.way){let t=document.createElement(`span`);t.className=`tcw-tree-way`,t.textContent=n.way,t.title=n.way,e.appendChild(t)}this.callbacks.onRemoveCompare&&e.appendChild(this.iconButton(`trash`,this.t(`objects.removeComparison`),`tcw-tree-del`,()=>this.callbacks.onRemoveCompare?.(n.id))),this.compareEl.appendChild(e)}}row(e,t=e){let n=document.createElement(`div`);n.className=`tcw-tree-row`;let r=document.createElement(`span`);return r.className=`tcw-tree-name`,r.textContent=e,r.title=t,n.appendChild(r),n}emptyRow(e){let t=document.createElement(`div`);return t.className=`tcw-tree-empty`,t.textContent=e,t}iconButton(e,t,n,r){let i=document.createElement(`button`);return i.type=`button`,i.className=`tcw-tree-btn ${n}`.trim(),i.setAttribute(`aria-label`,t),i.title=t,i.innerHTML=D(e,14),i.addEventListener(`click`,r),i}},ma={trendLine:`Trend Line`,ray:`Ray`,extendedLine:`Extended Line`,horizontalLine:`Horizontal Line`,horizontalRay:`Horizontal Ray`,crossLine:`Cross Line`,infoLine:`Info Line`,trendAngle:`Trend Angle`,circle:`Circle`,fibChannel:`Fib Channel`,fibSpeedResistanceFan:`Fib Speed Resistance Fan`,schiffPitchfork:`Schiff Pitchfork`,modifiedSchiffPitchfork:`Modified Schiff Pitchfork`,xabcdPattern:`XABCD Pattern`,abcdPattern:`ABCD Pattern`,headAndShoulders:`Head and Shoulders`,dateAndPriceRange:`Date and Price Range`,cyclicLines:`Cyclic Lines`,priceLabel:`Price Label`,verticalLine:`Vertical Line`,rectangle:`Rectangle`,ellipse:`Ellipse`,triangle:`Triangle`,arrow:`Arrow`,parallelChannel:`Parallel Channel`,regressionChannel:`Regression Channel`,pitchfork:`Pitchfork`,fibRetracement:`Fib Retracement`,fibExtension:`Fib Extension`,fibTimeZones:`Fib Time Zones`,gannBox:`Gann Box`,gannFan:`Gann Fan`,elliottWave:`Elliott Wave`,priceRange:`Price Range`,dateRange:`Date Range`,measure:`Measure`,text:`Text`,textAnnotation:`Text`,anchoredVWAP:`Anchored VWAP`,volumeProfileRange:`Volume Profile`,riskReward:`Long/Short Position`};function ha(e,t){let n=`tool.${e}`,r=t?.(n);return r&&r!==n?r:ma[e]??e}var ga=[1,1.5,2,3,4],_a=[`solid`,`dashed`,`dotted`],va=`#4c8dff`,ya=10,ba={ticks:`toolbar.timeframes.ticks`,seconds:`toolbar.timeframes.seconds`,minutes:`toolbar.timeframes.minutes`,hours:`toolbar.timeframes.hours`,days:`toolbar.timeframes.days`,weeks:`toolbar.timeframes.weeks`,months:`toolbar.timeframes.months`};function xa(e,t,n,r,i){let a=Ea();for(let e of[...t.plots].sort((e,t)=>e.color-t.color))a.appendChild(Sa(e,t,n,r));let o=P(ga.map(e=>({value:String(e),label:`${e} px`})),String(t.lineWidth),e=>n.lineWidth(Number(e)));if(o.dataset.role=`line-width`,a.appendChild(M(r(`indicatorSettings.lineWidth`),o)),t.scale&&n.scale){let e=P([{value:`right`,label:r(`indicatorSettings.scale.right`)},{value:`left`,label:r(`indicatorSettings.scale.left`)}],t.scale,e=>n.scale?.(e===`left`?`left`:`right`));e.dataset.role=`scale`,a.appendChild(M(r(`indicatorSettings.scale`),e))}e.appendChild(a),t.levels&&n.levels&&e.appendChild(Ca([...t.levels],n.levels,r,i))}function Sa(e,t,n,r){let i=t.plotStyles[e.key]??{},a=document.createElement(`div`);a.className=`tcw-settings-row tcw-indi-plot`,a.dataset.plot=e.key;let o=document.createElement(`label`);o.className=`tcw-indi-plot-name`;let s=document.createElement(`input`);s.type=`checkbox`,s.checked=i.visible!==!1,s.addEventListener(`change`,()=>n.plot(e.key,{visible:s.checked}));let c=document.createElement(`span`);c.className=`tcw-settings-label`,c.textContent=e.title,o.append(s,c);let l=document.createElement(`span`);l.className=`tcw-indi-plot-controls`;let u=(e,r)=>{let i=Cn(t.colors[e]??t.colors[0]??va,t=>n.color(e,t));return i.setAttribute(`aria-label`,r),i};if(e.tone!==void 0&&e.downColor!==void 0?l.append(u(e.color,`${e.title} ${r(`indicatorSettings.up`)}`),u(e.downColor,`${e.title} ${r(`indicatorSettings.down`)}`)):l.appendChild(u(e.color,e.title)),(e.kind??`line`)===`line`||e.kind===`step`){let t=P(_a.map(e=>({value:e,label:r(`drawingSettings.lineStyle.${e}`)})),i.lineStyle??`solid`,t=>n.plot(e.key,{lineStyle:t}));t.setAttribute(`aria-label`,`${e.title}: ${r(`drawingSettings.lineStyle`)}`),l.appendChild(t)}return a.append(o,l),a}function Ca(e,t,n,r){let i=Ea(),a=e,o=()=>{let e=document.createElement(`div`);e.className=`tcw-settings-section-title`,e.textContent=n(`indicatorSettings.tab.levels`);let t=a.map((e,t)=>c(e,t)),r=document.createElement(`button`);r.type=`button`,r.className=`tcw-reset-link tcw-indi-add`,r.textContent=`+ ${n(`indicatorSettings.addLevel`)}`,r.addEventListener(`click`,()=>{let e=a[a.length-1];s([...a,e===void 0?0:e+ya]);let t=i.querySelectorAll(`.tcw-indi-level input`);t[t.length-1]?.focus()}),i.replaceChildren(e,...a.length===0?[Da(n(`indicatorSettings.noLevels`))]:t,r)},s=e=>{a=e,t([...e]),o()},c=(e,o)=>{let c=N(e,{step:`any`},e=>{a=a.map((t,n)=>n===o?e:t),t([...a])});c.id=`tcw-indi-level-${r}-${o}`;let l=document.createElement(`button`);l.type=`button`,l.className=`tcw-indi-remove`,l.innerHTML=D(`x`,12);let u=n(`indicatorSettings.removeLevel`);l.title=u,l.setAttribute(`aria-label`,`${u} ${o+1}`),l.addEventListener(`click`,()=>{s(a.filter((e,t)=>t!==o)),(i.querySelectorAll(`.tcw-indi-remove`)[o]??i.querySelector(`.tcw-indi-add`))?.focus()});let d=document.createElement(`span`);d.className=`tcw-indi-level`,d.append(c,l);let f=document.createElement(`div`);f.className=`tcw-settings-row`;let p=document.createElement(`label`);return p.className=`tcw-settings-label`,p.htmlFor=c.id,p.textContent=`${n(`indicatorSettings.level`)} ${o+1}`,f.append(p,d),f};return o(),i}function wa(e,t,n,i){let a=new Map(r.INTERVAL_UNITS.map(e=>{let n=t?.[e],i=Array.isArray(n)?n:[1,r.INTERVAL_LIMITS[e]];return[e,{on:n!==!1,from:i[0],to:i[1]}]})),o=()=>{let e={};for(let[t,{on:n,from:i,to:o}]of a){let[a,s]=[Math.min(i,o),Math.max(i,o)];n?(a>1||s<r.INTERVAL_LIMITS[t])&&(e[t]=[a,s]):e[t]=!1}n(Object.keys(e).length>0?e:null)},s=Ea();for(let e of r.INTERVAL_UNITS)s.appendChild(Ta(e,a.get(e),o,i));e.appendChild(s)}function Ta(e,t,n,i){let a=document.createElement(`div`);a.className=`tcw-settings-row tcw-indi-unit`,a.dataset.unit=e;let o=document.createElement(`label`);o.className=`tcw-indi-plot-name`;let s=document.createElement(`input`);s.type=`checkbox`,s.checked=t.on;let c=document.createElement(`span`);c.className=`tcw-settings-label`,c.textContent=i(ba[e]),o.append(s,c),a.appendChild(o);let l=[];if(e!==`ticks`){let o=(a,o)=>{let s=N(t[a],{min:1,max:r.INTERVAL_LIMITS[e],step:1},e=>{t[a]=Math.round(e),s.value=String(t[a]),n()});return s.setAttribute(`aria-label`,`${i(ba[e])}: ${i(o)}`),s.disabled=!t.on,l.push(s),s},s=document.createElement(`span`);s.className=`tcw-indi-range`;let c=document.createElement(`span`);c.setAttribute(`aria-hidden`,`true`),c.textContent=`–`,s.append(o(`from`,`indicatorSettings.rangeFrom`),c,o(`to`,`indicatorSettings.rangeTo`)),a.appendChild(s)}return s.addEventListener(`change`,()=>{t.on=s.checked;for(let e of l)e.disabled=!s.checked;n()}),a}function Ea(){let e=document.createElement(`div`);return e.className=`tcw-settings-section`,e}function Da(e){let t=document.createElement(`div`);return t.className=`tcw-settings-label`,t.textContent=e,t}var Oa=1,ka=/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/,Aa=1.5,ja={visible:!0,lineStyle:`solid`},Ma=(e,t)=>JSON.stringify(e)===JSON.stringify(t),Na=e=>JSON.parse(JSON.stringify(e));function Pa(e){return e.replace(/_/g,` `).replace(/([a-z0-9])([A-Z])/g,`$1 $2`).replace(/^./,e=>e.toUpperCase())}function Fa(e,t){return Object.fromEntries([...new Set([...Object.keys(e),...Object.keys(t)])].map(e=>[e,{...ja,...t[e]}]))}var Ia=class{backdrop;modal;bodyEl;titleEl;tabsEl;defaultsBtn;menu=null;callbacks;target=null;draft={};initial=null;look={colors:[],lineWidth:Aa,plots:{},levels:[],intervals:null};tab=`inputs`;tabButtons=[];returnFocus=null;uid=Oa++;t;constructor(e,n,r){this.callbacks=n,this.t=r??(e=>t.c[e]),this.backdrop=document.createElement(`div`),this.backdrop.className=`tcw-modal-backdrop`,this.backdrop.hidden=!0;let i=!1;this.backdrop.addEventListener(`pointerdown`,e=>{i=e.target===this.backdrop}),this.backdrop.addEventListener(`click`,e=>{e.target===this.backdrop&&i&&this.finish(!1),i=!1}),this.modal=document.createElement(`div`),this.modal.className=`tcw-modal tcw-modal-narrow tcw-indi`,this.modal.setAttribute(`role`,`dialog`),this.modal.setAttribute(`aria-modal`,`true`),this.modal.setAttribute(`aria-labelledby`,`tcw-indi-title-${this.uid}`),this.modal.tabIndex=-1,this.modal.addEventListener(`keydown`,e=>this.onKeyDown(e));let a=document.createElement(`div`);a.className=`tcw-modal-header`,this.titleEl=document.createElement(`h3`),this.titleEl.id=`tcw-indi-title-${this.uid}`;let o=document.createElement(`button`);o.type=`button`,o.className=`tcw-modal-close`,o.setAttribute(`aria-label`,this.t(`indicatorSettings.close`)),o.innerHTML=D(`x`,16),o.addEventListener(`click`,()=>this.finish(!1)),a.append(this.titleEl,o),this.tabsEl=document.createElement(`div`),this.tabsEl.className=`tcw-modal-tabs`,this.tabsEl.setAttribute(`role`,`tablist`),this.tabsEl.addEventListener(`keydown`,e=>this.onTabKey(e)),this.bodyEl=document.createElement(`div`),this.bodyEl.className=`tcw-modal-body`,this.bodyEl.id=`tcw-indi-panel-${this.uid}`,this.bodyEl.setAttribute(`role`,`tabpanel`),this.defaultsBtn=this.footerButton(`defaults`,`tcw-footer-menu`,()=>this.openDefaults()),this.modal.append(a,this.tabsEl,this.bodyEl,this.buildFooter()),this.backdrop.appendChild(this.modal),e.appendChild(this.backdrop)}buildFooter(){this.defaultsBtn.setAttribute(`aria-haspopup`,`menu`),this.defaultsBtn.setAttribute(`aria-expanded`,`false`),this.defaultsBtn.innerHTML=`<span></span>${D(`chevronDown`,12)}`,this.defaultsBtn.querySelector(`span`).textContent=this.t(`indicatorSettings.defaults`);let e=document.createElement(`div`);e.className=`tcw-footer-end`,e.append(this.footerButton(`cancel`,`tcw-footer-cancel`,()=>this.finish(!1),this.t(`common.cancel`)),this.footerButton(`ok`,`tcw-done-btn`,()=>this.finish(!0),this.t(`drawingSettings.ok`)));let t=document.createElement(`div`);return t.className=`tcw-modal-footer`,t.append(this.defaultsBtn,e),t}open(e){this.target&&this.finish(!0),this.backdrop.hidden&&(this.returnFocus=document.activeElement instanceof HTMLElement?document.activeElement:null),this.target=e,this.titleEl.textContent=this.t(`indicatorSettings.title`).replace(`{name}`,e.name),this.draft={},this.look={colors:[...e.colors??[]],lineWidth:e.lineWidth??Aa,plots:Object.fromEntries(Object.entries(e.plotStyles??{}).map(([e,t])=>[e,{...t}])),levels:[...e.levels??[]],scale:e.scale,intervals:e.intervals??null},this.initial={params:this.currentParams(),look:Na(this.look)},this.tab=`inputs`,this.renderTabs(),this.renderBody(),this.backdrop.hidden=!1;let t=this.tabsEl.hidden?null:this.tabButtons[0]??null;(this.bodyEl.querySelector(`button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])`)??t??this.modal).focus()}close(){this.finish(!0)}isOpen(){return!this.backdrop.hidden}destroy(){this.menu?.destroy(),this.backdrop.remove()}finish(e){if(this.target){if(e){let e=document.activeElement;(e instanceof HTMLInputElement||e instanceof HTMLSelectElement)&&this.modal.contains(e)&&e.dispatchEvent(new Event(`change`))}else this.revert();this.target=null,this.menu?.close(),this.backdrop.hidden=!0,this.callbacks.onClose(),this.returnFocus?.isConnected&&this.returnFocus.focus(),this.returnFocus=null}}revert(){let e=this.target,t=this.initial;if(!e||!t)return;let n=e.instanceId;Ma(this.currentParams(),t.params)||this.callbacks.onApply(n,{...t.params});let r=t.look,i={};Ma(this.look.colors,r.colors)||(i.colors=[...r.colors]),this.look.lineWidth!==r.lineWidth&&(i.lineWidths=[r.lineWidth]),Ma(this.look.plots,r.plots)||(i.plots=Fa(this.look.plots,r.plots)),Object.keys(i).length>0&&this.callbacks.onStyle?.(n,i),Ma(this.look.levels,r.levels)||this.callbacks.onLevels?.(n,e.ownLevels?[...r.levels]:null),this.look.scale!==r.scale&&r.scale&&this.callbacks.onScale?.(n,r.scale),Ma(this.look.intervals,r.intervals)||this.callbacks.onIntervals?.(n,r.intervals)}currentParams(){let e=this.target;return e?{...e.defaults,...e.params,...this.draft}:{}}tabs(){let e=this.target;if(!e)return[];let t=!!(e.plots?.length&&e.colors&&this.callbacks.onStyle),n=!!(e.levels&&this.callbacks.onLevels);return[`inputs`,...t||n?[`style`]:[],...this.callbacks.onIntervals?[`visibility`]:[]]}renderTabs(){let e=this.tabs();this.tabsEl.hidden=e.length<2,this.tabButtons=e.map(e=>{let t=document.createElement(`button`);return t.type=`button`,t.className=`tcw-modal-tab`,t.id=`tcw-indi-tab-${this.uid}-${e}`,t.setAttribute(`role`,`tab`),t.setAttribute(`aria-controls`,this.bodyEl.id),t.dataset.tab=e,t.textContent=this.t(`indicatorSettings.tab.${e}`),t.addEventListener(`click`,()=>this.selectTab(e)),t}),this.tabsEl.replaceChildren(...this.tabButtons),this.markTabs()}markTabs(){for(let e of this.tabButtons){let t=e.dataset.tab===this.tab;e.classList.toggle(`tcw-active`,t),e.setAttribute(`aria-selected`,String(t)),e.tabIndex=t?0:-1,t&&this.bodyEl.setAttribute(`aria-labelledby`,e.id)}}selectTab(e,t=!1){this.tab=e,this.markTabs(),this.renderBody(),t&&this.tabButtons.find(t=>t.dataset.tab===e)?.focus()}onTabKey(e){let t=this.tabButtons.map(e=>e.dataset.tab),n=t.indexOf(this.tab),[r,i]=this.modal.closest(`[dir]`)?.getAttribute(`dir`)===`rtl`?[`ArrowLeft`,`ArrowRight`]:[`ArrowRight`,`ArrowLeft`],a=e.key===r?(n+1)%t.length:e.key===i?(n-1+t.length)%t.length:e.key===`Home`?0:e.key===`End`?t.length-1:-1;a<0||t.length===0||(e.preventDefault(),this.selectTab(t[a],!0))}onKeyDown(e){if(e.key===`Escape`){e.preventDefault(),e.stopPropagation(),this.finish(!1);return}j(e,this.modal)}renderBody(){this.bodyEl.replaceChildren();let e=this.target;e&&(this.tab===`style`?this.renderStyle(e):this.tab===`visibility`?wa(this.bodyEl,this.look.intervals,e=>this.setIntervals(e),this.t):this.renderInputs())}currentValue(e){if(e in this.draft)return this.draft[e];let t=this.target?.params[e],n=this.target?.defaults[e];return t??n}setValue(e,t){this.target&&(this.draft[e]=t,this.callbacks.onApply(this.target.instanceId,{...this.draft}))}renderInputs(){let e=document.createElement(`div`);e.className=`tcw-settings-section`;let t=Object.keys(this.target.defaults);t.length===0&&e.appendChild(this.note(this.t(`indicatorSettings.noInputs`)));for(let n of t)e.appendChild(this.fieldRow(n));this.bodyEl.appendChild(e)}fieldRow(e){let t=this.target?.inputs?.[e],n=this.currentValue(e),r=typeof(this.target?.defaults[e]??n),i;if(t?.source)i=this.sourceControl(e,String(n??`close`));else if(t?.options)i=this.choiceControl(e,t.options,n);else if(r===`boolean`)i=Sn(!!n,t=>this.setValue(e,t));else if(r===`number`){let r=Number(n);i=N(r,{min:t?.min,max:t?.max,step:t?.step??(Number.isInteger(r)?1:.1)},t=>this.setValue(e,t))}else i=typeof n==`string`&&ka.test(n)?Cn(n,t=>this.setValue(e,t)):this.textControl(e,String(n??``));return M(t?.label??Ki(e,this.t)??Pa(e),i)}sourceControl(e,t){let r=document.createElement(`select`);r.className=`tcw-indi-input tcw-indi-select`;let i=document.createElement(`optgroup`);i.label=this.t(`indicatorSettings.source.prices`);for(let e of n.PRICE_SOURCES)i.appendChild(this.option(e,e));r.appendChild(i);let a=this.target?.lineSources??[];if(a.length){let e=document.createElement(`optgroup`);e.label=this.t(`indicatorSettings.source.indicators`);for(let t of a)e.appendChild(this.option(t.value,t.label));r.appendChild(e)}return r.value=t,r.value!==t&&(r.value=`close`),r.addEventListener(`change`,()=>this.setValue(e,r.value)),r}choiceControl(e,t,n){let r=document.createElement(`select`);r.className=`tcw-indi-input tcw-indi-select`;for(let n of t)r.appendChild(this.option(String(n),qi(e,n,this.t)??String(n)));return r.value=String(n),r.addEventListener(`change`,()=>{let n=t.find(e=>String(e)===r.value);n!==void 0&&this.setValue(e,n)}),r}textControl(e,t){let n=document.createElement(`input`);return n.type=`text`,n.className=`tcw-indi-input`,n.value=t,n.addEventListener(`change`,()=>this.setValue(e,n.value)),n}renderStyle(e){let t=e.instanceId,n=()=>this.target===e,r=e=>n()&&this.callbacks.onStyle?.(t,e),i=e=>n()&&this.callbacks.onLevels?.(t,e),a=e=>n()&&this.callbacks.onScale?.(t,e);xa(this.bodyEl,{plots:e.colors&&this.callbacks.onStyle?e.plots??[]:[],colors:this.look.colors,plotStyles:this.look.plots,lineWidth:this.look.lineWidth,scale:e.scale&&this.callbacks.onScale?this.look.scale:void 0,levels:e.levels&&this.callbacks.onLevels?this.look.levels:void 0},{color:(e,t)=>{if(!n())return;let i=[...this.look.colors];for(;i.length<=e;)i.push(i[0]??t);i[e]=t,this.look.colors=i,r({colors:[...i]})},plot:(e,t)=>{n()&&(this.look.plots={...this.look.plots,[e]:{...this.look.plots[e],...t}},r({plots:{[e]:t}}))},lineWidth:e=>{n()&&(this.look.lineWidth=e,r({lineWidths:[e]}))},scale:e=>{n()&&(this.look.scale=e,a(e))},levels:e=>{n()&&(this.look.levels=e,i([...e]))}},this.t,this.uid)}setIntervals(e){this.target&&(this.look.intervals=e,this.callbacks.onIntervals?.(this.target.instanceId,e))}openDefaults(){if(this.menu?.isOpen()){this.menu.close();return}this.menu??=new k(this.modal,this.t(`indicatorSettings.defaults`));let e=this.defaultsBtn.getBoundingClientRect(),t=this.modal.getBoundingClientRect(),n=[{id:`reset`,label:this.t(`indicatorSettings.resetSettings`),icon:`reset`},...this.callbacks.onSaveDefault?[{id:`save`,label:this.t(`indicatorSettings.saveAsDefault`),icon:`save`}]:[]];this.menu.open(n,e.left-t.left,e.top-t.top,e=>{e===`reset`?this.resetAll():this.saveDefault()},this.defaultsBtn)}resetAll(){let e=this.target;if(!e)return;let t=e.instanceId,n={...e.defaults};this.draft={...n},this.callbacks.onApply(t,{...n}),Object.keys(this.look.plots).length>0&&(this.callbacks.onStyle?.(t,{plots:Fa(this.look.plots,{})}),this.look.plots={}),e.levels&&this.callbacks.onLevels&&(this.callbacks.onLevels(t,null),this.look.levels=[...e.defaultLevels??[]]),this.look.intervals&&this.setIntervals(null),this.renderBody()}saveDefault(){let e=this.target;if(!e)return;let t=Object.fromEntries(Object.entries(this.currentParams()).filter(([t,r])=>!Ma(r,e.defaults[t])&&!(typeof r==`string`&&(0,n.parseIndicatorSource)(r)))),i={};(0,r.isSeriesPalette)(this.look.colors)||(i.colors=[...this.look.colors]),this.look.lineWidth!==Aa&&(i.lineWidths=[this.look.lineWidth]),Object.keys(this.look.plots).length>0&&(i.plots=Na(this.look.plots)),this.callbacks.onSaveDefault?.(e.indicatorId,{params:t,style:i})}footerButton(e,t,n,r){let i=document.createElement(`button`);return i.type=`button`,i.className=t,i.dataset.act=e,r&&(i.textContent=r),i.addEventListener(`click`,n),i}note(e){let t=document.createElement(`div`);return t.className=`tcw-settings-label`,t.textContent=e,t}option(e,t){let n=document.createElement(`option`);return n.value=e,n.textContent=t,n}};function La(e){return e.normalize(`NFD`).replace(/[̀-ͯ]/g,``).toLowerCase()}var Ra=/[\s/()%-]+/;function za(e,t){let n=La(e.shortName),r=La(e.name);return n===t||La(e.id)===t?0:n.startsWith(t)||r.startsWith(t)?1:[...r.split(Ra),...n.split(Ra)].some(e=>e.startsWith(t))?2:r.includes(t)||n.includes(t)?3:null}function Ba(e,t){let n=La(t.trim());return n?e.map(e=>({item:e,rank:za(e,n)})).filter(e=>e.rank!==null).sort((e,t)=>e.rank-t.rank||e.item.name.localeCompare(t.item.name)).map(e=>e.item):[]}var Va=1,Ha=(e,t)=>e.name.localeCompare(t.name),Ua=class{backdrop=null;listEl=null;navEl=null;searchEl=null;liveEl=null;content={items:[],favorites:[],templates:[]};favorites=new Set;counts=new Map;view=`all`;lastView=null;query=``;returnFocus=null;uid=Va++;constructor(e,t,n){this.layer=e,this.callbacks=t,this.t=n}open(e){this.backdrop&&this.close(!1),this.returnFocus=document.activeElement instanceof HTMLElement?document.activeElement:null,this.content=e,this.favorites=new Set(e.favorites),this.counts=e.counts??new Map,this.query=``,this.view=this.startView(),this.build(),this.searchEl?.focus()}close(e=!0){this.backdrop&&(this.backdrop.remove(),this.backdrop=this.listEl=this.navEl=this.searchEl=this.liveEl=null,this.callbacks.onClose?.(),e&&this.returnFocus?.isConnected&&this.returnFocus.focus(),this.returnFocus=null)}isOpen(){return this.backdrop!==null}setTemplates(e){if(this.content={...this.content,templates:[...e]},!this.listEl||this.view!==`templates`||this.query)return;let t=this.listEl.contains(document.activeElement);this.renderList(),t&&!this.listEl.contains(document.activeElement)&&this.listEl.querySelector(`[data-tpl-save]`)?.focus()}setCounts(e){this.counts=e,this.listEl?.querySelectorAll(`.tcw-ip-row[data-ind]`).forEach(e=>this.markCount(e))}destroy(){this.close(!1)}startView(){let e=this.views();return this.lastView&&e.includes(this.lastView)&&!(this.lastView===`favorites`&&this.favorites.size===0)?this.lastView:this.favorites.size>0?`favorites`:`all`}views(){let e=new Set(this.content.items.map(e=>e.category));return[`favorites`,...this.callbacks.templates&&this.content.templates?[`templates`]:[],`all`,...r.INDICATOR_CATEGORIES.filter(t=>e.has(t))]}viewLabel(e){return e===`favorites`?this.t(`indicatorPicker.favorites`):e===`templates`?this.t(`toolbar.indicators.templates`):e===`all`?this.t(`toolbar.indicators.all`):this.t(`indicatorCategory.${e}`)}build(){let e=document.createElement(`div`);e.className=`tcw-modal-backdrop`,e.addEventListener(`click`,t=>{t.target===e&&this.close()});let t=document.createElement(`div`);t.className=`tcw-modal tcw-ip`,t.setAttribute(`role`,`dialog`),t.setAttribute(`aria-modal`,`true`),t.setAttribute(`aria-labelledby`,`tcw-ip-title-${this.uid}`),t.tabIndex=-1,t.addEventListener(`keydown`,e=>this.onKeyDown(e,t));let n=document.createElement(`div`);n.className=`tcw-visually-hidden`,n.setAttribute(`aria-live`,`polite`),t.append(this.buildHeader(),this.buildSearch(),this.buildBody(),n),e.appendChild(t),this.layer().appendChild(e),this.backdrop=e,this.liveEl=n,this.renderNav(),this.renderList()}buildHeader(){let e=document.createElement(`div`);e.className=`tcw-modal-header`;let t=document.createElement(`h3`);t.id=`tcw-ip-title-${this.uid}`,t.textContent=this.t(`toolbar.indicators`);let n=document.createElement(`button`);return n.type=`button`,n.className=`tcw-modal-close`,n.setAttribute(`aria-label`,this.t(`indicatorSettings.close`)),n.innerHTML=D(`x`,16),n.addEventListener(`click`,()=>this.close()),e.append(t,n),e}buildSearch(){let e=document.createElement(`label`);e.className=`tcw-ip-search`;let t=document.createElement(`input`);return t.type=`search`,t.id=`tcw-ip-search-${this.uid}`,t.placeholder=this.t(`indicatorPicker.search`),t.setAttribute(`aria-label`,this.t(`indicatorPicker.search`)),t.autocomplete=`off`,t.spellcheck=!1,t.addEventListener(`input`,()=>{this.query=t.value,this.renderList()}),t.addEventListener(`keydown`,e=>this.onSearchKey(e)),e.innerHTML=D(`search`,16),e.appendChild(t),this.searchEl=t,e}buildBody(){let e=document.createElement(`div`);e.className=`tcw-ip-body`;let t=document.createElement(`div`);t.className=`tcw-ip-nav`,t.setAttribute(`role`,`tablist`),t.setAttribute(`aria-orientation`,`vertical`),t.setAttribute(`aria-label`,this.t(`indicatorPicker.groups`)),t.addEventListener(`keydown`,e=>this.onNavKey(e));let n=document.createElement(`div`);return n.className=`tcw-ip-list`,n.id=`tcw-ip-list-${this.uid}`,n.setAttribute(`role`,`tabpanel`),n.addEventListener(`keydown`,e=>this.onListKey(e)),n.addEventListener(`focusin`,e=>this.rove(e.target)),e.append(t,n),this.navEl=t,this.listEl=n,e}renderNav(){let e=this.navEl;e&&(e.replaceChildren(...this.views().map(e=>{let t=document.createElement(`button`);return t.type=`button`,t.className=`tcw-ip-tab`,t.id=`tcw-ip-tab-${this.uid}-${e}`,t.dataset.view=e,t.setAttribute(`role`,`tab`),t.setAttribute(`aria-controls`,`tcw-ip-list-${this.uid}`),t.innerHTML=`${e===`favorites`?D(`star`,14):e===`templates`?D(`layers`,14):``}<span></span>`,t.querySelector(`span`).textContent=this.viewLabel(e),e===`templates`&&E(t,`indicatorTemplates`),t.addEventListener(`click`,()=>this.select(e)),t})),this.markNav())}markNav(){this.navEl?.querySelectorAll(`.tcw-ip-tab`).forEach(e=>{let t=e.dataset.view===this.view;e.setAttribute(`aria-selected`,String(t)),e.classList.toggle(`tcw-active`,t),e.tabIndex=t?0:-1}),this.labelList()}labelList(){let e=this.query.trim()!==``;this.listEl?.setAttribute(`aria-labelledby`,e?`tcw-ip-search-${this.uid}`:`tcw-ip-tab-${this.uid}-${this.view}`)}select(e,t=!1){this.view=this.lastView=e,this.searchEl&&this.query&&(this.searchEl.value=this.query=``),this.markNav(),this.renderList(),t&&this.navEl?.querySelector(`[data-view="${e}"]`)?.focus()}renderList(){let e=this.listEl;if(!e)return;e.replaceChildren();let n=this.content.items;if(this.navEl?.classList.toggle(`tcw-ip-nav--searching`,this.query.trim()!==``),this.labelList(),this.query.trim()){let r=Ba(n,this.query);r.length===0?e.appendChild(this.note(t.r(this.t(`indicatorPicker.noMatch`),{query:this.query.trim()}))):e.append(...r.map(e=>this.row(e)))}else if(this.view===`templates`)this.renderTemplates(e);else if(this.view===`favorites`){let t=n.filter(e=>this.favorites.has(e.id)).sort(Ha);t.length===0?e.appendChild(this.note(this.t(`indicatorPicker.noFavorites`))):e.append(...t.map(e=>this.row(e)))}else if(this.view===`all`)for(let t of r.INDICATOR_CATEGORIES){let r=n.filter(e=>e.category===t).sort(Ha);if(r.length===0)continue;let i=document.createElement(`div`);i.className=`tcw-ip-heading`,i.textContent=this.viewLabel(t),e.append(i,...r.map(e=>this.row(e)))}else e.append(...n.filter(e=>e.category===this.view).sort(Ha).map(e=>this.row(e)));e.querySelector(`.tcw-ip-add`)?.setAttribute(`tabindex`,`0`)}row(e){let t=document.createElement(`div`);t.className=`tcw-ip-row`,t.dataset.ind=e.id;let n=document.createElement(`button`);n.type=`button`,n.className=`tcw-ip-add`,n.dataset.ind=e.id,n.tabIndex=-1;let r=document.createElement(`span`);r.className=`tcw-ip-name`,r.textContent=e.name,n.appendChild(r),e.shortName&&e.shortName!==e.name&&n.appendChild(this.tag(`tcw-ip-short`,e.shortName)),n.appendChild(this.tag(`tcw-ip-kind`,this.t(`indicatorType.${e.placement}`))),n.addEventListener(`click`,()=>this.add(e));let i=document.createElement(`button`);return i.type=`button`,i.className=`tcw-ip-aside tcw-ip-star`,i.tabIndex=-1,i.title=this.t(`indicatorPicker.favorite`),i.setAttribute(`aria-label`,`${this.t(`indicatorPicker.favorite`)}: ${e.name}`),i.setAttribute(`aria-pressed`,String(this.favorites.has(e.id))),i.innerHTML=D(`star`,14),i.addEventListener(`click`,()=>this.toggleFavorite(e.id,i)),t.append(n,i),this.markCount(t),t}renderTemplates(e){let n=document.createElement(`button`);n.type=`button`,n.className=`tcw-ip-add tcw-ip-save`,n.tabIndex=-1,n.dataset.tplSave=``,n.innerHTML=`${D(`save`,14)}<span class="tcw-ip-name"></span>`,n.querySelector(`span`).textContent=this.t(`templates.save`),n.addEventListener(`click`,()=>{this.close(),this.callbacks.templates?.onSave()}),e.appendChild(n);let r=this.content.templates??[];r.length===0&&e.appendChild(this.note(this.t(`indicatorPicker.noTemplates`)));for(let n of r){let r=document.createElement(`div`);r.className=`tcw-ip-row`;let i=document.createElement(`button`);i.type=`button`,i.className=`tcw-ip-add`,i.tabIndex=-1,i.dataset.tplApply=n,i.innerHTML=`${D(`layers`,14)}<span class="tcw-ip-name"></span>`,i.querySelector(`span`).textContent=n,i.addEventListener(`click`,()=>{this.close(),this.callbacks.templates?.onApply(n)});let a=document.createElement(`button`);a.type=`button`,a.className=`tcw-ip-aside tcw-ip-remove`,a.tabIndex=-1,a.dataset.tplDelete=n;let o=t.r(this.t(`templates.delete`),{name:n});a.title=o,a.setAttribute(`aria-label`,o),a.innerHTML=D(`x`,12),a.addEventListener(`click`,()=>this.callbacks.templates?.onDelete(n)),r.append(i,a),e.appendChild(r)}}add(e){if(this.callbacks.onAdd(e.id)===!1||!this.liveEl)return;let n=t.r(this.t(`indicatorPicker.added`),{name:e.name});this.liveEl.textContent=this.liveEl.textContent===n?`${n}\u00a0`:n}toggleFavorite(e,t){let n=!this.favorites.has(e);if(n?this.favorites.add(e):this.favorites.delete(e),this.callbacks.onFavorite(e,n),t.setAttribute(`aria-pressed`,String(n)),this.view!==`favorites`||this.query||n)return;let r=[...this.listEl?.querySelectorAll(`.tcw-ip-star`)??[]].indexOf(t),i=document.activeElement===t;if(this.renderList(),!i)return;let a=[...this.listEl?.querySelectorAll(`.tcw-ip-star`)??[]];(a[r]??a[a.length-1]??this.searchEl)?.focus()}markCount(e){let n=this.counts.get(e.dataset.ind??``)??0,r=e.querySelector(`.tcw-ip-add`),i=e.querySelector(`.tcw-ip-count`);if(n===0){i?.remove();return}i||(i=this.tag(`tcw-ip-count`,``),r?.appendChild(i)),i.textContent=String(n),i.title=t.r(this.t(`indicatorPicker.onChart`),{count:String(n)})}tag(e,t){let n=document.createElement(`span`);return n.className=e,n.textContent=t,n}note(e){let t=document.createElement(`div`);return t.className=`tcw-ip-empty`,t.textContent=e,t}rove(e){!(e instanceof HTMLElement)||!e.classList.contains(`tcw-ip-add`)||(this.listEl?.querySelectorAll(`.tcw-ip-add[tabindex="0"]`).forEach(t=>{t!==e&&(t.tabIndex=-1)}),e.tabIndex=0)}onKeyDown(e,t){if(e.key===`Escape`){e.preventDefault(),e.stopPropagation(),this.close();return}j(e,t)}onSearchKey(e){let t=this.listEl?.querySelector(`.tcw-ip-add`);e.key===`ArrowDown`&&t?(e.preventDefault(),t.focus()):e.key===`Enter`&&this.query.trim()&&t&&(e.preventDefault(),t.click())}onNavKey(e){let t=this.views(),n=t.indexOf(this.view),r=e.key===`ArrowDown`?Math.min(t.length-1,n+1):e.key===`ArrowUp`?Math.max(0,n-1):e.key===`Home`?0:e.key===`End`?t.length-1:-1;r<0||(e.preventDefault(),this.select(t[r],!0))}onListKey(e){let t=e.target,n=t.closest(`.tcw-ip-row, .tcw-ip-save`),r=[...this.listEl?.querySelectorAll(`.tcw-ip-add`)??[]],i=n?.classList.contains(`tcw-ip-save`)?n:n?.querySelector(`.tcw-ip-add`),a=i?r.indexOf(i):-1,o=null;e.key===`ArrowDown`?o=r[a+1]:e.key===`ArrowUp`?o=a>0?r[a-1]:this.searchEl:e.key===`Home`?o=r[0]:e.key===`End`?o=r[r.length-1]:e.key===`ArrowRight`&&t===i?o=n?.querySelector(`.tcw-ip-aside`):e.key===`ArrowLeft`&&t!==i&&(o=i),o&&(e.preventDefault(),o.focus())}};function Wa(){try{return typeof localStorage<`u`?localStorage:null}catch{return null}}var Ga=e=>typeof e==`object`&&!!e&&!Array.isArray(e);function Ka(e){return Ga(e)?Object.fromEntries(Object.entries(e).filter(([,e])=>typeof e==`number`&&Number.isFinite(e)||typeof e==`string`&&!(0,n.parseIndicatorSource)(e)||typeof e==`boolean`)):{}}function qa(e){if(!Ga(e))return{};let t={};if(Array.isArray(e.colors)){let n=e.colors.filter(e=>typeof e==`string`&&e.trim()!==``);n.length>0&&(t.colors=n)}if(Array.isArray(e.lineWidths)){let n=e.lineWidths.filter(e=>typeof e==`number`&&Number.isFinite(e)&&e>0);n.length>0&&(t.lineWidths=n)}let r=(0,n.readIndicatorPlotStyles)(e.plots);return r&&(t.plots=r),t}var Ja=class{constructor(e=`tcw:indicator-defaults`,t=Wa()){this.key=e,this.storage=t}all(){let e=new Map,t;try{t=JSON.parse(this.storage?.getItem(this.key)??`{}`)}catch{return e}if(!Ga(t))return e;for(let[n,r]of Object.entries(t))Ga(r)&&e.set(n,{params:Ka(r.params),style:qa(r.style)});return e}get(e){return this.all().get(e)??null}save(e,t){if(!this.storage)return!1;let n=Object.fromEntries([...this.all(),[e,{params:Ka(t.params),style:qa(t.style)}]]);try{return this.storage.setItem(this.key,JSON.stringify(n)),!0}catch{return!1}}},Ya=1,Xa=[`logScale`,`autoScale`],Za=new Set([`timezone`,`numberLocale`]),Qa=new Set([...Xa,`chartTypeOptions`]),$a=new Set([...Xa,...Za,`scaleMode`,`invertScale`,`chartTypeOptions`]),eo=new Set([...Xa,...Za,`scaleMode`]),to=new Set,no=[`renko`,`lineBreak`,`kagi`,`pointAndFigure`,`rangeBars`];function ro(e){return no.includes(e)}function io(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>co(e)&&Object.keys(e).length>0))}function ao(){return Object.fromEntries(no.map(e=>[e,{}]))}var oo={crosshairMode:[`normal`,`magnet`,`hidden`],scaleMode:[`regular`,`logarithmic`,`percentage`,`indexedTo100`],periodLevelsPeriod:[`day`,`week`]},so={marketProfileBuckets:{min:8,max:200,whole:!0},marketProfileOpacity:{min:.05,max:1},depthHeatmapOpacity:{min:.1,max:1},pivotStrength:{min:2,max:20,whole:!0}},co=e=>typeof e==`object`&&!!e&&!Array.isArray(e);function lo(e){return e===`local`||u(e)!==null}function uo(e){try{return Intl.NumberFormat.supportedLocalesOf(e).length>0}catch{return!1}}function fo(e,t){let r=_e[e];if(e===`chartTypeOptions`)return co(t)?(0,n.readChartTypeOptions)(t):void 0;if(typeof t!=typeof r)return;if(typeof t==`number`){if(!Number.isFinite(t))return;let n=so[e];if(!n)return t;let r=Math.min(n.max,Math.max(n.min,t));return n.whole?Math.round(r):r}if(typeof t!=`string`)return t;let i=oo[e];return i?i.includes(t)?t:void 0:e===`timezone`?lo(t)?t:void 0:e===`numberLocale`?uo(t)?t:void 0:t}function G(e,t=to){if(!co(e))return{};let n={};for(let r of Object.keys(_e)){if(t.has(r)||!Object.prototype.hasOwnProperty.call(e,r))continue;let i=fo(r,e[r]);i!==void 0&&(n[r]=i)}return n}function po(e,t){return Object.fromEntries(Object.keys(e).filter(e=>!t.has(e)).map(t=>[t,e[t]]))}function mo(e,t,n){return Object.fromEntries(Object.keys(e).filter(r=>!n.has(r)&&JSON.stringify(e[r])!==JSON.stringify(t[r])).map(t=>[t,e[t]]))}function ho(e,t){return mo({...e,chartTypeOptions:io(e.chartTypeOptions)},t,eo)}function go(e){return e?(e===!0?void 0:e.key)||`tcw:chart-settings`:null}function _o(){try{return typeof localStorage<`u`?localStorage:null}catch{return null}}var vo=class{constructor(e,t=_o()){this.key=e,this.storage=t}load(){let e;try{e=JSON.parse(this.storage?.getItem(this.key)??`null`)}catch{return{}}return!co(e)||e.v!==Ya?{}:G(e.settings,Qa)}save(e,t){try{this.storage?.setItem(this.key,JSON.stringify({v:Ya,settings:mo(e,t,Qa)}))}catch{}}},yo=new Set([`timezone`,`numberLocale`,`chartTypeOptions`,`logScale`,`autoScale`]),bo=80,xo=e=>typeof e==`object`&&!!e&&!Array.isArray(e);function So(e){return G(e,yo)}function Co(e){let{overrides:t}=(0,n.readChartStyleOverrides)(e);return Object.fromEntries(Object.entries(t).filter(([e,t])=>t!==null&&T.includes(e)))}function wo(){try{return typeof localStorage<`u`?localStorage:null}catch{return null}}var To=class{constructor(e=`tcw:chart-templates`,t=wo()){this.key=e,this.storage=t}list(){let e;try{e=JSON.parse(this.storage?.getItem(this.key)??`[]`)}catch{return[]}if(!Array.isArray(e))return[];let t=[];for(let n of e)!xo(n)||typeof n.name!=`string`||!n.name.trim()||t.push({name:n.name.slice(0,bo).trim(),settings:So(n.settings),style:Co(n.style)});return t.sort((e,t)=>e.name.localeCompare(t.name))}get(e){return this.list().find(t=>t.name===e)??null}save(e,t,n){let r=e.replace(/\s+/g,` `).slice(0,bo).trim();if(!r||!this.storage)return!1;let i=[...this.list().filter(e=>e.name!==r),{name:r,settings:So(t),style:Co(n)}];try{return this.storage.setItem(this.key,JSON.stringify(i)),!0}catch{return!1}}remove(e){try{this.storage?.setItem(this.key,JSON.stringify(this.list().filter(t=>t.name!==e)))}catch{}}};function Eo(){try{return typeof localStorage<`u`?localStorage:null}catch{return null}}var Do=80;function Oo(e){let{text:t,...r}=(0,n.sanitizeDrawingStyle)(e);return r}function ko(e){let t={name:e.name,style:{...e.style}};return e.type&&(t.type=e.type),e.options&&(t.options=structuredClone(e.options)),t}var Ao=class{templates=[];constructor(e=`tcw:draw-templates`,t=Eo()){this.storageKey=e,this.storage=t,this.load()}list(e){return this.templates.filter(t=>!t.type||t.type===e).map(ko)}get(e,t){let n=this.templates.find(n=>n.name===e&&n.type===t);return n?ko(n):null}save(e,t,n){let r=e.trim().slice(0,Do);if(!r)return;let i={name:r,style:Oo(t)};n&&(i.type=n.type,i.options=structuredClone(n.options)),this.templates=this.templates.filter(e=>!(e.name===r&&e.type===i.type)),this.templates.push(i),this.persist()}remove(e,t){this.templates=this.templates.filter(n=>!(n.name===e&&n.type===t)),this.persist()}clear(){this.templates=[],this.persist()}load(){if(this.storage)try{let e=this.storage.getItem(this.storageKey);if(!e)return;let t=JSON.parse(e);if(!Array.isArray(t))return;this.templates=t.filter(e=>e&&typeof e.name==`string`&&e.name.trim()!==``).map(e=>{let t={name:e.name.trim().slice(0,Do),style:Oo(e.style)};return typeof e.type==`string`&&(t.type=e.type),e.options&&typeof e.options==`object`&&!Array.isArray(e.options)&&(t.options=e.options),t})}catch{}}persist(){if(this.storage)try{this.storage.setItem(this.storageKey,JSON.stringify(this.templates))}catch{}}},jo=class{defaults={};constructor(e=`tcw:drawing-defaults`,t=Eo()){this.storageKey=e,this.storage=t;try{let e=this.storage?.getItem(this.storageKey),t=e?JSON.parse(e):null;if(t&&typeof t==`object`&&!Array.isArray(t))for(let[e,n]of Object.entries(t))n&&typeof n==`object`&&!Array.isArray(n)&&(this.defaults[e]=n)}catch{}}all(){return structuredClone(this.defaults)}set(e,t){t&&Object.keys(t).length>0?this.defaults[e]=structuredClone(t):delete this.defaults[e];try{this.storage?.setItem(this.storageKey,JSON.stringify(this.defaults))}catch{}}},Mo=[`#4c8dff`,`#1fa874`,`#e8505b`,`#f2a93b`,`#a57cff`,`#1398a8`,`#ffffff`,`#7d8696`],No=[1,2,3,4],Po=[`solid`,`dashed`,`dotted`],Fo=class{el;templatesEl;nameInput;callbacks;store;open=!1;constructor(e,n,r,i=t.t){this.t=i,this.callbacks=n,this.store=r,this.el=document.createElement(`div`),this.el.className=`tcw-style-panel`,this.el.hidden=!0;let a=document.createElement(`div`);a.className=`tcw-style-header`;let o=document.createElement(`span`);o.textContent=this.t(`drawingStyle.title`);let s=document.createElement(`button`);s.type=`button`,s.className=`tcw-style-close`,s.setAttribute(`aria-label`,this.t(`common.close`)),s.innerHTML=D(`x`,14),s.addEventListener(`click`,()=>this.close()),a.appendChild(o),a.appendChild(s),this.el.appendChild(a),this.el.appendChild(this.colorRow()),this.el.appendChild(this.widthRow()),this.el.appendChild(this.lineStyleRow());let c=document.createElement(`div`);c.className=`tcw-style-subhead`,c.textContent=this.t(`drawingStyle.templates`),this.el.appendChild(c);let l=document.createElement(`div`);l.className=`tcw-style-save`,this.nameInput=document.createElement(`input`),this.nameInput.type=`text`,this.nameInput.placeholder=this.t(`drawingStyle.templateName`),this.nameInput.className=`tcw-style-name`;let u=document.createElement(`button`);u.type=`button`,u.className=`tcw-style-savebtn`,u.innerHTML=`${D(`plus`,13)}<span>${O(this.t(`common.save`))}</span>`,u.addEventListener(`click`,()=>this.saveTemplate()),l.appendChild(this.nameInput),l.appendChild(u),this.el.appendChild(l),this.templatesEl=document.createElement(`div`),this.templatesEl.className=`tcw-style-templates`,this.el.appendChild(this.templatesEl),e.appendChild(this.el),this.renderTemplates()}isOpen(){return this.open}toggle(){this.open?this.close():this.openPanel()}openPanel(){this.open=!0,this.el.hidden=!1,this.syncActiveControls(),this.renderTemplates()}close(){this.open=!1,this.el.hidden=!0}destroy(){this.el.remove()}colorRow(){let e=document.createElement(`div`);e.className=`tcw-style-row tcw-style-colors`;for(let t of Mo){let n=document.createElement(`button`);n.type=`button`,n.className=`tcw-style-swatch`,n.style.background=t,n.dataset.color=t,n.setAttribute(`aria-label`,t),n.addEventListener(`click`,()=>this.applyStyle({color:t})),e.appendChild(n)}let t=document.createElement(`input`);return t.type=`color`,t.className=`tcw-style-picker`,t.addEventListener(`input`,()=>this.applyStyle({color:t.value})),e.appendChild(t),e}widthRow(){let e=document.createElement(`div`);e.className=`tcw-style-row tcw-style-widths`;for(let t of No){let n=document.createElement(`button`);n.type=`button`,n.className=`tcw-style-width`,n.dataset.width=String(t);let r=document.createElement(`span`);r.style.height=`${t}px`,n.appendChild(r),n.addEventListener(`click`,()=>this.applyStyle({lineWidth:t})),e.appendChild(n)}return e}lineStyleRow(){let e=document.createElement(`div`);e.className=`tcw-style-row tcw-style-dashes`;for(let t of Po){let n=document.createElement(`button`);n.type=`button`,n.className=`tcw-style-dash`,n.dataset.linestyle=t,n.textContent=t===`solid`?`──`:t===`dashed`?`╌╌`:`┄┄`,n.title=t,n.addEventListener(`click`,()=>this.applyStyle({lineStyle:t})),e.appendChild(n)}return e}applyStyle(e){this.callbacks.onStyleChange(e),this.syncActiveControls()}syncActiveControls(){let e=this.callbacks.getStyle();this.el.querySelectorAll(`.tcw-style-swatch`).forEach(t=>{t.classList.toggle(`tcw-on`,t.dataset.color?.toLowerCase()===e.color?.toLowerCase())}),this.el.querySelectorAll(`.tcw-style-width`).forEach(t=>{t.classList.toggle(`tcw-on`,Number(t.dataset.width)===e.lineWidth)}),this.el.querySelectorAll(`.tcw-style-dash`).forEach(t=>{t.classList.toggle(`tcw-on`,t.dataset.linestyle===e.lineStyle)})}saveTemplate(){let e=this.nameInput.value.trim();e&&(this.store.save(e,this.callbacks.getStyle()),this.nameInput.value=``,this.renderTemplates())}renderTemplates(){this.templatesEl.replaceChildren();let e=this.store.list();if(e.length===0){let e=document.createElement(`div`);e.className=`tcw-style-empty`,e.textContent=this.t(`drawingStyle.noTemplates`),this.templatesEl.appendChild(e);return}for(let t of e){let e=document.createElement(`div`);e.className=`tcw-style-template`;let n=document.createElement(`button`);n.type=`button`,n.className=`tcw-style-apply`;let r=document.createElement(`span`);r.className=`tcw-style-tdot`,r.style.background=t.style.color??`var(--tcw-text-muted)`;let i=document.createElement(`span`);i.textContent=t.name,n.appendChild(r),n.appendChild(i),n.addEventListener(`click`,()=>{this.callbacks.onStyleChange({...t.style}),this.syncActiveControls()});let a=document.createElement(`button`);a.type=`button`,a.className=`tcw-style-tdel`,a.setAttribute(`aria-label`,this.t(`drawingStyle.deleteTemplate`)),a.innerHTML=D(`trash`,13),a.addEventListener(`click`,()=>{this.store.remove(t.name),this.renderTemplates()}),e.appendChild(n),e.appendChild(a),this.templatesEl.appendChild(e)}}},Io=10,K=4,Lo=4,Ro=20,zo=/^(#[0-9a-f]{3,8}|(rgb|hsl)a?\([\d\s.,%/+-]+\)|[a-z]+)$/i;function Bo(e){return typeof e==`string`&&zo.test(e.trim())?e.trim():`#7d8696`}function Vo(e){let t=Number(e);return Number.isFinite(t)&&t>0?Math.min(t,Ro):1}function Ho(e){return Po.includes(e)?e:`solid`}var Uo=class{el;pop;target=null;built=``;size=null;openPop=null;pinned=null;drag=null;onDragMove=e=>{!this.drag||!this.target||e.pointerId!==this.drag.id||(this.pinned={left:this.drag.left+e.clientX-this.drag.x,top:this.drag.top+e.clientY-this.drag.y},this.place(this.target))};onDragEnd=e=>{e&&this.drag&&e.pointerId!==this.drag.id||(this.drag=null,document.removeEventListener(`pointermove`,this.onDragMove),document.removeEventListener(`pointerup`,this.onDragEnd),document.removeEventListener(`pointercancel`,this.onDragEnd))};onDocDown=e=>{this.openPop&&!this.el.contains(e.target)&&!this.pop.contains(e.target)&&this.closePop()};constructor(e,n,r=t.t){this.host=e,this.callbacks=n,this.t=r,this.el=document.createElement(`div`),this.el.className=`tcw-sel-toolbar`,this.el.setAttribute(`role`,`toolbar`),this.el.setAttribute(`aria-label`,r(`selectionToolbar.label`)),this.el.hidden=!0,this.pop=document.createElement(`div`),this.pop.className=`tcw-sel-pop`,this.pop.setAttribute(`role`,`dialog`),this.pop.hidden=!0,e.append(this.el,this.pop),this.el.addEventListener(`click`,e=>this.onClick(e)),this.el.addEventListener(`keydown`,e=>this.onKey(e)),this.pop.addEventListener(`click`,e=>this.onPick(e)),this.pop.addEventListener(`keydown`,e=>this.onPopKey(e));for(let e of[this.el,this.pop])e.addEventListener(`pointerdown`,e=>e.stopPropagation());this.el.addEventListener(`pointerdown`,e=>{e.target.closest(`.tcw-sel-grip`)&&(e.preventDefault(),this.closePop(),this.drag={id:e.pointerId,x:e.clientX,y:e.clientY,left:parseFloat(this.el.style.left)||0,top:parseFloat(this.el.style.top)||0},document.addEventListener(`pointermove`,this.onDragMove),document.addEventListener(`pointerup`,this.onDragEnd),document.addEventListener(`pointercancel`,this.onDragEnd))}),this.el.addEventListener(`dblclick`,e=>{!e.target.closest(`.tcw-sel-grip`)||!this.target||(this.pinned=null,this.place(this.target))}),document.addEventListener(`pointerdown`,this.onDocDown,!0)}isOpen(){return!this.el.hidden}show(e){this.target=e;let t=e.style,n=[Bo(t.color),Vo(t.lineWidth),Ho(t.lineStyle),e.locked,e.canDelete,e.canSettings,e.canAlert].join(`|`);n!==this.built&&(this.built=n,this.render(e),this.size=null),this.el.hidden=!1,this.size||={w:this.el.offsetWidth,h:this.el.offsetHeight},this.place(e),this.openPop&&this.placePop()}hide(){this.closePop(),this.el.hidden=!0,this.target=null}destroy(){this.onDragEnd(),document.removeEventListener(`pointerdown`,this.onDocDown,!0),this.el.remove(),this.pop.remove()}render(e){let t=this.t,n=Bo(e.style.color),r=Vo(e.style.lineWidth),i=Ho(e.style.lineStyle),a=e.locked,o=this.el.contains(document.activeElement)?document.activeElement.dataset.action:void 0,s=(e,t,n,r=``)=>`<button type="button" class="tcw-sel-btn${r}" data-action="${e}" aria-label="${O(t)}" title="${O(t)}">${n}</button>`,c=(e,t,n)=>s(e,t,n,` tcw-sel-has-pop`).replace(`<button `,`<button aria-haspopup="dialog" aria-expanded="false" `);this.el.innerHTML=[`<span class="tcw-sel-grip" aria-hidden="true"></span>`,c(`color`,t(`drawingSettings.color`),`<span class="tcw-sel-color" style="background:${O(n)}"></span>`),c(`width`,t(`drawingSettings.lineWidth`),`<span class="tcw-sel-width" style="--w:${r}px"></span><span class="tcw-sel-num">${r}px</span>`),c(`lineStyle`,t(`drawingSettings.lineStyle`),Wo(i)),`<span class="tcw-sel-sep" aria-hidden="true"></span>`,e.canSettings?s(`settings`,t(`legend.settings`),D(`settings`,15)):``,e.canAlert?s(`alert`,t(`drawingSettings.addAlert`),D(`bell`,15)):``,s(`lock`,t(a?`common.unlock`:`common.lock`),D(a?`lock`:`unlock`,15),a?` tcw-sel-on`:``).replace(`<button `,`<button aria-pressed="${a}" `),s(`more`,t(`legend.more`),D(`more`,15)),e.canDelete?s(`delete`,t(`drawingMenu.delete`),D(`trash`,15),` tcw-sel-danger`):``].join(``);let l=this.buttons(),u=l.find(e=>e.dataset.action===o)??(o?l.find(e=>e.dataset.action===`lock`):void 0);this.rove(u??l[0],u!==void 0)}buttons(){return[...this.el.querySelectorAll(`button`)]}rove(e,t){for(let t of this.buttons())t.tabIndex=t===e?0:-1;t&&e?.focus()}place(e){let{rect:t,bounds:n}=e,{w:r,h:i}=this.size??{w:0,h:0};if(this.pinned){let e=Math.max(n.x+K,Math.min(this.pinned.left,n.x+n.width-r-K)),t=Math.max(n.y+K,Math.min(this.pinned.top,n.y+n.height-i-K));this.el.style.left=`${Math.round(e)}px`,this.el.style.top=`${Math.round(t)}px`;return}let a=t.x+t.width/2-r/2;a=Math.max(n.x+K,Math.min(a,n.x+n.width-r-K));let o=t.y-i-Io;o<n.y+K&&(o=Math.min(t.y+t.height+Io,n.y+n.height-i-K)),o=Math.max(o,n.y+K),this.el.style.left=`${Math.round(a)}px`,this.el.style.top=`${Math.round(o)}px`}onClick(e){let t=e.target.closest(`[data-action]`);if(!t)return;this.rove(t,!1);let n=t.dataset.action;if(n===`color`||n===`width`||n===`lineStyle`){this.openPop===n?this.closePop():this.openPopover(n,t);return}if(this.closePop(),n===`settings`)this.callbacks.onSettings();else if(n===`alert`)this.callbacks.onAlert();else if(n===`lock`)this.callbacks.onLock(!this.target?.locked);else if(n===`delete`)this.callbacks.onDelete();else if(n===`more`){let e=t.getBoundingClientRect(),n=this.host.getBoundingClientRect();this.callbacks.onMore(e.left-n.left,e.bottom-n.top+K)}}onKey(e){if(e.key===`Escape`&&this.openPop){e.stopPropagation(),this.closePop(!0);return}let t=this.buttons(),n=t.indexOf(document.activeElement);if(n<0)return;let r=e.key===`ArrowRight`?(n+1)%t.length:e.key===`ArrowLeft`?(n-1+t.length)%t.length:e.key===`Home`?0:e.key===`End`?t.length-1:-1;r<0||(e.preventDefault(),this.rove(t[r],!0))}openPopover(e,t){let n=this.target.style,r=Bo(n.color).toLowerCase(),i=Vo(n.lineWidth),a=Ho(n.lineStyle),o=(e,t,n,r=``)=>`<button type="button" class="${e}${t?` tcw-sel-on`:``}" aria-pressed="${t}" ${n}>${r}</button>`;this.openPop=e,e===`color`?this.pop.innerHTML=Mo.map(e=>o(`tcw-sel-swatch`,e.toLowerCase()===r,`data-color="${e}" style="background:${e}" aria-label="${e}"`)).join(``):e===`width`?this.pop.innerHTML=No.map(e=>o(`tcw-sel-option`,e===i,`data-width="${e}"`,`<span class="tcw-sel-width" style="--w:${e}px"></span>${e}px`)).join(``):this.pop.innerHTML=Po.map(e=>o(`tcw-sel-option`,e===a,`data-style="${e}"`,Wo(e)+O(this.t(`drawingSettings.lineStyle.${e}`)))).join(``),this.pop.className=`tcw-sel-pop tcw-sel-pop--${e}`,this.pop.setAttribute(`aria-label`,t.getAttribute(`aria-label`)??``),this.pop.hidden=!1;for(let e of this.el.querySelectorAll(`[aria-expanded="true"]`))e.setAttribute(`aria-expanded`,`false`);t.setAttribute(`aria-expanded`,`true`),this.placePop(),this.pop.querySelector(`.tcw-sel-on, button`)?.focus()}onPopKey(e){if(e.key===`Escape`){e.stopPropagation(),this.closePop(!0);return}let t=[...this.pop.querySelectorAll(`button`)],n=t.indexOf(document.activeElement);if(n<0)return;let r=this.openPop===`color`?Lo:1,i=e.key===`ArrowRight`?1:e.key===`ArrowLeft`?-1:e.key===`ArrowDown`?r:e.key===`ArrowUp`?-r:0;i&&(e.preventDefault(),t[(n+i+t.length)%t.length].focus())}placePop(){let e=this.el.querySelector(`[data-action="${this.openPop}"]`);e&&(this.pop.style.left=`${this.el.offsetLeft+e.offsetLeft}px`,this.pop.style.top=`${this.el.offsetTop+this.el.offsetHeight+6}px`)}onPick(e){let t=e.target.closest(`button`);t&&(t.dataset.color?this.callbacks.onStyle({color:t.dataset.color}):t.dataset.width?this.callbacks.onStyle({lineWidth:Number(t.dataset.width)}):t.dataset.style&&this.callbacks.onStyle({lineStyle:Ho(t.dataset.style)}),this.closePop(!0))}closePop(e=!1){if(!this.openPop)return;let t=this.el.querySelector(`[data-action="${this.openPop}"]`);t?.setAttribute(`aria-expanded`,`false`),this.openPop=null,this.pop.hidden=!0,e&&t?.focus()}};function Wo(e){return`<svg class="tcw-sel-line" width="22" height="10" viewBox="0 0 22 10" aria-hidden="true"><line x1="1" y1="5" x2="21" y2="5" stroke="currentColor" stroke-width="2"${e===`dashed`?` stroke-dasharray="4 3"`:e===`dotted`?` stroke-dasharray="1 3" stroke-linecap="round"`:``}/></svg>`}var Go=[1,2,3,4],Ko=[`solid`,`dashed`,`dotted`],qo=[10,11,12,14,16,18,20,24,28,32],Jo=48,Yo=.5,Xo=.1,Zo=[`leftEnd`,`rightEnd`];function Qo(e,t,n){let r=`drawingOption.${t}`,i=e(r);return i===r?n:i}function $o(){let e=document.createElement(`div`);return e.className=`tcw-settings-section`,e}function es(e,...t){let n=document.createElement(`div`);n.className=`tcw-settings-row`;let r=document.createElement(`span`);r.className=`tcw-settings-label`,r.textContent=e;let i=document.createElement(`span`);return i.className=`tcw-indi-plot-controls`,i.append(...t),n.append(r,i),n}function q(e,t){return e.setAttribute(`aria-label`,t),e}function ts(e,t,n,r){let i=[],a=$o();a.appendChild(ns(t.style(),n,i,r));let o=Zo.filter(e=>t.defs[e]?.kind===`choice`);o.length>0&&a.appendChild(es(r(`drawingSettings.lineEnds`),...o.map(e=>q(P([{value:`normal`,label:r(`drawingSettings.lineEnd.normal`)},{value:`arrow`,label:r(`drawingSettings.lineEnd.arrow`)}],String(t.options()[e]??`normal`),t=>n.options({[e]:t})),Qo(r,e,t.defs[e].label))))),t.fill&&a.appendChild(rs(t.style(),n,i,r)),e.appendChild(a);let s=Object.entries(t.defs).filter(([e,t])=>t.kind!==`levels`&&!o.includes(e));if(s.length>0){let i=$o();for(let[e,a]of s)i.appendChild(is(e,a,t.options(),n,r));e.appendChild(i)}for(let[a,o]of Object.entries(t.defs))o.kind===`levels`&&e.appendChild(as(a,o,t,n,i,r))}function ns(e,t,n,r){let i=q(Cn(e.color,e=>{t.style({color:e});for(let t of n)t(e)}),r(`drawingSettings.color`)),a=q(P(Go.map(e=>({value:String(e),label:`${e} px`})),String(e.lineWidth),e=>t.style({lineWidth:Number(e)})),r(`drawingSettings.lineWidth`)),o=q(P(Ko.map(e=>({value:e,label:r(`drawingSettings.lineStyle.${e}`)})),e.lineStyle,e=>t.style({lineStyle:e})),r(`drawingSettings.lineStyle`));return es(r(`drawingSettings.line`),i,a,o)}function rs(e,t,n,r){let i=e.fillColor??En(e.color,Xo),a=F(i),o=Tn(i),s=e.fillColor!==void 0,c=()=>{s=!0,t.style({fillColor:En(a,o),fillOpacity:o})},l=q(Cn(a,e=>{a=e,c()}),r(`drawingSettings.fill`));n.push(e=>{s||(a=F(e),l.value=a)});let u=q(N(Math.round(o*100),{min:0,max:100,step:5},e=>{o=e/100,c()}),r(`drawingSettings.opacity`)),d=document.createElement(`span`);return d.className=`tcw-unit`,d.setAttribute(`aria-hidden`,`true`),d.textContent=`%`,es(r(`drawingSettings.fill`),l,u,d)}function is(e,t,n,r,i){let a=Qo(i,e,t.label),o=n[e];switch(t.kind){case`boolean`:return xn(a,!!o,t=>r.options({[e]:t}));case`number`:return M(a,N(Number(o),{min:t.min,max:t.max,step:t.step},t=>r.options({[e]:t})));case`choice`:return M(a,P(t.choices.map(t=>({value:t.value,label:Qo(i,`${e}.${t.value}`,t.label)})),String(o),t=>r.options({[e]:t})));case`text`:{let t=document.createElement(`input`);return t.type=`text`,t.className=`tcw-indi-input`,t.value=String(o??``),t.addEventListener(`change`,()=>r.options({[e]:t.value})),M(a,t)}}}function as(e,t,n,r,i,a){let o=document.createElement(`div`);o.className=`tcw-settings-section tcw-levels-editor`;let s=document.createElement(`div`);s.className=`tcw-settings-section-title`,s.textContent=Qo(a,e,t.label),o.appendChild(s);let c=()=>{let t=n.options()[e];return Array.isArray(t)?t:[]},l=t=>r.options({[e]:t}),u=document.createElement(`div`);u.className=`tcw-levels-grid`,c().forEach((e,t)=>{let o=document.createElement(`div`);o.className=`tcw-level-row`;let s=` ${t+1}`,d=document.createElement(`input`);d.type=`checkbox`,d.checked=e.visible,d.setAttribute(`aria-label`,a(`drawingSettings.levelVisible`)+s),d.addEventListener(`change`,()=>l(c().map((e,n)=>n===t?{...e,visible:d.checked}:e)));let f=q(N(e.value,{step:.001},e=>l(c().map((n,r)=>r===t?{...n,value:e}:n))),a(`drawingSettings.levelValue`)+s),p=q(Cn(e.color??n.style().color,e=>l(c().map((n,r)=>r===t?{...n,color:e}:n))),a(`drawingSettings.levelColor`)+s);i.push(e=>{c()[t]?.color===void 0&&(p.value=F(e))});let m=document.createElement(`button`);m.type=`button`,m.className=`tcw-level-remove`,m.setAttribute(`aria-label`,a(`drawingSettings.removeLevel`)+s),m.innerHTML=D(`x`,12),m.addEventListener(`click`,()=>{l(c().filter((e,n)=>n!==t)),r.redraw([`.tcw-level-row:nth-child(${t+1}) .tcw-level-remove`,`.tcw-level-row:last-child .tcw-level-remove`,`.tcw-level-add`])}),o.append(d,f,p,m),u.appendChild(o)}),o.appendChild(u);let d=document.createElement(`button`);return d.type=`button`,d.className=`tcw-reset-link tcw-level-add`,d.textContent=a(`drawingSettings.addLevel`),d.disabled=c().length>=Jo,d.addEventListener(`click`,()=>{let e=c().at(-1)?.value??0;l([...c(),{value:Math.round((e+Yo)*1e3)/1e3,visible:!0}]),r.redraw([`.tcw-level-row:last-child input[type="number"]`])}),o.appendChild(d),o}function os(e,t,n,r){let i=$o(),a=document.createElement(`textarea`);a.className=`tcw-indi-input tcw-drawing-text`,a.rows=3,a.value=t.text??``,a.addEventListener(`input`,()=>n({text:a.value}));let o=M(r(`drawingSettings.text`),a);o.classList.add(`tcw-text-row`),i.appendChild(o),i.appendChild(M(r(`drawingSettings.fontSize`),P(qo.map(e=>({value:String(e),label:`${e} px`})),String(t.fontSize??12),e=>n({fontSize:Number(e)})))),e.appendChild(i)}function ss(e,n,r,i){let a=$o();n.forEach((e,n)=>{let o=t.r(i(`drawingSettings.point`),{n:n+1}),s=r.toWallTime(e.time),c=document.createElement(`input`);c.type=`date`,c.className=`tcw-indi-input`,c.value=s.date;let l=document.createElement(`input`);l.type=`time`,l.className=`tcw-indi-input`,l.value=s.time;let u=()=>{let e=r.fromWallTime(c.value,l.value);e!==null&&r.move(n,{time:e})};c.addEventListener(`change`,u),l.addEventListener(`change`,u);let d=es(o,q(cs(e.price,r,e=>r.move(n,{price:e})),`${o}: ${i(`drawingSettings.price`)}`),q(c,`${o}: ${i(`drawingSettings.date`)}`),q(l,`${o}: ${i(`drawingSettings.time`)}`));d.classList.add(`tcw-draw-point`),a.appendChild(d)}),e.appendChild(a)}function cs(e,t,n){let r=t.roundPrice??(e=>e),i=t.priceStep?.(),a=N(r(e),{step:i!==void 0&&i>0?i:`any`},e=>{let t=r(e);a.value=String(t),n(t)});return a}var ls=12,us=`t:`,ds=1,fs=class{backdrop;modal;titleEl;tabsEl;bodyEl;templateBtn;menu=null;tabButtons=[];target=null;style;options={};anchors=[];intervals=null;tab=`style`;returnFocus=null;uid=ds++;constructor(e,n,r=t.t){this.callbacks=n,this.t=r,this.backdrop=document.createElement(`div`),this.backdrop.className=`tcw-modal-backdrop`,this.backdrop.hidden=!0;let i=!1;this.backdrop.addEventListener(`pointerdown`,e=>{i=e.target===this.backdrop}),this.backdrop.addEventListener(`click`,e=>{e.target===this.backdrop&&i&&this.close(!0),i=!1}),this.modal=document.createElement(`div`),this.modal.className=`tcw-modal tcw-modal-narrow tcw-drawing-settings`,this.modal.setAttribute(`role`,`dialog`),this.modal.setAttribute(`aria-modal`,`true`),this.modal.setAttribute(`aria-labelledby`,`tcw-draw-title-${this.uid}`),this.modal.tabIndex=-1,this.modal.addEventListener(`keydown`,e=>this.onKeyDown(e));let a=document.createElement(`div`);a.className=`tcw-modal-header`,this.titleEl=document.createElement(`h3`),this.titleEl.id=`tcw-draw-title-${this.uid}`;let o=document.createElement(`button`);o.type=`button`,o.className=`tcw-modal-close`,o.setAttribute(`aria-label`,this.t(`common.close`)),o.innerHTML=D(`x`,16),o.addEventListener(`click`,()=>this.close(!0)),a.append(this.titleEl,o),this.tabsEl=document.createElement(`div`),this.tabsEl.className=`tcw-modal-tabs`,this.tabsEl.setAttribute(`role`,`tablist`),this.tabsEl.addEventListener(`keydown`,e=>this.onTabKey(e)),this.bodyEl=document.createElement(`div`),this.bodyEl.className=`tcw-modal-body`,this.bodyEl.id=`tcw-draw-panel-${this.uid}`,this.bodyEl.setAttribute(`role`,`tabpanel`),this.templateBtn=this.footerButton(`template`,`tcw-footer-menu`,()=>this.openTemplates()),this.modal.append(a,this.tabsEl,this.bodyEl,this.buildFooter()),this.backdrop.appendChild(this.modal),e.appendChild(this.backdrop)}buildFooter(){this.templateBtn.setAttribute(`aria-haspopup`,`menu`),this.templateBtn.setAttribute(`aria-expanded`,`false`),this.templateBtn.innerHTML=`<span></span>${D(`chevronDown`,12)}`,this.templateBtn.querySelector(`span`).textContent=this.t(`settings.template`);let e=document.createElement(`div`);e.className=`tcw-footer-end`,e.append(this.footerButton(`cancel`,`tcw-footer-cancel`,()=>this.close(!0),this.t(`common.cancel`)),this.footerButton(`ok`,`tcw-done-btn`,()=>this.close(!1),this.t(`drawingSettings.ok`)));let t=document.createElement(`div`);return t.className=`tcw-modal-footer`,t.append(this.templateBtn,e),t}open(e){this.target&&this.close(!1),this.returnFocus=document.activeElement instanceof HTMLElement?document.activeElement:null,this.target=e,this.style={...e.style},this.options=structuredClone(e.options),this.anchors=e.anchors.map(e=>({...e})),this.intervals=e.intervals??null,this.titleEl.textContent=e.name,this.tab=`style`,this.callbacks.onBegin(e.id);try{this.renderTabs(),this.renderBody()}catch(t){throw this.target=null,this.callbacks.onEnd(e.id,!0),t}this.backdrop.hidden=!1,(this.tabButtons[0]??this.modal).focus()}close(e){let t=this.target;if(!t)return;let n=document.activeElement;!e&&(n instanceof HTMLInputElement||n instanceof HTMLTextAreaElement)&&this.modal.contains(n)&&n.dispatchEvent(new Event(`change`)),this.target=null,this.menu?.close(),this.backdrop.hidden=!0,this.callbacks.onEnd(t.id,e),this.returnFocus?.isConnected&&this.returnFocus.focus(),this.returnFocus=null}isOpen(){return this.target!==null}editing(){return this.target?.id??null}destroy(){this.close(!0),this.menu?.destroy(),this.backdrop.remove()}tabs(){let e=this.target;return e?[`style`,...e.text?[`text`]:[],...e.anchors.length<=ls?[`coordinates`]:[],`visibility`]:[]}renderTabs(){this.tabButtons=this.tabs().map(e=>{let t=document.createElement(`button`);return t.type=`button`,t.className=`tcw-modal-tab`,t.id=`tcw-draw-tab-${this.uid}-${e}`,t.setAttribute(`role`,`tab`),t.setAttribute(`aria-controls`,this.bodyEl.id),t.dataset.tab=e,t.textContent=this.t(`drawingSettings.tab.${e}`),t.addEventListener(`click`,()=>this.selectTab(e)),t}),this.tabsEl.replaceChildren(...this.tabButtons),this.markTabs()}markTabs(){for(let e of this.tabButtons){let t=e.dataset.tab===this.tab;e.classList.toggle(`tcw-active`,t),e.setAttribute(`aria-selected`,String(t)),e.tabIndex=t?0:-1,t&&this.bodyEl.setAttribute(`aria-labelledby`,e.id)}}selectTab(e,t=!1){this.tab=e,this.markTabs(),this.renderBody(),t&&this.tabButtons.find(t=>t.dataset.tab===e)?.focus()}onTabKey(e){let t=this.tabButtons.map(e=>e.dataset.tab),n=t.indexOf(this.tab),[r,i]=this.modal.closest(`[dir]`)?.getAttribute(`dir`)===`rtl`?[`ArrowLeft`,`ArrowRight`]:[`ArrowRight`,`ArrowLeft`],a=e.key===r?(n+1)%t.length:e.key===i?(n-1+t.length)%t.length:e.key===`Home`?0:e.key===`End`?t.length-1:-1;a<0||(e.preventDefault(),this.selectTab(t[a],!0))}onKeyDown(e){if(e.key===`Escape`){e.preventDefault(),e.stopPropagation(),this.close(!0);return}j(e,this.modal)}renderBody(){this.bodyEl.replaceChildren();let e=this.target;if(e)switch(this.tab){case`text`:os(this.bodyEl,this.style,e=>this.setStyle(e),this.t);break;case`coordinates`:ss(this.bodyEl,this.anchors,{toWallTime:this.callbacks.toWallTime,fromWallTime:this.callbacks.fromWallTime,roundPrice:this.callbacks.roundPrice,priceStep:this.callbacks.priceStep,move:(e,t)=>this.setAnchor(e,t)},this.t);break;case`visibility`:wa(this.bodyEl,this.intervals,e=>this.setIntervals(e),this.t);break;default:ts(this.bodyEl,{style:()=>this.style,options:()=>this.options,defs:e.defs,fill:e.fill},{style:e=>this.setStyle(e),options:e=>this.setOptions(e),redraw:(e=[])=>{this.renderBody();for(let t of e){let e=this.bodyEl.querySelector(t);if(e){e.focus();break}}}},this.t)}}change(e){this.target&&this.callbacks.onChange(this.target.id,e)}setStyle(e){this.target&&(this.style={...this.style,...e},this.change({style:e}))}setOptions(e){this.target&&(this.options={...this.options,...structuredClone(e)},this.change({options:e}))}setAnchor(e,t){this.target&&(this.anchors=this.anchors.map((n,r)=>r===e?{...n,...t}:n),this.change({anchors:this.anchors.map(e=>({...e}))}))}setIntervals(e){this.target&&(this.intervals=e,this.change({intervals:e}))}openTemplates(){let e=this.target;if(!e)return;if(this.menu?.isOpen()){this.menu.close();return}let n=this.callbacks.templates,r=n?.list(e.type)??[],i=[...r.map((e,n)=>({id:`${us}${n}`,label:e.name,icon:`layers`,remove:t.r(this.t(`templates.delete`),{name:e.name})})),...r.length>0?[`separator`]:[],...n?[{id:`save`,label:this.t(`settings.saveTemplate`),icon:`save`}]:[],...this.callbacks.onSaveDefault?[{id:`default`,label:this.t(`drawingSettings.saveDefault`),icon:`pin`}]:[],{id:`reset`,label:this.t(`settings.resetToDefaults`),icon:`reset`}],a=e=>r[Number(e.slice(2))];this.menu??=new k(this.modal,this.t(`settings.template`));let o=this.templateBtn.getBoundingClientRect(),s=this.modal.getBoundingClientRect();this.menu.open(i,o.left-s.left,o.top-s.top,t=>{t===`save`?n?.save({type:e.type,style:{...this.style},options:structuredClone(this.options)}):t===`default`?this.callbacks.onSaveDefault?.(e.type,structuredClone(this.options)):t===`reset`?this.resetOptions():t.startsWith(us)&&this.applyTemplate(a(t))},this.templateBtn,e=>{let t=a(e);t&&n?.remove(t.name,t.type)})}applyTemplate(e){let t=this.target;!e||!t||(Object.keys(e.style).length>0&&this.setStyle(e.style),e.options&&this.setOptions((0,n.sanitizeDrawingOptions)(t.defs,e.options)),this.renderBody())}resetOptions(){let e=this.target;if(!e)return;let t={};for(let[n,r]of Object.entries(e.defs))t[n]=structuredClone(r.default);this.setOptions(t),this.renderBody()}footerButton(e,t,n,r){let i=document.createElement(`button`);return i.type=`button`,i.className=t,i.dataset.act=e,r&&(i.textContent=r),i.addEventListener(`click`,n),i}};function ps(e,t){let{selected:n}=e,r=n.length===1,i=new Set(n.map(e=>e.groupId)),a=i.size===1&&!i.has(null),o=[];e.canConfigure&&r&&o.push({id:`settings`,label:t(`drawingMenu.settings`),icon:`settings`}),e.canAlert&&r&&o.push({id:`alert`,label:t(`drawingSettings.addAlert`),icon:`bell`}),o.length>0&&o.push(`separator`),r&&o.push({id:`front`,label:t(`drawingMenu.front`)},{id:`forward`,label:t(`drawingMenu.forward`)},{id:`backward`,label:t(`drawingMenu.backward`)},{id:`back`,label:t(`drawingMenu.back`)},`separator`),n.length>1&&!a&&o.push({id:`group`,label:t(`drawingMenu.group`),icon:`layers`}),n.some(e=>e.groupId)&&o.push({id:`ungroup`,label:t(`drawingMenu.ungroup`),icon:`layers`});let s=n.every(e=>e.locked);return o.push(s?{id:`unlock`,label:t(`common.unlock`),icon:`unlock`}:{id:`lock`,label:t(`common.lock`),icon:`lock`},{id:`hide`,label:t(`common.hide`),icon:`eyeOff`}),r&&o.push({id:`duplicate`,label:t(`drawingMenu.duplicate`),icon:`plus`}),s||o.push(`separator`,{id:`delete`,label:t(`drawingMenu.delete`),icon:`trash`,danger:!0}),o}var ms=[{id:`regularScale`,mode:`regular`,label:`settings.scale.regular`},{id:`logScale`,mode:`logarithmic`,label:`settings.scale.logarithmic`},{id:`percentScale`,mode:`percentage`,label:`settings.scale.percentage`},{id:`indexedScale`,mode:`indexedTo100`,label:`settings.scale.indexedTo100`}],hs=[{action:`resetView`,keys:`Alt+R`,feature:`hotkeys.resetView`},{action:`invertScale`,keys:`Alt+I`,feature:`hotkeys.invertScale`},{action:`goToDate`,keys:`Alt+G`,feature:`hotkeys.goToDate`}];function gs(e){return ms.find(t=>t.id===e)?.mode}function _s(...e){return e.filter(e=>e.length>0).flatMap((e,t)=>t===0?[...e]:[`separator`,...e])}function vs(e,t){let n=t.keys[e.id];return n?{...e,shortcut:n}:e}function ys(e,n){if(e.price===void 0||!Number.isFinite(e.price))return[];let r=e.formatPrice(e.price),i=[];if(e.canAlert&&i.push({id:`alert`,label:t.r(n(`chartMenu.addAlert`),{price:r}),icon:`bell`}),e.canTrade){let a=e.lastPrice===null||e.price<=e.lastPrice;i.push(a?{id:`buyLimit`,label:t.r(n(`chartMenu.buyLimit`),{price:r}),icon:`trendingUp`}:{id:`buyStop`,label:t.r(n(`chartMenu.buyStop`),{price:r}),icon:`trendingUp`},a?{id:`sellStop`,label:t.r(n(`chartMenu.sellStop`),{price:r}),icon:`trendingDown`}:{id:`sellLimit`,label:t.r(n(`chartMenu.sellLimit`),{price:r}),icon:`trendingDown`}),e.canOrderTicket&&i.push({id:`orderTicket`,label:n(`chartMenu.orderTicket`),icon:`receipt`})}return e.canDraw&&i.push({id:`horizontalLine`,label:t.r(n(`chartMenu.horizontalLine`),{price:r}),icon:`minus`}),i}var bs=e=>({id:`settings`,label:e(`chartMenu.settings`),icon:`settings`});function xs(e,t){let n=[vs({id:`resetView`,label:t(`chartMenu.resetView`)},e)];e.canPaste&&n.push({id:`paste`,label:t(`chartMenu.paste`)});let r=[];e.hasDrawings&&r.push(e.drawingsHidden?{id:`showDrawings`,label:t(`chartMenu.showDrawings`),icon:`eye`}:{id:`hideDrawings`,label:t(`chartMenu.hideDrawings`),icon:`eyeOff`},{id:`removeDrawings`,label:t(`chartMenu.removeDrawings`),icon:`trash`,danger:!0}),e.hasIndicators&&r.push({id:`removeIndicators`,label:t(`chartMenu.removeIndicators`),icon:`trash`,danger:!0});let i=e.canExport?[{id:`exportData`,label:t(`chartMenu.exportData`),icon:`save`}]:[];return _s(ys(e,t),n,r,[...i,bs(t)])}function Ss(e,t){let n=[{id:`resetPriceScale`,label:t(`chartMenu.resetPriceScale`)},{id:`autoScale`,label:t(`settings.autoScale`),checked:e.autoScale},vs({id:`invertScale`,label:t(`chartMenu.invertScale`),checked:e.inverted},e),{id:`leftScale`,label:t(`settings.leftScale`),checked:e.leftScale}],r=ms.filter(t=>t.mode!==`logarithmic`||e.canLog).map(n=>({id:n.id,label:t(n.label),radio:!0,checked:e.scaleMode===n.mode})),i=[{id:`indicatorValueLabels`,label:t(`settings.indicatorValues`),checked:e.labels.values}];e.labels.countdown!==void 0&&i.push({id:`barCountdown`,label:t(`settings.barCountdown`),checked:e.labels.countdown});let a=[{id:`highLowLines`,label:t(`settings.highLowLines`),checked:e.lines.highLow},{id:`lastPriceLine`,label:t(`chartMenu.lastPriceLine`),checked:e.lines.lastPrice}];return _s(n,r,[{id:`labels`,label:t(`chartMenu.labels`),submenu:i},{id:`lines`,label:t(`chartMenu.lines`),submenu:a}],ys({...e,canTrade:!1,canDraw:!1},t),[bs(t)])}function Cs(e,t){let n=[vs({id:`resetView`,label:t(`chartMenu.resetTimeScale`)},e)];e.canGoToDate&&n.push(vs({id:`goToDate`,label:t(`chartMenu.goToDate`),icon:`calendar`},e));let r=e.timezone.options.map(t=>({id:`tz:${t.value}`,label:t.label,radio:!0,checked:t.value===e.timezone.current}));return _s(n,r.length>0?[{id:`timezone`,label:t(`settings.timezone`),submenu:r}]:[])}function ws(e,t){let n=e.pane?[{id:`paneLog`,label:t(`chartMenu.paneLog`),checked:e.pane.log},{id:`paneInvert`,label:t(`chartMenu.paneInvert`),checked:e.pane.invert},{id:`panePercent`,label:t(`chartMenu.panePercent`),checked:e.pane.percent}]:[];return _s([vs({id:`resetView`,label:t(`chartMenu.resetView`)},e)],n,[bs(t)])}function Ts(e,t,n){switch(e){case`priceAxis`:return Ss(t,n);case`timeAxis`:return Cs(t,n);case`pane`:return ws(t,n);default:return xs(t,n)}}var Es=/^[-+−]/;function Ds(e,t,n){let r=e.replace(Es,``);return r===n.replace(Es,``)?r:t>0?`+${r}`:t<0?`-${r}`:r}function Os(e){return e.startsWith(`+`)?`up`:e.startsWith(`-`)?`down`:null}var ks=[`positions`,`orders`,`history`],As=[`order`,`close`,`reverse`,`stopLoss`,`takeProfit`],js=[`market`,`limit`,`stop`],Ms=[`gtc`,`day`],Ns=`—`,Ps=`{pnl}`,Fs=3;function Is(e,t,n){return e.includes(t??``)?t:n}function Ls(e,t){return e.length===t.length&&e.every((e,n)=>e===t[n])}function Rs(e,t){if(t===null)return null;let n=e.quantity-(e.closedQuantity??0),r=e.side===`buy`?1:-1;return{pnl:(t-e.entryPrice)*n*r,pct:e.entryPrice===0?0:(t-e.entryPrice)/e.entryPrice*100*r}}function zs(e){let t=document.createElement(`span`);return t.dir=`ltr`,t.textContent=e,t}function Bs(e){let t=Os(e);return t?`tcw-account-${t}`:``}var Vs=class{el;tabButtons=new Map;tabLabels=new Map;tabCounts=new Map;totalsEl;content;tab=`positions`;snapshot={positions:[],orders:[],fills:[],price:null};open=!1;live=[];constructor(e,n,r=t.t){this.callbacks=n,this.t=r,this.el=document.createElement(`section`),this.el.className=`tcw-account`,this.el.hidden=!0,this.el.setAttribute(`aria-label`,this.t(`account.title`));let i=document.createElement(`div`);i.className=`tcw-account-head`;let a=document.createElement(`div`);a.className=`tcw-account-tabs`,a.setAttribute(`role`,`tablist`),a.addEventListener(`keydown`,e=>this.onTabKey(e));for(let e of ks){let t=document.createElement(`button`);t.type=`button`,t.className=`tcw-account-tab`,t.setAttribute(`role`,`tab`),t.id=`tcw-account-tab-${e}`;let n=document.createElement(`span`);n.className=`tcw-account-tab-label`,n.textContent=this.t(`account.${e}`);let r=document.createElement(`span`);r.className=`tcw-account-count`,t.append(n,r),t.addEventListener(`click`,()=>this.selectTab(e)),this.tabButtons.set(e,t),this.tabLabels.set(e,n.textContent),this.tabCounts.set(e,r),a.appendChild(t)}this.totalsEl=document.createElement(`div`),this.totalsEl.className=`tcw-account-totals`;let o=document.createElement(`button`);o.type=`button`,o.className=`tcw-account-new`,E(o,`orderTicket`),o.innerHTML=D(`plus`,13),o.append(this.t(`account.newOrder`)),o.addEventListener(`click`,()=>this.callbacks.onNewOrder());let s=document.createElement(`button`);s.type=`button`,s.className=`tcw-tree-close`,s.setAttribute(`aria-label`,this.t(`account.close`)),s.innerHTML=D(`x`,14),s.addEventListener(`click`,()=>this.closePanel()),i.append(a,this.totalsEl,o,s),this.content=document.createElement(`div`),this.content.className=`tcw-account-body`,this.content.setAttribute(`role`,`tabpanel`),this.el.append(i,this.content),e.appendChild(this.el),this.renderTabs()}isOpen(){return this.open}toggle(){this.open?this.closePanel():this.openPanel()}openPanel(){this.open=!0,this.el.hidden=!1,this.render(),this.callbacks.onToggle?.(!0)}closePanel(){this.open&&(this.open=!1,this.el.hidden=!0,this.callbacks.onToggle?.(!1))}update(e){let t=this.snapshot;if(this.snapshot=e,Ls(t.positions,e.positions)&&Ls(t.orders,e.orders)&&Ls(t.fills,e.fills)&&t.realisedPnl===e.realisedPnl){t.price!==e.price&&(this.renderTotals(),this.open&&this.tab===`positions`&&this.patchPrices());return}this.renderTabs(),this.open&&this.render()}destroy(){this.el.remove()}selectTab(e){this.tab=e,this.renderTabs(),this.render()}onTabKey(e){let t=ks.indexOf(this.tab),n=e.key===`ArrowRight`?t+1:e.key===`ArrowLeft`?t-1:-2;if(n===-2)return;e.preventDefault();let r=ks[(n+ks.length)%ks.length];this.selectTab(r),this.tabButtons.get(r)?.focus()}renderTabs(){let e={positions:this.snapshot.positions.length,orders:this.snapshot.orders.length,history:this.snapshot.fills.length};for(let[t,n]of this.tabButtons){let r=t===this.tab;this.tabCounts.get(t).textContent=String(e[t]),n.setAttribute(`aria-label`,`${this.tabLabels.get(t)} (${e[t]})`),n.setAttribute(`aria-selected`,String(r)),n.tabIndex=r?0:-1,r&&this.content.setAttribute(`aria-labelledby`,n.id)}this.renderTotals()}renderTotals(){let{positions:e,price:t,fills:n,realisedPnl:r}=this.snapshot,i=[],a=e.reduce((e,n)=>{let r=Rs(n,t);return r===null?e:(e??0)+r.pnl},null);a!==null&&i.push(this.total(`account.openPnl`,a)),(n.length>0||r!==void 0&&r!==0)&&i.push(this.total(`account.realised`,r??n.reduce((e,t)=>e+(t.pnl??0),0))),this.totalsEl.replaceChildren(...i)}total(e,t){let n=document.createElement(`span`),r=this.amount(t);n.className=`tcw-account-total ${Bs(r)}`.trim();let i=this.t(e),a=i.indexOf(Ps),o=zs(r);return a<0?n.append(`${i} `,o):n.append(i.slice(0,a),o,i.slice(a+5)),n}render(){let e=document.activeElement,t=e instanceof HTMLElement&&this.content.contains(e)?e.dataset.focusKey:void 0;this.live=[],this.tab===`positions`?this.renderPositions():this.tab===`orders`?this.renderOrders():this.renderHistory(),t&&[...this.content.querySelectorAll(`[data-focus-key]`)].find(e=>e.dataset.focusKey===t)?.focus()}patchPrices(){let{price:e}=this.snapshot;for(let t of this.live)t.price.textContent=e===null?Ns:this.callbacks.formatPrice(e),this.writePnl(t.pnl,Rs(t.position,e))}amount(e){return Ds(this.money(Math.abs(e)),e,this.money(0))}money(e){return this.callbacks.formatAmount?this.callbacks.formatAmount(e):e.toFixed(2)}percent(e){let t=e=>this.callbacks.formatNumber?this.callbacks.formatNumber(e,2):e.toFixed(2);return`${Ds(t(Math.abs(e)),e,t(0))}%`}writePnl(e,t){if(t===null){e.className=``,e.textContent=Ns;return}let n=this.amount(t.pnl);e.className=Bs(n),e.textContent=`${n} · ${this.percent(t.pct)}`}table(e,t,n){if(t.length===0){let e=document.createElement(`p`);return e.className=`tcw-account-empty`,e.textContent=this.t(n),this.content.replaceChildren(e),null}let r=e.map(e=>e.key?this.t(e.key):``),i=document.createElement(`table`);i.className=`tcw-account-table`,i.setAttribute(`role`,`table`);let a=i.createTHead().insertRow();a.setAttribute(`role`,`row`),e.forEach((e,t)=>{let n=document.createElement(`th`);n.scope=`col`,n.setAttribute(`role`,`columnheader`),n.textContent=r[t],e.num&&(n.className=`tcw-num`),a.appendChild(n)});let o=i.createTBody();for(let n of t){let t=o.insertRow();t.setAttribute(`role`,`row`),n.forEach((n,i)=>{let a=t.insertCell();a.setAttribute(`role`,`cell`),a.dataset.label=r[i],e[i].num&&(a.className=`tcw-num`),typeof n==`string`?a.textContent=n:a.appendChild(n)})}return this.content.replaceChildren(i),i}sideCell(e,t=`position`){let n=document.createElement(`span`);return n.className=`tcw-account-side tcw-account-${e}`,n.textContent=this.sideText(e,t),n}sideText(e,t){return t===`trade`?this.t(e===`buy`?`ticket.buy`:`ticket.sell`):this.t(e===`buy`?`account.long`:`account.short`)}actions(...e){let t=document.createElement(`div`);t.className=`tcw-account-actions`;for(let n of e){let e=document.createElement(`button`);e.type=`button`,e.className=`tcw-tree-btn${n.danger?` tcw-tree-del`:``}`,e.setAttribute(`aria-label`,n.label),e.title=n.label,e.dataset.focusKey=n.key,e.innerHTML=D(n.icon,14),e.addEventListener(`click`,n.run),t.appendChild(e)}return t}price(e){return e===void 0?Ns:this.callbacks.formatPrice(e)}renderPositions(){let{formatPrice:e}=this.callbacks,{price:t}=this.snapshot,n=[],r=this.snapshot.positions.map(r=>{let i=r.quantity-(r.closedQuantity??0),a=zs(``);this.writePnl(a,Rs(r,t)),n.push(a);let o=`${this.sideText(r.side,`position`)} ${i} @ ${e(r.entryPrice)}`;return[this.sideCell(r.side),String(i),e(r.entryPrice),t===null?Ns:e(t),a,this.price(r.stopLoss),this.price(r.takeProfit),this.actions({icon:`arrowUpDown`,label:`${this.t(`account.reverse`)}: ${o}`,key:`reverse:${r.id}`,run:()=>this.callbacks.onReversePosition(r.id)},{icon:`x`,label:`${this.t(`account.closePosition`)}: ${o}`,key:`close:${r.id}`,run:()=>this.callbacks.onClosePosition(r.id),danger:!0})]}),i=this.table([{key:`account.side`},{key:`account.quantity`,num:!0},{key:`account.entry`,num:!0},{key:`account.price`,num:!0},{key:`account.pnl`,num:!0},{key:`account.stopLoss`,num:!0},{key:`account.takeProfit`,num:!0},{key:null}],r,`account.noPositions`);if(!i)return;let a=[...i.tBodies[0].rows];this.snapshot.positions.forEach((e,t)=>this.live.push({position:e,price:a[t].cells[Fs],pnl:n[t]}))}renderOrders(){let{formatPrice:e}=this.callbacks,t=this.snapshot.orders.map(t=>{let n=Is(js,t.type===`stopLimit`?`stop`:t.type,`limit`),r=`${this.sideText(t.side,`trade`)} ${t.quantity} @ ${e(t.price)}`;return[this.sideCell(t.side,`trade`),this.t(`ticket.type.${n}`),String(t.quantity),e(t.price),this.price(t.stopLoss),this.price(t.takeProfit),t.timeInForce?this.t(`ticket.tif.${Is(Ms,t.timeInForce,`gtc`)}`):Ns,this.actions({icon:`x`,label:`${this.t(`account.cancelOrder`)}: ${r}`,key:`cancel:${t.id}`,run:()=>this.callbacks.onCancelOrder(t.id),danger:!0})]});this.table([{key:`account.side`},{key:`ticket.type`},{key:`account.quantity`,num:!0},{key:`account.price`,num:!0},{key:`account.stopLoss`,num:!0},{key:`account.takeProfit`,num:!0},{key:`ticket.timeInForce`},{key:null}],t,`account.noOrders`)}renderHistory(){let{formatPrice:e,formatTime:t}=this.callbacks,n=[...this.snapshot.fills].reverse().map(n=>{let r=zs(``);return n.pnl===void 0?r.textContent=Ns:(r.textContent=this.amount(n.pnl),r.className=Bs(r.textContent)),[t(n.time),this.sideCell(n.side,`trade`),String(n.quantity),e(n.price),this.t(`account.reason.${Is(As,n.reason,`order`)}`),r]});this.table([{key:`account.time`},{key:`account.side`},{key:`account.quantity`,num:!0},{key:`account.price`,num:!0},{key:`account.reason`},{key:`account.pnl`,num:!0}],n,`account.noFills`)}},Hs=1e-9;function Us(e,t){return e.type===`market`?t:e.price}function Ws(e,t,n={}){let r=[];(!(e.quantity>0)||!Number.isFinite(e.quantity))&&r.push(`quantity`),e.type!==`market`&&(!(e.price>0)||!Number.isFinite(e.price))&&r.push(`price`),e.type===`market`&&!((t??e.price)>0)&&r.push(`market`);let i=e.side===`buy`;if(t!==null&&e.type!==`market`&&e.price>0){let n=e.price<t;e.type===`limit`&&n!==i&&e.price!==t&&r.push(`limitSide`),e.type===`stop`&&n===i&&e.price!==t&&r.push(`stopSide`)}let a=e=>e===null||Number.isFinite(e)&&e>0;a(e.stopLoss)||r.push(`stopLoss`),a(e.takeProfit)||r.push(`takeProfit`);let o=Us(e,t);return o!==null&&o>0&&(e.stopLoss!==null&&a(e.stopLoss)&&(i?e.stopLoss>=o:e.stopLoss<=o)&&r.push(`stopLossSide`),e.takeProfit!==null&&a(e.takeProfit)&&(i?e.takeProfit<=o:e.takeProfit>=o)&&r.push(`takeProfitSide`)),[...r,...Gs(e,n)]}function Gs(e,t){let n=[],r=e.type===`market`?null:e.price,i=[r,e.stopLoss,e.takeProfit].filter(e=>e!==null&&Number.isFinite(e)&&e>0),{roundPrice:a,limits:o,lot:s}=t;return a&&i.some(e=>Math.abs(a(e)-e)>Hs)&&n.push(`priceStep`),o&&r!==null&&r>0&&(r>o.ceiling+Hs||r<o.floor-Hs)&&n.push(`priceLimits`),s!==void 0&&s>1&&e.quantity>s&&e.quantity%s!==0&&n.push(`lot`),n}function Ks(e,t){let n={side:e.side,type:e.type,price:e.type===`market`?t??e.price:e.price,quantity:e.quantity};return e.type===`stop`&&(n.stopPrice=e.price),e.type!==`market`&&(n.timeInForce=e.timeInForce),e.stopLoss!==null&&(n.stopLoss=e.stopLoss),e.takeProfit!==null&&(n.takeProfit=e.takeProfit),n}function qs(e,t){let n=Us(e,t);if(n===null||e.stopLoss===null||e.takeProfit===null)return null;let r=Math.abs(n-e.stopLoss);return r>0?Math.abs(e.takeProfit-n)/r:null}function Js(e,t,n,r=1){let i=Us(e,t);if(i===null||!(i>0)||!Number.isFinite(n)||!(e.quantity>0))return null;let a=e.side===`buy`?1:-1;return{pct:(n-i)/i*100*a,amount:(n-i)*e.quantity*a*r}}function Ys(e,t,n={}){let r=n.multiplier!==void 0&&n.multiplier>0?n.multiplier:1,i=Us(e,t),a=i!==null&&i>0&&e.quantity>0?i*e.quantity*r:null,o=Ws(e,t),s=(n,i)=>n===null||o.includes(i)?null:Js(e,t,n,r)?.amount??null,c=s(e.stopLoss,`stopLossSide`),l=s(e.takeProfit,`takeProfitSide`);return{value:a,risk:c,reward:l,ratio:c!==null&&l!==null?qs(e,t):null}}var Xs=229,Zs=1,Qs=2,$s=.999999999,ec=0,tc=class{backdrop;modal;symbolEl;body;summaryEl;problemsEl;submit;draft=null;lastPrice=null;rules={};step=rc;round=e=>ic(e,e);typed=new Map;returnFocus=null;uid=++ec;constructor(e,n,r=t.t){this.callbacks=n,this.t=r,this.backdrop=document.createElement(`div`),this.backdrop.className=`tcw-modal-backdrop`,this.backdrop.hidden=!0;let i=!1;this.backdrop.addEventListener(`pointerdown`,e=>{i=e.target===this.backdrop}),this.backdrop.addEventListener(`click`,e=>{e.target===this.backdrop&&i&&this.close(),i=!1}),this.modal=document.createElement(`div`),this.modal.className=`tcw-modal tcw-order-ticket`,this.modal.setAttribute(`role`,`dialog`),this.modal.setAttribute(`aria-modal`,`true`),this.modal.setAttribute(`aria-labelledby`,`tcw-ticket-title-${this.uid}`),this.modal.addEventListener(`keydown`,e=>{if(e.key===`Escape`&&!e.isComposing&&e.keyCode!==Xs){e.stopPropagation(),this.close();return}j(e,this.modal)});let a=document.createElement(`div`);a.className=`tcw-modal-header`;let o=document.createElement(`div`);o.className=`tcw-ticket-heading`;let s=document.createElement(`h3`);s.id=`tcw-ticket-title-${this.uid}`,s.textContent=this.t(`ticket.title`),this.symbolEl=document.createElement(`span`),this.symbolEl.className=`tcw-ticket-symbol`,o.append(s,this.symbolEl);let c=document.createElement(`button`);c.type=`button`,c.className=`tcw-modal-close`,c.setAttribute(`aria-label`,this.t(`common.close`)),c.innerHTML=D(`x`,16),c.addEventListener(`click`,()=>this.close()),a.append(o,c),this.body=document.createElement(`div`),this.body.className=`tcw-modal-body tcw-ticket-body`,this.summaryEl=document.createElement(`div`),this.summaryEl.className=`tcw-ticket-summary`,this.problemsEl=document.createElement(`div`),this.problemsEl.className=`tcw-ticket-problems`,this.problemsEl.setAttribute(`aria-live`,`polite`);let l=document.createElement(`div`);l.className=`tcw-modal-footer`;let u=document.createElement(`button`);u.type=`button`,u.className=`tcw-footer-cancel`,u.textContent=this.t(`common.cancel`),u.addEventListener(`click`,()=>this.close()),this.submit=document.createElement(`button`),this.submit.type=`button`,this.submit.className=`tcw-ticket-place`,this.submit.addEventListener(`click`,()=>this.place());let d=document.createElement(`div`);d.className=`tcw-footer-end`,d.append(u,this.submit),l.append(d),this.modal.append(a,this.body,this.summaryEl,this.problemsEl,l),this.backdrop.appendChild(this.modal),e.appendChild(this.backdrop)}open(e){this.returnFocus=document.activeElement instanceof HTMLElement?document.activeElement:null,this.lastPrice=e.lastPrice,this.rules=e.rules??{},this.step=e.step??rc,this.round=e.round??(e=>ic(e,e)),this.typed.clear(),this.symbolEl.textContent=e.symbol??``;let t=this.round(e.price??e.lastPrice??0),n=e.side??`buy`,r=`market`;e.price!==void 0&&e.lastPrice!==null&&t!==e.lastPrice&&(r=t<e.lastPrice==(n===`buy`)?`limit`:`stop`),this.draft={side:n,type:r,quantity:this.lot(),price:t,stopLoss:null,takeProfit:null,timeInForce:`gtc`},this.problemsEl.replaceChildren(),this.render(),this.backdrop.hidden=!1,this.body.querySelector(`button[aria-pressed="true"]`)?.focus()}close(){this.backdrop.hidden||(this.backdrop.hidden=!0,this.draft=null,this.returnFocus?.isConnected&&this.returnFocus.focus(),this.returnFocus=null)}isOpen(){return!this.backdrop.hidden}setLastPrice(e){if(!this.draft||e===this.lastPrice)return;this.lastPrice=e;let t=this.body.querySelector(`.tcw-ticket-market`);t&&(t.textContent=this.marketText()),this.check()}destroy(){this.close(),this.backdrop.remove()}lot(){return this.rules.lot!==void 0&&this.rules.lot>1?this.rules.lot:1}quantityStep(e){if(this.rules.lot!==void 0&&this.rules.lot>1)return this.rules.lot;let t=Number.isFinite(e)?(0,n.stepDecimals)(e):0;return t>0?Number((10**-t).toFixed(t)):1}priceStep(e,t){return this.step(t>0?e:e*$s)}writePrice(e){return Number.isFinite(e)?this.step===rc?String(e):e.toFixed((0,n.stepDecimals)(this.step(e))):``}place(){let e=this.draft;!e||Ws(e,this.lastPrice,this.rules).length>0||(this.callbacks.onSubmit(Ks(e,this.lastPrice)),this.close())}set(e,t=!1){this.draft&&(this.draft={...this.draft,...e},t?this.render():this.check())}render(){let e=this.draft;if(!e)return;let t=this.focusedField();if(this.modal.dataset.side=e.side,this.body.replaceChildren(this.sideToggle(e.side),this.row(`ticket.type`,this.choices(`type`,[`market`,`limit`,`stop`],e.type,`ticket.type`,e=>this.set({type:e},!0))),this.row(`ticket.quantity`,this.stepped(`quantity`,e.quantity,e=>this.quantityStep(e),()=>this.lot(),String,e=>this.set({quantity:e})))),e.type===`market`){let e=document.createElement(`span`);e.className=`tcw-ticket-market`,e.textContent=this.marketText(),this.body.append(this.row(`ticket.price`,e))}else this.body.append(this.row(`ticket.price`,this.priceField(`price`,e.price,e=>this.set({price:e}))),this.row(`ticket.timeInForce`,this.choices(`timeInForce`,[`gtc`,`day`],e.timeInForce,`ticket.timeInForce`,e=>this.set({timeInForce:e}))));this.body.append(this.optionalPrice(`stopLoss`,e.stopLoss),this.optionalPrice(`takeProfit`,e.takeProfit)),t&&this.body.querySelector(t)?.focus(),this.check()}focusedField(){let e=document.activeElement;if(!(e instanceof HTMLElement)||!this.body.contains(e))return null;let t=e.dataset.ticketField;return t?`[data-ticket-field="${t}"]`:null}row(e,t){let n=document.createElement(`div`);n.className=`tcw-settings-row tcw-ticket-row`;let r=document.createElement(`span`);return r.className=`tcw-settings-label`,r.textContent=this.t(e),n.append(r,t),n}choices(e,t,n,r,i){let a=e===`type`?`ticket.type`:`ticket.tif`,o=nc(e,On(t.map(e=>({value:e,label:this.t(`${a}.${e}`)})),n,i,this.t(r)));for(let t of o.querySelectorAll(`[role=radio]`))t.dataset.ticketField=`${e}-${t.dataset.value}`;return o}marketText(){let e=this.t(`ticket.type.market`);return this.lastPrice===null?e:`${e} · ${this.callbacks.formatPrice(this.lastPrice)}`}typeFor(e,t){return e.type===`market`||this.lastPrice===null||!(e.price>0)||e.price===this.lastPrice?e.type:e.price<this.lastPrice==(t===`buy`)?`limit`:`stop`}sideToggle(e){let t=document.createElement(`div`);t.className=`tcw-ticket-side`,t.setAttribute(`role`,`group`),t.setAttribute(`aria-label`,`${this.t(`ticket.buy`)} / ${this.t(`ticket.sell`)}`);for(let n of[`buy`,`sell`]){let r=document.createElement(`button`);r.type=`button`,r.className=`tcw-ticket-side-btn tcw-ticket-${n}`,r.textContent=this.t(`ticket.${n}`),r.setAttribute(`aria-pressed`,String(e===n)),r.dataset.ticketField=`side-${n}`,r.addEventListener(`click`,()=>{let e=this.draft;!e||e.side===n||this.set({side:n,type:this.typeFor(e,n)},!0)}),t.appendChild(r)}return t}priceField(e,t,n){return this.stepped(e,t,(e,t)=>this.priceStep(e,t),()=>this.lastPrice??this.draft?.price??0,e=>this.writePrice(e),n)}stepped(e,n,r,i,a,o){let s=nc(e,document.createElement(`input`));s.type=`number`,s.className=`tcw-indi-input`,s.step=`any`,s.min=`0`,s.value=this.typed.get(e)??a(n);let c=this.t(`ticket.${e}`);s.setAttribute(`aria-label`,c),s.addEventListener(`input`,()=>{this.typed.set(e,s.value),o(s.value.trim()===``?NaN:Number(s.value))});let l=An(s,{step:r,fallback:i,format:a,labels:{down:t.r(this.t(`ticket.stepDown`),{field:c}),up:t.r(this.t(`ticket.stepUp`),{field:c})}});return l.down.dataset.ticketField=`${e}-down`,l.up.dataset.ticketField=`${e}-up`,l.element}optionalPrice(e,t){let n=e===`stopLoss`?`ticket.stopLoss`:`ticket.takeProfit`,r=document.createElement(`div`);r.className=`tcw-settings-row tcw-ticket-optional`;let i=Sn(t!==null,t=>{this.typed.delete(e),this.set({[e]:t?this.startOf(e):null},!0)});i.setAttribute(`aria-label`,this.t(n)),i.dataset.ticketField=`${e}-switch`;let a=document.createElement(`div`);a.className=`tcw-ticket-optional-name`;let o=document.createElement(`span`);if(o.className=`tcw-settings-label`,o.textContent=this.t(n),a.appendChild(o),r.append(i,a),t!==null){let n=document.createElement(`span`);n.className=`tcw-ticket-away`,n.dataset.for=e,n.dir=`ltr`,a.appendChild(n),r.appendChild(this.priceField(e,t,t=>this.set({[e]:Number.isFinite(t)?t:NaN})))}return r}startOf(e){let t=this.draft;if(!t)return NaN;let n=t.type===`market`?this.lastPrice??t.price:t.price;if(!(n>0))return NaN;let r=e===`stopLoss`?-Zs:Qs;return this.round(n*(1+(t.side===`buy`?r:-r)/100))}check(){let e=this.draft;if(!e)return;let t=Ws(e,this.lastPrice,this.rules),n=t.map(e=>this.problemText(e));n.join(`
7445
7661
  `)!==[...this.problemsEl.children].map(e=>e.textContent).join(`
7446
- `)&&this.problemsEl.replaceChildren(...n.map(e=>{let t=document.createElement(`p`);return t.textContent=e,t}));for(let t of[`stopLoss`,`takeProfit`]){let n=this.body.querySelector(`.tcw-ticket-away[data-for="${t}"]`),r=e[t],i=r===null?null:ps(e,this.lastPrice,r,this.rules.multiplier);n&&(n.textContent=i?`${this.signedNumber(i.pct,2)}% · ${this.amount(i.amount)}`:``)}this.renderSummary(e),this.submit.disabled=t.length>0,this.submit.textContent=this.t(e.side===`buy`?`ticket.placeBuy`:`ticket.placeSell`)}renderSummary(e){let t=ms(e,this.lastPrice,this.rules),n=t.risk===null?null:this.amount(t.risk),r=t.reward===null?null:this.amount(t.reward),i=[[`value`,`ticket.value`,t.value===null?null:this.money(t.value),null],[`risk`,`ticket.risk`,n,n===null?null:qo(n)],[`reward`,`ticket.reward`,r,r===null?null:qo(r)],[`ratio`,`ticket.rewardRisk`,t.ratio===null?null:this.number(t.ratio,2),null]];this.summaryEl.replaceChildren(...i.filter(([,,e])=>e!==null).map(([e,t,n,r])=>{let i=document.createElement(`div`);i.className=`tcw-ticket-summary-row`,i.dataset.row=e;let a=document.createElement(`span`);a.textContent=this.t(t);let o=document.createElement(`span`);return o.className=`tcw-ticket-figure${r?` tcw-ticket-${r}`:``}`,o.dir=`ltr`,o.textContent=n,i.append(a,o),i}))}number(e,t){return this.callbacks.formatNumber?this.callbacks.formatNumber(e,t):e.toFixed(t)}signedNumber(e,t){return Ko(this.number(Math.abs(e),t),e,this.number(0,t))}amount(e){return Ko(this.money(Math.abs(e)),e,this.money(0))}money(e){return(this.callbacks.formatAmount??this.callbacks.formatPrice)(e)}problemText(e){let n=this.t(`ticket.problem.${e}`),{limits:r,lot:i}=this.rules;return e===`priceLimits`&&r?t.r(n,{floor:this.callbacks.formatPrice(r.floor),ceiling:this.callbacks.formatPrice(r.ceiling)}):e===`lot`?t.r(n,{lot:i??1}):n}};function xs(e,t){return t.dataset.ticketField=e,t}function Ss(e){let t=Math.abs(e);return t>0?10**Math.floor(Math.log10(t/100)):1}function Cs(e,t){let n=Math.abs(t),r=n>=10||n===0?2:n>=1?4:Math.min(10,Math.ceil(-Math.log10(n))+3);return Number(e.toFixed(r))}var ws=0,Ts=class{backdrop;titleEl;input;submit;request=null;returnFocus=null;busy=!1;uid=++ws;constructor(e,n=t.t){this.t=n,this.backdrop=document.createElement(`div`),this.backdrop.className=`tcw-modal-backdrop`,this.backdrop.hidden=!0;let r=!1;this.backdrop.addEventListener(`pointerdown`,e=>{r=e.target===this.backdrop}),this.backdrop.addEventListener(`click`,e=>{e.target===this.backdrop&&r&&this.close(),r=!1});let i=document.createElement(`form`);i.className=`tcw-modal tcw-modal-narrow tcw-name-prompt`,i.noValidate=!0,i.setAttribute(`role`,`dialog`),i.setAttribute(`aria-modal`,`true`),i.setAttribute(`aria-labelledby`,`tcw-name-title-${this.uid}`),i.addEventListener(`keydown`,e=>{if(e.key===`Escape`){e.stopPropagation(),this.close();return}j(e,i)}),i.addEventListener(`submit`,e=>{e.preventDefault(),this.done()});let a=document.createElement(`div`);a.className=`tcw-modal-header`,this.titleEl=document.createElement(`h3`),this.titleEl.id=`tcw-name-title-${this.uid}`;let o=document.createElement(`button`);o.type=`button`,o.className=`tcw-modal-close`,o.setAttribute(`aria-label`,this.t(`common.close`)),o.innerHTML=D(`x`,16),o.addEventListener(`click`,()=>this.close()),a.append(this.titleEl,o);let s=document.createElement(`div`);s.className=`tcw-modal-body`;let c=document.createElement(`label`);c.className=`tcw-name-field`;let l=document.createElement(`span`);l.textContent=this.t(`layouts.name`),this.input=document.createElement(`input`),this.input.type=`text`,this.input.className=`tcw-indi-input`,this.input.maxLength=80,this.input.autocomplete=`off`,this.input.spellcheck=!1,this.input.placeholder=this.t(`layouts.namePlaceholder`),this.input.addEventListener(`input`,()=>this.check()),c.append(l,this.input),s.appendChild(c);let u=document.createElement(`div`);u.className=`tcw-modal-footer`;let d=document.createElement(`button`);d.type=`button`,d.className=`tcw-reset-link`,d.textContent=this.t(`common.cancel`),d.addEventListener(`click`,()=>this.close()),this.submit=document.createElement(`button`),this.submit.type=`submit`,this.submit.className=`tcw-done-btn`,u.append(d,this.submit),i.append(a,s,u),this.backdrop.appendChild(i),e.appendChild(this.backdrop)}open(e){this.isOpen()||(this.returnFocus=document.activeElement instanceof HTMLElement?document.activeElement:null),this.request=e,this.busy=!1,this.titleEl.textContent=e.title,this.submit.textContent=e.submitLabel,this.input.value=e.value??``,this.input.placeholder=e.placeholder??this.t(`layouts.namePlaceholder`),this.check(),this.backdrop.parentElement?.appendChild(this.backdrop),this.backdrop.hidden=!1,this.input.focus(),this.input.select()}close(){this.backdrop.hidden||(this.backdrop.hidden=!0,this.request=null,this.returnFocus?.isConnected&&this.returnFocus.focus(),this.returnFocus=null)}isOpen(){return!this.backdrop.hidden}destroy(){this.close(),this.backdrop.remove()}check(){this.submit.disabled=this.busy||e.r(this.input.value)===null}async done(){let t=this.request,n=e.r(this.input.value);if(!(!t||n===null||this.busy)){this.busy=!0,this.check();try{await t.onSubmit(n),this.request===t&&this.close()}catch{}finally{this.busy=!1,this.check()}}}},Es=0,Ds=class{backdrop;search;listEl;layouts=[];confirming=null;returnFocus=null;loadSeq=0;uid=++Es;constructor(e,n,r=t.t){this.callbacks=n,this.t=r,this.backdrop=document.createElement(`div`),this.backdrop.className=`tcw-modal-backdrop`,this.backdrop.hidden=!0;let i=!1;this.backdrop.addEventListener(`pointerdown`,e=>{i=e.target===this.backdrop}),this.backdrop.addEventListener(`click`,e=>{e.target===this.backdrop&&i&&this.close(),i=!1});let a=document.createElement(`div`);a.className=`tcw-modal tcw-layouts-dialog`,a.setAttribute(`role`,`dialog`),a.setAttribute(`aria-modal`,`true`),a.setAttribute(`aria-labelledby`,`tcw-layouts-title-${this.uid}`),a.addEventListener(`keydown`,e=>{if(e.key!==`Escape`){j(e,a);return}e.stopPropagation(),this.confirming?this.setConfirming(null):this.close()});let o=document.createElement(`div`);o.className=`tcw-modal-header`;let s=document.createElement(`h3`);s.id=`tcw-layouts-title-${this.uid}`,s.textContent=this.t(`layouts.dialogTitle`);let c=document.createElement(`button`);c.type=`button`,c.className=`tcw-modal-close`,c.setAttribute(`aria-label`,this.t(`common.close`)),c.innerHTML=D(`x`,16),c.addEventListener(`click`,()=>this.close()),o.append(s,c);let l=document.createElement(`label`);l.className=`tcw-ss-search tcw-layouts-search-row`,l.innerHTML=D(`search`,16),this.search=document.createElement(`input`),this.search.type=`search`,this.search.className=`tcw-layouts-search`,this.search.placeholder=this.t(`layouts.search`),this.search.setAttribute(`aria-label`,this.t(`layouts.search`)),this.search.autocomplete=`off`,this.search.addEventListener(`input`,()=>this.render()),l.appendChild(this.search),this.listEl=document.createElement(`div`),this.listEl.className=`tcw-layouts-list`,this.listEl.setAttribute(`role`,`list`);let u=document.createElement(`div`);u.className=`tcw-layouts-body`,u.appendChild(this.listEl),a.append(o,l,u),this.backdrop.appendChild(a),e.appendChild(this.backdrop)}async open(){this.isOpen()||(this.returnFocus=document.activeElement instanceof HTMLElement?document.activeElement:null),this.search.value=``,this.confirming=null,this.backdrop.hidden=!1,this.search.focus(),await this.refresh()}async refresh(){let e=++this.loadSeq,t;try{t=await this.callbacks.list()}catch{t=[]}e===this.loadSeq&&(this.layouts=t,this.render())}close(){this.backdrop.hidden||(this.backdrop.hidden=!0,this.confirming=null,this.returnFocus?.isConnected&&this.returnFocus.focus(),this.returnFocus=null)}isOpen(){return!this.backdrop.hidden}destroy(){this.close(),this.backdrop.remove()}shown(){let e=this.search.value.trim().toLowerCase();return e?this.layouts.filter(t=>t.name.toLowerCase().includes(e)||(t.symbol??``).toLowerCase().includes(e)):this.layouts}render(){let e=this.shown();if(e.length===0){let e=document.createElement(`p`);e.className=`tcw-account-empty`,e.textContent=this.t(this.layouts.length===0?`layouts.empty`:`layouts.noMatch`),this.listEl.replaceChildren(e);return}let t=this.callbacks.currentId();this.listEl.replaceChildren(...e.map(e=>this.row(e,e.id===t)))}row(e,n){let r=document.createElement(`div`);r.className=`tcw-layouts-row`,r.setAttribute(`role`,`listitem`),r.dataset.id=e.id;let i=document.createElement(`button`);i.type=`button`,i.className=`tcw-layouts-open`,n&&i.setAttribute(`aria-current`,`true`);let a=document.createElement(`span`);a.className=`tcw-layouts-name`,a.textContent=e.name;let o=document.createElement(`span`);if(o.className=`tcw-layouts-meta`,o.textContent=[[e.symbol,e.timeframe].filter(Boolean).join(` · `),t.r(this.t(`layouts.updated`),{time:this.callbacks.formatTime(e.updatedAt)})].filter(Boolean).join(` — `),i.append(a,o),n){let e=document.createElement(`span`);e.className=`tcw-layouts-check`,e.innerHTML=D(`check`,14);let t=document.createElement(`span`);t.className=`tcw-visually-hidden`,t.textContent=this.t(`layouts.current`),i.prepend(e),i.appendChild(t)}i.addEventListener(`click`,()=>{this.callbacks.onOpen(e.id),this.close()});let s=document.createElement(`div`);if(s.className=`tcw-account-actions`,this.confirming===e.id){let n=document.createElement(`button`);n.type=`button`,n.className=`tcw-layouts-confirm`,n.textContent=this.t(`layouts.deleteConfirm`),n.setAttribute(`aria-label`,t.r(this.t(`layouts.deleteNamed`),{name:e.name})),n.addEventListener(`click`,()=>void this.remove(e.id));let r=this.iconButton(`x`,this.t(`common.cancel`),()=>this.setConfirming(null));s.append(n,r)}else s.append(this.iconButton(`penLine`,t.r(this.t(`layouts.renameNamed`),{name:e.name}),()=>this.callbacks.onRename(e)),this.iconButton(`trash`,t.r(this.t(`layouts.deleteNamed`),{name:e.name}),()=>this.setConfirming(e.id),!0));return r.append(i,s),r}iconButton(e,t,n,r=!1){let i=document.createElement(`button`);return i.type=`button`,i.className=`tcw-tree-btn${r?` tcw-tree-del`:``}`,i.setAttribute(`aria-label`,t),i.title=t,i.innerHTML=D(e,14),i.addEventListener(`click`,n),i}setConfirming(e){let t=this.confirming;this.confirming=e,this.render();let n=e??t;n&&[...this.listEl.querySelectorAll(`.tcw-layouts-row`)].find(e=>e.dataset.id===n)?.querySelector(e?`.tcw-layouts-confirm`:`.tcw-tree-del`)?.focus()}async remove(e){try{await this.callbacks.onDelete(e)}finally{this.confirming=null,await this.refresh(),this.isOpen()&&this.search.focus()}}},Os=5,ks=class{menu;prompt;dialog;destroyed=!1;constructor(e,t){this.session=e,this.host=t;let{root:n,t:r}=t;this.menu=new k(n,r(`toolbar.layouts`)),this.prompt=new Ts(n,r),this.dialog=new Ds(n,{list:()=>e.list(),currentId:()=>e.current()?.id??null,onOpen:e=>void this.open(e),onRename:e=>this.promptRename(e),onDelete:async t=>{try{await e.remove(t)}catch{this.host.toast(r(`layouts.deleteFailed`),`error`)}},formatTime:t.formatTime},r)}async save(){if(this.prompt.isOpen())return;if(!this.session.current()){this.promptSaveAs();return}let{t:e,toast:n}=this.host;try{let r=await this.session.save();r&&n(t.r(e(`layouts.saved`),{name:r.name}))}catch{n(e(`layouts.saveFailed`),`error`)}}async open(e){try{if(await this.session.open(e))return!0}catch{}return this.destroyed||this.host.toast(this.host.t(`layouts.openFailed`),`error`),!1}promptSaveAs(){let{t:e,toast:n}=this.host,r=this.session.current();this.prompt.open({title:e(`layouts.saveAsTitle`),value:r?t.r(e(`layouts.copyName`),{name:r.name}):``,submitLabel:e(`common.save`),onSubmit:async r=>{try{let i=await this.session.saveAs(r);n(t.r(e(`layouts.saved`),{name:i.name}))}catch(t){throw n(e(`layouts.saveFailed`),`error`),t}}})}promptRename(e=this.session.current()){if(!e)return;let{t,toast:n}=this.host;this.prompt.open({title:t(`layouts.renameTitle`),value:e.name,submitLabel:t(`layouts.renameSubmit`),onSubmit:async r=>{try{await this.session.rename(e.id,r)}catch(e){throw n(t(`layouts.saveFailed`),`error`),e}this.dialog.isOpen()&&this.dialog.refresh()}})}openDialog(){return this.dialog.open()}async openMenu(e){if(this.menu.isOpen()){this.menu.close();return}let{session:t}=this,{t:n}=this.host,r=[];try{r=(await t.list()).slice(0,Os)}catch{}if(this.destroyed)return;let i=t.current(),a=[{id:`save`,label:n(`layouts.save`),icon:`save`,shortcut:this.host.saveKeys?.()},{id:`saveAs`,label:n(`layouts.saveAs`),icon:`plus`}];i&&a.push({id:`rename`,label:n(`layouts.rename`),icon:`penLine`}),a.push({id:`autoSave`,label:n(`layouts.autoSave`),checked:t.isAutoSave()}),r.length>0&&a.push(`separator`,...r.map(e=>({id:`open:${e.id}`,label:e.name,checked:e.id===i?.id}))),a.push(`separator`,{id:`manage`,label:n(`layouts.open`),icon:`folder`}),this.menu.openUnder(a,e,e=>{e===`save`?this.save():e===`saveAs`?this.promptSaveAs():e===`rename`?this.promptRename():e===`autoSave`?t.setAutoSave(!t.isAutoSave()):e===`manage`?this.openDialog():e.startsWith(`open:`)&&this.open(e.slice(5))})}destroy(){this.destroyed=!0,this.menu.destroy(),this.prompt.destroy(),this.dialog.destroy()}},As=0,js=class{el;input;hint;returnFocus=null;constructor(e,t,n){this.labels=t,this.onApply=n,this.el=document.createElement(`div`),this.el.className=`tcw-interval-input`,this.el.hidden=!0,this.el.setAttribute(`role`,`dialog`),this.el.setAttribute(`aria-label`,t.title),this.input=document.createElement(`input`),this.input.type=`text`,this.input.className=`tcw-interval-field`,this.input.autocomplete=`off`,this.input.spellcheck=!1,this.input.maxLength=6,this.input.setAttribute(`aria-label`,t.title),this.hint=document.createElement(`div`),this.hint.className=`tcw-interval-hint`,this.hint.setAttribute(`role`,`status`),this.hint.id=`tcw-interval-hint-${++As}`,this.input.setAttribute(`aria-describedby`,this.hint.id),this.el.append(this.input,this.hint),e.appendChild(this.el),this.input.addEventListener(`input`,()=>this.check()),this.input.addEventListener(`keydown`,e=>{e.key===`Enter`?(e.preventDefault(),e.stopPropagation(),this.apply()):e.key===`Escape`&&(e.preventDefault(),e.stopPropagation(),this.close())}),this.input.addEventListener(`blur`,()=>this.close(!1))}open(e){this.isOpen()||(this.returnFocus=document.activeElement instanceof HTMLElement?document.activeElement:null),this.el.hidden=!1,this.input.value=e,this.check(),this.input.focus(),this.input.setSelectionRange(e.length,e.length)}close(e=!0){if(this.el.hidden)return;this.el.hidden=!0;let t=this.returnFocus;this.returnFocus=null,e&&t?.isConnected&&t.focus({preventScroll:!0})}isOpen(){return!this.el.hidden}destroy(){this.el.remove()}check(){let e=Ot(this.input.value)!==null;!e&&this.input.value.trim()!==``?this.input.setAttribute(`aria-invalid`,`true`):this.input.removeAttribute(`aria-invalid`),this.hint.textContent=e||this.input.value.trim()===``?this.labels.hint:this.labels.invalid}apply(){let e=Ot(this.input.value);if(e&&this.onApply(e)){this.close();return}this.input.setAttribute(`aria-invalid`,`true`),this.hint.textContent=this.labels.invalid}},Ms=class{constructor(e=`tcw:indicator-templates`){this.key=e}list(){let e;try{e=JSON.parse(localStorage.getItem(this.key)??`[]`)}catch{return[]}if(!Array.isArray(e))return[];let t=[];for(let n of e){if(typeof n!=`object`||!n)continue;let{name:e,indicators:i}=n;if(typeof e!=`string`||!e.trim()||!Array.isArray(i))continue;let a=r.ChartStateManager.deserialize(JSON.stringify({version:2,indicators:i})).indicators;a.length>0&&t.push({name:e.slice(0,60),indicators:a})}return t.sort((e,t)=>e.name.localeCompare(t.name))}get(e){return this.list().find(t=>t.name===e)??null}save(e,t){let n=e.replace(/\s+/g,` `).trim().slice(0,60);if(!n)throw Error(`A template needs a name`);let r=[...this.list().filter(e=>e.name!==n),{name:n,indicators:[...t]}];localStorage.setItem(this.key,JSON.stringify(r))}remove(e){try{localStorage.setItem(this.key,JSON.stringify(this.list().filter(t=>t.name!==e)))}catch{}}},q=[],Ns=new Map,Ps=null,Fs=e=>{let t=e.target instanceof Node?e.target:null;t!==null&&q.some(e=>e.contains(t)||Ns.get(e)?.some(e=>e.contains(t)))||(Ps=null)};function Is(e,t=[]){let n=()=>{Ps=e},r=[e,...t];for(let e of r)e.addEventListener(`pointerdown`,n,!0);return q.length===0&&document.addEventListener(`pointerdown`,Fs,!0),q.push(e),Ns.set(e,t),()=>{for(let e of r)e.removeEventListener(`pointerdown`,n,!0);let t=q.indexOf(e);t>=0&&q.splice(t,1),Ns.delete(e),q.length===0&&document.removeEventListener(`pointerdown`,Fs,!0),Ps===e&&(Ps=null)}}function Ls(e,t=!1){let n=Ps?.isConnected?Ps:null;if(!n){let e=document.activeElement;n=e?q.find(t=>t.contains(e))??null:null}return!n&&!t&&(n=q.find(e=>e.isConnected)??null),n!==null&&e.contains(n)}function J(){let e=document.activeElement;return!!e&&(e.tagName===`INPUT`||e.tagName===`TEXTAREA`||e.tagName===`SELECT`||e.isContentEditable)}var Rs=[`regular`,`logarithmic`,`percentage`,`indexedTo100`],zs=e=>typeof e==`object`&&!!e&&!Array.isArray(e);function Bs(e){let{theme:t,timestamp:n,...r}=e;return r}function Vs(e){return!zs(e)||e.v!==1||typeof e.symbol!=`string`||!e.symbol||typeof e.timeframe!=`string`||!((0,n.isTimeFrame)(e.timeframe)||(0,n.tickBarCount)(e.timeframe)!==null)?null:{v:1,symbol:e.symbol,timeframe:e.timeframe,scaleMode:Rs.find(t=>t===e.scaleMode)??`regular`,invertScale:e.invertScale===!0,chart:zs(e.chart)?Bs(e.chart):null}}function Hs(e){try{return JSON.parse(e)}catch{return null}}function Us(){try{return typeof localStorage<`u`?localStorage:null}catch{return null}}var Ws=class{favorites=[];constructor(e=`tcw:draw-favorites`,t=Us()){this.storageKey=e,this.storage=t,this.load()}list(){return[...this.favorites]}has(e){return this.favorites.includes(e)}add(e){!e||this.favorites.includes(e)||(this.favorites=[...this.favorites,e],this.persist())}remove(e){this.favorites.includes(e)&&(this.favorites=this.favorites.filter(t=>t!==e),this.persist())}toggle(e){return this.has(e)?(this.remove(e),!1):(this.add(e),!0)}seedDefaults(e){this.favorites.length>0||(this.favorites=[...new Set(e.filter(Boolean))],this.persist())}load(){if(this.storage)try{let e=this.storage.getItem(this.storageKey);if(!e)return;let t=JSON.parse(e);Array.isArray(t)&&(this.favorites=[...new Set(t.filter(e=>typeof e==`string`))])}catch{}}persist(){if(this.storage)try{this.storage.setItem(this.storageKey,JSON.stringify(this.favorites))}catch{}}};function Gs(e){let t=typeof window<`u`?window.visualViewport:null;if(!t)return()=>{};let n=-1,r=()=>{let r=(t.scale??1)>1.01?0:Math.max(0,Math.round(window.innerHeight-t.height-t.offsetTop));if(r!==n){n=r;for(let t of e)t.style.setProperty(`--tcw-keyboard-inset`,`${r}px`)}};return r(),t.addEventListener(`resize`,r),t.addEventListener(`scroll`,r),()=>{t.removeEventListener(`resize`,r),t.removeEventListener(`scroll`,r)}}function Ks(e,t){let n=null,r=()=>{let r=e.clientWidth;if(r===0&&n!==null)return;let i=r<641;i!==n&&(n=i,e.toggleAttribute(`data-tcw-narrow`,i),t?.(i))};if(r(),typeof ResizeObserver>`u`)return()=>{};let i=new ResizeObserver(r);return i.observe(e),()=>i.disconnect()}var qs=/^(\d{4})-(\d{2})-(\d{2})$/,Js=/^(\d{2}):(\d{2})$/;function Ys(e,t,r){let i=qs.exec(e),a=t?Js.exec(t):[``,`00`,`00`];if(!i||!a)return null;let[o,s,c,l,u]=[+i[1],+i[2],+i[3],+a[1],+a[2]];if(s<1||s>12||c<1||c>31||l>23||u>59)return null;let d=Date.UTC(o,s-1,c,l,u);return new Date(d).getUTCDate()===c?(0,n.wallToUtc)(d,r):null}function Y(e,t){let r=e=>String(e).padStart(2,`0`),i=(0,n.timeParts)(e,t);return{date:`${i.year}-${r(i.month)}-${r(i.day)}`,time:`${r(i.hours)}:${r(i.minutes)}`}}var X=[`date`,`range`],Xs=1,Zs=class{backdrop=null;fieldsEl=null;tabButtons=[];month=null;active=null;values={date:``,time:``,fromDate:``,fromTime:``,toDate:``,toTime:``};start=null;tab=`date`;returnFocus=null;uid=Xs++;constructor(e,t,n,r){this.layer=e,this.labels=t,this.locale=n,this.onSubmit=r}isOpen(){return this.backdrop!==null}open(e){this.close(!1),this.returnFocus=document.activeElement instanceof HTMLElement?document.activeElement:null,this.start=e,this.values={date:e.date.date,time:e.date.time,fromDate:e.range.from.date,fromTime:e.range.from.time,toDate:e.range.to.date,toTime:e.range.to.time},this.build(),this.renderTab(!0)}close(e=!0){if(!this.backdrop)return;this.backdrop.remove(),this.backdrop=this.fieldsEl=this.month=this.active=this.start=null,this.tabButtons=[];let t=this.returnFocus;this.returnFocus=null,e&&t?.isConnected&&t.focus()}destroy(){this.close(!1)}build(){let e=this.labels(),t=document.createElement(`div`);t.className=`tcw-modal-backdrop`;let n=!1;t.addEventListener(`pointerdown`,e=>{n=e.target===t}),t.addEventListener(`click`,e=>{e.target===t&&n&&this.close(),n=!1});let r=document.createElement(`div`);r.className=`tcw-modal tcw-goto`,E(r,`goToDate`),r.setAttribute(`role`,`dialog`),r.setAttribute(`aria-modal`,`true`),r.setAttribute(`aria-labelledby`,`tcw-goto-title-${this.uid}`),r.tabIndex=-1,r.addEventListener(`keydown`,e=>{if(e.stopPropagation(),e.key===`Escape`){e.preventDefault(),this.close();return}j(e,r)});let i=document.createElement(`div`);i.className=`tcw-modal-header`;let a=document.createElement(`h3`);a.id=`tcw-goto-title-${this.uid}`,a.textContent=e.title;let o=document.createElement(`button`);o.type=`button`,o.className=`tcw-modal-close`,o.setAttribute(`aria-label`,e.close),o.innerHTML=D(`x`,16),o.addEventListener(`click`,()=>this.close()),i.append(a,o);let s=document.createElement(`form`);s.className=`tcw-goto-form`,s.noValidate=!0,s.addEventListener(`submit`,e=>{e.preventDefault(),this.submit()});let c=document.createElement(`div`);c.className=`tcw-goto-fields`,c.id=`tcw-goto-panel-${this.uid}`,c.setAttribute(`role`,`tabpanel`);let l=new ie(e.calendar,this.locale(),e=>this.pickDay(e));l.element.classList.add(`tcw-goto-calendar`),s.append(c,l.element,this.buildFooter(e)),r.append(i,this.buildTabs(e),s),t.appendChild(r),this.layer().appendChild(t),this.backdrop=t,this.fieldsEl=c,this.month=l}buildTabs(e){let t=document.createElement(`div`);return t.className=`tcw-modal-tabs`,t.setAttribute(`role`,`tablist`),t.addEventListener(`keydown`,e=>this.onTabKey(e)),this.tabButtons=X.map(t=>{let n=document.createElement(`button`);return n.type=`button`,n.className=`tcw-modal-tab`,n.id=`tcw-goto-tab-${this.uid}-${t}`,n.dataset.tab=t,n.setAttribute(`role`,`tab`),n.setAttribute(`aria-controls`,`tcw-goto-panel-${this.uid}`),n.textContent=t===`date`?e.date:e.range,n.addEventListener(`click`,()=>this.select(t,!1)),n}),t.append(...this.tabButtons),t}buildFooter(e){let t=document.createElement(`button`);t.type=`button`,t.className=`tcw-footer-cancel`,t.dataset.act=`cancel`,t.textContent=e.cancel,t.addEventListener(`click`,()=>this.close());let n=document.createElement(`button`);n.type=`submit`,n.className=`tcw-done-btn`,n.dataset.act=`go`,n.textContent=e.submit;let r=document.createElement(`div`);r.className=`tcw-footer-end`,r.append(t,n);let i=document.createElement(`div`);return i.className=`tcw-modal-footer`,i.appendChild(r),i}select(e,t){this.tab=e,this.renderTab(!t),t&&this.tabButtons.find(t=>t.dataset.tab===e)?.focus()}renderTab(e){let t=this.fieldsEl,n=this.start;if(!t||!n)return;for(let e of this.tabButtons){let t=e.dataset.tab===this.tab;e.setAttribute(`aria-selected`,String(t)),e.classList.toggle(`tcw-active`,t),e.tabIndex=t?0:-1}t.setAttribute(`aria-labelledby`,`tcw-goto-tab-${this.uid}-${this.tab}`);let r=this.labels();t.replaceChildren(...this.tab===`date`?[this.row(null,`date`,`time`,r)]:[this.row(r.from,`fromDate`,`fromTime`,r),this.row(r.to,`toDate`,`toTime`,r)]);let i=t.querySelector(`input[type="date"]`);this.setActive(i),e&&i?.focus()}row(e,t,n,r){let i=document.createElement(`div`);if(i.className=`tcw-goto-row`,e){let t=document.createElement(`span`);t.className=`tcw-goto-label`,t.textContent=e,i.appendChild(t)}let a=e?`${e} · `:``,o=this.input(`date`,t,`${a}${r.date}`);return o.required=!0,o.dataset.tcwCalendar=`inline`,this.start?.max&&(o.max=this.start.max),o.addEventListener(`focus`,()=>this.setActive(o)),o.addEventListener(`input`,()=>{o.removeAttribute(`aria-invalid`),this.active===o&&this.showMonth()}),i.appendChild(o),this.start?.withTime&&i.appendChild(this.input(`time`,n,`${a}${r.time}`)),i}input(e,t,n){let r=document.createElement(`input`);return r.type=e,r.className=`tcw-goto-input`,r.dataset.field=t,r.value=this.values[t],r.setAttribute(`aria-label`,n),r.addEventListener(`input`,()=>{this.values[t]=r.value}),r}setActive(e){this.active=e,this.showMonth()}showMonth(){this.active&&this.month?.show(this.active.value,{max:this.start?.max,today:this.start?.today})}pickDay(e){let t=this.active;if(!t)return;let n=this.month?.element.contains(document.activeElement)??!1;t.value=e,t.dispatchEvent(new Event(`input`,{bubbles:!0})),t.dispatchEvent(new Event(`change`,{bubbles:!0}));let r=t.dataset.field===`fromDate`?this.fieldsEl?.querySelector(`[data-field="toDate"]`):null;if(r){r.focus(),this.setActive(r);return}this.showMonth(),n&&this.month?.focusGrid()}submit(){let e=[...this.fieldsEl?.querySelectorAll(`[data-field]`)??[]];for(let t of e)this.values[t.dataset.field]=t.value;let t=this.start?.max,n=e.find(e=>e.type===`date`&&(!e.value||t!==void 0&&e.value>t));if(n){n.setAttribute(`aria-invalid`,`true`),n.focus();return}let r=this.values,i=this.start?.withTime??!1,a=e=>i?e:``,o;if(this.tab===`date`){if(!r.date)return;o={kind:`date`,date:r.date,time:a(r.time)}}else{if(!r.fromDate||!r.toDate)return;o={kind:`range`,from:{date:r.fromDate,time:a(r.fromTime)},to:{date:r.toDate,time:a(r.toTime)}}}this.close(),this.onSubmit(o)}onTabKey(e){let t=X.indexOf(this.tab),[n,r]=this.backdrop?.closest(`[dir]`)?.getAttribute(`dir`)===`rtl`?[`ArrowLeft`,`ArrowRight`]:[`ArrowRight`,`ArrowLeft`],i=e.key===n?(t+1)%X.length:e.key===r?(t-1+X.length)%X.length:e.key===`Home`?0:e.key===`End`?X.length-1:-1;i<0||(e.preventDefault(),this.select(X[i],!0))}},Z={min:233,default:296,max:377},Qs=.382,$s=e=>!e.hidden&&getComputedStyle(e).display!==`none`,ec=class{element;panel;rail;handle;pages=new Map;open_=null;width;drag=null;observer=null;onMove=e=>{!this.drag||!this.samePointer(e)||this.setWidth(this.drag.width+(this.drag.x-e.clientX)*this.drag.dir)};onUp=e=>{!this.drag||!this.samePointer(e)||(this.drag=null,this.stopDrag(),this.options.saveWidth?.(this.width))};constructor(e,t){this.options=t;let n=document.createElement(`div`);n.className=`tcw-dock`;let r=document.createElement(`div`);r.className=`tcw-dock-panel`,r.hidden=!0,r.addEventListener(`keydown`,e=>this.onPanelKey(e));let i=document.createElement(`div`);i.className=`tcw-dock-resize`,i.setAttribute(`role`,`separator`),i.setAttribute(`aria-orientation`,`vertical`),i.setAttribute(`aria-label`,t.labels.resize),i.setAttribute(`aria-valuemin`,String(Z.min)),i.tabIndex=0,i.addEventListener(`pointerdown`,e=>this.startDrag(e)),i.addEventListener(`keydown`,e=>this.onHandleKey(e)),r.appendChild(i);let a=document.createElement(`div`);a.className=`tcw-dock-rail`,a.setAttribute(`role`,`toolbar`),a.setAttribute(`aria-orientation`,`vertical`),a.setAttribute(`aria-label`,t.labels.rail),E(a,`dock`),a.addEventListener(`keydown`,e=>this.onRailKey(e)),n.append(r,a),e.appendChild(n),this.element=n,this.panel=r,this.rail=a,this.handle=i,this.width=this.clamp(t.savedWidth?.()??Z.default,Z.max),this.applyWidth(),t.room&&typeof ResizeObserver<`u`&&(this.observer=new ResizeObserver(()=>this.fit()),this.observer.observe(e))}addPage(e){let t=document.createElement(`button`);t.type=`button`,t.className=`tcw-dock-btn`,t.dataset.page=e.id,t.title=e.label,t.setAttribute(`aria-label`,e.label),t.setAttribute(`aria-pressed`,`false`),t.tabIndex=-1,t.innerHTML=D(e.icon,18),e.parts?.length&&E(t,...e.parts),t.addEventListener(`click`,()=>{this.toggle(e.id)}),t.addEventListener(`focus`,()=>this.rove(t)),this.rail.appendChild(t),e.element.hidden=!0,e.element.classList.add(`tcw-dock-page`),this.panel.appendChild(e.element),this.pages.set(e.id,{page:e,button:t}),this.syncRail()}open(e){let t=this.pages.get(e);!t||this.open_===e||(this.hideCurrent(),this.open_=e,this.panel.hidden=!1,t.page.element.hidden=!1,t.button.setAttribute(`aria-pressed`,`true`),this.fit(),t.page.onShow?.(),this.options.onChange?.(e))}close(){let e=this.open_;if(e===null)return;let t=this.panel.contains(document.activeElement);if(this.hideCurrent(),this.panel.hidden=!0,t){let t=this.pages.get(e)?.button;(t&&(this.options.railShown?.()??!0)&&$s(t)?t:this.options.focusAfterClose?.(e))?.focus()}this.options.onChange?.(null)}toggle(e){this.open_===e?this.close():this.open(e)}closePage(e){this.open_===e&&this.close()}current(){return this.open_}isOpen(e){return this.open_===e}syncRail(){let e=[...this.pages.values()].map(e=>e.button),t=e.filter($s),n=e.find(e=>e.tabIndex===0);if(n&&t.includes(n))return;let r=t.find(e=>e.getAttribute(`aria-pressed`)===`true`)??t[0];for(let t of e)t.tabIndex=t===r?0:-1}fit(){this.applyWidth()}destroy(){this.drag=null,this.stopDrag(),this.observer?.disconnect(),this.element.remove()}hideCurrent(){let e=this.open_===null?null:this.pages.get(this.open_);this.open_=null,e&&(e.page.element.hidden=!0,e.button.setAttribute(`aria-pressed`,`false`),e.page.onHide?.())}maxNow(){let e=this.options.room?.()??0;return e<=0?Z.max:Math.max(Z.min,Math.min(Z.max,Math.floor(e*Qs)))}clamp(e,t=this.maxNow()){return Math.round(Math.min(t,Math.max(Z.min,e)))}shownWidth(){return this.clamp(this.width)}setWidth(e){this.width=this.clamp(e),this.applyWidth()}applyWidth(){let e=this.shownWidth();this.element.style.setProperty(`--tcw-dock-w`,`${e}px`),this.handle.setAttribute(`aria-valuemax`,String(this.maxNow())),this.handle.setAttribute(`aria-valuenow`,String(e))}samePointer(e){let t=e.pointerId;return this.drag?.pointer===void 0||t===void 0||t===this.drag.pointer}startDrag(e){if(e.button!==0)return;e.preventDefault();let t=getComputedStyle(this.element).direction===`rtl`||this.element.closest(`[dir]`)?.getAttribute(`dir`)===`rtl`;this.drag={x:e.clientX,width:this.shownWidth(),dir:t?-1:1,pointer:e.pointerId},document.addEventListener(`pointermove`,this.onMove),document.addEventListener(`pointerup`,this.onUp),document.addEventListener(`pointercancel`,this.onUp)}stopDrag(){document.removeEventListener(`pointermove`,this.onMove),document.removeEventListener(`pointerup`,this.onUp),document.removeEventListener(`pointercancel`,this.onUp)}onHandleKey(e){let[t,n]=this.element.closest(`[dir]`)?.getAttribute(`dir`)===`rtl`?[`ArrowRight`,`ArrowLeft`]:[`ArrowLeft`,`ArrowRight`],r=this.shownWidth(),i=e.key===t?r+13:e.key===n?r-13:e.key===`Home`?Z.min:e.key===`End`?Z.max:null;i!==null&&(e.preventDefault(),this.setWidth(i),this.options.saveWidth?.(this.width))}onPanelKey(e){e.key!==`Escape`||e.defaultPrevented||!this.element.closest(`[data-tcw-narrow]`)||(e.preventDefault(),e.stopPropagation(),this.close())}rove(e){for(let{button:t}of this.pages.values())t.tabIndex=t===e?0:-1}onRailKey(e){let t=[...this.pages.values()].map(e=>e.button).filter($s),n=t.indexOf(e.target);if(n<0)return;let r=e.key===`ArrowDown`?(n+1)%t.length:e.key===`ArrowUp`?(n-1+t.length)%t.length:e.key===`Home`?0:e.key===`End`?t.length-1:-1;r<0||(e.preventDefault(),t[r].focus())}},tc=[`percent`,`scale`,`pane`,`spread`,`ratio`,`correlation`,`correlationLog`],nc={percent:`compare.percent`,scale:`compare.ownScale`,pane:`compare.ownPane`,spread:`compare.way.spread`,ratio:`compare.way.ratio`,correlation:`compare.way.correlation`,correlationLog:`compare.way.correlationLog`};function rc(e){return tc.includes(e)}function ic(e){return tc.map(t=>({id:t,label:e(nc[t])}))}function ac(e,t){switch(e.id){case`compareSymbol`:return t?`pane`:`scale`;case`spread`:return e.params.mode===`ratio`?`ratio`:`spread`;case`correlation`:return`correlation`;case`correlationlog`:return`correlationLog`;default:return null}}function oc(e,t,n,r){let i=e.map(e=>({id:e.id,symbol:e.symbol,way:r(nc.percent),color:e.color}));for(let e of t){let t=e.params.symbol,a=ac(e,n.has(e.instanceId));!a||typeof t!=`string`||!t||i.push({id:e.instanceId,symbol:t,way:r(nc[a])})}return i}var Q=8,sc=4,cc=3,lc=`[title]:not([title=""]), [data-tip]:not([data-tip=""])`,uc=class{el;target=null;source=null;pressed=null;showTimer=null;watchFrame=0;warmUntil=0;observer;constructor(e){this.root=e,this.el=document.createElement(`div`),this.el.className=`tcw-tooltip`,this.el.setAttribute(`aria-hidden`,`true`),e.appendChild(this.el),e.addEventListener(`pointerover`,this.onOver),e.addEventListener(`pointerout`,this.onOut),e.addEventListener(`pointerdown`,this.onPress,!0),e.addEventListener(`keydown`,this.onPress,!0),e.addEventListener(`focusin`,this.onFocus),e.addEventListener(`focusout`,this.onBlur),e.addEventListener(`wheel`,this.hide,{passive:!0}),this.observer=new MutationObserver(()=>{this.pressed?.hasAttribute(`title`)&&dc(this.pressed);let e=this.target;!e||this.source!==`pointer`||!e.hasAttribute(`title`)||(dc(e),this.isVisible()&&this.show(e))}),this.observer.observe(e,{subtree:!0,attributes:!0,attributeFilter:[`title`]})}destroy(){this.hide(),this.pressed&&fc(this.pressed),this.observer.disconnect(),this.root.removeEventListener(`pointerover`,this.onOver),this.root.removeEventListener(`pointerout`,this.onOut),this.root.removeEventListener(`pointerdown`,this.onPress,!0),this.root.removeEventListener(`keydown`,this.onPress,!0),this.root.removeEventListener(`focusin`,this.onFocus),this.root.removeEventListener(`focusout`,this.onBlur),this.root.removeEventListener(`wheel`,this.hide),this.el.remove()}onOver=e=>{if(e.pointerType===`touch`)return;let t=this.tipTarget(e.target);!t||t===this.pressed||t===this.target&&this.source===`pointer`||(dc(t),this.schedule(t,`pointer`,Date.now()<this.warmUntil||this.isVisible()))};onOut=e=>{let t=e.relatedTarget,n=e=>!!e&&!!t&&e.contains(t);this.pressed&&!n(this.pressed)&&(fc(this.pressed),this.pressed=null),this.source===`pointer`&&!n(this.target)&&this.hide()};onPress=()=>{let e=this.target,t=this.source===`pointer`;this.warmUntil=0,this.clearTimer(),cancelAnimationFrame(this.watchFrame),this.el.classList.remove(`tcw-tooltip--visible`),this.target=null,this.source=null,this.pressed&&this.pressed!==e&&fc(this.pressed),this.pressed=t?e:null};onFocus=e=>{let t=this.tipTarget(e.target);!t||!hc(t)||t===this.pressed||this.schedule(t,`focus`,!0)};onBlur=e=>{if(this.source!==`focus`)return;let t=e.relatedTarget;this.target&&t&&this.target.contains(t)||this.hide()};hide=()=>{this.clearTimer(),cancelAnimationFrame(this.watchFrame),this.isVisible()&&(this.warmUntil=Date.now()+500),this.el.classList.remove(`tcw-tooltip--visible`),this.target&&this.source===`pointer`&&fc(this.target),this.target=null,this.source=null};tipTarget(e){if(!(e instanceof Element))return null;let t=e.closest(lc);return t&&t!==this.el&&this.root.contains(t)?t:null}schedule(e,t,n){let r=this.target;if(this.clearTimer(),cancelAnimationFrame(this.watchFrame),r&&r!==e&&this.source===`pointer`&&fc(r),this.target=e,this.source=t,n){this.show(e);return}this.el.classList.remove(`tcw-tooltip--visible`),this.showTimer=setTimeout(()=>{this.showTimer=null,this.target===e&&this.show(e)},300)}show(e){if(!mc(e)){this.hide();return}this.el.textContent=pc(e),this.place(e),this.el.classList.add(`tcw-tooltip--visible`),this.watch(e)}watch(e){cancelAnimationFrame(this.watchFrame),this.watchFrame=requestAnimationFrame(()=>{this.target===e&&(mc(e)?this.watch(e):this.hide())})}place(e){let t=this.root.getBoundingClientRect(),n=e.getBoundingClientRect(),r=this.el.offsetWidth,i=this.el.offsetHeight,a=n.left-t.left,o=n.top-t.top,s=gc(e);s===`bottom`&&o+n.height+Q+i>t.height?s=`top`:s===`top`&&o-Q-i<0?s=`bottom`:s===`right`&&a+n.width+Q+r>t.width&&(s=`left`);let c,l;s===`top`||s===`bottom`?(c=a+n.width/2-r/2,l=s===`bottom`?o+n.height+Q:o-Q-i):(c=s===`right`?a+n.width+Q:a-Q-r,l=o+n.height/2-i/2),c=Math.max(sc,Math.min(t.width-r-sc,c)),l=Math.max(sc,Math.min(t.height-i-sc,l)),this.el.style.left=`${Math.round(c)}px`,this.el.style.top=`${Math.round(l)}px`;let u={top:[0,cc],bottom:[0,-cc],left:[cc,0],right:[-cc,0]}[s];this.el.style.setProperty(`--tcw-tip-dx`,`${u[0]}px`),this.el.style.setProperty(`--tcw-tip-dy`,`${u[1]}px`),this.el.dataset.side=s}isVisible(){return this.el.classList.contains(`tcw-tooltip--visible`)}clearTimer(){this.showTimer!==null&&(clearTimeout(this.showTimer),this.showTimer=null)}};function dc(e){let t=e.getAttribute(`title`);t!==null&&(e.dataset.tip=t,e.removeAttribute(`title`))}function fc(e){e.dataset.tip!==void 0&&!e.hasAttribute(`title`)&&(e.setAttribute(`title`,e.dataset.tip),delete e.dataset.tip)}function pc(e){return e.dataset.tip??e.getAttribute(`title`)??``}function mc(e){return e.isConnected&&e.getClientRects().length>0&&!e.disabled}function hc(e){try{return e.matches(`:focus-visible`)}catch{return!1}}function gc(e){return e.dataset.tipSide||(e.closest(`.tcw-sidebar`)?`right`:e.closest(`.tcw-statusbar, .tcw-replay-bar`)?`top`:`bottom`)}var _c=2,vc=1.5,yc=`tcw-ind-legend-values--no-room`,bc=class{stack;toggle;rows=new Map;panes=new Map;collapsed=!1;toggleKey=``;stackKey=``;valuesObserver;constructor(e,t,n){this.host=e,this.callbacks=t,this.labels=n,this.stack=document.createElement(`div`),this.stack.className=`tcw-ind-legend`,E(this.stack,`indicatorLegend`),this.toggle=document.createElement(`button`),this.toggle.type=`button`,this.toggle.className=`tcw-ind-legend-toggle`,this.toggle.addEventListener(`click`,()=>{this.setCollapsed(!this.collapsed),this.renderToggle(this.overlayCount())}),this.stack.appendChild(this.toggle),e.appendChild(this.stack),this.valuesObserver=typeof ResizeObserver>`u`?null:new ResizeObserver(e=>{for(let t of e)xc(t.target,t.contentRect.width)})}update(e,t,n=[]){this.updatePanes(n);let r=`${Math.round(t.left)},${Math.round(t.top)}`;r!==this.stackKey&&(this.stackKey=r,this.stack.style.left=`${Math.round(t.left)}px`,this.stack.style.top=`${Math.round(t.top)}px`);let i=new Set,a=!1;for(let t of e){i.add(t.instanceId);let e=this.rows.get(t.instanceId)??this.createRow(t.instanceId);this.fill(e,t),t.pane?e.el.parentElement!==this.host&&this.host.appendChild(e.el):e.el.parentElement!==this.stack&&(this.stack.insertBefore(e.el,this.toggle),a=!0),this.place(e,t.pane)}for(let[e,t]of this.rows)i.has(e)||(this.valuesObserver?.unobserve(t.values),t.el.remove(),this.rows.delete(e));a&&this.collapsed&&this.setCollapsed(!1),this.renderToggle(e.filter(e=>!e.pane).length)}destroy(){this.valuesObserver?.disconnect();for(let e of this.rows.values())e.el.remove();this.rows.clear();for(let e of this.panes.values())e.el.remove();this.panes.clear(),this.stack.remove()}updatePanes(e){if(!this.callbacks.onPaneAction)return;let t=new Set;for(let n of e){t.add(n.instanceId);let e=this.panes.get(n.instanceId)??this.createPane(n.instanceId),r=`${Math.round(n.x)},${Math.round(n.y)}|${n.label}|${n.collapsed}|${n.maximized}|${n.canMoveUp}|${n.canMoveDown}`;if(r===e.key)continue;e.key=r,e.el.style.left=`${Math.round(n.x)}px`,e.el.style.top=`${Math.round(n.y)}px`;let i=this.labels,a=(t,r,i,a)=>{let o=e.buttons.get(t);!r&&document.activeElement===o&&e.buttons.get(`max`).focus(),o.hidden=!r,o.innerHTML=D(i,12),Sc(o,a??t,n.label)};a(`up`,n.canMoveUp&&!n.maximized,`arrowUp`,i.paneUp),a(`down`,n.canMoveDown&&!n.maximized,`arrowDown`,i.paneDown),a(`fold`,!n.maximized,n.collapsed?`chevronDown`:`chevronUp`,n.collapsed?i.paneExpand:i.paneCollapse),a(`max`,!0,n.maximized?`minimize`:`maximize`,n.maximized?i.paneRestore:i.paneMaximize),e.el.dataset.collapsed=String(n.collapsed),e.el.dataset.maximized=String(n.maximized)}for(let[e,n]of this.panes)t.has(e)||(n.el.remove(),this.panes.delete(e))}createPane(e){let t=document.createElement(`div`);t.className=`tcw-pane-controls`,E(t,`indicatorLegend`),t.dataset.instance=e;let n=new Map,r=e=>e===`up`||e===`down`?e:e===`fold`?t.dataset.collapsed===`true`?`expand`:`collapse`:t.dataset.maximized===`true`?`restore`:`maximize`,i={up:`pane.move`,down:`pane.move`,fold:`pane.collapse`,max:`pane.maximize`};for(let a of[`up`,`down`,`fold`,`max`]){let o=document.createElement(`button`);o.type=`button`,o.className=`tcw-pane-btn`,o.dataset.act=a,E(o,i[a]),o.addEventListener(`click`,()=>this.callbacks.onPaneAction?.(e,r(a))),n.set(a,o),t.appendChild(o)}this.host.appendChild(t);let a={el:t,buttons:n,key:``};return this.panes.set(e,a),a}createRow(e){let t=document.createElement(`div`);t.className=`tcw-ind-legend-row`,E(t,`indicatorLegend`),t.dataset.instance=e;let n=document.createElement(`button`);n.type=`button`,n.className=`tcw-ind-legend-name`,n.addEventListener(`click`,()=>this.callbacks.onSettings(e));let r=document.createElement(`span`);r.className=`tcw-ind-legend-values`,E(r,`indicatorLegend.values`),this.valuesObserver?.observe(r);let i=document.createElement(`span`);i.className=`tcw-ind-legend-actions`;let a=(e,t,n,...r)=>{let a=document.createElement(`button`);return a.type=`button`,a.className=`tcw-ind-legend-act`,a.dataset.act=e,E(a,...r),a.innerHTML=D(t,13),a.addEventListener(`click`,n),i.appendChild(a),a},o=a(`visible`,`eye`,()=>{this.callbacks.onToggleVisible(e,!u.visible)},`indicatorLegend.visibility`),s=a(`settings`,`settings`,()=>this.callbacks.onSettings(e),`indicatorSettings`,`indicatorLegend.settings`),c=this.callbacks.onMore?a(`more`,`more`,()=>this.callbacks.onMore?.(e,c),`indicatorLegend.more`):null,l=a(`remove`,`x`,()=>this.callbacks.onRemove(e),`indicatorLegend.remove`);t.append(n,r,i);let u={el:t,name:n,values:r,eye:o,settings:s,more:c,remove:l,visible:!0,valuesKey:``,state:``,placeKey:``};return this.rows.set(e,u),u}fill(e,t){let n=`${t.label}|${t.visible}|${!!t.offInterval}`;n!==e.state&&(e.state=n,e.visible=t.visible,e.name.textContent=t.label,e.name.title=this.labels.settings,e.el.classList.toggle(`tcw-ind-legend-row--hidden`,!t.visible||!!t.offInterval),t.offInterval&&this.labels.offInterval?e.el.title=this.labels.offInterval:e.el.removeAttribute(`title`),e.eye.innerHTML=D(t.visible?`eye`:`eyeOff`,13),Sc(e.eye,t.visible?this.labels.hide:this.labels.show,t.label),Sc(e.settings,this.labels.settings,t.label),e.more&&(Sc(e.more,this.labels.more??`More`,t.label),e.more.setAttribute(`aria-haspopup`,`menu`)),Sc(e.remove,this.labels.remove,t.label));let r=t.values.map(e=>`${e.text}${e.color??``}`).join(``);r!==e.valuesKey&&(e.valuesKey=r,e.values.replaceChildren(...t.values.map(e=>{let t=document.createElement(`span`);return t.textContent=e.text,e.color&&(t.style.color=e.color),t})))}place(e,t){let n=t?`${Math.round(t.x)},${Math.round(t.y)},${Math.round(t.width)}`:``;n!==e.placeKey&&(e.placeKey=n,e.el.classList.toggle(`tcw-ind-legend-row--pane`,t!==null),e.el.style.left=t?`${Math.round(t.x)}px`:``,e.el.style.top=t?`${Math.round(t.y)}px`:``,e.el.style.maxWidth=t?`${Math.max(0,Math.round(t.width))}px`:``)}setCollapsed(e){this.collapsed=e,this.stack.classList.toggle(`tcw-ind-legend--collapsed`,e)}overlayCount(){return this.stack.querySelectorAll(`:scope > .tcw-ind-legend-row`).length}renderToggle(e){let t=e>=_c;!t&&this.collapsed&&this.setCollapsed(!1);let n=`${t}|${this.collapsed}|${e}`;if(n===this.toggleKey||(this.toggleKey=n,this.toggle.hidden=!t,!t))return;let r=this.collapsed?this.labels.expand:this.labels.collapse;Sc(this.toggle,r,this.collapsed?`(${e})`:void 0),this.toggle.setAttribute(`aria-expanded`,String(!this.collapsed));let i=D(this.collapsed?`chevronDown`:`chevronUp`,12);this.toggle.innerHTML=this.collapsed?`${i}<span>${e}</span>`:i}};function xc(e,t){let n=(parseFloat(getComputedStyle(e).fontSize)||0)*vc;e.classList.toggle(yc,t<n)}function Sc(e,t,n){e.title=t,e.setAttribute(`aria-label`,n?`${t} ${n}`:t)}function Cc(e,t,n,i){if(!t)return[];let a=e.plots;if(!a){let e=[];for(let n in t){let r=t[n];typeof r==`number`&&Number.isFinite(r)&&e.push(r)}let r=e.length===1?n[0]??null:null;return e.map(e=>({value:e,color:r}))}let o={colors:[...n],lineWidths:[],opacity:1},s=[];for(let e of a){if(!(0,r.plotShown)(e,{plots:i}))continue;let a=t[e.key];typeof a!=`number`||!Number.isFinite(a)||s.push({value:a,color:n.length?(0,r.plotColor)(e,o,t):null})}return s}var wc=new Map;function Tc(e){let t=wc.get(e);return t||(t=new Intl.NumberFormat(e,{notation:`compact`,maximumFractionDigits:2}),wc.set(e,t)),t}function Ec(e,t=`en-US`){return Math.abs(e)>=1e6?Tc(t).format(e):(0,n.formatPrice)(e,(0,r.indicatorValuePrecision)(e),t)}var Dc=class{el;labelEl;callbacks;visible=!1;constructor(e,n,r=t.t){this.t=r,this.callbacks=n,this.el=document.createElement(`div`),this.el.className=`tcw-bracket-bar`,this.el.setAttribute(`role`,`group`),this.el.hidden=!0,this.labelEl=document.createElement(`span`),this.labelEl.className=`tcw-bracket-label`,this.el.appendChild(this.labelEl);let i=document.createElement(`span`);i.className=`tcw-bracket-hint`,i.textContent=this.t(`bracket.hint`),this.el.appendChild(i);let a=document.createElement(`button`);a.type=`button`,a.className=`tcw-bracket-cancel`,a.innerHTML=`${D(`x`,14)}<span>${O(this.t(`common.cancel`))}</span>`,a.addEventListener(`click`,()=>this.callbacks.onCancel());let o=document.createElement(`button`);o.type=`button`,o.className=`tcw-bracket-confirm`,o.innerHTML=`${D(`check`,14)}<span>${O(this.t(`bracket.place`))}</span>`,o.addEventListener(`click`,()=>this.callbacks.onConfirm()),this.el.appendChild(a),this.el.appendChild(o),e.appendChild(this.el)}show(e){this.visible=!0;let t=e===`buy`?this.t(`toolbar.longBracket`):this.t(`toolbar.shortBracket`);this.labelEl.textContent=t,this.el.setAttribute(`aria-label`,t),this.el.dataset.side=e,this.el.dir=this.el.closest(`.tcw-root`)?.dir||`auto`,this.el.hidden=!1}hide(){this.visible=!1,this.el.hidden=!0}isVisible(){return this.visible}destroy(){this.el.remove()}},Oc=class{options;audioCtx=null;audioEl=null;permissionAsked=!1;constructor(e={}){if(this.options=e,typeof e.sound==`string`)try{this.audioEl=new Audio(e.sound),this.audioEl.preload=`auto`}catch{this.audioEl=null}e.desktop&&this.ensurePermission()}setOptions(e){this.options={...this.options,...e}}notify(e){this.options.sound&&this.playSound(),this.options.desktop&&this.showDesktop(e)}playSound(){if(this.audioEl){this.audioEl.currentTime=0,this.audioEl.play().catch(()=>{});return}this.beep()}beep(){try{let e=window.AudioContext??window.webkitAudioContext;if(!e)return;this.audioCtx||=new e;let t=this.audioCtx,n=t.currentTime,r=t.createGain();r.gain.setValueAtTime(1e-4,n),r.gain.exponentialRampToValueAtTime(.2,n+.01),r.gain.exponentialRampToValueAtTime(1e-4,n+.35),r.connect(t.destination);let i=t.createOscillator();i.type=`sine`,i.frequency.setValueAtTime(880,n),i.frequency.setValueAtTime(1320,n+.16),i.connect(r),i.start(n),i.stop(n+.36)}catch{}}ensurePermission(){this.permissionAsked||(this.permissionAsked=!0,!(typeof Notification>`u`)&&Notification.permission===`default`&&Notification.requestPermission().catch(()=>{}))}showDesktop(e){if(!(typeof Notification>`u`)){if(Notification.permission!==`granted`){this.ensurePermission();return}try{new Notification(this.options.title??`Price alert`,{body:e})}catch{}}}destroy(){try{this.audioCtx?.close()}catch{}this.audioCtx=null,this.audioEl=null}};function kc(e,t=12){let n=[...e.asks].sort((e,t)=>e.price-t.price).slice(0,t),r=[...e.bids].sort((e,t)=>t.price-e.price).slice(0,t),i=n.length>0?n[0].price:null,a=r.length>0?r[0].price:null,o=i!==null&&a!==null?(i+a)/2:null,s=new Map,c=e=>{let t=s.get(e);return t||(t={price:e,bidVolume:0,askVolume:0},s.set(e,t)),t};for(let e of n)c(e.price).askVolume+=e.volume;for(let e of r)c(e.price).bidVolume+=e.volume;let l=[...s.values()].sort((e,t)=>t.price-e.price),u=0;for(let e of l)u=Math.max(u,e.bidVolume,e.askVolume);return{rows:l,maxVolume:u,mid:o,spread:i!==null&&a!==null?i-a:null,bestBid:a}}var Ac=1e-9,jc=class{el;colsEl;bodyEl;callbacks;open=!1;levels;model=null;orders=[];drawn=[];spreadEl;placed=!1;constructor(e,n,r=12,i=t.t){this.t=i,this.callbacks=n,this.levels=r,this.el=document.createElement(`section`),this.el.className=`tcw-ladder`,this.el.setAttribute(`aria-label`,this.t(`ladder.title`)),E(this.el,`depthLadder`),this.el.hidden=!0;let a=document.createElement(`div`);a.className=`tcw-ladder-header`;let o=document.createElement(`h3`);o.className=`tcw-ladder-title`,o.textContent=this.t(`ladder.title`);let s=document.createElement(`button`);s.type=`button`,s.className=`tcw-ladder-close`,s.setAttribute(`aria-label`,this.t(`common.close`)),s.innerHTML=D(`x`,14),s.addEventListener(`click`,()=>this.callbacks.onClose?this.callbacks.onClose():this.close()),a.append(o,s),this.colsEl=document.createElement(`div`),this.colsEl.className=`tcw-ladder-cols`;for(let e of[`ladder.bid`,`ladder.price`,`ladder.ask`]){let t=document.createElement(`span`);t.textContent=this.t(e),this.colsEl.appendChild(t)}this.bodyEl=document.createElement(`div`),this.bodyEl.className=`tcw-ladder-body`,this.spreadEl=document.createElement(`div`),this.spreadEl.className=`tcw-ladder-spread`,this.el.append(a,this.colsEl,this.bodyEl),e.appendChild(this.el)}get element(){return this.el}isOpen(){return this.open}toggle(){this.open?this.close():this.openPanel()}openPanel(){this.open=!0,this.placed=!1,this.el.hidden=!1,this.render(),this.callbacks.onToggle?.(!0)}close(){this.open&&(this.open=!1,this.el.hidden=!0,this.callbacks.onToggle?.(!1))}setData(e){this.model=e?kc(e,this.levels):null,this.render()}setOrders(e){this.orders=e,this.render()}destroy(){this.el.remove()}render(){if(!this.open)return;let e=this.model;if(!e||e.rows.length===0){let e=document.createElement(`div`);e.className=`tcw-ladder-empty`,e.textContent=this.t(`ladder.empty`),this.bodyEl.replaceChildren(e),this.drawn=[];return}let t=Mc(e.rows);e.rows.length===this.drawn.length&&e.rows.every((e,t)=>e.price===this.drawn[t].price)||(this.drawn=e.rows.map(e=>this.newRow(e.price)),this.bodyEl.replaceChildren(...this.drawn.map(e=>e.row)));let n=e.maxVolume>0?100/e.maxVolume:0;e.rows.forEach((e,r)=>this.fillRow(this.drawn[r],e,n,this.nearness(e.price,t))),this.putSpread(e,t),this.placeSpread()}putSpread(e,n){let{spread:r,bestBid:i}=e,a=r===null||i===null?-1:e.rows.findIndex(e=>e.price<i+n);if(r===null||a<0){this.spreadEl.remove();return}this.spreadEl.textContent=t.r(this.t(`ladder.spread`),{spread:this.callbacks.formatPrice(r)});let o=this.drawn[a].row;this.spreadEl.nextElementSibling!==o&&this.bodyEl.insertBefore(this.spreadEl,o)}nearness(e,t){let n=this.callbacks.priceStep?.(e)??0;return n>0?Math.min(n/2,t):t}newRow(e){let t=document.createElement(`div`);t.className=`tcw-ladder-row`;let n=document.createElement(`div`);n.className=`tcw-ladder-price`;let r=document.createElement(`span`);r.className=`tcw-ladder-figure`,n.appendChild(r);let i=this.newCell(`sell`,e),a=this.newCell(`buy`,e);return t.append(i,n,a),{price:e,row:t,bid:i,ask:a,cell:n,figure:r}}newCell(e,t){let n=document.createElement(`button`);return n.type=`button`,n.className=`tcw-ladder-cell ${e===`sell`?`tcw-ladder-bid`:`tcw-ladder-ask`}`,n.addEventListener(`click`,()=>this.callbacks.onTrade(e,t)),n}fillRow(e,t,n,r){e.cell.className=`tcw-ladder-price ${t.askVolume>0?`tcw-ask`:`tcw-bid`}`,e.figure.textContent=this.callbacks.formatPrice(t.price),this.fillCell(e.bid,`sell`,t.bidVolume,t.price,n),this.fillCell(e.ask,`buy`,t.askVolume,t.price,n);for(let t of e.cell.querySelectorAll(`.tcw-ladder-own`))t.remove();for(let n of[`buy`,`sell`]){let i=this.orders.filter(e=>e.side===n&&Math.abs(e.price-t.price)<r).reduce((e,t)=>e+t.quantity,0);if(i<=0)continue;let a=document.createElement(`span`);a.className=`tcw-ladder-own`,a.dataset.side=n,a.textContent=String(i);let o=`${this.t(n===`buy`?`ticket.buy`:`ticket.sell`)} ${i}`;a.setAttribute(`aria-label`,o),a.title=o,n===`buy`?e.cell.insertBefore(a,e.figure):e.cell.appendChild(a)}}fillCell(e,n,r,i,a){if(!(r>0)){e.disabled=!0,e.textContent=``,e.removeAttribute(`aria-label`),e.title=``,e.style.removeProperty(`--w`);return}e.disabled=!1;let o=Nc(r);e.textContent=o,e.style.setProperty(`--w`,`${(r*a).toFixed(1)}%`);let s=t.r(this.t(n===`sell`?`ladder.sellAt`:`ladder.buyAt`),{price:this.callbacks.formatPrice(i)});e.setAttribute(`aria-label`,`${o}, ${s}`),e.title=s}placeSpread(){let e=this.el;if(this.placed||!this.spreadEl.isConnected||e.clientHeight===0)return;let t=e.getBoundingClientRect().top,n=this.colsEl.getBoundingClientRect().bottom-t,r=this.spreadEl.getBoundingClientRect().top-t;e.scrollTop+=r-n-(e.clientHeight-n-this.spreadEl.offsetHeight)/2,this.placed=!0}};function Mc(e){let t=1/0;for(let n=1;n<e.length;n++)t=Math.min(t,Math.abs(e[n-1].price-e[n].price));return Number.isFinite(t)&&t>0?t/2:Ac}function Nc(e){return e>=1e3?`${Number((e/1e3).toFixed(1))}k`:String(Number(e>=1?e.toFixed(2):e.toPrecision(2)))}var Pc=class{el;bodyEl;callbacks;open=!1;constructor(e,n,r=t.t){this.t=r,this.callbacks=n,this.el=document.createElement(`div`),this.el.className=`tcw-datawin`,E(this.el,`dataWindow`),this.el.hidden=!0;let i=document.createElement(`div`);i.className=`tcw-datawin-header`;let a=document.createElement(`span`);a.textContent=this.t(`dataWindow.title`);let o=document.createElement(`button`);o.type=`button`,o.className=`tcw-datawin-close`,o.setAttribute(`aria-label`,this.t(`common.close`)),o.innerHTML=D(`x`,14),o.addEventListener(`click`,()=>this.callbacks.onClose?this.callbacks.onClose():this.close()),i.appendChild(a),i.appendChild(o),this.el.appendChild(i),this.bodyEl=document.createElement(`div`),this.bodyEl.className=`tcw-datawin-body`,this.el.appendChild(this.bodyEl),e.appendChild(this.el)}get element(){return this.el}isOpen(){return this.open}toggle(){this.open?this.close():this.openPanel()}openPanel(){this.open=!0,this.el.hidden=!1}close(){this.open=!1,this.el.hidden=!0}destroy(){this.el.remove()}render(e){if(!this.open)return;if(this.bodyEl.replaceChildren(),!e.ohlc){let e=document.createElement(`div`);e.className=`tcw-datawin-empty`,e.textContent=this.t(`dataWindow.hover`),this.bodyEl.appendChild(e);return}let t=this.callbacks.formatPrice,n=e.ohlc;this.bodyEl.appendChild(this.row(this.t(`dataWindow.open`),t(n.open))),this.bodyEl.appendChild(this.row(this.t(`dataWindow.high`),t(n.high))),this.bodyEl.appendChild(this.row(this.t(`dataWindow.low`),t(n.low))),this.bodyEl.appendChild(this.row(this.t(`dataWindow.close`),t(n.close)));let r=e.change>0?`up`:e.change<0?`down`:``,i=e.change>0?`+`:``;this.bodyEl.appendChild(this.row(this.t(`dataWindow.change`),`${i}${t(e.change)} (${i}${e.changePct.toFixed(2)}%)`,r)),this.bodyEl.appendChild(this.row(this.t(`dataWindow.volume`),Ic(n.volume)));for(let t of e.indicators){let e=document.createElement(`div`);e.className=`tcw-datawin-sub`,e.textContent=t.name,this.bodyEl.appendChild(e);for(let e of t.values)this.bodyEl.appendChild(this.row(e.key,Fc(e.value)))}}row(e,t,n=``){let r=document.createElement(`div`);r.className=`tcw-datawin-row`;let i=document.createElement(`span`);i.className=`tcw-datawin-label`,i.textContent=e;let a=document.createElement(`span`);return a.className=`tcw-datawin-value${n?` tcw-${n}`:``}`,a.textContent=t,r.appendChild(i),r.appendChild(a),r}};function Fc(e){if(!Number.isFinite(e))return`—`;let t=Math.abs(e);return t>=1e3?e.toFixed(2):t>=1?e.toFixed(4):e.toPrecision(4)}function Ic(e){return e>=1e9?(e/1e9).toFixed(2)+`B`:e>=1e6?(e/1e6).toFixed(2)+`M`:e>=1e3?(e/1e3).toFixed(2)+`K`:e.toFixed(0)}var Lc=globalThis.Buffer;function Rc(e){if(Lc)return Lc.from(e,`utf8`).toString(`base64`);let t=new TextEncoder().encode(e),n=``;for(let e of t)n+=String.fromCharCode(e);return btoa(n)}function zc(e){if(Lc)return Lc.from(e,`base64`).toString(`utf8`);let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return new TextDecoder().decode(n)}function Bc(e){return e.replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/,``)}function Vc(e){let t=e.replace(/-/g,`+`).replace(/_/g,`/`);return t+(t.length%4==0?``:`=`.repeat(4-t.length%4))}function Hc(e){return Bc(Rc(JSON.stringify(e)))}function Uc(e){if(!e)return null;try{let t=zc(Vc(e)),n=JSON.parse(t);return!n||n.v!==1||typeof n.symbol!=`string`?null:{v:1,symbol:n.symbol,timeframe:n.timeframe,chartType:n.chartType,scaleMode:n.scaleMode??`regular`,indicators:Array.isArray(n.indicators)?n.indicators:[],drawings:Array.isArray(n.drawings)?n.drawings:[]}}catch{return null}}var Wc=`tcw`;function Gc(e){let t=e.startsWith(`#`)?e.slice(1):e;for(let e of t.split(`&`)){let t=e.indexOf(`=`);if(!(t<=0||e.slice(0,t)!==Wc))try{return decodeURIComponent(e.slice(t+1))}catch{return null}}return null}function Kc(e,t){let[n]=e.split(`#`);return`${n}#${Wc}=${t}`}var qc=[[34,16,28,26,!1],[30,14,24,26,!0],[26,18,20,30,!0],[30,10,24,22,!1],[20,16,14,28,!0],[14,18,8,30,!0],[18,10,12,20,!1],[8,18,2,30,!0]],Jc=class{el;label;showTimer=null;phase=`loading`;constructor(e,t){this.loadingText=t,this.el=document.createElement(`div`),this.el.className=`tcw-loading-overlay`,this.el.setAttribute(`role`,`status`),this.el.setAttribute(`aria-live`,`polite`);let n=document.createElement(`div`);n.className=`tcw-loading-card`;let r=document.createElement(`div`);r.className=`tcw-loading-candles`,r.setAttribute(`aria-hidden`,`true`),qc.forEach(([e,t,n,i,a],o)=>{let s=document.createElement(`span`);s.className=a?`tcw-loading-candle tcw-loading-candle--up`:`tcw-loading-candle`,s.style.setProperty(`--tcw-body-top`,`${e}px`),s.style.setProperty(`--tcw-body-h`,`${t}px`),s.style.setProperty(`--tcw-wick-top`,`${n}px`),s.style.setProperty(`--tcw-wick-h`,`${i}px`),s.style.setProperty(`--tcw-delay`,`${o*110}ms`),r.appendChild(s)}),n.appendChild(r);let i=document.createElement(`div`);i.className=`tcw-loading-track`,i.setAttribute(`aria-hidden`,`true`),i.appendChild(document.createElement(`span`)),n.appendChild(i),this.label=document.createElement(`div`),this.label.className=`tcw-loading-label`,this.label.textContent=t,n.appendChild(this.label),this.el.appendChild(n),e.appendChild(this.el)}begin(e,t=!1){if(this.phase=`loading`,this.clearTimer(),this.label.textContent=this.loadingText,this.el.classList.remove(`tcw-loading-overlay--error`),this.el.classList.toggle(`tcw-loading-overlay--veil`,e),!e||t||this.isShown()){this.el.classList.remove(`tcw-loading-overlay--hidden`);return}this.showTimer=setTimeout(()=>{this.showTimer=null,this.el.classList.remove(`tcw-loading-overlay--hidden`)},200)}end(){this.phase=`idle`,this.clearTimer(),this.el.classList.add(`tcw-loading-overlay--hidden`)}fail(e){this.phase!==`idle`&&(this.phase=`failed`,this.clearTimer(),this.label.textContent=e,this.el.classList.add(`tcw-loading-overlay--error`),this.el.classList.remove(`tcw-loading-overlay--hidden`))}isActive(){return this.phase!==`idle`}hasFailed(){return this.phase===`failed`}isShown(){return!this.el.classList.contains(`tcw-loading-overlay--hidden`)}destroy(){this.clearTimer(),this.el.remove()}clearTimer(){this.showTimer!==null&&(clearTimeout(this.showTimer),this.showTimer=null)}},Yc=4e3,Xc=class{el;text;hideTimer=null;constructor(e,t){this.texts=t,this.el=document.createElement(`div`),this.el.className=`tcw-history-pill tcw-history-pill--hidden`,this.el.setAttribute(`aria-hidden`,`true`),this.el.setAttribute(`role`,`status`),this.el.setAttribute(`aria-live`,`polite`);let n=document.createElement(`span`);n.className=`tcw-history-spinner`,n.setAttribute(`aria-hidden`,`true`),this.text=document.createElement(`span`),this.el.append(n,this.text),e.appendChild(this.el)}update(e){this.clearTimer(),e.state===`loading`?this.show(this.texts.loading,!1):e.state===`error`?(this.show(this.texts.failed,!0),this.hideTimer=setTimeout(()=>this.hide(),Yc)):this.hide()}destroy(){this.clearTimer(),this.el.remove()}show(e,t){this.text.textContent=e,this.el.classList.toggle(`tcw-history-pill--error`,t),this.el.classList.remove(`tcw-history-pill--hidden`),this.el.removeAttribute(`aria-hidden`)}hide(){this.hideTimer=null,this.el.classList.add(`tcw-history-pill--hidden`),this.el.setAttribute(`aria-hidden`,`true`),this.text.textContent=``}clearTimer(){this.hideTimer!==null&&clearTimeout(this.hideTimer),this.hideTimer=null}},Zc=`host:`;function Qc(e,t){return[...e,...e.length>0&&t.length>0?[`separator`]:[],...t.map((e,t)=>({id:`${Zc}${t}`,label:e.label,icon:e.icon,danger:e.danger,checked:e.checked}))]}function $c(e,t){return e.startsWith(Zc)?(t[Number(e.slice(5))]?.onSelect(),!0):!1}var el=typeof navigator<`u`&&/mac|iphone|ipad|ipod/i.test(navigator.platform||navigator.userAgent),tl={ctrl:`ctrl`,control:`ctrl`,cmd:`ctrl`,command:`ctrl`,meta:`ctrl`,mod:`ctrl`,alt:`alt`,option:`alt`,opt:`alt`,shift:`shift`},nl={esc:`escape`,space:` `,spacebar:` `,up:`arrowup`,down:`arrowdown`,left:`arrowleft`,right:`arrowright`,del:`delete`,return:`enter`,plus:`+`};function rl(e){let t=e.split(`+`).map(e=>e.trim()),n=t.pop();if(!n)return null;let r={ctrl:!1,alt:!1,shift:!1,display:[]};for(let e of t){let t=tl[e.toLowerCase()];if(!t)return null;r[t]=!0}let i=n.toLowerCase();if(tl[i])return null;if(/^[a-z]$/.test(i))r.code=`Key${i.toUpperCase()}`,r.char=i;else if(/^[0-9]$/.test(i))r.code=`Digit${i}`,r.char=i;else if(r.key=nl[i]??i,r.shift&&r.key.length===1)return null;return r.display=[...r.ctrl?[el?`⌘`:`Ctrl`]:[],...r.alt?[`Alt`]:[],...r.shift?[`Shift`]:[],r.key===` `?`Space`:n.length===1?n.toUpperCase():n],r}function il(e,t){if((e.ctrlKey||e.metaKey)!==t.ctrl||e.altKey!==t.alt)return!1;if(t.code!==void 0){if(e.shiftKey!==t.shift)return!1;if(t.alt)return e.code===t.code;let n=e.key.length===1&&/^[a-z0-9]$/i.test(e.key)?e.key.toLowerCase():null;return n===null?e.code===t.code:n===t.char}return t.shift&&!e.shiftKey?!1:e.key.toLowerCase()===t.key}var al=new Set(`escape(enter(delete(backspace(arrowleft(arrowright(arrowup(arrowdown(home(end(+(-(=( (,(.(ctrl+z(ctrl+shift+z(ctrl+y(ctrl+c(ctrl+v(ctrl+d(ctrl+g(ctrl+shift+g(ctrl+[(ctrl+]`.split(`(`));function ol(e){let t=`${e.ctrl?`ctrl+`:``}${e.alt?`alt+`:``}${e.shift?`shift+`:``}${e.char??e.key}`;return al.has(t)}function sl(e){let t=typeof e.composedPath==`function`?e.composedPath()[0]:e.target;return t instanceof HTMLElement?t.isContentEditable||/^(INPUT|TEXTAREA|SELECT)$/.test(t.tagName):!1}var cl=48,ll=5e4,ul=100;function dl(){return new Promise(e=>{if(typeof requestAnimationFrame!=`function`||document.hidden){setTimeout(e,0);return}let t=setTimeout(e,ul);requestAnimationFrame(()=>setTimeout(()=>{clearTimeout(t),e()},0))})}var fl=[`#4c8dff`,`#a57cff`,`#1398a8`,`#e25592`,`#8a93a3`,`#62c895`],pl=864e5,ml={alerts:`alerts`,objectTree:`objectTree`,dataWindow:`dataWindow`,symbolInfo:`symbolInfo`,depthLadder:`depthLadder`},hl=2,gl={alerts:`alerts`,objectTree:`objects`,symbolInfo:`symbolInfo`,depthLadder:`trade`};function _l(e){if(e.ctrlKey||e.metaKey||e.altKey||e.isComposing||e.keyCode===Tl||e.getModifierState?.(`AltGraph`))return null;if(/^[a-z]$/i.test(e.key))return e.key;let t=/^Key([A-Z])$/.exec(e.code??``);return t&&[...e.key].length===1&&!/[\s\d]/.test(e.key)?t[1].toLowerCase():null}var vl=4,yl=7,bl=17,xl=3,Sl=[`1m`,`3m`,`5m`,`15m`,`30m`,`1h`,`2h`,`4h`,`1d`],Cl=5e3,wl=()=>{let e=document.activeElement;return e instanceof Element&&e.closest(`[role="dialog"], [aria-modal="true"], [role="menu"]`)!==null},Tl=229,El=1e3,Dl=T.filter(e=>n.CHART_STYLE_KEYS[e]!==`color`),Ol=()=>typeof document<`u`&&document.hidden,kl=200,Al=class{chart;state;themeOf={dark:n.DARK_THEME,light:n.LIGHT_THEME};toolbar=null;sidebar=null;settings=null;statusBar=null;goToDate=null;tooltip;indicatorLegend=null;legendFrame=0;portal=document.createElement(`div`);stopKeyboardInset=null;stopNarrow=null;stopFormControls=null;overlayHost=()=>{let e=document.fullscreenElement===this.root?this.root:document.body;return this.portal.parentElement!==e&&e.appendChild(this.portal),this.portal};unregisterKeys=()=>{};onFullscreenChange=()=>{this.toolbar?.setFullscreen(document.fullscreenElement===this.root),this.portal.isConnected&&this.overlayHost()};commandPalette=null;symbolSearch=null;dock=null;dockNarrow=null;dockObserver=null;hotkeySheet=null;replayBar=null;dragDrop=null;alertsPanel=null;objectTree=null;indicatorSettings=null;indicatorPicker=null;drawingStyle=null;drawingSettings=null;drawingMenu=null;selectionToolbar=null;selectionToolbarFrame=null;chartMenu=null;menuPane=null;canExport=!0;symbolLoads=new Map;ui;legendMenu=null;templates=new Ms;templatePrompt=null;chartTemplates=new Ua;chartTemplatePrompt=null;drawingTemplatePrompt=null;settingsEdit=null;intervalInput=null;markerTip=null;accountPanel=null;orderTicket=null;accountFrame=0;layoutSession=null;layoutsUI=null;bracketBar=null;alertNotifier=null;depthLadder=null;dataWindow=null;lastHoverIndex=null;legendHoverIndex=null;favoritesStore=new Ws;indicatorFavorites=new Ws(`tcw:indicator-favorites`);indicatorDefaults=new Fa;timeframeFavorites=new Ws(`tcw:tf-favorites`);customTimeframes=new Ws(`tcw:tf-custom`);timeframes=[];watchlist=null;watchlistSparkBuffer=new Map;sessionRefPrice=null;hostWatchlistRefPrice=new Map;watchlistInterval=null;watchlistStore=null;watchlistFromSymbols=!1;quoteSource=null;stopQuotes=null;quotedKey=``;quotes=new Map;symbolInfoPanel=null;news=new hi;marketTimer=null;clockTimer=null;onPageShown=null;chartNav=null;visibleBarCount=50;replayPollInterval=null;replaySpeed=5;replayStep=`bar`;replayStartSeq=0;replayStepsCache=null;replayShade=null;layoutKeyPrefix=null;layoutDebounceMs=1500;activeLayoutKey=null;root;chartContainer;loading;historyPill;connectSeq=0;localSeq=0;lastLocalSwitchMs=0;destroyed=!1;options;symbols;symbolCatalog;chartInfoAtSwitch=null;settingsState;settingsDefaults;t;adapter=null;boundGlobalKeydown=null;baseSeries=null;baseTimeframeMs=0;chosenTimeframe=null;rangeSeq=0;rangeQueue=Promise.resolve();compares=[];compareWay=`percent`;comparesLoading=new Set;featureState;hostHotkeys=[];hostMenus=new Set;hostLayer=null;priceAxisAddDefault=!1;constructor(i,a={}){this.options=a;let o=Gt(a.symbols??pe);this.symbols=o.names,this.symbolCatalog=o.info;let s=a.chartOptions;if(this.settingsState={...me,...s?.numberLocale?{numberLocale:s.numberLocale}:{},...s?.timeZone==null?{}:{timezone:c(s.timeZone)},...s?.leftPriceScale===void 0?{}:{leftPriceScale:s.leftPriceScale},...s?.highLowLines===void 0?{}:{highLowLines:s.highLowLines},...s?.extendedHours===void 0?{}:{extendedHours:s.extendedHours},...s?.chartTypeOptions?{chartTypeOptions:(0,n.readChartTypeOptions)(s.chartTypeOptions)}:{}},this.t=t.n(t.o(a.locale,a.messages)),this.featureState=Re(a),a.persistLayouts){let e=a.persistLayouts===!0?{}:a.persistLayouts;this.layoutKeyPrefix=e.keyPrefix??`tcw:layout:`,this.layoutDebounceMs=e.debounceMs??1500}let u=this.resolveIsDark(a.theme),d=this.resolveTheme(a.theme);this.themeOf={...this.themeOf,[u?`dark`:`light`]:d};let f={drawings:!0,drawingMagnet:!0,drawingUndoRedo:!0,indicators:!0,trading:a.trading!==!1,tradingContextMenu:!1,priceAxisAddButton:this.featureState.alerts||a.trading!==!1||this.featureState.sidebar,volume:!0,legend:!0,crosshair:!0,crosshairTooltip:!1,keyboard:!0,screenshot:!0,alerts:!0,barCountdown:!0,logScale:!0,watermark:!0,...a.chartOptions?.features};this.priceAxisAddDefault=f.priceAxisAddButton===!0;let p={...f,priceAxisAddButton:this.priceAxisAddDefault&&this.featureState[`menu.priceAxisAdd`]};if(this.canExport=f.dataExport!==!1,this.settingsDefaults={...this.settingsState,legendVisible:f.legend!==!1,barCountdown:f.barCountdown!==!1,indicatorValueLabels:f.indicatorValueLabels===!0},this.settingsState={...this.settingsDefaults},this.timeframes=kt(Ct(a.timeframes,f.timeframes),this.customTimeframes.list(),f.timeframes),!this.timeframes.some(e=>this.timeframeFavorites.has(e))){let e=wt(this.timeframes,f.defaultTimeframeFavorites,!!a.timeframes?.length);for(let t of e)this.timeframeFavorites.add(t)}let m=a.timeframe??`5m`,h=!f.timeframes?.length||f.timeframes.includes(m)?m:this.timeframes[0]??m;this.state={symbol:a.symbol??this.symbols[0]??`BTCUSDT`,timeframe:h,chartType:a.chartOptions?.chartType??`candlestick`,isDark:u,activeIndicators:new Map,activeTool:null,magnetEnabled:f.drawingMagnet!==!1,magnetStrong:!1,eraser:!1,zoomArea:!1,stayInDrawing:!1,connectionState:a.adapter?`connecting`:`disconnected`,connectionMessage:a.adapter?this.t(`status.connecting`):``},Ye(),this.root=document.createElement(`div`),this.root.className=`tcw-root`,this.root.dataset.tcwTheme=u?`dark`:`light`;let ee=a.dir===`ltr`||a.dir===`rtl`?a.dir:Vl(a.locale)?`rtl`:`ltr`;this.root.dir=ee,this.portal.dir=ee,i.appendChild(this.root),this.tooltip=new uc(this.root),this.portal.className=`tcw-root tcw-portal`,this.portal.dataset.tcwTheme=this.root.dataset.tcwTheme,this.stopKeyboardInset=Gs([this.root,this.portal]),this.stopNarrow=Ks(this.root,e=>{this.toolbar?.fit(),e||this.sidebar?.closeOverlay(),this.syncRail()}),this.ui=U(a.ui);let g=a.ui!==void 0;W(this.root,this.ui,{variables:g}),W(this.portal,this.ui,{variables:g}),this.markSwitchedOff(),this.stopFormControls=ue([this.root,this.portal],{layer:this.overlayHost,labels:()=>({prevMonth:this.t(`calendar.prevMonth`),nextMonth:this.t(`calendar.nextMonth`),today:this.t(`calendar.today`)}),locale:()=>this.intlLocale()}),this.toolbar=new sn(this.root,{symbols:this.symbols,timeframes:this.timeframeMenu(),timeframeFavorites:this.pinnedTimeframes(),chartTypes:a.chartTypes?de.filter(e=>a.chartTypes.includes(e.value)):de},{onSymbolClick:()=>this.handleSymbolClick(),onSymbolInfo:()=>this.toggleSymbolInfo(),onTimeframe:e=>this.handleTimeframe(e),onToggleTimeframeFavorite:e=>this.handleToggleTimeframeFavorite(e),onAddTimeframe:e=>this.handleAddTimeframe(e),onRemoveTimeframe:e=>this.handleRemoveTimeframe(e),onChartType:e=>this.handleChartType(e),onIndicators:()=>this.toggleIndicatorPicker(),onScreenshot:()=>this.chart.screenshot(),onSettings:()=>this.openSettings(),onToggleTheme:()=>this.handleToggleTheme(),onToggleReplay:()=>this.toggleReplay(),onToggleAlerts:()=>this.toggleAlerts(),onToggleObjects:()=>this.toggleObjects(),onToggleAccount:a.trading===!1?void 0:()=>this.toggleAccountPanel(),onLayouts:a.layouts===!1?void 0:e=>void this.layoutsUI?.openMenu(e),onBracket:a.trading===!1?void 0:e=>this.startBracket(e),onToggleLadder:a.trading!==!1&&a.depthLadder?()=>this.toggleLadder():void 0,onOrderTicket:a.trading===!1?void 0:()=>this.openOrderTicket(),onCompare:a.adapter&&f.compareSymbols!==!1?()=>this.handleAddCompare():void 0,onUndo:()=>this.chart.undo(),onRedo:()=>this.chart.redo(),onToggleFullscreen:typeof document<`u`&&document.fullscreenEnabled?()=>this.toggleFullscreen():void 0},this.t,this.overlayHost);let _=document.createElement(`div`);_.className=`tcw-body`,a.drawingFavorites&&this.favoritesStore.seedDefaults(a.drawingFavorites),this.sidebar=new hn(_,{drawingToolGroups:gt(fe,this.t),favorites:this.favoritesStore.list(),shortcuts:xi()},{onDrawingTool:e=>this.handleDrawingTool(e),onCancelDrawing:()=>this.handleCancelDrawing(),onToggleMagnet:f.drawingMagnet===!1?void 0:()=>this.handleToggleMagnet(),onToggleEraser:()=>this.chart.setEraserMode(!this.chart.isEraserMode()),onToggleZoomArea:()=>this.chart.setZoomAreaMode(!this.chart.isZoomAreaMode()),onToggleFavorite:e=>this.handleToggleFavorite(e),onClearDrawings:()=>{this.chart.clearDrawings(),this.state={...this.state,activeTool:null},this.updateUI()},onToggleStyle:()=>this.drawingStyle?.toggle(),onToggleStayInDrawing:()=>this.handleToggleStayInDrawing(),onLockAll:e=>{this.chart.setDrawingsLocked(this.chart.getDrawings().map(e=>e.id),e),this.refreshDrawingsState(),this.refreshObjects()},onHideAll:e=>{this.chart.setDrawingsVisible(this.chart.getDrawings().map(e=>e.id),!e),this.refreshDrawingsState(),this.refreshObjects()}},this.t),this.chartContainer=document.createElement(`div`),this.chartContainer.className=`tcw-chart-container`,this.chartContainer.dir=`ltr`,_.appendChild(this.chartContainer),this.loading=new Jc(this.chartContainer,this.t(`status.loading`)),this.historyPill=new Xc(this.chartContainer,{loading:this.t(`history.loading`),failed:this.t(`history.failed`)}),this.dock=new ec(_,{labels:{rail:this.t(`dock.rail`),resize:this.t(`dock.resize`)},savedWidth:()=>Ll(),saveWidth:e=>Rl(e),railShown:()=>this.railShown(),focusAfterClose:e=>this.panelFocusTarget(e),room:()=>_.clientWidth}),a.watchlist&&this.createWatchlist(_,a.watchlist===!0?{}:a.watchlist),this.root.appendChild(_);let v=document.createElement(`div`);v.className=`tcw-account-dock`,E(v,`accountPanel`),this.root.appendChild(v),this.chart=new e.c(this.chartContainer,{chartType:this.state.chartType,theme:d,autoScale:!0,crosshair:{mode:`magnet`},a11y:{labels:{role:this.t(`a11y.role`),summary:this.t(`a11y.summary`),empty:this.t(`a11y.empty`),view:this.t(`a11y.view`),bar:this.t(`a11y.bar`),keys:this.t(`a11y.keys`),typeName:e=>{let t=`chartType.${e}`,n=this.t(t);return n===t?e:n}}},...a.chartOptions,features:p}),a.chartOptions?.shapes||this.applyChartShapes(),this.chartInfoAtSwitch=this.chart.getSymbolInfo(),this.applyLegendFont(),this.applyChartLook();for(let[e,t]of this.indicatorDefaults.all())this.chart.setIndicatorDefaults(e,t.style);this.chart.on(`visibleRangeChange`,e=>{let{from:t,to:n}=e.payload;Number.isFinite(t)&&Number.isFinite(n)&&(this.visibleBarCount=Math.max(1,n-t))}),this.chartNav=new Ei(this.chartContainer,{zoomIn:()=>this.chart.zoomIn(),zoomOut:()=>this.chart.zoomOut(),scroll:e=>this.chart.scrollBars(e*Math.max(1,Math.round(this.visibleBarCount/10))),reset:()=>this.resetView(),plotRect:()=>this.chart.getPlotRect()},this.t),this.chart.on(`dataUpdate`,e=>this.handleDataUpdate(e.payload)),this.chart.on(`historyLoad`,e=>this.historyPill.update(e.payload)),this.chart.on(`symbolInfoChange`,()=>{this.refreshSymbolTitle(),this.refreshMarket()}),this.refreshSymbolTitle(),this.symbolInfoPanel=new ui(this.root,this.t,{onClose:()=>this.closePanelByHand(`symbolInfo`),onToggle:e=>{this.toolbar?.setActive(`symbolInfo`,e),e&&(this.refreshSymbolInfo(),this.loadNews())}}),this.marketTimer=setInterval(()=>this.refreshMarket(),3e4),this.onPageShown=()=>{Ol()||this.refreshMarket()},document.addEventListener(`visibilitychange`,this.onPageShown),this.dragDrop=new e.o(this.chartContainer,{onData:(e,n,r)=>{this.setData(e);let i=t.r(this.t(`toast.fileLoaded`),{count:n.data.length,file:r.name});this.say(n.skipped>0?`${i} (${t.r(this.t(`toast.fileSkipped`),{count:n.skipped})})`:i)},onError:(e,t)=>{this.say(`${t.name}: ${e.message}`,`error`)}}),this.featureState.dragDropImport&&this.dragDrop.attach(),this.statusBar=new Jn(this.root,{presets:r.RANGE_PRESETS,presetLabels:{All:this.t(`range.all`)},groupLabel:this.t(`range.presets`),goToLabel:this.t(`range.goTo`),moreLabel:this.t(`toolbar.more`),onPreset:e=>void this.applyRangePreset(e),onGoTo:()=>this.toggleGoToDate(),goToKeys:()=>this.keysShown(`hotkeys.goToDate`,`Alt+G`)},{label:this.t(`statusBar.label`),clock:{label:this.t(`settings.timezone`),now:()=>this.clockNow(),options:()=>({current:this.settingsState.timezone,list:l(this.settingsState.timezone,Date.now(),this.t(`settings.timezone.local`),this.exchangeChoice())}),onPick:e=>this.changeSettings({timezone:e})},scale:{labels:{group:this.t(`settings.priceScale`),percent:this.t(`settings.scale.percentage`),log:this.t(`settings.scale.logarithmic`),auto:this.t(`settings.autoScale`)},texts:{log:this.t(`statusBar.log`),auto:this.t(`statusBar.auto`)},onPercent:()=>this.toggleScaleMode(`percentage`),onLog:f.logScale===!1?void 0:()=>this.toggleScaleMode(`logarithmic`),onAuto:()=>this.changeSettings({autoScale:!this.chart.isAutoScale()})}}),this.clockTimer=setInterval(()=>{!Ol()&&this.featureState.statusBar&&this.featureState[`statusBar.clock`]&&this.statusBar?.tick()},El),this.chart.on(`priceRangeChange`,()=>this.refreshScaleSwitches()),this.refreshScaleSwitches(),this.goToDate=new Zs(this.overlayHost,()=>({title:this.t(`goTo.title`),date:this.t(`range.date`),range:this.t(`goTo.range`),from:this.t(`goTo.from`),to:this.t(`goTo.to`),time:this.t(`range.time`),submit:this.t(`range.goToSubmit`),cancel:this.t(`range.cancel`),close:this.t(`common.close`),calendar:{prevMonth:this.t(`calendar.prevMonth`),nextMonth:this.t(`calendar.nextMonth`),today:this.t(`calendar.today`)}}),()=>this.intlLocale(),e=>this.goTo(e)),this.settings=new In({onChange:e=>this.changeSettings(e),onReset:()=>this.resetSettings(),onClose:()=>this.endSettingsEdit(!0),onCancel:()=>this.endSettingsEdit(!1),templates:{list:()=>this.chartTemplates.list().map(e=>e.name),apply:e=>this.applyChartTemplate(e),remove:e=>this.chartTemplates.remove(e),save:()=>this.promptSaveChartTemplate()},styleValue:e=>this.chart.getStyleValue?.(e)??null,onStyleChange:e=>this.changeStyle(e)},this.t,{barCountdown:f.barCountdown,logScale:f.logScale,trading:f.trading!==!1,exchangeZone:()=>this.exchangeChoice()?.zone},this.overlayHost),this.symbolSearch=new Rr({onPick:e=>{this.setSymbol(e)},onClose:()=>{}},this.overlayHost,this.t),this.hotkeySheet=new Ur({onClose:()=>{}},this.t,this.overlayHost),this.chart.on(`drawingToolChange`,e=>{let t=e.payload.tool;t!==this.state.activeTool&&(this.state={...this.state,activeTool:t},this.updateUI())}),this.chart.on(`toolModeChange`,e=>{let{eraser:t,zoomArea:n}=e.payload;this.state={...this.state,eraser:t??this.state.eraser,zoomArea:n??this.state.zoomArea},this.updateUI()}),this.chart.on(`indicatorAdd`,()=>this.syncIndicatorsFromChart()),this.chart.on(`indicatorRemove`,()=>this.syncIndicatorsFromChart()),this.chart.setPaneTitlesVisible(!this.featureState.indicatorLegend),this.indicatorLegend=new bc(this.chartContainer,{onToggleVisible:(e,t)=>{this.chart.setIndicatorVisible(e,t),this.scheduleLegend(),this.objectTree?.isOpen()&&this.refreshObjects()},onSettings:e=>{this.featureState[`indicatorLegend.settings`]&&this.openIndicatorSettings(e)},onRemove:e=>this.handleRemoveIndicator(e),onMore:(e,t)=>this.openLegendMenu(e,t),onPaneAction:(e,t)=>this.runPaneAction(e,t)},{show:this.t(`legend.show`),hide:this.t(`legend.hide`),settings:this.t(`legend.settings`),remove:this.t(`legend.remove`),collapse:this.t(`legend.collapse`),expand:this.t(`legend.expand`),more:this.t(`legend.more`),paneUp:this.t(`pane.moveUp`),paneDown:this.t(`pane.moveDown`),paneCollapse:this.t(`pane.collapse`),paneExpand:this.t(`pane.expand`),paneMaximize:this.t(`pane.maximize`),paneRestore:this.t(`pane.restore`),offInterval:this.t(`indicatorSettings.offInterval`)}),this.legendMenu=new k(this.root,this.t(`legend.more`)),this.chart.on(`crosshairMove`,e=>{let t=e.payload;this.legendHoverIndex=typeof t.barIndex==`number`?t.barIndex:null,this.scheduleLegend()}),this.chart.on(`crosshairLeave`,()=>{this.legendHoverIndex=null,this.scheduleLegend()});for(let e of[`indicatorUpdate`,`indicatorChange`,`dataUpdate`,`resize`,`paneResize`,`paneChange`,`themeChange`,`timeframeChange`])this.chart.on(e,()=>this.scheduleLegend());this.chart.on(`barClick`,e=>{if(!this.replayBar?.isMounted())return;let t=e.payload.barIndex;if(typeof t==`number`){if(this.replayBar.getMode()===`select`){this.startReplayAt(t);return}this.chart.getReplayState()===`playing`&&this.chart.replayPause(),this.chart.replaySeekToBar(t),this.replayBar.setState(`paused`)}}),this.chart.on(`crosshairMove`,e=>{if(this.replayBar?.getMode()!==`select`||!this.replayBar.isMounted())return;let t=e.payload.point;this.positionReplayShade(t?.x??null)}),this.dataWindow=new Pc(this.root,{formatPrice:e=>this.formatAlertPrice(e),onClose:()=>this.closePanelByHand(`dataWindow`)},this.t),this.chart.on(`crosshairMove`,e=>{let t=e.payload;this.lastHoverIndex=typeof t.barIndex==`number`?t.barIndex:null,this.dataWindow?.isOpen()&&this.dataWindow.render(this.buildDataWindowModel())});let y=new Ja,te=new Ya;for(let[e,t]of Object.entries(te.all()))this.chart.setDrawingToolDefaults(e,t??null);this.drawingSettings=new jo(this.root,{onBegin:e=>this.chart.beginDrawingEdit(e),onChange:(e,t)=>this.chart.updateDrawing(e,t),onEnd:(e,t)=>{this.chart.endDrawingEdit(e,{cancel:t}),this.refreshObjects()},toWallTime:e=>Y(e*(0,n.barTimeUnit)(this.chart.getData()),this.displayTimezone()),fromWallTime:(e,t)=>{let r=Ys(e,t,this.displayTimezone());return r===null?null:r/(0,n.barTimeUnit)(this.chart.getData())},roundPrice:e=>this.chart.roundPrice(e),priceStep:()=>this.chart.getPriceStep(),onSaveDefault:(e,n)=>{this.chart.setDrawingToolDefaults(e,n),te.set(e,this.chart.getDrawingToolDefaults(e)),this.say(t.r(this.t(`drawingSettings.defaultSaved`),{name:this.drawingToolName(e)}))},templates:{list:e=>y.list(e),save:e=>this.promptSaveDrawingTemplate(y,e),remove:(e,t)=>y.remove(e,t)}},this.t),this.chart.on(`drawingDoubleClick`,e=>this.openDrawingSettings(e.payload.id)),this.drawingStyle=new $a(this.root,{onStyleChange:e=>{this.chart.setDrawingStyle(e),this.chart.setSelectedDrawingStyle(e)},getStyle:()=>this.chart.getDrawingStyle()},y,this.t),this.drawingMenu=new k(this.root,this.t(`drawingMenu.label`)),this.chart.on(`drawingContextMenu`,e=>{let{id:t,x:n,y:r}=e.payload;this.openDrawingMenu(t,n,r)}),this.selectionToolbar=new so(this.root,{onStyle:e=>{for(let t of this.chart.getSelectedDrawingIds())this.chart.setSelectedDrawingStyle(e,t);this.updateSelectionToolbar()},onSettings:()=>{let e=this.chart.getSelectedDrawingIds()[0];e&&this.openDrawingSettings(e)},onAlert:()=>{let e=this.chart.getSelectedDrawingIds()[0];e&&this.addDrawingAlert(e)},onLock:e=>{this.chart.setDrawingsLocked(this.chart.getSelectedDrawingIds(),e),this.refreshObjects(),this.updateSelectionToolbar()},onMore:(e,t)=>{let n=this.chart.getSelectedDrawingIds()[0];if(!n)return;let r=this.chartOffset();this.openDrawingMenu(n,e-r.x,t-r.y)},onDelete:()=>{this.chart.removeDrawings(this.chart.getSelectedDrawingIds()),this.refreshObjects(),this.updateSelectionToolbar()}},this.t);for(let e of[`drawingCreate`,`drawingUpdate`,`drawingRemove`])this.chart.on(e,()=>this.refreshDrawingsState());this.chart.on(`historyChange`,e=>{let{canUndo:t,canRedo:n}=e.payload;this.toolbar?.setHistory(t,n)});for(let e of[`drawingSelect`,`drawingToolChange`,`toolModeChange`])this.chart.on(e,()=>this.updateSelectionToolbar());for(let e of[`drawingUpdate`,`drawingRemove`,`historyChange`,`visibleRangeChange`,`priceRangeChange`,`zoomChange`,`resize`,`paneResize`,`paneChange`,`dataUpdate`,`replayStep`,`chartTypeChange`])this.chart.on(e,()=>this.scheduleSelectionToolbar());if(this.chartMenu=new k(this.root,this.t(`chartMenu.label`),this.t(`common.back`)),this.chart.on(`symbolSeriesRequest`,e=>void this.loadSymbolSeries(e.payload.symbol)),this.chart.on(`chartContextMenu`,e=>{if(!this.featureState[`menu.chart`])return;let{area:t,x:n,y:r,price:i,time:a,pane:o}=e.payload,s=i===void 0?void 0:this.chart.roundPrice(i),c={...this.chartMenuContext(s),...o?{pane:this.chart.getPaneScale(o)}:{}};this.menuPane=o??null,this.openChartMenu(Ke(Wo(t,c,this.t),Pe,this.featureState),n,r,{area:t,price:s,time:a})}),this.chart.on(`priceAxisAdd`,e=>{if(!this.featureState[`menu.priceAxisAdd`])return;let{price:t,x:n,y:r}=e.payload,i=this.chart.roundPrice(t),a=Ke(Ro(this.chartMenuContext(i),this.t),Pe,this.featureState);this.openChartMenu(a,n,r,{area:`priceAxisAdd`,price:i})}),this.chart.on(`signalMarkerHover`,e=>this.showMarkerTip(e.payload)),this.intervalInput=new js(this.chartContainer,{title:this.t(`interval.title`),hint:this.t(`interval.hint`),invalid:this.t(`interval.invalid`)},e=>this.selectTypedTimeframe(e)),a.layouts!==!1&&this.setupLayouts(a.layouts===!0||a.layouts===void 0?{}:a.layouts),a.trading!==!1){this.orderTicket=new bs(this.root,{onSubmit:e=>{this.chart.placeOrderIntent(e),this.say(t.r(this.t(`ticket.sent`),{side:this.t(e.side===`buy`?`ticket.buy`:`ticket.sell`),quantity:e.quantity??1,price:this.formatAlertPrice(e.price)}))},formatPrice:e=>this.formatAlertPrice(e),formatAmount:e=>this.formatMoney(e),formatNumber:(e,t)=>this.formatNumber(e,t)},this.t),this.accountPanel=new os(v,{onClosePosition:e=>this.chart.closePositionIntent(e),onReversePosition:e=>this.chart.reversePositionIntent(e),onCancelOrder:e=>this.chart.cancelOrderIntent(e),onNewOrder:()=>this.openOrderTicket(),formatPrice:e=>this.formatAlertPrice(e),formatTime:e=>{let{date:t,time:n}=Y(e,this.displayTimezone());return`${t} ${n}`},formatAmount:e=>this.formatMoney(e),formatNumber:(e,t)=>this.formatNumber(e,t),onToggle:e=>{this.toolbar?.setActive(`account`,e),this.refreshAccount()}},this.t);for(let e of[`ordersChange`,`positionsChange`,`executionFill`,`dataUpdate`,`indicatorUpdate`])this.chart.on(e,()=>this.refreshAccountSoon())}if(a.trading!==!1){if(this.bracketBar=new Dc(this.chartContainer,{onConfirm:()=>this.chart.confirmBracket(),onCancel:()=>{this.chart.cancelBracket(),this.bracketBar?.hide()}},this.t),this.chart.on(`bracketPlace`,e=>{let n=e.payload;this.bracketBar?.hide(),this.say(t.r(this.t(n.side===`buy`?`bracket.longPlaced`:`bracket.shortPlaced`),{rr:n.riskReward.toFixed(2)}))}),a.depthLadder){this.depthLadder=new jc(this.root,{onTrade:(e,n)=>{this.chart.placeOrderIntent({side:e,type:`limit`,price:n}),this.say(t.r(this.t(e===`buy`?`order.buyLimit`:`order.sellLimit`),{price:this.formatAlertPrice(n)}))},formatPrice:e=>this.formatAlertPrice(e),priceStep:e=>this.chart.getPriceStep(e),onToggle:e=>this.toolbar?.setActive(`ladder`,e),onClose:()=>this.closePanelByHand(`depthLadder`)},void 0,this.t);let e=this.depthLadder;this.chart.on(`ordersChange`,()=>e.setOrders(this.chart.getOrders()))}this.chart.on(`dataUpdate`,e=>{e.payload.kind===`bracket`&&this.bracketBar?.hide()})}this.alertsPanel=new Fi(this.root,{onClose:()=>this.closePanelByHand(`alerts`),onAdd:({price:e,condition:t,message:n,channel:r,label:i,options:a})=>{try{return this.chart.addAlert(e,t,n,r,i,a),!0}catch{return this.say(this.t(`alerts.invalid`),`error`),!1}},formatTime:e=>{let{date:t,time:n}=Y(e,this.displayTimezone());return`${t} ${n}`},onRemove:e=>this.chart.removeAlert(e),onClear:()=>this.chart.clearAlerts(),getChannelValue:e=>this.getAlertChannelValue(e),formatPrice:e=>this.formatAlertPrice(e)},this.t),this.chart.on(`alertAdd`,()=>this.refreshAlerts()),this.chart.on(`alertRemove`,()=>this.refreshAlerts()),this.chart.on(`alertUpdate`,()=>this.refreshAlerts()),this.chart.on(`alertExpired`,e=>{let n=e.payload;this.refreshAlerts(),this.featureState.alerts&&this.say(t.r(this.t(`alerts.expiredToast`),{text:n.message??this.alertText(n)}))}),a.alertNotifications&&(this.alertNotifier=new Oc(a.alertNotifications)),this.chart.on(`alertTriggered`,e=>{let n=e.payload;if(this.refreshAlerts(),!this.featureState.alerts)return;let r=`${this.alertText(n)}${n.message?` — ${n.message}`:``}`;this.say(t.r(this.t(`alerts.fired`),{text:r}),`info`,`bell`),this.alertNotifier?.notify(r)}),this.indicatorPicker=new Aa(this.overlayHost,{onAdd:e=>this.handleAddIndicator(e),onFavorite:(e,t)=>t?this.indicatorFavorites.add(e):this.indicatorFavorites.remove(e),templates:{onApply:e=>this.applyIndicatorTemplate(e),onDelete:e=>{this.templates.remove(e),this.indicatorPicker?.setTemplates(this.templateNames())},onSave:()=>this.promptSaveIndicatorTemplate()},onClose:()=>this.toolbar?.setIndicatorsOpen(!1)},this.t),this.indicatorSettings=new Ca(this.root,{onApply:(e,t)=>{this.chart.updateIndicator(e,t),this.syncIndicatorsFromChart()},onStyle:(e,t)=>this.chart.updateIndicatorStyle(e,t),onLevels:(e,t)=>this.chart.setIndicatorLevels(e,t),onScale:(e,t)=>this.chart.setIndicatorScale(e,t),onIntervals:(e,t)=>this.chart.setIndicatorIntervals(e,t),onSaveDefault:(e,t)=>this.saveIndicatorDefault(e,t),onClose:()=>this.chart.endIndicatorEdit()},this.t),this.objectTree=new ea(this.root,{onClose:()=>this.closePanelByHand(`objectTree`),onRemoveIndicator:e=>this.handleRemoveIndicator(e),onConfigureIndicator:e=>this.openIndicatorSettings(e),onToggleIndicatorVisible:(e,t)=>{this.chart.setIndicatorVisible(e,t),this.refreshObjects(),this.scheduleLegend()},onRemoveDrawing:e=>{this.drawingSettings?.editing()===e&&this.drawingSettings.close(!0),this.chart.removeDrawing(e),this.refreshObjects()},onConfigureDrawing:this.drawingSettings?e=>this.openDrawingSettings(e):void 0,onToggleDrawingVisible:(e,t)=>{this.chart.setDrawingVisible(e,t),this.refreshObjects()},onToggleDrawingLocked:(e,t)=>{this.chart.setDrawingLocked(e,t),this.refreshObjects()},onToggleGroupVisible:(e,t)=>{this.chart.setDrawingGroupVisible(e,t),this.refreshObjects()},onToggleGroupLocked:(e,t)=>{this.chart.setDrawingGroupLocked(e,t),this.refreshObjects()},onUngroup:e=>{this.chart.ungroupDrawings(e),this.refreshObjects()},onRenameGroup:(e,t)=>{this.chart.renameDrawingGroup(e,t),this.refreshObjects()},onAddCompare:f.compareSymbols===!1?void 0:()=>this.handleAddCompare(),onRemoveCompare:e=>this.handleRemoveCompare(e)},this.t);let b=()=>{this.objectTree?.isOpen()&&this.refreshObjects()},x=0,ne=()=>{x||!this.objectTree?.isOpen()||(x=requestAnimationFrame(()=>{x=0,this.destroyed||b()}))};this.chart.on(`drawingCreate`,b),this.chart.on(`drawingRemove`,b),this.chart.on(`drawingUpdate`,ne),this.chart.on(`timeframeChange`,ne),this.chart.on(`indicatorAdd`,b),this.chart.on(`indicatorRemove`,b),this.chart.on(`indicatorChange`,b);for(let e of[`indicatorAdd`,`indicatorRemove`,`indicatorChange`])this.chart.on(e,()=>this.refreshCompareDialog());this.setupDock(),this.commandPalette=new ir({onIndicator:e=>this.handleAddIndicator(e),onChartType:e=>this.handleChartType(e),onDrawingTool:e=>this.handleDrawingTool(e),onTimeframe:e=>this.handleTimeframe(e),onAction:e=>this.handleAction(e),onClose:()=>{}},this.overlayHost,this.t,{list:()=>Pl(),add:e=>Fl([e,...Pl().filter(t=>t!==e)])}),this.boundGlobalKeydown=e=>{if(this.featureState.hotkeys&&this.replayBar?.isMounted()&&this.handleReplayKey(e)||this.handleHostHotkey(e))return;let t=Ls(this.root),n=e=>this.featureState.hotkeys&&this.featureState[e];if((e.ctrlKey||e.metaKey)&&e.key===`k`){if(!t||!n(`hotkeys.commandPalette`)||!this.featureState.commandPalette)return;e.preventDefault(),this.toggleCommandPalette()}else if((e.ctrlKey||e.metaKey)&&(e.key===`p`||e.key===`P`)){if(!t||!n(`hotkeys.symbolSearch`)||!this.featureState.symbolSearch)return;e.preventDefault(),this.openSymbolSearch()}else if((e.ctrlKey||e.metaKey)&&!e.altKey&&!e.shiftKey&&(e.key===`s`||e.key===`S`)){if(!this.layoutSession||!n(`hotkeys.save`)||!this.featureState.layouts||J()||!Ls(this.root,!0))return;e.preventDefault(),this.saveLayout()}else if(e.altKey&&!e.ctrlKey&&!e.metaKey&&!e.shiftKey&&bi[e.code]){if(e.defaultPrevented||J()||!t||wl()||!n(`hotkeys.tools`))return;e.preventDefault(),this.handleDrawingTool(bi[e.code])}else if(/^[0-9]$/.test(e.key)&&!e.ctrlKey&&!e.metaKey&&!e.altKey){if(e.defaultPrevented||!this.intervalInput||!n(`intervalTyping`)||J()||wl()||!Ls(this.root,!0))return;let t=document.activeElement;if(t&&t!==document.body&&!this.root.contains(t))return;e.preventDefault(),this.intervalInput.open(e.key)}else if(_l(e)!==null){if(e.defaultPrevented||!n(`symbolTyping`)||!this.featureState.symbolSearch||J()||wl()||!Ls(this.root,!0))return;let t=document.activeElement;if(t&&t!==document.body&&!this.root.contains(t))return;e.preventDefault(),this.openSymbolSearch(_l(e))}else if(e.altKey&&!e.ctrlKey&&!e.metaKey&&(e.code===`KeyI`||e.code===`KeyG`||e.code===`KeyR`)){if(J()||!t)return;if(e.code===`KeyI`){if(!n(`hotkeys.invertScale`))return;e.preventDefault(),this.changeSettings({invertScale:!this.settingsState.invertScale}),this.settings?.refresh(this.settingsState)}else if(e.code===`KeyR`){if(!n(`hotkeys.resetView`))return;e.preventDefault(),this.resetView()}else this.goToDate&&n(`hotkeys.goToDate`)&&this.featureState.goToDate&&(e.preventDefault(),this.toggleGoToDate())}else if(e.key===`?`&&!e.ctrlKey&&!e.metaKey&&!e.altKey){if(J()||!t||!n(`hotkeys.help`)||!this.featureState.hotkeySheet)return;e.preventDefault(),this.openHotkeySheet()}},document.addEventListener(`keydown`,this.boundGlobalKeydown),document.addEventListener(`fullscreenchange`,this.onFullscreenChange),this.unregisterKeys=Is(this.root,[this.portal]),a.adapter?(this.adapter=a.adapter,this.connectStream()):this.chart.setDataTimeframe(this.state.timeframe),this.watchlist&&(this.watchlistInterval=setInterval(()=>this.tickWatchlist(),1e3)),this.markSwitchedOff(),requestAnimationFrame(()=>{this.destroyed||(this.toolbar?.tidy(),this.sidebar?.tidy())}),this.refreshMarket(),this.updateUI(),queueMicrotask(()=>{if(!this.destroyed)try{a.onReady?.(this.chart,this)}finally{this.destroyed||this.restoreSharedView()}})}restoreSharedView(){if(!this.options.shareUrl||typeof location>`u`)return;let e=Gc(location.hash);e&&this.importState(e)}setSymbols(e){let t=Gt(e);this.symbols=t.names,this.symbolCatalog=t.info;let n=this.watchlistStore;n&&this.watchlistFromSymbols&&n.replace(n.getLists().map(e=>e.id===`default`?{...e,symbols:t.names}:e)),this.refreshSymbolTitle(),this.refreshSymbolInfo()}symbolEntries(){return this.symbols.map(e=>this.symbolCatalog.get(e)??e)}chartSymbolInfo(){let e=this.chart.getSymbolInfo(),t=e&&e!==this.chartInfoAtSwitch?e:Zt(this.state.symbol,e);return t?Kt(t,this.state.symbol):null}displayInfo(){return Jt(this.symbolCatalog.get(this.state.symbol),this.chartSymbolInfo())??null}refreshSymbolTitle(){this.toolbar?.setSymbolDescription(Qt(this.displayInfo()))}getWatchlists(){return this.watchlistStore?.getLists()??[]}getActiveWatchlist(){return this.watchlistStore?.getActive().id??null}setWatchlists(e,t){this.watchlistFromSymbols=!1,this.watchlistStore?.replace(e,t)}setActiveWatchlist(e){this.watchlistStore?.setActive(e)}addToWatchlist(e,t){this.watchlistStore?.add(e,t)}removeFromWatchlist(e,t){this.watchlistStore?.removeSymbol(e,t)}setQuotes(e){let t=e.map(n.readQuote).filter(e=>e!==null);t.length>0&&this.takeQuotes(t)}getQuote(e){let t=this.quotes.get(e);return t?{...t}:null}openPanel(e){return!this.hasPanel(e)||!this.dock?!1:(this.dock.open(e),this.dock.current()===e)}hasPanel(e){return e===`watchlist`?this.watchlist!==null:e===`depthLadder`&&this.depthLadder===null?!1:this.featureState[ml[e]]}closePanel(){this.dock?.close()}getOpenPanel(){return this.dock?.current()??null}toggleSymbolInfo(e){let t=this.symbolInfoPanel;if(!t)return;let n=e??!t.isOpen();n&&!this.featureState.symbolInfo||(n?this.dock?.open(`symbolInfo`):this.dock?.closePage(`symbolInfo`))}refreshMarket(){if(Ol())return;let e=(0,n.marketStatus)(this.chart.getSymbolInfo(),Date.now()),t=e.state===`open`;this.statusBar?.setMarket(e.state,this.t(t?`symbolInfo.open`:`symbolInfo.closed`),this.t(t?`statusBar.marketOpen`:`statusBar.marketClosed`)),this.refreshSymbolInfo()}refreshSymbolInfo(){let e=this.symbolInfoPanel;!e?.isOpen()||this.destroyed||e.render(this.symbolInfoView())}symbolInfoView(){let e=this.state.symbol;return mi({symbol:e,info:this.chart.getSymbolInfo(),names:this.displayInfo(),quote:this.quotes.get(e),bars:this.chart.getData(),formatPrice:e=>this.formatAlertPrice(e),t:this.t,textLocale:this.textLocale(),numberLocale:this.intlLocale(),now:Date.now()})}loadNews(){let e=this.symbolInfoPanel;if(!e?.isOpen())return;let t=this.options.adapter,n=this.options.news??(t?.fetchNews?t.fetchNews.bind(t):null);this.news.load(this.state.symbol,n,t=>e.renderNews(t),this.textLocale(),()=>this.destroyed)}intlLocale(){return this.settingsState.numberLocale||this.options.locale||`en`}textLocale(){return this.options.locale||`en`}createWatchlist(e,t){let n=t.persist?zl():null,r=new li({lists:t.lists,activeList:t.activeList,symbols:this.symbols,defaultName:this.t(`watchlist.title`),storage:n,storageKey:t.storageKey});this.watchlistStore=r,this.watchlistFromSymbols=!t.lists&&!t.persist,this.quoteSource=t.quotes===!1?null:t.quotes??(this.options.adapter?.subscribeQuotes?this.options.adapter:null);let i=e=>this.t(e);this.watchlist=new Qr(e,{onSelect:e=>{this.setSymbol(e)},onAdd:()=>this.symbolSearch?.open({symbols:this.symbolEntries(),current:this.state.symbol,currentInfo:this.chartSymbolInfo(),onPick:e=>r.add(e),search:this.symbolSearchFn()}),onRemove:e=>r.removeSymbol(e),onMove:(e,t)=>r.move(e,t),onPickList:e=>r.setActive(e),onCreateList:e=>r.create(e),onRenameList:(e,t)=>r.rename(e,t),onDeleteList:e=>r.remove(e),onClose:()=>this.closePanelByHand(`watchlist`)},{close:i(`common.close`),title:i(`watchlist.title`),lists:i(`watchlist.lists`),newList:i(`watchlist.newList`),rename:i(`watchlist.rename`),deleteList:i(`watchlist.deleteList`),confirmDelete:i(`watchlist.confirmDelete`),add:i(`watchlist.add`),remove:i(`watchlist.remove`),empty:i(`watchlist.empty`),listName:i(`watchlist.listName`)}),this.watchlist.setActive(this.state.symbol),this.watchlist.setLocale(this.settingsState.numberLocale||void 0);let a=()=>{this.watchlist?.setLists(r.getLists(),r.getActive().id),this.followQuotes()};r.subscribe(()=>{a(),t.onChange?.(r.getLists(),r.getActive().id)}),a()}followQuotes(){if(!this.quoteSource||!this.watchlistStore||this.destroyed)return;let e=this.watchlistStore.getActive().symbols,t=[...e].sort().join(`\0`);if(t!==this.quotedKey&&(this.quotedKey=t,this.stopQuotes?.(),this.stopQuotes=null,e.length!==0))try{this.stopQuotes=this.quoteSource.subscribeQuotes(e,e=>{if(this.destroyed||!Array.isArray(e))return;let t=e.map(n.readQuote).filter(e=>e!==null);t.length>0&&this.takeQuotes(t)})}catch{this.stopQuotes=null}}takeQuotes(e){for(let t of e){let e={...this.quotes.get(t.symbol),...t};this.quotes.set(e.symbol,e);let n=this.watchlistSparkBuffer.get(e.symbol)??[];n.push(e.last),n.length>40&&n.shift(),this.watchlistSparkBuffer.set(e.symbol,n);let r=this.hostWatchlistRefPrice.get(e.symbol);this.watchlist?.setEntry(e.symbol,{lastPrice:e.last,refPrice:r??(e.change===void 0?void 0:e.last-e.change),sparkline:n.slice()})}e.some(e=>e.symbol===this.state.symbol)&&this.refreshSymbolInfo()}async setSymbol(e){this.flushActiveLayout(),e!==this.state.symbol&&(this.chart.clearFills(),this.chartInfoAtSwitch=this.chart.getSymbolInfo()),this.state={...this.state,symbol:e},this.sessionRefPrice=null,this.options.onSymbolChange?.(e),this.updateUI(),this.refreshSymbolTitle(),this.watchlist?.setActive(e),this.refreshMarket(),this.loadNews(),this.layoutSession?.changed(),this.adapter&&await this.connectStream()}setWatchlistEntry(e,t){t.refPrice!==void 0&&this.hostWatchlistRefPrice.set(e,t.refPrice),this.watchlist?.setEntry(e,t)}tickWatchlist(){if(!this.watchlist||this.quotes.has(this.state.symbol)||Ol())return;let e=this.chart.getData();if(e.length===0)return;let t=e[e.length-1],n=this.hostWatchlistRefPrice.get(this.state.symbol);n===void 0&&this.sessionRefPrice===null&&(this.sessionRefPrice=e[0].open);let r=this.watchlistSparkBuffer.get(this.state.symbol)??[];r.push(t.close),r.length>40&&r.shift(),this.watchlistSparkBuffer.set(this.state.symbol,r),this.watchlist.setEntry(this.state.symbol,{lastPrice:t.close,refPrice:n??this.sessionRefPrice??e[0].open,sparkline:r.slice()})}async setTimeframe(e){this.chart.isTimeframeAllowed(e)&&(this.chosenTimeframe=e,this.rangeSeq++,await this.switchTimeframe(e))}async switchTimeframe(e){if(this.state={...this.state,timeframe:e},this.options.onTimeframeChange?.(e),this.updateUI(),this.layoutSession?.changed(),this.adapter){await this.connectStream();return}if(this.chart.setDataTimeframe(e),this.options.resampleTimeframes!==!1){if(!this.baseSeries){let e=this.chart.getData();e.length>0&&(this.baseSeries=e,this.baseTimeframeMs=a(e))}await this.switchLocalTimeframe()}}setTheme(e){let t=this.resolveIsDark(e),n=this.resolveTheme(e);this.themeOf={...this.themeOf,[t?`dark`:`light`]:n},this.state={...this.state,isDark:t},this.root.dataset.tcwTheme=t?`dark`:`light`,this.portal.dataset.tcwTheme=this.root.dataset.tcwTheme,this.keepingLook(()=>this.chart.setTheme(n)),this.updateUI()}getChart(){return this.chart}setUI(e){this.ui=U(e),W(this.root,this.ui),W(this.portal,this.ui),this.applyChartShapes(),this.applyLegendFont(),this.applyChartLook()}getUI(){return U({...this.ui})}applyLegendFont(){this.chart.setLegend({fontFamily:this.ui.font.mono,fontSize:zi(this.ui.font.size,-1)})}applyChartLook(){let e=this.ui.density===`airy`,t=this.options.chartOptions;if(t?.barLayout||this.chart.setBarLayout(e?`golden`:`classic`),!t?.font?.family){if(e){this.chart.setFont({family:this.ui.font.mono});return}this.chart.setFont(null),t?.font&&this.chart.setFont(t.font)}}applyChartShapes(){this.chart.setShapes({tagRadius:this.ui.tagRadius})}destroy(){if(!this.destroyed){this.destroyed=!0,this.stopKeyboardInset?.(),this.stopKeyboardInset=null,this.stopNarrow?.(),this.dockObserver?.disconnect(),this.stopNarrow=null,this.stopFormControls?.(),this.stopFormControls=null,this.boundGlobalKeydown&&document.removeEventListener(`keydown`,this.boundGlobalKeydown),document.removeEventListener(`fullscreenchange`,this.onFullscreenChange),this.unregisterKeys(),this.tooltip.destroy(),this.legendFrame&&cancelAnimationFrame(this.legendFrame),this.indicatorLegend?.destroy(),this.portal.remove(),document.fullscreenElement===this.root&&document.exitFullscreen().catch(()=>{}),this.flushActiveLayout(),this.commandPalette?.destroy(),this.symbolSearch?.destroy(),this.hotkeySheet?.destroy(),this.replayPollInterval&&clearInterval(this.replayPollInterval),this.replayShade?.remove(),this.replayBar?.destroy(),this.dragDrop?.detach(),this.alertsPanel?.destroy(),this.objectTree?.destroy(),this.indicatorSettings?.destroy(),this.indicatorPicker?.destroy(),this.drawingStyle?.destroy(),this.drawingSettings?.destroy(),this.drawingMenu?.destroy(),this.selectionToolbar?.destroy(),this.selectionToolbarFrame!==null&&cancelAnimationFrame(this.selectionToolbarFrame),this.chartMenu?.destroy(),this.legendMenu?.destroy();for(let e of this.hostMenus)e.destroy();this.hostMenus.clear(),this.templatePrompt?.destroy(),this.chartTemplatePrompt?.destroy(),this.drawingTemplatePrompt?.destroy(),this.intervalInput?.destroy(),this.markerTip?.remove(),this.layoutSession?.destroy(),this.layoutsUI?.destroy(),this.accountPanel?.destroy(),this.orderTicket?.destroy(),this.accountFrame&&cancelAnimationFrame(this.accountFrame),this.bracketBar?.destroy(),this.alertNotifier?.destroy(),this.depthLadder?.destroy(),this.dataWindow?.destroy(),this.watchlistInterval&&clearInterval(this.watchlistInterval),this.marketTimer&&clearInterval(this.marketTimer),this.clockTimer&&clearInterval(this.clockTimer),this.onPageShown&&document.removeEventListener(`visibilitychange`,this.onPageShown),this.onPageShown=null,this.chartNav?.destroy(),this.symbolInfoPanel?.destroy(),this.dock?.destroy(),this.stopQuotes?.(),this.stopQuotes=null,this.watchlist?.destroy(),this.toolbar?.destroy(),this.sidebar?.destroy(),this.settings?.destroy(),this.statusBar?.destroy(),this.goToDate?.destroy(),this.loading.destroy(),this.historyPill.destroy(),this.chart.destroy(),this.root.remove(),Xe()}}handleSymbolClick(){this.featureState.symbolSearch&&this.openSymbolSearch()}openSymbolSearch(e){this.symbolSearch?.open({symbols:this.symbolEntries(),current:this.state.symbol,currentInfo:this.chartSymbolInfo(),search:this.symbolSearchFn(),query:e,hint:this.sheetKeyOn(`symbolTyping`)?this.t(`symbolSearch.typeHint`):void 0})}symbolSearchFn(){if(this.options.searchSymbols)return this.options.searchSymbols;let e=this.adapter;if(e?.searchSymbols)return(t,n)=>e.searchSymbols(t,{signal:n,limit:50})}handleTimeframe(e){this.setTimeframe(e)}applyRangePreset(e){let t=++this.rangeSeq;return this.rangeQueue=this.rangeQueue.then(()=>this.runRangePreset(e,t)).catch(e=>{this.say(e instanceof Error?e.message:String(e),`error`)}),this.rangeQueue}async runRangePreset(e,t){let n=()=>t===this.rangeSeq&&!this.destroyed;if(!n())return;this.chosenTimeframe??=this.state.timeframe;let r=this.featureState[`statusBar.rangeTimeframe`]?this.timeframeForPreset(e):this.state.timeframe;r!==this.state.timeframe&&(await this.switchTimeframe(r),!n()||this.adapter&&this.state.connectionState===`error`)||this.chart.setVisibleRangePreset(e)}timeframeForPreset(e){let t=this.state.timeframe,i=this.chart.getData();if(i.length<2)return t;let a=(0,n.barTimeUnit)(i),o=i[i.length-1].time*a,s=e===`All`?i[0].time*a:(0,r.rangePresetStart)(e,o,this.displayTimezone());if(s===null)return t;let c=i.length-1;for(;c>0&&i[c-1].time*a>=s;)c--;let l=this.displayTimezone();return Pt({dayShare:i.slice(-kl).some(e=>{let t=e.time*a,r=new Date(t+(0,n.offsetAt)(l,t)*6e4).getUTCDay();return r===0||r===6})?1:5/7,spanMs:o-s,barsInSpan:i.length-c,width:this.chart.getPlotRect().width,current:t,chosen:this.chosenTimeframe??t,available:this.timeframes.filter(e=>this.chart.isTimeframeAllowed(e)&&this.canShowTimeframe(e))})}canShowTimeframe(e){if(this.adapter)return(0,r.servesTimeframe)(this.adapter,e);if(this.options.resampleTimeframes===!1)return!1;let t=this.chart.getData();if(t.length<2)return!1;let i=this.baseSeries?this.baseTimeframeMs:a(t);return!(i>0)||(0,n.timeframeToMs)(e)>=i}toggleFullscreen(){if(document.fullscreenElement===this.root){document.exitFullscreen().catch(()=>{});return}this.root.requestFullscreen().catch(e=>{this.say(e instanceof Error?e.message:this.t(`toast.fullscreenUnavailable`),`error`)})}drawingToolName(e){let t=`tool.${e}`,n=this.t(t);return n===t?this.chart.getDrawingToolDescriptor(e)?.name??e:n}chartOffset(){let e=this.chartContainer.getBoundingClientRect(),t=this.root.getBoundingClientRect();return{x:e.left-t.left,y:e.top-t.top}}scheduleSelectionToolbar(){this.selectionToolbarFrame!==null||!this.selectionToolbar?.isOpen()||(this.selectionToolbarFrame=requestAnimationFrame(()=>{this.selectionToolbarFrame=null,this.updateSelectionToolbar()}))}updateSelectionToolbar(){let e=this.selectionToolbar;if(!e||this.destroyed)return;let t=this.chart.getSelectedDrawingIds();if(!this.featureState.selectionToolbar||!t?.length){e.hide();return}let n=new Set(t),r=this.chart.getDrawings().filter(e=>n.has(e.id)&&this.chart.isDrawingShown(e.id));if(this.chart.getDrawingTool()!==null||this.chart.isEraserMode()||this.chart.isZoomAreaMode()||r.length===0){e.hide();return}let i=this.chartOffset(),a=this.chart.getPlotRect(),o=Bl(r.map(e=>this.chart.getDrawingRect(e.id)))??{x:a.x+a.width/2,y:a.y,width:0,height:0},s=r[0];e.show({rect:{x:o.x+i.x,y:o.y+i.y,width:o.width,height:o.height},bounds:{x:a.x+i.x,y:a.y+i.y,width:a.width,height:a.height},style:s.style,locked:r.every(e=>e.locked),canDelete:r.some(e=>!e.locked),canSettings:this.drawingSettings!==null&&this.featureState.drawingSettings&&r.length===1,canAlert:this.featureState.alerts&&r.length===1&&this.chart.canAddDrawingAlert(s.id)})}openDrawingSettings(e){let t=this.chart.getDrawings().find(t=>t.id===e),n=t?this.chart.getDrawingToolDescriptor(t.type):null;!t||!n||!this.drawingSettings||!this.featureState.drawingSettings||this.drawingSettings.open({id:e,type:t.type,name:this.drawingToolName(t.type),style:{...t.style},options:this.chart.getDrawingOptions(e),defs:n.options??{},anchors:t.anchors.map(e=>({...e})),fill:n.fill===!0,text:n.text===!0,intervals:t.intervals??null})}promptSaveDrawingTemplate(e,n){this.drawingTemplatePrompt??=new Ts(this.root,this.t),this.drawingTemplatePrompt.open({title:this.t(`drawingSettings.saveTemplateTitle`),submitLabel:this.t(`common.save`),placeholder:this.drawingToolName(n.type),onSubmit:r=>{e.save(r,n.style,{type:n.type,options:n.options}),this.say(t.r(this.t(`templates.saved`),{name:r.trim()}))}})}addDrawingAlert(e){if(!this.featureState.alerts)return;let n=this.chart.getDrawings().find(t=>t.id===e),r=n?this.drawingToolName(n.type):``;this.chart.addDrawingAlert(e,{label:r})&&this.say(t.r(this.t(`drawingSettings.alertAdded`),{name:r}))}openDrawingMenu(e,t,n){if(!this.drawingMenu||!this.featureState[`menu.drawing`])return;let r=new Map(this.chart.getDrawings().map(e=>[e.id,e])),i=this.chart.getSelectedDrawingIds().flatMap(e=>{let t=r.get(e);return t?[{id:t.id,locked:t.locked,groupId:t.group?.id??null}]:[]});if(i.length===0)return;let a=Ke(Mo({selected:i,canConfigure:this.drawingSettings!==null,canAlert:this.chart.canAddDrawingAlert(e)},this.t),Fe,this.featureState),o=i.map(e=>e.id),s=r.get(e),c=s?this.options.drawingMenuItems?.({id:e,type:s.type,selected:o})??[]:[],l=Qc(a,c);if(l.length===0)return;let u=this.chartContainer.getBoundingClientRect(),d=this.root.getBoundingClientRect();this.drawingMenu.open(l,u.left-d.left+t,u.top-d.top+n,t=>{$c(t,c)||this.runDrawingMenuAction(e,o,t)})}runDrawingMenuAction(e,t,n){switch(n){case`settings`:this.openDrawingSettings(e);return;case`alert`:this.addDrawingAlert(e);return;case`front`:case`forward`:case`backward`:case`back`:this.chart.moveDrawing(e,n);break;case`group`:this.chart.groupDrawings(t);break;case`ungroup`:{let e=new Set(this.chart.getDrawings().filter(e=>t.includes(e.id)).map(e=>e.group?.id));for(let t of e)t&&this.chart.ungroupDrawings(t);break}case`lock`:case`unlock`:this.chart.setDrawingsLocked(t,n===`lock`);break;case`hide`:this.chart.setDrawingsVisible(t,!1);break;case`duplicate`:this.chart.duplicateDrawing(e);break;case`delete`:{let e=this.drawingSettings?.editing();e&&t.includes(e)&&this.drawingSettings?.close(!0),this.chart.removeDrawings(t);break}}this.objectTree?.isOpen()&&this.refreshObjects()}chartMenuContext(e){let t=this.chart.getDrawings(),n=this.chart.getData(),r=this.settingsState,i=this.chart.getFeatures();return{price:e,lastPrice:n.length>0?n[n.length-1].close:null,formatPrice:e=>this.formatAlertPrice(e),canAlert:this.alertsPanel!==null,canTrade:this.options.trading!==!1,canOrderTicket:this.orderTicket!==null,canDraw:!0,hasDrawings:t.length>0,drawingsHidden:t.length>0&&t.every(e=>!e.visible),canPaste:this.chart.canPasteDrawings(),hasIndicators:i.indicators!==!1&&this.removableIndicators().length>0,canGoToDate:this.goToDate!==null,canExport:this.canExport,autoScale:this.chart.isAutoScale(),scaleMode:r.scaleMode,canLog:i.logScale!==!1,inverted:this.chart.isInvertScale(),leftScale:r.leftPriceScale,labels:{values:r.indicatorValueLabels,...i.barCountdown===!1?{}:{countdown:r.barCountdown}},lines:{highLow:r.highLowLines,lastPrice:this.chart.getStyleValue(`lastPrice.visible`)!==!1},timezone:{current:r.timezone,options:this.timezoneChoices()},keys:Object.fromEntries(Po.filter(e=>this.featureState.hotkeys&&this.featureState[e.feature]).map(e=>[e.action,e.keys]))}}removableIndicators(){return this.chart.getActiveIndicators().filter(e=>!r.SYMBOL_INDICATOR_IDS.has(e.id)).map(e=>e.instanceId)}exchangeChoice(){let e=this.chart.getExchangeTimeZone()??null;if(!(e===null&&!this.adapter?.resolveSymbol))return{label:this.t(`settings.timezone.exchange`),zone:e}}timezoneChoices(){return l(this.settingsState.timezone,Date.now(),this.t(`settings.timezone.local`),this.exchangeChoice()).map(({value:e,label:t})=>({value:e,label:t}))}openChartMenu(e,t,n,r){if(!this.chartMenu)return;let i=this.options.chartMenuItems?.(r)??[],a=Qc(e,i);if(a.length===0)return;let o=this.chartContainer.getBoundingClientRect(),s=this.root.getBoundingClientRect();this.chartMenu.open(a,o.left-s.left+t,o.top-s.top+n,e=>{$c(e,i)||(e.startsWith(`tz:`)?this.changeSettings({timezone:e.slice(3)}):this.runChartMenuAction(e,r))})}setFeatures(e){let t=this.featureState;this.featureState={...t,...Le(e)};let n=e=>t[e]!==this.featureState[e];this.markSwitchedOff(),this.closeSwitchedOff(e=>t[e]&&!this.featureState[e]),n(`selectionToolbar`)&&this.updateSelectionToolbar(),n(`indicatorLegend`)&&(this.chart.setPaneTitlesVisible(!this.featureState.indicatorLegend),this.scheduleLegend()),n(`menu.priceAxisAdd`)&&this.chart.setFeatures({priceAxisAddButton:this.priceAxisAddDefault&&this.featureState[`menu.priceAxisAdd`]}),n(`dragDropImport`)&&(this.featureState.dragDropImport?this.dragDrop?.attach():this.dragDrop?.detach()),[`toolbar`,`sidebar`,`statusBar`,`accountPanel`].some(n)&&this.chart.resize()}getFeatures(){return{...this.featureState}}isFeatureOn(e){return this.featureState[e]===!0}closeSwitchedOff(e){e(`replay`)&&this.replayBar?.isMounted()&&this.exitReplay();let t=[[`alerts`,()=>this.dock?.closePage(`alerts`)],[`objectTree`,()=>this.dock?.closePage(`objectTree`)],[`symbolInfo`,()=>this.dock?.closePage(`symbolInfo`)],[`dataWindow`,()=>this.dock?.closePage(`dataWindow`)],[`accountPanel`,()=>this.toggleAccountPanel(!1)],[`orderTicket`,()=>this.orderTicket?.close()],[`depthLadder`,()=>this.dock?.closePage(`depthLadder`)],[`goToDate`,()=>this.goToDate?.close()],[`settings`,()=>this.settings?.close()],[`indicatorSettings`,()=>this.indicatorSettings?.close()],[`toolbar.indicators`,()=>this.indicatorPicker?.close()],[`drawingSettings`,()=>this.drawingSettings?.close(!1)],[`sidebar`,()=>this.drawingStyle?.close()],[`commandPalette`,()=>this.commandPalette?.close()],[`hotkeySheet`,()=>this.hotkeySheet?.close()],[`symbolSearch`,()=>this.symbolSearch?.close()],[`compare`,()=>{this.symbolSearch?.isComparing()&&this.symbolSearch.close()}],[`menu.chart`,()=>this.chartMenu?.close()],[`menu.priceAxisAdd`,()=>this.chartMenu?.close()],[`menu.drawing`,()=>this.drawingMenu?.close()],[`indicatorLegend`,()=>this.legendMenu?.close()],[`indicatorLegend.more`,()=>this.legendMenu?.close()]];for(let[n,r]of t)e(n)&&r()}addHotkey(e){let t=rl(e.keys);if(!t)return console.warn(`[ChartWidget] Can't read the shortcut "${e.keys}": modifiers (Ctrl, Alt, Shift) and a key, joined by +.`),null;ol(t)&&console.warn(`[ChartWidget] The chart answers ${e.keys} itself (drawings, scrolling or zoom): both will run.`);let n={spec:e,parsed:t};return this.hostHotkeys=[...this.hostHotkeys,n],{remove:()=>{this.hostHotkeys=this.hostHotkeys.filter(e=>e!==n)}}}handleHostHotkey(e){if(this.hostHotkeys.length===0||!this.featureState.hotkeys||e.isComposing||e.keyCode===Tl||e.getModifierState?.(`AltGraph`)||e.defaultPrevented||J()||sl(e)||wl())return!1;let t=this.hostHotkeys.find(t=>il(e,t.parsed));if(!t)return!1;let n=!t.parsed.ctrl&&!t.parsed.alt;if(!Ls(this.root,n))return!1;let r=document.activeElement;return n&&r&&r!==document.body&&!this.root.contains(r)?!1:(e.preventDefault(),t.spec.onPress(e),!0)}keepingLook(e){this.settingsEdit&&this.settings?.close();let t=this.chart.getOverrides?.({layer:`user`})??{},n=Object.fromEntries(Dl.filter(e=>t[e]!==void 0).map(e=>[e,t[e]]));e(),Object.keys(n).length>0&&this.chart.applyOverrides(n,{layer:`user`})}sheetKeyOn(e){let t=this.featureState;if(!t.hotkeys||!t[e])return!1;switch(e){case`hotkeys.commandPalette`:return t.commandPalette;case`hotkeys.symbolSearch`:return t.symbolSearch;case`hotkeys.goToDate`:return t.goToDate;case`hotkeys.save`:return t.layouts&&this.layoutSession!==null;case`hotkeys.help`:return t.hotkeySheet;case`intervalTyping`:return this.intervalInput!==null;case`symbolTyping`:return t.symbolSearch;default:return!0}}markSwitchedOff(){let e=ze(this.featureState);for(let t of[this.root,this.portal])e?t.dataset.tcwOff=e:delete t.dataset.tcwOff;this.toolbar?.setSymbolSearch(this.featureState.symbolSearch),this.toolbar?.tidy(),this.sidebar?.tidy(),this.syncRail(),this.statusBar?.fit()}addToolbarButton(e){if(!this.toolbar)return null;let t=this.toolbar,n=t.addHostButton(e);return t.tidy(),{element:n,setActive:t=>cn(n,t,e.toggle===!0),setText:t=>void ln(n,e.label,t),remove:()=>{n.remove(),t.tidy()}}}addToolbarDropdown(e){let t=this.toolbar;if(!t)return null;let n=new k(this.root,e.label);this.hostMenus.add(n);let r=t.addHostButton({id:e.id,label:e.label,icon:e.icon,text:e.text,side:e.side,onClick:r=>{if(n.isOpen()){n.close();return}let i=e.items();if(i.length===0)return;let a=t.menuAnchor(r);n.openUnder(Qc([],i),a,e=>$c(e,i))}});return r.setAttribute(`aria-haspopup`,`menu`),r.setAttribute(`aria-expanded`,`false`),t.tidy(),{element:r,setText:t=>void ln(r,e.label,t),remove:()=>{n.destroy(),this.hostMenus.delete(n),r.remove(),t.tidy()}}}addSidebarButton(e){let t=this.sidebar;if(!t)return null;let n=t.addHostButton(e);return{element:n,setActive:t=>cn(n,t,e.toggle===!0),remove:()=>{n.remove(),t.tidy()}}}addStatusBarItem(e){if(!this.statusBar)return null;let t=this.statusBar.addHostItem(e);return{element:t,setText:n=>{t.textContent=n,e.label&&e.label!==n?t.setAttribute(`aria-label`,`${e.label}: ${n}`):t.removeAttribute(`aria-label`)},remove:()=>t.remove()}}getSlot(e){switch(e){case`toolbar.left`:return this.toolbar?.hostSlot(`left`)??null;case`toolbar.right`:return this.toolbar?.hostSlot(`right`)??null;case`sidebar`:return this.sidebar?.hostSlot()??null;case`statusBar.left`:return this.statusBar?.hostSlot(`left`)??null;case`statusBar.right`:return this.statusBar?.hostSlot(`right`)??null;case`chart`:return this.hostLayer||(this.hostLayer=document.createElement(`div`),this.hostLayer.className=`tcw-host-layer`,this.chartContainer.appendChild(this.hostLayer)),this.hostLayer;default:return null}}runChartMenuAction(e,n){let{price:r}=n,i=r??NaN,a=this.settingsState,o=Fo(e);if(o){this.changeSettings({scaleMode:o});return}switch(e){case`alert`:this.chart.addAlert(i,`crossing`),this.say(t.r(this.t(`chartMenu.alertAdded`),{price:this.formatAlertPrice(i)}));break;case`buyLimit`:case`sellLimit`:case`buyStop`:case`sellStop`:this.placeOrderAt(e,i);break;case`orderTicket`:this.openOrderTicket(r);break;case`exportData`:this.chart.exportAllData(`csv`,`${this.state.symbol}-${this.state.timeframe}.csv`.replace(/[^\w.-]+/g,`_`));break;case`paneLog`:case`paneInvert`:case`panePercent`:{let t=this.menuPane;if(!t)break;let n=this.chart.getPaneScale(t);this.chart.setPaneScale(t,e===`paneLog`?{log:!n.log}:e===`paneInvert`?{invert:!n.invert}:{percent:!n.percent});break}case`horizontalLine`:{let e=this.chart.getData();e.length>0&&this.chart.addDrawing({type:`horizontalLine`,anchors:[{time:e[e.length-1].time,price:i}]});break}case`resetView`:this.resetView();break;case`resetPriceScale`:this.changeSettings({autoScale:!0});break;case`paste`:this.chart.pasteDrawings();break;case`removeIndicators`:this.chart.removeIndicators(this.removableIndicators());break;case`hideDrawings`:this.chart.setDrawingsVisible(this.chart.getDrawings().map(e=>e.id),!1);break;case`showDrawings`:this.chart.setDrawingsVisible(this.chart.getDrawings().map(e=>e.id),!0);break;case`removeDrawings`:this.chart.removeDrawings(this.chart.getDrawings().map(e=>e.id));break;case`settings`:this.openSettings(n.area===`priceAxis`?`scales`:void 0);break;case`autoScale`:this.changeSettings({autoScale:!this.chart.isAutoScale()});break;case`invertScale`:this.changeSettings({invertScale:!this.chart.isInvertScale()});break;case`leftScale`:this.changeSettings({leftPriceScale:!a.leftPriceScale});break;case`indicatorValueLabels`:this.changeSettings({indicatorValueLabels:!a.indicatorValueLabels});break;case`barCountdown`:this.changeSettings({barCountdown:!a.barCountdown});break;case`highLowLines`:this.changeSettings({highLowLines:!a.highLowLines});break;case`lastPriceLine`:this.changeStyle({"lastPrice.visible":this.chart.getStyleValue(`lastPrice.visible`)===!1});break;case`goToDate`:this.toggleGoToDate();break}this.objectTree?.isOpen()&&this.refreshObjects()}toggleAccountPanel(e){let t=this.accountPanel;!t||e===t.isOpen()||!t.isOpen()&&!this.featureState.accountPanel||t.toggle()}openOrderTicket(e){if(!this.featureState.orderTicket)return;let t=this.chart.getData();this.orderTicket?.open({price:e,lastPrice:t.length>0?t[t.length-1].close:null,rules:this.orderRules(),symbol:this.state.symbol,step:e=>this.chart.getPriceStep(e),round:e=>this.chart.roundPrice(e)})}orderRules(){let e=this.chart.getMarket();return e?{roundPrice:e.priceStep!==void 0||(e.priceSteps?.length??0)>0?e=>this.chart.roundPrice(e):void 0,limits:this.chart.getPriceLimits(),lot:e.volumeUnit,multiplier:e.contractMultiplier}:{}}refreshAccountSoon(){this.accountFrame||!this.accountPanel||(this.accountFrame=requestAnimationFrame(()=>{this.accountFrame=0,this.destroyed||this.refreshAccount()}))}refreshAccount(){if(!this.accountPanel)return;let e=this.chart.getData(),t=e.length>0?e[e.length-1].close:null;this.accountPanel.update({positions:this.chart.getPositions(),orders:this.chart.getOrders(),fills:this.chart.getFills(),price:t,realisedPnl:this.chart.getRealisedPnl()}),this.orderTicket?.setLastPrice(t)}placeOrderAt(e,n){let r=e.startsWith(`buy`)?`buy`:`sell`,i=e.endsWith(`Stop`);this.chart.placeOrderIntent(i?{side:r,type:`stop`,price:n,stopPrice:n,quantity:1}:{side:r,type:`limit`,price:n,quantity:1}),this.say(t.r(this.t(`order.${e}`),{price:this.formatAlertPrice(n)}))}clockNow(){let e=Date.now(),t=this.displayTimezone(),r=e=>String(e).padStart(2,`0`),{time:i}=Y(e,t);return{time:`${i}:${r(new Date(e).getUTCSeconds())}`,zone:(0,n.tzLabel)((0,n.offsetAt)(t,e))}}refreshDrawingsState(){let e=this.chart.getDrawings()??[],t=e.length>0;this.sidebar?.setDrawingsState({locked:t&&e.every(e=>e.locked),hidden:t&&e.every(e=>!e.visible)})}refreshScaleSwitches(){this.statusBar?.setScale({mode:this.chart.getScaleMode(),auto:this.chart.isAutoScale()})}toggleScaleMode(e){this.changeSettings({scaleMode:this.chart.getScaleMode()===e?`regular`:e})}displayTimezone(){let e=s(this.settingsState.timezone);return e===`exchange`?this.chart.getEffectiveTimeZone():e}toggleGoToDate(){if(!this.goToDate||!this.featureState.goToDate)return;if(this.goToDate.isOpen()){this.goToDate.close();return}let e=this.chart.getData();if(e.length===0)return;let t=this.displayTimezone(),r=(0,n.barTimeUnit)(e),i=e=>Y(e*r,t),a=e[e.length-1].time,o=this.chart.getVisibleTimeRange()??{from:e[0].time,to:a},s=Y(Date.now(),t).date;this.goToDate.open({date:i(a),range:{from:i(o.from),to:i(o.to)},withTime:!((0,n.timeframeToMs)(this.state.timeframe)>=pl),max:s,today:s})}goTo(e){let t=this.chart.getData(),r=this.displayTimezone();if(t.length===0)return;let i=(0,n.barTimeUnit)(t);if(e.kind===`date`){let n=Ys(e.date,e.time,r);if(n===null)return;this.chart.goToTime(n/i),n/i<t[0].time&&this.say(this.t(`range.beforeData`));return}let a=Ys(e.from.date,e.from.time,r),o=Ys(e.to.date,e.to.time,r);a===null||o===null||(this.chart.setVisibleRange(a/i,o/i),Math.min(a,o)/i<t[0].time&&this.say(this.t(`range.beforeData`)))}pinnedTimeframes(){let e=this.timeframeFavorites.list();return this.timeframes.filter(t=>e.includes(t))}timeframeMenu(){return this.timeframes.map(e=>({value:e,label:bt(e),custom:this.customTimeframes.has(e)}))}handleAddTimeframe(e){if(!this.featureState.customTimeframes)return!1;let t=Ot(e);return!t||!this.chart.isTimeframeAllowed(t)||this.adapter&&!(0,r.servesTimeframe)(this.adapter,t)||!this.adapter&&(0,n.tickBarCount)(t)!==null?!1:(this.timeframes.includes(t)||(this.customTimeframes.add(t),this.timeframeFavorites.add(t),this.timeframes=kt(this.timeframes,[t]),this.toolbar?.setTimeframes(this.timeframeMenu(),this.pinnedTimeframes())),this.handleTimeframe(t),!0)}showMarkerTip(e){let{marker:n}=e;if(!n){this.markerTip&&(this.markerTip.hidden=!0);return}this.markerTip||(this.markerTip=document.createElement(`div`),this.markerTip.className=`tcw-marker-tip`,this.markerTip.setAttribute(`role`,`tooltip`),this.chartContainer.appendChild(this.markerTip));let r=n.direction===`long`?this.t(`account.long`):n.direction===`short`?this.t(`account.short`):this.t(`markers.neutral`),i=document.createElement(`strong`);i.textContent=n.label?`${n.label} · ${n.source}`:n.source;let a=document.createElement(`div`);a.textContent=`${r} · ${this.formatAlertPrice(n.price)} · ${t.r(this.t(`markers.confidence`),{pct:Math.round(n.confidence*100)})}`;let o=document.createElement(`div`),{date:s,time:c}=Y(n.time,this.displayTimezone());o.textContent=`${s} ${c}`,this.markerTip.replaceChildren(i,a,o),this.markerTip.hidden=!1;let l=this.chartContainer.getBoundingClientRect(),u=Math.min(e.x+12,Math.max(0,l.width-this.markerTip.offsetWidth-4)),d=Math.max(0,e.y-this.markerTip.offsetHeight-10);this.markerTip.style.left=`${u}px`,this.markerTip.style.top=`${d}px`}selectTypedTimeframe(e){return!this.chart.isTimeframeAllowed(e)||!this.timeframes.includes(e)&&!this.featureState.customTimeframes||this.adapter&&!(0,r.servesTimeframe)(this.adapter,e)?!1:(this.timeframes.includes(e)||(this.customTimeframes.add(e),this.timeframes=kt(this.timeframes,[e]),this.toolbar?.setTimeframes(this.timeframeMenu(),this.pinnedTimeframes())),this.handleTimeframe(e),!0)}applyIndicatorTemplate(e){if(!this.featureState.indicatorTemplates)return;let n=this.templates.get(e);n&&(this.chart.applyIndicatorSetup(n.indicators),this.syncIndicatorsFromChart(),this.updateUI(),this.say(t.r(this.t(`templates.applied`),{name:n.name})))}promptSaveIndicatorTemplate(){if(this.featureState.indicatorTemplates){if(this.chart.getActiveIndicators().length===0){this.say(this.t(`templates.nothing`),`error`);return}this.templatePrompt??=new Ts(this.root,this.t),this.templatePrompt.open({title:this.t(`templates.saveTitle`),submitLabel:this.t(`common.save`),placeholder:this.t(`templates.namePlaceholder`),onSubmit:e=>{try{this.templates.save(e,this.chart.getIndicatorSetup())}catch(e){throw this.say(this.t(`templates.saveFailed`),`error`),e}this.indicatorPicker?.setTemplates(this.templateNames()),this.say(t.r(this.t(`templates.saved`),{name:e}))}})}}handleRemoveTimeframe(e){this.customTimeframes.has(e)&&(this.customTimeframes.remove(e),this.timeframeFavorites.remove(e),this.timeframes=this.timeframes.filter(t=>t!==e),this.toolbar?.setTimeframes(this.timeframeMenu(),this.pinnedTimeframes()),this.updateUI())}handleToggleTimeframeFavorite(e){this.timeframeFavorites.toggle(e),this.toolbar?.setTimeframeFavorites(this.pinnedTimeframes()),this.updateUI()}setData(e){this.localSeq++,this.baseSeries=e,this.baseTimeframeMs=a(e),this.applyTimeframeData(),this.adapter||this.loading.end()}async switchLocalTimeframe(){if(!this.baseSeries)return;let e=++this.localSeq,t=this.lastLocalSwitchMs>=cl||this.baseSeries.length>=ll;try{if(t&&(this.loading.begin(this.chart.getData().length>0,!0),await dl(),e!==this.localSeq||this.destroyed))return;this.applyTimeframeData()}finally{e===this.localSeq&&this.loading.end()}}applyTimeframeData(){if(!this.baseSeries)return;let e=performance.now(),t=(0,n.timeframeToMs)(this.state.timeframe);if(this.baseTimeframeMs>0&&t>this.baseTimeframeMs){let e=this.options.weekStartsOn??1;this.chart.setData(i(this.baseSeries,this.state.timeframe,{weekStartsOn:e}))}else this.chart.setData(this.baseSeries);this.lastLocalSwitchMs=performance.now()-e}handleDataUpdate(e){if(e.kind===`bars`){e.length>0&&this.loading.isActive()&&(this.loading.end(),this.state.connectionState===`error`&&this.setConnectionState(`connected`,this.t(`status.live`)));return}if(e.kind===`error`){this.loading.isActive()&&(this.loading.fail(this.t(`status.connectionFailed`)),this.setConnectionState(`error`,e.error||this.t(`status.connectionFailed`)));return}if(e.kind===`connection`)switch(e.connection.state){case`connected`:this.loading.hasFailed()&&this.loading.end(),!this.loading.isActive()&&this.state.connectionState!==`connected`&&this.setConnectionState(`connected`,this.t(`status.live`));break;case`reconnecting`:this.loading.isActive()||this.setConnectionState(`connecting`,this.t(`status.connecting`));break;case`error`:this.loading.isActive()||this.setConnectionState(`error`,this.t(`status.connectionFailed`));break}}setConnectionState(e,t){this.state={...this.state,connectionState:e,connectionMessage:t},this.updateUI()}toggleLadder(){!this.depthLadder||!this.featureState.depthLadder||this.dock?.toggle(`depthLadder`)}toggleAlerts(){!this.alertsPanel||!this.featureState.alerts||this.dock?.toggle(`alerts`)}handleToggleFavorite(e){let t=this.favoritesStore.toggle(e);this.sidebar?.setFavorites(this.favoritesStore.list()),this.say(t?this.t(`toast.pinned`):this.t(`toast.unpinned`))}exportState(){let e=this.chart.getActiveIndicators().map(e=>({id:e.id,params:e.params}));return Hc({v:1,symbol:this.state.symbol,timeframe:this.state.timeframe,chartType:this.state.chartType,scaleMode:this.chart.getScaleMode(),indicators:e,drawings:this.chart.getDrawings()})}async importState(e){let t=Uc(e);return t?(t.symbol&&t.symbol!==this.state.symbol&&await this.setSymbol(t.symbol),t.timeframe&&t.timeframe!==this.state.timeframe&&await this.setTimeframe(t.timeframe),t.chartType&&this.applyChartType(t.chartType),this.chart.setScaleMode(t.scaleMode),this.chart.applyIndicatorSetup(t.indicators.map((e,t)=>({id:e.id,instanceId:`shared_${t}`,params:e.params}))),this.chart.setDrawings(t.drawings),this.updateUI(),!0):!1}async copyChartImage(){let e=await this.chart.copyScreenshot();this.say(e?this.t(`toast.imageCopied`):this.t(`toast.imageCopyFailed`),e?`info`:`error`)}async copyShareLink(){let e=Kc(typeof location<`u`?location.href:``,this.exportState());try{await navigator.clipboard.writeText(e),this.say(this.t(`toast.linkCopied`))}catch{this.say(this.t(`toast.copyFailed`),`error`)}}setDepth(e){this.chart.setDepthData(e),this.depthLadder?.setData(e),e&&this.chart.pushDepthSnapshot(e)}startBracket(e){this.chart.startBracket(e)&&this.bracketBar?.show(e)}buildDataWindowModel(){let e=this.chart.getData(),t=this.lastHoverIndex;if(t===null||t<0||t>=e.length)return{ohlc:null,change:0,changePct:0,indicators:[]};let n=e[t],r=t>0?e[t-1].close:n.open,i=n.close-r,a=r===0?0:i/r*100,o=this.chart.getActiveIndicators().map(e=>{let n=this.chart.getIndicatorOutput(e.instanceId)?.series?.[t]??null,r=e.descriptor.plots?.map(e=>[e.key,e.title])??Object.keys(n??{}).map(e=>[e,e]),i=n?r.filter(([e])=>typeof n[e]==`number`&&Number.isFinite(n[e])).map(([e,t])=>({key:t,value:n[e]})):[];return{name:e.descriptor.name,values:i}}).filter(e=>e.values.length>0);return{ohlc:{open:n.open,high:n.high,low:n.low,close:n.close,volume:n.volume},change:i,changePct:a,indicators:o}}toggleDataWindow(){!this.dataWindow||!this.featureState.dataWindow||this.dock?.toggle(`dataWindow`)}toggleObjects(){!this.objectTree||!this.featureState.objectTree||this.dock?.toggle(`objectTree`)}setupDock(){let e=this.dock;if(!e)return;if(this.watchlist){let t=this.watchlist;e.addPage({id:`watchlist`,label:this.t(`watchlist.title`),icon:`list`,element:t.element,parts:[`dock.watchlist`],onShow:()=>t.redraw()})}let t=this.alertsPanel;t&&e.addPage({id:`alerts`,label:this.t(`alerts.title`),icon:`bell`,element:t.element,parts:[`dock.alerts`,`alerts`],onShow:()=>{t.openPanel(),this.refreshAlerts(),this.toolbar?.setActive(`alerts`,!0)},onHide:()=>{t.close(),this.toolbar?.setActive(`alerts`,!1)}});let n=this.objectTree;n&&e.addPage({id:`objectTree`,label:this.t(`objects.title`),icon:`layers`,element:n.element,parts:[`dock.objectTree`,`objectTree`],onShow:()=>{n.openPanel(),this.refreshObjects(),this.toolbar?.setActive(`objects`,!0)},onHide:()=>{n.close(),this.toolbar?.setActive(`objects`,!1)}});let r=this.dataWindow;r&&e.addPage({id:`dataWindow`,label:this.t(`dataWindow.title`),icon:`table`,element:r.element,parts:[`dock.dataWindow`,`dataWindow`],onShow:()=>{r.openPanel(),r.render(this.buildDataWindowModel())},onHide:()=>r.close()});let i=this.symbolInfoPanel;i&&e.addPage({id:`symbolInfo`,label:this.t(`symbolInfo.title`),icon:`info`,element:i.element,parts:[`dock.symbolInfo`,`symbolInfo`],onShow:()=>i.open(),onHide:()=>i.close()});let a=this.depthLadder;a&&e.addPage({id:`depthLadder`,label:this.t(`ladder.title`),icon:`ladder`,element:a.element,parts:[`dock.depthLadder`,`depthLadder`],onShow:()=>a.openPanel(),onHide:()=>a.close()}),this.syncRail(),this.fitDockToWidth(),typeof ResizeObserver<`u`&&(this.dockObserver=new ResizeObserver(()=>this.fitDockToWidth()),this.dockObserver.observe(this.root))}fitDockToWidth(){let e=this.dock,t=this.root.clientWidth;if(!e||t===0)return;let n=t<641,r=this.dockNarrow;this.dockNarrow=n,n&&r!==!0&&e.close()}railShown(){return this.featureState.dock&&!this.root.hasAttribute(`data-tcw-narrow`)}syncRail(){this.dock?.syncRail();let e=this.railShown();this.toolbar?.setRailed(`alerts`,e&&this.featureState[`dock.alerts`]),this.toolbar?.setRailed(`objects`,e&&this.featureState[`dock.objectTree`]),this.toolbar?.fit()}panelFocusTarget(e){let t=gl[e],n=t?this.root.querySelector(`.tcw-toolbar [data-role="${t}"]`):null,r=this.root.hasAttribute(`data-tcw-narrow`);return n&&!n.hidden&&!(r&&n.classList.contains(`tcw-toolbar-overflow`))?n:this.root.querySelector(`.tcw-toolbar-more`)??this.chartContainer}closePanelByHand(e){this.dock?.closePage(e)}openIndicatorSettings(e){if(!this.indicatorSettings||!this.featureState.indicatorSettings)return;let t=this.chart.getActiveIndicators(),n=t.find(t=>t.instanceId===e);if(!n)return;let r=this.chart.getIndicatorStyle(e),i=n.descriptor.placement===`panel`||!!n.pane,a=(this.chart.getIndicatorSetup()??[]).find(t=>t.instanceId===e)?.levels!==void 0;this.chart.beginIndicatorEdit(e),this.indicatorSettings.open({instanceId:e,indicatorId:n.id,name:n.descriptor.name,defaults:n.descriptor.defaultConfig,params:n.params,inputs:n.descriptor.inputs,lineSources:jl(e,t),plots:n.descriptor.plots,colors:r?.colors,lineWidth:r?.lineWidths[0],plotStyles:r?.plots,intervals:this.chart.getIndicatorIntervals(e)??null,levels:i?this.chart.getIndicatorLevels(e):void 0,defaultLevels:n.descriptor.levels,ownLevels:a,scale:i?void 0:this.chart.getIndicatorScale(e)})}refreshObjects(){if(this.refreshDrawingsState(),!this.objectTree)return;let e=this.chart.getActiveIndicators().map(e=>({instanceId:e.instanceId,name:e.descriptor.name,visible:e.visible})),t=this.chart.getDrawings().map(e=>({id:e.id,label:na(e.type,this.t),visible:e.visible,offInterval:e.visible&&!this.chart.isDrawingShown(e.id),locked:e.locked,group:e.group})),n=this.compares.map(e=>({id:e.id,label:e.symbol,color:e.color}));this.objectTree.setObjects(e,t,n)}async handleAddCompare(){if(this.featureState.compare){if(!this.adapter){this.say(this.t(`toast.compareNeedsAdapter`),`error`);return}this.symbolSearch?.openCompare({symbols:this.symbolEntries(),current:this.state.symbol,search:this.symbolSearchFn(),ways:ic(this.t),way:this.compareWay,compared:this.comparedNow(),onAdd:(e,t)=>{rc(t)&&(this.compareWay=t,this.addCompareSymbol(e,t))},onRemove:e=>{this.compares.some(t=>t.id===e)?this.handleRemoveCompare(e):this.chart.removeIndicator(e)}})}}comparedNow(){let e=new Set(this.chart.getIndicatorPanes().flatMap(e=>e.instanceIds));return oc(this.compares,this.chart.getActiveIndicators(),e,this.t)}refreshCompareDialog(){this.symbolSearch?.isComparing()&&this.symbolSearch.setCompared(this.comparedNow())}async addCompareSymbol(e,n=`percent`){if(!this.adapter){this.say(this.t(`toast.compareNeedsAdapter`),`error`);return}if(n!==`percent`){let t=n===`scale`?this.chart.addIndicator(`compareSymbol`,{symbol:e},`bottom`,{scale:`left`}):n===`pane`?this.chart.addIndicator(`compareSymbol`,{symbol:e}):n===`correlation`?this.chart.addIndicator(`correlation`,{symbol:e}):n===`correlationLog`?this.chart.addIndicator(`correlationlog`,{symbol:e}):this.chart.addIndicator(`spread`,{symbol:e,mode:n});t&&n===`pane`&&this.chart.moveIndicatorToPane(t,`new`);return}if(this.compares.some(t=>t.symbol===e)||this.comparesLoading.has(e))return;let i=`cmp_${e}`;this.comparesLoading.add(e);try{let n=await(0,r.withResampling)(this.adapter).fetchHistory(e,this.state.timeframe,this.options.historyLimit??500);if(this.destroyed||this.compares.some(t=>t.symbol===e))return;let a=fl[this.compares.length%fl.length];this.compares.length===0&&this.chart.setCompareMode(`percent`),this.chart.addCompareSymbol(i,e,n,a),this.compares=[...this.compares,{id:i,symbol:e,color:a}],this.refreshObjects(),this.refreshCompareDialog(),this.say(t.r(this.t(`toast.comparing`),{symbol:e}))}catch(t){this.say(`${e}: ${t instanceof Error?t.message:this.t(`toast.loadFailed`)}`,`error`)}finally{this.comparesLoading.delete(e)}}handleRemoveCompare(e){this.chart.removeCompareSymbol(e),this.compares=this.compares.filter(t=>t.id!==e),this.refreshObjects(),this.refreshCompareDialog()}async loadSymbolSeries(e){if(!this.adapter){this.say(this.t(`toast.compareNeedsAdapter`),`error`);return}let t=this.state.timeframe,n=(this.symbolLoads.get(e)??0)+1;this.symbolLoads.set(e,n);let i=()=>this.destroyed||t!==this.state.timeframe||this.symbolLoads.get(e)!==n;try{let n=Math.max(this.chart.getData().length,this.options.historyLimit??500),a=await(0,r.withResampling)(this.adapter).fetchHistory(e,t,n);if(i())return;this.chart.setSymbolSeries(e,a)}catch(t){if(i())return;this.chart.setSymbolSeries(e,this.chart.getSymbolSeries(e)),this.say(`${e}: ${t instanceof Error?t.message:this.t(`toast.loadFailed`)}`,`error`)}}async refetchCompares(){for(let e of this.chart.getRequiredSymbols?.()??[])this.loadSymbolSeries(e);if(!this.adapter||this.compares.length===0)return;let e=this.compares.filter(e=>e.symbol===this.state.symbol);for(let t of e)this.handleRemoveCompare(t.id);for(let e of this.compares)try{let t=await(0,r.withResampling)(this.adapter).fetchHistory(e.symbol,this.state.timeframe,this.options.historyLimit??500);this.chart.updateCompareData(e.id,t)}catch{}}refreshAlerts(){if(!this.alertsPanel)return;let e=this.buildAlertSources();this.alertsPanel.setSources(e),this.alertsPanel.setAlerts(this.chart.getAlerts().map(t=>this.alertListItem(t,e)))}alertListItem(e,t){return{id:e.id,price:e.price,condition:e.condition,message:e.message,triggered:e.triggered,channel:e.channel,label:e.label,drawingId:e.drawingId,target:e.target,targetLabel:e.target?t.find(t=>t.channel===e.target)?.label:void 0,percent:e.percent,bars:e.bars,onBarClose:e.onBarClose,expiresAt:e.expiresAt,expired:e.expired}}alertText(e){return Di(this.alertListItem(e,this.buildAlertSources()),this.t,e=>this.formatAlertPrice(e),!0)}buildAlertSources(){let e=[{channel:`price`,label:this.t(`alerts.source.price`)}];for(let t of this.chart.getActiveIndicators()){let n=this.chart.getIndicatorOutput(t.instanceId)?.series,r=n&&n.length>0?n[n.length-1]:null,i=r?Object.keys(r).filter(e=>typeof r[e]==`number`):[];for(let n of i){let r=i.length>1?`${t.descriptor.name} ${n}`:t.descriptor.name;e.push({channel:`${t.instanceId}:${n}`,label:r})}}return e}getAlertChannelValue(e){let t=this.chart.getData();if(e===`price`)return t.length>0?this.chart.roundPrice(t[t.length-1].close):null;let n=e.indexOf(`:`);if(n<0||t.length===0)return null;let r=e.slice(0,n),i=e.slice(n+1),a=this.chart.getIndicatorOutput(r)?.series?.[t.length-1]?.[i];return typeof a==`number`&&Number.isFinite(a)?a:null}formatMoney(e){return this.formatNumber(e,Math.min((0,n.stepDecimals)(this.chart.getPriceStep()),hl))}formatNumber(e,t){let n=this.settingsState.numberLocale||void 0;return e.toLocaleString(n,{minimumFractionDigits:t,maximumFractionDigits:t})}formatAlertPrice(e){let t=this.chart.getPriceFormatter?.();if(t)return t(e);let n=Math.abs(e),r=n>=1e3?2:n>=1?4:6,i=this.settingsState.numberLocale||void 0;return e.toLocaleString(i,{minimumFractionDigits:2,maximumFractionDigits:r})}handleChartType(e){let t=this.state.chartType;e!==t&&(this.applyChartType(e),this.chart.recordUndo({subject:`chartType`,undo:()=>this.applyChartType(t),redo:()=>this.applyChartType(e)}))}applyChartType(e){this.state={...this.state,chartType:e},this.chart.setChartType(e),this.settings?.refresh(this.settingsState,e),this.updateUI()}handleAddIndicator(e){return this.chart.addIndicator(e,this.indicatorDefaults.get(e)?.params??{})!==null}saveIndicatorDefault(e,n){if(!this.indicatorDefaults.save(e,n)){this.say(this.t(`indicatorSettings.defaultSaveFailed`),`error`);return}this.chart.setIndicatorDefaults(e,n.style);let r=this.chart.getAvailableIndicators()?.find(t=>t.id===e)?.shortName??e.toUpperCase();this.say(t.r(this.t(`indicatorSettings.defaultSaved`),{name:r}))}handleRemoveIndicator(e){this.chart.removeIndicator(e)}toggleCommandPalette(){if(this.commandPalette?.isOpen()){this.commandPalette.close();return}this.featureState.commandPalette&&this.commandPalette?.open(this.buildCommandItems())}buildCommandItems(){let e=[];for(let t of this.indicatorPickerItems())e.push({id:t.id,label:t.name,category:`indicator`,active:[...this.state.activeIndicators.values()].some(e=>e.id===t.id)});for(let t of de)e.push({id:t.value,label:ht(t,this.t),category:`chartType`,active:this.state.chartType===t.value});let t=xi();for(let n of gt(fe,this.t))for(let r of n.tools)e.push({id:r.value,label:r.label,category:`drawing`,shortcut:t[r.value]?this.keysShown(`hotkeys.tools`,t[r.value]):void 0,active:this.state.activeTool===r.value});for(let t of this.timeframes)e.push({id:t,label:bt(t),category:`timeframe`,active:this.state.timeframe===t});return e.push({id:`symbolSearch`,label:this.t(`hotkeys.symbolSearch`),category:`action`,shortcut:this.keysShown(`hotkeys.symbolSearch`,`${Yn}+P`)},{id:`compare`,label:this.t(`compare.title`),category:`action`},{id:`goToDate`,label:this.t(`hotkeys.goToDate`),category:`action`,shortcut:this.keysShown(`hotkeys.goToDate`,`Alt+G`)},{id:`resetView`,label:this.t(`chartMenu.resetView`),category:`action`,shortcut:this.keysShown(`hotkeys.resetView`,`Alt+R`)},{id:`invertScale`,label:this.t(`hotkeys.invertScale`),category:`action`,shortcut:this.keysShown(`hotkeys.invertScale`,`Alt+I`)},{id:`saveLayout`,label:this.t(`hotkeys.saveLayout`),category:`action`,shortcut:this.keysShown(`hotkeys.save`,`${Yn}+S`)},{id:`watchlist`,label:this.t(`watchlist.title`),category:`action`},{id:`alerts`,label:this.t(`alerts.title`),category:`action`},{id:`objectTree`,label:this.t(`objects.title`),category:`action`},{id:`dataWindow`,label:this.t(`action.dataWindow`),category:`action`},{id:`symbolInfo`,label:this.t(`action.symbolInfo`),category:`action`},{id:`screenshot`,label:this.t(`action.screenshot`),category:`action`},{id:`copyImage`,label:this.t(`action.copyImage`),category:`action`},{id:`shareView`,label:this.t(`action.shareView`),category:`action`},{id:`toggleTheme`,label:this.t(`action.toggleTheme`),category:`action`},{id:`settings`,label:this.t(`action.settings`),category:`action`},{id:`autoFib`,label:this.t(`action.autoFib`),category:`action`},{id:`clearDrawings`,label:this.t(`action.clearDrawings`),category:`action`},{id:`hotkeys`,label:this.t(`hotkeys.title`),category:`action`,shortcut:this.keysShown(`hotkeys.help`,`?`)}),e.filter(e=>e.category!==`action`||this.commandOn(e.id)&&this.commandThere(e.id))}commandThere(e){return e===`watchlist`?this.watchlist!==null:e===`compare`?this.adapter!==null&&this.options.chartOptions?.features?.compareSymbols!==!1:e===`saveLayout`?this.layoutSession!==null:!0}keysShown(e,t){if(this.sheetKeyOn(e))return this.hostHotkeys.some(e=>e.parsed.display.join(`+`).toLowerCase()===t.toLowerCase())?void 0:t}openHotkeySheet(){this.hotkeySheet?.open({isOn:e=>this.sheetKeyOn(e),extra:this.hostHotkeys.map(e=>({keys:e.parsed.display,text:e.spec.label}))})}commandOn(e){let t=We(e);return t===void 0||this.featureState[t]}handleAction(e){if(this.commandOn(e))switch(e){case`symbolSearch`:this.openSymbolSearch();break;case`compare`:this.handleAddCompare();break;case`goToDate`:this.toggleGoToDate();break;case`resetView`:this.resetView();break;case`invertScale`:this.changeSettings({invertScale:!this.settingsState.invertScale}),this.settings?.refresh(this.settingsState);break;case`saveLayout`:this.saveLayout();break;case`watchlist`:case`alerts`:case`objectTree`:this.openPanel(e);break;case`hotkeys`:this.openHotkeySheet();break;case`screenshot`:this.chart.screenshot();break;case`toggleTheme`:this.handleToggleTheme();break;case`settings`:this.openSettings();break;case`copyImage`:this.copyChartImage();break;case`shareView`:this.copyShareLink();break;case`autoFib`:{let e=this.chart.autoFib();this.say(e?this.t(`toast.autoFibAdded`):this.t(`toast.noSwing`));break}case`dataWindow`:this.toggleDataWindow();break;case`symbolInfo`:this.toggleSymbolInfo();break;case`clearDrawings`:this.chart.clearDrawings(),this.state={...this.state,activeTool:null},this.updateUI();break}}handleDrawingTool(e){this.state={...this.state,activeTool:e},this.chart.setDrawingTool(e),this.updateUI()}handleCancelDrawing(){this.state={...this.state,activeTool:null},this.chart.setDrawingTool(null),this.chart.setEraserMode(!1),this.chart.setZoomAreaMode(!1),this.updateUI()}handleToggleStayInDrawing(){let e=!this.state.stayInDrawing;this.state={...this.state,stayInDrawing:e},this.chart.setStayInDrawingMode(e),this.updateUI()}handleToggleMagnet(){let e=this.state.magnetEnabled?this.state.magnetStrong?`off`:`strong`:`weak`;this.state={...this.state,magnetEnabled:e!==`off`,magnetStrong:e===`strong`},this.chart.setDrawingMagnetMode(e),this.updateUI()}handleToggleTheme(){if(!this.featureState.themeToggle)return;let e=!this.state.isDark;this.state={...this.state,isDark:e},this.root.dataset.tcwTheme=e?`dark`:`light`,this.portal.dataset.tcwTheme=this.root.dataset.tcwTheme,this.keepingLook(()=>this.chart.setTheme(e?this.themeOf.dark:this.themeOf.light)),this.chart.setWatermark(this.state.symbol.replace(`USDT`,` / USDT`),{fontSize:48,color:e?`rgba(255,255,255,0.03)`:`rgba(0,0,0,0.03)`}),this.updateUI()}openSettings(e){!this.featureState.settings||this.settings?.isOpen()||(this.settingsState={...this.settingsState,chartTypeOptions:this.chart.getChartTypeOptions?.()??{},autoScale:this.chart.isAutoScale?.()??this.settingsState.autoScale},this.settingsEdit={settings:{...this.settingsState},style:this.settingsStyle(),keys:new Set,styleKeys:new Set},this.settings?.open(this.settingsState,this.state.chartType,e))}resetView(){this.chart.fitContent(),this.changeSettings({autoScale:!0}),this.settings?.refresh(this.settingsState)}endSettingsEdit(e){let t=this.settingsEdit;if(this.settingsEdit=null,!t)return;let n=[...t.keys],r=e=>Object.fromEntries(n.map(t=>[t,e[t]])),i=[...t.styleKeys],a=r(t.settings),o=i.length>0?{theme:t.style.theme,overrides:Object.fromEntries(i.map(e=>[e,t.style.overrides[e]??null]))}:null;if(!e){this.restoreSettings(a,o);return}let s=r(this.settingsState),c=i.length>0?this.settingsStyle(i):null;JSON.stringify([a,o])!==JSON.stringify([s,c])&&this.chart.recordUndo({undo:()=>this.restoreSettings(a,o),redo:()=>this.restoreSettings(s,c)})}touchSettings(e,t=[]){if(this.settingsEdit){for(let t of e)this.settingsEdit.keys.add(t);for(let e of t)this.settingsEdit.styleKeys.add(e)}}applyChartTemplate(e){let n=this.chartTemplates.get(e);n&&(this.touchSettings(Object.keys(n.settings),T),this.applySettings(n.settings),this.chart.resetOverrides([...T],{layer:`user`}),this.chart.applyOverrides(n.style,{layer:`user`}),this.settings?.refresh(this.settingsState),this.say(t.r(this.t(`templates.applied`),{name:e})))}promptSaveChartTemplate(){this.chartTemplatePrompt??=new Ts(this.overlayHost(),this.t),this.chartTemplatePrompt.open({title:this.t(`settings.saveTemplateTitle`),submitLabel:this.t(`common.save`),placeholder:this.t(`settings.templatePlaceholder`),onSubmit:e=>{if(!this.chartTemplates.save(e,this.settingsState,this.settingsStyle().overrides))throw this.say(this.t(`templates.saveFailed`),`error`),Error(`The template could not be saved`);this.say(t.r(this.t(`templates.saved`),{name:e}))}})}toast(e,t=`info`,n){let r=document.createElement(`div`);r.className=`tcw-toast ${t===`error`?`tcw-toast-error`:``}`,r.setAttribute(`role`,t===`error`?`alert`:`status`);let i=n?D(n,14):``;if(i){let e=document.createElement(`span`);e.className=`tcw-toast-icon`,e.innerHTML=i,r.appendChild(e)}r.appendChild(document.createTextNode(e));let a=e=>e.querySelector(`.tcw-modal-backdrop:not([hidden])`)!==null,o=a(this.portal)?this.portal:this.root;r.classList.toggle(`tcw-toast-over`,o===this.portal||a(this.root)),o.appendChild(r),requestAnimationFrame(()=>r.classList.add(`tcw-toast-in`)),setTimeout(()=>{r.classList.remove(`tcw-toast-in`),r.addEventListener(`transitionend`,()=>r.remove(),{once:!0}),setTimeout(()=>r.remove(),400)},3500)}say(e,t=`info`,n){(this.featureState.toasts||t===`error`)&&this.toast(e,t,n)}getLayoutSession(){return this.layoutSession}getSymbol(){return this.state.symbol}getTimeframe(){return this.state.timeframe}captureLayout(){let e=this.chart.saveState(),t=e?Hs(e):null,n=t&&typeof t==`object`?Bs(t):null;return{v:1,symbol:this.state.symbol,timeframe:this.chosenTimeframe??this.state.timeframe,scaleMode:this.settingsState.scaleMode,invertScale:this.settingsState.invertScale,chart:n}}async restoreLayout(e){if(e.symbol!==this.state.symbol&&await this.setSymbol(e.symbol),e.timeframe!==this.state.timeframe&&await this.setTimeframe(e.timeframe),!this.destroyed){if(e.chart){this.chart.loadState(JSON.stringify(Bs(e.chart)));let t=e.chart.chartType;typeof t==`string`&&(this.state={...this.state,chartType:t})}this.applySettings({scaleMode:e.scaleMode,invertScale:e.invertScale}),this.syncIndicatorsFromChart(),this.updateUI(),this.settings?.refresh(this.settingsState,this.state.chartType)}}getLayoutContent(){return JSON.stringify(this.captureLayout())}async applyLayoutContent(e){let t=Vs(Hs(e));return t?(await this.restoreLayout(t),!0):!1}setupLayouts(t){let n=new e.t(t.storage??e.i(),{capture:()=>({content:this.getLayoutContent(),symbol:this.state.symbol,timeframe:this.chosenTimeframe??this.state.timeframe}),apply:async e=>{if(!await this.applyLayoutContent(e.content))throw Error(`Not a widget layout`)}},{autoSave:t.autoSave,debounceMs:t.debounceMs,onChange:()=>this.toolbar?.setLayout(n.current()?.name??null,n.isDirty()),onError:()=>this.say(this.t(`layouts.saveFailed`),`error`)});this.layoutSession=n,this.layoutsUI=new ks(n,{root:this.root,t:this.t,saveKeys:()=>this.keysShown(`hotkeys.save`,`${Yn}+S`),toast:(e,t)=>this.say(e,t),formatTime:e=>{let{date:t,time:n}=Y(e,this.displayTimezone());return`${t} ${n}`}}),this.chart.on(`stateChange`,()=>n.changed()),t.openLast&&n.list().then(([e])=>e&&!this.destroyed?this.openLayout(e.id):void 0,()=>void 0)}async saveLayout(){await this.layoutsUI?.save()}async openLayout(e){return await this.layoutsUI?.open(e)??!1}clearSavedLayout(e){if(!this.layoutKeyPrefix)return;let t=e??this.state.symbol;try{localStorage.removeItem(this.layoutKeyPrefix+t)}catch{}}applySymbolLayout(e){if(!this.layoutKeyPrefix)return;let t=this.layoutKeyPrefix+e;this.activeLayoutKey=t;try{this.chart.loadStateFromStorage(t)&&this.syncIndicatorsFromChart()}catch{}this.chart.setAutoSave(t,this.layoutDebounceMs)}flushActiveLayout(){if(this.activeLayoutKey){try{this.chart.saveState(this.activeLayoutKey)}catch{}this.chart.disableAutoSave(),this.activeLayoutKey=null}}syncIndicatorsFromChart(){let t=new Map;for(let n of this.chart.getActiveIndicators())t.set(n.instanceId,{id:n.id,label:e.T(n.id,n.params,n.descriptor.defaultConfig,n.descriptor.shortName)});this.state={...this.state,activeIndicators:t},this.updateUI(),this.indicatorPicker?.setCounts(this.indicatorCounts())}toggleIndicatorPicker(){if(this.indicatorPicker?.isOpen()){this.indicatorPicker.close();return}!this.indicatorPicker||!this.featureState[`toolbar.indicators`]||(this.indicatorPicker.open({items:this.indicatorPickerItems(),favorites:this.indicatorFavorites.list(),templates:this.featureState.indicatorTemplates?this.templateNames():null,counts:this.indicatorCounts()}),this.toolbar?.setIndicatorsOpen(!0))}indicatorPickerItems(){return(this.chart.getAvailableIndicators()??[]).filter(e=>!r.SYMBOL_INDICATOR_IDS.has(e.id)&&this.chart.isIndicatorAllowed(e.id)!==!1).map(e=>({id:e.id,name:e.name,shortName:e.shortName??e.id.toUpperCase(),placement:e.placement===`panel`?`panel`:`overlay`,category:(0,r.indicatorCategory)(e)}))}indicatorCounts(){let e=new Map;for(let{id:t}of this.state.activeIndicators.values())e.set(t,(e.get(t)??0)+1);return e}templateNames(){return this.templates.list().map(e=>e.name)}toggleReplay(){this.replayBar?.isMounted()?this.exitReplay():this.featureState.replay&&this.enterReplay()}enterReplay(){if(this.replayTotal()<2)return;let e=this.t;this.replayBar=new Kr({onPlay:()=>{if(this.replayBar?.getMode()===`select`){this.startReplayAt(Math.max(1,this.replayTotal()-100),!0);return}this.chart.getReplayState()===`paused`&&this.chart.replayResume(),this.replayBar?.setState(`playing`)},onPause:()=>{this.chart.replayPause(),this.replayBar?.setState(`paused`)},onStepBack:()=>this.stepReplay(-1),onStepForward:()=>this.stepReplay(1),onSeek:e=>{this.chart.getReplayState()===`playing`&&this.chart.replayPause(),this.chart.replaySeek(e),this.replayBar?.setState(`paused`)},onSpeedChange:e=>{this.replaySpeed=e,this.chart.setReplaySpeed(e)},onRandomStart:()=>{let e=this.replayTotal(),t=Math.max(1,Math.floor(e*.1)),n=Math.max(t,Math.floor(e*.9));this.startReplayAt(t+Math.floor(Math.random()*(n-t+1)))},onClose:()=>this.exitReplay(),onStepChange:e=>{if(this.replayStep=e,this.replayBar?.getMode()!==`replay`)return;let t=this.chart.getReplayState()===`playing`;this.startReplayAt(Math.max(0,this.chart.getReplayBarIndex()-1),t)}},{selectHint:e(`replay.selectHint`),random:e(`replay.random`),realtime:e(`replay.realtime`),barsPerSecond:e(`replay.barsPerSecond`),play:e(`replay.play`),pause:e(`replay.pause`),stepBack:e(`replay.stepBack`),stepForward:e(`replay.stepForward`),replay:e(`replay.label`),position:e(`replay.position`),speed:e(`replay.speed`),step:e(`replay.step`)});let t=[{value:`bar`,label:e(`replay.step.bar`)},...this.replayStepOptions().map(e=>({value:e,label:e}))];t.some(e=>e.value===this.replayStep)||(this.replayStep=`bar`),this.replayBar.mount(this.chartContainer,{total:this.replayTotal(),speed:this.replaySpeed,mode:`select`,steps:t,step:this.replayStep}),this.replayShade=document.createElement(`div`),this.replayShade.className=`tcw-replay-shade`,this.replayShade.hidden=!0,this.chartContainer.appendChild(this.replayShade),this.chartContainer.addEventListener(`mouseleave`,this.hideReplayShade)}hideReplayShade=()=>this.positionReplayShade(null);replayFrom(e,t=!1){this.featureState.replay&&(this.replayBar?.isMounted()||this.enterReplay(),this.startReplayAt(e,t))}startReplayAt(e,t=!1){let n=this.replayBar;if(!n)return;let r=this.replayTotal(),i=Math.max(0,Math.min(Number.isFinite(e)?Math.floor(e):0,r-1));this.replayShade?.remove(),this.replayShade=null,this.chartContainer.removeEventListener(`mouseleave`,this.hideReplayShade),n.setMode(`replay`);let a=++this.replayStartSeq,o=e=>{this.destroyed||this.replayBar!==n||!n.isMounted()||a!==this.replayStartSeq||(this.chart.replayStart({speed:this.replaySpeed,interval:1e3,startIndex:i,paused:!0,revealMarks:this.options.replayRevealMarks!==!1,...e?{steps:e}:{}}),t&&this.chart.replayResume(),n.setState(t?`playing`:`paused`),this.syncReplayBar(),this.replayPollInterval&&clearInterval(this.replayPollInterval),this.replayPollInterval=setInterval(()=>this.syncReplayBar(),150))};if(this.replayStep===`bar`){o(null);return}this.replayStepsFor(this.replayStep).then(e=>{a===this.replayStartSeq&&(e||this.say(this.t(`replay.stepsFailed`),`error`),o(e))})}replayStepOptions(){let e=(0,n.timeframeToMs)(this.state.timeframe);return Sl.filter(t=>{let i=(0,n.timeframeToMs)(t);return!(i<e)||e%i!==0?!1:this.adapter?(0,r.servesTimeframe)(this.adapter,t):this.baseSeries!==null&&this.baseTimeframeMs>0&&i>=this.baseTimeframeMs&&i%this.baseTimeframeMs===0})}async replayStepsFor(e){let t=`${this.state.symbol}|${this.state.timeframe}|${e}`;if(this.replayStepsCache?.key===t)return this.replayStepsCache.steps;let a=null;if(this.adapter){let t=Math.max(1,Math.round((0,n.timeframeToMs)(this.state.timeframe)/(0,n.timeframeToMs)(e))),i=Math.min(Cl,Math.max(this.chart.getData().length,100)*t);try{a=await(0,r.withResampling)(this.adapter).fetchHistory(this.state.symbol,e,i)}catch{a=null}}else this.baseSeries&&(a=(0,n.timeframeToMs)(e)===this.baseTimeframeMs?this.baseSeries:i(this.baseSeries,e));return!a||a.length===0?null:(this.replayStepsCache={key:t,steps:a},a)}replayTotal(){return this.chart.isReplayActive()?this.chart.getReplayProgress().total:this.chart.getData().length}syncReplayBar(){let e=this.replayBar;if(!e?.isMounted()||e.getMode()!==`replay`)return;if(!this.chart.isReplayActive()){this.teardownReplayUi();return}let t=this.chart.getReplayProgress(),n=this.chart.getReplayState();e.setProgress(t.current,t.total),e.setState(n===`stopped`?`paused`:n),e.setEnded(n!==`playing`&&t.total>0&&t.current>=t.total-1)}stepReplay(e){if(this.replayBar?.getMode()!==`replay`)return;let t=this.chart.getReplayProgress();this.chart.getReplayState()===`playing`&&this.chart.replayPause(),this.chart.replaySeek(Math.max(0,Math.min(t.total-1,t.current+e))),this.replayBar.setState(`paused`),this.syncReplayBar()}handleReplayKey(e){if(e.defaultPrevented)return!1;let t=document.activeElement;return t&&(t.tagName===`INPUT`||t.tagName===`TEXTAREA`||t.tagName===`SELECT`||t.isContentEditable)?!1:e.shiftKey&&(e.key===`ArrowRight`||e.key===`ArrowLeft`)&&this.replayBar?.getMode()===`replay`?(e.preventDefault(),e.stopPropagation(),this.stepReplay(e.key===`ArrowRight`?1:-1),!0):e.key===`Escape`&&this.replayBar?.getMode()===`select`?(this.exitReplay(),!0):!1}positionReplayShade(e){let t=this.replayShade;if(!t)return;let n=this.chart.getPlotRect();if(e===null||e<n.x||e>n.x+n.width){t.hidden=!0;return}t.hidden=!1,t.style.left=`${e}px`,t.style.top=`${n.y}px`,t.style.width=`${n.x+n.width-e}px`,t.style.height=`${n.height}px`}exitReplay(){this.teardownReplayUi(),this.chart.replayStop()}teardownReplayUi(){this.replayPollInterval&&=(clearInterval(this.replayPollInterval),null),this.replayShade?.remove(),this.replayShade=null,this.chartContainer.removeEventListener(`mouseleave`,this.hideReplayShade),this.replayBar?.unmount(),this.replayBar=null}applySettings(e){this.settingsState={...this.settingsState,...e},(e.scaleMode!==void 0||e.logScale!==void 0||e.invertScale!==void 0)&&this.layoutSession?.changed(),this.scheduleLegend(),e.gridVisible!==void 0&&this.chart.setGridVisible(e.gridVisible),e.volumeVisible!==void 0&&this.chart.setVolumeVisible(e.volumeVisible),e.volumeProfileVisible!==void 0&&this.chart.setVolumeProfileVisible(e.volumeProfileVisible),e.marketProfileVisible!==void 0&&this.chart.setMarketProfileVisible(e.marketProfileVisible),e.marketProfileSplit!==void 0&&this.chart.setMarketProfileConfig({splitBySession:e.marketProfileSplit}),e.marketProfileLetters!==void 0&&this.chart.setMarketProfileConfig({letters:e.marketProfileLetters}),e.marketProfileBuckets!==void 0&&this.chart.setMarketProfileConfig({buckets:e.marketProfileBuckets}),e.marketProfileOpacity!==void 0&&this.chart.setMarketProfileConfig({opacity:e.marketProfileOpacity}),e.depthHeatmapVisible!==void 0&&this.chart.setDepthHeatmapVisible(e.depthHeatmapVisible),e.depthHeatmapOpacity!==void 0&&this.chart.setDepthHeatmapConfig({opacity:e.depthHeatmapOpacity}),e.sessionShadingVisible!==void 0&&this.chart.setSessionShadingVisible(e.sessionShadingVisible),e.pivotMarkersVisible!==void 0&&this.chart.setPivotMarkersVisible(e.pivotMarkersVisible),e.pivotStrength!==void 0&&this.chart.setPivotMarkersConfig({left:e.pivotStrength,right:e.pivotStrength}),e.pivotStructureLabels!==void 0&&this.chart.setPivotMarkersConfig({structureLabels:e.pivotStructureLabels}),e.periodLevelsVisible!==void 0&&this.chart.setPeriodLevelsVisible(e.periodLevelsVisible),e.periodLevelsPeriod!==void 0&&this.chart.setPeriodLevelsPeriod(e.periodLevelsPeriod),e.legendVisible!==void 0&&this.chart.setLegend({visible:e.legendVisible}),e.barCountdown!==void 0&&this.chart.setBarCountdownVisible(e.barCountdown),e.indicatorValueLabels!==void 0&&this.chart.setIndicatorValueLabelsVisible(e.indicatorValueLabels),e.crosshairMode!==void 0&&this.chart.setCrosshairMode(e.crosshairMode),e.autoScale!==void 0&&this.chart.setAutoScale(e.autoScale),e.invertScale!==void 0&&this.chart.setInvertScale(e.invertScale),e.leftPriceScale!==void 0&&this.chart.setLeftPriceScaleVisible(e.leftPriceScale),(e.scaleMode!==void 0||e.autoScale!==void 0)&&queueMicrotask(()=>this.refreshScaleSwitches()),e.timezone!==void 0&&queueMicrotask(()=>this.statusBar?.tick()),e.scaleMode===void 0?e.logScale!==void 0&&(this.chart.setLogScale(e.logScale),this.settingsState={...this.settingsState,scaleMode:e.logScale?`logarithmic`:`regular`}):(this.chart.setScaleMode(e.scaleMode),this.settingsState={...this.settingsState,logScale:e.scaleMode===`logarithmic`}),e.numberLocale!==void 0&&(this.chart.setNumberLocale(e.numberLocale),this.watchlist?.setLocale(e.numberLocale||void 0)),e.timezone!==void 0&&this.chart.setTimeZone(s(e.timezone)),e.highLowLines!==void 0&&this.chart.setHighLowLines(e.highLowLines),e.extendedHours!==void 0&&this.chart.setExtendedHours(e.extendedHours),e.mainSeriesVisible!==void 0&&this.chart.setMainSeriesVisible(e.mainSeriesVisible),e.chartTypeOptions!==void 0&&this.chart.setChartTypeOptions({renko:{},lineBreak:{},kagi:{},pointAndFigure:{},rangeBars:{},...e.chartTypeOptions})}resetSettings(){let e={...this.settingsState},t=this.settingsStyle(),n={...this.settingsDefaults};this.touchSettings(Object.keys(n),T),this.applySettings(n),this.chart.resetOverrides([...T],{layer:`user`});let r={...this.settingsState},i=this.settingsStyle();this.settings?.refresh(this.settingsState),!(this.settingsEdit||JSON.stringify([e,t])===JSON.stringify([r,i]))&&this.chart.recordUndo({undo:()=>this.restoreSettings(e,t),redo:()=>this.restoreSettings(r,i)})}changeStyle(e){let t=Object.keys(e);this.touchSettings([],t);let n=this.settingsStyle(t);this.chart.applyOverrides(e,{layer:`user`});let r=this.settingsStyle(t);this.settingsEdit||JSON.stringify(n)===JSON.stringify(r)||this.chart.recordUndo({subject:`style:${Object.keys(e).sort().join(`,`)}`,undo:()=>this.restoreSettings({},n),redo:()=>this.restoreSettings({},r)})}changeSettings(e){let t=Object.keys(e);if(t.includes(`scaleMode`)||t.includes(`logScale`))for(let e of[`scaleMode`,`logScale`])t.includes(e)||t.push(e);let n=()=>Object.fromEntries(t.map(e=>[e,this.settingsState[e]]));this.touchSettings(t);let r=n();this.applySettings(e);let i=n();this.settingsEdit||JSON.stringify(r)===JSON.stringify(i)||this.chart.recordUndo({subject:`settings:${Object.keys(e).sort().join(`,`)}`,undo:()=>this.restoreSettings(r),redo:()=>this.restoreSettings(i)})}settingsStyle(e=T){let t=this.chart.getOverrides?.({layer:`user`})??{},n=Object.fromEntries(e.map(e=>{let n=t[e];return[e,typeof n==`string`||typeof n==`boolean`||typeof n==`number`?n:null]}));return{theme:this.chart.getTheme()?.name??``,overrides:n}}restoreSettings(e,t=null){this.applySettings(e),t&&t.theme===(this.chart.getTheme()?.name??``)&&this.chart.applyOverrides(t.overrides,{layer:`user`}),this.settings?.refresh(this.settingsState)}async connectStream(){if(!this.adapter)return;let e=++this.connectSeq;this.state={...this.state,connectionState:`connecting`,connectionMessage:this.t(`status.connecting`)},this.updateUI(),this.loading.begin(this.chart.getData().length>0);try{if(this.chart.disconnectStream(),await this.chart.connect({adapter:this.adapter,symbol:this.state.symbol,timeframe:this.state.timeframe,historyLimit:this.options.historyLimit??500,historyPageSize:this.options.historyPageSize}),e!==this.connectSeq||this.destroyed)return;this.chart.setWatermark(this.state.symbol.replace(`USDT`,` / USDT`),{fontSize:48,color:this.state.isDark?`rgba(255,255,255,0.03)`:`rgba(0,0,0,0.03)`}),this.applySymbolLayout(this.state.symbol),this.loading.hasFailed()?this.state={...this.state,connectionState:`error`}:(this.loading.end(),this.state={...this.state,connectionState:`connected`,connectionMessage:this.t(`status.live`)}),this.refetchCompares()}catch(t){if(e!==this.connectSeq||this.destroyed)return;this.loading.fail(this.t(`status.connectionFailed`)),this.state={...this.state,connectionState:`error`,connectionMessage:t instanceof Error?t.message:this.t(`status.connectionFailed`)}}this.updateUI()}scheduleLegend(){!this.indicatorLegend||this.legendFrame||!this.featureState.indicatorLegend||(this.legendFrame=requestAnimationFrame(()=>{this.legendFrame=0,this.renderLegend()}))}renderLegend(){if(!this.indicatorLegend||this.destroyed)return;let t=this.chart.getData().length-1,n=this.chart.isTimeAligned()?this.legendHoverIndex:null,r=n===null?t:Math.min(Math.max(n,0),t),i=new Map;for(let e of this.chart.getIndicatorPanes())(e.instanceIds??[e.instanceId]).forEach((t,n)=>i.set(t,{...e.rect,row:n}));let a=this.settingsState.numberLocale||`en-US`,o=this.chart.getActiveIndicators().map(t=>{let n=i.get(t.instanceId)??null,o=r>=0?this.chart.getIndicatorOutput(t.instanceId)?.series?.[r]:null,s=this.chart.getIndicatorStyle(t.instanceId),c=t.visible&&t.shown===!1,l=c?[]:Cc(t.descriptor,o,s?.colors??[],s?.plots);return{instanceId:t.instanceId,label:e.T(t.id,t.params,t.descriptor.defaultConfig,t.descriptor.shortName),visible:t.visible,offInterval:c,values:l.map(e=>({text:n?Ec(e.value,a):this.chart.formatPrice(e.value),color:e.color})),pane:n?{x:n.x+vl,y:n.y+Math.min(yl+n.row*bl,Math.max(yl,n.height-bl)),width:n.width-2*vl}:null}}),s=this.chart.getPlotRect(),c=this.chart.getMaximizedPane(),l=e=>o.find(t=>t.instanceId===e)?.label??``,u=this.chart.getIndicatorPanes().map(e=>({instanceId:e.instanceId,x:e.rect.x+e.rect.width-vl,y:e.rect.y+xl,label:l(e.instanceId),collapsed:this.chart.isPaneCollapsed(e.instanceId),maximized:c===e.instanceId,canMoveUp:this.chart.canMovePane(e.instanceId,-1),canMoveDown:this.chart.canMovePane(e.instanceId,1)}));this.indicatorLegend.update(o,{left:s.x+vl,top:this.chart.getLegendBottom()+1},u)}runPaneAction(e,t){t===`up`||t===`down`?this.chart.movePane(e,t===`up`?-1:1):t===`collapse`||t===`expand`?this.chart.setPaneCollapsed(e,t===`collapse`):this.chart.setMaximizedPane(t===`maximize`?e:null),this.scheduleLegend()}openLegendMenu(e,t){let n=this.legendMenu;if(!n)return;if(n.isOpen()){n.close();return}let r=[`price`,...this.chart.getIndicatorPanes().map(e=>e.instanceId)],i=1+this.chart.getIndicatorPanes().findIndex(t=>t.instanceIds.includes(e)),a=r[i-1],o=r[i+1],s=t=>t!==void 0&&this.chart.canMoveIndicatorToPane(e,t),c=[];s(a)&&c.push({id:`move:${a}`,label:this.t(a===`price`?`legend.movePrice`:`legend.moveUp`),icon:`arrowUp`}),s(o)&&c.push({id:`move:${o}`,label:this.t(`legend.moveDown`),icon:`arrowDown`}),s(`new`)&&c.push({id:`move:new`,label:this.t(`legend.moveNew`),icon:`plus`}),a!==`price`&&s(`price`)&&c.push({id:`move:price`,label:this.t(`legend.movePrice`),icon:`trendingUp`});let l=[];this.featureState.indicatorSettings&&this.featureState[`indicatorLegend.settings`]&&l.push({id:`settings`,label:this.t(`legend.settings`),icon:`settings`}),this.featureState[`indicatorLegend.remove`]&&l.push({id:`remove`,label:this.t(`legend.remove`),icon:`trash`,danger:!0}),c.length>0&&l.length>0&&c.push(`separator`),c.push(...l);let u=this.chart.getActiveIndicators().find(t=>t.instanceId===e)?.id??``,d=this.options.indicatorMenuItems?.({instanceId:e,indicatorId:u})??[],f=Qc(c,d);if(f.length===0)return;let p=t.getBoundingClientRect(),m=this.root.getBoundingClientRect();n.open(f,p.left-m.left,p.bottom-m.top+2,t=>{$c(t,d)||(t===`settings`?this.openIndicatorSettings(e):t===`remove`?this.handleRemoveIndicator(e):t.startsWith(`move:`)&&this.chart.moveIndicatorToPane(e,t.slice(5)),this.scheduleLegend())},t)}updateUI(){this.refreshDrawingsState(),this.scheduleLegend(),this.toolbar?.update(this.state),this.sidebar?.update(this.state),this.statusBar?.update({connectionState:this.state.connectionState,message:this.state.connectionMessage,symbol:this.state.symbol,timeframe:this.state.timeframe})}resolveIsDark(e){return e===void 0||e===`dark`?!0:e===`light`?!1:typeof e==`object`&&e.background?this.isColorDark(e.background):!0}resolveTheme(e){return e===void 0||e===`dark`?n.DARK_THEME:e===`light`?n.LIGHT_THEME:typeof e==`object`?e:n.DARK_THEME}isColorDark(e){if(e.startsWith(`#`)&&e.length>=7){let t=parseInt(e.slice(1,3),16),n=parseInt(e.slice(3,5),16),r=parseInt(e.slice(5,7),16);return t+n+r<384}return!0}};function jl(t,i){let a=e=>{let t=(0,r.sourceParam)(e.descriptor);return t&&(0,n.parseIndicatorSource)(e.params[t])?.instanceId||null},o=new Set([t]);for(let e=!0;e;){e=!1;for(let t of i){let n=a(t);n&&o.has(n)&&!o.has(t.instanceId)&&(o.add(t.instanceId),e=!0)}}let s=[];for(let t of i){if(o.has(t.instanceId))continue;let r=e.T(t.id,t.params,t.descriptor.defaultConfig,t.descriptor.shortName);for(let e of t.descriptor.plots??[])s.push({value:(0,n.indicatorSource)(t.instanceId,e.key),label:`${r}: ${e.title}`})}return s}var Ml=`tcw:recentCommands`,Nl=10;function Pl(){try{let e=JSON.parse(zl()?.getItem(Ml)??`[]`);return Array.isArray(e)?e.filter(e=>typeof e==`string`).slice(0,Nl):[]}catch{return[]}}function Fl(e){try{zl()?.setItem(Ml,JSON.stringify(e.slice(0,Nl)))}catch{}}var Il=`tcw:dockWidth`;function Ll(){try{let e=Number(zl()?.getItem(Il)??NaN);return Number.isFinite(e)&&e>0?e:null}catch{return null}}function Rl(e){try{zl()?.setItem(Il,String(e))}catch{}}function zl(){try{return typeof localStorage<`u`?localStorage:null}catch{return null}}function Bl(e){let t=e.filter(e=>e!==null);if(t.length===0)return null;let n=Math.min(...t.map(e=>e.x)),r=Math.min(...t.map(e=>e.y)),i=Math.max(...t.map(e=>e.x+e.width)),a=Math.max(...t.map(e=>e.y+e.height));return{x:n,y:r,width:i-n,height:a-r}}function Vl(e){return!!e&&/^(ar|he|iw|fa|ur|ps|yi|dv|ckb|sd|ug)(-|$)/i.test(e)}var Hl={symbol:!1,interval:!1,crosshair:!0,time:!1,drawings:!1,replay:!1},Ul=[`symbol`,`interval`,`crosshair`,`time`,`drawings`,`replay`],$={"1x1":{cols:1,rows:1},"1x2":{cols:2,rows:1},"2x1":{cols:1,rows:2},"2x2":{cols:2,rows:2},"1x3":{cols:3,rows:1},"3x1":{cols:1,rows:3},"2x3":{cols:3,rows:2},"3x2":{cols:2,rows:3}};function Wl(e){return typeof e==`string`&&Object.prototype.hasOwnProperty.call($,e)}function Gl(e){return JSON.parse(JSON.stringify(e))}function Kl(e,t,n=16){let r=(20-2*(e-1))/e,i=(20-2*(t-1))/t,a=``;for(let n=0;n<t;n++)for(let t=0;t<e;t++)a+=`<rect x="${2+t*(r+2)}" y="${2+n*(i+2)}" width="${r}" height="${i}" rx="1"/>`;return`<svg width="${n}" height="${n}" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true">${a}</svg>`}function ql(e){if(typeof e!=`object`||!e)return null;let t=e;if(t.v!==1||t.kind!==`grid`||!Wl(t.layout)||!Array.isArray(t.cells))return null;let n=t.cells.map(Vs);if(n.some(e=>e===null))return null;let r=typeof t.sync==`object`&&t.sync!==null?t.sync:{},i={...Hl};for(let e of Ul)typeof r[e]==`boolean`&&(i[e]=r[e]);let a=typeof t.active==`number`&&Number.isInteger(t.active)?t.active:0;return{v:1,kind:`grid`,layout:t.layout,sync:i,active:a,cells:n}}var Jl=class{root;cellsEl;cells=[];layout;sync;active=0;hovered=null;relayDepth=0;uiTheme=null;styleOverrides={};featureSwitches={};parked=new Map;drawingFrame=0;drawingSource=null;layoutButtons=new Map;syncButtons=new Map;layoutsButton=null;tabsEl=null;stopNarrow=()=>{};session=null;layoutsUI=null;t;destroyed=!1;unregisterKeys=()=>{};onKeyDown=e=>{!(e.ctrlKey||e.metaKey)||e.altKey||e.shiftKey||e.key!==`s`&&e.key!==`S`||!this.layoutsUI||J()||!Ls(this.root,!0)||(e.preventDefault(),this.layoutsUI.save())};constructor(e,n={}){this.options=n,this.layout=Wl(n.layout)?n.layout:`1x2`,this.sync={...Hl,...n.sync},this.t=t.n(t.o(n.widget?.locale,n.widget?.messages)),Ye(),this.root=document.createElement(`div`),this.root.className=`tcw-root tcw-grid`,this.root.dataset.tcwTheme=n.widget?.theme===`light`?`light`:`dark`,W(this.root,U(n.widget?.ui),{variables:n.widget?.ui!==void 0}),n.bar!==!1&&this.root.appendChild(this.buildBar()),this.cellsEl=document.createElement(`div`),this.cellsEl.className=`tcw-grid-cells`,this.root.appendChild(this.cellsEl),e.appendChild(this.root),this.stopNarrow=Ks(this.root),this.applyShape();for(let e=0;e<this.shapeCount();e++)this.cells.push(this.createCell(e));this.markActive();let r=this.cells[0]?.el.querySelector(`.tcw-root`)?.dataset.tcwTheme;r&&(this.root.dataset.tcwTheme=r),n.layouts!==!1&&this.setupLayouts(n.layouts===!0||n.layouts===void 0?{}:n.layouts),this.unregisterKeys=Is(this.root),document.addEventListener(`keydown`,this.onKeyDown)}get relaying(){return this.relayDepth>0}quietly(e){this.relayDepth++;try{return e()}finally{this.relayDepth--}}getWidget(e){return this.cells[e]?.widget??null}getWidgets(){return this.cells.map(e=>e.widget)}getActiveIndex(){return this.active}getActiveWidget(){return this.cells[this.active].widget}setActive(e){e<0||e>=this.cells.length||e===this.active||(this.active=e,this.markActive(),this.options.onActiveChange?.(e,this.cells[e].widget),this.session?.changed())}getLayout(){return this.layout}setLayout(e){if(e===this.layout||!Wl(e))return;this.layout=e;let t=this.shapeCount();for(;this.cells.length>t;){let e=this.cells.length-1,t=this.cells.pop();this.parked.set(e,t.widget.captureLayout()),this.destroyCell(t)}this.applyShape();for(let e=this.cells.length;e<t;e++){let t=this.createCell(e);this.cells.push(t),this.unpark(e,t)}this.active>=t&&(this.active=0,this.options.onActiveChange?.(0,this.cells[0].widget)),this.markActive(),this.renderBar(),this.session?.changed()}getSync(){return{...this.sync}}setUI(e){let t=U(e);W(this.root,t);for(let e of this.cells)e.widget.setUI(t);this.uiTheme=t}getUI(){return U(this.uiTheme??this.options.widget?.ui)}setSync(e){let t=this.sync;if(this.sync={...this.sync,...e},t.crosshair&&!this.sync.crosshair)for(let e of this.cells)e.widget.getChart().setCrosshairTime(null);let n=this.cells[this.active];if(n&&!this.relaying){let e=n.widget.getSymbol(),r=n.widget.getTimeframe();!t.symbol&&this.sync.symbol&&this.relay(n,t=>void t.setSymbol(e)),!t.interval&&this.sync.interval&&this.relay(n,e=>void e.setTimeframe(r)),!t.drawings&&this.sync.drawings&&this.mergeDrawings()}this.renderBar(),this.session?.changed()}applyOverrides(e){for(let t of this.cells)t.widget.getChart().applyOverrides(e);let t={...this.styleOverrides};for(let[n,r]of Object.entries(e))r==null?delete t[n]:t[n]=r;this.styleOverrides=t}setFeatures(e){let t=Le(e);for(let e of this.cells)e.widget.setFeatures(t);this.featureSwitches={...this.featureSwitches,...t}}setTheme(e){for(let t of this.cells)t.widget.setTheme(e);this.followTheme()}getLayoutSession(){return this.session}captureLayout(){let e=[...this.parked.entries()].sort(([e],[t])=>e-t).map(([,e])=>e);return{v:1,kind:`grid`,layout:this.layout,sync:{...this.sync},active:this.active,cells:[...this.cells.map(e=>e.widget.captureLayout()),...e]}}async restoreLayout(e){this.relayDepth++;let t;try{this.parked.clear(),this.setLayout(e.layout),this.sync={...e.sync},this.renderBar();let n=this.cells.length;e.cells.slice(n).forEach((e,t)=>this.parked.set(n+t,e)),t=await Promise.allSettled(this.cells.map((t,n)=>e.cells[n]?t.widget.restoreLayout(e.cells[n]):Promise.resolve()))}finally{this.relayDepth--}if(this.destroyed)return;this.setActive(Math.min(Math.max(0,e.active),this.cells.length-1)),this.renderTabs();let n=t.find(e=>e.status===`rejected`);if(n)throw n.reason}getLayoutContent(){return JSON.stringify(this.captureLayout())}async applyLayoutContent(e){let t=ql(Hs(e));return t?(await this.restoreLayout(t),!0):!1}destroy(){if(!this.destroyed){this.destroyed=!0,document.removeEventListener(`keydown`,this.onKeyDown),this.unregisterKeys(),this.stopNarrow(),this.drawingFrame&&cancelAnimationFrame(this.drawingFrame),this.session?.destroy(),this.layoutsUI?.destroy();for(let e of this.cells)this.destroyCell(e);this.cells=[],this.root.remove(),Xe()}}shapeCount(){let{cols:e,rows:t}=$[this.layout];return e*t}applyShape(){let{cols:e,rows:t}=$[this.layout];this.cellsEl.style.gridTemplateColumns=`repeat(${e}, minmax(0, 1fr))`,this.cellsEl.style.gridTemplateRows=`repeat(${t}, minmax(0, 1fr))`}createCell(e){let n=document.createElement(`div`);n.className=`tcw-grid-cell`,n.setAttribute(`role`,`region`),n.setAttribute(`aria-label`,t.r(this.t(`grid.chart`),{n:e+1})),this.cellsEl.appendChild(n);let r=this.options.widget??{},i=this.options.cells?.[e]??{},a=this.cells[this.active]?.widget,o={},s=new Al(n,{...r,...i,...a&&this.sync.symbol?{symbol:a.getSymbol()}:{},...a&&this.sync.interval?{timeframe:a.getTimeframe()}:{},...this.options.adapter&&!i.adapter?{adapter:this.options.adapter(e)}:{},...this.uiTheme?{ui:this.uiTheme}:{},layouts:!1,features:{dock:!1,...r.features,...i.features},onSymbolChange:e=>{i.onSymbolChange?.(e),r.onSymbolChange?.(e),this.sync.symbol&&this.relay(o,t=>void t.setSymbol(e)),this.renderTabs(),this.session?.changed()},onTimeframeChange:e=>{i.onTimeframeChange?.(e),r.onTimeframeChange?.(e),this.sync.interval&&this.relay(o,t=>void t.setTimeframe(e)),this.renderTabs(),this.session?.changed()}});return o.el=n,o.widget=s,Object.keys(this.styleOverrides).length>0&&s.getChart().applyOverrides(this.styleOverrides),Object.keys(this.featureSwitches).length>0&&s.setFeatures(this.featureSwitches),this.wireCell(o),n.addEventListener(`pointerdown`,()=>this.setActive(this.cells.indexOf(o)),!0),n.addEventListener(`pointerenter`,()=>{this.hovered=o}),n.addEventListener(`pointerleave`,()=>{this.hovered===o&&(this.hovered=null)}),this.options.onChartAdd?.(s,e),o}wireCell(e){let t=e.widget.getChart(),n=()=>this.cells.filter(t=>t!==e);t.on(`crosshairMove`,e=>{let t=e.payload.bar?.time;if(!(!this.sync.crosshair||t===void 0))for(let e of n())e.widget.getChart().setCrosshairTime(t)}),t.on(`crosshairLeave`,()=>{if(this.sync.crosshair)for(let e of n())e.widget.getChart().setCrosshairTime(null)}),t.on(`visibleRangeChange`,n=>{if(!this.sync.time||this.relaying||(this.hovered??this.cells[this.active])!==e)return;let{from:r,to:i}=n.payload,a=t.getData(),o=a[r]?.time,s=a[i]?.time;o===void 0||s===void 0||this.relay(e,e=>e.getChart().setVisibleRange(o,s))});for(let n of[`drawingCreate`,`drawingUpdate`,`drawingRemove`])t.on(n,()=>{this.sync.drawings&&!this.relaying&&this.copyDrawingsSoon(e)});t.on(`replayStep`,t=>{if(!this.sync.replay||this.relaying)return;let{until:n}=t.payload;this.relay(e,e=>{let t=e.getChart();if(t.isReplayActive()){t.replaySeekToTime(n);return}let r=Yl(t.getData(),n);r>=0&&t.replayStart({startIndex:r,paused:!0})})}),t.on(`replayState`,t=>{!this.sync.replay||this.relaying||t.payload.state!==`stopped`||this.relay(e,e=>{e.getChart().isReplayActive()&&e.getChart().replayStop()})}),t.on(`stateChange`,()=>this.session?.changed()),t.on(`themeChange`,()=>{this.relaying||this.followTheme(e)})}destroyCell(e){this.hovered===e&&(this.hovered=null),this.drawingSource===e&&(this.drawingSource=null),this.quietly(()=>e.widget.destroy()),e.el.remove()}relay(e,t){this.relaying||this.quietly(()=>{for(let n of this.cells)n!==e&&t(n.widget)})}unpark(e,t){let n=this.parked.get(e);if(!n)return;this.parked.delete(e);let r=this.cells[this.active]?.widget,i={...n,...r&&this.sync.symbol?{symbol:r.getSymbol()}:{},...r&&this.sync.interval?{timeframe:r.getTimeframe()}:{}};this.relayDepth++,t.widget.restoreLayout(i).catch(()=>t.widget.toast(this.t(`layouts.openFailed`),`error`)).finally(()=>{this.relayDepth--})}copyDrawingsSoon(e){this.drawingSource=e,!this.drawingFrame&&(this.drawingFrame=requestAnimationFrame(()=>{this.drawingFrame=0;let e=this.drawingSource;this.drawingSource=null,e&&!this.destroyed&&!this.relaying&&this.copyDrawings(e)}))}copyDrawings(e){let t=e.widget.getSymbol(),n=e.widget.getChart().getDrawings();this.quietly(()=>{for(let r of this.cells)r!==e&&r.widget.getSymbol()===t&&r.widget.getChart().setDrawings(Gl(n))})}mergeDrawings(){let e=new Map;for(let t of this.cells)e.set(t.widget.getSymbol(),[...e.get(t.widget.getSymbol())??[],t]);this.quietly(()=>{for(let t of e.values()){if(t.length<2)continue;let e=new Map;for(let n of t)for(let t of n.widget.getChart().getDrawings())e.has(t.id)||e.set(t.id,t);let n=[...e.values()];for(let e of t)e.widget.getChart().setDrawings(Gl(n))}})}followTheme(e=this.cells[this.active]){let t=e?.el.querySelector(`.tcw-root`)?.dataset.tcwTheme;t&&(this.root.dataset.tcwTheme=t,this.quietly(()=>{for(let n of this.cells)n!==e&&n.el.querySelector(`.tcw-root`)?.dataset.tcwTheme!==t&&n.widget.setTheme(t)}))}markActive(){this.cells.forEach((e,t)=>{e.el.classList.toggle(`tcw-grid-cell-active`,t===this.active&&this.cells.length>1),e.el.classList.toggle(`tcw-grid-cell-current`,t===this.active)}),this.renderTabs()}renderTabs(){let e=this.tabsEl;if(!e)return;let t=this.cells.map(e=>`${e.widget.getSymbol()} · ${e.widget.getTimeframe()}`);for(;e.children.length>t.length;)e.lastElementChild?.remove();for(;e.children.length<t.length;){let t=e.children.length,n=document.createElement(`button`);n.type=`button`,n.className=`tcw-btn tcw-grid-tab`,n.addEventListener(`click`,()=>this.setActive(t)),e.appendChild(n)}t.forEach((t,n)=>{let r=e.children[n];r.textContent!==t&&(r.textContent=t);let i=n===this.active;r.classList.toggle(`tcw-active`,i),r.setAttribute(`aria-pressed`,String(i))})}buildBar(){let e=document.createElement(`div`);e.className=`tcw-grid-bar`,e.setAttribute(`role`,`toolbar`),e.setAttribute(`aria-label`,this.t(`grid.bar`)),this.tabsEl=document.createElement(`div`),this.tabsEl.className=`tcw-grid-group tcw-grid-tabs`,this.root.classList.add(`tcw-grid-has-tabs`),this.tabsEl.setAttribute(`role`,`group`),this.tabsEl.setAttribute(`aria-label`,this.t(`grid.charts`)),e.appendChild(this.tabsEl);let n=document.createElement(`div`);n.className=`tcw-grid-group`,n.setAttribute(`role`,`group`),n.setAttribute(`aria-label`,this.t(`grid.layout`));let r=this.options.layoutChoices?.filter(Wl)??Object.keys($);for(let e of r){let{cols:r,rows:i}=$[e],a=r*i===1?this.t(`grid.single`):t.r(this.t(`grid.layoutOption`),{count:r*i,cols:r,rows:i}),o=document.createElement(`button`);o.type=`button`,o.className=`tcw-btn-icon`,o.title=a,o.setAttribute(`aria-label`,a),o.innerHTML=Kl(r,i),o.addEventListener(`click`,()=>this.setLayout(e)),this.layoutButtons.set(e,o),n.appendChild(o)}let i=document.createElement(`div`);i.className=`tcw-grid-group`,i.setAttribute(`role`,`group`),i.setAttribute(`aria-label`,this.t(`grid.sync`));let a=document.createElement(`span`);a.className=`tcw-grid-label`,a.innerHTML=`${D(`link`,13)}<span>${O(this.t(`grid.sync`))}</span>`,i.appendChild(a);for(let e of Ul){let t=document.createElement(`button`);t.type=`button`,t.className=`tcw-btn tcw-grid-sync`,t.textContent=this.t(`grid.sync.${e}`),t.title=this.t(`grid.sync.${e}.hint`),t.addEventListener(`click`,()=>this.setSync({[e]:!this.sync[e]})),this.syncButtons.set(e,t),i.appendChild(t)}let o=document.createElement(`span`);return o.className=`tcw-toolbar-spacer`,e.append(n,this.sep(),i,o),this.options.layouts!==!1&&(this.layoutsButton=document.createElement(`button`),this.layoutsButton.type=`button`,this.layoutsButton.className=`tcw-dropdown-trigger tcw-layouts-btn`,this.layoutsButton.setAttribute(`aria-haspopup`,`menu`),this.layoutsButton.addEventListener(`click`,()=>{this.layoutsButton&&this.layoutsUI?.openMenu(this.layoutsButton)}),e.appendChild(this.layoutsButton)),this.renderBar(),e}sep(){let e=document.createElement(`span`);return e.className=`tcw-toolbar-sep`,e}renderBar(){for(let[e,t]of this.layoutButtons){let n=e===this.layout;t.classList.toggle(`tcw-active`,n),t.setAttribute(`aria-pressed`,String(n))}for(let[e,t]of this.syncButtons)t.classList.toggle(`tcw-active`,this.sync[e]),t.setAttribute(`aria-pressed`,String(this.sync[e]));this.renderLayoutsButton()}renderLayoutsButton(){let e=this.layoutsButton;if(!e)return;let t=this.session?.current()?.name??this.t(`layouts.unnamed`),n=this.session?.isDirty()??!1,r=`${this.t(`toolbar.layouts`)}: ${t}${n?` (${this.t(`layouts.unsavedChanges`)})`:``}`;e.innerHTML=`${D(`save`,14)}<span class="tcw-layouts-label">${O(t)}</span>`+(n?`<span class="tcw-layouts-dirty" aria-hidden="true"></span>`:``)+D(`chevronDown`,12),e.title=r,e.setAttribute(`aria-label`,r)}setupLayouts(t){let n=new e.t(t.storage??e.i(`tcw:grid-layouts:`),{capture:()=>{let e=this.cells[this.active].widget;return{content:this.getLayoutContent(),symbol:e.getSymbol(),timeframe:e.getTimeframe()}},apply:async e=>{if(!await this.applyLayoutContent(e.content))throw Error(`Not a grid layout`)}},{autoSave:t.autoSave,debounceMs:t.debounceMs,kind:`grid`,onChange:()=>this.renderLayoutsButton(),onError:()=>this.toast(this.t(`layouts.saveFailed`),`error`)});this.session=n,this.layoutsUI=new ks(n,{root:this.root,t:this.t,toast:(e,t)=>this.toast(e,t),formatTime:e=>{let{date:t,time:n}=Y(e,null);return`${t} ${n}`}}),this.renderLayoutsButton(),t.openLast&&n.list().then(([e])=>e&&!this.destroyed?this.layoutsUI?.open(e.id):void 0,()=>void 0)}toast(e,t=`info`){this.cells[this.active]?.widget.toast(e,t)}};function Yl(e,t){let n=-1;for(let r=0;r<e.length&&e[r].time<t;r++)n=r;return n}Object.defineProperty(exports,`CHART_TYPE_ICONS`,{enumerable:!0,get:function(){return n.CHART_TYPE_ICONS}}),exports.ChartWidget=Al,exports.ChartWidgetGrid=Jl,exports.DEFAULT_GRID_SYNC=Hl,Object.defineProperty(exports,`DRAWING_TOOL_ICONS`,{enumerable:!0,get:function(){return n.DRAWING_TOOL_ICONS}}),exports.EN_MESSAGES=t.c,exports.GRID_SHAPES=$,exports.LayoutSession=e.t,exports.MAX_LAYOUT_NAME=e.n,Object.defineProperty(exports,`UI_ICONS`,{enumerable:!0,get:function(){return n.UI_ICONS}}),exports.VI_MESSAGES=t.s,exports.WIDGET_FEATURES=je,exports.WIDGET_UI_PRESETS=Gi,exports.applyWidgetUI=W,exports.cleanLayoutName=e.r,exports.createChartTypeIcon=$e,exports.createIcon=D,exports.createToolIcon=Qe,exports.findWidgetLocale=t.i,Object.defineProperty(exports,`iconSvg`,{enumerable:!0,get:function(){return n.iconSvg}}),exports.localStorageLayouts=e.i,exports.memoryLayouts=e.a,exports.readGridLayout=ql,exports.readWatchlists=si,exports.readWidgetLayout=Vs,exports.registerWidgetLocale=t.a,exports.resolveWidgetUI=U,exports.widgetUIVariables=$i;
7662
+ `)&&this.problemsEl.replaceChildren(...n.map(e=>{let t=document.createElement(`p`);return t.textContent=e,t}));for(let t of[`stopLoss`,`takeProfit`]){let n=this.body.querySelector(`.tcw-ticket-away[data-for="${t}"]`),r=e[t],i=r===null?null:Js(e,this.lastPrice,r,this.rules.multiplier);n&&(n.textContent=i?`${this.signedNumber(i.pct,2)}% · ${this.amount(i.amount)}`:``)}this.renderSummary(e),this.submit.disabled=t.length>0,this.submit.textContent=this.t(e.side===`buy`?`ticket.placeBuy`:`ticket.placeSell`)}renderSummary(e){let t=Ys(e,this.lastPrice,this.rules),n=t.risk===null?null:this.amount(t.risk),r=t.reward===null?null:this.amount(t.reward),i=[[`value`,`ticket.value`,t.value===null?null:this.money(t.value),null],[`risk`,`ticket.risk`,n,n===null?null:Os(n)],[`reward`,`ticket.reward`,r,r===null?null:Os(r)],[`ratio`,`ticket.rewardRisk`,t.ratio===null?null:this.number(t.ratio,2),null]];this.summaryEl.replaceChildren(...i.filter(([,,e])=>e!==null).map(([e,t,n,r])=>{let i=document.createElement(`div`);i.className=`tcw-ticket-summary-row`,i.dataset.row=e;let a=document.createElement(`span`);a.textContent=this.t(t);let o=document.createElement(`span`);return o.className=`tcw-ticket-figure${r?` tcw-ticket-${r}`:``}`,o.dir=`ltr`,o.textContent=n,i.append(a,o),i}))}number(e,t){return this.callbacks.formatNumber?this.callbacks.formatNumber(e,t):e.toFixed(t)}signedNumber(e,t){return Ds(this.number(Math.abs(e),t),e,this.number(0,t))}amount(e){return Ds(this.money(Math.abs(e)),e,this.money(0))}money(e){return(this.callbacks.formatAmount??this.callbacks.formatPrice)(e)}problemText(e){let n=this.t(`ticket.problem.${e}`),{limits:r,lot:i}=this.rules;return e===`priceLimits`&&r?t.r(n,{floor:this.callbacks.formatPrice(r.floor),ceiling:this.callbacks.formatPrice(r.ceiling)}):e===`lot`?t.r(n,{lot:i??1}):n}};function nc(e,t){return t.dataset.ticketField=e,t}function rc(e){let t=Math.abs(e);return t>0?10**Math.floor(Math.log10(t/100)):1}function ic(e,t){let n=Math.abs(t),r=n>=10||n===0?2:n>=1?4:Math.min(10,Math.ceil(-Math.log10(n))+3);return Number(e.toFixed(r))}var ac=0,oc=class{backdrop;titleEl;input;submit;request=null;returnFocus=null;busy=!1;uid=++ac;constructor(e,n=t.t){this.t=n,this.backdrop=document.createElement(`div`),this.backdrop.className=`tcw-modal-backdrop`,this.backdrop.hidden=!0;let r=!1;this.backdrop.addEventListener(`pointerdown`,e=>{r=e.target===this.backdrop}),this.backdrop.addEventListener(`click`,e=>{e.target===this.backdrop&&r&&this.close(),r=!1});let i=document.createElement(`form`);i.className=`tcw-modal tcw-modal-narrow tcw-name-prompt`,i.noValidate=!0,i.setAttribute(`role`,`dialog`),i.setAttribute(`aria-modal`,`true`),i.setAttribute(`aria-labelledby`,`tcw-name-title-${this.uid}`),i.addEventListener(`keydown`,e=>{if(e.key===`Escape`){e.stopPropagation(),this.close();return}j(e,i)}),i.addEventListener(`submit`,e=>{e.preventDefault(),this.done()});let a=document.createElement(`div`);a.className=`tcw-modal-header`,this.titleEl=document.createElement(`h3`),this.titleEl.id=`tcw-name-title-${this.uid}`;let o=document.createElement(`button`);o.type=`button`,o.className=`tcw-modal-close`,o.setAttribute(`aria-label`,this.t(`common.close`)),o.innerHTML=D(`x`,16),o.addEventListener(`click`,()=>this.close()),a.append(this.titleEl,o);let s=document.createElement(`div`);s.className=`tcw-modal-body`;let c=document.createElement(`label`);c.className=`tcw-name-field`;let l=document.createElement(`span`);l.textContent=this.t(`layouts.name`),this.input=document.createElement(`input`),this.input.type=`text`,this.input.className=`tcw-indi-input`,this.input.maxLength=80,this.input.autocomplete=`off`,this.input.spellcheck=!1,this.input.placeholder=this.t(`layouts.namePlaceholder`),this.input.addEventListener(`input`,()=>this.check()),c.append(l,this.input),s.appendChild(c);let u=document.createElement(`div`);u.className=`tcw-modal-footer`;let d=document.createElement(`button`);d.type=`button`,d.className=`tcw-reset-link`,d.textContent=this.t(`common.cancel`),d.addEventListener(`click`,()=>this.close()),this.submit=document.createElement(`button`),this.submit.type=`submit`,this.submit.className=`tcw-done-btn`,u.append(d,this.submit),i.append(a,s,u),this.backdrop.appendChild(i),e.appendChild(this.backdrop)}open(e){this.isOpen()||(this.returnFocus=document.activeElement instanceof HTMLElement?document.activeElement:null),this.request=e,this.busy=!1,this.titleEl.textContent=e.title,this.submit.textContent=e.submitLabel,this.input.value=e.value??``,this.input.placeholder=e.placeholder??this.t(`layouts.namePlaceholder`),this.check(),this.backdrop.parentElement?.appendChild(this.backdrop),this.backdrop.hidden=!1,this.input.focus(),this.input.select()}close(){this.backdrop.hidden||(this.backdrop.hidden=!0,this.request=null,this.returnFocus?.isConnected&&this.returnFocus.focus(),this.returnFocus=null)}isOpen(){return!this.backdrop.hidden}destroy(){this.close(),this.backdrop.remove()}check(){this.submit.disabled=this.busy||e.r(this.input.value)===null}async done(){let t=this.request,n=e.r(this.input.value);if(!(!t||n===null||this.busy)){this.busy=!0,this.check();try{await t.onSubmit(n),this.request===t&&this.close()}catch{}finally{this.busy=!1,this.check()}}}},sc=0,cc=class{backdrop;search;listEl;layouts=[];confirming=null;returnFocus=null;loadSeq=0;uid=++sc;constructor(e,n,r=t.t){this.callbacks=n,this.t=r,this.backdrop=document.createElement(`div`),this.backdrop.className=`tcw-modal-backdrop`,this.backdrop.hidden=!0;let i=!1;this.backdrop.addEventListener(`pointerdown`,e=>{i=e.target===this.backdrop}),this.backdrop.addEventListener(`click`,e=>{e.target===this.backdrop&&i&&this.close(),i=!1});let a=document.createElement(`div`);a.className=`tcw-modal tcw-layouts-dialog`,a.setAttribute(`role`,`dialog`),a.setAttribute(`aria-modal`,`true`),a.setAttribute(`aria-labelledby`,`tcw-layouts-title-${this.uid}`),a.addEventListener(`keydown`,e=>{if(e.key!==`Escape`){j(e,a);return}e.stopPropagation(),this.confirming?this.setConfirming(null):this.close()});let o=document.createElement(`div`);o.className=`tcw-modal-header`;let s=document.createElement(`h3`);s.id=`tcw-layouts-title-${this.uid}`,s.textContent=this.t(`layouts.dialogTitle`);let c=document.createElement(`button`);c.type=`button`,c.className=`tcw-modal-close`,c.setAttribute(`aria-label`,this.t(`common.close`)),c.innerHTML=D(`x`,16),c.addEventListener(`click`,()=>this.close()),o.append(s,c);let l=document.createElement(`label`);l.className=`tcw-ss-search tcw-layouts-search-row`,l.innerHTML=D(`search`,16),this.search=document.createElement(`input`),this.search.type=`search`,this.search.className=`tcw-layouts-search`,this.search.placeholder=this.t(`layouts.search`),this.search.setAttribute(`aria-label`,this.t(`layouts.search`)),this.search.autocomplete=`off`,this.search.addEventListener(`input`,()=>this.render()),l.appendChild(this.search),this.listEl=document.createElement(`div`),this.listEl.className=`tcw-layouts-list`,this.listEl.setAttribute(`role`,`list`);let u=document.createElement(`div`);u.className=`tcw-layouts-body`,u.appendChild(this.listEl),a.append(o,l,u),this.backdrop.appendChild(a),e.appendChild(this.backdrop)}async open(){this.isOpen()||(this.returnFocus=document.activeElement instanceof HTMLElement?document.activeElement:null),this.search.value=``,this.confirming=null,this.backdrop.hidden=!1,this.search.focus(),await this.refresh()}async refresh(){let e=++this.loadSeq,t;try{t=await this.callbacks.list()}catch{t=[]}e===this.loadSeq&&(this.layouts=t,this.render())}close(){this.backdrop.hidden||(this.backdrop.hidden=!0,this.confirming=null,this.returnFocus?.isConnected&&this.returnFocus.focus(),this.returnFocus=null)}isOpen(){return!this.backdrop.hidden}destroy(){this.close(),this.backdrop.remove()}shown(){let e=this.search.value.trim().toLowerCase();return e?this.layouts.filter(t=>t.name.toLowerCase().includes(e)||(t.symbol??``).toLowerCase().includes(e)):this.layouts}render(){let e=this.shown();if(e.length===0){let e=document.createElement(`p`);e.className=`tcw-account-empty`,e.textContent=this.t(this.layouts.length===0?`layouts.empty`:`layouts.noMatch`),this.listEl.replaceChildren(e);return}let t=this.callbacks.currentId();this.listEl.replaceChildren(...e.map(e=>this.row(e,e.id===t)))}row(e,n){let r=document.createElement(`div`);r.className=`tcw-layouts-row`,r.setAttribute(`role`,`listitem`),r.dataset.id=e.id;let i=document.createElement(`button`);i.type=`button`,i.className=`tcw-layouts-open`,n&&i.setAttribute(`aria-current`,`true`);let a=document.createElement(`span`);a.className=`tcw-layouts-name`,a.textContent=e.name;let o=document.createElement(`span`);if(o.className=`tcw-layouts-meta`,o.textContent=[[e.symbol,e.timeframe].filter(Boolean).join(` · `),t.r(this.t(`layouts.updated`),{time:this.callbacks.formatTime(e.updatedAt)})].filter(Boolean).join(` — `),i.append(a,o),n){let e=document.createElement(`span`);e.className=`tcw-layouts-check`,e.innerHTML=D(`check`,14);let t=document.createElement(`span`);t.className=`tcw-visually-hidden`,t.textContent=this.t(`layouts.current`),i.prepend(e),i.appendChild(t)}i.addEventListener(`click`,()=>{this.callbacks.onOpen(e.id),this.close()});let s=document.createElement(`div`);if(s.className=`tcw-account-actions`,this.confirming===e.id){let n=document.createElement(`button`);n.type=`button`,n.className=`tcw-layouts-confirm`,n.textContent=this.t(`layouts.deleteConfirm`),n.setAttribute(`aria-label`,t.r(this.t(`layouts.deleteNamed`),{name:e.name})),n.addEventListener(`click`,()=>void this.remove(e.id));let r=this.iconButton(`x`,this.t(`common.cancel`),()=>this.setConfirming(null));s.append(n,r)}else s.append(this.iconButton(`penLine`,t.r(this.t(`layouts.renameNamed`),{name:e.name}),()=>this.callbacks.onRename(e)),this.iconButton(`trash`,t.r(this.t(`layouts.deleteNamed`),{name:e.name}),()=>this.setConfirming(e.id),!0));return r.append(i,s),r}iconButton(e,t,n,r=!1){let i=document.createElement(`button`);return i.type=`button`,i.className=`tcw-tree-btn${r?` tcw-tree-del`:``}`,i.setAttribute(`aria-label`,t),i.title=t,i.innerHTML=D(e,14),i.addEventListener(`click`,n),i}setConfirming(e){let t=this.confirming;this.confirming=e,this.render();let n=e??t;n&&[...this.listEl.querySelectorAll(`.tcw-layouts-row`)].find(e=>e.dataset.id===n)?.querySelector(e?`.tcw-layouts-confirm`:`.tcw-tree-del`)?.focus()}async remove(e){try{await this.callbacks.onDelete(e)}finally{this.confirming=null,await this.refresh(),this.isOpen()&&this.search.focus()}}},lc=5,uc=class{menu;prompt;dialog;destroyed=!1;constructor(e,t){this.session=e,this.host=t;let{root:n,t:r}=t;this.menu=new k(n,r(`toolbar.layouts`)),this.prompt=new oc(n,r),this.dialog=new cc(n,{list:()=>e.list(),currentId:()=>e.current()?.id??null,onOpen:e=>void this.open(e),onRename:e=>this.promptRename(e),onDelete:async t=>{try{await e.remove(t)}catch{this.host.toast(r(`layouts.deleteFailed`),`error`)}},formatTime:t.formatTime},r)}async save(){if(this.prompt.isOpen())return;if(!this.session.current()){this.promptSaveAs();return}let{t:e,toast:n}=this.host;try{let r=await this.session.save();r&&n(t.r(e(`layouts.saved`),{name:r.name}))}catch{n(e(`layouts.saveFailed`),`error`)}}async open(e){try{if(await this.session.open(e))return!0}catch{}return this.destroyed||this.host.toast(this.host.t(`layouts.openFailed`),`error`),!1}promptSaveAs(){let{t:e,toast:n}=this.host,r=this.session.current();this.prompt.open({title:e(`layouts.saveAsTitle`),value:r?t.r(e(`layouts.copyName`),{name:r.name}):``,submitLabel:e(`common.save`),onSubmit:async r=>{try{let i=await this.session.saveAs(r);n(t.r(e(`layouts.saved`),{name:i.name}))}catch(t){throw n(e(`layouts.saveFailed`),`error`),t}}})}promptRename(e=this.session.current()){if(!e)return;let{t,toast:n}=this.host;this.prompt.open({title:t(`layouts.renameTitle`),value:e.name,submitLabel:t(`layouts.renameSubmit`),onSubmit:async r=>{try{await this.session.rename(e.id,r)}catch(e){throw n(t(`layouts.saveFailed`),`error`),e}this.dialog.isOpen()&&this.dialog.refresh()}})}openDialog(){return this.dialog.open()}async openMenu(e){if(this.menu.isOpen()){this.menu.close();return}let{session:t}=this,{t:n}=this.host,r=[];try{r=(await t.list()).slice(0,lc)}catch{}if(this.destroyed)return;let i=t.current(),a=[{id:`save`,label:n(`layouts.save`),icon:`save`,shortcut:this.host.saveKeys?.()},{id:`saveAs`,label:n(`layouts.saveAs`),icon:`plus`}];i&&a.push({id:`rename`,label:n(`layouts.rename`),icon:`penLine`}),a.push({id:`autoSave`,label:n(`layouts.autoSave`),checked:t.isAutoSave()}),r.length>0&&a.push(`separator`,...r.map(e=>({id:`open:${e.id}`,label:e.name,checked:e.id===i?.id}))),a.push(`separator`,{id:`manage`,label:n(`layouts.open`),icon:`folder`}),this.menu.openUnder(a,e,e=>{e===`save`?this.save():e===`saveAs`?this.promptSaveAs():e===`rename`?this.promptRename():e===`autoSave`?t.setAutoSave(!t.isAutoSave()):e===`manage`?this.openDialog():e.startsWith(`open:`)&&this.open(e.slice(5))})}destroy(){this.destroyed=!0,this.menu.destroy(),this.prompt.destroy(),this.dialog.destroy()}},dc=0,fc=class{el;input;hint;returnFocus=null;constructor(e,t,n){this.labels=t,this.onApply=n,this.el=document.createElement(`div`),this.el.className=`tcw-interval-input`,this.el.hidden=!0,this.el.setAttribute(`role`,`dialog`),this.el.setAttribute(`aria-label`,t.title),this.input=document.createElement(`input`),this.input.type=`text`,this.input.className=`tcw-interval-field`,this.input.autocomplete=`off`,this.input.spellcheck=!1,this.input.maxLength=6,this.input.setAttribute(`aria-label`,t.title),this.hint=document.createElement(`div`),this.hint.className=`tcw-interval-hint`,this.hint.setAttribute(`role`,`status`),this.hint.id=`tcw-interval-hint-${++dc}`,this.input.setAttribute(`aria-describedby`,this.hint.id),this.el.append(this.input,this.hint),e.appendChild(this.el),this.input.addEventListener(`input`,()=>this.check()),this.input.addEventListener(`keydown`,e=>{e.key===`Enter`?(e.preventDefault(),e.stopPropagation(),this.apply()):e.key===`Escape`&&(e.preventDefault(),e.stopPropagation(),this.close())}),this.input.addEventListener(`blur`,()=>this.close(!1))}open(e){this.isOpen()||(this.returnFocus=document.activeElement instanceof HTMLElement?document.activeElement:null),this.el.hidden=!1,this.input.value=e,this.check(),this.input.focus(),this.input.setSelectionRange(e.length,e.length)}close(e=!0){if(this.el.hidden)return;this.el.hidden=!0;let t=this.returnFocus;this.returnFocus=null,e&&t?.isConnected&&t.focus({preventScroll:!0})}isOpen(){return!this.el.hidden}destroy(){this.el.remove()}check(){let e=Mt(this.input.value)!==null;!e&&this.input.value.trim()!==``?this.input.setAttribute(`aria-invalid`,`true`):this.input.removeAttribute(`aria-invalid`),this.hint.textContent=e||this.input.value.trim()===``?this.labels.hint:this.labels.invalid}apply(){let e=Mt(this.input.value);if(e&&this.onApply(e)){this.close();return}this.input.setAttribute(`aria-invalid`,`true`),this.hint.textContent=this.labels.invalid}},pc=class{constructor(e=`tcw:indicator-templates`){this.key=e}list(){let e;try{e=JSON.parse(localStorage.getItem(this.key)??`[]`)}catch{return[]}if(!Array.isArray(e))return[];let t=[];for(let n of e){if(typeof n!=`object`||!n)continue;let{name:e,indicators:i}=n;if(typeof e!=`string`||!e.trim()||!Array.isArray(i))continue;let a=r.ChartStateManager.deserialize(JSON.stringify({version:2,indicators:i})).indicators;a.length>0&&t.push({name:e.slice(0,60),indicators:a})}return t.sort((e,t)=>e.name.localeCompare(t.name))}get(e){return this.list().find(t=>t.name===e)??null}save(e,t){let n=e.replace(/\s+/g,` `).trim().slice(0,60);if(!n)throw Error(`A template needs a name`);let r=[...this.list().filter(e=>e.name!==n),{name:n,indicators:[...t]}];localStorage.setItem(this.key,JSON.stringify(r))}remove(e){try{localStorage.setItem(this.key,JSON.stringify(this.list().filter(t=>t.name!==e)))}catch{}}},J=[],mc=new Map,hc=null,gc=e=>{let t=e.target instanceof Node?e.target:null;t!==null&&J.some(e=>e.contains(t)||mc.get(e)?.some(e=>e.contains(t)))||(hc=null)};function _c(e,t=[]){let n=()=>{hc=e},r=[e,...t];for(let e of r)e.addEventListener(`pointerdown`,n,!0);return J.length===0&&document.addEventListener(`pointerdown`,gc,!0),J.push(e),mc.set(e,t),()=>{for(let e of r)e.removeEventListener(`pointerdown`,n,!0);let t=J.indexOf(e);t>=0&&J.splice(t,1),mc.delete(e),J.length===0&&document.removeEventListener(`pointerdown`,gc,!0),hc===e&&(hc=null)}}function Y(e,t=!1){let n=hc?.isConnected?hc:null;if(!n){let e=document.activeElement;n=e?J.find(t=>t.contains(e))??null:null}return!n&&!t&&(n=J.find(e=>e.isConnected)??null),n!==null&&e.contains(n)}function X(){let e=document.activeElement;return!!e&&(e.tagName===`INPUT`||e.tagName===`TEXTAREA`||e.tagName===`SELECT`||e.isContentEditable)}var vc=[`regular`,`logarithmic`,`percentage`,`indexedTo100`],yc=e=>typeof e==`object`&&!!e&&!Array.isArray(e);function bc(e){let{theme:t,timestamp:n,...r}=e;return r}function xc(e){return!yc(e)||e.v!==1||typeof e.symbol!=`string`||!e.symbol||typeof e.timeframe!=`string`||!((0,n.isTimeFrame)(e.timeframe)||(0,n.tickBarCount)(e.timeframe)!==null)?null:{v:1,symbol:e.symbol,timeframe:e.timeframe,scaleMode:vc.find(t=>t===e.scaleMode)??`regular`,invertScale:e.invertScale===!0,chart:yc(e.chart)?bc(e.chart):null,...yc(e.settings)?{settings:G(e.settings,$a)}:{}}}function Sc(e){try{return JSON.parse(e)}catch{return null}}function Cc(){try{return typeof localStorage<`u`?localStorage:null}catch{return null}}var wc=class{favorites=[];constructor(e=`tcw:draw-favorites`,t=Cc()){this.storageKey=e,this.storage=t,this.load()}list(){return[...this.favorites]}has(e){return this.favorites.includes(e)}add(e){!e||this.favorites.includes(e)||(this.favorites=[...this.favorites,e],this.persist())}remove(e){this.favorites.includes(e)&&(this.favorites=this.favorites.filter(t=>t!==e),this.persist())}toggle(e){return this.has(e)?(this.remove(e),!1):(this.add(e),!0)}seedDefaults(e){this.favorites.length>0||(this.favorites=[...new Set(e.filter(Boolean))],this.persist())}load(){if(this.storage)try{let e=this.storage.getItem(this.storageKey);if(!e)return;let t=JSON.parse(e);Array.isArray(t)&&(this.favorites=[...new Set(t.filter(e=>typeof e==`string`))])}catch{}}persist(){if(this.storage)try{this.storage.setItem(this.storageKey,JSON.stringify(this.favorites))}catch{}}};function Tc(e){let t=typeof window<`u`?window.visualViewport:null;if(!t)return()=>{};let n=-1,r=()=>{let r=(t.scale??1)>1.01?0:Math.max(0,Math.round(window.innerHeight-t.height-t.offsetTop));if(r!==n){n=r;for(let t of e)t.style.setProperty(`--tcw-keyboard-inset`,`${r}px`)}};return r(),t.addEventListener(`resize`,r),t.addEventListener(`scroll`,r),()=>{t.removeEventListener(`resize`,r),t.removeEventListener(`scroll`,r)}}function Ec(e,t){let n=null,r=()=>{let r=e.clientWidth;if(r===0&&n!==null)return;let i=r<641;i!==n&&(n=i,e.toggleAttribute(`data-tcw-narrow`,i),t?.(i))};if(r(),typeof ResizeObserver>`u`)return()=>{};let i=new ResizeObserver(r);return i.observe(e),()=>i.disconnect()}var Dc=/^(\d{4})-(\d{2})-(\d{2})$/,Oc=/^(\d{2}):(\d{2})$/;function kc(e,t,r){let i=Dc.exec(e),a=t?Oc.exec(t):[``,`00`,`00`];if(!i||!a)return null;let[o,s,c,l,u]=[+i[1],+i[2],+i[3],+a[1],+a[2]];if(s<1||s>12||c<1||c>31||l>23||u>59)return null;let d=Date.UTC(o,s-1,c,l,u);return new Date(d).getUTCDate()===c?(0,n.wallToUtc)(d,r):null}function Z(e,t){let r=e=>String(e).padStart(2,`0`),i=(0,n.timeParts)(e,t);return{date:`${i.year}-${r(i.month)}-${r(i.day)}`,time:`${r(i.hours)}:${r(i.minutes)}`}}var Q=[`date`,`range`],Ac=1,jc=class{backdrop=null;fieldsEl=null;tabButtons=[];month=null;active=null;values={date:``,time:``,fromDate:``,fromTime:``,toDate:``,toTime:``};start=null;tab=`date`;returnFocus=null;uid=Ac++;constructor(e,t,n,r){this.layer=e,this.labels=t,this.locale=n,this.onSubmit=r}isOpen(){return this.backdrop!==null}open(e){this.close(!1),this.returnFocus=document.activeElement instanceof HTMLElement?document.activeElement:null,this.start=e,this.values={date:e.date.date,time:e.date.time,fromDate:e.range.from.date,fromTime:e.range.from.time,toDate:e.range.to.date,toTime:e.range.to.time},this.build(),this.renderTab(!0)}close(e=!0){if(!this.backdrop)return;this.backdrop.remove(),this.backdrop=this.fieldsEl=this.month=this.active=this.start=null,this.tabButtons=[];let t=this.returnFocus;this.returnFocus=null,e&&t?.isConnected&&t.focus()}destroy(){this.close(!1)}build(){let e=this.labels(),t=document.createElement(`div`);t.className=`tcw-modal-backdrop`;let n=!1;t.addEventListener(`pointerdown`,e=>{n=e.target===t}),t.addEventListener(`click`,e=>{e.target===t&&n&&this.close(),n=!1});let r=document.createElement(`div`);r.className=`tcw-modal tcw-goto`,E(r,`goToDate`),r.setAttribute(`role`,`dialog`),r.setAttribute(`aria-modal`,`true`),r.setAttribute(`aria-labelledby`,`tcw-goto-title-${this.uid}`),r.tabIndex=-1,r.addEventListener(`keydown`,e=>{if(e.stopPropagation(),e.key===`Escape`){e.preventDefault(),this.close();return}j(e,r)});let i=document.createElement(`div`);i.className=`tcw-modal-header`;let a=document.createElement(`h3`);a.id=`tcw-goto-title-${this.uid}`,a.textContent=e.title;let o=document.createElement(`button`);o.type=`button`,o.className=`tcw-modal-close`,o.setAttribute(`aria-label`,e.close),o.innerHTML=D(`x`,16),o.addEventListener(`click`,()=>this.close()),i.append(a,o);let s=document.createElement(`form`);s.className=`tcw-goto-form`,s.noValidate=!0,s.addEventListener(`submit`,e=>{e.preventDefault(),this.submit()});let c=document.createElement(`div`);c.className=`tcw-goto-fields`,c.id=`tcw-goto-panel-${this.uid}`,c.setAttribute(`role`,`tabpanel`);let l=new se(e.calendar,this.locale(),e=>this.pickDay(e));l.element.classList.add(`tcw-goto-calendar`),s.append(c,l.element,this.buildFooter(e)),r.append(i,this.buildTabs(e),s),t.appendChild(r),this.layer().appendChild(t),this.backdrop=t,this.fieldsEl=c,this.month=l}buildTabs(e){let t=document.createElement(`div`);return t.className=`tcw-modal-tabs`,t.setAttribute(`role`,`tablist`),t.addEventListener(`keydown`,e=>this.onTabKey(e)),this.tabButtons=Q.map(t=>{let n=document.createElement(`button`);return n.type=`button`,n.className=`tcw-modal-tab`,n.id=`tcw-goto-tab-${this.uid}-${t}`,n.dataset.tab=t,n.setAttribute(`role`,`tab`),n.setAttribute(`aria-controls`,`tcw-goto-panel-${this.uid}`),n.textContent=t===`date`?e.date:e.range,n.addEventListener(`click`,()=>this.select(t,!1)),n}),t.append(...this.tabButtons),t}buildFooter(e){let t=document.createElement(`button`);t.type=`button`,t.className=`tcw-footer-cancel`,t.dataset.act=`cancel`,t.textContent=e.cancel,t.addEventListener(`click`,()=>this.close());let n=document.createElement(`button`);n.type=`submit`,n.className=`tcw-done-btn`,n.dataset.act=`go`,n.textContent=e.submit;let r=document.createElement(`div`);r.className=`tcw-footer-end`,r.append(t,n);let i=document.createElement(`div`);return i.className=`tcw-modal-footer`,i.appendChild(r),i}select(e,t){this.tab=e,this.renderTab(!t),t&&this.tabButtons.find(t=>t.dataset.tab===e)?.focus()}renderTab(e){let t=this.fieldsEl,n=this.start;if(!t||!n)return;for(let e of this.tabButtons){let t=e.dataset.tab===this.tab;e.setAttribute(`aria-selected`,String(t)),e.classList.toggle(`tcw-active`,t),e.tabIndex=t?0:-1}t.setAttribute(`aria-labelledby`,`tcw-goto-tab-${this.uid}-${this.tab}`);let r=this.labels();t.replaceChildren(...this.tab===`date`?[this.row(null,`date`,`time`,r)]:[this.row(r.from,`fromDate`,`fromTime`,r),this.row(r.to,`toDate`,`toTime`,r)]);let i=t.querySelector(`input[type="date"]`);this.setActive(i),e&&i?.focus()}row(e,t,n,r){let i=document.createElement(`div`);if(i.className=`tcw-goto-row`,e){let t=document.createElement(`span`);t.className=`tcw-goto-label`,t.textContent=e,i.appendChild(t)}let a=e?`${e} · `:``,o=this.input(`date`,t,`${a}${r.date}`);return o.required=!0,o.dataset.tcwCalendar=`inline`,this.start?.max&&(o.max=this.start.max),o.addEventListener(`focus`,()=>this.setActive(o)),o.addEventListener(`input`,()=>{o.removeAttribute(`aria-invalid`),this.active===o&&this.showMonth()}),i.appendChild(o),this.start?.withTime&&i.appendChild(this.input(`time`,n,`${a}${r.time}`)),i}input(e,t,n){let r=document.createElement(`input`);return r.type=e,r.className=`tcw-goto-input`,r.dataset.field=t,r.value=this.values[t],r.setAttribute(`aria-label`,n),r.addEventListener(`input`,()=>{this.values[t]=r.value}),r}setActive(e){this.active=e,this.showMonth()}showMonth(){this.active&&this.month?.show(this.active.value,{max:this.start?.max,today:this.start?.today})}pickDay(e){let t=this.active;if(!t)return;let n=this.month?.element.contains(document.activeElement)??!1;t.value=e,t.dispatchEvent(new Event(`input`,{bubbles:!0})),t.dispatchEvent(new Event(`change`,{bubbles:!0}));let r=t.dataset.field===`fromDate`?this.fieldsEl?.querySelector(`[data-field="toDate"]`):null;if(r){r.focus(),this.setActive(r);return}this.showMonth(),n&&this.month?.focusGrid()}submit(){let e=[...this.fieldsEl?.querySelectorAll(`[data-field]`)??[]];for(let t of e)this.values[t.dataset.field]=t.value;let t=this.start?.max,n=e.find(e=>e.type===`date`&&(!e.value||t!==void 0&&e.value>t));if(n){n.setAttribute(`aria-invalid`,`true`),n.focus();return}let r=this.values,i=this.start?.withTime??!1,a=e=>i?e:``,o;if(this.tab===`date`){if(!r.date)return;o={kind:`date`,date:r.date,time:a(r.time)}}else{if(!r.fromDate||!r.toDate)return;o={kind:`range`,from:{date:r.fromDate,time:a(r.fromTime)},to:{date:r.toDate,time:a(r.toTime)}}}this.close(),this.onSubmit(o)}onTabKey(e){let t=Q.indexOf(this.tab),[n,r]=this.backdrop?.closest(`[dir]`)?.getAttribute(`dir`)===`rtl`?[`ArrowLeft`,`ArrowRight`]:[`ArrowRight`,`ArrowLeft`],i=e.key===n?(t+1)%Q.length:e.key===r?(t-1+Q.length)%Q.length:e.key===`Home`?0:e.key===`End`?Q.length-1:-1;i<0||(e.preventDefault(),this.select(Q[i],!0))}},$={min:233,default:296,max:377},Mc=.382,Nc=e=>!e.hidden&&getComputedStyle(e).display!==`none`,Pc=class{element;panel;rail;handle;pages=new Map;open_=null;width;drag=null;observer=null;onMove=e=>{!this.drag||!this.samePointer(e)||this.setWidth(this.drag.width+(this.drag.x-e.clientX)*this.drag.dir)};onUp=e=>{!this.drag||!this.samePointer(e)||(this.drag=null,this.stopDrag(),this.options.saveWidth?.(this.width))};constructor(e,t){this.options=t;let n=document.createElement(`div`);n.className=`tcw-dock`;let r=document.createElement(`div`);r.className=`tcw-dock-panel`,r.hidden=!0,r.addEventListener(`keydown`,e=>this.onPanelKey(e));let i=document.createElement(`div`);i.className=`tcw-dock-resize`,i.setAttribute(`role`,`separator`),i.setAttribute(`aria-orientation`,`vertical`),i.setAttribute(`aria-label`,t.labels.resize),i.setAttribute(`aria-valuemin`,String($.min)),i.tabIndex=0,i.addEventListener(`pointerdown`,e=>this.startDrag(e)),i.addEventListener(`keydown`,e=>this.onHandleKey(e)),r.appendChild(i);let a=document.createElement(`div`);a.className=`tcw-dock-rail`,a.setAttribute(`role`,`toolbar`),a.setAttribute(`aria-orientation`,`vertical`),a.setAttribute(`aria-label`,t.labels.rail),E(a,`dock`),a.addEventListener(`keydown`,e=>this.onRailKey(e)),n.append(r,a),e.appendChild(n),this.element=n,this.panel=r,this.rail=a,this.handle=i,this.width=this.clamp(t.savedWidth?.()??$.default,$.max),this.applyWidth(),t.room&&typeof ResizeObserver<`u`&&(this.observer=new ResizeObserver(()=>this.fit()),this.observer.observe(e))}addPage(e){let t=document.createElement(`button`);t.type=`button`,t.className=`tcw-dock-btn`,t.dataset.page=e.id,t.title=e.label,t.setAttribute(`aria-label`,e.label),t.setAttribute(`aria-pressed`,`false`),t.tabIndex=-1,t.innerHTML=D(e.icon,18),e.parts?.length&&E(t,...e.parts),t.addEventListener(`click`,()=>{this.toggle(e.id)}),t.addEventListener(`focus`,()=>this.rove(t)),this.rail.appendChild(t),e.element.hidden=!0,e.element.classList.add(`tcw-dock-page`),this.panel.appendChild(e.element),this.pages.set(e.id,{page:e,button:t}),this.syncRail()}open(e){let t=this.pages.get(e);!t||this.open_===e||(this.hideCurrent(),this.open_=e,this.panel.hidden=!1,t.page.element.hidden=!1,t.button.setAttribute(`aria-pressed`,`true`),this.fit(),t.page.onShow?.(),this.options.onChange?.(e))}close(){let e=this.open_;if(e===null)return;let t=this.panel.contains(document.activeElement);if(this.hideCurrent(),this.panel.hidden=!0,t){let t=this.pages.get(e)?.button;(t&&(this.options.railShown?.()??!0)&&Nc(t)?t:this.options.focusAfterClose?.(e))?.focus()}this.options.onChange?.(null)}toggle(e){this.open_===e?this.close():this.open(e)}closePage(e){this.open_===e&&this.close()}current(){return this.open_}isOpen(e){return this.open_===e}syncRail(){let e=[...this.pages.values()].map(e=>e.button),t=e.filter(Nc),n=e.find(e=>e.tabIndex===0);if(n&&t.includes(n))return;let r=t.find(e=>e.getAttribute(`aria-pressed`)===`true`)??t[0];for(let t of e)t.tabIndex=t===r?0:-1}fit(){this.applyWidth()}destroy(){this.drag=null,this.stopDrag(),this.observer?.disconnect(),this.element.remove()}hideCurrent(){let e=this.open_===null?null:this.pages.get(this.open_);this.open_=null,e&&(e.page.element.hidden=!0,e.button.setAttribute(`aria-pressed`,`false`),e.page.onHide?.())}maxNow(){let e=this.options.room?.()??0;return e<=0?$.max:Math.max($.min,Math.min($.max,Math.floor(e*Mc)))}clamp(e,t=this.maxNow()){return Math.round(Math.min(t,Math.max($.min,e)))}shownWidth(){return this.clamp(this.width)}setWidth(e){this.width=this.clamp(e),this.applyWidth()}applyWidth(){let e=this.shownWidth();this.element.style.setProperty(`--tcw-dock-w`,`${e}px`),this.handle.setAttribute(`aria-valuemax`,String(this.maxNow())),this.handle.setAttribute(`aria-valuenow`,String(e))}samePointer(e){let t=e.pointerId;return this.drag?.pointer===void 0||t===void 0||t===this.drag.pointer}startDrag(e){if(e.button!==0)return;e.preventDefault();let t=getComputedStyle(this.element).direction===`rtl`||this.element.closest(`[dir]`)?.getAttribute(`dir`)===`rtl`;this.drag={x:e.clientX,width:this.shownWidth(),dir:t?-1:1,pointer:e.pointerId},document.addEventListener(`pointermove`,this.onMove),document.addEventListener(`pointerup`,this.onUp),document.addEventListener(`pointercancel`,this.onUp)}stopDrag(){document.removeEventListener(`pointermove`,this.onMove),document.removeEventListener(`pointerup`,this.onUp),document.removeEventListener(`pointercancel`,this.onUp)}onHandleKey(e){let[t,n]=this.element.closest(`[dir]`)?.getAttribute(`dir`)===`rtl`?[`ArrowRight`,`ArrowLeft`]:[`ArrowLeft`,`ArrowRight`],r=this.shownWidth(),i=e.key===t?r+13:e.key===n?r-13:e.key===`Home`?$.min:e.key===`End`?$.max:null;i!==null&&(e.preventDefault(),this.setWidth(i),this.options.saveWidth?.(this.width))}onPanelKey(e){e.key!==`Escape`||e.defaultPrevented||!this.element.closest(`[data-tcw-narrow]`)||(e.preventDefault(),e.stopPropagation(),this.close())}rove(e){for(let{button:t}of this.pages.values())t.tabIndex=t===e?0:-1}onRailKey(e){let t=[...this.pages.values()].map(e=>e.button).filter(Nc),n=t.indexOf(e.target);if(n<0)return;let r=e.key===`ArrowDown`?(n+1)%t.length:e.key===`ArrowUp`?(n-1+t.length)%t.length:e.key===`Home`?0:e.key===`End`?t.length-1:-1;r<0||(e.preventDefault(),t[r].focus())}},Fc=[`percent`,`scale`,`pane`,`spread`,`ratio`,`correlation`,`correlationLog`],Ic={percent:`compare.percent`,scale:`compare.ownScale`,pane:`compare.ownPane`,spread:`compare.way.spread`,ratio:`compare.way.ratio`,correlation:`compare.way.correlation`,correlationLog:`compare.way.correlationLog`};function Lc(e){return Fc.includes(e)}function Rc(e){return Fc.map(t=>({id:t,label:e(Ic[t])}))}function zc(e,t){let n=e.findIndex(e=>e.time>=t);return n<0?e.length:n}function Bc(e,t){let n=e[0]?.time??1/0,r=t.filter(e=>e.time<n);return r.length>0?[...r,...e]:null}function Vc(e,t){switch(e.id){case`compareSymbol`:return t?`pane`:`scale`;case`spread`:return e.params.mode===`ratio`?`ratio`:`spread`;case`correlation`:return`correlation`;case`correlationlog`:return`correlationLog`;default:return null}}function Hc(e,t,n,r){let i=e.map(e=>({id:e.id,symbol:e.symbol,way:r(Ic.percent),color:e.color}));for(let e of t){let t=e.params.symbol,a=Vc(e,n.has(e.instanceId));!a||typeof t!=`string`||!t||i.push({id:e.instanceId,symbol:t,way:r(Ic[a])})}return i}var Uc=8,Wc=4,Gc=3,Kc=`[title]:not([title=""]), [data-tip]:not([data-tip=""])`,qc=class{el;target=null;source=null;pressed=null;showTimer=null;watchFrame=0;warmUntil=0;observer;constructor(e){this.root=e,this.el=document.createElement(`div`),this.el.className=`tcw-tooltip`,this.el.setAttribute(`aria-hidden`,`true`),e.appendChild(this.el),e.addEventListener(`pointerover`,this.onOver),e.addEventListener(`pointerout`,this.onOut),e.addEventListener(`pointerdown`,this.onPress,!0),e.addEventListener(`keydown`,this.onPress,!0),e.addEventListener(`focusin`,this.onFocus),e.addEventListener(`focusout`,this.onBlur),e.addEventListener(`wheel`,this.hide,{passive:!0}),this.observer=new MutationObserver(()=>{this.pressed?.hasAttribute(`title`)&&Jc(this.pressed);let e=this.target;!e||this.source!==`pointer`||!e.hasAttribute(`title`)||(Jc(e),this.isVisible()&&this.show(e))}),this.observer.observe(e,{subtree:!0,attributes:!0,attributeFilter:[`title`]})}destroy(){this.hide(),this.pressed&&Yc(this.pressed),this.observer.disconnect(),this.root.removeEventListener(`pointerover`,this.onOver),this.root.removeEventListener(`pointerout`,this.onOut),this.root.removeEventListener(`pointerdown`,this.onPress,!0),this.root.removeEventListener(`keydown`,this.onPress,!0),this.root.removeEventListener(`focusin`,this.onFocus),this.root.removeEventListener(`focusout`,this.onBlur),this.root.removeEventListener(`wheel`,this.hide),this.el.remove()}onOver=e=>{if(e.pointerType===`touch`)return;let t=this.tipTarget(e.target);!t||t===this.pressed||t===this.target&&this.source===`pointer`||(Jc(t),this.schedule(t,`pointer`,Date.now()<this.warmUntil||this.isVisible()))};onOut=e=>{let t=e.relatedTarget,n=e=>!!e&&!!t&&e.contains(t);this.pressed&&!n(this.pressed)&&(Yc(this.pressed),this.pressed=null),this.source===`pointer`&&!n(this.target)&&this.hide()};onPress=()=>{let e=this.target,t=this.source===`pointer`;this.warmUntil=0,this.clearTimer(),cancelAnimationFrame(this.watchFrame),this.el.classList.remove(`tcw-tooltip--visible`),this.target=null,this.source=null,this.pressed&&this.pressed!==e&&Yc(this.pressed),this.pressed=t?e:null};onFocus=e=>{let t=this.tipTarget(e.target);!t||!Qc(t)||t===this.pressed||this.schedule(t,`focus`,!0)};onBlur=e=>{if(this.source!==`focus`)return;let t=e.relatedTarget;this.target&&t&&this.target.contains(t)||this.hide()};hide=()=>{this.clearTimer(),cancelAnimationFrame(this.watchFrame),this.isVisible()&&(this.warmUntil=Date.now()+500),this.el.classList.remove(`tcw-tooltip--visible`),this.target&&this.source===`pointer`&&Yc(this.target),this.target=null,this.source=null};tipTarget(e){if(!(e instanceof Element))return null;let t=e.closest(Kc);return t&&t!==this.el&&this.root.contains(t)?t:null}schedule(e,t,n){let r=this.target;if(this.clearTimer(),cancelAnimationFrame(this.watchFrame),r&&r!==e&&this.source===`pointer`&&Yc(r),this.target=e,this.source=t,n){this.show(e);return}this.el.classList.remove(`tcw-tooltip--visible`),this.showTimer=setTimeout(()=>{this.showTimer=null,this.target===e&&this.show(e)},300)}show(e){if(!Zc(e)){this.hide();return}this.el.textContent=Xc(e),this.place(e),this.el.classList.add(`tcw-tooltip--visible`),this.watch(e)}watch(e){cancelAnimationFrame(this.watchFrame),this.watchFrame=requestAnimationFrame(()=>{this.target===e&&(Zc(e)?this.watch(e):this.hide())})}place(e){let t=this.root.getBoundingClientRect(),n=e.getBoundingClientRect(),r=this.el.offsetWidth,i=this.el.offsetHeight,a=n.left-t.left,o=n.top-t.top,s=$c(e);s===`bottom`&&o+n.height+Uc+i>t.height?s=`top`:s===`top`&&o-Uc-i<0?s=`bottom`:s===`right`&&a+n.width+Uc+r>t.width&&(s=`left`);let c,l;s===`top`||s===`bottom`?(c=a+n.width/2-r/2,l=s===`bottom`?o+n.height+Uc:o-Uc-i):(c=s===`right`?a+n.width+Uc:a-Uc-r,l=o+n.height/2-i/2),c=Math.max(Wc,Math.min(t.width-r-Wc,c)),l=Math.max(Wc,Math.min(t.height-i-Wc,l)),this.el.style.left=`${Math.round(c)}px`,this.el.style.top=`${Math.round(l)}px`;let u={top:[0,Gc],bottom:[0,-Gc],left:[Gc,0],right:[-Gc,0]}[s];this.el.style.setProperty(`--tcw-tip-dx`,`${u[0]}px`),this.el.style.setProperty(`--tcw-tip-dy`,`${u[1]}px`),this.el.dataset.side=s}isVisible(){return this.el.classList.contains(`tcw-tooltip--visible`)}clearTimer(){this.showTimer!==null&&(clearTimeout(this.showTimer),this.showTimer=null)}};function Jc(e){let t=e.getAttribute(`title`);t!==null&&(e.dataset.tip=t,e.removeAttribute(`title`))}function Yc(e){e.dataset.tip!==void 0&&!e.hasAttribute(`title`)&&(e.setAttribute(`title`,e.dataset.tip),delete e.dataset.tip)}function Xc(e){return e.dataset.tip??e.getAttribute(`title`)??``}function Zc(e){return e.isConnected&&e.getClientRects().length>0&&!e.disabled}function Qc(e){try{return e.matches(`:focus-visible`)}catch{return!1}}function $c(e){return e.dataset.tipSide||(e.closest(`.tcw-sidebar`)?`right`:e.closest(`.tcw-statusbar, .tcw-replay-bar`)?`top`:`bottom`)}var el=2,tl=1.5,nl=`tcw-ind-legend-values--no-room`,rl=0,il=class{stack;toggle;rows=new Map;panes=new Map;collapsed=!1;toggleKey=``;stackKey=``;valuesObserver;constructor(e,t,n){this.host=e,this.callbacks=t,this.labels=n,this.stack=document.createElement(`div`),this.stack.className=`tcw-ind-legend`,E(this.stack,`indicatorLegend`),this.toggle=document.createElement(`button`),this.toggle.type=`button`,this.toggle.className=`tcw-ind-legend-toggle`,this.toggle.addEventListener(`click`,()=>{this.setCollapsed(!this.collapsed),this.renderToggle(this.overlayCount())}),this.stack.appendChild(this.toggle),e.appendChild(this.stack),this.valuesObserver=typeof ResizeObserver>`u`?null:new ResizeObserver(e=>{for(let t of e)al(t.target,t.contentRect.width)})}update(e,t,n=[]){this.updatePanes(n);let r=`${Math.round(t.left)},${Math.round(t.top)}`;r!==this.stackKey&&(this.stackKey=r,this.stack.style.left=`${Math.round(t.left)}px`,this.stack.style.top=`${Math.round(t.top)}px`);let i=new Set(e.map(e=>e.instanceId));for(let[e,t]of this.rows)i.has(e)||(this.valuesObserver?.unobserve(t.values),t.el.remove(),this.rows.delete(e));let a=!1,o=null;for(let t of e){let e=this.rows.get(t.instanceId)??this.createRow(t.instanceId,t.kind);if(this.fill(e,t),t.pane)e.el.parentElement!==this.host&&this.host.appendChild(e.el);else{let t=o?o.nextElementSibling:this.stack.firstElementChild;e.el.parentElement!==this.stack&&(a=!0),e.el!==t&&this.stack.insertBefore(e.el,t),o=e.el}this.place(e,t.pane)}a&&this.collapsed&&this.setCollapsed(!1),this.renderToggle(e.filter(e=>!e.pane).length)}destroy(){this.valuesObserver?.disconnect();for(let e of this.rows.values())e.el.remove();this.rows.clear();for(let e of this.panes.values())e.el.remove();this.panes.clear(),this.stack.remove()}updatePanes(e){if(!this.callbacks.onPaneAction)return;let t=new Set;for(let n of e){t.add(n.instanceId);let e=this.panes.get(n.instanceId)??this.createPane(n.instanceId),r=`${Math.round(n.x)},${Math.round(n.y)}|${n.label}|${n.collapsed}|${n.maximized}|${n.canMoveUp}|${n.canMoveDown}`;if(r===e.key)continue;e.key=r,e.el.style.left=`${Math.round(n.x)}px`,e.el.style.top=`${Math.round(n.y)}px`;let i=this.labels,a=(t,r,i,a)=>{let o=e.buttons.get(t);!r&&document.activeElement===o&&e.buttons.get(`max`).focus(),o.hidden=!r,o.innerHTML=D(i,12),ol(o,a??t,n.label)};a(`up`,n.canMoveUp&&!n.maximized,`arrowUp`,i.paneUp),a(`down`,n.canMoveDown&&!n.maximized,`arrowDown`,i.paneDown),a(`fold`,!n.maximized,n.collapsed?`chevronDown`:`chevronUp`,n.collapsed?i.paneExpand:i.paneCollapse),a(`max`,!0,n.maximized?`minimize`:`maximize`,n.maximized?i.paneRestore:i.paneMaximize),e.el.dataset.collapsed=String(n.collapsed),e.el.dataset.maximized=String(n.maximized)}for(let[e,n]of this.panes)t.has(e)||(n.el.remove(),this.panes.delete(e))}createPane(e){let t=document.createElement(`div`);t.className=`tcw-pane-controls`,E(t,`indicatorLegend`),t.dataset.instance=e;let n=new Map,r=e=>e===`up`||e===`down`?e:e===`fold`?t.dataset.collapsed===`true`?`expand`:`collapse`:t.dataset.maximized===`true`?`restore`:`maximize`,i={up:`pane.move`,down:`pane.move`,fold:`pane.collapse`,max:`pane.maximize`};for(let a of[`up`,`down`,`fold`,`max`]){let o=document.createElement(`button`);o.type=`button`,o.className=`tcw-pane-btn`,o.dataset.act=a,E(o,i[a]),o.addEventListener(`click`,()=>this.callbacks.onPaneAction?.(e,r(a))),n.set(a,o),t.appendChild(o)}this.host.appendChild(t);let a={el:t,buttons:n,key:``};return this.panes.set(e,a),a}createRow(e,t){let n=t===`compare`,r=document.createElement(`div`);r.className=n?`tcw-ind-legend-row tcw-ind-legend-row--compare`:`tcw-ind-legend-row`,E(r,`indicatorLegend`),r.dataset.instance=e;let i=document.createElement(n?`span`:`button`);i.className=`tcw-ind-legend-name`,i instanceof HTMLButtonElement&&(i.type=`button`,i.addEventListener(`click`,()=>this.callbacks.onSettings(e)));let a=document.createElement(`span`);a.className=`tcw-ind-legend-values`,E(a,`indicatorLegend.values`),this.valuesObserver?.observe(a);let o=document.createElement(`span`);o.className=`tcw-ind-legend-actions`;let s=(e,t,n,...r)=>{let i=document.createElement(`button`);return i.type=`button`,i.className=`tcw-ind-legend-act`,i.dataset.act=e,E(i,...r),i.innerHTML=D(t,13),i.addEventListener(`click`,n),o.appendChild(i),i},c=s(`visible`,`eye`,()=>{this.callbacks.onToggleVisible(e,!m.visible,t)},`indicatorLegend.visibility`),l=n?null:s(`settings`,`settings`,()=>this.callbacks.onSettings(e),`indicatorSettings`,`indicatorLegend.settings`),u=this.callbacks.onMore&&!n?s(`more`,`more`,()=>this.callbacks.onMore?.(e,u),`indicatorLegend.more`):null,d=s(`remove`,`x`,()=>this.callbacks.onRemove(e,t),`indicatorLegend.remove`),f=document.createElement(`span`);f.className=`tcw-visually-hidden`,f.id=`tcw-ind-note-${++rl}`;let p=n?document.createElement(`span`):null;p&&(p.className=`tcw-ind-legend-swatch`,p.setAttribute(`aria-hidden`,`true`),r.append(p)),r.append(i,a,o,f);let m={el:r,name:i,swatch:p,values:a,eye:c,settings:l,more:u,remove:d,note:f,visible:!0,valuesKey:``,state:``,placeKey:``};return this.rows.set(e,m),m}fill(e,t){let n=this.offNote(t),r=`${t.label}|${t.visible}|${n}|${t.swatch??``}`;r!==e.state&&(e.state=r,e.swatch&&(e.swatch.style.backgroundColor=t.swatch??``),e.visible=t.visible,e.name.textContent=t.label,e.settings&&(e.name.title=this.labels.settings),e.el.classList.toggle(`tcw-ind-legend-row--hidden`,!t.visible||n!==null),n?e.el.title=n:e.el.removeAttribute(`title`),this.describe(e,n),e.eye.innerHTML=D(t.visible?`eye`:`eyeOff`,13),ol(e.eye,t.visible?this.labels.hide:this.labels.show,t.label),e.settings&&ol(e.settings,this.labels.settings,t.label),e.more&&(ol(e.more,this.labels.more??`More`,t.label),e.more.setAttribute(`aria-haspopup`,`menu`)),ol(e.remove,this.labels.remove,t.label));let i=t.values.map(e=>`${e.text}${e.color??``}`).join(``);i!==e.valuesKey&&(e.valuesKey=i,e.values.replaceChildren(...t.values.map(e=>{let t=document.createElement(`span`);return t.textContent=e.text,e.color&&(t.style.color=e.color),t})))}describe(e,t){e.note.textContent=t??``;let n=[e.name,e.eye,e.settings,e.more,e.remove].filter(e=>e instanceof HTMLButtonElement);for(let r of n)t?r.setAttribute(`aria-describedby`,e.note.id):r.removeAttribute(`aria-describedby`)}offNote(e){return e.offInterval?this.labels.offInterval??``:e.offChartType?this.labels.offChartType??``:null}place(e,t){let n=t?`${Math.round(t.x)},${Math.round(t.y)},${Math.round(t.width)}`:``;n!==e.placeKey&&(e.placeKey=n,e.el.classList.toggle(`tcw-ind-legend-row--pane`,t!==null),e.el.style.left=t?`${Math.round(t.x)}px`:``,e.el.style.top=t?`${Math.round(t.y)}px`:``,e.el.style.maxWidth=t?`${Math.max(0,Math.round(t.width))}px`:``)}setCollapsed(e){this.collapsed=e,this.stack.classList.toggle(`tcw-ind-legend--collapsed`,e)}overlayCount(){return this.stack.querySelectorAll(`:scope > .tcw-ind-legend-row`).length}renderToggle(e){let t=e>=el;!t&&this.collapsed&&this.setCollapsed(!1);let n=`${t}|${this.collapsed}|${e}`;if(n===this.toggleKey||(this.toggleKey=n,this.toggle.hidden=!t,!t))return;let r=this.collapsed?this.labels.expand:this.labels.collapse;ol(this.toggle,r,this.collapsed?`(${e})`:void 0),this.toggle.setAttribute(`aria-expanded`,String(!this.collapsed));let i=D(this.collapsed?`chevronDown`:`chevronUp`,12);this.toggle.innerHTML=this.collapsed?`${i}<span>${e}</span>`:i}};function al(e,t){let n=(parseFloat(getComputedStyle(e).fontSize)||0)*tl;e.classList.toggle(nl,t<n)}function ol(e,t,n){e.title=t,e.setAttribute(`aria-label`,n?`${t} ${n}`:t)}function sl(e,t,n,i){if(!t)return[];let a=e.plots;if(!a){let e=[];for(let n in t){let r=t[n];typeof r==`number`&&Number.isFinite(r)&&e.push(r)}let r=e.length===1?n[0]??null:null;return e.map(e=>({value:e,color:r}))}let o={colors:[...n],lineWidths:[],opacity:1},s=[];for(let e of a){if(!(0,r.plotShown)(e,{plots:i}))continue;let a=t[e.key];typeof a!=`number`||!Number.isFinite(a)||s.push({value:a,color:n.length?(0,r.plotColor)(e,o,t):null})}return s}var cl=new Map;function ll(e){let t=cl.get(e);return t||(t=new Intl.NumberFormat(e,{notation:`compact`,maximumFractionDigits:2}),cl.set(e,t)),t}function ul(e,t=`en-US`){return Math.abs(e)>=1e6?ll(t).format(e):(0,n.formatPrice)(e,(0,r.indicatorValuePrecision)(e),t)}var dl=2,fl=2;function pl(e,t=`en-US`){return(0,n.formatPrice)(e,Math.max(dl,(0,r.indicatorValuePrecision)(e)),t)}function ml(e,t=`en-US`){return`${Ds((0,n.formatPrice)(Math.abs(e),fl,t),e,(0,n.formatPrice)(0,fl,t))}%`}function hl(e,t=`en-US`,n=!0){return e.map(e=>({instanceId:e.id,kind:`compare`,label:e.label,swatch:e.color,visible:e.visible,...n?{values:gl(e,t)}:{values:[],offChartType:!0},pane:null}))}function gl(e,t){return[...e.close===null?[]:[{text:pl(e.close,t),color:null}],...e.change===null?[]:[{text:ml(e.change,t),color:null}]]}var _l=class{el;labelEl;callbacks;visible=!1;constructor(e,n,r=t.t){this.t=r,this.callbacks=n,this.el=document.createElement(`div`),this.el.className=`tcw-bracket-bar`,this.el.setAttribute(`role`,`group`),this.el.hidden=!0,this.labelEl=document.createElement(`span`),this.labelEl.className=`tcw-bracket-label`,this.el.appendChild(this.labelEl);let i=document.createElement(`span`);i.className=`tcw-bracket-hint`,i.textContent=this.t(`bracket.hint`),this.el.appendChild(i);let a=document.createElement(`button`);a.type=`button`,a.className=`tcw-bracket-cancel`,a.innerHTML=`${D(`x`,14)}<span>${O(this.t(`common.cancel`))}</span>`,a.addEventListener(`click`,()=>this.callbacks.onCancel());let o=document.createElement(`button`);o.type=`button`,o.className=`tcw-bracket-confirm`,o.innerHTML=`${D(`check`,14)}<span>${O(this.t(`bracket.place`))}</span>`,o.addEventListener(`click`,()=>this.callbacks.onConfirm()),this.el.appendChild(a),this.el.appendChild(o),e.appendChild(this.el)}show(e){this.visible=!0;let t=e===`buy`?this.t(`toolbar.longBracket`):this.t(`toolbar.shortBracket`);this.labelEl.textContent=t,this.el.setAttribute(`aria-label`,t),this.el.dataset.side=e,this.el.dir=this.el.closest(`.tcw-root`)?.dir||`auto`,this.el.hidden=!1}hide(){this.visible=!1,this.el.hidden=!0}isVisible(){return this.visible}destroy(){this.el.remove()}},vl=class{options;audioCtx=null;audioEl=null;permissionAsked=!1;constructor(e={}){if(this.options=e,typeof e.sound==`string`)try{this.audioEl=new Audio(e.sound),this.audioEl.preload=`auto`}catch{this.audioEl=null}e.desktop&&this.ensurePermission()}setOptions(e){this.options={...this.options,...e}}notify(e){this.options.sound&&this.playSound(),this.options.desktop&&this.showDesktop(e)}playSound(){if(this.audioEl){this.audioEl.currentTime=0,this.audioEl.play().catch(()=>{});return}this.beep()}beep(){try{let e=window.AudioContext??window.webkitAudioContext;if(!e)return;this.audioCtx||=new e;let t=this.audioCtx,n=t.currentTime,r=t.createGain();r.gain.setValueAtTime(1e-4,n),r.gain.exponentialRampToValueAtTime(.2,n+.01),r.gain.exponentialRampToValueAtTime(1e-4,n+.35),r.connect(t.destination);let i=t.createOscillator();i.type=`sine`,i.frequency.setValueAtTime(880,n),i.frequency.setValueAtTime(1320,n+.16),i.connect(r),i.start(n),i.stop(n+.36)}catch{}}ensurePermission(){this.permissionAsked||(this.permissionAsked=!0,!(typeof Notification>`u`)&&Notification.permission===`default`&&Notification.requestPermission().catch(()=>{}))}showDesktop(e){if(!(typeof Notification>`u`)){if(Notification.permission!==`granted`){this.ensurePermission();return}try{new Notification(this.options.title??`Price alert`,{body:e})}catch{}}}destroy(){try{this.audioCtx?.close()}catch{}this.audioCtx=null,this.audioEl=null}};function yl(e,t=12){let n=[...e.asks].sort((e,t)=>e.price-t.price).slice(0,t),r=[...e.bids].sort((e,t)=>t.price-e.price).slice(0,t),i=n.length>0?n[0].price:null,a=r.length>0?r[0].price:null,o=i!==null&&a!==null?(i+a)/2:null,s=new Map,c=e=>{let t=s.get(e);return t||(t={price:e,bidVolume:0,askVolume:0},s.set(e,t)),t};for(let e of n)c(e.price).askVolume+=e.volume;for(let e of r)c(e.price).bidVolume+=e.volume;let l=[...s.values()].sort((e,t)=>t.price-e.price),u=0;for(let e of l)u=Math.max(u,e.bidVolume,e.askVolume);return{rows:l,maxVolume:u,mid:o,spread:i!==null&&a!==null?i-a:null,bestBid:a}}var bl=1e-9,xl=class{el;colsEl;bodyEl;callbacks;open=!1;levels;model=null;orders=[];drawn=[];spreadEl;placed=!1;constructor(e,n,r=12,i=t.t){this.t=i,this.callbacks=n,this.levels=r,this.el=document.createElement(`section`),this.el.className=`tcw-ladder`,this.el.setAttribute(`aria-label`,this.t(`ladder.title`)),E(this.el,`depthLadder`),this.el.hidden=!0;let a=document.createElement(`div`);a.className=`tcw-ladder-header`;let o=document.createElement(`h3`);o.className=`tcw-ladder-title`,o.textContent=this.t(`ladder.title`);let s=document.createElement(`button`);s.type=`button`,s.className=`tcw-ladder-close`,s.setAttribute(`aria-label`,this.t(`common.close`)),s.innerHTML=D(`x`,14),s.addEventListener(`click`,()=>this.callbacks.onClose?this.callbacks.onClose():this.close()),a.append(o,s),this.colsEl=document.createElement(`div`),this.colsEl.className=`tcw-ladder-cols`;for(let e of[`ladder.bid`,`ladder.price`,`ladder.ask`]){let t=document.createElement(`span`);t.textContent=this.t(e),this.colsEl.appendChild(t)}this.bodyEl=document.createElement(`div`),this.bodyEl.className=`tcw-ladder-body`,this.spreadEl=document.createElement(`div`),this.spreadEl.className=`tcw-ladder-spread`,this.el.append(a,this.colsEl,this.bodyEl),e.appendChild(this.el)}get element(){return this.el}isOpen(){return this.open}toggle(){this.open?this.close():this.openPanel()}openPanel(){this.open=!0,this.placed=!1,this.el.hidden=!1,this.render(),this.callbacks.onToggle?.(!0)}close(){this.open&&(this.open=!1,this.el.hidden=!0,this.callbacks.onToggle?.(!1))}setData(e){this.model=e?yl(e,this.levels):null,this.render()}setOrders(e){this.orders=e,this.render()}destroy(){this.el.remove()}render(){if(!this.open)return;let e=this.model;if(!e||e.rows.length===0){let e=document.createElement(`div`);e.className=`tcw-ladder-empty`,e.textContent=this.t(`ladder.empty`),this.bodyEl.replaceChildren(e),this.drawn=[];return}let t=Sl(e.rows);e.rows.length===this.drawn.length&&e.rows.every((e,t)=>e.price===this.drawn[t].price)||(this.drawn=e.rows.map(e=>this.newRow(e.price)),this.bodyEl.replaceChildren(...this.drawn.map(e=>e.row)));let n=e.maxVolume>0?100/e.maxVolume:0;e.rows.forEach((e,r)=>this.fillRow(this.drawn[r],e,n,this.nearness(e.price,t))),this.putSpread(e,t),this.placeSpread()}putSpread(e,n){let{spread:r,bestBid:i}=e,a=r===null||i===null?-1:e.rows.findIndex(e=>e.price<i+n);if(r===null||a<0){this.spreadEl.remove();return}this.spreadEl.textContent=t.r(this.t(`ladder.spread`),{spread:this.callbacks.formatPrice(r)});let o=this.drawn[a].row;this.spreadEl.nextElementSibling!==o&&this.bodyEl.insertBefore(this.spreadEl,o)}nearness(e,t){let n=this.callbacks.priceStep?.(e)??0;return n>0?Math.min(n/2,t):t}newRow(e){let t=document.createElement(`div`);t.className=`tcw-ladder-row`;let n=document.createElement(`div`);n.className=`tcw-ladder-price`;let r=document.createElement(`span`);r.className=`tcw-ladder-figure`,n.appendChild(r);let i=this.newCell(`sell`,e),a=this.newCell(`buy`,e);return t.append(i,n,a),{price:e,row:t,bid:i,ask:a,cell:n,figure:r}}newCell(e,t){let n=document.createElement(`button`);return n.type=`button`,n.className=`tcw-ladder-cell ${e===`sell`?`tcw-ladder-bid`:`tcw-ladder-ask`}`,n.addEventListener(`click`,()=>this.callbacks.onTrade(e,t)),n}fillRow(e,t,n,r){e.cell.className=`tcw-ladder-price ${t.askVolume>0?`tcw-ask`:`tcw-bid`}`,e.figure.textContent=this.callbacks.formatPrice(t.price),this.fillCell(e.bid,`sell`,t.bidVolume,t.price,n),this.fillCell(e.ask,`buy`,t.askVolume,t.price,n);for(let t of e.cell.querySelectorAll(`.tcw-ladder-own`))t.remove();for(let n of[`buy`,`sell`]){let i=this.orders.filter(e=>e.side===n&&Math.abs(e.price-t.price)<r).reduce((e,t)=>e+t.quantity,0);if(i<=0)continue;let a=document.createElement(`span`);a.className=`tcw-ladder-own`,a.dataset.side=n,a.textContent=String(i);let o=`${this.t(n===`buy`?`ticket.buy`:`ticket.sell`)} ${i}`;a.setAttribute(`aria-label`,o),a.title=o,n===`buy`?e.cell.insertBefore(a,e.figure):e.cell.appendChild(a)}}fillCell(e,n,r,i,a){if(!(r>0)){e.disabled=!0,e.textContent=``,e.removeAttribute(`aria-label`),e.title=``,e.style.removeProperty(`--w`);return}e.disabled=!1;let o=Cl(r);e.textContent=o,e.style.setProperty(`--w`,`${(r*a).toFixed(1)}%`);let s=t.r(this.t(n===`sell`?`ladder.sellAt`:`ladder.buyAt`),{price:this.callbacks.formatPrice(i)});e.setAttribute(`aria-label`,`${o}, ${s}`),e.title=s}placeSpread(){let e=this.el;if(this.placed||!this.spreadEl.isConnected||e.clientHeight===0)return;let t=e.getBoundingClientRect().top,n=this.colsEl.getBoundingClientRect().bottom-t,r=this.spreadEl.getBoundingClientRect().top-t;e.scrollTop+=r-n-(e.clientHeight-n-this.spreadEl.offsetHeight)/2,this.placed=!0}};function Sl(e){let t=1/0;for(let n=1;n<e.length;n++)t=Math.min(t,Math.abs(e[n-1].price-e[n].price));return Number.isFinite(t)&&t>0?t/2:bl}function Cl(e){return e>=1e3?`${Number((e/1e3).toFixed(1))}k`:String(Number(e>=1?e.toFixed(2):e.toPrecision(2)))}var wl=class{el;bodyEl;callbacks;open=!1;constructor(e,n,r=t.t){this.t=r,this.callbacks=n,this.el=document.createElement(`div`),this.el.className=`tcw-datawin`,E(this.el,`dataWindow`),this.el.hidden=!0;let i=document.createElement(`div`);i.className=`tcw-datawin-header`;let a=document.createElement(`span`);a.textContent=this.t(`dataWindow.title`);let o=document.createElement(`button`);o.type=`button`,o.className=`tcw-datawin-close`,o.setAttribute(`aria-label`,this.t(`common.close`)),o.innerHTML=D(`x`,14),o.addEventListener(`click`,()=>this.callbacks.onClose?this.callbacks.onClose():this.close()),i.appendChild(a),i.appendChild(o),this.el.appendChild(i),this.bodyEl=document.createElement(`div`),this.bodyEl.className=`tcw-datawin-body`,this.el.appendChild(this.bodyEl),e.appendChild(this.el)}get element(){return this.el}isOpen(){return this.open}toggle(){this.open?this.close():this.openPanel()}openPanel(){this.open=!0,this.el.hidden=!1}close(){this.open=!1,this.el.hidden=!0}destroy(){this.el.remove()}render(e){if(!this.open)return;if(this.bodyEl.replaceChildren(),!e.ohlc){let e=document.createElement(`div`);e.className=`tcw-datawin-empty`,e.textContent=this.t(`dataWindow.hover`),this.bodyEl.appendChild(e);return}let t=this.callbacks.formatPrice,n=e.ohlc;this.bodyEl.appendChild(this.row(this.t(`dataWindow.open`),t(n.open))),this.bodyEl.appendChild(this.row(this.t(`dataWindow.high`),t(n.high))),this.bodyEl.appendChild(this.row(this.t(`dataWindow.low`),t(n.low))),this.bodyEl.appendChild(this.row(this.t(`dataWindow.close`),t(n.close)));let r=e.change>0?`up`:e.change<0?`down`:``,i=e.change>0?`+`:``,a=this.callbacks.formatPercent?.(e.changePct)??e.changePct.toFixed(2);this.bodyEl.appendChild(this.row(this.t(`dataWindow.change`),`${i}${t(e.change)} (${i}${a}%)`,r)),this.bodyEl.appendChild(this.row(this.t(`dataWindow.volume`),El(n.volume)));for(let t of e.indicators){let e=document.createElement(`div`);e.className=`tcw-datawin-sub`,e.textContent=t.name,this.bodyEl.appendChild(e);for(let e of t.values)this.bodyEl.appendChild(this.row(e.key,Tl(e.value)))}}row(e,t,n=``){let r=document.createElement(`div`);r.className=`tcw-datawin-row`;let i=document.createElement(`span`);i.className=`tcw-datawin-label`,i.textContent=e;let a=document.createElement(`span`);return a.className=`tcw-datawin-value${n?` tcw-${n}`:``}`,a.textContent=t,r.appendChild(i),r.appendChild(a),r}};function Tl(e){if(!Number.isFinite(e))return`—`;let t=Math.abs(e);return t>=1e3?e.toFixed(2):t>=1?e.toFixed(4):e.toPrecision(4)}function El(e){return e>=1e9?(e/1e9).toFixed(2)+`B`:e>=1e6?(e/1e6).toFixed(2)+`M`:e>=1e3?(e/1e3).toFixed(2)+`K`:e.toFixed(0)}var Dl=e=>typeof e==`object`&&!!e&&!Array.isArray(e),Ol=globalThis.Buffer;function kl(e){if(Ol)return Ol.from(e,`utf8`).toString(`base64`);let t=new TextEncoder().encode(e),n=``;for(let e of t)n+=String.fromCharCode(e);return btoa(n)}function Al(e){if(Ol)return Ol.from(e,`base64`).toString(`utf8`);let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return new TextDecoder().decode(n)}function jl(e){return e.replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/,``)}function Ml(e){let t=e.replace(/-/g,`+`).replace(/_/g,`/`);return t+(t.length%4==0?``:`=`.repeat(4-t.length%4))}function Nl(e){return jl(kl(JSON.stringify(e)))}function Pl(e){if(!e)return null;try{let t=Al(Ml(e)),n=JSON.parse(t);return!n||n.v!==1||typeof n.symbol!=`string`?null:{v:1,symbol:n.symbol,timeframe:n.timeframe,chartType:n.chartType,scaleMode:vc.find(e=>e===n.scaleMode)??`regular`,indicators:Array.isArray(n.indicators)?n.indicators:[],drawings:Array.isArray(n.drawings)?n.drawings:[],...Dl(n.settings)?{settings:G(n.settings,eo)}:{}}}catch{return null}}var Fl=`tcw`;function Il(e){let t=e.startsWith(`#`)?e.slice(1):e;for(let e of t.split(`&`)){let t=e.indexOf(`=`);if(!(t<=0||e.slice(0,t)!==Fl))try{return decodeURIComponent(e.slice(t+1))}catch{return null}}return null}function Ll(e,t){let[n]=e.split(`#`);return`${n}#${Fl}=${t}`}var Rl=[[34,16,28,26,!1],[30,14,24,26,!0],[26,18,20,30,!0],[30,10,24,22,!1],[20,16,14,28,!0],[14,18,8,30,!0],[18,10,12,20,!1],[8,18,2,30,!0]],zl=class{el;label;showTimer=null;phase=`loading`;constructor(e,t){this.loadingText=t,this.el=document.createElement(`div`),this.el.className=`tcw-loading-overlay`,this.el.setAttribute(`role`,`status`),this.el.setAttribute(`aria-live`,`polite`);let n=document.createElement(`div`);n.className=`tcw-loading-card`;let r=document.createElement(`div`);r.className=`tcw-loading-candles`,r.setAttribute(`aria-hidden`,`true`),Rl.forEach(([e,t,n,i,a],o)=>{let s=document.createElement(`span`);s.className=a?`tcw-loading-candle tcw-loading-candle--up`:`tcw-loading-candle`,s.style.setProperty(`--tcw-body-top`,`${e}px`),s.style.setProperty(`--tcw-body-h`,`${t}px`),s.style.setProperty(`--tcw-wick-top`,`${n}px`),s.style.setProperty(`--tcw-wick-h`,`${i}px`),s.style.setProperty(`--tcw-delay`,`${o*110}ms`),r.appendChild(s)}),n.appendChild(r);let i=document.createElement(`div`);i.className=`tcw-loading-track`,i.setAttribute(`aria-hidden`,`true`),i.appendChild(document.createElement(`span`)),n.appendChild(i),this.label=document.createElement(`div`),this.label.className=`tcw-loading-label`,this.label.textContent=t,n.appendChild(this.label),this.el.appendChild(n),e.appendChild(this.el)}begin(e,t=!1){if(this.phase=`loading`,this.clearTimer(),this.label.textContent=this.loadingText,this.el.classList.remove(`tcw-loading-overlay--error`),this.el.classList.toggle(`tcw-loading-overlay--veil`,e),!e||t||this.isShown()){this.el.classList.remove(`tcw-loading-overlay--hidden`);return}this.showTimer=setTimeout(()=>{this.showTimer=null,this.el.classList.remove(`tcw-loading-overlay--hidden`)},200)}end(){this.phase=`idle`,this.clearTimer(),this.el.classList.add(`tcw-loading-overlay--hidden`)}fail(e){this.phase!==`idle`&&(this.phase=`failed`,this.clearTimer(),this.label.textContent=e,this.el.classList.add(`tcw-loading-overlay--error`),this.el.classList.remove(`tcw-loading-overlay--hidden`))}isActive(){return this.phase!==`idle`}hasFailed(){return this.phase===`failed`}isShown(){return!this.el.classList.contains(`tcw-loading-overlay--hidden`)}destroy(){this.clearTimer(),this.el.remove()}clearTimer(){this.showTimer!==null&&(clearTimeout(this.showTimer),this.showTimer=null)}},Bl=4e3,Vl=class{el;text;hideTimer=null;constructor(e,t){this.texts=t,this.el=document.createElement(`div`),this.el.className=`tcw-history-pill tcw-history-pill--hidden`,this.el.setAttribute(`aria-hidden`,`true`),this.el.setAttribute(`role`,`status`),this.el.setAttribute(`aria-live`,`polite`);let n=document.createElement(`span`);n.className=`tcw-history-spinner`,n.setAttribute(`aria-hidden`,`true`),this.text=document.createElement(`span`),this.el.append(n,this.text),e.appendChild(this.el)}update(e){this.clearTimer(),e.state===`loading`?this.show(this.texts.loading,!1):e.state===`error`?(this.show(this.texts.failed,!0),this.hideTimer=setTimeout(()=>this.hide(),Bl)):this.hide()}destroy(){this.clearTimer(),this.el.remove()}show(e,t){this.text.textContent=e,this.el.classList.toggle(`tcw-history-pill--error`,t),this.el.classList.remove(`tcw-history-pill--hidden`),this.el.removeAttribute(`aria-hidden`)}hide(){this.hideTimer=null,this.el.classList.add(`tcw-history-pill--hidden`),this.el.setAttribute(`aria-hidden`,`true`),this.text.textContent=``}clearTimer(){this.hideTimer!==null&&clearTimeout(this.hideTimer),this.hideTimer=null}},Hl=`host:`;function Ul(e,t){return[...e,...e.length>0&&t.length>0?[`separator`]:[],...t.map((e,t)=>({id:`${Hl}${t}`,label:e.label,icon:e.icon,danger:e.danger,checked:e.checked}))]}function Wl(e,t){return e.startsWith(Hl)?(t[Number(e.slice(5))]?.onSelect(),!0):!1}var Gl=typeof navigator<`u`&&/mac|iphone|ipad|ipod/i.test(navigator.platform||navigator.userAgent),Kl={ctrl:`ctrl`,control:`ctrl`,cmd:`ctrl`,command:`ctrl`,meta:`ctrl`,mod:`ctrl`,alt:`alt`,option:`alt`,opt:`alt`,shift:`shift`},ql={esc:`escape`,space:` `,spacebar:` `,up:`arrowup`,down:`arrowdown`,left:`arrowleft`,right:`arrowright`,del:`delete`,return:`enter`,plus:`+`};function Jl(e){let t=e.split(`+`).map(e=>e.trim()),n=t.pop();if(!n)return null;let r={ctrl:!1,alt:!1,shift:!1,display:[]};for(let e of t){let t=Kl[e.toLowerCase()];if(!t)return null;r[t]=!0}let i=n.toLowerCase();if(Kl[i])return null;if(/^[a-z]$/.test(i))r.code=`Key${i.toUpperCase()}`,r.char=i;else if(/^[0-9]$/.test(i))r.code=`Digit${i}`,r.char=i;else if(r.key=ql[i]??i,r.shift&&r.key.length===1)return null;return r.display=[...r.ctrl?[Gl?`⌘`:`Ctrl`]:[],...r.alt?[`Alt`]:[],...r.shift?[`Shift`]:[],r.key===` `?`Space`:n.length===1?n.toUpperCase():n],r}function Yl(e,t){if((e.ctrlKey||e.metaKey)!==t.ctrl||e.altKey!==t.alt)return!1;if(t.code!==void 0){if(e.shiftKey!==t.shift)return!1;if(t.alt)return e.code===t.code;let n=e.key.length===1&&/^[a-z0-9]$/i.test(e.key)?e.key.toLowerCase():null;return n===null?e.code===t.code:n===t.char}return t.shift&&!e.shiftKey?!1:e.key.toLowerCase()===t.key}var Xl=new Set(`escape(enter(delete(backspace(arrowleft(arrowright(arrowup(arrowdown(home(end(+(-(=( (,(.(ctrl+z(ctrl+shift+z(ctrl+y(ctrl+c(ctrl+v(ctrl+d(ctrl+g(ctrl+shift+g(ctrl+[(ctrl+]`.split(`(`));function Zl(e){let t=`${e.ctrl?`ctrl+`:``}${e.alt?`alt+`:``}${e.shift?`shift+`:``}${e.char??e.key}`;return Xl.has(t)}function Ql(e){let t=typeof e.composedPath==`function`?e.composedPath()[0]:e.target;return t instanceof HTMLElement?t.isContentEditable||/^(INPUT|TEXTAREA|SELECT)$/.test(t.tagName):!1}var $l=48,eu=5e4,tu=100;function nu(){return new Promise(e=>{if(typeof requestAnimationFrame!=`function`||document.hidden){setTimeout(e,0);return}let t=setTimeout(e,tu);requestAnimationFrame(()=>setTimeout(()=>{clearTimeout(t),e()},0))})}var ru=[`#b552c9`,`#1398a8`,`#d4622b`,`#e25592`,`#6f7a8c`,`#3e9a4f`],iu=864e5,au=1e3,ou={alerts:`alerts`,objectTree:`objectTree`,dataWindow:`dataWindow`,symbolInfo:`symbolInfo`,depthLadder:`depthLadder`},su=2,cu={alerts:`alerts`,objectTree:`objects`,symbolInfo:`symbolInfo`,depthLadder:`trade`};function lu(e){if(e.ctrlKey||e.metaKey||e.altKey||e.isComposing||e.keyCode===yu||e.getModifierState?.(`AltGraph`))return null;if(/^[a-z]$/i.test(e.key))return e.key;let t=/^Key([A-Z])$/.exec(e.code??``);return t&&[...e.key].length===1&&!/[\s\d]/.test(e.key)?t[1].toLowerCase():null}var uu=4,du=7,fu=17,pu=3,mu=150,hu=5e3,gu=8,_u=6e4,vu=()=>{let e=document.activeElement;return e instanceof Element&&e.closest(`[role="dialog"], [aria-modal="true"], [role="menu"]`)!==null},yu=229,bu=1e3,xu=new Set([...Za,`autoScale`]),Su=[[`barCountdown`,`barCountdown`],[`logScale`,`logScale`],[`legendVisible`,`legend`],[`volumeVisible`,`volume`]],Cu=[`legendVisible`,`volumeVisible`,`barCountdown`,`indicatorValueLabels`],wu=T.filter(e=>n.CHART_STYLE_KEYS[e]!==`color`),Tu=()=>typeof document<`u`&&document.hidden,Eu=200,Du=class{chart;state;themeOf={dark:n.DARK_THEME,light:n.LIGHT_THEME};toolbar=null;sidebar=null;settings=null;statusBar=null;goToDate=null;tooltip;indicatorLegend=null;legendFrame=0;portal=document.createElement(`div`);stopKeyboardInset=null;stopNarrow=null;stopFormControls=null;overlayHost=()=>{let e=document.fullscreenElement===this.root?this.root:document.body;return this.portal.parentElement!==e&&e.appendChild(this.portal),this.portal};unregisterKeys=()=>{};onFullscreenChange=()=>{this.toolbar?.setFullscreen(document.fullscreenElement===this.root),this.portal.isConnected&&this.overlayHost()};commandPalette=null;symbolSearch=null;dock=null;dockNarrow=null;dockObserver=null;hotkeySheet=null;replayBar=null;dragDrop=null;alertsPanel=null;objectTree=null;indicatorSettings=null;indicatorPicker=null;drawingStyle=null;drawingSettings=null;drawingMenu=null;selectionToolbar=null;selectionToolbarFrame=null;chartMenu=null;menuPane=null;canExport=!0;symbolLoads=new Map;ui;legendMenu=null;templates=new pc;templatePrompt=null;chartTemplates=new To;chartTemplatePrompt=null;drawingTemplatePrompt=null;settingsEdit=null;intervalInput=null;markerTip=null;accountPanel=null;orderTicket=null;accountFrame=0;layoutSession=null;layoutsUI=null;bracketBar=null;alertNotifier=null;depthLadder=null;dataWindow=null;lastHoverIndex=null;legendHoverIndex=null;favoritesStore=new wc;indicatorFavorites=new wc(`tcw:indicator-favorites`);indicatorDefaults=new Ja;timeframeFavorites=new wc(`tcw:tf-favorites`);customTimeframes=new wc(`tcw:tf-custom`);timeframes=[];watchlist=null;watchlistSparkBuffer=new Map;sessionRefPrice=null;hostWatchlistRefPrice=new Map;watchlistInterval=null;watchlistStore=null;watchlistFromSymbols=!1;quoteSource=null;stopQuotes=null;quotedKey=``;quotes=new Map;symbolInfoPanel=null;news=new Ci;marketTimer=null;clockTimer=null;onPageShown=null;chartNav=null;visibleBarCount=50;replayPollInterval=null;replaySpeed=1;replayBarsTotal=null;replayStepTime=null;replayStepsKey=null;replayStep=`auto`;replayStartSeq=0;replayStartPending=!1;replayPlayWanted=!1;replayStepsCache=null;replayShade=null;layoutKeyPrefix=null;layoutDebounceMs=1500;activeLayoutKey=null;root;chartContainer;loading;historyPill;connectSeq=0;localSeq=0;lastLocalSwitchMs=0;destroyed=!1;options;symbols;symbolCatalog;chartInfoAtSwitch=null;settingsState;settingsDefaults;settingsStore=null;settingsPublished=null;linkSettings=null;settingsListeners=new Set;settingsLocked=new Set;t;adapter=null;boundGlobalKeydown=null;baseSeries=null;baseTimeframeMs=0;builtInZone=void 0;chosenTimeframe=null;rangeSeq=0;rangeQueue=Promise.resolve();compares=[];compareWay=`percent`;comparesLoading=new Set;compareScaleHeld=!1;compareFetchSeq=0;compareOlderBusy=!1;compareOlderAgain=!1;compareOlderPassed=!1;featureState;hostHotkeys=[];hostMenus=new Set;hostLayer=null;priceAxisAddDefault=!1;constructor(i,a={}){this.options=a,this.replayStep=a.replayStep??`auto`;let o=Yt(a.symbols??ge);this.symbols=o.names,this.symbolCatalog=o.info;let s=a.chartOptions;if(this.settingsState={..._e,...s?.crosshair?.mode?{crosshairMode:s.crosshair.mode}:{},...s?.logScale&&s.features?.logScale!==!1?{logScale:!0,scaleMode:`logarithmic`}:{},...s?.numberLocale?{numberLocale:s.numberLocale}:{},...s?.timeZone==null?{}:{timezone:d(s.timeZone)},...s?.leftPriceScale===void 0?{}:{leftPriceScale:s.leftPriceScale},...s?.highLowLines===void 0?{}:{highLowLines:s.highLowLines},...s?.extendedHours===void 0?{}:{extendedHours:s.extendedHours},...s?.chartTypeOptions?{chartTypeOptions:(0,n.readChartTypeOptions)(s.chartTypeOptions)}:{}},this.t=t.n(t.o(a.locale,a.messages)),this.featureState=He(a),a.persistLayouts){let e=a.persistLayouts===!0?{}:a.persistLayouts;this.layoutKeyPrefix=e.keyPrefix??`tcw:layout:`,this.layoutDebounceMs=e.debounceMs??1500}let c=go(a.persistSettings);c&&(this.settingsStore=new vo(c));let l=this.resolveIsDark(a.theme),u=this.resolveTheme(a.theme);this.themeOf={...this.themeOf,[l?`dark`:`light`]:u};let p={drawings:!0,drawingMagnet:!0,drawingUndoRedo:!0,indicators:!0,trading:a.trading!==!1,tradingContextMenu:!1,priceAxisAddButton:this.featureState.alerts||a.trading!==!1||this.featureState.sidebar,volume:!0,legend:!0,crosshair:!0,crosshairTooltip:!1,keyboard:!0,screenshot:!0,alerts:!0,barCountdown:!0,logScale:!0,watermark:!0,...a.chartOptions?.features};this.priceAxisAddDefault=p.priceAxisAddButton===!0;let m={...p,priceAxisAddButton:this.priceAxisAddDefault&&this.featureState[`menu.priceAxisAdd`]};if(this.canExport=p.dataExport!==!1,this.settingsLocked=new Set(Su.filter(([,e])=>p[e]===!1).map(([e])=>e)),this.settingsDefaults={...this.settingsState,legendVisible:p.legend!==!1,volumeVisible:p.volume!==!1,barCountdown:p.barCountdown!==!1,indicatorValueLabels:p.indicatorValueLabels===!0},this.settingsState={...this.settingsDefaults},this.timeframes=Nt(Dt(a.timeframes,p.timeframes),this.customTimeframes.list(),p.timeframes),!this.timeframes.some(e=>this.timeframeFavorites.has(e))){let e=Ot(this.timeframes,p.defaultTimeframeFavorites,!!a.timeframes?.length);for(let t of e)this.timeframeFavorites.add(t)}let h=a.timeframe??`5m`,ee=!p.timeframes?.length||p.timeframes.includes(h)?h:this.timeframes[0]??h;this.state={symbol:a.symbol??this.symbols[0]??`BTCUSDT`,timeframe:ee,chartType:a.chartOptions?.chartType??`candlestick`,isDark:l,activeIndicators:new Map,activeTool:null,magnetEnabled:p.drawingMagnet!==!1,magnetStrong:!1,eraser:!1,zoomArea:!1,stayInDrawing:!1,connectionState:a.adapter?`connecting`:`disconnected`,connectionMessage:a.adapter?this.t(`status.connecting`):``},$e(),this.root=document.createElement(`div`),this.root.className=`tcw-root`,this.root.dataset.tcwTheme=l?`dark`:`light`;let te=a.dir===`ltr`||a.dir===`rtl`?a.dir:Ru(a.locale)?`rtl`:`ltr`;this.root.dir=te,this.portal.dir=te,i.appendChild(this.root),this.tooltip=new qc(this.root),this.portal.className=`tcw-root tcw-portal`,this.portal.dataset.tcwTheme=this.root.dataset.tcwTheme,this.stopKeyboardInset=Tc([this.root,this.portal]),this.stopNarrow=Ec(this.root,e=>{this.toolbar?.fit(),e||this.sidebar?.closeOverlay(),this.syncRail()}),this.ui=U(a.ui);let g=a.ui!==void 0;W(this.root,this.ui,{variables:g}),W(this.portal,this.ui,{variables:g}),this.markSwitchedOff(),this.stopFormControls=pe([this.root,this.portal],{layer:this.overlayHost,labels:()=>({prevMonth:this.t(`calendar.prevMonth`),nextMonth:this.t(`calendar.nextMonth`),today:this.t(`calendar.today`)}),locale:()=>this.intlLocale()}),this.toolbar=new dn(this.root,{symbols:this.symbols,timeframes:this.timeframeMenu(),timeframeFavorites:this.pinnedTimeframes(),chartTypes:a.chartTypes?me.filter(e=>a.chartTypes.includes(e.value)):me},{onSymbolClick:()=>this.handleSymbolClick(),onSymbolInfo:()=>this.toggleSymbolInfo(),onTimeframe:e=>this.handleTimeframe(e),onToggleTimeframeFavorite:e=>this.handleToggleTimeframeFavorite(e),onAddTimeframe:e=>this.handleAddTimeframe(e),onRemoveTimeframe:e=>this.handleRemoveTimeframe(e),onChartType:e=>this.handleChartType(e),onIndicators:()=>this.toggleIndicatorPicker(),onScreenshot:()=>this.chart.screenshot(),onSettings:()=>this.openSettings(),onToggleTheme:()=>this.handleToggleTheme(),onToggleReplay:()=>this.toggleReplay(),onToggleAlerts:()=>this.toggleAlerts(),onToggleObjects:()=>this.toggleObjects(),onToggleAccount:a.trading===!1?void 0:()=>this.toggleAccountPanel(),onLayouts:a.layouts===!1?void 0:e=>void this.layoutsUI?.openMenu(e),onBracket:a.trading===!1?void 0:e=>this.startBracket(e),onToggleLadder:a.trading!==!1&&a.depthLadder?()=>this.toggleLadder():void 0,onOrderTicket:a.trading===!1?void 0:()=>this.openOrderTicket(),onCompare:a.adapter&&p.compareSymbols!==!1?()=>this.handleAddCompare():void 0,onUndo:()=>this.chart.undo(),onRedo:()=>this.chart.redo(),onToggleFullscreen:typeof document<`u`&&document.fullscreenEnabled?()=>this.toggleFullscreen():void 0},this.t,this.overlayHost);let _=document.createElement(`div`);_.className=`tcw-body`,a.drawingFavorites&&this.favoritesStore.seedDefaults(a.drawingFavorites),this.sidebar=new yn(_,{drawingToolGroups:bt(he,this.t),favorites:this.favoritesStore.list(),shortcuts:Ai()},{onDrawingTool:e=>this.handleDrawingTool(e),onCancelDrawing:()=>this.handleCancelDrawing(),onToggleMagnet:p.drawingMagnet===!1?void 0:()=>this.handleToggleMagnet(),onToggleEraser:()=>this.chart.setEraserMode(!this.chart.isEraserMode()),onToggleZoomArea:()=>this.chart.setZoomAreaMode(!this.chart.isZoomAreaMode()),onToggleFavorite:e=>this.handleToggleFavorite(e),onClearDrawings:()=>{this.chart.clearDrawings(),this.state={...this.state,activeTool:null},this.updateUI()},onToggleStyle:()=>this.drawingStyle?.toggle(),onToggleStayInDrawing:()=>this.handleToggleStayInDrawing(),onLockAll:e=>{this.chart.setDrawingsLocked(this.chart.getDrawings().map(e=>e.id),e),this.refreshDrawingsState(),this.refreshObjects()},onHideAll:e=>{this.chart.setDrawingsVisible(this.chart.getDrawings().map(e=>e.id),!e),this.refreshDrawingsState(),this.refreshObjects()}},this.t),this.chartContainer=document.createElement(`div`),this.chartContainer.className=`tcw-chart-container`,this.chartContainer.dir=`ltr`,_.appendChild(this.chartContainer),this.loading=new zl(this.chartContainer,this.t(`status.loading`)),this.historyPill=new Vl(this.chartContainer,{loading:this.t(`history.loading`),failed:this.t(`history.failed`)}),this.dock=new Pc(_,{labels:{rail:this.t(`dock.rail`),resize:this.t(`dock.resize`)},savedWidth:()=>Pu(),saveWidth:e=>Fu(e),railShown:()=>this.railShown(),focusAfterClose:e=>this.panelFocusTarget(e),room:()=>_.clientWidth}),a.watchlist&&this.createWatchlist(_,a.watchlist===!0?{}:a.watchlist),this.root.appendChild(_);let v=document.createElement(`div`);v.className=`tcw-account-dock`,E(v,`accountPanel`),this.root.appendChild(v),this.chart=new e.c(this.chartContainer,{chartType:this.state.chartType,theme:u,autoScale:!0,crosshair:{mode:`magnet`},a11y:{labels:{role:this.t(`a11y.role`),summary:this.t(`a11y.summary`),empty:this.t(`a11y.empty`),view:this.t(`a11y.view`),bar:this.t(`a11y.bar`),keys:this.t(`a11y.keys`),typeName:e=>{let t=`chartType.${e}`,n=this.t(t);return n===t?e:n}}},...a.chartOptions,features:m}),a.chartOptions?.shapes||this.applyChartShapes(),this.chartInfoAtSwitch=this.chart.getSymbolInfo(),this.applyLegendFont(),this.applyChartLook();for(let[e,t]of this.indicatorDefaults.all())this.chart.setIndicatorDefaults(e,t.style);this.chart.on(`visibleRangeChange`,e=>{let{from:t,to:n}=e.payload;Number.isFinite(t)&&Number.isFinite(n)&&(this.visibleBarCount=Math.max(1,n-t))}),this.chartNav=new Fi(this.chartContainer,{zoomIn:()=>this.chart.zoomIn(),zoomOut:()=>this.chart.zoomOut(),scroll:e=>this.chart.scrollBars(e*Math.max(1,Math.round(this.visibleBarCount/10))),reset:()=>this.resetView(),plotRect:()=>this.chart.getPlotRect()},this.t),this.chart.on(`dataUpdate`,e=>this.handleDataUpdate(e.payload)),this.chart.on(`historyLoad`,e=>{let t=e.payload;this.historyPill.update(t),t.state===`loaded`&&this.extendPercentCompares()}),this.chart.on(`symbolInfoChange`,()=>{this.refreshSymbolTitle(),this.refreshMarket(),this.rebuildForZone(),this.refreshPriceTexts()}),this.chart.on(`marketChange`,()=>this.rebuildForZone()),this.refreshSymbolTitle(),this.symbolInfoPanel=new _i(this.root,this.t,{onClose:()=>this.closePanelByHand(`symbolInfo`),onToggle:e=>{this.toolbar?.setActive(`symbolInfo`,e),e&&(this.refreshSymbolInfo(),this.loadNews())}}),this.marketTimer=setInterval(()=>this.refreshMarket(),3e4),this.onPageShown=()=>{Tu()||this.refreshMarket()},document.addEventListener(`visibilitychange`,this.onPageShown),this.dragDrop=new e.o(this.chartContainer,{onData:(e,n,r)=>{this.setData(e);let i=t.r(this.t(`toast.fileLoaded`),{count:n.data.length,file:r.name});this.say(n.skipped>0?`${i} (${t.r(this.t(`toast.fileSkipped`),{count:n.skipped})})`:i)},onError:(e,t)=>{this.say(`${t.name}: ${e.message}`,`error`)}}),this.featureState.dragDropImport&&this.dragDrop.attach(),this.statusBar=new nr(this.root,{presets:r.RANGE_PRESETS,presetLabels:{All:this.t(`range.all`)},groupLabel:this.t(`range.presets`),goToLabel:this.t(`range.goTo`),moreLabel:this.t(`toolbar.more`),onPreset:e=>void this.applyRangePreset(e),onGoTo:()=>this.toggleGoToDate(),goToKeys:()=>this.keysShown(`hotkeys.goToDate`,`Alt+G`)},{label:this.t(`statusBar.label`),clock:{label:this.t(`settings.timezone`),now:()=>this.clockNow(),options:()=>({current:this.settingsState.timezone,list:f(this.settingsState.timezone,Date.now(),this.t(`settings.timezone.local`),this.exchangeChoice())}),onPick:e=>this.changeSettings({timezone:e})},scale:{labels:{group:this.t(`settings.priceScale`),percent:this.t(`settings.scale.percentage`),log:this.t(`settings.scale.logarithmic`),auto:this.t(`settings.autoScale`)},texts:{log:this.t(`statusBar.log`),auto:this.t(`statusBar.auto`)},onPercent:()=>this.toggleScaleMode(`percentage`),onLog:p.logScale===!1?void 0:()=>this.toggleScaleMode(`logarithmic`),onAuto:()=>this.changeSettings({autoScale:!this.chart.isAutoScale()})}}),this.clockTimer=setInterval(()=>{!Tu()&&this.featureState.statusBar&&this.featureState[`statusBar.clock`]&&this.statusBar?.tick()},bu),this.chart.on(`priceRangeChange`,()=>this.refreshScaleSwitches()),this.refreshScaleSwitches(),this.goToDate=new jc(this.overlayHost,()=>({title:this.t(`goTo.title`),date:this.t(`range.date`),range:this.t(`goTo.range`),from:this.t(`goTo.from`),to:this.t(`goTo.to`),time:this.t(`range.time`),submit:this.t(`range.goToSubmit`),cancel:this.t(`range.cancel`),close:this.t(`common.close`),calendar:{prevMonth:this.t(`calendar.prevMonth`),nextMonth:this.t(`calendar.nextMonth`),today:this.t(`calendar.today`)}}),()=>this.intlLocale(),e=>this.goTo(e)),this.settings=new Wn({onChange:e=>this.changeSettings(e),onReset:()=>this.resetSettings(),onClose:()=>this.endSettingsEdit(!0),onCancel:()=>this.endSettingsEdit(!1),templates:{list:()=>this.chartTemplates.list().map(e=>e.name),apply:e=>this.applyChartTemplate(e),remove:e=>this.chartTemplates.remove(e),save:()=>this.promptSaveChartTemplate()},styleValue:e=>this.chart.getStyleValue?.(e)??null,onStyleChange:e=>this.changeStyle(e)},this.t,{barCountdown:p.barCountdown,logScale:p.logScale,legend:p.legend,volume:p.volume,trading:p.trading!==!1,exchangeZone:()=>this.exchangeChoice()?.zone},this.overlayHost),this.symbolSearch=new Kr({onPick:e=>{this.setSymbol(e)},onClose:()=>{}},this.overlayHost,this.t),this.hotkeySheet=new Zr({onClose:()=>{}},this.t,this.overlayHost),this.chart.on(`drawingToolChange`,e=>{let t=e.payload.tool;t!==this.state.activeTool&&(this.state={...this.state,activeTool:t},this.updateUI())}),this.chart.on(`toolModeChange`,e=>{let{eraser:t,zoomArea:n}=e.payload;this.state={...this.state,eraser:t??this.state.eraser,zoomArea:n??this.state.zoomArea},this.updateUI()}),this.chart.on(`indicatorAdd`,()=>this.syncIndicatorsFromChart()),this.chart.on(`indicatorRemove`,()=>this.syncIndicatorsFromChart()),this.chart.setPaneTitlesVisible(!this.featureState.indicatorLegend),this.indicatorLegend=new il(this.chartContainer,{onToggleVisible:(e,t,n)=>{n===`compare`?this.chart.setCompareVisible(e,t):this.chart.setIndicatorVisible(e,t),this.scheduleLegend(),this.objectTree?.isOpen()&&this.refreshObjects()},onSettings:e=>{this.featureState[`indicatorLegend.settings`]&&this.openIndicatorSettings(e)},onRemove:(e,t)=>{this.isPercentCompare(e)?this.handleRemoveCompare(e):t===`compare`?this.removeHostCompare(e):this.handleRemoveIndicator(e)},onMore:(e,t)=>this.openLegendMenu(e,t),onPaneAction:(e,t)=>this.runPaneAction(e,t)},{show:this.t(`legend.show`),hide:this.t(`legend.hide`),settings:this.t(`legend.settings`),remove:this.t(`legend.remove`),collapse:this.t(`legend.collapse`),expand:this.t(`legend.expand`),more:this.t(`legend.more`),paneUp:this.t(`pane.moveUp`),paneDown:this.t(`pane.moveDown`),paneCollapse:this.t(`pane.collapse`),paneExpand:this.t(`pane.expand`),paneMaximize:this.t(`pane.maximize`),paneRestore:this.t(`pane.restore`),offInterval:this.t(`indicatorSettings.offInterval`),offChartType:this.t(`legend.offChartType`)}),this.legendMenu=new k(this.root,this.t(`legend.more`)),this.chart.on(`crosshairMove`,e=>{let t=e.payload;this.legendHoverIndex=typeof t.barIndex==`number`?t.barIndex:null,this.scheduleLegend()}),this.chart.on(`crosshairLeave`,()=>{this.legendHoverIndex=null,this.scheduleLegend()});for(let e of[`indicatorUpdate`,`indicatorChange`,`dataUpdate`,`resize`,`paneResize`,`paneChange`,`themeChange`,`timeframeChange`,`visibleRangeChange`,`compareChange`])this.chart.on(e,()=>this.scheduleLegend());this.chart.on(`chartTypeChange`,()=>{this.compareScaleHeld&&this.showHeldScale(),this.scheduleLegend()}),this.chart.on(`barClick`,e=>{if(!this.replayBar?.isMounted()||this.seriesPending())return;let t=e.payload.barIndex;if(typeof t==`number`){if(this.replayBar.getMode()===`select`){this.startReplayAt(t,!1,!0);return}this.chart.getReplayState()===`playing`&&this.chart.replayPause(),this.chart.replaySeekToBar(t),this.replayBar.setState(`paused`)}}),this.chart.on(`crosshairMove`,e=>{if(this.replayBar?.getMode()!==`select`||!this.replayBar.isMounted())return;let t=e.payload.point;this.positionReplayShade(this.seriesPending()?null:t?.x??null)}),this.chart.on(`replayStep`,e=>{let t=e.payload;this.replayBarsTotal=t.total,this.replayStepTime=typeof t.stepTime==`number`?t.stepTime:t.time,queueMicrotask(()=>{this.destroyed||(t.cause===`series`?this.afterReplayCarryOver():this.syncReplayBar())})});for(let e of[`resize`,`paneResize`,`paneChange`])this.chart.on(e,()=>this.layoutReplayBar());this.chart.on(`replayStepsLoad`,e=>{e.payload.state===`error`&&this.say(this.t(`replay.stepsFailed`),`error`)}),this.chart.on(`timeframeChange`,()=>this.refreshReplaySteps()),this.dataWindow=new wl(this.root,{formatPrice:e=>this.formatAlertPrice(e),formatPercent:e=>this.formatNumber(e,2),onClose:()=>this.closePanelByHand(`dataWindow`)},this.t),this.chart.on(`crosshairMove`,e=>{let t=e.payload;this.lastHoverIndex=typeof t.barIndex==`number`?t.barIndex:null,this.dataWindow?.isOpen()&&this.dataWindow.render(this.buildDataWindowModel())});let ne=new Ao,y=new jo;for(let[e,t]of Object.entries(y.all()))this.chart.setDrawingToolDefaults(e,t??null);this.drawingSettings=new fs(this.root,{onBegin:e=>this.chart.beginDrawingEdit(e),onChange:(e,t)=>this.chart.updateDrawing(e,t),onEnd:(e,t)=>{this.chart.endDrawingEdit(e,{cancel:t}),this.refreshObjects()},toWallTime:e=>Z(e*(0,n.barTimeUnit)(this.chart.getData()),this.displayTimezone()),fromWallTime:(e,t)=>{let r=kc(e,t,this.displayTimezone());return r===null?null:r/(0,n.barTimeUnit)(this.chart.getData())},roundPrice:e=>this.chart.roundPrice(e),priceStep:()=>this.chart.getPriceStep(),onSaveDefault:(e,n)=>{this.chart.setDrawingToolDefaults(e,n),y.set(e,this.chart.getDrawingToolDefaults(e)),this.say(t.r(this.t(`drawingSettings.defaultSaved`),{name:this.drawingToolName(e)}))},templates:{list:e=>ne.list(e),save:e=>this.promptSaveDrawingTemplate(ne,e),remove:(e,t)=>ne.remove(e,t)}},this.t),this.chart.on(`drawingDoubleClick`,e=>this.openDrawingSettings(e.payload.id)),this.drawingStyle=new Fo(this.root,{onStyleChange:e=>{this.chart.setDrawingStyle(e),this.chart.setSelectedDrawingStyle(e)},getStyle:()=>this.chart.getDrawingStyle()},ne,this.t),this.drawingMenu=new k(this.root,this.t(`drawingMenu.label`)),this.chart.on(`drawingContextMenu`,e=>{let{id:t,x:n,y:r}=e.payload;this.openDrawingMenu(t,n,r)}),this.selectionToolbar=new Uo(this.root,{onStyle:e=>{for(let t of this.chart.getSelectedDrawingIds())this.chart.setSelectedDrawingStyle(e,t);this.updateSelectionToolbar()},onSettings:()=>{let e=this.chart.getSelectedDrawingIds()[0];e&&this.openDrawingSettings(e)},onAlert:()=>{let e=this.chart.getSelectedDrawingIds()[0];e&&this.addDrawingAlert(e)},onLock:e=>{this.chart.setDrawingsLocked(this.chart.getSelectedDrawingIds(),e),this.refreshObjects(),this.updateSelectionToolbar()},onMore:(e,t)=>{let n=this.chart.getSelectedDrawingIds()[0];if(!n)return;let r=this.chartOffset();this.openDrawingMenu(n,e-r.x,t-r.y)},onDelete:()=>{this.chart.removeDrawings(this.chart.getSelectedDrawingIds()),this.refreshObjects(),this.updateSelectionToolbar()}},this.t);for(let e of[`drawingCreate`,`drawingUpdate`,`drawingRemove`])this.chart.on(e,()=>this.refreshDrawingsState());this.chart.on(`historyChange`,e=>{let{canUndo:t,canRedo:n}=e.payload;this.toolbar?.setHistory(t,n)});for(let e of[`drawingSelect`,`drawingToolChange`,`toolModeChange`])this.chart.on(e,()=>this.updateSelectionToolbar());for(let e of[`drawingUpdate`,`drawingRemove`,`historyChange`,`visibleRangeChange`,`priceRangeChange`,`zoomChange`,`resize`,`paneResize`,`paneChange`,`dataUpdate`,`replayStep`,`chartTypeChange`])this.chart.on(e,()=>this.scheduleSelectionToolbar());if(this.chartMenu=new k(this.root,this.t(`chartMenu.label`),this.t(`common.back`)),this.chart.on(`symbolSeriesRequest`,e=>void this.loadSymbolSeries(e.payload.symbol)),this.chart.on(`chartContextMenu`,e=>{if(!this.featureState[`menu.chart`])return;let{area:t,x:n,y:r,price:i,time:a,pane:o}=e.payload,s=i===void 0?void 0:this.chart.roundPrice(i),c={...this.chartMenuContext(s),...o?{pane:this.chart.getPaneScale(o)}:{}};this.menuPane=o??null,this.openChartMenu(Xe(Ts(t,c,this.t),Re,this.featureState),n,r,{area:t,price:s,time:a})}),this.chart.on(`priceAxisAdd`,e=>{if(!this.featureState[`menu.priceAxisAdd`])return;let{price:t,x:n,y:r}=e.payload,i=this.chart.roundPrice(t),a=Xe(ys(this.chartMenuContext(i),this.t),Re,this.featureState);this.openChartMenu(a,n,r,{area:`priceAxisAdd`,price:i})}),this.chart.on(`signalMarkerHover`,e=>this.showMarkerTip(e.payload)),this.intervalInput=new fc(this.chartContainer,{title:this.t(`interval.title`),hint:this.t(`interval.hint`),invalid:this.t(`interval.invalid`)},e=>this.selectTypedTimeframe(e)),a.layouts!==!1&&this.setupLayouts(a.layouts===!0||a.layouts===void 0?{}:a.layouts),a.trading!==!1){this.orderTicket=new tc(this.root,{onSubmit:e=>{this.chart.placeOrderIntent(e),this.say(t.r(this.t(`ticket.sent`),{side:this.t(e.side===`buy`?`ticket.buy`:`ticket.sell`),quantity:e.quantity??1,price:this.formatAlertPrice(e.price)}))},formatPrice:e=>this.formatAlertPrice(e),formatAmount:e=>this.formatMoney(e),formatNumber:(e,t)=>this.formatNumber(e,t)},this.t),this.accountPanel=new Vs(v,{onClosePosition:e=>this.chart.closePositionIntent(e),onReversePosition:e=>this.chart.reversePositionIntent(e),onCancelOrder:e=>this.chart.cancelOrderIntent(e),onNewOrder:()=>this.openOrderTicket(),formatPrice:e=>this.formatAlertPrice(e),formatTime:e=>{let{date:t,time:n}=Z(e,this.displayTimezone());return`${t} ${n}`},formatAmount:e=>this.formatMoney(e),formatNumber:(e,t)=>this.formatNumber(e,t),onToggle:e=>{this.toolbar?.setActive(`account`,e),this.refreshAccount()}},this.t);for(let e of[`ordersChange`,`positionsChange`,`executionFill`,`dataUpdate`,`indicatorUpdate`])this.chart.on(e,()=>this.refreshAccountSoon())}if(a.trading!==!1){if(this.bracketBar=new _l(this.chartContainer,{onConfirm:()=>this.chart.confirmBracket(),onCancel:()=>{this.chart.cancelBracket(),this.bracketBar?.hide()}},this.t),this.chart.on(`bracketPlace`,e=>{let n=e.payload;this.bracketBar?.hide(),this.say(t.r(this.t(n.side===`buy`?`bracket.longPlaced`:`bracket.shortPlaced`),{rr:n.riskReward.toFixed(2)}))}),a.depthLadder){this.depthLadder=new xl(this.root,{onTrade:(e,n)=>{this.chart.placeOrderIntent({side:e,type:`limit`,price:n}),this.say(t.r(this.t(e===`buy`?`order.buyLimit`:`order.sellLimit`),{price:this.formatAlertPrice(n)}))},formatPrice:e=>this.formatAlertPrice(e),priceStep:e=>this.chart.getPriceStep(e),onToggle:e=>this.toolbar?.setActive(`ladder`,e),onClose:()=>this.closePanelByHand(`depthLadder`)},void 0,this.t);let e=this.depthLadder;this.chart.on(`ordersChange`,()=>e.setOrders(this.chart.getOrders()))}this.chart.on(`dataUpdate`,e=>{e.payload.kind===`bracket`&&this.bracketBar?.hide()})}this.alertsPanel=new Wi(this.root,{onClose:()=>this.closePanelByHand(`alerts`),onAdd:({price:e,condition:t,message:n,channel:r,label:i,options:a})=>{try{return this.chart.addAlert(e,t,n,r,i,a),!0}catch{return this.say(this.t(`alerts.invalid`),`error`),!1}},formatTime:e=>{let{date:t,time:n}=Z(e,this.displayTimezone());return`${t} ${n}`},onRemove:e=>this.chart.removeAlert(e),onClear:()=>this.chart.clearAlerts(),getChannelValue:e=>this.getAlertChannelValue(e),formatPrice:e=>this.formatAlertPrice(e)},this.t),this.chart.on(`alertAdd`,()=>this.refreshAlerts()),this.chart.on(`alertRemove`,()=>this.refreshAlerts()),this.chart.on(`alertUpdate`,()=>this.refreshAlerts()),this.chart.on(`alertExpired`,e=>{let n=e.payload;this.refreshAlerts(),this.featureState.alerts&&this.say(t.r(this.t(`alerts.expiredToast`),{text:n.message??this.alertText(n)}))}),a.alertNotifications&&(this.alertNotifier=new vl(a.alertNotifications)),this.chart.on(`alertTriggered`,e=>{let n=e.payload;if(this.refreshAlerts(),!this.featureState.alerts)return;let r=`${this.alertText(n)}${n.message?` — ${n.message}`:``}`;this.say(t.r(this.t(`alerts.fired`),{text:r}),`info`,`bell`),this.alertNotifier?.notify(r)}),this.indicatorPicker=new Ua(this.overlayHost,{onAdd:e=>this.handleAddIndicator(e),onFavorite:(e,t)=>t?this.indicatorFavorites.add(e):this.indicatorFavorites.remove(e),templates:{onApply:e=>this.applyIndicatorTemplate(e),onDelete:e=>{this.templates.remove(e),this.indicatorPicker?.setTemplates(this.templateNames())},onSave:()=>this.promptSaveIndicatorTemplate()},onClose:()=>this.toolbar?.setIndicatorsOpen(!1)},this.t),this.indicatorSettings=new Ia(this.root,{onApply:(e,t)=>{this.chart.updateIndicator(e,t),this.syncIndicatorsFromChart()},onStyle:(e,t)=>this.chart.updateIndicatorStyle(e,t),onLevels:(e,t)=>this.chart.setIndicatorLevels(e,t),onScale:(e,t)=>this.chart.setIndicatorScale(e,t),onIntervals:(e,t)=>this.chart.setIndicatorIntervals(e,t),onSaveDefault:(e,t)=>this.saveIndicatorDefault(e,t),onClose:()=>this.chart.endIndicatorEdit()},this.t),this.objectTree=new pa(this.root,{onClose:()=>this.closePanelByHand(`objectTree`),onRemoveIndicator:e=>this.handleRemoveIndicator(e),onConfigureIndicator:e=>this.openIndicatorSettings(e),onToggleIndicatorVisible:(e,t)=>{this.chart.setIndicatorVisible(e,t),this.refreshObjects(),this.scheduleLegend()},onRemoveDrawing:e=>{this.drawingSettings?.editing()===e&&this.drawingSettings.close(!0),this.chart.removeDrawing(e),this.refreshObjects()},onConfigureDrawing:this.drawingSettings?e=>this.openDrawingSettings(e):void 0,onToggleDrawingVisible:(e,t)=>{this.chart.setDrawingVisible(e,t),this.refreshObjects()},onToggleDrawingLocked:(e,t)=>{this.chart.setDrawingLocked(e,t),this.refreshObjects()},onToggleGroupVisible:(e,t)=>{this.chart.setDrawingGroupVisible(e,t),this.refreshObjects()},onToggleGroupLocked:(e,t)=>{this.chart.setDrawingGroupLocked(e,t),this.refreshObjects()},onUngroup:e=>{this.chart.ungroupDrawings(e),this.refreshObjects()},onRenameGroup:(e,t)=>{this.chart.renameDrawingGroup(e,t),this.refreshObjects()},onAddCompare:p.compareSymbols===!1?void 0:()=>this.handleAddCompare(),onRemoveCompare:e=>this.removeCompared(e)},this.t);let b=()=>{this.objectTree?.isOpen()&&this.refreshObjects()},re=0,x=()=>{re||!this.objectTree?.isOpen()||(re=requestAnimationFrame(()=>{re=0,this.destroyed||b()}))};this.chart.on(`drawingCreate`,b),this.chart.on(`drawingRemove`,b),this.chart.on(`drawingUpdate`,x),this.chart.on(`timeframeChange`,x),this.chart.on(`indicatorAdd`,b),this.chart.on(`indicatorRemove`,b),this.chart.on(`indicatorChange`,b);for(let e of[`indicatorAdd`,`indicatorRemove`,`indicatorChange`])this.chart.on(e,()=>this.refreshCompareDialog());this.setupDock(),this.commandPalette=new fr({onIndicator:e=>this.handleAddIndicator(e),onChartType:e=>this.handleChartType(e),onDrawingTool:e=>this.handleDrawingTool(e),onTimeframe:e=>this.handleTimeframe(e),onAction:e=>this.handleAction(e),onClose:()=>{}},this.overlayHost,this.t,{list:()=>ju(),add:e=>Mu([e,...ju().filter(t=>t!==e)])}),this.boundGlobalKeydown=e=>{if(this.handleHostHotkey(e)||this.featureState.hotkeys&&this.replayBar?.isMounted()&&this.handleReplayKey(e))return;let t=Y(this.root),n=e=>this.featureState.hotkeys&&this.featureState[e];if((e.ctrlKey||e.metaKey)&&e.key===`k`){if(!t||!n(`hotkeys.commandPalette`)||!this.featureState.commandPalette)return;e.preventDefault(),this.toggleCommandPalette()}else if((e.ctrlKey||e.metaKey)&&(e.key===`p`||e.key===`P`)){if(!t||!n(`hotkeys.symbolSearch`)||!this.featureState.symbolSearch)return;e.preventDefault(),this.openSymbolSearch()}else if((e.ctrlKey||e.metaKey)&&!e.altKey&&!e.shiftKey&&(e.key===`s`||e.key===`S`)){if(!this.layoutSession||!n(`hotkeys.save`)||!this.featureState.layouts||X()||!Y(this.root,!0))return;e.preventDefault(),this.saveLayout()}else if(e.altKey&&!e.ctrlKey&&!e.metaKey&&!e.shiftKey&&ki[e.code]){if(e.defaultPrevented||X()||!t||vu()||!n(`hotkeys.tools`))return;e.preventDefault(),this.handleDrawingTool(ki[e.code])}else if(/^[0-9]$/.test(e.key)&&!e.ctrlKey&&!e.metaKey&&!e.altKey){if(e.defaultPrevented||!this.intervalInput||!n(`intervalTyping`)||X()||vu()||!Y(this.root,!0))return;let t=document.activeElement;if(t&&t!==document.body&&!this.root.contains(t))return;e.preventDefault(),this.intervalInput.open(e.key)}else if(lu(e)!==null){if(e.defaultPrevented||!n(`symbolTyping`)||!this.featureState.symbolSearch||X()||vu()||!Y(this.root,!0))return;let t=document.activeElement;if(t&&t!==document.body&&!this.root.contains(t))return;e.preventDefault(),this.openSymbolSearch(lu(e))}else if(e.altKey&&!e.ctrlKey&&!e.metaKey&&(e.code===`KeyI`||e.code===`KeyG`||e.code===`KeyR`)){if(X()||!t)return;if(e.code===`KeyI`){if(!n(`hotkeys.invertScale`))return;e.preventDefault(),this.changeSettings({invertScale:!this.settingsState.invertScale}),this.settings?.refresh(this.shownSettings())}else if(e.code===`KeyR`){if(!n(`hotkeys.resetView`))return;e.preventDefault(),this.resetView()}else this.goToDate&&n(`hotkeys.goToDate`)&&this.featureState.goToDate&&(e.preventDefault(),this.toggleGoToDate())}else if(e.key===`?`&&!e.ctrlKey&&!e.metaKey&&!e.altKey){if(X()||!t||!n(`hotkeys.help`)||!this.featureState.hotkeySheet)return;e.preventDefault(),this.openHotkeySheet()}},document.addEventListener(`keydown`,this.boundGlobalKeydown),document.addEventListener(`fullscreenchange`,this.onFullscreenChange),this.unregisterKeys=_c(this.root,[this.portal]),this.restoreKeptSettings(),a.adapter?(this.adapter=a.adapter,this.connectStream()):this.chart.setDataTimeframe(this.state.timeframe),this.watchlist&&(this.watchlistInterval=setInterval(()=>this.tickWatchlist(),1e3)),this.markSwitchedOff(),requestAnimationFrame(()=>{this.destroyed||(this.toolbar?.tidy(),this.sidebar?.tidy())}),this.refreshMarket(),this.updateUI(),queueMicrotask(()=>{if(!this.destroyed)try{a.onReady?.(this.chart,this)}finally{this.destroyed||this.restoreSharedView()}})}restoreSharedView(){if(!this.options.shareUrl||typeof location>`u`)return;let e=Il(location.hash);e&&this.importState(e)}setSymbols(e){let t=Yt(e);this.symbols=t.names,this.symbolCatalog=t.info;let n=this.watchlistStore;n&&this.watchlistFromSymbols&&n.replace(n.getLists().map(e=>e.id===`default`?{...e,symbols:t.names}:e)),this.refreshSymbolTitle(),this.refreshSymbolInfo()}symbolEntries(){return this.symbols.map(e=>this.symbolCatalog.get(e)??e)}chartSymbolInfo(){let e=this.chart.getSymbolInfo(),t=e&&e!==this.chartInfoAtSwitch?e:tn(this.state.symbol,e);return t?Xt(t,this.state.symbol):null}displayInfo(){return Qt(this.symbolCatalog.get(this.state.symbol),this.chartSymbolInfo())??null}refreshSymbolTitle(){this.toolbar?.setSymbolDescription(nn(this.displayInfo()))}getWatchlists(){return this.watchlistStore?.getLists()??[]}getActiveWatchlist(){return this.watchlistStore?.getActive().id??null}setWatchlists(e,t){this.watchlistFromSymbols=!1,this.watchlistStore?.replace(e,t)}setActiveWatchlist(e){this.watchlistStore?.setActive(e)}addToWatchlist(e,t){this.watchlistStore?.add(e,t)}removeFromWatchlist(e,t){this.watchlistStore?.removeSymbol(e,t)}setQuotes(e){let t=e.map(n.readQuote).filter(e=>e!==null);t.length>0&&this.takeQuotes(t)}getQuote(e){let t=this.quotes.get(e);return t?{...t}:null}openPanel(e){return!this.hasPanel(e)||!this.dock?!1:(this.dock.open(e),this.dock.current()===e)}hasPanel(e){return e===`watchlist`?this.watchlist!==null:e===`depthLadder`&&this.depthLadder===null?!1:this.featureState[ou[e]]}closePanel(){this.dock?.close()}getOpenPanel(){return this.dock?.current()??null}toggleSymbolInfo(e){let t=this.symbolInfoPanel;if(!t)return;let n=e??!t.isOpen();n&&!this.featureState.symbolInfo||(n?this.dock?.open(`symbolInfo`):this.dock?.closePage(`symbolInfo`))}refreshMarket(){if(Tu())return;let e=(0,n.marketStatus)(this.chart.getSymbolInfo(),Date.now()),t=e.state===`open`;this.statusBar?.setMarket(e.state,this.t(t?`symbolInfo.open`:`symbolInfo.closed`),this.t(t?`statusBar.marketOpen`:`statusBar.marketClosed`)),this.refreshSymbolInfo()}refreshSymbolInfo(){let e=this.symbolInfoPanel;!e?.isOpen()||this.destroyed||e.render(this.symbolInfoView())}symbolInfoView(){let e=this.state.symbol;return Si({symbol:e,info:this.chart.getSymbolInfo(),names:this.displayInfo(),quote:this.quotes.get(e),bars:this.chart.getData(),formatPrice:e=>this.formatAlertPrice(e),t:this.t,textLocale:this.textLocale(),numberLocale:this.intlLocale(),now:Date.now()})}loadNews(){let e=this.symbolInfoPanel;if(!e?.isOpen())return;let t=this.options.adapter,n=this.options.news??(t?.fetchNews?t.fetchNews.bind(t):null);this.news.load(this.state.symbol,n,t=>e.renderNews(t),this.textLocale(),()=>this.destroyed)}intlLocale(){return this.settingsState.numberLocale||this.options.locale||`en`}textLocale(){return this.options.locale||`en`}createWatchlist(e,t){let n=t.persist?Iu():null,r=new gi({lists:t.lists,activeList:t.activeList,symbols:this.symbols,defaultName:this.t(`watchlist.title`),storage:n,storageKey:t.storageKey});this.watchlistStore=r,this.watchlistFromSymbols=!t.lists&&!t.persist,this.quoteSource=t.quotes===!1?null:t.quotes??(this.options.adapter?.subscribeQuotes?this.options.adapter:null);let i=e=>this.t(e);this.watchlist=new ai(e,{onSelect:e=>{this.setSymbol(e)},onAdd:()=>this.symbolSearch?.open({symbols:this.symbolEntries(),current:this.state.symbol,currentInfo:this.chartSymbolInfo(),onPick:e=>r.add(e),search:this.symbolSearchFn()}),onRemove:e=>r.removeSymbol(e),onMove:(e,t)=>r.move(e,t),onPickList:e=>r.setActive(e),onCreateList:e=>r.create(e),onRenameList:(e,t)=>r.rename(e,t),onDeleteList:e=>r.remove(e),onClose:()=>this.closePanelByHand(`watchlist`)},{close:i(`common.close`),title:i(`watchlist.title`),lists:i(`watchlist.lists`),newList:i(`watchlist.newList`),rename:i(`watchlist.rename`),deleteList:i(`watchlist.deleteList`),confirmDelete:i(`watchlist.confirmDelete`),add:i(`watchlist.add`),remove:i(`watchlist.remove`),empty:i(`watchlist.empty`),listName:i(`watchlist.listName`)}),this.watchlist.setActive(this.state.symbol),this.watchlist.setLocale(this.settingsState.numberLocale||void 0);let a=()=>{this.watchlist?.setLists(r.getLists(),r.getActive().id),this.followQuotes()};r.subscribe(()=>{a(),t.onChange?.(r.getLists(),r.getActive().id)}),a()}followQuotes(){if(!this.quoteSource||!this.watchlistStore||this.destroyed)return;let e=this.watchlistStore.getActive().symbols,t=[...e].sort().join(`\0`);if(t!==this.quotedKey&&(this.quotedKey=t,this.stopQuotes?.(),this.stopQuotes=null,e.length!==0))try{this.stopQuotes=this.quoteSource.subscribeQuotes(e,e=>{if(this.destroyed||!Array.isArray(e))return;let t=e.map(n.readQuote).filter(e=>e!==null);t.length>0&&this.takeQuotes(t)})}catch{this.stopQuotes=null}}takeQuotes(e){for(let t of e){let e={...this.quotes.get(t.symbol),...t};this.quotes.set(e.symbol,e);let n=this.watchlistSparkBuffer.get(e.symbol)??[];n.push(e.last),n.length>40&&n.shift(),this.watchlistSparkBuffer.set(e.symbol,n);let r=this.hostWatchlistRefPrice.get(e.symbol);this.watchlist?.setEntry(e.symbol,{lastPrice:e.last,refPrice:r??(e.change===void 0?void 0:e.last-e.change),sparkline:n.slice()})}e.some(e=>e.symbol===this.state.symbol)&&this.refreshSymbolInfo()}async setSymbol(e){this.flushActiveLayout(),e!==this.state.symbol&&(this.chart.clearFills(),this.chartInfoAtSwitch=this.chart.getSymbolInfo()),this.state={...this.state,symbol:e},this.sessionRefPrice=null,this.options.onSymbolChange?.(e),this.updateUI(),this.refreshSymbolTitle(),this.watchlist?.setActive(e),this.refreshMarket(),this.loadNews(),this.layoutSession?.changed(),this.adapter&&await this.connectStream()}setWatchlistEntry(e,t){t.refPrice!==void 0&&this.hostWatchlistRefPrice.set(e,t.refPrice),this.watchlist?.setEntry(e,t)}tickWatchlist(){if(!this.watchlist||this.quotes.has(this.state.symbol)||Tu())return;let e=this.chart.getData();if(e.length===0)return;let t=e[e.length-1],n=this.hostWatchlistRefPrice.get(this.state.symbol);n===void 0&&this.sessionRefPrice===null&&(this.sessionRefPrice=e[0].open);let r=this.watchlistSparkBuffer.get(this.state.symbol)??[];r.push(t.close),r.length>40&&r.shift(),this.watchlistSparkBuffer.set(this.state.symbol,r),this.watchlist.setEntry(this.state.symbol,{lastPrice:t.close,refPrice:n??this.sessionRefPrice??e[0].open,sparkline:r.slice()})}async setTimeframe(e){this.chart.isTimeframeAllowed(e)&&(this.chosenTimeframe=e,this.rangeSeq++,await this.switchTimeframe(e))}async switchTimeframe(e){if(this.state={...this.state,timeframe:e},this.options.onTimeframeChange?.(e),this.updateUI(),this.layoutSession?.changed(),this.adapter){await this.connectStream();return}if(this.chart.setDataTimeframe(e),this.options.resampleTimeframes!==!1){if(!this.baseSeries){let e=this.chart.getData();e.length>0&&(this.baseSeries=e,this.baseTimeframeMs=a(e))}await this.switchLocalTimeframe()}}setTheme(e){let t=this.resolveIsDark(e),n=this.resolveTheme(e);this.themeOf={...this.themeOf,[t?`dark`:`light`]:n},this.state={...this.state,isDark:t},this.root.dataset.tcwTheme=t?`dark`:`light`,this.portal.dataset.tcwTheme=this.root.dataset.tcwTheme,this.keepingLook(()=>this.chart.setTheme(n)),this.updateUI()}getChart(){return this.chart}setUI(e){this.ui=U(e),W(this.root,this.ui),W(this.portal,this.ui),this.applyChartShapes(),this.applyLegendFont(),this.applyChartLook()}getUI(){return U({...this.ui})}applyLegendFont(){this.chart.setLegend({fontFamily:this.ui.font.mono,fontSize:Qi(this.ui.font.size,-1)})}applyChartLook(){let e=this.ui.density===`airy`,t=this.options.chartOptions;if(t?.barLayout||this.chart.setBarLayout(e?`golden`:`classic`),!t?.font?.family){if(e){this.chart.setFont({family:this.ui.font.mono});return}this.chart.setFont(null),t?.font&&this.chart.setFont(t.font)}}applyChartShapes(){this.chart.setShapes({tagRadius:this.ui.tagRadius})}destroy(){if(!this.destroyed){this.destroyed=!0,this.stopKeyboardInset?.(),this.stopKeyboardInset=null,this.stopNarrow?.(),this.dockObserver?.disconnect(),this.stopNarrow=null,this.stopFormControls?.(),this.stopFormControls=null,this.boundGlobalKeydown&&document.removeEventListener(`keydown`,this.boundGlobalKeydown),document.removeEventListener(`fullscreenchange`,this.onFullscreenChange),this.unregisterKeys(),this.tooltip.destroy(),this.legendFrame&&cancelAnimationFrame(this.legendFrame),this.indicatorLegend?.destroy(),this.portal.remove(),document.fullscreenElement===this.root&&document.exitFullscreen().catch(()=>{}),this.flushActiveLayout(),this.commandPalette?.destroy(),this.symbolSearch?.destroy(),this.hotkeySheet?.destroy(),this.replayPollInterval&&clearInterval(this.replayPollInterval),this.replayShade?.remove(),this.replayBar?.destroy(),this.dragDrop?.detach(),this.alertsPanel?.destroy(),this.objectTree?.destroy(),this.indicatorSettings?.destroy(),this.indicatorPicker?.destroy(),this.drawingStyle?.destroy(),this.drawingSettings?.destroy(),this.drawingMenu?.destroy(),this.selectionToolbar?.destroy(),this.selectionToolbarFrame!==null&&cancelAnimationFrame(this.selectionToolbarFrame),this.chartMenu?.destroy(),this.legendMenu?.destroy();for(let e of this.hostMenus)e.destroy();this.hostMenus.clear(),this.templatePrompt?.destroy(),this.chartTemplatePrompt?.destroy(),this.drawingTemplatePrompt?.destroy(),this.intervalInput?.destroy(),this.markerTip?.remove(),this.layoutSession?.destroy(),this.layoutsUI?.destroy(),this.settingsListeners.clear(),this.accountPanel?.destroy(),this.orderTicket?.destroy(),this.accountFrame&&cancelAnimationFrame(this.accountFrame),this.bracketBar?.destroy(),this.alertNotifier?.destroy(),this.depthLadder?.destroy(),this.dataWindow?.destroy(),this.watchlistInterval&&clearInterval(this.watchlistInterval),this.marketTimer&&clearInterval(this.marketTimer),this.clockTimer&&clearInterval(this.clockTimer),this.onPageShown&&document.removeEventListener(`visibilitychange`,this.onPageShown),this.onPageShown=null,this.chartNav?.destroy(),this.symbolInfoPanel?.destroy(),this.dock?.destroy(),this.stopQuotes?.(),this.stopQuotes=null,this.watchlist?.destroy(),this.toolbar?.destroy(),this.sidebar?.destroy(),this.settings?.destroy(),this.statusBar?.destroy(),this.goToDate?.destroy(),this.loading.destroy(),this.historyPill.destroy(),this.chart.destroy(),this.root.remove(),et()}}handleSymbolClick(){this.featureState.symbolSearch&&this.openSymbolSearch()}openSymbolSearch(e){this.symbolSearch?.open({symbols:this.symbolEntries(),current:this.state.symbol,currentInfo:this.chartSymbolInfo(),search:this.symbolSearchFn(),query:e,hint:this.sheetKeyOn(`symbolTyping`)?this.t(`symbolSearch.typeHint`):void 0})}symbolSearchFn(){if(this.options.searchSymbols)return this.options.searchSymbols;let e=this.adapter;if(e?.searchSymbols)return(t,n)=>e.searchSymbols(t,{signal:n,limit:50})}handleTimeframe(e){this.setTimeframe(e)}applyRangePreset(e){let t=++this.rangeSeq;return this.rangeQueue=this.rangeQueue.then(()=>this.runRangePreset(e,t)).catch(e=>{this.say(e instanceof Error?e.message:String(e),`error`)}),this.rangeQueue}async runRangePreset(e,t){let n=()=>t===this.rangeSeq&&!this.destroyed;if(!n())return;this.chosenTimeframe??=this.state.timeframe;let r=this.featureState[`statusBar.rangeTimeframe`]?this.timeframeForPreset(e):this.state.timeframe;r!==this.state.timeframe&&(await this.switchTimeframe(r),!n()||this.adapter&&this.state.connectionState===`error`)||this.chart.setVisibleRangePreset(e)}timeframeForPreset(e){let t=this.state.timeframe,i=this.chart.getData();if(i.length<2)return t;let a=(0,n.barTimeUnit)(i),o=i[i.length-1].time*a,s=e===`All`?i[0].time*a:(0,r.rangePresetStart)(e,o,this.displayTimezone());if(s===null)return t;let c=i.length-1;for(;c>0&&i[c-1].time*a>=s;)c--;let l=this.displayTimezone();return Rt({dayShare:i.slice(-Eu).some(e=>{let t=e.time*a,r=new Date(t+(0,n.offsetAt)(l,t)*6e4).getUTCDay();return r===0||r===6})?1:5/7,spanMs:o-s,barsInSpan:i.length-c,width:this.chart.getPlotRect().width,current:t,chosen:this.chosenTimeframe??t,available:this.timeframes.filter(e=>this.chart.isTimeframeAllowed(e)&&this.canShowTimeframe(e))})}canShowTimeframe(e){if(this.adapter)return(0,r.servesTimeframe)(this.adapter,e);if(this.options.resampleTimeframes===!1)return!1;let t=this.chart.getData();if(t.length<2)return!1;let i=this.baseSeries?this.baseTimeframeMs:a(t);return!(i>0)||(0,n.timeframeToMs)(e)>=i}toggleFullscreen(){if(document.fullscreenElement===this.root){document.exitFullscreen().catch(()=>{});return}this.root.requestFullscreen().catch(e=>{this.say(e instanceof Error?e.message:this.t(`toast.fullscreenUnavailable`),`error`)})}drawingToolName(e){let t=`tool.${e}`,n=this.t(t);return n===t?this.chart.getDrawingToolDescriptor(e)?.name??e:n}chartOffset(){let e=this.chartContainer.getBoundingClientRect(),t=this.root.getBoundingClientRect();return{x:e.left-t.left,y:e.top-t.top}}scheduleSelectionToolbar(){this.selectionToolbarFrame!==null||!this.selectionToolbar?.isOpen()||(this.selectionToolbarFrame=requestAnimationFrame(()=>{this.selectionToolbarFrame=null,this.updateSelectionToolbar()}))}updateSelectionToolbar(){let e=this.selectionToolbar;if(!e||this.destroyed)return;let t=this.chart.getSelectedDrawingIds();if(!this.featureState.selectionToolbar||!t?.length){e.hide();return}let n=new Set(t),r=this.chart.getDrawings().filter(e=>n.has(e.id)&&this.chart.isDrawingShown(e.id));if(this.chart.getDrawingTool()!==null||this.chart.isEraserMode()||this.chart.isZoomAreaMode()||r.length===0){e.hide();return}let i=this.chartOffset(),a=this.chart.getPlotRect(),o=Lu(r.map(e=>this.chart.getDrawingRect(e.id)))??{x:a.x+a.width/2,y:a.y,width:0,height:0},s=r[0];e.show({rect:{x:o.x+i.x,y:o.y+i.y,width:o.width,height:o.height},bounds:{x:a.x+i.x,y:a.y+i.y,width:a.width,height:a.height},style:s.style,locked:r.every(e=>e.locked),canDelete:r.some(e=>!e.locked),canSettings:this.drawingSettings!==null&&this.featureState.drawingSettings&&r.length===1,canAlert:this.featureState.alerts&&r.length===1&&this.chart.canAddDrawingAlert(s.id)})}openDrawingSettings(e){let t=this.chart.getDrawings().find(t=>t.id===e),n=t?this.chart.getDrawingToolDescriptor(t.type):null;!t||!n||!this.drawingSettings||!this.featureState.drawingSettings||this.drawingSettings.open({id:e,type:t.type,name:this.drawingToolName(t.type),style:{...t.style},options:this.chart.getDrawingOptions(e),defs:n.options??{},anchors:t.anchors.map(e=>({...e})),fill:n.fill===!0,text:n.text===!0,intervals:t.intervals??null})}promptSaveDrawingTemplate(e,n){this.drawingTemplatePrompt??=new oc(this.root,this.t),this.drawingTemplatePrompt.open({title:this.t(`drawingSettings.saveTemplateTitle`),submitLabel:this.t(`common.save`),placeholder:this.drawingToolName(n.type),onSubmit:r=>{e.save(r,n.style,{type:n.type,options:n.options}),this.say(t.r(this.t(`templates.saved`),{name:r.trim()}))}})}addDrawingAlert(e){if(!this.featureState.alerts)return;let n=this.chart.getDrawings().find(t=>t.id===e),r=n?this.drawingToolName(n.type):``;this.chart.addDrawingAlert(e,{label:r})&&this.say(t.r(this.t(`drawingSettings.alertAdded`),{name:r}))}openDrawingMenu(e,t,n){if(!this.drawingMenu||!this.featureState[`menu.drawing`])return;let r=new Map(this.chart.getDrawings().map(e=>[e.id,e])),i=this.chart.getSelectedDrawingIds().flatMap(e=>{let t=r.get(e);return t?[{id:t.id,locked:t.locked,groupId:t.group?.id??null}]:[]});if(i.length===0)return;let a=Xe(ps({selected:i,canConfigure:this.drawingSettings!==null,canAlert:this.chart.canAddDrawingAlert(e)},this.t),ze,this.featureState),o=i.map(e=>e.id),s=r.get(e),c=s?this.options.drawingMenuItems?.({id:e,type:s.type,selected:o})??[]:[],l=Ul(a,c);if(l.length===0)return;let u=this.chartContainer.getBoundingClientRect(),d=this.root.getBoundingClientRect();this.drawingMenu.open(l,u.left-d.left+t,u.top-d.top+n,t=>{Wl(t,c)||this.runDrawingMenuAction(e,o,t)})}runDrawingMenuAction(e,t,n){switch(n){case`settings`:this.openDrawingSettings(e);return;case`alert`:this.addDrawingAlert(e);return;case`front`:case`forward`:case`backward`:case`back`:this.chart.moveDrawing(e,n);break;case`group`:this.chart.groupDrawings(t);break;case`ungroup`:{let e=new Set(this.chart.getDrawings().filter(e=>t.includes(e.id)).map(e=>e.group?.id));for(let t of e)t&&this.chart.ungroupDrawings(t);break}case`lock`:case`unlock`:this.chart.setDrawingsLocked(t,n===`lock`);break;case`hide`:this.chart.setDrawingsVisible(t,!1);break;case`duplicate`:this.chart.duplicateDrawing(e);break;case`delete`:{let e=this.drawingSettings?.editing();e&&t.includes(e)&&this.drawingSettings?.close(!0),this.chart.removeDrawings(t);break}}this.objectTree?.isOpen()&&this.refreshObjects()}chartMenuContext(e){let t=this.chart.getDrawings(),n=this.chart.getData(),r=this.settingsState,i=this.chart.getFeatures();return{price:e,lastPrice:n.length>0?n[n.length-1].close:null,formatPrice:e=>this.formatAlertPrice(e),canAlert:this.alertsPanel!==null,canTrade:this.options.trading!==!1,canOrderTicket:this.orderTicket!==null,canDraw:!0,hasDrawings:t.length>0,drawingsHidden:t.length>0&&t.every(e=>!e.visible),canPaste:this.chart.canPasteDrawings(),hasIndicators:i.indicators!==!1&&this.removableIndicators().length>0,canGoToDate:this.goToDate!==null,canExport:this.canExport,autoScale:this.chart.isAutoScale(),scaleMode:this.effectiveScaleMode(),canLog:i.logScale!==!1,inverted:this.chart.isInvertScale(),leftScale:r.leftPriceScale,labels:{values:r.indicatorValueLabels,...i.barCountdown===!1?{}:{countdown:r.barCountdown}},lines:{highLow:r.highLowLines,lastPrice:this.chart.getStyleValue(`lastPrice.visible`)!==!1},timezone:{current:r.timezone,options:this.timezoneChoices()},keys:Object.fromEntries(hs.filter(e=>this.featureState.hotkeys&&this.featureState[e.feature]).map(e=>[e.action,e.keys]))}}removableIndicators(){return this.chart.getActiveIndicators().filter(e=>!r.SYMBOL_INDICATOR_IDS.has(e.id)).map(e=>e.instanceId)}exchangeChoice(){let e=this.chart.getExchangeTimeZone()??null;if(!(e===null&&!this.adapter?.resolveSymbol))return{label:this.t(`settings.timezone.exchange`),zone:e}}timezoneChoices(){return f(this.settingsState.timezone,Date.now(),this.t(`settings.timezone.local`),this.exchangeChoice()).map(({value:e,label:t})=>({value:e,label:t}))}openChartMenu(e,t,n,r){if(!this.chartMenu)return;let i=this.options.chartMenuItems?.(r)??[],a=Ul(e,i);if(a.length===0)return;let o=this.chartContainer.getBoundingClientRect(),s=this.root.getBoundingClientRect();this.chartMenu.open(a,o.left-s.left+t,o.top-s.top+n,e=>{Wl(e,i)||(e.startsWith(`tz:`)?this.changeSettings({timezone:e.slice(3)}):this.runChartMenuAction(e,r))})}setFeatures(e){let t=this.featureState;this.featureState={...t,...Ve(e)};let n=e=>t[e]!==this.featureState[e];this.markSwitchedOff(),this.closeSwitchedOff(e=>t[e]&&!this.featureState[e]),n(`selectionToolbar`)&&this.updateSelectionToolbar(),n(`indicatorLegend`)&&(this.chart.setPaneTitlesVisible(!this.featureState.indicatorLegend),this.scheduleLegend()),n(`menu.priceAxisAdd`)&&this.chart.setFeatures({priceAxisAddButton:this.priceAxisAddDefault&&this.featureState[`menu.priceAxisAdd`]}),n(`dragDropImport`)&&(this.featureState.dragDropImport?this.dragDrop?.attach():this.dragDrop?.detach()),[`toolbar`,`sidebar`,`statusBar`,`accountPanel`].some(n)&&this.chart.resize()}getFeatures(){return{...this.featureState}}isFeatureOn(e){return this.featureState[e]===!0}closeSwitchedOff(e){e(`replay`)&&this.replayBar?.isMounted()&&this.exitReplay();let t=[[`alerts`,()=>this.dock?.closePage(`alerts`)],[`objectTree`,()=>this.dock?.closePage(`objectTree`)],[`symbolInfo`,()=>this.dock?.closePage(`symbolInfo`)],[`dataWindow`,()=>this.dock?.closePage(`dataWindow`)],[`accountPanel`,()=>this.toggleAccountPanel(!1)],[`orderTicket`,()=>this.orderTicket?.close()],[`depthLadder`,()=>this.dock?.closePage(`depthLadder`)],[`goToDate`,()=>this.goToDate?.close()],[`settings`,()=>this.settings?.close()],[`indicatorSettings`,()=>this.indicatorSettings?.close()],[`toolbar.indicators`,()=>this.indicatorPicker?.close()],[`drawingSettings`,()=>this.drawingSettings?.close(!1)],[`sidebar`,()=>this.drawingStyle?.close()],[`commandPalette`,()=>this.commandPalette?.close()],[`hotkeySheet`,()=>this.hotkeySheet?.close()],[`symbolSearch`,()=>this.symbolSearch?.close()],[`compare`,()=>{this.symbolSearch?.isComparing()&&this.symbolSearch.close()}],[`menu.chart`,()=>this.chartMenu?.close()],[`menu.priceAxisAdd`,()=>this.chartMenu?.close()],[`menu.drawing`,()=>this.drawingMenu?.close()],[`indicatorLegend`,()=>this.legendMenu?.close()],[`indicatorLegend.more`,()=>this.legendMenu?.close()]];for(let[n,r]of t)e(n)&&r()}addHotkey(e){let t=Jl(e.keys);if(!t)return console.warn(`[ChartWidget] Can't read the shortcut "${e.keys}": modifiers (Ctrl, Alt, Shift) and a key, joined by +.`),null;Zl(t)&&console.warn(`[ChartWidget] The chart answers ${e.keys} itself (drawings, scrolling or zoom): both will run.`);let n={spec:e,parsed:t};return this.hostHotkeys=[...this.hostHotkeys,n],{remove:()=>{this.hostHotkeys=this.hostHotkeys.filter(e=>e!==n)}}}handleHostHotkey(e){if(this.hostHotkeys.length===0||!this.featureState.hotkeys||e.isComposing||e.keyCode===yu||e.getModifierState?.(`AltGraph`)||e.defaultPrevented||X()||Ql(e)||vu())return!1;let t=this.hostHotkeys.find(t=>Yl(e,t.parsed));if(!t)return!1;let n=!t.parsed.ctrl&&!t.parsed.alt;if(!Y(this.root,n))return!1;let r=document.activeElement;return n&&r&&r!==document.body&&!this.root.contains(r)?!1:(e.preventDefault(),t.spec.onPress(e),!0)}keepingLook(e){this.settingsEdit&&this.settings?.close();let t=this.chart.getOverrides?.({layer:`user`})??{},n=Object.fromEntries(wu.filter(e=>t[e]!==void 0).map(e=>[e,t[e]]));e(),Object.keys(n).length>0&&this.chart.applyOverrides(n,{layer:`user`})}sheetKeyOn(e){let t=this.featureState;if(!t.hotkeys||!t[e])return!1;switch(e){case`hotkeys.commandPalette`:return t.commandPalette;case`hotkeys.symbolSearch`:return t.symbolSearch;case`hotkeys.goToDate`:return t.goToDate;case`hotkeys.save`:return t.layouts&&this.layoutSession!==null;case`hotkeys.help`:return t.hotkeySheet;case`intervalTyping`:return this.intervalInput!==null;case`symbolTyping`:return t.symbolSearch;default:return!0}}markSwitchedOff(){let e=Ue(this.featureState);for(let t of[this.root,this.portal])e?t.dataset.tcwOff=e:delete t.dataset.tcwOff;this.toolbar?.setSymbolSearch(this.featureState.symbolSearch),this.toolbar?.tidy(),this.sidebar?.tidy(),this.syncRail(),this.statusBar?.fit()}addToolbarButton(e){if(!this.toolbar)return null;let t=this.toolbar,n=t.addHostButton(e);return t.tidy(),{element:n,setActive:t=>fn(n,t,e.toggle===!0),setText:t=>void pn(n,e.label,t),remove:()=>{n.remove(),t.tidy()}}}addToolbarDropdown(e){let t=this.toolbar;if(!t)return null;let n=new k(this.root,e.label);this.hostMenus.add(n);let r=t.addHostButton({id:e.id,label:e.label,icon:e.icon,text:e.text,side:e.side,onClick:r=>{if(n.isOpen()){n.close();return}let i=e.items();if(i.length===0)return;let a=t.menuAnchor(r);n.openUnder(Ul([],i),a,e=>Wl(e,i))}});return r.setAttribute(`aria-haspopup`,`menu`),r.setAttribute(`aria-expanded`,`false`),t.tidy(),{element:r,setText:t=>void pn(r,e.label,t),remove:()=>{n.destroy(),this.hostMenus.delete(n),r.remove(),t.tidy()}}}addSidebarButton(e){let t=this.sidebar;if(!t)return null;let n=t.addHostButton(e);return{element:n,setActive:t=>fn(n,t,e.toggle===!0),remove:()=>{n.remove(),t.tidy()}}}addStatusBarItem(e){if(!this.statusBar)return null;let t=this.statusBar.addHostItem(e);return{element:t,setText:n=>{t.textContent=n,e.label&&e.label!==n?t.setAttribute(`aria-label`,`${e.label}: ${n}`):t.removeAttribute(`aria-label`)},remove:()=>t.remove()}}getSlot(e){switch(e){case`toolbar.left`:return this.toolbar?.hostSlot(`left`)??null;case`toolbar.right`:return this.toolbar?.hostSlot(`right`)??null;case`sidebar`:return this.sidebar?.hostSlot()??null;case`statusBar.left`:return this.statusBar?.hostSlot(`left`)??null;case`statusBar.right`:return this.statusBar?.hostSlot(`right`)??null;case`chart`:return this.hostLayer||(this.hostLayer=document.createElement(`div`),this.hostLayer.className=`tcw-host-layer`,this.chartContainer.appendChild(this.hostLayer)),this.hostLayer;default:return null}}runChartMenuAction(e,n){let{price:r}=n,i=r??NaN,a=this.settingsState,o=gs(e);if(o){this.changeSettings({scaleMode:o});return}switch(e){case`alert`:this.chart.addAlert(i,`crossing`),this.say(t.r(this.t(`chartMenu.alertAdded`),{price:this.formatAlertPrice(i)}));break;case`buyLimit`:case`sellLimit`:case`buyStop`:case`sellStop`:this.placeOrderAt(e,i);break;case`orderTicket`:this.openOrderTicket(r);break;case`exportData`:this.chart.exportAllData(`csv`,`${this.state.symbol}-${this.state.timeframe}.csv`.replace(/[^\w.-]+/g,`_`));break;case`paneLog`:case`paneInvert`:case`panePercent`:{let t=this.menuPane;if(!t)break;let n=this.chart.getPaneScale(t);this.chart.setPaneScale(t,e===`paneLog`?{log:!n.log}:e===`paneInvert`?{invert:!n.invert}:{percent:!n.percent});break}case`horizontalLine`:{let e=this.chart.getData();e.length>0&&this.chart.addDrawing({type:`horizontalLine`,anchors:[{time:e[e.length-1].time,price:i}]});break}case`resetView`:this.resetView();break;case`resetPriceScale`:this.changeSettings({autoScale:!0});break;case`paste`:this.chart.pasteDrawings();break;case`removeIndicators`:this.chart.removeIndicators(this.removableIndicators());break;case`hideDrawings`:this.chart.setDrawingsVisible(this.chart.getDrawings().map(e=>e.id),!1);break;case`showDrawings`:this.chart.setDrawingsVisible(this.chart.getDrawings().map(e=>e.id),!0);break;case`removeDrawings`:this.chart.removeDrawings(this.chart.getDrawings().map(e=>e.id));break;case`settings`:this.openSettings(n.area===`priceAxis`?`scales`:void 0);break;case`autoScale`:this.changeSettings({autoScale:!this.chart.isAutoScale()});break;case`invertScale`:this.changeSettings({invertScale:!this.chart.isInvertScale()});break;case`leftScale`:this.changeSettings({leftPriceScale:!a.leftPriceScale});break;case`indicatorValueLabels`:this.changeSettings({indicatorValueLabels:!a.indicatorValueLabels});break;case`barCountdown`:this.changeSettings({barCountdown:!a.barCountdown});break;case`highLowLines`:this.changeSettings({highLowLines:!a.highLowLines});break;case`lastPriceLine`:this.changeStyle({"lastPrice.visible":this.chart.getStyleValue(`lastPrice.visible`)===!1});break;case`goToDate`:this.toggleGoToDate();break}this.objectTree?.isOpen()&&this.refreshObjects()}toggleAccountPanel(e){let t=this.accountPanel;!t||e===t.isOpen()||!t.isOpen()&&!this.featureState.accountPanel||t.toggle()}openOrderTicket(e){if(!this.featureState.orderTicket)return;let t=this.chart.getData();this.orderTicket?.open({price:e,lastPrice:t.length>0?t[t.length-1].close:null,rules:this.orderRules(),symbol:this.state.symbol,step:e=>this.chart.getPriceStep(e),round:e=>this.chart.roundPrice(e)})}orderRules(){let e=this.chart.getMarket();return e?{roundPrice:e.priceStep!==void 0||(e.priceSteps?.length??0)>0?e=>this.chart.roundPrice(e):void 0,limits:this.chart.getPriceLimits(),lot:e.volumeUnit,multiplier:e.contractMultiplier}:{}}refreshAccountSoon(){this.accountFrame||!this.accountPanel||(this.accountFrame=requestAnimationFrame(()=>{this.accountFrame=0,this.destroyed||this.refreshAccount()}))}refreshAccount(){if(!this.accountPanel)return;let e=this.chart.getData(),t=e.length>0?e[e.length-1].close:null;this.accountPanel.update({positions:this.chart.getPositions(),orders:this.chart.getOrders(),fills:this.chart.getFills(),price:t,realisedPnl:this.chart.getRealisedPnl()}),this.orderTicket?.setLastPrice(t)}placeOrderAt(e,n){let r=e.startsWith(`buy`)?`buy`:`sell`,i=e.endsWith(`Stop`);this.chart.placeOrderIntent(i?{side:r,type:`stop`,price:n,stopPrice:n,quantity:1}:{side:r,type:`limit`,price:n,quantity:1}),this.say(t.r(this.t(`order.${e}`),{price:this.formatAlertPrice(n)}))}clockNow(){let e=Date.now(),t=this.displayTimezone(),r=e=>String(e).padStart(2,`0`),{time:i}=Z(e,t);return{time:`${i}:${r(new Date(e).getUTCSeconds())}`,zone:(0,n.tzLabel)((0,n.offsetAt)(t,e))}}refreshDrawingsState(){let e=this.chart.getDrawings()??[],t=e.length>0;this.sidebar?.setDrawingsState({locked:t&&e.every(e=>e.locked),hidden:t&&e.every(e=>!e.visible)})}refreshScaleSwitches(){this.statusBar?.setScale({mode:this.chart.getScaleMode(),auto:this.chart.isAutoScale()})}toggleScaleMode(e){this.changeSettings({scaleMode:this.chart.getScaleMode()===e?`regular`:e})}displayTimezone(){let e=u(this.settingsState.timezone);return e===`exchange`?this.chart.getEffectiveTimeZone():e}toggleGoToDate(){if(!this.goToDate||!this.featureState.goToDate)return;if(this.goToDate.isOpen()){this.goToDate.close();return}let e=this.chart.getData();if(e.length===0)return;let t=this.displayTimezone(),r=(0,n.barTimeUnit)(e),i=e=>Z(e*r,t),a=e[e.length-1].time,o=this.chart.getVisibleTimeRange()??{from:e[0].time,to:a},s=Z(Date.now(),t).date;this.goToDate.open({date:i(a),range:{from:i(o.from),to:i(o.to)},withTime:!((0,n.timeframeToMs)(this.state.timeframe)>=iu),max:s,today:s})}goTo(e){let t=this.chart.getData(),r=this.displayTimezone();if(t.length===0)return;let i=(0,n.barTimeUnit)(t);if(e.kind===`date`){let n=kc(e.date,e.time,r);if(n===null)return;this.chart.goToTime(n/i),n/i<t[0].time&&this.say(this.t(`range.beforeData`));return}let a=kc(e.from.date,e.from.time,r),o=kc(e.to.date,e.to.time,r);a===null||o===null||(this.chart.setVisibleRange(a/i,o/i),Math.min(a,o)/i<t[0].time&&this.say(this.t(`range.beforeData`)))}pinnedTimeframes(){let e=this.timeframeFavorites.list();return this.timeframes.filter(t=>e.includes(t))}timeframeMenu(){return this.timeframes.map(e=>({value:e,label:wt(e),custom:this.customTimeframes.has(e)}))}handleAddTimeframe(e){if(!this.featureState.customTimeframes)return!1;let t=Mt(e);return!t||!this.chart.isTimeframeAllowed(t)||this.adapter&&!(0,r.servesTimeframe)(this.adapter,t)||!this.adapter&&(0,n.tickBarCount)(t)!==null?!1:(this.timeframes.includes(t)||(this.customTimeframes.add(t),this.timeframeFavorites.add(t),this.timeframes=Nt(this.timeframes,[t]),this.toolbar?.setTimeframes(this.timeframeMenu(),this.pinnedTimeframes())),this.handleTimeframe(t),!0)}showMarkerTip(e){let{marker:n}=e;if(!n){this.markerTip&&(this.markerTip.hidden=!0);return}this.markerTip||(this.markerTip=document.createElement(`div`),this.markerTip.className=`tcw-marker-tip`,this.markerTip.setAttribute(`role`,`tooltip`),this.chartContainer.appendChild(this.markerTip));let r=n.direction===`long`?this.t(`account.long`):n.direction===`short`?this.t(`account.short`):this.t(`markers.neutral`),i=document.createElement(`strong`);i.textContent=n.label?`${n.label} · ${n.source}`:n.source;let a=document.createElement(`div`);a.textContent=`${r} · ${this.formatAlertPrice(n.price)} · ${t.r(this.t(`markers.confidence`),{pct:Math.round(n.confidence*100)})}`;let o=document.createElement(`div`),{date:s,time:c}=Z(n.time,this.displayTimezone());o.textContent=`${s} ${c}`,this.markerTip.replaceChildren(i,a,o),this.markerTip.hidden=!1;let l=this.chartContainer.getBoundingClientRect(),u=Math.min(e.x+12,Math.max(0,l.width-this.markerTip.offsetWidth-4)),d=Math.max(0,e.y-this.markerTip.offsetHeight-10);this.markerTip.style.left=`${u}px`,this.markerTip.style.top=`${d}px`}selectTypedTimeframe(e){return!this.chart.isTimeframeAllowed(e)||!this.timeframes.includes(e)&&!this.featureState.customTimeframes||this.adapter&&!(0,r.servesTimeframe)(this.adapter,e)?!1:(this.timeframes.includes(e)||(this.customTimeframes.add(e),this.timeframes=Nt(this.timeframes,[e]),this.toolbar?.setTimeframes(this.timeframeMenu(),this.pinnedTimeframes())),this.handleTimeframe(e),!0)}applyIndicatorTemplate(e){if(!this.featureState.indicatorTemplates)return;let n=this.templates.get(e);n&&(this.chart.applyIndicatorSetup(n.indicators),this.syncIndicatorsFromChart(),this.updateUI(),this.say(t.r(this.t(`templates.applied`),{name:n.name})))}promptSaveIndicatorTemplate(){if(this.featureState.indicatorTemplates){if(this.chart.getActiveIndicators().length===0){this.say(this.t(`templates.nothing`),`error`);return}this.templatePrompt??=new oc(this.root,this.t),this.templatePrompt.open({title:this.t(`templates.saveTitle`),submitLabel:this.t(`common.save`),placeholder:this.t(`templates.namePlaceholder`),onSubmit:e=>{try{this.templates.save(e,this.chart.getIndicatorSetup())}catch(e){throw this.say(this.t(`templates.saveFailed`),`error`),e}this.indicatorPicker?.setTemplates(this.templateNames()),this.say(t.r(this.t(`templates.saved`),{name:e}))}})}}handleRemoveTimeframe(e){this.customTimeframes.has(e)&&(this.customTimeframes.remove(e),this.timeframeFavorites.remove(e),this.timeframes=this.timeframes.filter(t=>t!==e),this.toolbar?.setTimeframes(this.timeframeMenu(),this.pinnedTimeframes()),this.updateUI())}handleToggleTimeframeFavorite(e){this.timeframeFavorites.toggle(e),this.toolbar?.setTimeframeFavorites(this.pinnedTimeframes()),this.updateUI()}setData(e){this.localSeq++,this.baseSeries=e,this.baseTimeframeMs=a(e),this.applyTimeframeData(),this.adapter||this.loading.end()}async switchLocalTimeframe(){if(!this.baseSeries)return;let e=++this.localSeq,t=this.lastLocalSwitchMs>=$l||this.baseSeries.length>=eu;try{if(t&&(this.loading.begin(this.chart.getData().length>0,!0),await nu(),e!==this.localSeq||this.destroyed))return;this.applyTimeframeData()}finally{e===this.localSeq&&this.loading.end()}}applyTimeframeData(){if(!this.baseSeries)return;let e=performance.now(),t=(0,n.timeframeToMs)(this.state.timeframe);if(this.baseTimeframeMs>0&&t>this.baseTimeframeMs){let e=this.chart.getExchangeTimeZone()??null;this.chart.setData(i(this.baseSeries,this.state.timeframe,this.resampleOptions(e))),this.builtInZone=e}else this.chart.setData(this.baseSeries),this.builtInZone=void 0;this.lastLocalSwitchMs=performance.now()-e}resampleOptions(e){return{weekStartsOn:this.options.weekStartsOn??1,timeZone:e??void 0}}rebuildForZone(){if(this.adapter||this.builtInZone===void 0)return;let e=this.chart.getExchangeTimeZone()??null;if(e===this.builtInZone)return;if(!(0,n.timeframeFollowsDays)(this.state.timeframe)){this.builtInZone=e;return}let t=this.timeToKeepInView();this.applyTimeframeData(),t!==null&&this.chart.scrollTo(t)}timeToKeepInView(){if(!this.chart.isTimeAligned())return null;let e=this.chart.getVisibleTimeRange(),t=this.chart.getData();if(!e||t.length<2||e.to>=t[t.length-1].time)return null;let n=t.findIndex(t=>t.time===e.from);return n<0?null:e.from-(t[n+1].time-e.from)/2}handleDataUpdate(e){if(e.kind===`bars`){e.length>0&&this.loading.isActive()&&(this.loading.end(),this.state.connectionState===`error`&&this.setConnectionState(`connected`,this.t(`status.live`)));return}if(e.kind===`error`){this.loading.isActive()&&(this.loading.fail(this.t(`status.connectionFailed`)),this.setConnectionState(`error`,e.error||this.t(`status.connectionFailed`)));return}if(e.kind===`connection`)switch(e.connection.state){case`connected`:this.loading.hasFailed()&&this.loading.end(),!this.loading.isActive()&&this.state.connectionState!==`connected`&&this.setConnectionState(`connected`,this.t(`status.live`));break;case`reconnecting`:this.loading.isActive()||this.setConnectionState(`connecting`,this.t(`status.connecting`));break;case`error`:this.loading.isActive()||this.setConnectionState(`error`,this.t(`status.connectionFailed`));break}}setConnectionState(e,t){this.state={...this.state,connectionState:e,connectionMessage:t},this.updateUI()}toggleLadder(){!this.depthLadder||!this.featureState.depthLadder||this.dock?.toggle(`depthLadder`)}toggleAlerts(){!this.alertsPanel||!this.featureState.alerts||this.dock?.toggle(`alerts`)}handleToggleFavorite(e){let t=this.favoritesStore.toggle(e);this.sidebar?.setFavorites(this.favoritesStore.list()),this.say(t?this.t(`toast.pinned`):this.t(`toast.unpinned`))}exportState(){let e=this.chart.getActiveIndicators().map(e=>({id:e.id,params:e.params})),t=this.getSettings(),n=ho(t,{..._e,...Object.fromEntries(Cu.map(e=>[e,this.settingsDefaults[e]]))});return Nl({v:1,symbol:this.state.symbol,timeframe:this.state.timeframe,chartType:this.state.chartType,scaleMode:t.scaleMode,indicators:e,drawings:this.chart.getDrawings(),...Object.keys(n).length>0?{settings:n}:{}})}showLinkSettings(e){let t=this.getSettings(),n=Object.keys(e),r=this.linkSettings,i={...Object.fromEntries(n.map(e=>[e,t[e]])),...r?.own};this.applySettings(e,!1),this.linkSettings={shown:{...r?.shown,...e},own:i},this.markSettingsTold()}ownSettings(e){let t=this.linkSettings;if(!t)return e;let n=Object.keys(t.shown).filter(n=>JSON.stringify(e[n])===JSON.stringify(t.shown[n]));return{...e,...Object.fromEntries(n.map(e=>[e,t.own[e]]))}}claimSettings(e){let t=this.linkSettings;if(!t)return;let n=new Set(e),r=e=>Object.fromEntries(Object.entries(e).filter(([e])=>!n.has(e))),i=r(t.shown);Object.keys(i).length!==Object.keys(t.shown).length&&(this.linkSettings=Object.keys(i).length>0?{shown:i,own:r(t.own)}:null,this.settingsPublished!==null&&!this.destroyed&&this.settingsStore?.save(this.ownSettings(this.getSettings()),this.settingsDefaults))}async importState(e){let t=Pl(e);if(!t)return!1;t.symbol&&t.symbol!==this.state.symbol&&await this.setSymbol(t.symbol),t.timeframe&&t.timeframe!==this.state.timeframe&&await this.setTimeframe(t.timeframe),t.chartType&&this.applyChartType(t.chartType);let{chartTypeOptions:n,...r}=this.allowedSettings({scaleMode:t.scaleMode,...G(t.settings,eo)}),i=this.overViewerTypeOptions(t.chartType,n);return this.showLinkSettings(i?{...r,chartTypeOptions:i}:r),this.settings?.refresh(this.shownSettings()),this.chart.applyIndicatorSetup(t.indicators.map((e,t)=>({id:e.id,instanceId:`shared_${t}`,params:e.params}))),this.chart.setDrawings(t.drawings),this.updateUI(),!0}overViewerTypeOptions(e,t){let n={...ro(e)?{[e]:{}}:{},...t};if(Object.keys(n).length!==0)return{...this.getSettings().chartTypeOptions,...n}}async copyChartImage(){let e=await this.chart.copyScreenshot();this.say(e?this.t(`toast.imageCopied`):this.t(`toast.imageCopyFailed`),e?`info`:`error`)}async copyShareLink(){let e=Ll(typeof location<`u`?location.href:``,this.exportState());try{await navigator.clipboard.writeText(e),this.say(this.t(`toast.linkCopied`))}catch{this.say(this.t(`toast.copyFailed`),`error`)}}setDepth(e){this.chart.setDepthData(e),this.depthLadder?.setData(e),e&&this.chart.pushDepthSnapshot(e)}startBracket(e){this.chart.startBracket(e)&&this.bracketBar?.show(e)}buildDataWindowModel(){let e=this.chart.getData(),t=this.lastHoverIndex;if(t===null||t<0||t>=e.length)return{ohlc:null,change:0,changePct:0,indicators:[]};let n=e[t],r=t>0?e[t-1].close:n.open,i=n.close-r,a=r===0?0:i/r*100,o=this.chart.getActiveIndicators().map(e=>{let n=this.chart.getIndicatorOutput(e.instanceId)?.series?.[t]??null,r=e.descriptor.plots?.map(e=>[e.key,e.title])??Object.keys(n??{}).map(e=>[e,e]),i=n?r.filter(([e])=>typeof n[e]==`number`&&Number.isFinite(n[e])).map(([e,t])=>({key:t,value:n[e]})):[];return{name:e.descriptor.name,values:i}}).filter(e=>e.values.length>0);return{ohlc:{open:n.open,high:n.high,low:n.low,close:n.close,volume:n.volume},change:i,changePct:a,indicators:o}}toggleDataWindow(){!this.dataWindow||!this.featureState.dataWindow||this.dock?.toggle(`dataWindow`)}toggleObjects(){!this.objectTree||!this.featureState.objectTree||this.dock?.toggle(`objectTree`)}setupDock(){let e=this.dock;if(!e)return;if(this.watchlist){let t=this.watchlist;e.addPage({id:`watchlist`,label:this.t(`watchlist.title`),icon:`list`,element:t.element,parts:[`dock.watchlist`],onShow:()=>t.redraw()})}let t=this.alertsPanel;t&&e.addPage({id:`alerts`,label:this.t(`alerts.title`),icon:`bell`,element:t.element,parts:[`dock.alerts`,`alerts`],onShow:()=>{t.openPanel(),this.refreshAlerts(),this.toolbar?.setActive(`alerts`,!0)},onHide:()=>{t.close(),this.toolbar?.setActive(`alerts`,!1)}});let n=this.objectTree;n&&e.addPage({id:`objectTree`,label:this.t(`objects.title`),icon:`layers`,element:n.element,parts:[`dock.objectTree`,`objectTree`],onShow:()=>{n.openPanel(),this.refreshObjects(),this.toolbar?.setActive(`objects`,!0)},onHide:()=>{n.close(),this.toolbar?.setActive(`objects`,!1)}});let r=this.dataWindow;r&&e.addPage({id:`dataWindow`,label:this.t(`dataWindow.title`),icon:`table`,element:r.element,parts:[`dock.dataWindow`,`dataWindow`],onShow:()=>{r.openPanel(),r.render(this.buildDataWindowModel())},onHide:()=>r.close()});let i=this.symbolInfoPanel;i&&e.addPage({id:`symbolInfo`,label:this.t(`symbolInfo.title`),icon:`info`,element:i.element,parts:[`dock.symbolInfo`,`symbolInfo`],onShow:()=>i.open(),onHide:()=>i.close()});let a=this.depthLadder;a&&e.addPage({id:`depthLadder`,label:this.t(`ladder.title`),icon:`ladder`,element:a.element,parts:[`dock.depthLadder`,`depthLadder`],onShow:()=>a.openPanel(),onHide:()=>a.close()}),this.syncRail(),this.fitDockToWidth(),typeof ResizeObserver<`u`&&(this.dockObserver=new ResizeObserver(()=>this.fitDockToWidth()),this.dockObserver.observe(this.root))}fitDockToWidth(){let e=this.dock,t=this.root.clientWidth;if(!e||t===0)return;let n=t<641,r=this.dockNarrow;this.dockNarrow=n,n&&r!==!0&&e.close()}railShown(){return this.featureState.dock&&!this.root.hasAttribute(`data-tcw-narrow`)}syncRail(){this.dock?.syncRail();let e=this.railShown();this.toolbar?.setRailed(`alerts`,e&&this.featureState[`dock.alerts`]),this.toolbar?.setRailed(`objects`,e&&this.featureState[`dock.objectTree`]),this.toolbar?.fit()}panelFocusTarget(e){let t=cu[e],n=t?this.root.querySelector(`.tcw-toolbar [data-role="${t}"]`):null,r=this.root.hasAttribute(`data-tcw-narrow`);return n&&!n.hidden&&!(r&&n.classList.contains(`tcw-toolbar-overflow`))?n:this.root.querySelector(`.tcw-toolbar-more`)??this.chartContainer}closePanelByHand(e){this.dock?.closePage(e)}openIndicatorSettings(e){if(!this.indicatorSettings||!this.featureState.indicatorSettings)return;let t=this.chart.getActiveIndicators(),n=t.find(t=>t.instanceId===e);if(!n)return;let r=this.chart.getIndicatorStyle(e),i=n.descriptor.placement===`panel`||!!n.pane,a=(this.chart.getIndicatorSetup()??[]).find(t=>t.instanceId===e)?.levels!==void 0;this.chart.beginIndicatorEdit(e),this.indicatorSettings.open({instanceId:e,indicatorId:n.id,name:n.descriptor.name,defaults:n.descriptor.defaultConfig,params:n.params,inputs:n.descriptor.inputs,lineSources:Ou(e,t,this.t),plots:n.descriptor.plots,colors:r?.colors,lineWidth:r?.lineWidths[0],plotStyles:r?.plots,intervals:this.chart.getIndicatorIntervals(e)??null,levels:i?this.chart.getIndicatorLevels(e):void 0,defaultLevels:n.descriptor.levels,ownLevels:a,scale:i?void 0:this.chart.getIndicatorScale(e)})}refreshObjects(){if(this.refreshDrawingsState(),!this.objectTree)return;let e=this.chart.getActiveIndicators().map(e=>({instanceId:e.instanceId,name:Ji(e,this.t),title:e.descriptor.name,visible:e.visible})),t=this.chart.getDrawings().map(e=>({id:e.id,label:ha(e.type,this.t),visible:e.visible,offInterval:e.visible&&!this.chart.isDrawingShown(e.id),locked:e.locked,group:e.group})),n=this.comparedNow().map(e=>({id:e.id,label:e.symbol,color:e.color,way:e.way}));this.objectTree.setObjects(e,t,n)}async handleAddCompare(){if(this.featureState.compare){if(!this.adapter){this.say(this.t(`toast.compareNeedsAdapter`),`error`);return}this.symbolSearch?.openCompare({symbols:this.symbolEntries(),current:this.state.symbol,search:this.symbolSearchFn(),ways:Rc(this.t),way:this.compareWay,compared:this.comparedNow(),onAdd:(e,t)=>{Lc(t)&&(this.compareWay=t,this.addCompareSymbol(e,t))},onRemove:e=>this.removeCompared(e)})}}comparedNow(){let e=new Set(this.chart.getIndicatorPanes().flatMap(e=>e.instanceIds));return Hc(this.compares,this.chart.getActiveIndicators(),e,this.t)}refreshCompareDialog(){this.symbolSearch?.isComparing()&&this.symbolSearch.setCompared(this.comparedNow())}async addCompareSymbol(e,n=`percent`){if(!this.adapter){this.say(this.t(`toast.compareNeedsAdapter`),`error`);return}if(n!==`percent`){await this.addCompareIndicator(this.adapter,e,n);return}if(this.chart.getFeatures()?.compareSymbols===!1||this.compares.some(t=>t.symbol===e)||this.comparesLoading.has(e))return;let r=`cmp_${e}`;this.comparesLoading.add(e);try{let n=await this.fetchCompareBars(this.adapter,e);if(!n||this.compares.some(t=>t.symbol===e))return;let i=this.state.timeframe,a=ru[this.compares.length%ru.length];this.compares.length===0&&this.chart.setCompareMode(`percent`),this.chart.addCompareSymbol(r,e,n,a),this.compares=[...this.compares,{id:r,symbol:e,color:a,bars:n,timeframe:i}],this.compares.length===1&&this.holdCompareScale(!0),this.scheduleLegend(),this.refreshObjects(),this.refreshCompareDialog(),this.say(t.r(this.t(`toast.comparing`),{symbol:e}))}finally{this.comparesLoading.delete(e)}}async addCompareIndicator(e,t,n){let r=await this.fetchCompareBars(e,t);if(!r)return;this.chart.setSymbolSeries(t,r);let i=n===`scale`?this.chart.addIndicator(`compareSymbol`,{symbol:t},`bottom`,{scale:`left`}):n===`pane`?this.chart.addIndicator(`compareSymbol`,{symbol:t}):n===`correlation`?this.chart.addIndicator(`correlation`,{symbol:t}):n===`correlationLog`?this.chart.addIndicator(`correlationlog`,{symbol:t}):this.chart.addIndicator(`spread`,{symbol:t,mode:n});i&&n===`pane`&&this.chart.moveIndicatorToPane(i,`new`)}async fetchCompareBars(e,n){for(;;){let i=this.state.timeframe,a=null,o=null;try{a=await(0,r.withResampling)(e).fetchHistory(n,i,this.compareDepth())}catch(e){o=e}if(this.destroyed)return null;if(i===this.state.timeframe)return a&&a.length>0?a:(o===null?this.say(t.r(this.t(`toast.compareNoBars`),{symbol:n,interval:wt(i)}),`error`):this.sayCompareFailed(n,o),null)}}sayCompareFailed(e,t){this.say(`${e}: ${t instanceof Error?t.message:this.t(`toast.loadFailed`)}`,`error`)}removeCompared(e){this.compares.some(t=>t.id===e)?this.handleRemoveCompare(e):this.chart.removeIndicator(e)}handleRemoveCompare(e){this.chart.removeCompareSymbol(e),this.compares=this.compares.filter(t=>t.id!==e),this.compares.length===0&&this.holdCompareScale(!1),this.scheduleLegend(),this.refreshObjects(),this.refreshCompareDialog()}removeHostCompare(e){this.chart.removeCompareSymbol(e),this.scheduleLegend()}isPercentCompare(e){return this.compares.some(t=>t.id===e)}compareDepth(){return Math.max(this.chart.getData().length,this.options.historyLimit??500)}holdsPercentScale(){return this.compareScaleHeld&&this.compares.length>0&&this.settingsState.scaleMode===`regular`&&this.chart.isTimeAligned()}effectiveScaleMode(){return this.holdsPercentScale()?`percentage`:this.settingsState.scaleMode}userScaleMode(){return this.holdsPercentScale()?this.settingsState.scaleMode:this.chart.getScaleMode()}shownSettings(){return{...this.settingsState,scaleMode:this.effectiveScaleMode()}}showScaleMode(){let e=this.effectiveScaleMode();this.chart.getScaleMode()!==e&&this.chart.setScaleMode(e)}holdCompareScale(e){e!==this.compareScaleHeld&&(this.compareScaleHeld=e,this.showHeldScale())}showHeldScale(){this.showScaleMode(),this.refreshScaleSwitches(),this.settings?.refresh(this.shownSettings())}async loadSymbolSeries(e){if(!this.adapter){this.say(this.t(`toast.compareNeedsAdapter`),`error`);return}let t=this.state.timeframe,n=(this.symbolLoads.get(e)??0)+1;this.symbolLoads.set(e,n);let i=()=>this.destroyed||t!==this.state.timeframe||this.symbolLoads.get(e)!==n;try{let n=await(0,r.withResampling)(this.adapter).fetchHistory(e,t,this.compareDepth());if(i())return;this.chart.setSymbolSeries(e,n)}catch(t){if(i())return;this.chart.setSymbolSeries(e,this.chart.getSymbolSeries(e)),this.sayCompareFailed(e,t)}}async refetchCompares(){for(let e of this.chart.getRequiredSymbols?.()??[])this.loadSymbolSeries(e);if(!this.adapter||this.compares.length===0)return;let e=this.compares.filter(e=>e.symbol===this.state.symbol);for(let t of e)this.handleRemoveCompare(t.id);await this.refetchPercentCompares()}async refetchPercentCompares(){if(!this.adapter||this.compares.length===0)return;let e=++this.compareFetchSeq,t=(0,r.withResampling)(this.adapter);this.compares=this.compares.map(e=>({...e,failedAt:void 0}));for(let n of this.compares){let r=this.state.timeframe;try{let i=await t.fetchHistory(n.symbol,r,this.compareDepth());if(this.destroyed||e!==this.compareFetchSeq)return;this.isPercentCompare(n.id)&&this.setCompareBars(n.id,i,r)}catch{!this.destroyed&&e===this.compareFetchSeq&&this.compareFailedAt(n.id,r)}}this.compareOlderPassed&&(this.compareOlderPassed=!1,this.extendPercentCompares())}async extendPercentCompares(){if(this.compareOlderBusy){this.compareOlderAgain=!0;return}this.compareOlderBusy=!0;try{do this.compareOlderAgain=!1,await this.fetchOlderCompares();while(this.compareOlderAgain&&!this.destroyed)}finally{this.compareOlderBusy=!1}}async fetchOlderCompares(){if(!this.adapter||this.compares.length===0)return;let e=(0,r.withResampling)(this.adapter),t=this.compareFetchSeq,n=this.state.timeframe;for(let r of this.compares){if(r.timeframe!==n){r.failedAt!==n&&(this.compareOlderPassed=!0);continue}let i=r.bars[0]?.time;if(i===void 0||r.atStart)continue;let a=zc(this.chart.getData(),i);if(a!==0)try{if(e.fetchHistoryBefore){let o=await e.fetchHistoryBefore(r.symbol,n,i,a);if(this.destroyed||t!==this.compareFetchSeq)return;this.prependCompareBars(r.id,o,n)}else{let a=this.compareDepth(),o=await e.fetchHistory(r.symbol,n,a);if(this.destroyed||t!==this.compareFetchSeq)return;this.deepenCompareBars(r.id,o,a,i,n)}}catch{}}}deepenCompareBars(e,t,n,r,i){this.isPercentCompare(e)&&(this.setCompareBars(e,t,i),(t.length<n||!(t[0].time<r))&&(this.compares=this.compares.map(t=>t.id===e?{...t,atStart:!0}:t)))}prependCompareBars(e,t,n){let r=this.compares.find(t=>t.id===e);if(!r)return;let i=Bc(r.bars,t);i?this.setCompareBars(e,i,n):this.compares=this.compares.map(t=>t.id===e?{...t,atStart:!0}:t)}setCompareBars(e,t,n){this.chart.updateCompareData(e,t),this.compares=this.compares.map(r=>r.id===e?{...r,bars:t,timeframe:n,atStart:!1,failedAt:void 0}:r)}compareFailedAt(e,t){this.compares=this.compares.map(n=>n.id===e?{...n,failedAt:t}:n)}refreshAlerts(){if(!this.alertsPanel)return;let e=this.buildAlertSources();this.alertsPanel.setSources(e),this.alertsPanel.setAlerts(this.chart.getAlerts().map(t=>this.alertListItem(t,e)))}refreshPriceTexts(){this.refreshAlerts(),this.refreshAccountSoon(),this.dataWindow?.isOpen()&&this.dataWindow.render(this.buildDataWindowModel())}alertListItem(e,t){return{id:e.id,price:e.price,condition:e.condition,message:e.message,triggered:e.triggered,channel:e.channel,label:e.label,drawingId:e.drawingId,target:e.target,targetLabel:e.target?t.find(t=>t.channel===e.target)?.label:void 0,percent:e.percent,bars:e.bars,onBarClose:e.onBarClose,expiresAt:e.expiresAt,expired:e.expired}}alertText(e){return Ii(this.alertListItem(e,this.buildAlertSources()),this.t,e=>this.formatAlertPrice(e),!0)}buildAlertSources(){let e=[{channel:`price`,label:this.t(`alerts.source.price`)}];for(let t of this.chart.getActiveIndicators()){let n=this.chart.getIndicatorOutput(t.instanceId)?.series,r=n&&n.length>0?n[n.length-1]:null,i=r?Object.keys(r).filter(e=>typeof r[e]==`number`):[];for(let n of i){let r=i.length>1?`${t.descriptor.name} ${n}`:t.descriptor.name;e.push({channel:`${t.instanceId}:${n}`,label:r})}}return e}getAlertChannelValue(e){let t=this.chart.getData();if(e===`price`)return t.length>0?this.chart.roundPrice(t[t.length-1].close):null;let n=e.indexOf(`:`);if(n<0||t.length===0)return null;let r=e.slice(0,n),i=e.slice(n+1),a=this.chart.getIndicatorOutput(r)?.series?.[t.length-1]?.[i];return typeof a==`number`&&Number.isFinite(a)?a:null}formatMoney(e){return this.formatNumber(e,Math.min((0,n.stepDecimals)(this.chart.getPriceStep()),su))}formatNumber(e,t){let n=this.settingsState.numberLocale||void 0;return e.toLocaleString(n,{minimumFractionDigits:t,maximumFractionDigits:t})}formatAlertPrice(e){if(this.chart.getPriceFormatter?.()||this.chartSetsDecimals())return this.chart.formatPrice(e);let t=Math.abs(e),n=t>=1e3?2:t>=1?4:6,r=this.settingsState.numberLocale||void 0;return e.toLocaleString(r,{minimumFractionDigits:2,maximumFractionDigits:n})}chartSetsDecimals(){return this.chart.getMarket?.()?.pricePrecision!=null||this.chart.getSymbolInfo?.()?.pricePrecision!=null}handleChartType(e){let t=this.state.chartType;e!==t&&(this.applyChartType(e),this.chart.recordUndo({subject:`chartType`,undo:()=>this.applyChartType(t),redo:()=>this.applyChartType(e)}))}applyChartType(e){this.state={...this.state,chartType:e},this.chart.setChartType(e),this.settings?.refresh(this.shownSettings(),e),this.updateUI()}handleAddIndicator(e){return this.chart.addIndicator(e,this.indicatorDefaults.get(e)?.params??{})!==null}saveIndicatorDefault(e,n){if(!this.indicatorDefaults.save(e,n)){this.say(this.t(`indicatorSettings.defaultSaveFailed`),`error`);return}this.chart.setIndicatorDefaults(e,n.style);let r=this.chart.getAvailableIndicators()?.find(t=>t.id===e)?.shortName??e.toUpperCase();this.say(t.r(this.t(`indicatorSettings.defaultSaved`),{name:r}))}handleRemoveIndicator(e){this.chart.removeIndicator(e)}toggleCommandPalette(){if(this.commandPalette?.isOpen()){this.commandPalette.close();return}this.featureState.commandPalette&&this.commandPalette?.open(this.buildCommandItems())}buildCommandItems(){let e=[];for(let t of this.indicatorPickerItems())e.push({id:t.id,label:t.name,category:`indicator`,active:[...this.state.activeIndicators.values()].some(e=>e.id===t.id)});for(let t of me)e.push({id:t.value,label:yt(t,this.t),category:`chartType`,active:this.state.chartType===t.value});let t=Ai();for(let n of bt(he,this.t))for(let r of n.tools)e.push({id:r.value,label:r.label,category:`drawing`,shortcut:t[r.value]?this.keysShown(`hotkeys.tools`,t[r.value]):void 0,active:this.state.activeTool===r.value});for(let t of this.timeframes)e.push({id:t,label:wt(t),category:`timeframe`,active:this.state.timeframe===t});return e.push({id:`symbolSearch`,label:this.t(`hotkeys.symbolSearch`),category:`action`,shortcut:this.keysShown(`hotkeys.symbolSearch`,`${rr}+P`)},{id:`compare`,label:this.t(`compare.title`),category:`action`},{id:`goToDate`,label:this.t(`hotkeys.goToDate`),category:`action`,shortcut:this.keysShown(`hotkeys.goToDate`,`Alt+G`)},{id:`resetView`,label:this.t(`chartMenu.resetView`),category:`action`,shortcut:this.keysShown(`hotkeys.resetView`,`Alt+R`)},{id:`invertScale`,label:this.t(`hotkeys.invertScale`),category:`action`,shortcut:this.keysShown(`hotkeys.invertScale`,`Alt+I`)},{id:`saveLayout`,label:this.t(`hotkeys.saveLayout`),category:`action`,shortcut:this.keysShown(`hotkeys.save`,`${rr}+S`)},{id:`watchlist`,label:this.t(`watchlist.title`),category:`action`},{id:`alerts`,label:this.t(`alerts.title`),category:`action`},{id:`objectTree`,label:this.t(`objects.title`),category:`action`},{id:`dataWindow`,label:this.t(`action.dataWindow`),category:`action`},{id:`symbolInfo`,label:this.t(`action.symbolInfo`),category:`action`},{id:`screenshot`,label:this.t(`action.screenshot`),category:`action`},{id:`copyImage`,label:this.t(`action.copyImage`),category:`action`},{id:`shareView`,label:this.t(`action.shareView`),category:`action`},{id:`toggleTheme`,label:this.t(`action.toggleTheme`),category:`action`},{id:`settings`,label:this.t(`action.settings`),category:`action`},{id:`autoFib`,label:this.t(`action.autoFib`),category:`action`},{id:`clearDrawings`,label:this.t(`action.clearDrawings`),category:`action`},{id:`hotkeys`,label:this.t(`hotkeys.title`),category:`action`,shortcut:this.keysShown(`hotkeys.help`,`?`)}),e.filter(e=>e.category!==`action`||this.commandOn(e.id)&&this.commandThere(e.id))}commandThere(e){return e===`watchlist`?this.watchlist!==null:e===`compare`?this.adapter!==null&&this.options.chartOptions?.features?.compareSymbols!==!1:e===`saveLayout`?this.layoutSession!==null:!0}keysShown(e,t){if(this.sheetKeyOn(e))return this.hostHotkeys.some(e=>e.parsed.display.join(`+`).toLowerCase()===t.toLowerCase())?void 0:t}openHotkeySheet(){this.hotkeySheet?.open({isOn:e=>this.sheetKeyOn(e),extra:this.hostHotkeys.map(e=>({keys:e.parsed.display,text:e.spec.label}))})}commandOn(e){let t=Je(e);return t===void 0||this.featureState[t]}handleAction(e){if(this.commandOn(e))switch(e){case`symbolSearch`:this.openSymbolSearch();break;case`compare`:this.handleAddCompare();break;case`goToDate`:this.toggleGoToDate();break;case`resetView`:this.resetView();break;case`invertScale`:this.changeSettings({invertScale:!this.settingsState.invertScale}),this.settings?.refresh(this.shownSettings());break;case`saveLayout`:this.saveLayout();break;case`watchlist`:case`alerts`:case`objectTree`:this.openPanel(e);break;case`hotkeys`:this.openHotkeySheet();break;case`screenshot`:this.chart.screenshot();break;case`toggleTheme`:this.handleToggleTheme();break;case`settings`:this.openSettings();break;case`copyImage`:this.copyChartImage();break;case`shareView`:this.copyShareLink();break;case`autoFib`:{let e=this.chart.autoFib();this.say(e?this.t(`toast.autoFibAdded`):this.t(`toast.noSwing`));break}case`dataWindow`:this.toggleDataWindow();break;case`symbolInfo`:this.toggleSymbolInfo();break;case`clearDrawings`:this.chart.clearDrawings(),this.state={...this.state,activeTool:null},this.updateUI();break}}handleDrawingTool(e){this.state={...this.state,activeTool:e},this.chart.setDrawingTool(e),this.updateUI()}handleCancelDrawing(){this.state={...this.state,activeTool:null},this.chart.setDrawingTool(null),this.chart.setEraserMode(!1),this.chart.setZoomAreaMode(!1),this.updateUI()}handleToggleStayInDrawing(){let e=!this.state.stayInDrawing;this.state={...this.state,stayInDrawing:e},this.chart.setStayInDrawingMode(e),this.updateUI()}handleToggleMagnet(){let e=this.state.magnetEnabled?this.state.magnetStrong?`off`:`strong`:`weak`;this.state={...this.state,magnetEnabled:e!==`off`,magnetStrong:e===`strong`},this.chart.setDrawingMagnetMode(e),this.updateUI()}handleToggleTheme(){if(!this.featureState.themeToggle)return;let e=!this.state.isDark;this.state={...this.state,isDark:e},this.root.dataset.tcwTheme=e?`dark`:`light`,this.portal.dataset.tcwTheme=this.root.dataset.tcwTheme,this.keepingLook(()=>this.chart.setTheme(e?this.themeOf.dark:this.themeOf.light)),this.chart.setWatermark(this.state.symbol.replace(`USDT`,` / USDT`),{fontSize:48,color:e?`rgba(255,255,255,0.03)`:`rgba(0,0,0,0.03)`}),this.updateUI()}openSettings(e){!this.featureState.settings||this.settings?.isOpen()||(this.syncSettingsFromChart(),this.markSettingsTold(),this.settingsEdit={settings:{...this.settingsState},style:this.settingsStyle(),keys:new Set,styleKeys:new Set,held:this.compareScaleHeld},this.settings?.open(this.shownSettings(),this.state.chartType,e))}resetView(){this.chart.fitContent(),this.changeSettings({autoScale:!0}),this.settings?.refresh(this.shownSettings())}endSettingsEdit(e){let t=this.settingsEdit;if(this.settingsEdit=null,!t)return;let n=[...t.keys],r=e=>Object.fromEntries(n.map(t=>[t,e[t]])),i=[...t.styleKeys],a=r(t.settings),o=i.length>0?{theme:t.style.theme,overrides:Object.fromEntries(i.map(e=>[e,t.style.overrides[e]??null]))}:null,s=t.keys.has(`scaleMode`),c=this.compareScaleHeld;if(!e){this.restoreSettings(a,o,s?t.held:void 0);return}let l=r(this.getSettings()),u=i.length>0?this.settingsStyle(i):null;(JSON.stringify([a,o])!==JSON.stringify([l,u])||s&&t.held!==c)&&this.chart.recordUndo({undo:()=>this.restoreSettings(a,o,s?t.held:void 0),redo:()=>this.restoreSettings(l,u,s?c:void 0)}),this.claimSettings(n),this.publishSettings()}touchSettings(e,t=[]){if(!this.settingsEdit){this.claimSettings(e);return}for(let t of e)this.settingsEdit.keys.add(t);for(let e of t)this.settingsEdit.styleKeys.add(e)}applyChartTemplate(e){let n=this.chartTemplates.get(e);if(!n)return;let r=this.allowedSettings(n.settings);this.touchSettings(Object.keys(r),T),this.applySettings(r),this.chart.resetOverrides([...T],{layer:`user`}),this.chart.applyOverrides(n.style,{layer:`user`}),this.settings?.refresh(this.shownSettings()),this.say(t.r(this.t(`templates.applied`),{name:e}))}promptSaveChartTemplate(){this.chartTemplatePrompt??=new oc(this.overlayHost(),this.t),this.chartTemplatePrompt.open({title:this.t(`settings.saveTemplateTitle`),submitLabel:this.t(`common.save`),placeholder:this.t(`settings.templatePlaceholder`),onSubmit:e=>{if(!this.chartTemplates.save(e,this.settingsState,this.settingsStyle().overrides))throw this.say(this.t(`templates.saveFailed`),`error`),Error(`The template could not be saved`);this.say(t.r(this.t(`templates.saved`),{name:e}))}})}toast(e,t=`info`,n){let r=document.createElement(`div`);r.className=`tcw-toast ${t===`error`?`tcw-toast-error`:``}`,r.setAttribute(`role`,t===`error`?`alert`:`status`);let i=n?D(n,14):``;if(i){let e=document.createElement(`span`);e.className=`tcw-toast-icon`,e.innerHTML=i,r.appendChild(e)}r.appendChild(document.createTextNode(e));let a=e=>e.querySelector(`.tcw-modal-backdrop:not([hidden])`)!==null,o=a(this.portal)?this.portal:this.root;r.classList.toggle(`tcw-toast-over`,o===this.portal||a(this.root)),o.appendChild(r),requestAnimationFrame(()=>r.classList.add(`tcw-toast-in`)),setTimeout(()=>{r.classList.remove(`tcw-toast-in`),r.addEventListener(`transitionend`,()=>r.remove(),{once:!0}),setTimeout(()=>r.remove(),400)},3500)}say(e,t=`info`,n){(this.featureState.toasts||t===`error`)&&this.toast(e,t,n)}getLayoutSession(){return this.layoutSession}getSymbol(){return this.state.symbol}getTimeframe(){return this.state.timeframe}captureLayout(){let e=this.getSettings(),t=this.chart.saveState(),n=t?Sc(t):null,r=n&&typeof n==`object`?bc(n):null;return{v:1,symbol:this.state.symbol,timeframe:this.chosenTimeframe??this.state.timeframe,scaleMode:e.scaleMode,invertScale:e.invertScale,chart:r,settings:po(e,$a)}}async restoreLayout(e){if(e.symbol!==this.state.symbol&&await this.setSymbol(e.symbol),e.timeframe!==this.state.timeframe&&await this.setTimeframe(e.timeframe),this.destroyed)return;if(e.chart){this.chart.loadState(JSON.stringify(bc(e.chart)));let t=e.chart.chartType;typeof t==`string`&&(this.state={...this.state,chartType:t})}let t=this.allowedSettings({scaleMode:e.scaleMode,invertScale:e.invertScale,...G(e.settings,$a)});this.claimSettings(Object.keys(t)),this.applySettings(t),this.syncIndicatorsFromChart(),this.updateUI(),this.settings?.refresh(this.shownSettings(),this.state.chartType)}getLayoutContent(){return JSON.stringify(this.captureLayout())}async applyLayoutContent(e){let t=xc(Sc(e));return t?(await this.restoreLayout(t),!0):!1}getSettings(){return this.syncSettingsFromChart(),JSON.parse(JSON.stringify(this.settingsState))}setSettings(e){let t=this.allowedSettings(this.withoutEarlyFreeze(G(e)));this.claimSettings(Object.keys(t)),this.applySettings(t),this.settings?.refresh(this.shownSettings())}withoutEarlyFreeze(e){return e.autoScale!==!1||this.chart.getData().length>0?e:Object.fromEntries(Object.entries(e).filter(([e])=>e!==`autoScale`))}onSettingsChange(e){return this.settingsListeners.add(e),()=>{this.settingsListeners.delete(e)}}syncSettingsFromChart(){let e=this.chart,t=e.getTimeZone?.(),n=e.getMarketProfileConfig?.(),r=e.getPivotMarkersConfig?.(),i=this.allowedSettings(G({gridVisible:e.isGridVisible?.(),volumeVisible:e.isVolumeVisible?.(),legendVisible:e.isLegendVisible?.(),barCountdown:e.isBarCountdownVisible?.(),indicatorValueLabels:e.isIndicatorValueLabelsVisible?.(),leftPriceScale:e.isLeftPriceScaleVisible?.(),volumeProfileVisible:e.isVolumeProfileVisible?.(),marketProfileVisible:e.isMarketProfileVisible?.(),marketProfileSplit:n?.splitBySession,marketProfileLetters:n?.letters,marketProfileBuckets:n?.buckets,marketProfileOpacity:n?.opacity,depthHeatmapVisible:e.isDepthHeatmapVisible?.(),depthHeatmapOpacity:e.getDepthHeatmapConfig?.()?.opacity,pivotMarkersVisible:e.isPivotMarkersVisible?.(),pivotStrength:r?.left,pivotStructureLabels:r?.structureLabels,sessionShadingVisible:e.isSessionShadingVisible?.(),periodLevelsVisible:e.isPeriodLevelsVisible?.(),periodLevelsPeriod:e.getPeriodLevelsPeriod?.(),crosshairMode:e.getCrosshairMode?.(),scaleMode:this.userScaleMode(),autoScale:e.isAutoScale?.(),invertScale:e.isInvertScale?.(),timezone:t===void 0?void 0:d(t),numberLocale:e.getNumberLocale?.(),highLowLines:e.isHighLowLinesVisible?.(),extendedHours:e.isExtendedHoursVisible?.(),mainSeriesVisible:e.isMainSeriesVisible?.(),chartTypeOptions:e.getChartTypeOptions?.()})),a=i.scaleMode?{logScale:i.scaleMode===`logarithmic`}:{},o=i.chartTypeOptions?{chartTypeOptions:io(i.chartTypeOptions)}:{};this.settingsState={...this.settingsState,...i,...a,...o}}allowedSettings(e){let t=this.settingsLocked,n=(e,n)=>e===`scaleMode`?n===`logarithmic`&&t.has(`logScale`):n===!0&&t.has(e);return Object.fromEntries(Object.entries(e).filter(([e,t])=>t!==void 0&&!n(e,t)))}restoreKeptSettings(){let e=this.allowedSettings(this.settingsStore?.load()??{});Object.keys(e).length>0&&this.applySettings(e),this.settingsPublished=JSON.stringify(this.getSettings())}markSettingsTold(){this.settingsPublished!==null&&(this.settingsPublished=JSON.stringify(this.getSettings()))}publishSettings(){if(this.settingsPublished===null||this.destroyed)return;let e=this.getSettings(),t=JSON.stringify(e);if(t!==this.settingsPublished){this.settingsPublished=t,this.settingsStore?.save(this.ownSettings(e),this.settingsDefaults);for(let e of[...this.settingsListeners])try{e(JSON.parse(t))}catch(e){console.error(`[TradeCanvas] An onSettingsChange listener threw:`,e)}}}setupLayouts(t){let n=new e.t(t.storage??e.i(),{capture:()=>({content:this.getLayoutContent(),symbol:this.state.symbol,timeframe:this.chosenTimeframe??this.state.timeframe}),apply:async e=>{if(!await this.applyLayoutContent(e.content))throw Error(`Not a widget layout`)}},{autoSave:t.autoSave,debounceMs:t.debounceMs,onChange:()=>this.toolbar?.setLayout(n.current()?.name??null,n.isDirty()),onError:()=>this.say(this.t(`layouts.saveFailed`),`error`)});this.layoutSession=n,this.layoutsUI=new uc(n,{root:this.root,t:this.t,saveKeys:()=>this.keysShown(`hotkeys.save`,`${rr}+S`),toast:(e,t)=>this.say(e,t),formatTime:e=>{let{date:t,time:n}=Z(e,this.displayTimezone());return`${t} ${n}`}}),this.chart.on(`stateChange`,()=>n.changed()),t.openLast&&n.list().then(([e])=>e&&!this.destroyed?this.openLayout(e.id):void 0,()=>void 0)}async saveLayout(){await this.layoutsUI?.save()}async openLayout(e){return await this.layoutsUI?.open(e)??!1}clearSavedLayout(e){if(!this.layoutKeyPrefix)return;let t=e??this.state.symbol;try{localStorage.removeItem(this.layoutKeyPrefix+t)}catch{}}applySymbolLayout(e){if(!this.layoutKeyPrefix)return;let t=this.layoutKeyPrefix+e;this.activeLayoutKey=t;try{this.chart.loadStateFromStorage(t)&&this.syncIndicatorsFromChart()}catch{}this.chart.setAutoSave(t,this.layoutDebounceMs)}flushActiveLayout(){if(this.activeLayoutKey){try{this.chart.saveState(this.activeLayoutKey)}catch{}this.chart.disableAutoSave(),this.activeLayoutKey=null}}syncIndicatorsFromChart(){let e=new Map;for(let t of this.chart.getActiveIndicators())e.set(t.instanceId,{id:t.id,label:Ji(t,this.t)});this.state={...this.state,activeIndicators:e},this.updateUI(),this.indicatorPicker?.setCounts(this.indicatorCounts())}toggleIndicatorPicker(){if(this.indicatorPicker?.isOpen()){this.indicatorPicker.close();return}!this.indicatorPicker||!this.featureState[`toolbar.indicators`]||(this.indicatorPicker.open({items:this.indicatorPickerItems(),favorites:this.indicatorFavorites.list(),templates:this.featureState.indicatorTemplates?this.templateNames():null,counts:this.indicatorCounts()}),this.toolbar?.setIndicatorsOpen(!0))}indicatorPickerItems(){return(this.chart.getAvailableIndicators()??[]).filter(e=>!r.SYMBOL_INDICATOR_IDS.has(e.id)&&this.chart.isIndicatorAllowed(e.id)!==!1).map(e=>({id:e.id,name:e.name,shortName:e.shortName??e.id.toUpperCase(),placement:e.placement===`panel`?`panel`:`overlay`,category:(0,r.indicatorCategory)(e)}))}indicatorCounts(){let e=new Map;for(let{id:t}of this.state.activeIndicators.values())e.set(t,(e.get(t)??0)+1);return e}templateNames(){return this.templates.list().map(e=>e.name)}toggleReplay(){this.replayBar?.isMounted()?this.exitReplay():this.featureState.replay&&this.enterReplay()}enterReplay(){if(this.replayTotal()<2)return;let e=this.t;this.replayBar=new ii({onPlay:()=>{if(this.replayBar?.getMode()===`select`){this.seriesPending()||this.startReplayAt(Math.max(1,this.replayTotal()-100),!0);return}this.replayStartPending?this.replayPlayWanted=!0:this.chart.getReplayState()===`paused`&&this.chart.replayResume(),this.syncReplayBar()},onPause:()=>{this.replayPlayWanted=!1,this.chart.replayPause(),this.syncReplayBar()},onStepBack:()=>this.stepReplay(-1),onStepForward:()=>this.stepReplay(1),onSeek:e=>{this.seriesPending()||(this.chart.getReplayState()===`playing`&&this.chart.replayPause(),this.chart.replaySeek(e),this.replayBar?.setState(`paused`))},onSpeedChange:e=>{this.replaySpeed=e,this.chart.setReplaySpeed(e)},onRandomStart:()=>{if(this.seriesPending())return;let e=this.replayBarCount(),t=Math.max(1,Math.floor(e*.1)),n=Math.max(t,Math.floor(e*.9));this.startReplayAt(t+Math.floor(Math.random()*(n-t+1)),!1,!0)},onClose:()=>this.exitReplay(),onSelectBar:()=>this.pickReplayBarAgain(),onCancelPick:()=>this.cancelReplayPick(),onStepChange:e=>{if(this.replayStep=e,this.replayBar?.getMode()!==`replay`)return;let t=this.chart.getReplayState()===`playing`;this.startReplayAt(Math.max(0,this.chart.getReplayBarIndex()-1),t)}},{selectHint:e(`replay.selectHint`),loading:e(`status.loading`),random:e(`replay.random`),realtime:e(`replay.realtime`),play:e(`replay.play`),pause:e(`replay.pause`),stepBack:e(`replay.stepBack`),stepForward:e(`replay.stepForward`),replay:e(`replay.label`),position:e(`replay.position`),speed:e(`replay.speed`),step:e(`replay.step`),selectBar:e(`replay.selectBar`),cancel:e(`common.cancel`),rate:e(`replay.rate`),rateHint:e(`replay.rateHint`),playingAt:e(`replay.playingAt`),pausedAt:e(`replay.pausedAt`),endedAt:e(`replay.endedAt`)});let n=this.replayStepMenu();this.replayBar.mount(this.chartContainer,{total:this.replayTotal(),rate:this.replaySpeed,mode:`select`,steps:n,step:this.replayStep,dir:this.root.dir===`rtl`?`rtl`:`ltr`,formatRate:n=>t.r(e(`replay.rate`),{rate:n.toLocaleString(this.intlLocale())})}),this.watchReplayBar(),this.toolbar?.setActive(`replay`,!0),this.root.setAttribute(`data-tcw-replay`,``),this.showReplayShade(),this.layoutReplayBar()}showReplayShade(){this.replayShade||(this.replayShade=document.createElement(`div`),this.replayShade.className=`tcw-replay-shade`,this.replayShade.hidden=!0,this.chartContainer.appendChild(this.replayShade),this.chartContainer.addEventListener(`mouseleave`,this.hideReplayShade))}removeReplayShade(){this.replayShade?.remove(),this.replayShade=null,this.chartContainer.removeEventListener(`mouseleave`,this.hideReplayShade)}pickReplayBarAgain(){let e=this.replayBar;!e?.isMounted()||this.seriesPending()||(this.replayPlayWanted=!1,this.chart.getReplayState()===`playing`&&this.chart.replayPause(),e.setState(`paused`),e.setMode(`select`),this.showReplayShade(),this.layoutReplayBar())}cancelReplayPick(){let e=this.replayBar;if(e?.isMounted()){if(!this.chart.isReplayActive()&&!this.replayStartPending){this.exitReplay();return}this.removeReplayShade(),e.setMode(`replay`),this.syncReplayBar(),this.layoutReplayBar()}}layoutReplayBar(){let e=this.replayBar?.element();if(!e||!this.replayBar)return;let t=this.chart.getPlotRect(),n=this.chartContainer,r=e=>`${Math.max(0,Math.round(e))}px`;e.style.setProperty(`--tcw-replay-foot`,r(n.clientHeight-(t.y+t.height))),e.style.setProperty(`--tcw-replay-plot-start`,r(t.x)),e.style.setProperty(`--tcw-replay-plot-end`,r(n.clientWidth-(t.x+t.width))),this.replayBar.setRoom(t.width-2*gu),this.liftOverReplayBar()}liftOverReplayBar(){let e=this.replayBar?.element();if(!e)return;let t=e.getBoundingClientRect().top,n=e=>{if(!e)return;let n=`${Math.max(0,Math.round(e.getBoundingClientRect().bottom-t))}px`;e.style.getPropertyValue(`--tcw-replay-lift`)!==n&&e.style.setProperty(`--tcw-replay-lift`,n)};n(this.root),n(this.bodyEl())}bodyEl(){return this.root.querySelector(`:scope > .tcw-body`)}replayTimeText(){let e=this.chart.getReplayProgress(),t=(this.chart.getReplayBarIndex()>e.current?e.time:null)??this.replayStepTime;if(t===null)return;let r=this.textLocale(),i=this.chart.getTimeZone?.()??null,a=(0,n.timeframeToMs)(this.state.timeframe),o=(0,n.zonedDateFormatter)(r,{year:`numeric`},i),s={month:`short`,day:`numeric`};o(t)!==o(Date.now())&&(s.year=`numeric`);let c=(0,n.zonedDateFormatter)(r,s,i)(t);if(Number.isFinite(a)&&a>=iu)return c;let l={hour:`2-digit`,minute:`2-digit`,hourCycle:`h23`};return(!Number.isFinite(a)||a<_u)&&(l.second=`2-digit`),`${c} · ${(0,n.zonedDateFormatter)(r,l,i)(t)}`}replayBarCount(){return this.chart.isReplayActive()&&this.replayBarsTotal!==null?this.replayBarsTotal:this.chart.getData().length}hideReplayShade=()=>this.positionReplayShade(null);replayFrom(e,t=!1){this.featureState.replay&&(this.replayBar?.isMounted()||this.enterReplay(),this.startReplayAt(e,t))}replayStepMenu(){let e=[{value:`auto`,label:this.t(`replay.step.auto`)},{value:`bar`,label:this.t(`replay.step.bar`)},...this.replayStepOptions().map(e=>({value:e,label:e}))];return e.some(e=>e.value===this.replayStep)||(this.replayStep=`auto`),e}refreshReplaySteps(){if(!this.replayBar?.isMounted())return;let e=this.replayStepMenu();this.replayBar.setSteps(e,this.replayStep)}afterReplayCarryOver(){let e=this.replayBar;!e?.isMounted()||e.getMode()!==`replay`||(this.syncReplayBar(),!(this.replayStep===`bar`||this.chartFetchesReplaySteps())&&this.replayStepsKey!==this.replayStepsKeyNow()&&this.startReplayAt(this.chart.getReplayBarIndex(),this.chart.getReplayState()===`playing`))}seriesPending(){return this.loading.isActive()&&!this.loading.hasFailed()}watchReplayBar(){this.replayPollInterval&&clearInterval(this.replayPollInterval),this.replayPollInterval=setInterval(()=>this.syncReplayBar(),mu)}startReplayAt(e,t=!1,n=!1){let r=this.replayBar;if(!r)return;let i=n?this.replayBarCount():this.replayTotal(),a=Math.max(0,Math.min(Number.isFinite(e)?Math.floor(e):0,i-1)),o=this.chart.getData()[a]?.time;this.removeReplayShade(),r.setMode(`replay`),this.layoutReplayBar();let s=++this.replayStartSeq;this.replayPlayWanted=t;let c=this.options.replayAnimate!==!1,l=this.chartFetchesReplaySteps(),u=e=>{this.destroyed||this.replayBar!==r||!r.isMounted()||s!==this.replayStartSeq||(this.replayStartPending=!1,this.replayStepsKey=e?this.replayStepsKeyNow():null,this.chart.replayStart({speed:this.replaySpeed,interval:c?au:au/this.replayStepsPerBar(e?d:null),...o===void 0?{startIndex:a}:{startTime:o},paused:!0,revealMarks:this.options.replayRevealMarks!==!1,animate:c,...l?{step:this.replayStep}:{},...e?{steps:e}:{}}),this.replayPlayWanted&&this.chart.replayResume(),this.replayPlayWanted=!1,this.syncReplayBar(),this.watchReplayBar())},d=this.replayStepInterval();if(l||d===null){u(null);return}this.replayStartPending=!0,this.replayStepsFor(d).then(e=>{s===this.replayStartSeq&&(e||this.say(this.t(`replay.stepsFailed`),`error`),u(e))})}replayStepsKeyNow(){return`${this.state.symbol}|${this.state.timeframe}`}replayStepsPerBar(e){if(e===null)return 1;let t=(0,n.timeframeToMs)(this.state.timeframe)/(0,n.timeframeToMs)(e);return Number.isFinite(t)&&t>=1?Math.round(t):1}replayStepOptions(){return e.d(this.state.timeframe,e=>this.hasReplayStep(e))}hasReplayStep(e){if(this.adapter)return(0,r.servesTimeframe)(this.adapter,e);let t=(0,n.timeframeToMs)(e);return this.baseSeries!==null&&this.baseTimeframeMs>0&&t>=this.baseTimeframeMs&&t%this.baseTimeframeMs===0}replayStepInterval(){return this.replayStep===`bar`||this.replayStep===`auto`&&this.options.replayAnimate===!1?null:e.f(this.replayStep,this.state.timeframe,e=>this.hasReplayStep(e))}chartFetchesReplaySteps(){return this.options.replayAnimate===!1||!this.adapter||this.replayStep===`bar`?!1:(0,r.withResampling)(this.adapter).fetchHistoryBefore!==void 0}async replayStepsFor(e){let t=this.chart.getExchangeTimeZone()??null,{symbol:a,timeframe:o}=this.state,s=()=>`${a}|${o}|${e}|${t}|${this.builtStepsZone(a,e)}`;if(this.replayStepsCache?.key===s())return this.replayStepsCache.steps;let c=null;if(this.adapter){let t=Math.max(1,Math.round((0,n.timeframeToMs)(o)/(0,n.timeframeToMs)(e))),i=Math.min(hu,Math.max(this.chart.getData().length,100)*t);try{c=await(0,r.withResampling)(this.adapter).fetchHistory(a,e,i)}catch{c=null}}else this.baseSeries&&(c=(0,n.timeframeToMs)(e)===this.baseTimeframeMs?this.baseSeries:i(this.baseSeries,e,this.resampleOptions(t)));return!c||c.length===0?null:(this.replayStepsCache={key:s(),steps:c},c)}builtStepsZone(e,t){let n=this.adapter?(0,r.withResampling)(this.adapter):null;if(!(n instanceof r.ResamplingAdapter))return``;let i=n.bucketFor(e,t);return i?String(i.timeZone??`UTC`):``}replayTotal(){return this.chart.isReplayActive()?this.chart.getReplayProgress().total:this.chart.getData().length}syncReplayBar(){let e=this.replayBar;if(!e?.isMounted()||(e.setPending(this.seriesPending()),this.liftOverReplayBar(),e.getMode()!==`replay`))return;if(this.replayStartPending){e.setState(`paused`);return}if(!this.chart.isReplayActive()){this.teardownReplayUi();return}let t=this.chart.getReplayProgress(),n=this.chart.getReplayState();e.setProgress(t.current,t.total,this.replayTimeText()),e.setState(n===`stopped`?`paused`:n),e.setEnded(n!==`playing`&&t.total>0&&t.current>=t.total-1)}stepReplay(e){if(this.replayBar?.getMode()!==`replay`||this.seriesPending())return;let t=this.chart.getReplayProgress();this.chart.getReplayState()===`playing`&&this.chart.replayPause();let n=this.chart.getReplayBarIndex()>t.current?e>0?this.chart.getReplayBarIndex():t.current:t.current+e;this.chart.replaySeek(Math.max(0,Math.min(t.total-1,n))),this.replayBar.setState(`paused`),this.syncReplayBar()}handleReplayKey(e){if(e.defaultPrevented||e.isComposing||e.keyCode===yu||X()||vu()||!Y(this.root,!0))return!1;let t=document.activeElement;if(t&&t!==document.body&&!this.root.contains(t)||t&&(t.tagName===`INPUT`||t.tagName===`TEXTAREA`||t.tagName===`SELECT`||t.isContentEditable))return!1;let n=this.replayBar?.getMode();return e.shiftKey&&(e.key===`ArrowRight`||e.key===`ArrowLeft`)&&n===`replay`?(e.preventDefault(),e.stopPropagation(),this.stepReplay(e.key===`ArrowRight`?1:-1),!0):e.key===` `&&n===`replay`&&this.onChartSurface(t)?(e.preventDefault(),e.stopPropagation(),this.toggleReplayPlay(),!0):e.key===`Escape`&&n===`select`?(this.cancelReplayPick(),!0):!1}onChartSurface(e){return!e||!this.chartContainer.contains(e)?!1:e===this.chartContainer||e.closest(`button, [role="button"], a, .tcw-replay-bar`)===null}toggleReplayPlay(){if(this.replayStartPending){this.replayPlayWanted=!this.replayPlayWanted;return}this.chart.getReplayState()===`playing`?this.chart.replayPause():this.replayBarAtEnd()||this.chart.replayResume(),this.syncReplayBar()}replayBarAtEnd(){let e=this.chart.getReplayProgress();return e.total>0&&e.current>=e.total-1}positionReplayShade(e){let t=this.replayShade;if(!t)return;let n=this.chart.getPlotRect();if(e===null||e<n.x||e>n.x+n.width){t.hidden=!0;return}t.hidden=!1,t.style.left=`${e}px`,t.style.top=`${n.y}px`,t.style.width=`${n.x+n.width-e}px`,t.style.height=`${n.height}px`}exitReplay(){this.teardownReplayUi(),this.chart.replayStop()}teardownReplayUi(){this.replayStartSeq++,this.replayStartPending=!1,this.replayPlayWanted=!1,this.replayPollInterval&&=(clearInterval(this.replayPollInterval),null),this.removeReplayShade();let e=!!this.replayBar?.element()?.contains(document.activeElement);this.replayBar?.unmount(),this.replayBar=null,this.replayBarsTotal=null,this.replayStepTime=null,this.toolbar?.setActive(`replay`,!1),this.root.removeAttribute(`data-tcw-replay`),this.root.style.removeProperty(`--tcw-replay-lift`),this.bodyEl()?.style.removeProperty(`--tcw-replay-lift`),e&&this.focusAfterReplay()}focusAfterReplay(){let e=e=>!!e&&!e.hidden&&!e.closest(`[hidden]`)&&getComputedStyle(e).display!==`none`,t=this.root.querySelector(`.tcw-toolbar [data-role="replay"]`),n=this.root.querySelector(`.tcw-toolbar .tcw-toolbar-more`);(e(t)?t:e(n)?n:this.chartContainer)?.focus()}applySettings(e,t=!0){this.settingsState={...this.settingsState,...e},Object.keys(e).some(e=>!xu.has(e))&&this.layoutSession?.changed(),this.scheduleLegend(),e.gridVisible!==void 0&&this.chart.setGridVisible(e.gridVisible),e.volumeVisible!==void 0&&this.chart.setVolumeVisible(e.volumeVisible),e.volumeProfileVisible!==void 0&&this.chart.setVolumeProfileVisible(e.volumeProfileVisible),e.marketProfileVisible!==void 0&&this.chart.setMarketProfileVisible(e.marketProfileVisible),e.marketProfileSplit!==void 0&&this.chart.setMarketProfileConfig({splitBySession:e.marketProfileSplit}),e.marketProfileLetters!==void 0&&this.chart.setMarketProfileConfig({letters:e.marketProfileLetters}),e.marketProfileBuckets!==void 0&&this.chart.setMarketProfileConfig({buckets:e.marketProfileBuckets}),e.marketProfileOpacity!==void 0&&this.chart.setMarketProfileConfig({opacity:e.marketProfileOpacity}),e.depthHeatmapVisible!==void 0&&this.chart.setDepthHeatmapVisible(e.depthHeatmapVisible),e.depthHeatmapOpacity!==void 0&&this.chart.setDepthHeatmapConfig({opacity:e.depthHeatmapOpacity}),e.sessionShadingVisible!==void 0&&this.chart.setSessionShadingVisible(e.sessionShadingVisible),e.pivotMarkersVisible!==void 0&&this.chart.setPivotMarkersVisible(e.pivotMarkersVisible),e.pivotStrength!==void 0&&this.chart.setPivotMarkersConfig({left:e.pivotStrength,right:e.pivotStrength}),e.pivotStructureLabels!==void 0&&this.chart.setPivotMarkersConfig({structureLabels:e.pivotStructureLabels}),e.periodLevelsVisible!==void 0&&this.chart.setPeriodLevelsVisible(e.periodLevelsVisible),e.periodLevelsPeriod!==void 0&&this.chart.setPeriodLevelsPeriod(e.periodLevelsPeriod),e.legendVisible!==void 0&&this.chart.setLegend({visible:e.legendVisible}),e.barCountdown!==void 0&&this.chart.setBarCountdownVisible(e.barCountdown),e.indicatorValueLabels!==void 0&&this.chart.setIndicatorValueLabelsVisible(e.indicatorValueLabels),e.crosshairMode!==void 0&&this.chart.setCrosshairMode(e.crosshairMode),e.autoScale!==void 0&&this.chart.setAutoScale(e.autoScale),e.invertScale!==void 0&&this.chart.setInvertScale(e.invertScale),e.leftPriceScale!==void 0&&this.chart.setLeftPriceScaleVisible(e.leftPriceScale),(e.scaleMode!==void 0||e.autoScale!==void 0)&&queueMicrotask(()=>this.refreshScaleSwitches()),e.timezone!==void 0&&queueMicrotask(()=>this.statusBar?.tick()),e.scaleMode===void 0?e.logScale!==void 0&&(this.settingsState={...this.settingsState,scaleMode:e.logScale?`logarithmic`:`regular`},this.showScaleMode()):(this.settingsState={...this.settingsState,logScale:e.scaleMode===`logarithmic`},this.showScaleMode()),e.numberLocale!==void 0&&(this.chart.setNumberLocale(e.numberLocale),this.watchlist?.setLocale(e.numberLocale||void 0)),e.timezone!==void 0&&this.chart.setTimeZone(u(e.timezone)),e.highLowLines!==void 0&&this.chart.setHighLowLines(e.highLowLines),e.extendedHours!==void 0&&this.chart.setExtendedHours(e.extendedHours),e.mainSeriesVisible!==void 0&&this.chart.setMainSeriesVisible(e.mainSeriesVisible),e.chartTypeOptions!==void 0&&this.chart.setChartTypeOptions({...ao(),...e.chartTypeOptions}),t&&!this.settingsEdit&&this.publishSettings()}resetSettings(){let e={...this.settingsState},t=this.settingsStyle(),n={...this.settingsDefaults};this.touchSettings(Object.keys(n),T),this.applySettings(n),this.chart.resetOverrides([...T],{layer:`user`});let r={...this.settingsState},i=this.settingsStyle();this.settings?.refresh(this.shownSettings()),!(this.settingsEdit||JSON.stringify([e,t])===JSON.stringify([r,i]))&&this.chart.recordUndo({undo:()=>this.restoreSettings(e,t),redo:()=>this.restoreSettings(r,i)})}changeStyle(e){let t=Object.keys(e);this.touchSettings([],t);let n=this.settingsStyle(t);this.chart.applyOverrides(e,{layer:`user`});let r=this.settingsStyle(t);this.settingsEdit||JSON.stringify(n)===JSON.stringify(r)||this.chart.recordUndo({subject:`style:${Object.keys(e).sort().join(`,`)}`,undo:()=>this.restoreSettings({},n),redo:()=>this.restoreSettings({},r)})}changeSettings(e){let t=Object.keys(e);if(t.includes(`scaleMode`)||t.includes(`logScale`))for(let e of[`scaleMode`,`logScale`])t.includes(e)||t.push(e);let n=()=>Object.fromEntries(t.map(e=>[e,this.settingsState[e]]));this.touchSettings(t);let r=n(),i=t.includes(`scaleMode`),a=this.compareScaleHeld;i&&(this.compareScaleHeld=!1),this.applySettings(e);let o=n();this.settingsEdit||JSON.stringify(r)===JSON.stringify(o)&&a===this.compareScaleHeld||this.chart.recordUndo({subject:`settings:${Object.keys(e).sort().join(`,`)}`,undo:()=>this.restoreSettings(r,null,i?a:void 0),redo:()=>this.restoreSettings(o,null,i?!1:void 0)})}settingsStyle(e=T){let t=this.chart.getOverrides?.({layer:`user`})??{},n=Object.fromEntries(e.map(e=>{let n=t[e];return[e,typeof n==`string`||typeof n==`boolean`||typeof n==`number`?n:null]}));return{theme:this.chart.getTheme()?.name??``,overrides:n}}restoreSettings(e,t=null,n){n!==void 0&&(this.compareScaleHeld=n&&this.compares.length>0),this.applySettings(e),t&&t.theme===(this.chart.getTheme()?.name??``)&&this.chart.applyOverrides(t.overrides,{layer:`user`}),this.settings?.refresh(this.shownSettings())}async connectStream(){if(!this.adapter)return;let e=++this.connectSeq;this.state={...this.state,connectionState:`connecting`,connectionMessage:this.t(`status.connecting`)},this.updateUI(),this.loading.begin(this.chart.getData().length>0);try{if(this.chart.disconnectStream(),await this.chart.connect({adapter:this.adapter,symbol:this.state.symbol,timeframe:this.state.timeframe,historyLimit:this.options.historyLimit??500,historyPageSize:this.options.historyPageSize}),e!==this.connectSeq||this.destroyed)return;this.chart.setWatermark(this.state.symbol.replace(`USDT`,` / USDT`),{fontSize:48,color:this.state.isDark?`rgba(255,255,255,0.03)`:`rgba(0,0,0,0.03)`}),this.applySymbolLayout(this.state.symbol),this.loading.hasFailed()?this.state={...this.state,connectionState:`error`}:(this.loading.end(),this.state={...this.state,connectionState:`connected`,connectionMessage:this.t(`status.live`)}),this.refetchCompares()}catch(t){if(e!==this.connectSeq||this.destroyed)return;this.loading.fail(this.t(`status.connectionFailed`)),this.state={...this.state,connectionState:`error`,connectionMessage:t instanceof Error?t.message:this.t(`status.connectionFailed`)}}this.updateUI()}scheduleLegend(){!this.indicatorLegend||this.legendFrame||!this.featureState.indicatorLegend||(this.legendFrame=requestAnimationFrame(()=>{this.legendFrame=0,this.renderLegend()}))}renderLegend(){if(!this.indicatorLegend||this.destroyed)return;let e=this.chart.getData().length-1,t=this.chart.isTimeAligned(),n=t?this.legendHoverIndex:null,r=n===null?e:Math.min(Math.max(n,0),e),i=new Map;for(let e of this.chart.getIndicatorPanes())(e.instanceIds??[e.instanceId]).forEach((t,n)=>i.set(t,{...e.rect,row:n}));let a=this.settingsState.numberLocale||`en-US`,o=hl(r>=0?this.chart.getCompareValues?.(n===null?void 0:r)??[]:[],a,t),s=this.chart.getActiveIndicators().map(e=>{let t=i.get(e.instanceId)??null,n=r>=0?this.chart.getIndicatorOutput(e.instanceId)?.series?.[r]:null,o=this.chart.getIndicatorStyle(e.instanceId),s=e.visible&&e.shown===!1,c=s?[]:sl(e.descriptor,n,o?.colors??[],o?.plots);return{instanceId:e.instanceId,label:Ji(e,this.t),visible:e.visible,offInterval:s,values:c.map(e=>({text:t?ul(e.value,a):this.chart.formatPrice(e.value),color:e.color})),pane:t?{x:t.x+uu,y:t.y+Math.min(du+t.row*fu,Math.max(du,t.height-fu)),width:t.width-2*uu}:null}}),c=[...o,...s],l=this.chart.getPlotRect(),u=this.chart.getMaximizedPane(),d=e=>c.find(t=>t.instanceId===e)?.label??``,f=this.chart.getIndicatorPanes().map(e=>({instanceId:e.instanceId,x:e.rect.x+e.rect.width-uu,y:e.rect.y+pu,label:d(e.instanceId),collapsed:this.chart.isPaneCollapsed(e.instanceId),maximized:u===e.instanceId,canMoveUp:this.chart.canMovePane(e.instanceId,-1),canMoveDown:this.chart.canMovePane(e.instanceId,1)}));this.indicatorLegend.update(c,{left:l.x+uu,top:this.chart.getLegendBottom()+1},f)}runPaneAction(e,t){t===`up`||t===`down`?this.chart.movePane(e,t===`up`?-1:1):t===`collapse`||t===`expand`?this.chart.setPaneCollapsed(e,t===`collapse`):this.chart.setMaximizedPane(t===`maximize`?e:null),this.scheduleLegend()}openLegendMenu(e,t){let n=this.legendMenu;if(!n)return;if(n.isOpen()){n.close();return}let r=[`price`,...this.chart.getIndicatorPanes().map(e=>e.instanceId)],i=1+this.chart.getIndicatorPanes().findIndex(t=>t.instanceIds.includes(e)),a=r[i-1],o=r[i+1],s=t=>t!==void 0&&this.chart.canMoveIndicatorToPane(e,t),c=[];s(a)&&c.push({id:`move:${a}`,label:this.t(a===`price`?`legend.movePrice`:`legend.moveUp`),icon:`arrowUp`}),s(o)&&c.push({id:`move:${o}`,label:this.t(`legend.moveDown`),icon:`arrowDown`}),s(`new`)&&c.push({id:`move:new`,label:this.t(`legend.moveNew`),icon:`plus`}),a!==`price`&&s(`price`)&&c.push({id:`move:price`,label:this.t(`legend.movePrice`),icon:`trendingUp`});let l=[];this.featureState.indicatorSettings&&this.featureState[`indicatorLegend.settings`]&&l.push({id:`settings`,label:this.t(`legend.settings`),icon:`settings`}),this.featureState[`indicatorLegend.remove`]&&l.push({id:`remove`,label:this.t(`legend.remove`),icon:`trash`,danger:!0}),c.length>0&&l.length>0&&c.push(`separator`),c.push(...l);let u=this.chart.getActiveIndicators().find(t=>t.instanceId===e)?.id??``,d=this.options.indicatorMenuItems?.({instanceId:e,indicatorId:u})??[],f=Ul(c,d);if(f.length===0)return;let p=t.getBoundingClientRect(),m=this.root.getBoundingClientRect();n.open(f,p.left-m.left,p.bottom-m.top+2,t=>{Wl(t,d)||(t===`settings`?this.openIndicatorSettings(e):t===`remove`?this.handleRemoveIndicator(e):t.startsWith(`move:`)&&this.chart.moveIndicatorToPane(e,t.slice(5)),this.scheduleLegend())},t)}updateUI(){this.refreshDrawingsState(),this.scheduleLegend(),this.toolbar?.update(this.state),this.sidebar?.update(this.state),this.statusBar?.update({connectionState:this.state.connectionState,message:this.state.connectionMessage,symbol:this.state.symbol,timeframe:this.state.timeframe})}resolveIsDark(e){return e===void 0||e===`dark`?!0:e===`light`?!1:typeof e==`object`&&e.background?this.isColorDark(e.background):!0}resolveTheme(e){return e===void 0||e===`dark`?n.DARK_THEME:e===`light`?n.LIGHT_THEME:typeof e==`object`?e:n.DARK_THEME}isColorDark(e){if(e.startsWith(`#`)&&e.length>=7){let t=parseInt(e.slice(1,3),16),n=parseInt(e.slice(3,5),16),r=parseInt(e.slice(5,7),16);return t+n+r<384}return!0}};function Ou(e,t,i){let a=e=>{let t=(0,r.sourceParam)(e.descriptor);return t&&(0,n.parseIndicatorSource)(e.params[t])?.instanceId||null},o=new Set([e]);for(let e=!0;e;){e=!1;for(let n of t){let t=a(n);t&&o.has(t)&&!o.has(n.instanceId)&&(o.add(n.instanceId),e=!0)}}let s=[];for(let e of t){if(o.has(e.instanceId))continue;let t=Ji(e,i);for(let r of e.descriptor.plots??[])s.push({value:(0,n.indicatorSource)(e.instanceId,r.key),label:`${t}: ${r.title}`})}return s}var ku=`tcw:recentCommands`,Au=10;function ju(){try{let e=JSON.parse(Iu()?.getItem(ku)??`[]`);return Array.isArray(e)?e.filter(e=>typeof e==`string`).slice(0,Au):[]}catch{return[]}}function Mu(e){try{Iu()?.setItem(ku,JSON.stringify(e.slice(0,Au)))}catch{}}var Nu=`tcw:dockWidth`;function Pu(){try{let e=Number(Iu()?.getItem(Nu)??NaN);return Number.isFinite(e)&&e>0?e:null}catch{return null}}function Fu(e){try{Iu()?.setItem(Nu,String(e))}catch{}}function Iu(){try{return typeof localStorage<`u`?localStorage:null}catch{return null}}function Lu(e){let t=e.filter(e=>e!==null);if(t.length===0)return null;let n=Math.min(...t.map(e=>e.x)),r=Math.min(...t.map(e=>e.y)),i=Math.max(...t.map(e=>e.x+e.width)),a=Math.max(...t.map(e=>e.y+e.height));return{x:n,y:r,width:i-n,height:a-r}}function Ru(e){return!!e&&/^(ar|he|iw|fa|ur|ps|yi|dv|ckb|sd|ug)(-|$)/i.test(e)}var zu={symbol:!1,interval:!1,crosshair:!0,time:!1,drawings:!1,replay:!1},Bu=[`symbol`,`interval`,`crosshair`,`time`,`drawings`,`replay`],Vu={"1x1":{cols:1,rows:1},"1x2":{cols:2,rows:1},"2x1":{cols:1,rows:2},"2x2":{cols:2,rows:2},"1x3":{cols:3,rows:1},"3x1":{cols:1,rows:3},"2x3":{cols:3,rows:2},"3x2":{cols:2,rows:3}};function Hu(e){return typeof e==`string`&&Object.prototype.hasOwnProperty.call(Vu,e)}function Uu(e){return JSON.parse(JSON.stringify(e))}function Wu(e,t,n=16){let r=(20-2*(e-1))/e,i=(20-2*(t-1))/t,a=``;for(let n=0;n<t;n++)for(let t=0;t<e;t++)a+=`<rect x="${2+t*(r+2)}" y="${2+n*(i+2)}" width="${r}" height="${i}" rx="1"/>`;return`<svg width="${n}" height="${n}" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" aria-hidden="true">${a}</svg>`}function Gu(e){if(typeof e!=`object`||!e)return null;let t=e;if(t.v!==1||t.kind!==`grid`||!Hu(t.layout)||!Array.isArray(t.cells))return null;let n=t.cells.map(xc);if(n.some(e=>e===null))return null;let r=typeof t.sync==`object`&&t.sync!==null?t.sync:{},i={...zu};for(let e of Bu)typeof r[e]==`boolean`&&(i[e]=r[e]);let a=typeof t.active==`number`&&Number.isInteger(t.active)?t.active:0;return{v:1,kind:`grid`,layout:t.layout,sync:i,active:a,cells:n}}var Ku=class{root;cellsEl;cells=[];layout;sync;active=0;hovered=null;relayDepth=0;uiTheme=null;styleOverrides={};featureSwitches={};parked=new Map;drawingFrame=0;drawingSource=null;layoutButtons=new Map;syncButtons=new Map;layoutsButton=null;tabsEl=null;stopNarrow=()=>{};session=null;layoutsUI=null;t;destroyed=!1;unregisterKeys=()=>{};onKeyDown=e=>{!(e.ctrlKey||e.metaKey)||e.altKey||e.shiftKey||e.key!==`s`&&e.key!==`S`||!this.layoutsUI||X()||!Y(this.root,!0)||(e.preventDefault(),this.layoutsUI.save())};constructor(e,n={}){this.options=n,this.layout=Hu(n.layout)?n.layout:`1x2`,this.sync={...zu,...n.sync},this.t=t.n(t.o(n.widget?.locale,n.widget?.messages)),$e(),this.root=document.createElement(`div`),this.root.className=`tcw-root tcw-grid`,this.root.dataset.tcwTheme=n.widget?.theme===`light`?`light`:`dark`,W(this.root,U(n.widget?.ui),{variables:n.widget?.ui!==void 0}),n.bar!==!1&&this.root.appendChild(this.buildBar()),this.cellsEl=document.createElement(`div`),this.cellsEl.className=`tcw-grid-cells`,this.root.appendChild(this.cellsEl),e.appendChild(this.root),this.stopNarrow=Ec(this.root),this.applyShape();for(let e=0;e<this.shapeCount();e++)this.cells.push(this.createCell(e));this.markActive();let r=this.cells[0]?.el.querySelector(`.tcw-root`)?.dataset.tcwTheme;r&&(this.root.dataset.tcwTheme=r),n.layouts!==!1&&this.setupLayouts(n.layouts===!0||n.layouts===void 0?{}:n.layouts),this.unregisterKeys=_c(this.root),document.addEventListener(`keydown`,this.onKeyDown)}get relaying(){return this.relayDepth>0}quietly(e){this.relayDepth++;try{return e()}finally{this.relayDepth--}}getWidget(e){return this.cells[e]?.widget??null}getWidgets(){return this.cells.map(e=>e.widget)}getActiveIndex(){return this.active}getActiveWidget(){return this.cells[this.active].widget}setActive(e){e<0||e>=this.cells.length||e===this.active||(this.active=e,this.markActive(),this.options.onActiveChange?.(e,this.cells[e].widget),this.session?.changed())}getLayout(){return this.layout}setLayout(e){if(e===this.layout||!Hu(e))return;this.layout=e;let t=this.shapeCount();for(;this.cells.length>t;){let e=this.cells.length-1,t=this.cells.pop();this.parked.set(e,t.widget.captureLayout()),this.destroyCell(t)}this.applyShape();for(let e=this.cells.length;e<t;e++){let t=this.createCell(e);this.cells.push(t),this.unpark(e,t)}this.active>=t&&(this.active=0,this.options.onActiveChange?.(0,this.cells[0].widget)),this.markActive(),this.renderBar(),this.session?.changed()}getSync(){return{...this.sync}}setUI(e){let t=U(e);W(this.root,t);for(let e of this.cells)e.widget.setUI(t);this.uiTheme=t}getUI(){return U(this.uiTheme??this.options.widget?.ui)}setSync(e){let t=this.sync;if(this.sync={...this.sync,...e},t.crosshair&&!this.sync.crosshair)for(let e of this.cells)e.widget.getChart().setCrosshairTime(null);let n=this.cells[this.active];if(n&&!this.relaying){let e=n.widget.getSymbol(),r=n.widget.getTimeframe();!t.symbol&&this.sync.symbol&&this.relay(n,t=>void t.setSymbol(e)),!t.interval&&this.sync.interval&&this.relay(n,e=>void e.setTimeframe(r)),!t.drawings&&this.sync.drawings&&this.mergeDrawings()}this.renderBar(),this.session?.changed()}applyOverrides(e){for(let t of this.cells)t.widget.getChart().applyOverrides(e);let t={...this.styleOverrides};for(let[n,r]of Object.entries(e))r==null?delete t[n]:t[n]=r;this.styleOverrides=t}setFeatures(e){let t=Ve(e);for(let e of this.cells)e.widget.setFeatures(t);this.featureSwitches={...this.featureSwitches,...t}}setTheme(e){for(let t of this.cells)t.widget.setTheme(e);this.followTheme()}getLayoutSession(){return this.session}captureLayout(){let e=[...this.parked.entries()].sort(([e],[t])=>e-t).map(([,e])=>e);return{v:1,kind:`grid`,layout:this.layout,sync:{...this.sync},active:this.active,cells:[...this.cells.map(e=>e.widget.captureLayout()),...e]}}async restoreLayout(e){this.relayDepth++;let t;try{this.parked.clear(),this.setLayout(e.layout),this.sync={...e.sync},this.renderBar();let n=this.cells.length;e.cells.slice(n).forEach((e,t)=>this.parked.set(n+t,e)),t=await Promise.allSettled(this.cells.map((t,n)=>e.cells[n]?t.widget.restoreLayout(e.cells[n]):Promise.resolve()))}finally{this.relayDepth--}if(this.destroyed)return;this.setActive(Math.min(Math.max(0,e.active),this.cells.length-1)),this.renderTabs();let n=t.find(e=>e.status===`rejected`);if(n)throw n.reason}getLayoutContent(){return JSON.stringify(this.captureLayout())}async applyLayoutContent(e){let t=Gu(Sc(e));return t?(await this.restoreLayout(t),!0):!1}destroy(){if(!this.destroyed){this.destroyed=!0,document.removeEventListener(`keydown`,this.onKeyDown),this.unregisterKeys(),this.stopNarrow(),this.drawingFrame&&cancelAnimationFrame(this.drawingFrame),this.session?.destroy(),this.layoutsUI?.destroy();for(let e of this.cells)this.destroyCell(e);this.cells=[],this.root.remove(),et()}}shapeCount(){let{cols:e,rows:t}=Vu[this.layout];return e*t}applyShape(){let{cols:e,rows:t}=Vu[this.layout];this.cellsEl.style.gridTemplateColumns=`repeat(${e}, minmax(0, 1fr))`,this.cellsEl.style.gridTemplateRows=`repeat(${t}, minmax(0, 1fr))`}createCell(e){let n=document.createElement(`div`);n.className=`tcw-grid-cell`,n.setAttribute(`role`,`region`),n.setAttribute(`aria-label`,t.r(this.t(`grid.chart`),{n:e+1})),this.cellsEl.appendChild(n);let r=this.options.widget??{},i=this.options.cells?.[e]??{},a=this.cells[this.active]?.widget,o={},s=new Du(n,{...r,...i,...a&&this.sync.symbol?{symbol:a.getSymbol()}:{},...a&&this.sync.interval?{timeframe:a.getTimeframe()}:{},...this.options.adapter&&!i.adapter?{adapter:this.options.adapter(e)}:{},...this.uiTheme?{ui:this.uiTheme}:{},layouts:!1,...i.persistSettings===void 0&&r.persistSettings?{persistSettings:{key:`${go(r.persistSettings)}:${e}`}}:{},features:{dock:!1,...r.features,...i.features},onSymbolChange:e=>{i.onSymbolChange?.(e),r.onSymbolChange?.(e),this.sync.symbol&&this.relay(o,t=>void t.setSymbol(e)),this.renderTabs(),this.session?.changed()},onTimeframeChange:e=>{i.onTimeframeChange?.(e),r.onTimeframeChange?.(e),this.sync.interval&&this.relay(o,t=>void t.setTimeframe(e)),this.renderTabs(),this.session?.changed()}});return o.el=n,o.widget=s,Object.keys(this.styleOverrides).length>0&&s.getChart().applyOverrides(this.styleOverrides),Object.keys(this.featureSwitches).length>0&&s.setFeatures(this.featureSwitches),this.wireCell(o),n.addEventListener(`pointerdown`,()=>this.setActive(this.cells.indexOf(o)),!0),n.addEventListener(`pointerenter`,()=>{this.hovered=o}),n.addEventListener(`pointerleave`,()=>{this.hovered===o&&(this.hovered=null)}),this.options.onChartAdd?.(s,e),o}wireCell(e){let t=e.widget.getChart(),n=()=>this.cells.filter(t=>t!==e);t.on(`crosshairMove`,e=>{let t=e.payload.bar?.time;if(!(!this.sync.crosshair||t===void 0))for(let e of n())e.widget.getChart().setCrosshairTime(t)}),t.on(`crosshairLeave`,()=>{if(this.sync.crosshair)for(let e of n())e.widget.getChart().setCrosshairTime(null)}),t.on(`visibleRangeChange`,n=>{if(!this.sync.time||this.relaying||(this.hovered??this.cells[this.active])!==e)return;let{from:r,to:i}=n.payload,a=t.getData(),o=a[r]?.time,s=a[i]?.time;o===void 0||s===void 0||this.relay(e,e=>e.getChart().setVisibleRange(o,s))});for(let n of[`drawingCreate`,`drawingUpdate`,`drawingRemove`])t.on(n,()=>{this.sync.drawings&&!this.relaying&&this.copyDrawingsSoon(e)});t.on(`replayStep`,t=>{if(!this.sync.replay||this.relaying||t.payload.cause===`series`)return;let{until:n}=t.payload;this.relay(e,e=>{let t=e.getChart();if(t.isReplayActive()){t.replaySeekToTime(n);return}let r=qu(t.getData(),n);r>=0&&t.replayStart({startIndex:r,paused:!0})})}),t.on(`replayState`,t=>{!this.sync.replay||this.relaying||t.payload.state!==`stopped`||this.relay(e,e=>{e.getChart().isReplayActive()&&e.getChart().replayStop()})}),t.on(`stateChange`,()=>this.session?.changed()),e.widget.onSettingsChange(()=>this.session?.changed()),t.on(`themeChange`,()=>{this.relaying||this.followTheme(e)})}destroyCell(e){this.hovered===e&&(this.hovered=null),this.drawingSource===e&&(this.drawingSource=null),this.quietly(()=>e.widget.destroy()),e.el.remove()}relay(e,t){this.relaying||this.quietly(()=>{for(let n of this.cells)n!==e&&t(n.widget)})}unpark(e,t){let n=this.parked.get(e);if(!n)return;this.parked.delete(e);let r=this.cells[this.active]?.widget,i={...n,...r&&this.sync.symbol?{symbol:r.getSymbol()}:{},...r&&this.sync.interval?{timeframe:r.getTimeframe()}:{}};this.relayDepth++,t.widget.restoreLayout(i).catch(()=>t.widget.toast(this.t(`layouts.openFailed`),`error`)).finally(()=>{this.relayDepth--})}copyDrawingsSoon(e){this.drawingSource=e,!this.drawingFrame&&(this.drawingFrame=requestAnimationFrame(()=>{this.drawingFrame=0;let e=this.drawingSource;this.drawingSource=null,e&&!this.destroyed&&!this.relaying&&this.copyDrawings(e)}))}copyDrawings(e){let t=e.widget.getSymbol(),n=e.widget.getChart().getDrawings();this.quietly(()=>{for(let r of this.cells)r!==e&&r.widget.getSymbol()===t&&r.widget.getChart().setDrawings(Uu(n))})}mergeDrawings(){let e=new Map;for(let t of this.cells)e.set(t.widget.getSymbol(),[...e.get(t.widget.getSymbol())??[],t]);this.quietly(()=>{for(let t of e.values()){if(t.length<2)continue;let e=new Map;for(let n of t)for(let t of n.widget.getChart().getDrawings())e.has(t.id)||e.set(t.id,t);let n=[...e.values()];for(let e of t)e.widget.getChart().setDrawings(Uu(n))}})}followTheme(e=this.cells[this.active]){let t=e?.el.querySelector(`.tcw-root`)?.dataset.tcwTheme;t&&(this.root.dataset.tcwTheme=t,this.quietly(()=>{for(let n of this.cells)n!==e&&n.el.querySelector(`.tcw-root`)?.dataset.tcwTheme!==t&&n.widget.setTheme(t)}))}markActive(){this.cells.forEach((e,t)=>{e.el.classList.toggle(`tcw-grid-cell-active`,t===this.active&&this.cells.length>1),e.el.classList.toggle(`tcw-grid-cell-current`,t===this.active)}),this.renderTabs()}renderTabs(){let e=this.tabsEl;if(!e)return;let t=this.cells.map(e=>`${e.widget.getSymbol()} · ${e.widget.getTimeframe()}`);for(;e.children.length>t.length;)e.lastElementChild?.remove();for(;e.children.length<t.length;){let t=e.children.length,n=document.createElement(`button`);n.type=`button`,n.className=`tcw-btn tcw-grid-tab`,n.addEventListener(`click`,()=>this.setActive(t)),e.appendChild(n)}t.forEach((t,n)=>{let r=e.children[n];r.textContent!==t&&(r.textContent=t);let i=n===this.active;r.classList.toggle(`tcw-active`,i),r.setAttribute(`aria-pressed`,String(i))})}buildBar(){let e=document.createElement(`div`);e.className=`tcw-grid-bar`,e.setAttribute(`role`,`toolbar`),e.setAttribute(`aria-label`,this.t(`grid.bar`)),this.tabsEl=document.createElement(`div`),this.tabsEl.className=`tcw-grid-group tcw-grid-tabs`,this.root.classList.add(`tcw-grid-has-tabs`),this.tabsEl.setAttribute(`role`,`group`),this.tabsEl.setAttribute(`aria-label`,this.t(`grid.charts`)),e.appendChild(this.tabsEl);let n=document.createElement(`div`);n.className=`tcw-grid-group`,n.setAttribute(`role`,`group`),n.setAttribute(`aria-label`,this.t(`grid.layout`));let r=this.options.layoutChoices?.filter(Hu)??Object.keys(Vu);for(let e of r){let{cols:r,rows:i}=Vu[e],a=r*i===1?this.t(`grid.single`):t.r(this.t(`grid.layoutOption`),{count:r*i,cols:r,rows:i}),o=document.createElement(`button`);o.type=`button`,o.className=`tcw-btn-icon`,o.title=a,o.setAttribute(`aria-label`,a),o.innerHTML=Wu(r,i),o.addEventListener(`click`,()=>this.setLayout(e)),this.layoutButtons.set(e,o),n.appendChild(o)}let i=document.createElement(`div`);i.className=`tcw-grid-group`,i.setAttribute(`role`,`group`),i.setAttribute(`aria-label`,this.t(`grid.sync`));let a=document.createElement(`span`);a.className=`tcw-grid-label`,a.innerHTML=`${D(`link`,13)}<span>${O(this.t(`grid.sync`))}</span>`,i.appendChild(a);for(let e of Bu){let t=document.createElement(`button`);t.type=`button`,t.className=`tcw-btn tcw-grid-sync`,t.textContent=this.t(`grid.sync.${e}`),t.title=this.t(`grid.sync.${e}.hint`),t.addEventListener(`click`,()=>this.setSync({[e]:!this.sync[e]})),this.syncButtons.set(e,t),i.appendChild(t)}let o=document.createElement(`span`);return o.className=`tcw-toolbar-spacer`,e.append(n,this.sep(),i,o),this.options.layouts!==!1&&(this.layoutsButton=document.createElement(`button`),this.layoutsButton.type=`button`,this.layoutsButton.className=`tcw-dropdown-trigger tcw-layouts-btn`,this.layoutsButton.setAttribute(`aria-haspopup`,`menu`),this.layoutsButton.addEventListener(`click`,()=>{this.layoutsButton&&this.layoutsUI?.openMenu(this.layoutsButton)}),e.appendChild(this.layoutsButton)),this.renderBar(),e}sep(){let e=document.createElement(`span`);return e.className=`tcw-toolbar-sep`,e}renderBar(){for(let[e,t]of this.layoutButtons){let n=e===this.layout;t.classList.toggle(`tcw-active`,n),t.setAttribute(`aria-pressed`,String(n))}for(let[e,t]of this.syncButtons)t.classList.toggle(`tcw-active`,this.sync[e]),t.setAttribute(`aria-pressed`,String(this.sync[e]));this.renderLayoutsButton()}renderLayoutsButton(){let e=this.layoutsButton;if(!e)return;let t=this.session?.current()?.name??this.t(`layouts.unnamed`),n=this.session?.isDirty()??!1,r=`${this.t(`toolbar.layouts`)}: ${t}${n?` (${this.t(`layouts.unsavedChanges`)})`:``}`;e.innerHTML=`${D(`save`,14)}<span class="tcw-layouts-label">${O(t)}</span>`+(n?`<span class="tcw-layouts-dirty" aria-hidden="true"></span>`:``)+D(`chevronDown`,12),e.title=r,e.setAttribute(`aria-label`,r)}setupLayouts(t){let n=new e.t(t.storage??e.i(`tcw:grid-layouts:`),{capture:()=>{let e=this.cells[this.active].widget;return{content:this.getLayoutContent(),symbol:e.getSymbol(),timeframe:e.getTimeframe()}},apply:async e=>{if(!await this.applyLayoutContent(e.content))throw Error(`Not a grid layout`)}},{autoSave:t.autoSave,debounceMs:t.debounceMs,kind:`grid`,onChange:()=>this.renderLayoutsButton(),onError:()=>this.toast(this.t(`layouts.saveFailed`),`error`)});this.session=n,this.layoutsUI=new uc(n,{root:this.root,t:this.t,toast:(e,t)=>this.toast(e,t),formatTime:e=>{let{date:t,time:n}=Z(e,null);return`${t} ${n}`}}),this.renderLayoutsButton(),t.openLast&&n.list().then(([e])=>e&&!this.destroyed?this.layoutsUI?.open(e.id):void 0,()=>void 0)}toast(e,t=`info`){this.cells[this.active]?.widget.toast(e,t)}};function qu(e,t){let n=-1;for(let r=0;r<e.length&&e[r].time<t;r++)n=r;return n}Object.defineProperty(exports,`CHART_TYPE_ICONS`,{enumerable:!0,get:function(){return n.CHART_TYPE_ICONS}}),exports.ChartWidget=Du,exports.ChartWidgetGrid=Ku,exports.DEFAULT_GRID_SYNC=zu,Object.defineProperty(exports,`DRAWING_TOOL_ICONS`,{enumerable:!0,get:function(){return n.DRAWING_TOOL_ICONS}}),exports.EN_MESSAGES=t.c,exports.GRID_SHAPES=Vu,exports.LayoutSession=e.t,exports.MAX_LAYOUT_NAME=e.n,Object.defineProperty(exports,`UI_ICONS`,{enumerable:!0,get:function(){return n.UI_ICONS}}),exports.VI_MESSAGES=t.s,exports.WIDGET_FEATURES=Fe,exports.WIDGET_UI_PRESETS=ia,exports.applyWidgetUI=W,exports.cleanLayoutName=e.r,exports.createChartTypeIcon=rt,exports.createIcon=D,exports.createToolIcon=nt,exports.findWidgetLocale=t.i,Object.defineProperty(exports,`iconSvg`,{enumerable:!0,get:function(){return n.iconSvg}}),exports.localStorageLayouts=e.i,exports.memoryLayouts=e.a,exports.readGridLayout=Gu,exports.readWatchlists=mi,exports.readWidgetLayout=xc,exports.registerWidgetLocale=t.a,exports.resolveWidgetUI=U,exports.widgetUIVariables=fa;
7447
7663
  //# sourceMappingURL=index.cjs.map