From 03afed89f75b7b56616db99b61da2cd47bc7d4fa Mon Sep 17 00:00:00 2001 From: MarSeventh <1193267292@qq.com> Date: Sat, 3 Jan 2026 01:12:41 +0800 Subject: [PATCH] =?UTF-8?q?Feat:=E8=AE=BF=E5=AE=A2=E5=9B=BE=E5=BA=93?= =?UTF-8?q?=E4=BD=93=E9=AA=8C=E4=BC=98=E5=8C=96;Discord=E6=B8=A0=E9=81=93?= =?UTF-8?q?=E8=AE=BF=E9=97=AE=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- css/289.f7890ec7.css | 1 + css/289.f7890ec7.css.gz | Bin 0 -> 9848 bytes css/424.0b141552.css | 1 - css/424.0b141552.css.gz | Bin 9825 -> 0 bytes css/{72.15fbe389.css => 667.a3c83e09.css} | 2 +- css/667.a3c83e09.css.gz | Bin 0 -> 8626 bytes css/72.15fbe389.css.gz | Bin 8269 -> 0 bytes functions/file/fileTools.js | 43 +++++++++++++----- index.html | 2 +- index.html.gz | Bin 511 -> 510 bytes js/{424.28a751ba.js => 289.8c3b6ce7.js} | 6 +-- js/289.8c3b6ce7.js.gz | Bin 0 -> 83430 bytes js/289.8c3b6ce7.js.map | 1 + js/289.8c3b6ce7.js.map.gz | Bin 0 -> 300980 bytes js/424.28a751ba.js.gz | Bin 83367 -> 0 bytes js/424.28a751ba.js.map | 1 - js/424.28a751ba.js.map.gz | Bin 300876 -> 0 bytes js/667.bbd60d43.js | 2 + js/667.bbd60d43.js.gz | Bin 0 -> 47884 bytes js/667.bbd60d43.js.map | 1 + js/667.bbd60d43.js.map.gz | Bin 0 -> 163440 bytes js/72.8c39bf3e.js | 2 - js/72.8c39bf3e.js.gz | Bin 46752 -> 0 bytes js/72.8c39bf3e.js.map | 1 - js/72.8c39bf3e.js.map.gz | Bin 160516 -> 0 bytes js/{app.d2aa04d7.js => app.41abafbc.js} | 4 +- js/app.41abafbc.js.gz | Bin 0 -> 4907 bytes ...pp.d2aa04d7.js.map => app.41abafbc.js.map} | 2 +- js/app.41abafbc.js.map.gz | Bin 0 -> 15252 bytes js/app.d2aa04d7.js.gz | Bin 4904 -> 0 bytes js/app.d2aa04d7.js.map.gz | Bin 15252 -> 0 bytes 31 files changed, 44 insertions(+), 25 deletions(-) create mode 100644 css/289.f7890ec7.css create mode 100644 css/289.f7890ec7.css.gz delete mode 100644 css/424.0b141552.css delete mode 100644 css/424.0b141552.css.gz rename css/{72.15fbe389.css => 667.a3c83e09.css} (67%) create mode 100644 css/667.a3c83e09.css.gz delete mode 100644 css/72.15fbe389.css.gz rename js/{424.28a751ba.js => 289.8c3b6ce7.js} (75%) create mode 100644 js/289.8c3b6ce7.js.gz create mode 100644 js/289.8c3b6ce7.js.map create mode 100644 js/289.8c3b6ce7.js.map.gz delete mode 100644 js/424.28a751ba.js.gz delete mode 100644 js/424.28a751ba.js.map delete mode 100644 js/424.28a751ba.js.map.gz create mode 100644 js/667.bbd60d43.js create mode 100644 js/667.bbd60d43.js.gz create mode 100644 js/667.bbd60d43.js.map create mode 100644 js/667.bbd60d43.js.map.gz delete mode 100644 js/72.8c39bf3e.js delete mode 100644 js/72.8c39bf3e.js.gz delete mode 100644 js/72.8c39bf3e.js.map delete mode 100644 js/72.8c39bf3e.js.map.gz rename js/{app.d2aa04d7.js => app.41abafbc.js} (58%) create mode 100644 js/app.41abafbc.js.gz rename js/{app.d2aa04d7.js.map => app.41abafbc.js.map} (71%) create mode 100644 js/app.41abafbc.js.map.gz delete mode 100644 js/app.d2aa04d7.js.gz delete mode 100644 js/app.d2aa04d7.js.map.gz diff --git a/css/289.f7890ec7.css b/css/289.f7890ec7.css new file mode 100644 index 0000000..7baa8c8 --- /dev/null +++ b/css/289.f7890ec7.css @@ -0,0 +1 @@ +.sidebar-container[data-v-2bd8175a]{display:flex;flex-direction:column;position:fixed;top:50%;left:8px;transform:translateY(-50%);z-index:2001;width:150px;background:hsla(0,0%,100%,.72);backdrop-filter:blur(20px) saturate(180%);-webkit-backdrop-filter:blur(20px) saturate(180%);border:1px solid hsla(0,0%,100%,.3);border-radius:16px;box-shadow:0 4px 30px rgba(0,0,0,.1),0 1px 3px rgba(0,0,0,.05),inset 0 1px 0 hsla(0,0%,100%,.4);transition:width .3s ease,box-shadow .3s ease;overflow:hidden}.sidebar-container.is-collapsed[data-v-2bd8175a]{width:56px}html.dark .sidebar-container[data-v-2bd8175a]{background:rgba(30,30,30,.75);border:1px solid hsla(0,0%,100%,.08);box-shadow:0 4px 30px rgba(0,0,0,.3),0 1px 3px rgba(0,0,0,.2),inset 0 1px 0 hsla(0,0%,100%,.05)}.sidebar-container[data-v-2bd8175a]:hover{box-shadow:0 8px 40px rgba(0,0,0,.12),0 2px 6px rgba(0,0,0,.08),inset 0 1px 0 hsla(0,0%,100%,.5)}html.dark .sidebar-container[data-v-2bd8175a]:hover{box-shadow:0 8px 40px rgba(0,0,0,.4),0 2px 6px rgba(0,0,0,.3),inset 0 1px 0 hsla(0,0%,100%,.08)}.menu-list[data-v-2bd8175a]{padding:8px}.menu-item[data-v-2bd8175a]{display:flex;align-items:center;padding:12px;height:42px;box-sizing:border-box;border-radius:10px;cursor:pointer;transition:background .2s ease,color .2s ease,padding .25s ease;color:var(--admin-container-color,#333);gap:0;overflow:hidden}.sidebar-container.is-collapsed .menu-item[data-v-2bd8175a]{padding:12px 0}.menu-item[data-v-2bd8175a]:hover{background:rgba(0,0,0,.06)}html.dark .menu-item[data-v-2bd8175a]:hover{background:hsla(0,0%,100%,.1)}.menu-item.is-active[data-v-2bd8175a]{background:linear-gradient(135deg,rgba(64,158,255,.15),rgba(56,189,248,.25));color:#409eff}html.dark .menu-item.is-active[data-v-2bd8175a]{background:linear-gradient(135deg,rgba(64,158,255,.2),rgba(56,189,248,.35))}.menu-icon[data-v-2bd8175a]{width:32px;min-width:32px;font-size:16px;flex-shrink:0;text-align:center}.menu-text[data-v-2bd8175a]{font-size:14px;font-weight:500;white-space:nowrap;overflow:hidden;opacity:1;max-width:100px;transition:opacity .2s ease .05s,max-width .25s ease}.sidebar-container.is-collapsed .menu-text[data-v-2bd8175a]{opacity:0;max-width:0;transition:opacity .1s ease,max-width .2s ease}.toggle-button[data-v-2bd8175a]{padding:12px;text-align:center;cursor:pointer;border-top:1px solid rgba(0,0,0,.08);transition:all .2s ease;color:var(--admin-container-color,#333)}html.dark .toggle-button[data-v-2bd8175a]{border-top:1px solid hsla(0,0%,100%,.08)}.toggle-button[data-v-2bd8175a]:hover{background:rgba(0,0,0,.04)}html.dark .toggle-button[data-v-2bd8175a]:hover{background:hsla(0,0%,100%,.06)}@media (max-width:768px){.sidebar-container[data-v-2bd8175a]{left:4px;width:140px}.sidebar-container.is-collapsed[data-v-2bd8175a]{width:50px}}.status-panel[data-v-54756a6a]{padding:20px;background:transparent;min-height:100vh}.overview-cards[data-v-54756a6a]{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:20px;margin-bottom:30px}.overview-card[data-v-54756a6a]{background:var(--admin-dashborad-stats-bg-color);border-radius:16px;padding:24px;display:flex;align-items:center;box-shadow:var(--admin-dashboard-stats-shadow);transition:all .3s ease;border:1px solid hsla(0,0%,100%,.2);cursor:pointer}.overview-card[data-v-54756a6a]:hover{transform:translateY(-2px);box-shadow:var(--admin-dashboard-stats-hover-shadow);background:var(--admin-dashborad-stats-hover-bg-color)}.card-icon[data-v-54756a6a]{width:60px;height:60px;border-radius:12px;display:flex;align-items:center;justify-content:center;font-size:24px;margin-right:20px;background:linear-gradient(135deg,var(--admin-purple),#e1bee7);color:#fff}.card-content[data-v-54756a6a]{flex:1}.card-title[data-v-54756a6a]{font-size:14px;color:#666;margin-bottom:8px;font-weight:500}.card-value[data-v-54756a6a]{font-size:28px;font-weight:700;color:var(--admin-container-color);line-height:1}.card-subtitle[data-v-54756a6a]{font-size:11px;color:#999;margin-top:4px;opacity:.8}.charts-section[data-v-54756a6a]{display:grid;grid-template-columns:repeat(auto-fit,minmax(400px,1fr));gap:20px;margin-bottom:30px}.chart-card[data-v-54756a6a]{background:var(--admin-dashborad-stats-bg-color);border-radius:16px;padding:24px;box-shadow:var(--admin-dashboard-stats-shadow);transition:all .3s ease;border:1px solid hsla(0,0%,100%,.2)}.chart-card[data-v-54756a6a]:hover{box-shadow:var(--admin-dashboard-stats-hover-shadow)}.chart-card[data-v-54756a6a],.chart-content[data-v-54756a6a],.pie-chart-container[data-v-54756a6a],.pie-chart-wrapper[data-v-54756a6a]{overflow:visible}.chart-header[data-v-54756a6a]{display:flex;gap:8px;align-items:center;margin-bottom:20px;font-size:16px;font-weight:600;color:var(--admin-container-color)}.chart-header .fa-icon[data-v-54756a6a]{margin-right:10px;color:var(--admin-purple)}.chart-content[data-v-54756a6a]{min-height:160px;padding:10px;margin:-10px}.empty-state[data-v-54756a6a]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:160px;color:#999;font-size:14px}.empty-state .fa-icon[data-v-54756a6a]{font-size:32px;margin-bottom:10px}.stats-list[data-v-54756a6a]{display:flex;flex-direction:column;gap:16px}.stats-item[data-v-54756a6a]{display:flex;align-items:center;gap:12px}.stats-label[data-v-54756a6a]{min-width:80px;font-size:13px;color:#666;font-weight:500}.stats-bar[data-v-54756a6a]{flex:1;height:8px;background:#f0f0f0;border-radius:4px;overflow:hidden}.stats-fill[data-v-54756a6a]{height:100%;background:linear-gradient(90deg,var(--admin-purple),#e1bee7);border-radius:4px;transition:width .6s ease}.type-fill[data-v-54756a6a]{background:linear-gradient(90deg,#4caf50,#81c784)}.stats-value[data-v-54756a6a]{min-width:50px;text-align:right;font-size:13px;font-weight:600;color:var(--admin-container-color)}.pie-chart-container[data-v-54756a6a]{display:flex;align-items:center;gap:24px;flex-wrap:wrap;justify-content:center}.pie-chart-wrapper[data-v-54756a6a]{position:relative;width:160px;height:160px;flex-shrink:0;padding:10px;margin:-10px;overflow:visible}.chart-center-text[data-v-54756a6a]{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);text-align:center;pointer-events:none}.center-value[data-v-54756a6a]{font-size:22px;font-weight:700;color:var(--admin-container-color);line-height:1.2}.center-label[data-v-54756a6a]{font-size:11px;color:#888;margin-top:2px}.chart-legend[data-v-54756a6a]{display:flex;flex-direction:column;gap:10px;flex:1;min-width:180px}.legend-item[data-v-54756a6a]{display:flex;align-items:center;gap:10px;padding:8px 12px;background:rgba(0,0,0,.03);border-radius:8px;transition:all .2s ease}.legend-item[data-v-54756a6a]:hover{background:rgba(0,0,0,.06);transform:translateX(4px)}html.dark .legend-item[data-v-54756a6a]{background:hsla(0,0%,100%,.05)}html.dark .legend-item[data-v-54756a6a]:hover{background:hsla(0,0%,100%,.1)}.legend-color[data-v-54756a6a]{width:12px;height:12px;border-radius:3px;flex-shrink:0}.legend-label[data-v-54756a6a]{flex:1;font-size:13px;color:var(--admin-container-color);font-weight:500}.legend-value[data-v-54756a6a]{font-size:13px;font-weight:600;color:var(--admin-container-color);min-width:50px;text-align:right}.legend-percent[data-v-54756a6a]{font-size:12px;color:#888;min-width:40px;text-align:right}.actions-section[data-v-54756a6a]{margin-bottom:30px}.action-card[data-v-54756a6a]{background:var(--admin-dashborad-stats-bg-color);border-radius:16px;padding:24px;box-shadow:var(--admin-dashboard-stats-shadow);border:1px solid hsla(0,0%,100%,.2)}.action-header[data-v-54756a6a]{display:flex;align-items:center;gap:8px;margin-bottom:3px;font-size:16px;font-weight:600;color:var(--admin-container-color)}.action-header .fa-icon[data-v-54756a6a]{margin-right:10px;color:var(--admin-purple)}.action-content[data-v-54756a6a]{display:flex;justify-content:center;padding:20px 0}.action-buttons[data-v-54756a6a]{display:flex;gap:20px;flex-wrap:wrap;justify-content:center;align-items:center;width:100%}.action-btn[data-v-54756a6a]{border:none;border-radius:12px;padding:12px 24px;margin-left:0;font-weight:600;transition:all .3s ease;min-width:140px;width:140px;height:48px}@media (max-width:768px){.action-btn[data-v-54756a6a]{flex:1;width:auto;min-width:0;height:auto}}.action-btn[data-v-54756a6a]:hover{transform:translateY(-2px)}.action-btn .fa-icon[data-v-54756a6a]{margin-right:8px}.rebuild-btn[data-v-54756a6a]{background:linear-gradient(135deg,var(--admin-purple),#e1bee7)}.rebuild-btn[data-v-54756a6a]:hover{box-shadow:0 6px 16px rgba(179,157,219,.4)}.backup-btn[data-v-54756a6a]{background:linear-gradient(135deg,#4caf50,#81c784)}.backup-btn[data-v-54756a6a]:hover{box-shadow:0 6px 16px rgba(76,175,80,.4)}.restore-btn[data-v-54756a6a]{background:linear-gradient(135deg,#ff9800,#ffb74d)}.restore-btn[data-v-54756a6a]:hover{box-shadow:0 6px 16px rgba(255,152,0,.4)}.restore-section[data-v-54756a6a]{display:inline-block}@media (max-width:768px){.action-buttons>.el-tooltip[data-v-54756a6a],.action-buttons>.restore-section[data-v-54756a6a],.restore-section[data-v-54756a6a]{flex:1;width:100%}.action-btn[data-v-54756a6a]{width:100%!important;padding:10px 20px!important;box-sizing:border-box}}.file-info-section[data-v-54756a6a]{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:20px;align-items:stretch}.file-info-card[data-v-54756a6a]{position:relative;background:var(--admin-dashborad-stats-bg-color);border-radius:16px;box-shadow:var(--admin-dashboard-stats-shadow);border:1px solid hsla(0,0%,100%,.2);transition:all .3s ease;height:300px;overflow:hidden;cursor:pointer}.file-info-card[data-v-54756a6a]:hover{transform:translateY(-2px);box-shadow:var(--admin-dashboard-stats-hover-shadow)}.card-bg-wrapper[data-v-54756a6a]{position:absolute;top:0;left:0;width:100%;height:100%;z-index:0}.card-bg-media[data-v-54756a6a]{width:100%;height:100%;-o-object-fit:cover;object-fit:cover;transition:transform .5s ease}.file-info-card:hover .card-bg-media[data-v-54756a6a]{transform:scale(1.05)}.card-bg-fallback[data-v-54756a6a],.card-bg-placeholder[data-v-54756a6a]{width:100%;height:100%;background:var(--admin-dashborad-stats-bg-color);display:flex;align-items:center;justify-content:center}.fallback-icon[data-v-54756a6a]{font-size:80px;color:var(--el-text-color-placeholder);opacity:.3}.info-card-overlay[data-v-54756a6a]{position:absolute;top:0;left:0;width:100%;height:100%;background:linear-gradient(180deg,rgba(0,0,0,.05) 0,rgba(0,0,0,.1) 60%,rgba(0,0,0,.3));z-index:1;display:flex;flex-direction:column;justify-content:space-between;padding:12px 16px}.info-card-header[data-v-54756a6a]{display:flex;justify-content:flex-start}.header-badge[data-v-54756a6a]{display:flex;align-items:center;gap:6px;padding:6px 12px;background:rgba(var(--admin-purple-rgb,106,27,154),.9);color:#fff;border-radius:20px;font-size:12px;font-weight:600;backdrop-filter:blur(4px);box-shadow:0 2px 8px rgba(0,0,0,.2)}.header-badge.warning[data-v-54756a6a]{background:rgba(255,152,0,.9)}.info-card-content[data-v-54756a6a]{display:flex;align-items:flex-end;gap:15px;width:100%;padding-bottom:20px}.info-details[data-v-54756a6a]{flex:1;min-width:0}.file-name[data-v-54756a6a]{font-size:16px;color:#fff;margin-bottom:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:600;text-shadow:0 1px 2px rgba(0,0,0,.5)}.file-meta[data-v-54756a6a]{font-size:13px;color:#fff}@media (max-width:768px){.status-panel[data-v-54756a6a]{padding:15px}.charts-section[data-v-54756a6a],.file-info-section[data-v-54756a6a],.overview-cards[data-v-54756a6a]{grid-template-columns:1fr;gap:15px}.card-icon[data-v-54756a6a]{width:50px;height:50px;font-size:20px;margin-right:15px}.card-value[data-v-54756a6a]{font-size:24px}.action-buttons[data-v-54756a6a]{flex-direction:column;gap:12px}.action-btn[data-v-54756a6a]{width:100%;min-width:unset}}.stats-fill[data-v-54756a6a]{animation:fillAnimation-54756a6a 1s ease-out}@keyframes fillAnimation-54756a6a{0%{width:0}}.el-progress{align-items:center;display:flex;line-height:1;position:relative}.el-progress__text{color:var(--el-text-color-regular);font-size:14px;line-height:1;margin-left:5px;min-width:50px}.el-progress__text i{display:block;vertical-align:middle}.el-progress--circle,.el-progress--dashboard{display:inline-block}.el-progress--circle .el-progress__text,.el-progress--dashboard .el-progress__text{left:0;margin:0;position:absolute;text-align:center;top:50%;transform:translateY(-50%);width:100%}.el-progress--circle .el-progress__text i,.el-progress--dashboard .el-progress__text i{display:inline-block;vertical-align:middle}.el-progress--without-text .el-progress__text{display:none}.el-progress--without-text .el-progress-bar{display:block;margin-right:0;padding-right:0}.el-progress--text-inside .el-progress-bar{margin-right:0;padding-right:0}.el-progress.is-success .el-progress-bar__inner{background-color:var(--el-color-success)}.el-progress.is-success .el-progress__text{color:var(--el-color-success)}.el-progress.is-warning .el-progress-bar__inner{background-color:var(--el-color-warning)}.el-progress.is-warning .el-progress__text{color:var(--el-color-warning)}.el-progress.is-exception .el-progress-bar__inner{background-color:var(--el-color-danger)}.el-progress.is-exception .el-progress__text{color:var(--el-color-danger)}.el-progress-bar{box-sizing:border-box;flex-grow:1}.el-progress-bar__outer{background-color:var(--el-border-color-lighter);border-radius:100px;height:6px;overflow:hidden;position:relative;vertical-align:middle}.el-progress-bar__inner{background-color:var(--el-color-primary);border-radius:100px;height:100%;left:0;line-height:1;position:absolute;text-align:right;top:0;transition:width .6s ease;white-space:nowrap}.el-progress-bar__inner:after{content:"";display:inline-block;height:100%;vertical-align:middle}.el-progress-bar__inner--indeterminate{animation:indeterminate 3s infinite;transform:translateZ(0)}.el-progress-bar__inner--striped{background-image:linear-gradient(45deg,rgba(0,0,0,.1) 25%,transparent 0,transparent 50%,rgba(0,0,0,.1) 0,rgba(0,0,0,.1) 75%,transparent 0,transparent);background-size:1.25em 1.25em}.el-progress-bar__inner--striped.el-progress-bar__inner--striped-flow{animation:striped-flow 3s linear infinite}.el-progress-bar__innerText{color:#fff;display:inline-block;font-size:12px;margin:0 5px;vertical-align:middle}@keyframes progress{0%{background-position:0 0}to{background-position:32px 0}}@keyframes indeterminate{0%{left:-100%}to{left:100%}}@keyframes striped-flow{0%{background-position:-100%}to{background-position:100%}}.el-input-number{display:inline-flex;line-height:30px;position:relative;vertical-align:middle;width:150px}.el-input-number .el-input__wrapper{padding-left:42px;padding-right:42px}.el-input-number .el-input__inner{-webkit-appearance:none;-moz-appearance:textfield;line-height:1;text-align:center}.el-input-number .el-input__inner::-webkit-inner-spin-button,.el-input-number .el-input__inner::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.el-input-number.is-left .el-input__inner{text-align:left}.el-input-number.is-right .el-input__inner{text-align:right}.el-input-number.is-center .el-input__inner{text-align:center}.el-input-number__decrease,.el-input-number__increase{align-items:center;background:var(--el-fill-color-light);bottom:1px;color:var(--el-text-color-regular);cursor:pointer;display:flex;font-size:13px;height:auto;justify-content:center;position:absolute;top:1px;-webkit-user-select:none;user-select:none;width:32px;z-index:1}.el-input-number__decrease:hover,.el-input-number__increase:hover{color:var(--el-color-primary)}.el-input-number__decrease:hover~.el-input:not(.is-disabled) .el-input__wrapper,.el-input-number__increase:hover~.el-input:not(.is-disabled) .el-input__wrapper{box-shadow:0 0 0 1px var(--el-input-focus-border-color,var(--el-color-primary)) inset}.el-input-number__decrease.is-disabled,.el-input-number__increase.is-disabled{color:var(--el-disabled-text-color);cursor:not-allowed}.el-input-number__increase{border-left:var(--el-border);border-radius:0 var(--el-border-radius-base) var(--el-border-radius-base) 0;right:1px}.el-input-number__decrease{border-radius:var(--el-border-radius-base) 0 0 var(--el-border-radius-base);border-right:var(--el-border);left:1px}.el-input-number.is-disabled .el-input-number__decrease,.el-input-number.is-disabled .el-input-number__increase{border-color:var(--el-disabled-border-color);color:var(--el-disabled-border-color)}.el-input-number.is-disabled .el-input-number__decrease:hover,.el-input-number.is-disabled .el-input-number__increase:hover{color:var(--el-disabled-border-color);cursor:not-allowed}.el-input-number--large{line-height:38px;width:180px}.el-input-number--large .el-input-number__decrease,.el-input-number--large .el-input-number__increase{font-size:14px;width:40px}.el-input-number--large.is-controls-right .el-input--large .el-input__wrapper{padding-right:47px}.el-input-number--large .el-input--large .el-input__wrapper{padding-left:47px;padding-right:47px}.el-input-number--small{line-height:22px;width:120px}.el-input-number--small .el-input-number__decrease,.el-input-number--small .el-input-number__increase{font-size:12px;width:24px}.el-input-number--small.is-controls-right .el-input--small .el-input__wrapper{padding-right:31px}.el-input-number--small .el-input--small .el-input__wrapper{padding-left:31px;padding-right:31px}.el-input-number--small .el-input-number__decrease [class*=el-icon],.el-input-number--small .el-input-number__increase [class*=el-icon]{transform:scale(.9)}.el-input-number.is-without-controls .el-input__wrapper{padding-left:15px;padding-right:15px}.el-input-number.is-controls-right .el-input__wrapper{padding-left:15px;padding-right:42px}.el-input-number.is-controls-right .el-input-number__decrease,.el-input-number.is-controls-right .el-input-number__increase{--el-input-number-controls-height:15px;height:var(--el-input-number-controls-height);line-height:var(--el-input-number-controls-height)}.el-input-number.is-controls-right .el-input-number__decrease [class*=el-icon],.el-input-number.is-controls-right .el-input-number__increase [class*=el-icon]{transform:scale(.8)}.el-input-number.is-controls-right .el-input-number__increase{border-bottom:var(--el-border);border-radius:0 var(--el-border-radius-base) 0 0;bottom:auto;left:auto}.el-input-number.is-controls-right .el-input-number__decrease{border-left:var(--el-border);border-radius:0 0 var(--el-border-radius-base) 0;border-right:none;left:auto;right:1px;top:auto}.el-input-number.is-controls-right[class*=large] [class*=decrease],.el-input-number.is-controls-right[class*=large] [class*=increase]{--el-input-number-controls-height:19px}.el-input-number.is-controls-right[class*=small] [class*=decrease],.el-input-number.is-controls-right[class*=small] [class*=increase]{--el-input-number-controls-height:11px}.el-form{--el-form-label-font-size:var(--el-font-size-base);--el-form-inline-content-width:220px}.el-form--inline .el-form-item{display:inline-flex;margin-right:32px;vertical-align:middle}.el-form--inline.el-form--label-top{display:flex;flex-wrap:wrap}.el-form--inline.el-form--label-top .el-form-item{display:block}.el-form-item{display:flex;--font-size:14px;margin-bottom:18px}.el-form-item .el-form-item{margin-bottom:0}.el-form-item .el-input__validateIcon{display:none}.el-form-item--large{--font-size:14px;--el-form-label-font-size:var(--font-size);margin-bottom:22px}.el-form-item--large .el-form-item__label{height:40px;line-height:40px}.el-form-item--large .el-form-item__content{line-height:40px}.el-form-item--large .el-form-item__error{padding-top:4px}.el-form-item--default{--font-size:14px;--el-form-label-font-size:var(--font-size);margin-bottom:18px}.el-form-item--default .el-form-item__label{height:32px;line-height:32px}.el-form-item--default .el-form-item__content{line-height:32px}.el-form-item--default .el-form-item__error{padding-top:2px}.el-form-item--small{--font-size:12px;--el-form-label-font-size:var(--font-size);margin-bottom:18px}.el-form-item--small .el-form-item__label{height:24px;line-height:24px}.el-form-item--small .el-form-item__content{line-height:24px}.el-form-item--small .el-form-item__error{padding-top:2px}.el-form-item--label-left .el-form-item__label{justify-content:flex-start;text-align:left}.el-form-item--label-right .el-form-item__label{justify-content:flex-end;text-align:right}.el-form-item--label-top{display:block}.el-form-item--label-top .el-form-item__label{display:block;height:auto;line-height:22px;margin-bottom:8px;padding-right:0;text-align:left;width:fit-content}.el-form-item__label-wrap{display:flex}.el-form-item__label{align-items:flex-start;box-sizing:border-box;color:var(--el-text-color-regular);display:inline-flex;flex:0 0 auto;font-size:var(--el-form-label-font-size);height:32px;line-height:32px;padding:0 12px 0 0}.el-form-item__content{align-items:center;display:flex;flex:1;flex-wrap:wrap;font-size:var(--font-size);line-height:32px;min-width:0;position:relative}.el-form-item__content .el-input-group{vertical-align:top}.el-form-item__error{color:var(--el-color-danger);font-size:12px;left:0;line-height:1;padding-top:2px;position:absolute;top:100%}.el-form-item__error--inline{display:inline-block;left:auto;margin-left:10px;position:relative;top:auto}.el-form-item.is-required:not(.is-no-asterisk).asterisk-left>.el-form-item__label-wrap>.el-form-item__label:before,.el-form-item.is-required:not(.is-no-asterisk).asterisk-left>.el-form-item__label:before{color:var(--el-color-danger);content:"*";margin-right:4px}.el-form-item.is-required:not(.is-no-asterisk).asterisk-right>.el-form-item__label-wrap>.el-form-item__label:after,.el-form-item.is-required:not(.is-no-asterisk).asterisk-right>.el-form-item__label:after{color:var(--el-color-danger);content:"*";margin-left:4px}.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper,.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper.is-focus,.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper:focus,.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper:hover,.el-form-item.is-error .el-form-item__content .el-input__wrapper,.el-form-item.is-error .el-form-item__content .el-input__wrapper.is-focus,.el-form-item.is-error .el-form-item__content .el-input__wrapper:focus,.el-form-item.is-error .el-form-item__content .el-input__wrapper:hover,.el-form-item.is-error .el-form-item__content .el-select__wrapper,.el-form-item.is-error .el-form-item__content .el-select__wrapper.is-focus,.el-form-item.is-error .el-form-item__content .el-select__wrapper:focus,.el-form-item.is-error .el-form-item__content .el-select__wrapper:hover,.el-form-item.is-error .el-form-item__content .el-textarea__inner,.el-form-item.is-error .el-form-item__content .el-textarea__inner.is-focus,.el-form-item.is-error .el-form-item__content .el-textarea__inner:focus,.el-form-item.is-error .el-form-item__content .el-textarea__inner:hover{box-shadow:0 0 0 1px var(--el-color-danger) inset}.el-form-item.is-error .el-form-item__content .el-input-group__append .el-input__wrapper,.el-form-item.is-error .el-form-item__content .el-input-group__prepend .el-input__wrapper{box-shadow:inset 0 0 0 1px transparent}.el-form-item.is-error .el-form-item__content .el-input-group__append .el-input__validateIcon,.el-form-item.is-error .el-form-item__content .el-input-group__prepend .el-input__validateIcon{display:none}.el-form-item.is-error .el-form-item__content .el-input__validateIcon{color:var(--el-color-danger)}.el-form-item--feedback .el-input__validateIcon,.el-radio{display:inline-flex}.el-radio{--el-radio-font-size:var(--el-font-size-base);--el-radio-text-color:var(--el-text-color-regular);--el-radio-font-weight:var(--el-font-weight-primary);--el-radio-input-height:14px;--el-radio-input-width:14px;--el-radio-input-border-radius:var(--el-border-radius-circle);--el-radio-input-bg-color:var(--el-fill-color-blank);--el-radio-input-border:var(--el-border);--el-radio-input-border-color:var(--el-border-color);--el-radio-input-border-color-hover:var(--el-color-primary);align-items:center;color:var(--el-radio-text-color);cursor:pointer;font-size:var(--el-font-size-base);font-weight:var(--el-radio-font-weight);height:32px;margin-right:30px;outline:none;position:relative;-webkit-user-select:none;user-select:none;white-space:nowrap}.el-radio.el-radio--large{height:40px}.el-radio.el-radio--small{height:24px}.el-radio.is-bordered{border:var(--el-border);border-radius:var(--el-border-radius-base);box-sizing:border-box;padding:0 15px 0 9px}.el-radio.is-bordered.is-checked{border-color:var(--el-color-primary)}.el-radio.is-bordered.is-disabled{border-color:var(--el-border-color-lighter);cursor:not-allowed}.el-radio.is-bordered.el-radio--large{border-radius:var(--el-border-radius-base);padding:0 19px 0 11px}.el-radio.is-bordered.el-radio--large .el-radio__label{font-size:var(--el-font-size-base)}.el-radio.is-bordered.el-radio--large .el-radio__inner{height:14px;width:14px}.el-radio.is-bordered.el-radio--small{border-radius:var(--el-border-radius-base);padding:0 11px 0 7px}.el-radio.is-bordered.el-radio--small .el-radio__label{font-size:12px}.el-radio.is-bordered.el-radio--small .el-radio__inner{height:12px;width:12px}.el-radio:last-child{margin-right:0}.el-radio__input{cursor:pointer;display:inline-flex;outline:none;position:relative;vertical-align:middle;white-space:nowrap}.el-radio__input.is-disabled .el-radio__inner{border-color:var(--el-disabled-border-color)}.el-radio__input.is-disabled .el-radio__inner,.el-radio__input.is-disabled .el-radio__inner:after{background-color:var(--el-disabled-bg-color);cursor:not-allowed}.el-radio__input.is-disabled .el-radio__inner+.el-radio__label{cursor:not-allowed}.el-radio__input.is-disabled.is-checked .el-radio__inner{background-color:var(--el-disabled-bg-color);border-color:var(--el-disabled-border-color)}.el-radio__input.is-disabled.is-checked .el-radio__inner:after{background-color:var(--el-text-color-placeholder)}.el-radio__input.is-disabled+span.el-radio__label{color:var(--el-text-color-placeholder);cursor:not-allowed}.el-radio__input.is-checked .el-radio__inner{background:var(--el-color-primary);border-color:var(--el-color-primary)}.el-radio__input.is-checked .el-radio__inner:after{background-color:var(--el-color-white);transform:translate(-50%,-50%) scale(1)}.el-radio__input.is-checked+.el-radio__label{color:var(--el-color-primary)}.el-radio__input.is-focus .el-radio__inner{border-color:var(--el-radio-input-border-color-hover)}.el-radio__inner{background-color:var(--el-radio-input-bg-color);border:var(--el-radio-input-border);border-radius:var(--el-radio-input-border-radius);box-sizing:border-box;cursor:pointer;display:inline-block;height:var(--el-radio-input-height);position:relative;width:var(--el-radio-input-width)}.el-radio__inner:hover{border-color:var(--el-radio-input-border-color-hover)}.el-radio__inner:after{border-radius:var(--el-radio-input-border-radius);content:"";height:4px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%) scale(0);transition:transform .15s ease-in;width:4px}.el-radio__original{bottom:0;left:0;margin:0;opacity:0;outline:none;position:absolute;right:0;top:0;z-index:-1}.el-radio__original:focus-visible+.el-radio__inner{border-radius:var(--el-radio-input-border-radius);outline:2px solid var(--el-radio-input-border-color-hover);outline-offset:1px}.el-radio:focus:not(:focus-visible):not(.is-focus):not(:active):not(.is-disabled) .el-radio__inner{box-shadow:0 0 2px 2px var(--el-radio-input-border-color-hover)}.el-radio__label{font-size:var(--el-radio-font-size);padding-left:8px}.el-radio.el-radio--large .el-radio__label{font-size:14px}.el-radio.el-radio--large .el-radio__inner{height:14px;width:14px}.el-radio.el-radio--small .el-radio__label{font-size:12px}.el-radio.el-radio--small .el-radio__inner{height:12px;width:12px}.el-radio-group{align-items:center;display:inline-flex;flex-wrap:wrap;font-size:0}.upload-settings[data-v-70372bf9]{padding:20px;min-height:500px}.upload-channel[data-v-70372bf9]{margin-bottom:40px}.first-title[data-v-70372bf9]{display:flex;align-items:center;gap:8px;margin-bottom:16px}.upload-channel[data-v-70372bf9] .el-radio-group{display:flex;gap:12px;flex-wrap:wrap}.upload-channel[data-v-70372bf9] .el-radio{display:flex;align-items:center;padding:10px 20px;border-radius:10px;background:var(--el-fill-color-light);border:1px solid var(--el-border-color-lighter);transition:all .25s ease;margin-right:0;height:auto}.upload-channel[data-v-70372bf9] .el-radio:hover{border-color:var(--el-color-primary-light-5);background:var(--el-fill-color)}.upload-channel[data-v-70372bf9] .el-radio.is-checked{background:linear-gradient(135deg,rgba(64,158,255,.15),rgba(56,189,248,.1));border-color:var(--el-color-primary);box-shadow:0 2px 8px rgba(64,158,255,.2)}.upload-channel[data-v-70372bf9] .el-radio__input{display:none}.upload-channel[data-v-70372bf9] .el-radio__label{padding-left:0;font-weight:500;font-size:14px}.second-title[data-v-70372bf9]{text-align:start;margin-left:0;margin-bottom:20px;padding-bottom:10px;border-bottom:1px solid var(--el-border-color-lighter)}.channel-settings[data-v-70372bf9]{margin-top:20px}.channel-form[data-v-70372bf9]{margin-bottom:30px;padding:20px;background:var(--el-fill-color-lighter);border-radius:12px;border:1px solid var(--el-border-color-lighter)}.channel-form[data-v-70372bf9] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.channel-form[data-v-70372bf9] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary)}.channel-form[data-v-70372bf9] .el-form-item__content{width:100%;max-width:400px}.channel-form[data-v-70372bf9] .el-input{width:100%}.channel-form[data-v-70372bf9] .el-switch{--el-switch-on-color:var(--el-color-primary)}.actions[data-v-70372bf9]{margin-top:20px;display:flex;justify-content:flex-end;gap:12px}.actions[data-v-70372bf9] .el-button{border-radius:8px;padding:10px 20px}.quota-status[data-v-70372bf9]{width:100%;max-width:400px}.quota-status[data-v-70372bf9] .el-progress{margin-bottom:8px}.quota-status[data-v-70372bf9] .el-progress-bar__inner{transition:width .5s ease}.quota-info[data-v-70372bf9]{font-size:13px;color:var(--el-text-color-secondary);padding:8px 12px;background:var(--el-fill-color);border-radius:6px}.quota-info.quota-warning[data-v-70372bf9]{color:var(--el-color-danger);background:var(--el-color-danger-light-9);font-weight:500}.discord-limit-tip[data-v-70372bf9]{font-size:13px;color:var(--el-color-info);padding:10px 14px;background:var(--el-color-info-light-9);border-radius:6px;border-left:3px solid var(--el-color-info)}.discord-rate-limit-tip[data-v-70372bf9]{font-size:13px;color:var(--el-color-warning);padding:10px 14px;background:var(--el-color-warning-light-9);border-radius:6px;border-left:3px solid var(--el-color-warning)}.huggingface-tip[data-v-70372bf9]{font-size:13px;color:var(--el-color-info);padding:10px 14px;background:var(--el-color-info-light-9);border-radius:6px;border-left:3px solid var(--el-color-info);white-space:nowrap}@media (max-width:768px){.upload-settings[data-v-70372bf9]{padding:15px}.upload-channel[data-v-70372bf9] .el-radio-group{gap:8px}.upload-channel[data-v-70372bf9] .el-radio{padding:8px 14px;font-size:13px}.channel-form[data-v-70372bf9]{padding:15px}.channel-form[data-v-70372bf9] .el-form-item__content,.quota-status[data-v-70372bf9]{max-width:100%}}:root{--el-popup-modal-bg-color:var(--el-color-black);--el-popup-modal-opacity:0.5}.v-modal-enter{animation:v-modal-in var(--el-transition-duration-fast) ease}.v-modal-leave{animation:v-modal-out var(--el-transition-duration-fast) ease forwards}@keyframes v-modal-in{0%{opacity:0}}@keyframes v-modal-out{to{opacity:0}}.v-modal{background:var(--el-popup-modal-bg-color);height:100%;left:0;opacity:var(--el-popup-modal-opacity);position:fixed;top:0;width:100%}.el-popup-parent--hidden{overflow:hidden}.el-dialog{--el-dialog-width:50%;--el-dialog-margin-top:15vh;--el-dialog-bg-color:var(--el-bg-color);--el-dialog-box-shadow:var(--el-box-shadow);--el-dialog-title-font-size:var(--el-font-size-large);--el-dialog-content-font-size:14px;--el-dialog-font-line-height:var(--el-font-line-height-primary);--el-dialog-padding-primary:16px;--el-dialog-border-radius:var(--el-border-radius-base);background:var(--el-dialog-bg-color);border-radius:var(--el-dialog-border-radius);box-shadow:var(--el-dialog-box-shadow);box-sizing:border-box;margin:var(--el-dialog-margin-top,15vh) auto 50px;overflow-wrap:break-word;padding:var(--el-dialog-padding-primary);position:relative;width:var(--el-dialog-width,50%)}.el-dialog:focus{outline:none!important}.el-dialog.is-align-center{margin:auto}.el-dialog.is-fullscreen{--el-dialog-width:100%;--el-dialog-margin-top:0;border-radius:0;height:100%;margin-bottom:0;overflow:auto}.el-dialog__wrapper{bottom:0;left:0;margin:0;overflow:auto;position:fixed;right:0;top:0}.el-dialog.is-draggable .el-dialog__header{cursor:move;-webkit-user-select:none;user-select:none}.el-dialog__header{padding-bottom:var(--el-dialog-padding-primary)}.el-dialog__header.show-close{padding-right:calc(var(--el-dialog-padding-primary) + var(--el-message-close-size, 16px))}.el-dialog__headerbtn{background:transparent;border:none;cursor:pointer;font-size:var(--el-message-close-size,16px);height:48px;outline:none;padding:0;position:absolute;right:0;top:0;width:48px}.el-dialog__headerbtn .el-dialog__close{color:var(--el-color-info);font-size:inherit}.el-dialog__headerbtn:focus .el-dialog__close,.el-dialog__headerbtn:hover .el-dialog__close{color:var(--el-color-primary)}.el-dialog__title{color:var(--el-text-color-primary);font-size:var(--el-dialog-title-font-size);line-height:var(--el-dialog-font-line-height)}.el-dialog__body{color:var(--el-text-color-regular);font-size:var(--el-dialog-content-font-size)}.el-dialog__footer{box-sizing:border-box;padding-top:var(--el-dialog-padding-primary);text-align:right}.el-dialog--center{text-align:center}.el-dialog--center .el-dialog__body{text-align:initial}.el-dialog--center .el-dialog__footer{text-align:inherit}.el-modal-dialog.is-penetrable{pointer-events:none}.el-modal-dialog.is-penetrable .el-dialog{pointer-events:auto}.el-overlay-dialog{bottom:0;left:0;overflow:auto;position:fixed;right:0;top:0}.dialog-fade-enter-active{animation:modal-fade-in var(--el-transition-duration)}.dialog-fade-enter-active .el-overlay-dialog{animation:dialog-fade-in var(--el-transition-duration)}.dialog-fade-leave-active{animation:modal-fade-out var(--el-transition-duration)}.dialog-fade-leave-active .el-overlay-dialog{animation:dialog-fade-out var(--el-transition-duration)}@keyframes dialog-fade-in{0%{opacity:0;transform:translate3d(0,-20px,0)}to{opacity:1;transform:translateZ(0)}}@keyframes dialog-fade-out{0%{opacity:1;transform:translateZ(0)}to{opacity:0;transform:translate3d(0,-20px,0)}}@keyframes modal-fade-in{0%{opacity:0}to{opacity:1}}@keyframes modal-fade-out{0%{opacity:1}to{opacity:0}}.el-checkbox-group{font-size:0;line-height:0}.el-table{--el-table-border-color:var(--el-border-color-lighter);--el-table-border:1px solid var(--el-table-border-color);--el-table-text-color:var(--el-text-color-regular);--el-table-header-text-color:var(--el-text-color-secondary);--el-table-row-hover-bg-color:var(--el-fill-color-light);--el-table-current-row-bg-color:var(--el-color-primary-light-9);--el-table-header-bg-color:var(--el-bg-color);--el-table-fixed-box-shadow:var(--el-box-shadow-light);--el-table-bg-color:var(--el-fill-color-blank);--el-table-tr-bg-color:var(--el-bg-color);--el-table-expanded-cell-bg-color:var(--el-fill-color-blank);--el-table-fixed-left-column:inset 10px 0 10px -10px rgba(0,0,0,.15);--el-table-fixed-right-column:inset -10px 0 10px -10px rgba(0,0,0,.15);--el-table-index:var(--el-index-normal);background-color:var(--el-table-bg-color);box-sizing:border-box;color:var(--el-table-text-color);font-size:var(--el-font-size-base);height:fit-content;max-width:100%;overflow:hidden;position:relative;width:100%}.el-table__inner-wrapper{display:flex;flex-direction:column;height:100%;position:relative}.el-table__inner-wrapper:before{bottom:0;height:1px;left:0}.el-table tbody:focus-visible{outline:none}.el-table.has-footer.el-table--fluid-height tr:last-child td.el-table__cell,.el-table.has-footer.el-table--scrollable-y tr:last-child td.el-table__cell{border-bottom-color:transparent}.el-table__empty-block{align-items:center;display:flex;justify-content:center;left:0;min-height:60px;position:sticky;text-align:center;width:100%}.el-table__empty-text{color:var(--el-text-color-secondary);line-height:60px;width:50%}.el-table__expand-column .cell{padding:0;text-align:center;-webkit-user-select:none;user-select:none}.el-table__expand-icon{appearance:none;background-color:transparent;border:none;border-radius:var(--el-border-radius-base);color:var(--el-text-color-regular);cursor:pointer;font-size:12px;height:23px;line-height:12px;margin:0;outline:none;padding:0;transition:transform var(--el-transition-duration-fast) ease-in-out;width:min(23px,100%)}.el-table__expand-icon:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:-2px}.el-table__expand-icon--expanded{transform:rotate(90deg)}.el-table__expand-icon>.el-icon{font-size:12px}.el-table__expanded-cell{background-color:var(--el-table-expanded-cell-bg-color)}.el-table__expanded-cell[class*=cell]{padding:20px 50px}.el-table__expanded-cell:hover{background-color:transparent!important}.el-table__placeholder{display:inline-block;width:20px}.el-table__append-wrapper{overflow:hidden}.el-table--fit{border-bottom:0;border-right:0}.el-table--fit .el-table__cell.gutter{border-right-width:1px}.el-table--fit .el-table__inner-wrapper:before{width:100%}.el-table thead{color:var(--el-table-header-text-color)}.el-table thead th{font-weight:600}.el-table thead.is-group th.el-table__cell{background:var(--el-fill-color-light)}.el-table .el-table__cell{box-sizing:border-box;min-width:0;padding:8px 0;position:relative;text-align:left;text-overflow:ellipsis;vertical-align:middle;z-index:var(--el-table-index)}.el-table .el-table__cell.is-center{text-align:center}.el-table .el-table__cell.is-right{text-align:right}.el-table .el-table__cell.gutter{border-bottom-width:0;border-right-width:0;padding:0;width:15px}.el-table .el-table__cell.is-hidden>*{visibility:hidden}.el-table .cell{box-sizing:border-box;line-height:23px;overflow:hidden;overflow-wrap:break-word;padding:0 12px;text-overflow:ellipsis;white-space:normal}.el-table .cell.el-tooltip{min-width:50px;white-space:nowrap}.el-table--large{font-size:var(--el-font-size-base)}.el-table--large .el-table__cell{padding:12px 0}.el-table--large .cell{padding:0 16px}.el-table--default{font-size:var(--el-font-size-base)}.el-table--default .el-table__cell{padding:8px 0}.el-table--default .cell{padding:0 12px}.el-table--small{font-size:var(--el-font-size-extra-small)}.el-table--small .el-table__cell{padding:4px 0}.el-table--small .cell{padding:0 8px}.el-table tr{background-color:var(--el-table-tr-bg-color)}.el-table tr input[type=checkbox]{margin:0}.el-table td.el-table__cell,.el-table th.el-table__cell.is-leaf{border-bottom:var(--el-table-border)}.el-table th.el-table__cell.is-sortable{cursor:pointer}.el-table th.el-table__cell{background-color:var(--el-table-header-bg-color)}.el-table th.el-table__cell>.cell.highlight{color:var(--el-color-primary)}.el-table th.el-table__cell.required>div:before{background:#ff4d51;border-radius:50%;content:"";display:inline-block;height:8px;margin-right:5px;vertical-align:middle;width:8px}.el-table td.el-table__cell div{box-sizing:border-box}.el-table td.el-table__cell.gutter{width:0}.el-table--border .el-table__inner-wrapper:after,.el-table--border:after,.el-table--border:before,.el-table__inner-wrapper:before{background-color:var(--el-table-border-color);content:"";position:absolute;z-index:calc(var(--el-table-index) + 2)}.el-table--border .el-table__inner-wrapper:after{height:1px;left:0;top:0;width:100%;z-index:calc(var(--el-table-index) + 2)}.el-table--border:before{height:100%;left:0;top:-1px;width:1px}.el-table--border:after{height:100%;right:0;top:-1px;width:1px}.el-table--border .el-table__inner-wrapper{border-bottom:none;border-right:none}.el-table--border .el-table__footer-wrapper{flex-shrink:0;position:relative}.el-table--border .el-table__cell{border-right:var(--el-table-border)}.el-table--border th.el-table__cell.gutter:last-of-type{border-bottom:var(--el-table-border);border-bottom-width:1px}.el-table--border th.el-table__cell{border-bottom:var(--el-table-border)}.el-table--hidden{visibility:hidden}.el-table__body-wrapper,.el-table__footer-wrapper,.el-table__header-wrapper{width:100%}.el-table__body-wrapper tr td.el-table-fixed-column--left,.el-table__body-wrapper tr td.el-table-fixed-column--right,.el-table__body-wrapper tr th.el-table-fixed-column--left,.el-table__body-wrapper tr th.el-table-fixed-column--right,.el-table__footer-wrapper tr td.el-table-fixed-column--left,.el-table__footer-wrapper tr td.el-table-fixed-column--right,.el-table__footer-wrapper tr th.el-table-fixed-column--left,.el-table__footer-wrapper tr th.el-table-fixed-column--right,.el-table__header-wrapper tr td.el-table-fixed-column--left,.el-table__header-wrapper tr td.el-table-fixed-column--right,.el-table__header-wrapper tr th.el-table-fixed-column--left,.el-table__header-wrapper tr th.el-table-fixed-column--right{background:inherit;position:sticky!important;z-index:calc(var(--el-table-index) + 1)}.el-table__body-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-last-column:before{bottom:-1px;box-shadow:none;content:"";overflow-x:hidden;overflow-y:hidden;pointer-events:none;position:absolute;top:0;touch-action:none;width:10px}.el-table__body-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-first-column:before{left:-10px}.el-table__body-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-last-column:before{right:-10px}.el-table__body-wrapper tr td.el-table__fixed-right-patch,.el-table__body-wrapper tr th.el-table__fixed-right-patch,.el-table__footer-wrapper tr td.el-table__fixed-right-patch,.el-table__footer-wrapper tr th.el-table__fixed-right-patch,.el-table__header-wrapper tr td.el-table__fixed-right-patch,.el-table__header-wrapper tr th.el-table__fixed-right-patch{background:#fff;position:sticky!important;right:0;z-index:calc(var(--el-table-index) + 1)}.el-table__header-wrapper{flex-shrink:0}.el-table__header-wrapper tr th.el-table-fixed-column--left,.el-table__header-wrapper tr th.el-table-fixed-column--right{background-color:var(--el-table-header-bg-color)}.el-table__body,.el-table__footer,.el-table__header{border-collapse:separate;table-layout:fixed}.el-table__header-wrapper{overflow:hidden}.el-table__header-wrapper tbody td.el-table__cell{background-color:var(--el-table-row-hover-bg-color);color:var(--el-table-text-color)}.el-table__footer-wrapper{flex-shrink:0;overflow:hidden}.el-table__footer-wrapper tfoot td.el-table__cell{background-color:var(--el-table-row-hover-bg-color);color:var(--el-table-text-color)}.el-table__body-wrapper .el-table-column--selection>.cell,.el-table__header-wrapper .el-table-column--selection>.cell{align-items:center;display:inline-flex;height:23px}.el-table__body-wrapper .el-table-column--selection .el-checkbox,.el-table__header-wrapper .el-table-column--selection .el-checkbox{height:unset}.el-table.is-scrolling-left .el-table-fixed-column--right.is-first-column:before{box-shadow:var(--el-table-fixed-right-column)}.el-table.is-scrolling-left.el-table--border .el-table-fixed-column--left.is-last-column.el-table__cell{border-right:var(--el-table-border)}.el-table.is-scrolling-left th.el-table-fixed-column--left{background-color:var(--el-table-header-bg-color)}.el-table.is-scrolling-right .el-table-fixed-column--left.is-last-column:before{box-shadow:var(--el-table-fixed-left-column)}.el-table.is-scrolling-right .el-table-fixed-column--left.is-last-column.el-table__cell{border-right:none}.el-table.is-scrolling-right th.el-table-fixed-column--right{background-color:var(--el-table-header-bg-color)}.el-table.is-scrolling-middle .el-table-fixed-column--left.is-last-column.el-table__cell{border-right:none}.el-table.is-scrolling-middle .el-table-fixed-column--right.is-first-column:before{box-shadow:var(--el-table-fixed-right-column)}.el-table.is-scrolling-middle .el-table-fixed-column--left.is-last-column:before{box-shadow:var(--el-table-fixed-left-column)}.el-table.is-scrolling-none .el-table-fixed-column--left.is-first-column:before,.el-table.is-scrolling-none .el-table-fixed-column--left.is-last-column:before,.el-table.is-scrolling-none .el-table-fixed-column--right.is-first-column:before,.el-table.is-scrolling-none .el-table-fixed-column--right.is-last-column:before{box-shadow:none}.el-table.is-scrolling-none th.el-table-fixed-column--left,.el-table.is-scrolling-none th.el-table-fixed-column--right{background-color:var(--el-table-header-bg-color)}.el-table__body-wrapper{flex:1;overflow:hidden;position:relative}.el-table__body-wrapper .el-scrollbar__bar{z-index:calc(var(--el-table-index) + 2)}.el-table .caret-wrapper{align-items:center;appearance:none;background-color:transparent;border:none;border-radius:var(--el-border-radius-base);cursor:pointer;display:inline-flex;flex-direction:column;height:14px;margin:0;outline:none;overflow:initial;padding:0;position:relative;transition:transform var(--el-transition-duration-fast) ease-in-out;vertical-align:middle;width:24px}.el-table .caret-wrapper:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:2px}.el-table .sort-caret{border:5px solid transparent;height:0;left:7px;position:absolute;width:0}.el-table .sort-caret.ascending{border-bottom-color:var(--el-text-color-placeholder);top:-5px}.el-table .sort-caret.descending{border-top-color:var(--el-text-color-placeholder);bottom:-3px}.el-table .ascending .sort-caret.ascending{border-bottom-color:var(--el-color-primary)}.el-table .descending .sort-caret.descending{border-top-color:var(--el-color-primary)}.el-table .hidden-columns{position:absolute;visibility:hidden;z-index:-1}.el-table--striped .el-table__body tr.el-table__row--striped td.el-table__cell{background:var(--el-fill-color-lighter)}.el-table--striped .el-table__body tr.el-table__row--striped.current-row td.el-table__cell{background-color:var(--el-table-current-row-bg-color)}.el-table__body tr.hover-row.current-row>td.el-table__cell,.el-table__body tr.hover-row.el-table__row--striped.current-row>td.el-table__cell,.el-table__body tr.hover-row.el-table__row--striped>td.el-table__cell,.el-table__body tr.hover-row>td.el-table__cell,.el-table__body tr>td.hover-cell{background-color:var(--el-table-row-hover-bg-color)}.el-table__body tr.current-row>td.el-table__cell{background-color:var(--el-table-current-row-bg-color)}.el-table.el-table--scrollable-y .el-table__body-header{position:sticky;top:0;z-index:calc(var(--el-table-index) + 2)}.el-table.el-table--scrollable-y .el-table__body-footer{bottom:0;position:sticky;z-index:calc(var(--el-table-index) + 2)}.el-table__column-resize-proxy{border-left:var(--el-table-border);bottom:0;left:200px;position:absolute;top:0;width:0;z-index:calc(var(--el-table-index) + 9)}.el-table__column-filter-trigger{appearance:none;background-color:transparent;border:none;border-radius:var(--el-border-radius-base);cursor:pointer;display:inline-block;margin:0;outline:none;padding:0;transition:transform var(--el-transition-duration-fast) ease-in-out}.el-table__column-filter-trigger:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:2px}.el-table__column-filter-trigger i{color:var(--el-color-info);font-size:14px;vertical-align:middle}.el-table__border-left-patch{height:100%;top:0;width:1px}.el-table__border-bottom-patch,.el-table__border-left-patch{background-color:var(--el-table-border-color);left:0;position:absolute;z-index:calc(var(--el-table-index) + 2)}.el-table__border-bottom-patch{height:1px}.el-table__border-right-patch{background-color:var(--el-table-border-color);height:100%;position:absolute;top:0;width:1px;z-index:calc(var(--el-table-index) + 2)}.el-table--enable-row-transition .el-table__body td.el-table__cell{transition:background-color .25s ease}.el-table--enable-row-hover .el-table__body tr:hover>td.el-table__cell{background-color:var(--el-table-row-hover-bg-color)}.el-table [class*=el-table__row--level] .el-table__expand-icon{display:inline-block;text-align:center;width:20px}.el-table .el-table.el-table--border .el-table__cell{border-right:var(--el-table-border)}.el-table:not(.el-table--border) .el-table__cell{border-right:none}.el-table:not(.el-table--border)>.el-table__inner-wrapper:after{content:none}.el-table-column--selection .cell{padding-left:14px;padding-right:14px}.el-table-filter{background-color:#fff;border:1px solid var(--el-border-color-lighter);border-radius:2px;box-shadow:var(--el-box-shadow-light);box-sizing:border-box}.el-table-filter__list{list-style:none;margin:0;min-width:100px;outline:none;padding:5px 0}.el-table-filter__list-item{cursor:pointer;font-size:var(--el-font-size-base);line-height:36px;outline:none;padding:0 10px}.el-table-filter__list-item:focus,.el-table-filter__list-item:hover{background-color:var(--el-color-primary-light-9);color:var(--el-color-primary)}.el-table-filter__list-item.is-active{background-color:var(--el-color-primary);color:#fff}.el-table-filter__multiple{outline:none}.el-table-filter__content{min-width:100px}.el-table-filter__bottom{border-top:1px solid var(--el-border-color-lighter);padding:8px}.el-table-filter__bottom button{appearance:none;background-color:transparent;border:none;border-radius:var(--el-border-radius-base);color:var(--el-text-color-regular);cursor:pointer;font-size:var(--el-font-size-small);margin:0;outline:none;padding:0 3px;transition:transform var(--el-transition-duration-fast) ease-in-out}.el-table-filter__bottom button:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:2px}.el-table-filter__bottom button:hover{color:var(--el-color-primary)}.el-table-filter__bottom button.is-disabled{color:var(--el-disabled-text-color);cursor:not-allowed}.el-table-filter__wrap{max-height:280px}.el-table-filter__checkbox-group{padding:10px}.el-table-filter__checkbox-group label.el-checkbox{align-items:center;display:flex;height:unset;margin-bottom:12px;margin-left:5px;margin-right:5px}.el-table-filter__checkbox-group .el-checkbox:last-child{margin-bottom:0}.security-settings[data-v-3b7344a0]{padding:20px;min-height:500px}.first-settings[data-v-3b7344a0]{margin-bottom:40px}.first-title[data-v-3b7344a0]{display:flex;align-items:center;gap:8px;margin-bottom:20px;padding-bottom:12px;border-bottom:2px solid var(--el-color-primary-light-7)}.second-title[data-v-3b7344a0]{display:flex;align-items:center;gap:8px;text-align:start;margin-left:0;margin-bottom:16px;padding-bottom:8px;border-bottom:1px solid var(--el-border-color-lighter)}.first-settings[data-v-3b7344a0] .el-form{padding:16px 20px;background:var(--el-fill-color-lighter);border-radius:12px;border:1px solid var(--el-border-color-lighter);margin-bottom:20px}.first-settings[data-v-3b7344a0] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.first-settings[data-v-3b7344a0] .el-form-item:last-child{margin-bottom:0}.first-settings[data-v-3b7344a0] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary);width:auto!important}.first-settings[data-v-3b7344a0] .el-form-item__content{width:100%;max-width:400px;margin-left:0!important}.first-settings[data-v-3b7344a0] .el-input,.first-settings[data-v-3b7344a0] .el-select{width:100%}.first-settings[data-v-3b7344a0] .el-switch{--el-switch-on-color:var(--el-color-primary)}.actions[data-v-3b7344a0]{margin-top:20px;display:flex;justify-content:flex-end;gap:12px}.actions[data-v-3b7344a0] .el-button{border-radius:8px;padding:10px 20px}.token-title[data-v-3b7344a0]{display:flex;align-items:center;justify-content:space-between}.token-actions[data-v-3b7344a0]{margin-left:5px}.token-table-container[data-v-3b7344a0]{display:flex;justify-content:center;margin-top:20px;width:100%;overflow:hidden}.token-table[data-v-3b7344a0]{width:100%;border-radius:12px!important;overflow:hidden;box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.token-table[data-v-3b7344a0] .el-table__header-wrapper{border-radius:12px 12px 0 0}.token-table[data-v-3b7344a0] .el-table__body-wrapper{border-radius:0 0 12px 12px}.token-table[data-v-3b7344a0] .el-table{border-radius:12px}.token-table[data-v-3b7344a0] .el-table__header{background-color:#f8f9fa}.token-table[data-v-3b7344a0] .el-table th{background-color:#f8f9fa!important;border-bottom:1px solid #ebeef5;text-align:center}.token-table[data-v-3b7344a0] .el-table td{border-bottom:1px solid #ebeef5}.token-table[data-v-3b7344a0] .el-table__row:last-child td{border-bottom:none}.table-cell-content[data-v-3b7344a0]{display:flex;justify-content:center;align-items:center;flex-wrap:wrap;gap:4px;padding:8px 4px;min-height:40px}.action-buttons[data-v-3b7344a0]{gap:8px}.action-button[data-v-3b7344a0]{margin-left:0}.permission-tag[data-v-3b7344a0]{margin:2px!important}.token-display[data-v-3b7344a0]{font-family:Courier New,monospace;background-color:var(--text-bg-color);padding:4px 8px;border-radius:6px;font-size:12px;word-break:break-all;text-align:center;max-width:100%;overflow:hidden;text-overflow:ellipsis}@media (max-width:768px){.security-settings[data-v-3b7344a0]{padding:15px}.first-settings[data-v-3b7344a0] .el-form{padding:12px 15px}.first-settings[data-v-3b7344a0] .el-form-item__content{max-width:100%}.token-table-container[data-v-3b7344a0]{padding:0 10px}.table-cell-content[data-v-3b7344a0]{padding:6px 2px;min-height:36px}.token-display[data-v-3b7344a0]{font-size:11px;padding:3px 6px}}@media (max-width:480px){.token-table-container[data-v-3b7344a0]{padding:0 5px}.table-cell-content[data-v-3b7344a0]{padding:4px 2px;min-height:32px;font-size:12px}.action-buttons .el-button[data-v-3b7344a0]{padding:4px 8px;font-size:12px}.permission-tag[data-v-3b7344a0]{font-size:11px;padding:0 4px;height:20px;line-height:20px}}.token-result[data-v-3b7344a0]{padding:10px 0}.token-result .el-form-item[data-v-3b7344a0]{margin-bottom:20px}.dialog-footer[data-v-3b7344a0]{display:flex;justify-content:flex-end;gap:10px}.fade-slide-enter-active[data-v-3b7344a0],.fade-slide-leave-active[data-v-3b7344a0]{transition:all .3s ease-in-out}.fade-slide-enter-from[data-v-3b7344a0],.fade-slide-leave-to[data-v-3b7344a0]{opacity:0;transform:translateY(-10px)}.fade-slide-enter-to[data-v-3b7344a0],.fade-slide-leave-from[data-v-3b7344a0]{opacity:1;transform:translateY(0)}[data-v-3b7344a0] .el-dialog{border-radius:12px;background-color:var(--dialog-bg-color);backdrop-filter:blur(10px);box-shadow:var(--dialog-box-shadow)}.page-settings[data-v-7b059a1c]{padding:20px;min-height:500px}.first-settings[data-v-7b059a1c]{margin-bottom:40px}.first-title[data-v-7b059a1c]{display:flex;align-items:center;gap:8px;margin-bottom:20px;padding-bottom:12px;border-bottom:2px solid var(--el-color-primary-light-7)}.second-title[data-v-7b059a1c]{display:flex;align-items:center;gap:8px;text-align:start;margin-left:0;margin-bottom:16px;padding-bottom:8px;border-bottom:1px solid var(--el-border-color-lighter)}.first-settings[data-v-7b059a1c] .el-form{padding:16px 20px;background:var(--el-fill-color-lighter);border-radius:12px;border:1px solid var(--el-border-color-lighter)}.first-settings[data-v-7b059a1c] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.first-settings[data-v-7b059a1c] .el-form-item:last-child{margin-bottom:0}.first-settings[data-v-7b059a1c] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary);width:auto!important}.first-settings[data-v-7b059a1c] .el-form-item__content{width:100%;max-width:400px;margin-left:0!important}.first-settings[data-v-7b059a1c] .el-input,.first-settings[data-v-7b059a1c] .el-select{width:100%}.first-settings[data-v-7b059a1c] .el-switch{--el-switch-on-color:var(--el-color-primary)}.actions[data-v-7b059a1c]{margin-top:20px;display:flex;justify-content:flex-end;gap:12px}.actions[data-v-7b059a1c] .el-button{border-radius:8px;padding:10px 20px}@media (max-width:768px){.page-settings[data-v-7b059a1c]{padding:15px}.first-settings[data-v-7b059a1c] .el-form{padding:12px 15px}.first-settings[data-v-7b059a1c] .el-form-item__content{max-width:100%}}.others-settings[data-v-4d2a1bec]{padding:20px;min-height:500px}.first-settings[data-v-4d2a1bec]{margin-bottom:40px}.first-title[data-v-4d2a1bec]{display:flex;align-items:center;gap:8px;margin-bottom:20px;padding-bottom:12px;border-bottom:2px solid var(--el-color-primary-light-7)}.second-title[data-v-4d2a1bec]{display:flex;align-items:center;gap:8px;text-align:start;margin-left:0;margin-bottom:16px;padding-bottom:8px;border-bottom:1px solid var(--el-border-color-lighter)}.first-settings[data-v-4d2a1bec] .el-form{padding:16px 20px;background:var(--el-fill-color-lighter);border-radius:12px;border:1px solid var(--el-border-color-lighter);margin-bottom:20px}.first-settings[data-v-4d2a1bec] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.first-settings[data-v-4d2a1bec] .el-form-item:last-child{margin-bottom:0}.first-settings[data-v-4d2a1bec] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary);width:auto!important}.first-settings[data-v-4d2a1bec] .el-form-item__content{width:100%;max-width:400px;margin-left:0!important}.first-settings[data-v-4d2a1bec] .el-input{width:100%}.first-settings[data-v-4d2a1bec] .el-switch{--el-switch-on-color:var(--el-color-primary)}.actions[data-v-4d2a1bec]{margin-top:20px;display:flex;justify-content:flex-end;gap:12px}.actions[data-v-4d2a1bec] .el-button{border-radius:8px;padding:10px 20px}@media (max-width:768px){.others-settings[data-v-4d2a1bec]{padding:15px}.first-settings[data-v-4d2a1bec] .el-form{padding:12px 15px}.first-settings[data-v-4d2a1bec] .el-form-item__content{max-width:100%}}.container[data-v-c5d2c9c2]{background:var(--admin-container-bg-color);min-height:100vh;font-family:Arial,sans-serif;color:var(--admin-container-color);margin:0;padding:0}.header-content[data-v-c5d2c9c2]{display:flex;justify-content:space-between;align-items:center;padding:10px 24px;background:hsla(0,0%,100%,.72);backdrop-filter:blur(20px) saturate(180%);-webkit-backdrop-filter:blur(20px) saturate(180%);border:1px solid hsla(0,0%,100%,.3);border-top:1px solid hsla(0,0%,100%,.5);box-shadow:0 4px 30px rgba(0,0,0,.1),0 1px 3px rgba(0,0,0,.05),inset 0 1px 0 hsla(0,0%,100%,.4);transition:all .4s cubic-bezier(.4,0,.2,1);border-radius:16px;position:fixed;top:8px;left:50%;transform:translateX(-50%);width:calc(95% - 16px);z-index:2001;min-height:45px}html.dark .header-content[data-v-c5d2c9c2]{background:rgba(30,30,30,.75);border:1px solid hsla(0,0%,100%,.08);border-top:1px solid hsla(0,0%,100%,.12);box-shadow:0 4px 30px rgba(0,0,0,.3),0 1px 3px rgba(0,0,0,.2),inset 0 1px 0 hsla(0,0%,100%,.05)}@media (max-width:768px){.header-content[data-v-c5d2c9c2]{flex-direction:column;top:6px;width:calc(100% - 32px);border-radius:14px;padding:6px 12px;gap:4px}.header-icon[data-v-c5d2c9c2]{font-size:.95em}}.header-content[data-v-c5d2c9c2]:hover{background:hsla(0,0%,100%,.82);box-shadow:0 8px 40px rgba(0,0,0,.12),0 2px 6px rgba(0,0,0,.08),inset 0 1px 0 hsla(0,0%,100%,.5);transform:translateX(-50%) translateY(-1px)}html.dark .header-content[data-v-c5d2c9c2]:hover{background:rgba(35,35,35,.85);box-shadow:0 8px 40px rgba(0,0,0,.4),0 2px 6px rgba(0,0,0,.3),inset 0 1px 0 hsla(0,0%,100%,.08)}.header-icon[data-v-c5d2c9c2]{font-size:1.5em;cursor:pointer;transition:all .3s ease;color:var(--admin-container-color);outline:none}.header-icon[data-v-c5d2c9c2]:hover{color:#b39ddb;transform:scale(1.2)}.header-action[data-v-c5d2c9c2]{display:flex;gap:10px}.main-container[data-v-c5d2c9c2]{margin-top:60px;transition:margin-left .3s ease,width .3s ease;width:calc(100% - 280px);margin-left:170px}.main-container.collapsed[data-v-c5d2c9c2]{width:calc(100% - 150px);margin-left:80px}@media (max-width:768px){.main-container.collapsed[data-v-c5d2c9c2],.main-container[data-v-c5d2c9c2]{width:calc(100% - 80px);margin-left:70px;padding:0 10px}} \ No newline at end of file diff --git a/css/289.f7890ec7.css.gz b/css/289.f7890ec7.css.gz new file mode 100644 index 0000000000000000000000000000000000000000..68dc98e3c4d59de791a90bc83d59ce142b8f7f19 GIT binary patch literal 9848 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 literal 0 HcmV?d00001 diff --git a/css/424.0b141552.css b/css/424.0b141552.css deleted file mode 100644 index ef403e5..0000000 --- a/css/424.0b141552.css +++ /dev/null @@ -1 +0,0 @@ -.sidebar-container[data-v-2bd8175a]{display:flex;flex-direction:column;position:fixed;top:50%;left:8px;transform:translateY(-50%);z-index:2001;width:150px;background:hsla(0,0%,100%,.72);backdrop-filter:blur(20px) saturate(180%);-webkit-backdrop-filter:blur(20px) saturate(180%);border:1px solid hsla(0,0%,100%,.3);border-radius:16px;box-shadow:0 4px 30px rgba(0,0,0,.1),0 1px 3px rgba(0,0,0,.05),inset 0 1px 0 hsla(0,0%,100%,.4);transition:width .3s ease,box-shadow .3s ease;overflow:hidden}.sidebar-container.is-collapsed[data-v-2bd8175a]{width:56px}html.dark .sidebar-container[data-v-2bd8175a]{background:rgba(30,30,30,.75);border:1px solid hsla(0,0%,100%,.08);box-shadow:0 4px 30px rgba(0,0,0,.3),0 1px 3px rgba(0,0,0,.2),inset 0 1px 0 hsla(0,0%,100%,.05)}.sidebar-container[data-v-2bd8175a]:hover{box-shadow:0 8px 40px rgba(0,0,0,.12),0 2px 6px rgba(0,0,0,.08),inset 0 1px 0 hsla(0,0%,100%,.5)}html.dark .sidebar-container[data-v-2bd8175a]:hover{box-shadow:0 8px 40px rgba(0,0,0,.4),0 2px 6px rgba(0,0,0,.3),inset 0 1px 0 hsla(0,0%,100%,.08)}.menu-list[data-v-2bd8175a]{padding:8px}.menu-item[data-v-2bd8175a]{display:flex;align-items:center;padding:12px;height:42px;box-sizing:border-box;border-radius:10px;cursor:pointer;transition:background .2s ease,color .2s ease,padding .25s ease;color:var(--admin-container-color,#333);gap:0;overflow:hidden}.sidebar-container.is-collapsed .menu-item[data-v-2bd8175a]{padding:12px 0}.menu-item[data-v-2bd8175a]:hover{background:rgba(0,0,0,.06)}html.dark .menu-item[data-v-2bd8175a]:hover{background:hsla(0,0%,100%,.1)}.menu-item.is-active[data-v-2bd8175a]{background:linear-gradient(135deg,rgba(64,158,255,.15),rgba(56,189,248,.25));color:#409eff}html.dark .menu-item.is-active[data-v-2bd8175a]{background:linear-gradient(135deg,rgba(64,158,255,.2),rgba(56,189,248,.35))}.menu-icon[data-v-2bd8175a]{width:32px;min-width:32px;font-size:16px;flex-shrink:0;text-align:center}.menu-text[data-v-2bd8175a]{font-size:14px;font-weight:500;white-space:nowrap;overflow:hidden;opacity:1;max-width:100px;transition:opacity .2s ease .05s,max-width .25s ease}.sidebar-container.is-collapsed .menu-text[data-v-2bd8175a]{opacity:0;max-width:0;transition:opacity .1s ease,max-width .2s ease}.toggle-button[data-v-2bd8175a]{padding:12px;text-align:center;cursor:pointer;border-top:1px solid rgba(0,0,0,.08);transition:all .2s ease;color:var(--admin-container-color,#333)}html.dark .toggle-button[data-v-2bd8175a]{border-top:1px solid hsla(0,0%,100%,.08)}.toggle-button[data-v-2bd8175a]:hover{background:rgba(0,0,0,.04)}html.dark .toggle-button[data-v-2bd8175a]:hover{background:hsla(0,0%,100%,.06)}@media (max-width:768px){.sidebar-container[data-v-2bd8175a]{left:4px;width:140px}.sidebar-container.is-collapsed[data-v-2bd8175a]{width:50px}}.status-panel[data-v-54756a6a]{padding:20px;background:transparent;min-height:100vh}.overview-cards[data-v-54756a6a]{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:20px;margin-bottom:30px}.overview-card[data-v-54756a6a]{background:var(--admin-dashborad-stats-bg-color);border-radius:16px;padding:24px;display:flex;align-items:center;box-shadow:var(--admin-dashboard-stats-shadow);transition:all .3s ease;border:1px solid hsla(0,0%,100%,.2);cursor:pointer}.overview-card[data-v-54756a6a]:hover{transform:translateY(-2px);box-shadow:var(--admin-dashboard-stats-hover-shadow);background:var(--admin-dashborad-stats-hover-bg-color)}.card-icon[data-v-54756a6a]{width:60px;height:60px;border-radius:12px;display:flex;align-items:center;justify-content:center;font-size:24px;margin-right:20px;background:linear-gradient(135deg,var(--admin-purple),#e1bee7);color:#fff}.card-content[data-v-54756a6a]{flex:1}.card-title[data-v-54756a6a]{font-size:14px;color:#666;margin-bottom:8px;font-weight:500}.card-value[data-v-54756a6a]{font-size:28px;font-weight:700;color:var(--admin-container-color);line-height:1}.card-subtitle[data-v-54756a6a]{font-size:11px;color:#999;margin-top:4px;opacity:.8}.charts-section[data-v-54756a6a]{display:grid;grid-template-columns:repeat(auto-fit,minmax(400px,1fr));gap:20px;margin-bottom:30px}.chart-card[data-v-54756a6a]{background:var(--admin-dashborad-stats-bg-color);border-radius:16px;padding:24px;box-shadow:var(--admin-dashboard-stats-shadow);transition:all .3s ease;border:1px solid hsla(0,0%,100%,.2)}.chart-card[data-v-54756a6a]:hover{box-shadow:var(--admin-dashboard-stats-hover-shadow)}.chart-card[data-v-54756a6a],.chart-content[data-v-54756a6a],.pie-chart-container[data-v-54756a6a],.pie-chart-wrapper[data-v-54756a6a]{overflow:visible}.chart-header[data-v-54756a6a]{display:flex;gap:8px;align-items:center;margin-bottom:20px;font-size:16px;font-weight:600;color:var(--admin-container-color)}.chart-header .fa-icon[data-v-54756a6a]{margin-right:10px;color:var(--admin-purple)}.chart-content[data-v-54756a6a]{min-height:160px;padding:10px;margin:-10px}.empty-state[data-v-54756a6a]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:160px;color:#999;font-size:14px}.empty-state .fa-icon[data-v-54756a6a]{font-size:32px;margin-bottom:10px}.stats-list[data-v-54756a6a]{display:flex;flex-direction:column;gap:16px}.stats-item[data-v-54756a6a]{display:flex;align-items:center;gap:12px}.stats-label[data-v-54756a6a]{min-width:80px;font-size:13px;color:#666;font-weight:500}.stats-bar[data-v-54756a6a]{flex:1;height:8px;background:#f0f0f0;border-radius:4px;overflow:hidden}.stats-fill[data-v-54756a6a]{height:100%;background:linear-gradient(90deg,var(--admin-purple),#e1bee7);border-radius:4px;transition:width .6s ease}.type-fill[data-v-54756a6a]{background:linear-gradient(90deg,#4caf50,#81c784)}.stats-value[data-v-54756a6a]{min-width:50px;text-align:right;font-size:13px;font-weight:600;color:var(--admin-container-color)}.pie-chart-container[data-v-54756a6a]{display:flex;align-items:center;gap:24px;flex-wrap:wrap;justify-content:center}.pie-chart-wrapper[data-v-54756a6a]{position:relative;width:160px;height:160px;flex-shrink:0;padding:10px;margin:-10px;overflow:visible}.chart-center-text[data-v-54756a6a]{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);text-align:center;pointer-events:none}.center-value[data-v-54756a6a]{font-size:22px;font-weight:700;color:var(--admin-container-color);line-height:1.2}.center-label[data-v-54756a6a]{font-size:11px;color:#888;margin-top:2px}.chart-legend[data-v-54756a6a]{display:flex;flex-direction:column;gap:10px;flex:1;min-width:180px}.legend-item[data-v-54756a6a]{display:flex;align-items:center;gap:10px;padding:8px 12px;background:rgba(0,0,0,.03);border-radius:8px;transition:all .2s ease}.legend-item[data-v-54756a6a]:hover{background:rgba(0,0,0,.06);transform:translateX(4px)}html.dark .legend-item[data-v-54756a6a]{background:hsla(0,0%,100%,.05)}html.dark .legend-item[data-v-54756a6a]:hover{background:hsla(0,0%,100%,.1)}.legend-color[data-v-54756a6a]{width:12px;height:12px;border-radius:3px;flex-shrink:0}.legend-label[data-v-54756a6a]{flex:1;font-size:13px;color:var(--admin-container-color);font-weight:500}.legend-value[data-v-54756a6a]{font-size:13px;font-weight:600;color:var(--admin-container-color);min-width:50px;text-align:right}.legend-percent[data-v-54756a6a]{font-size:12px;color:#888;min-width:40px;text-align:right}.actions-section[data-v-54756a6a]{margin-bottom:30px}.action-card[data-v-54756a6a]{background:var(--admin-dashborad-stats-bg-color);border-radius:16px;padding:24px;box-shadow:var(--admin-dashboard-stats-shadow);border:1px solid hsla(0,0%,100%,.2)}.action-header[data-v-54756a6a]{display:flex;align-items:center;gap:8px;margin-bottom:3px;font-size:16px;font-weight:600;color:var(--admin-container-color)}.action-header .fa-icon[data-v-54756a6a]{margin-right:10px;color:var(--admin-purple)}.action-content[data-v-54756a6a]{display:flex;justify-content:center;padding:20px 0}.action-buttons[data-v-54756a6a]{display:flex;gap:20px;flex-wrap:wrap;justify-content:center;align-items:center;width:100%}.action-btn[data-v-54756a6a]{border:none;border-radius:12px;padding:12px 24px;margin-left:0;font-weight:600;transition:all .3s ease;min-width:140px;width:140px;height:48px}@media (max-width:768px){.action-btn[data-v-54756a6a]{flex:1;width:auto;min-width:0;height:auto}}.action-btn[data-v-54756a6a]:hover{transform:translateY(-2px)}.action-btn .fa-icon[data-v-54756a6a]{margin-right:8px}.rebuild-btn[data-v-54756a6a]{background:linear-gradient(135deg,var(--admin-purple),#e1bee7)}.rebuild-btn[data-v-54756a6a]:hover{box-shadow:0 6px 16px rgba(179,157,219,.4)}.backup-btn[data-v-54756a6a]{background:linear-gradient(135deg,#4caf50,#81c784)}.backup-btn[data-v-54756a6a]:hover{box-shadow:0 6px 16px rgba(76,175,80,.4)}.restore-btn[data-v-54756a6a]{background:linear-gradient(135deg,#ff9800,#ffb74d)}.restore-btn[data-v-54756a6a]:hover{box-shadow:0 6px 16px rgba(255,152,0,.4)}.restore-section[data-v-54756a6a]{display:inline-block}@media (max-width:768px){.action-buttons>.el-tooltip[data-v-54756a6a],.action-buttons>.restore-section[data-v-54756a6a],.restore-section[data-v-54756a6a]{flex:1;width:100%}.action-btn[data-v-54756a6a]{width:100%!important;padding:10px 20px!important;box-sizing:border-box}}.file-info-section[data-v-54756a6a]{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:20px;align-items:stretch}.file-info-card[data-v-54756a6a]{position:relative;background:var(--admin-dashborad-stats-bg-color);border-radius:16px;box-shadow:var(--admin-dashboard-stats-shadow);border:1px solid hsla(0,0%,100%,.2);transition:all .3s ease;height:300px;overflow:hidden;cursor:pointer}.file-info-card[data-v-54756a6a]:hover{transform:translateY(-2px);box-shadow:var(--admin-dashboard-stats-hover-shadow)}.card-bg-wrapper[data-v-54756a6a]{position:absolute;top:0;left:0;width:100%;height:100%;z-index:0}.card-bg-media[data-v-54756a6a]{width:100%;height:100%;-o-object-fit:cover;object-fit:cover;transition:transform .5s ease}.file-info-card:hover .card-bg-media[data-v-54756a6a]{transform:scale(1.05)}.card-bg-fallback[data-v-54756a6a],.card-bg-placeholder[data-v-54756a6a]{width:100%;height:100%;background:var(--admin-dashborad-stats-bg-color);display:flex;align-items:center;justify-content:center}.fallback-icon[data-v-54756a6a]{font-size:80px;color:var(--el-text-color-placeholder);opacity:.3}.info-card-overlay[data-v-54756a6a]{position:absolute;top:0;left:0;width:100%;height:100%;background:linear-gradient(180deg,rgba(0,0,0,.05) 0,rgba(0,0,0,.1) 60%,rgba(0,0,0,.3));z-index:1;display:flex;flex-direction:column;justify-content:space-between;padding:12px 16px}.info-card-header[data-v-54756a6a]{display:flex;justify-content:flex-start}.header-badge[data-v-54756a6a]{display:flex;align-items:center;gap:6px;padding:6px 12px;background:rgba(var(--admin-purple-rgb,106,27,154),.9);color:#fff;border-radius:20px;font-size:12px;font-weight:600;backdrop-filter:blur(4px);box-shadow:0 2px 8px rgba(0,0,0,.2)}.header-badge.warning[data-v-54756a6a]{background:rgba(255,152,0,.9)}.info-card-content[data-v-54756a6a]{display:flex;align-items:flex-end;gap:15px;width:100%;padding-bottom:20px}.info-details[data-v-54756a6a]{flex:1;min-width:0}.file-name[data-v-54756a6a]{font-size:16px;color:#fff;margin-bottom:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:600;text-shadow:0 1px 2px rgba(0,0,0,.5)}.file-meta[data-v-54756a6a]{font-size:13px;color:#fff}@media (max-width:768px){.status-panel[data-v-54756a6a]{padding:15px}.charts-section[data-v-54756a6a],.file-info-section[data-v-54756a6a],.overview-cards[data-v-54756a6a]{grid-template-columns:1fr;gap:15px}.card-icon[data-v-54756a6a]{width:50px;height:50px;font-size:20px;margin-right:15px}.card-value[data-v-54756a6a]{font-size:24px}.action-buttons[data-v-54756a6a]{flex-direction:column;gap:12px}.action-btn[data-v-54756a6a]{width:100%;min-width:unset}}.stats-fill[data-v-54756a6a]{animation:fillAnimation-54756a6a 1s ease-out}@keyframes fillAnimation-54756a6a{0%{width:0}}.el-progress{align-items:center;display:flex;line-height:1;position:relative}.el-progress__text{color:var(--el-text-color-regular);font-size:14px;line-height:1;margin-left:5px;min-width:50px}.el-progress__text i{display:block;vertical-align:middle}.el-progress--circle,.el-progress--dashboard{display:inline-block}.el-progress--circle .el-progress__text,.el-progress--dashboard .el-progress__text{left:0;margin:0;position:absolute;text-align:center;top:50%;transform:translateY(-50%);width:100%}.el-progress--circle .el-progress__text i,.el-progress--dashboard .el-progress__text i{display:inline-block;vertical-align:middle}.el-progress--without-text .el-progress__text{display:none}.el-progress--without-text .el-progress-bar{display:block;margin-right:0;padding-right:0}.el-progress--text-inside .el-progress-bar{margin-right:0;padding-right:0}.el-progress.is-success .el-progress-bar__inner{background-color:var(--el-color-success)}.el-progress.is-success .el-progress__text{color:var(--el-color-success)}.el-progress.is-warning .el-progress-bar__inner{background-color:var(--el-color-warning)}.el-progress.is-warning .el-progress__text{color:var(--el-color-warning)}.el-progress.is-exception .el-progress-bar__inner{background-color:var(--el-color-danger)}.el-progress.is-exception .el-progress__text{color:var(--el-color-danger)}.el-progress-bar{box-sizing:border-box;flex-grow:1}.el-progress-bar__outer{background-color:var(--el-border-color-lighter);border-radius:100px;height:6px;overflow:hidden;position:relative;vertical-align:middle}.el-progress-bar__inner{background-color:var(--el-color-primary);border-radius:100px;height:100%;left:0;line-height:1;position:absolute;text-align:right;top:0;transition:width .6s ease;white-space:nowrap}.el-progress-bar__inner:after{content:"";display:inline-block;height:100%;vertical-align:middle}.el-progress-bar__inner--indeterminate{animation:indeterminate 3s infinite;transform:translateZ(0)}.el-progress-bar__inner--striped{background-image:linear-gradient(45deg,rgba(0,0,0,.1) 25%,transparent 0,transparent 50%,rgba(0,0,0,.1) 0,rgba(0,0,0,.1) 75%,transparent 0,transparent);background-size:1.25em 1.25em}.el-progress-bar__inner--striped.el-progress-bar__inner--striped-flow{animation:striped-flow 3s linear infinite}.el-progress-bar__innerText{color:#fff;display:inline-block;font-size:12px;margin:0 5px;vertical-align:middle}@keyframes progress{0%{background-position:0 0}to{background-position:32px 0}}@keyframes indeterminate{0%{left:-100%}to{left:100%}}@keyframes striped-flow{0%{background-position:-100%}to{background-position:100%}}.el-input-number{display:inline-flex;line-height:30px;position:relative;vertical-align:middle;width:150px}.el-input-number .el-input__wrapper{padding-left:42px;padding-right:42px}.el-input-number .el-input__inner{-webkit-appearance:none;-moz-appearance:textfield;line-height:1;text-align:center}.el-input-number .el-input__inner::-webkit-inner-spin-button,.el-input-number .el-input__inner::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.el-input-number.is-left .el-input__inner{text-align:left}.el-input-number.is-right .el-input__inner{text-align:right}.el-input-number.is-center .el-input__inner{text-align:center}.el-input-number__decrease,.el-input-number__increase{align-items:center;background:var(--el-fill-color-light);bottom:1px;color:var(--el-text-color-regular);cursor:pointer;display:flex;font-size:13px;height:auto;justify-content:center;position:absolute;top:1px;-webkit-user-select:none;user-select:none;width:32px;z-index:1}.el-input-number__decrease:hover,.el-input-number__increase:hover{color:var(--el-color-primary)}.el-input-number__decrease:hover~.el-input:not(.is-disabled) .el-input__wrapper,.el-input-number__increase:hover~.el-input:not(.is-disabled) .el-input__wrapper{box-shadow:0 0 0 1px var(--el-input-focus-border-color,var(--el-color-primary)) inset}.el-input-number__decrease.is-disabled,.el-input-number__increase.is-disabled{color:var(--el-disabled-text-color);cursor:not-allowed}.el-input-number__increase{border-left:var(--el-border);border-radius:0 var(--el-border-radius-base) var(--el-border-radius-base) 0;right:1px}.el-input-number__decrease{border-radius:var(--el-border-radius-base) 0 0 var(--el-border-radius-base);border-right:var(--el-border);left:1px}.el-input-number.is-disabled .el-input-number__decrease,.el-input-number.is-disabled .el-input-number__increase{border-color:var(--el-disabled-border-color);color:var(--el-disabled-border-color)}.el-input-number.is-disabled .el-input-number__decrease:hover,.el-input-number.is-disabled .el-input-number__increase:hover{color:var(--el-disabled-border-color);cursor:not-allowed}.el-input-number--large{line-height:38px;width:180px}.el-input-number--large .el-input-number__decrease,.el-input-number--large .el-input-number__increase{font-size:14px;width:40px}.el-input-number--large.is-controls-right .el-input--large .el-input__wrapper{padding-right:47px}.el-input-number--large .el-input--large .el-input__wrapper{padding-left:47px;padding-right:47px}.el-input-number--small{line-height:22px;width:120px}.el-input-number--small .el-input-number__decrease,.el-input-number--small .el-input-number__increase{font-size:12px;width:24px}.el-input-number--small.is-controls-right .el-input--small .el-input__wrapper{padding-right:31px}.el-input-number--small .el-input--small .el-input__wrapper{padding-left:31px;padding-right:31px}.el-input-number--small .el-input-number__decrease [class*=el-icon],.el-input-number--small .el-input-number__increase [class*=el-icon]{transform:scale(.9)}.el-input-number.is-without-controls .el-input__wrapper{padding-left:15px;padding-right:15px}.el-input-number.is-controls-right .el-input__wrapper{padding-left:15px;padding-right:42px}.el-input-number.is-controls-right .el-input-number__decrease,.el-input-number.is-controls-right .el-input-number__increase{--el-input-number-controls-height:15px;height:var(--el-input-number-controls-height);line-height:var(--el-input-number-controls-height)}.el-input-number.is-controls-right .el-input-number__decrease [class*=el-icon],.el-input-number.is-controls-right .el-input-number__increase [class*=el-icon]{transform:scale(.8)}.el-input-number.is-controls-right .el-input-number__increase{border-bottom:var(--el-border);border-radius:0 var(--el-border-radius-base) 0 0;bottom:auto;left:auto}.el-input-number.is-controls-right .el-input-number__decrease{border-left:var(--el-border);border-radius:0 0 var(--el-border-radius-base) 0;border-right:none;left:auto;right:1px;top:auto}.el-input-number.is-controls-right[class*=large] [class*=decrease],.el-input-number.is-controls-right[class*=large] [class*=increase]{--el-input-number-controls-height:19px}.el-input-number.is-controls-right[class*=small] [class*=decrease],.el-input-number.is-controls-right[class*=small] [class*=increase]{--el-input-number-controls-height:11px}.el-form{--el-form-label-font-size:var(--el-font-size-base);--el-form-inline-content-width:220px}.el-form--inline .el-form-item{display:inline-flex;margin-right:32px;vertical-align:middle}.el-form--inline.el-form--label-top{display:flex;flex-wrap:wrap}.el-form--inline.el-form--label-top .el-form-item{display:block}.el-form-item{display:flex;--font-size:14px;margin-bottom:18px}.el-form-item .el-form-item{margin-bottom:0}.el-form-item .el-input__validateIcon{display:none}.el-form-item--large{--font-size:14px;--el-form-label-font-size:var(--font-size);margin-bottom:22px}.el-form-item--large .el-form-item__label{height:40px;line-height:40px}.el-form-item--large .el-form-item__content{line-height:40px}.el-form-item--large .el-form-item__error{padding-top:4px}.el-form-item--default{--font-size:14px;--el-form-label-font-size:var(--font-size);margin-bottom:18px}.el-form-item--default .el-form-item__label{height:32px;line-height:32px}.el-form-item--default .el-form-item__content{line-height:32px}.el-form-item--default .el-form-item__error{padding-top:2px}.el-form-item--small{--font-size:12px;--el-form-label-font-size:var(--font-size);margin-bottom:18px}.el-form-item--small .el-form-item__label{height:24px;line-height:24px}.el-form-item--small .el-form-item__content{line-height:24px}.el-form-item--small .el-form-item__error{padding-top:2px}.el-form-item--label-left .el-form-item__label{justify-content:flex-start;text-align:left}.el-form-item--label-right .el-form-item__label{justify-content:flex-end;text-align:right}.el-form-item--label-top{display:block}.el-form-item--label-top .el-form-item__label{display:block;height:auto;line-height:22px;margin-bottom:8px;padding-right:0;text-align:left;width:fit-content}.el-form-item__label-wrap{display:flex}.el-form-item__label{align-items:flex-start;box-sizing:border-box;color:var(--el-text-color-regular);display:inline-flex;flex:0 0 auto;font-size:var(--el-form-label-font-size);height:32px;line-height:32px;padding:0 12px 0 0}.el-form-item__content{align-items:center;display:flex;flex:1;flex-wrap:wrap;font-size:var(--font-size);line-height:32px;min-width:0;position:relative}.el-form-item__content .el-input-group{vertical-align:top}.el-form-item__error{color:var(--el-color-danger);font-size:12px;left:0;line-height:1;padding-top:2px;position:absolute;top:100%}.el-form-item__error--inline{display:inline-block;left:auto;margin-left:10px;position:relative;top:auto}.el-form-item.is-required:not(.is-no-asterisk).asterisk-left>.el-form-item__label-wrap>.el-form-item__label:before,.el-form-item.is-required:not(.is-no-asterisk).asterisk-left>.el-form-item__label:before{color:var(--el-color-danger);content:"*";margin-right:4px}.el-form-item.is-required:not(.is-no-asterisk).asterisk-right>.el-form-item__label-wrap>.el-form-item__label:after,.el-form-item.is-required:not(.is-no-asterisk).asterisk-right>.el-form-item__label:after{color:var(--el-color-danger);content:"*";margin-left:4px}.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper,.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper.is-focus,.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper:focus,.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper:hover,.el-form-item.is-error .el-form-item__content .el-input__wrapper,.el-form-item.is-error .el-form-item__content .el-input__wrapper.is-focus,.el-form-item.is-error .el-form-item__content .el-input__wrapper:focus,.el-form-item.is-error .el-form-item__content .el-input__wrapper:hover,.el-form-item.is-error .el-form-item__content .el-select__wrapper,.el-form-item.is-error .el-form-item__content .el-select__wrapper.is-focus,.el-form-item.is-error .el-form-item__content .el-select__wrapper:focus,.el-form-item.is-error .el-form-item__content .el-select__wrapper:hover,.el-form-item.is-error .el-form-item__content .el-textarea__inner,.el-form-item.is-error .el-form-item__content .el-textarea__inner.is-focus,.el-form-item.is-error .el-form-item__content .el-textarea__inner:focus,.el-form-item.is-error .el-form-item__content .el-textarea__inner:hover{box-shadow:0 0 0 1px var(--el-color-danger) inset}.el-form-item.is-error .el-form-item__content .el-input-group__append .el-input__wrapper,.el-form-item.is-error .el-form-item__content .el-input-group__prepend .el-input__wrapper{box-shadow:inset 0 0 0 1px transparent}.el-form-item.is-error .el-form-item__content .el-input-group__append .el-input__validateIcon,.el-form-item.is-error .el-form-item__content .el-input-group__prepend .el-input__validateIcon{display:none}.el-form-item.is-error .el-form-item__content .el-input__validateIcon{color:var(--el-color-danger)}.el-form-item--feedback .el-input__validateIcon,.el-radio{display:inline-flex}.el-radio{--el-radio-font-size:var(--el-font-size-base);--el-radio-text-color:var(--el-text-color-regular);--el-radio-font-weight:var(--el-font-weight-primary);--el-radio-input-height:14px;--el-radio-input-width:14px;--el-radio-input-border-radius:var(--el-border-radius-circle);--el-radio-input-bg-color:var(--el-fill-color-blank);--el-radio-input-border:var(--el-border);--el-radio-input-border-color:var(--el-border-color);--el-radio-input-border-color-hover:var(--el-color-primary);align-items:center;color:var(--el-radio-text-color);cursor:pointer;font-size:var(--el-font-size-base);font-weight:var(--el-radio-font-weight);height:32px;margin-right:30px;outline:none;position:relative;-webkit-user-select:none;user-select:none;white-space:nowrap}.el-radio.el-radio--large{height:40px}.el-radio.el-radio--small{height:24px}.el-radio.is-bordered{border:var(--el-border);border-radius:var(--el-border-radius-base);box-sizing:border-box;padding:0 15px 0 9px}.el-radio.is-bordered.is-checked{border-color:var(--el-color-primary)}.el-radio.is-bordered.is-disabled{border-color:var(--el-border-color-lighter);cursor:not-allowed}.el-radio.is-bordered.el-radio--large{border-radius:var(--el-border-radius-base);padding:0 19px 0 11px}.el-radio.is-bordered.el-radio--large .el-radio__label{font-size:var(--el-font-size-base)}.el-radio.is-bordered.el-radio--large .el-radio__inner{height:14px;width:14px}.el-radio.is-bordered.el-radio--small{border-radius:var(--el-border-radius-base);padding:0 11px 0 7px}.el-radio.is-bordered.el-radio--small .el-radio__label{font-size:12px}.el-radio.is-bordered.el-radio--small .el-radio__inner{height:12px;width:12px}.el-radio:last-child{margin-right:0}.el-radio__input{cursor:pointer;display:inline-flex;outline:none;position:relative;vertical-align:middle;white-space:nowrap}.el-radio__input.is-disabled .el-radio__inner{border-color:var(--el-disabled-border-color)}.el-radio__input.is-disabled .el-radio__inner,.el-radio__input.is-disabled .el-radio__inner:after{background-color:var(--el-disabled-bg-color);cursor:not-allowed}.el-radio__input.is-disabled .el-radio__inner+.el-radio__label{cursor:not-allowed}.el-radio__input.is-disabled.is-checked .el-radio__inner{background-color:var(--el-disabled-bg-color);border-color:var(--el-disabled-border-color)}.el-radio__input.is-disabled.is-checked .el-radio__inner:after{background-color:var(--el-text-color-placeholder)}.el-radio__input.is-disabled+span.el-radio__label{color:var(--el-text-color-placeholder);cursor:not-allowed}.el-radio__input.is-checked .el-radio__inner{background:var(--el-color-primary);border-color:var(--el-color-primary)}.el-radio__input.is-checked .el-radio__inner:after{background-color:var(--el-color-white);transform:translate(-50%,-50%) scale(1)}.el-radio__input.is-checked+.el-radio__label{color:var(--el-color-primary)}.el-radio__input.is-focus .el-radio__inner{border-color:var(--el-radio-input-border-color-hover)}.el-radio__inner{background-color:var(--el-radio-input-bg-color);border:var(--el-radio-input-border);border-radius:var(--el-radio-input-border-radius);box-sizing:border-box;cursor:pointer;display:inline-block;height:var(--el-radio-input-height);position:relative;width:var(--el-radio-input-width)}.el-radio__inner:hover{border-color:var(--el-radio-input-border-color-hover)}.el-radio__inner:after{border-radius:var(--el-radio-input-border-radius);content:"";height:4px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%) scale(0);transition:transform .15s ease-in;width:4px}.el-radio__original{bottom:0;left:0;margin:0;opacity:0;outline:none;position:absolute;right:0;top:0;z-index:-1}.el-radio__original:focus-visible+.el-radio__inner{border-radius:var(--el-radio-input-border-radius);outline:2px solid var(--el-radio-input-border-color-hover);outline-offset:1px}.el-radio:focus:not(:focus-visible):not(.is-focus):not(:active):not(.is-disabled) .el-radio__inner{box-shadow:0 0 2px 2px var(--el-radio-input-border-color-hover)}.el-radio__label{font-size:var(--el-radio-font-size);padding-left:8px}.el-radio.el-radio--large .el-radio__label{font-size:14px}.el-radio.el-radio--large .el-radio__inner{height:14px;width:14px}.el-radio.el-radio--small .el-radio__label{font-size:12px}.el-radio.el-radio--small .el-radio__inner{height:12px;width:12px}.el-radio-group{align-items:center;display:inline-flex;flex-wrap:wrap;font-size:0}.upload-settings[data-v-d5b2dcdc]{padding:20px;min-height:500px}.upload-channel[data-v-d5b2dcdc]{margin-bottom:40px}.first-title[data-v-d5b2dcdc]{display:flex;align-items:center;gap:8px;margin-bottom:16px}.upload-channel[data-v-d5b2dcdc] .el-radio-group{display:flex;gap:12px;flex-wrap:wrap}.upload-channel[data-v-d5b2dcdc] .el-radio{display:flex;align-items:center;padding:10px 20px;border-radius:10px;background:var(--el-fill-color-light);border:1px solid var(--el-border-color-lighter);transition:all .25s ease;margin-right:0;height:auto}.upload-channel[data-v-d5b2dcdc] .el-radio:hover{border-color:var(--el-color-primary-light-5);background:var(--el-fill-color)}.upload-channel[data-v-d5b2dcdc] .el-radio.is-checked{background:linear-gradient(135deg,rgba(64,158,255,.15),rgba(56,189,248,.1));border-color:var(--el-color-primary);box-shadow:0 2px 8px rgba(64,158,255,.2)}.upload-channel[data-v-d5b2dcdc] .el-radio__input{display:none}.upload-channel[data-v-d5b2dcdc] .el-radio__label{padding-left:0;font-weight:500;font-size:14px}.second-title[data-v-d5b2dcdc]{text-align:start;margin-left:0;margin-bottom:20px;padding-bottom:10px;border-bottom:1px solid var(--el-border-color-lighter)}.channel-settings[data-v-d5b2dcdc]{margin-top:20px}.channel-form[data-v-d5b2dcdc]{margin-bottom:30px;padding:20px;background:var(--el-fill-color-lighter);border-radius:12px;border:1px solid var(--el-border-color-lighter)}.channel-form[data-v-d5b2dcdc] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.channel-form[data-v-d5b2dcdc] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary)}.channel-form[data-v-d5b2dcdc] .el-form-item__content{width:100%;max-width:400px}.channel-form[data-v-d5b2dcdc] .el-input{width:100%}.channel-form[data-v-d5b2dcdc] .el-switch{--el-switch-on-color:var(--el-color-primary)}.actions[data-v-d5b2dcdc]{margin-top:20px;display:flex;justify-content:flex-end;gap:12px}.actions[data-v-d5b2dcdc] .el-button{border-radius:8px;padding:10px 20px}.quota-status[data-v-d5b2dcdc]{width:100%;max-width:400px}.quota-status[data-v-d5b2dcdc] .el-progress{margin-bottom:8px}.quota-status[data-v-d5b2dcdc] .el-progress-bar__inner{transition:width .5s ease}.quota-info[data-v-d5b2dcdc]{font-size:13px;color:var(--el-text-color-secondary);padding:8px 12px;background:var(--el-fill-color);border-radius:6px}.quota-info.quota-warning[data-v-d5b2dcdc]{color:var(--el-color-danger);background:var(--el-color-danger-light-9);font-weight:500}.discord-limit-tip[data-v-d5b2dcdc],.huggingface-tip[data-v-d5b2dcdc]{font-size:13px;color:var(--el-color-info);padding:10px 14px;background:var(--el-color-info-light-9);border-radius:6px;border-left:3px solid var(--el-color-info);white-space:nowrap}@media (max-width:768px){.upload-settings[data-v-d5b2dcdc]{padding:15px}.upload-channel[data-v-d5b2dcdc] .el-radio-group{gap:8px}.upload-channel[data-v-d5b2dcdc] .el-radio{padding:8px 14px;font-size:13px}.channel-form[data-v-d5b2dcdc]{padding:15px}.channel-form[data-v-d5b2dcdc] .el-form-item__content,.quota-status[data-v-d5b2dcdc]{max-width:100%}}:root{--el-popup-modal-bg-color:var(--el-color-black);--el-popup-modal-opacity:0.5}.v-modal-enter{animation:v-modal-in var(--el-transition-duration-fast) ease}.v-modal-leave{animation:v-modal-out var(--el-transition-duration-fast) ease forwards}@keyframes v-modal-in{0%{opacity:0}}@keyframes v-modal-out{to{opacity:0}}.v-modal{background:var(--el-popup-modal-bg-color);height:100%;left:0;opacity:var(--el-popup-modal-opacity);position:fixed;top:0;width:100%}.el-popup-parent--hidden{overflow:hidden}.el-dialog{--el-dialog-width:50%;--el-dialog-margin-top:15vh;--el-dialog-bg-color:var(--el-bg-color);--el-dialog-box-shadow:var(--el-box-shadow);--el-dialog-title-font-size:var(--el-font-size-large);--el-dialog-content-font-size:14px;--el-dialog-font-line-height:var(--el-font-line-height-primary);--el-dialog-padding-primary:16px;--el-dialog-border-radius:var(--el-border-radius-base);background:var(--el-dialog-bg-color);border-radius:var(--el-dialog-border-radius);box-shadow:var(--el-dialog-box-shadow);box-sizing:border-box;margin:var(--el-dialog-margin-top,15vh) auto 50px;overflow-wrap:break-word;padding:var(--el-dialog-padding-primary);position:relative;width:var(--el-dialog-width,50%)}.el-dialog:focus{outline:none!important}.el-dialog.is-align-center{margin:auto}.el-dialog.is-fullscreen{--el-dialog-width:100%;--el-dialog-margin-top:0;border-radius:0;height:100%;margin-bottom:0;overflow:auto}.el-dialog__wrapper{bottom:0;left:0;margin:0;overflow:auto;position:fixed;right:0;top:0}.el-dialog.is-draggable .el-dialog__header{cursor:move;-webkit-user-select:none;user-select:none}.el-dialog__header{padding-bottom:var(--el-dialog-padding-primary)}.el-dialog__header.show-close{padding-right:calc(var(--el-dialog-padding-primary) + var(--el-message-close-size, 16px))}.el-dialog__headerbtn{background:transparent;border:none;cursor:pointer;font-size:var(--el-message-close-size,16px);height:48px;outline:none;padding:0;position:absolute;right:0;top:0;width:48px}.el-dialog__headerbtn .el-dialog__close{color:var(--el-color-info);font-size:inherit}.el-dialog__headerbtn:focus .el-dialog__close,.el-dialog__headerbtn:hover .el-dialog__close{color:var(--el-color-primary)}.el-dialog__title{color:var(--el-text-color-primary);font-size:var(--el-dialog-title-font-size);line-height:var(--el-dialog-font-line-height)}.el-dialog__body{color:var(--el-text-color-regular);font-size:var(--el-dialog-content-font-size)}.el-dialog__footer{box-sizing:border-box;padding-top:var(--el-dialog-padding-primary);text-align:right}.el-dialog--center{text-align:center}.el-dialog--center .el-dialog__body{text-align:initial}.el-dialog--center .el-dialog__footer{text-align:inherit}.el-modal-dialog.is-penetrable{pointer-events:none}.el-modal-dialog.is-penetrable .el-dialog{pointer-events:auto}.el-overlay-dialog{bottom:0;left:0;overflow:auto;position:fixed;right:0;top:0}.dialog-fade-enter-active{animation:modal-fade-in var(--el-transition-duration)}.dialog-fade-enter-active .el-overlay-dialog{animation:dialog-fade-in var(--el-transition-duration)}.dialog-fade-leave-active{animation:modal-fade-out var(--el-transition-duration)}.dialog-fade-leave-active .el-overlay-dialog{animation:dialog-fade-out var(--el-transition-duration)}@keyframes dialog-fade-in{0%{opacity:0;transform:translate3d(0,-20px,0)}to{opacity:1;transform:translateZ(0)}}@keyframes dialog-fade-out{0%{opacity:1;transform:translateZ(0)}to{opacity:0;transform:translate3d(0,-20px,0)}}@keyframes modal-fade-in{0%{opacity:0}to{opacity:1}}@keyframes modal-fade-out{0%{opacity:1}to{opacity:0}}.el-checkbox-group{font-size:0;line-height:0}.el-table{--el-table-border-color:var(--el-border-color-lighter);--el-table-border:1px solid var(--el-table-border-color);--el-table-text-color:var(--el-text-color-regular);--el-table-header-text-color:var(--el-text-color-secondary);--el-table-row-hover-bg-color:var(--el-fill-color-light);--el-table-current-row-bg-color:var(--el-color-primary-light-9);--el-table-header-bg-color:var(--el-bg-color);--el-table-fixed-box-shadow:var(--el-box-shadow-light);--el-table-bg-color:var(--el-fill-color-blank);--el-table-tr-bg-color:var(--el-bg-color);--el-table-expanded-cell-bg-color:var(--el-fill-color-blank);--el-table-fixed-left-column:inset 10px 0 10px -10px rgba(0,0,0,.15);--el-table-fixed-right-column:inset -10px 0 10px -10px rgba(0,0,0,.15);--el-table-index:var(--el-index-normal);background-color:var(--el-table-bg-color);box-sizing:border-box;color:var(--el-table-text-color);font-size:var(--el-font-size-base);height:fit-content;max-width:100%;overflow:hidden;position:relative;width:100%}.el-table__inner-wrapper{display:flex;flex-direction:column;height:100%;position:relative}.el-table__inner-wrapper:before{bottom:0;height:1px;left:0}.el-table tbody:focus-visible{outline:none}.el-table.has-footer.el-table--fluid-height tr:last-child td.el-table__cell,.el-table.has-footer.el-table--scrollable-y tr:last-child td.el-table__cell{border-bottom-color:transparent}.el-table__empty-block{align-items:center;display:flex;justify-content:center;left:0;min-height:60px;position:sticky;text-align:center;width:100%}.el-table__empty-text{color:var(--el-text-color-secondary);line-height:60px;width:50%}.el-table__expand-column .cell{padding:0;text-align:center;-webkit-user-select:none;user-select:none}.el-table__expand-icon{appearance:none;background-color:transparent;border:none;border-radius:var(--el-border-radius-base);color:var(--el-text-color-regular);cursor:pointer;font-size:12px;height:23px;line-height:12px;margin:0;outline:none;padding:0;transition:transform var(--el-transition-duration-fast) ease-in-out;width:min(23px,100%)}.el-table__expand-icon:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:-2px}.el-table__expand-icon--expanded{transform:rotate(90deg)}.el-table__expand-icon>.el-icon{font-size:12px}.el-table__expanded-cell{background-color:var(--el-table-expanded-cell-bg-color)}.el-table__expanded-cell[class*=cell]{padding:20px 50px}.el-table__expanded-cell:hover{background-color:transparent!important}.el-table__placeholder{display:inline-block;width:20px}.el-table__append-wrapper{overflow:hidden}.el-table--fit{border-bottom:0;border-right:0}.el-table--fit .el-table__cell.gutter{border-right-width:1px}.el-table--fit .el-table__inner-wrapper:before{width:100%}.el-table thead{color:var(--el-table-header-text-color)}.el-table thead th{font-weight:600}.el-table thead.is-group th.el-table__cell{background:var(--el-fill-color-light)}.el-table .el-table__cell{box-sizing:border-box;min-width:0;padding:8px 0;position:relative;text-align:left;text-overflow:ellipsis;vertical-align:middle;z-index:var(--el-table-index)}.el-table .el-table__cell.is-center{text-align:center}.el-table .el-table__cell.is-right{text-align:right}.el-table .el-table__cell.gutter{border-bottom-width:0;border-right-width:0;padding:0;width:15px}.el-table .el-table__cell.is-hidden>*{visibility:hidden}.el-table .cell{box-sizing:border-box;line-height:23px;overflow:hidden;overflow-wrap:break-word;padding:0 12px;text-overflow:ellipsis;white-space:normal}.el-table .cell.el-tooltip{min-width:50px;white-space:nowrap}.el-table--large{font-size:var(--el-font-size-base)}.el-table--large .el-table__cell{padding:12px 0}.el-table--large .cell{padding:0 16px}.el-table--default{font-size:var(--el-font-size-base)}.el-table--default .el-table__cell{padding:8px 0}.el-table--default .cell{padding:0 12px}.el-table--small{font-size:var(--el-font-size-extra-small)}.el-table--small .el-table__cell{padding:4px 0}.el-table--small .cell{padding:0 8px}.el-table tr{background-color:var(--el-table-tr-bg-color)}.el-table tr input[type=checkbox]{margin:0}.el-table td.el-table__cell,.el-table th.el-table__cell.is-leaf{border-bottom:var(--el-table-border)}.el-table th.el-table__cell.is-sortable{cursor:pointer}.el-table th.el-table__cell{background-color:var(--el-table-header-bg-color)}.el-table th.el-table__cell>.cell.highlight{color:var(--el-color-primary)}.el-table th.el-table__cell.required>div:before{background:#ff4d51;border-radius:50%;content:"";display:inline-block;height:8px;margin-right:5px;vertical-align:middle;width:8px}.el-table td.el-table__cell div{box-sizing:border-box}.el-table td.el-table__cell.gutter{width:0}.el-table--border .el-table__inner-wrapper:after,.el-table--border:after,.el-table--border:before,.el-table__inner-wrapper:before{background-color:var(--el-table-border-color);content:"";position:absolute;z-index:calc(var(--el-table-index) + 2)}.el-table--border .el-table__inner-wrapper:after{height:1px;left:0;top:0;width:100%;z-index:calc(var(--el-table-index) + 2)}.el-table--border:before{height:100%;left:0;top:-1px;width:1px}.el-table--border:after{height:100%;right:0;top:-1px;width:1px}.el-table--border .el-table__inner-wrapper{border-bottom:none;border-right:none}.el-table--border .el-table__footer-wrapper{flex-shrink:0;position:relative}.el-table--border .el-table__cell{border-right:var(--el-table-border)}.el-table--border th.el-table__cell.gutter:last-of-type{border-bottom:var(--el-table-border);border-bottom-width:1px}.el-table--border th.el-table__cell{border-bottom:var(--el-table-border)}.el-table--hidden{visibility:hidden}.el-table__body-wrapper,.el-table__footer-wrapper,.el-table__header-wrapper{width:100%}.el-table__body-wrapper tr td.el-table-fixed-column--left,.el-table__body-wrapper tr td.el-table-fixed-column--right,.el-table__body-wrapper tr th.el-table-fixed-column--left,.el-table__body-wrapper tr th.el-table-fixed-column--right,.el-table__footer-wrapper tr td.el-table-fixed-column--left,.el-table__footer-wrapper tr td.el-table-fixed-column--right,.el-table__footer-wrapper tr th.el-table-fixed-column--left,.el-table__footer-wrapper tr th.el-table-fixed-column--right,.el-table__header-wrapper tr td.el-table-fixed-column--left,.el-table__header-wrapper tr td.el-table-fixed-column--right,.el-table__header-wrapper tr th.el-table-fixed-column--left,.el-table__header-wrapper tr th.el-table-fixed-column--right{background:inherit;position:sticky!important;z-index:calc(var(--el-table-index) + 1)}.el-table__body-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-last-column:before{bottom:-1px;box-shadow:none;content:"";overflow-x:hidden;overflow-y:hidden;pointer-events:none;position:absolute;top:0;touch-action:none;width:10px}.el-table__body-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-first-column:before{left:-10px}.el-table__body-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-last-column:before{right:-10px}.el-table__body-wrapper tr td.el-table__fixed-right-patch,.el-table__body-wrapper tr th.el-table__fixed-right-patch,.el-table__footer-wrapper tr td.el-table__fixed-right-patch,.el-table__footer-wrapper tr th.el-table__fixed-right-patch,.el-table__header-wrapper tr td.el-table__fixed-right-patch,.el-table__header-wrapper tr th.el-table__fixed-right-patch{background:#fff;position:sticky!important;right:0;z-index:calc(var(--el-table-index) + 1)}.el-table__header-wrapper{flex-shrink:0}.el-table__header-wrapper tr th.el-table-fixed-column--left,.el-table__header-wrapper tr th.el-table-fixed-column--right{background-color:var(--el-table-header-bg-color)}.el-table__body,.el-table__footer,.el-table__header{border-collapse:separate;table-layout:fixed}.el-table__header-wrapper{overflow:hidden}.el-table__header-wrapper tbody td.el-table__cell{background-color:var(--el-table-row-hover-bg-color);color:var(--el-table-text-color)}.el-table__footer-wrapper{flex-shrink:0;overflow:hidden}.el-table__footer-wrapper tfoot td.el-table__cell{background-color:var(--el-table-row-hover-bg-color);color:var(--el-table-text-color)}.el-table__body-wrapper .el-table-column--selection>.cell,.el-table__header-wrapper .el-table-column--selection>.cell{align-items:center;display:inline-flex;height:23px}.el-table__body-wrapper .el-table-column--selection .el-checkbox,.el-table__header-wrapper .el-table-column--selection .el-checkbox{height:unset}.el-table.is-scrolling-left .el-table-fixed-column--right.is-first-column:before{box-shadow:var(--el-table-fixed-right-column)}.el-table.is-scrolling-left.el-table--border .el-table-fixed-column--left.is-last-column.el-table__cell{border-right:var(--el-table-border)}.el-table.is-scrolling-left th.el-table-fixed-column--left{background-color:var(--el-table-header-bg-color)}.el-table.is-scrolling-right .el-table-fixed-column--left.is-last-column:before{box-shadow:var(--el-table-fixed-left-column)}.el-table.is-scrolling-right .el-table-fixed-column--left.is-last-column.el-table__cell{border-right:none}.el-table.is-scrolling-right th.el-table-fixed-column--right{background-color:var(--el-table-header-bg-color)}.el-table.is-scrolling-middle .el-table-fixed-column--left.is-last-column.el-table__cell{border-right:none}.el-table.is-scrolling-middle .el-table-fixed-column--right.is-first-column:before{box-shadow:var(--el-table-fixed-right-column)}.el-table.is-scrolling-middle .el-table-fixed-column--left.is-last-column:before{box-shadow:var(--el-table-fixed-left-column)}.el-table.is-scrolling-none .el-table-fixed-column--left.is-first-column:before,.el-table.is-scrolling-none .el-table-fixed-column--left.is-last-column:before,.el-table.is-scrolling-none .el-table-fixed-column--right.is-first-column:before,.el-table.is-scrolling-none .el-table-fixed-column--right.is-last-column:before{box-shadow:none}.el-table.is-scrolling-none th.el-table-fixed-column--left,.el-table.is-scrolling-none th.el-table-fixed-column--right{background-color:var(--el-table-header-bg-color)}.el-table__body-wrapper{flex:1;overflow:hidden;position:relative}.el-table__body-wrapper .el-scrollbar__bar{z-index:calc(var(--el-table-index) + 2)}.el-table .caret-wrapper{align-items:center;appearance:none;background-color:transparent;border:none;border-radius:var(--el-border-radius-base);cursor:pointer;display:inline-flex;flex-direction:column;height:14px;margin:0;outline:none;overflow:initial;padding:0;position:relative;transition:transform var(--el-transition-duration-fast) ease-in-out;vertical-align:middle;width:24px}.el-table .caret-wrapper:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:2px}.el-table .sort-caret{border:5px solid transparent;height:0;left:7px;position:absolute;width:0}.el-table .sort-caret.ascending{border-bottom-color:var(--el-text-color-placeholder);top:-5px}.el-table .sort-caret.descending{border-top-color:var(--el-text-color-placeholder);bottom:-3px}.el-table .ascending .sort-caret.ascending{border-bottom-color:var(--el-color-primary)}.el-table .descending .sort-caret.descending{border-top-color:var(--el-color-primary)}.el-table .hidden-columns{position:absolute;visibility:hidden;z-index:-1}.el-table--striped .el-table__body tr.el-table__row--striped td.el-table__cell{background:var(--el-fill-color-lighter)}.el-table--striped .el-table__body tr.el-table__row--striped.current-row td.el-table__cell{background-color:var(--el-table-current-row-bg-color)}.el-table__body tr.hover-row.current-row>td.el-table__cell,.el-table__body tr.hover-row.el-table__row--striped.current-row>td.el-table__cell,.el-table__body tr.hover-row.el-table__row--striped>td.el-table__cell,.el-table__body tr.hover-row>td.el-table__cell,.el-table__body tr>td.hover-cell{background-color:var(--el-table-row-hover-bg-color)}.el-table__body tr.current-row>td.el-table__cell{background-color:var(--el-table-current-row-bg-color)}.el-table.el-table--scrollable-y .el-table__body-header{position:sticky;top:0;z-index:calc(var(--el-table-index) + 2)}.el-table.el-table--scrollable-y .el-table__body-footer{bottom:0;position:sticky;z-index:calc(var(--el-table-index) + 2)}.el-table__column-resize-proxy{border-left:var(--el-table-border);bottom:0;left:200px;position:absolute;top:0;width:0;z-index:calc(var(--el-table-index) + 9)}.el-table__column-filter-trigger{appearance:none;background-color:transparent;border:none;border-radius:var(--el-border-radius-base);cursor:pointer;display:inline-block;margin:0;outline:none;padding:0;transition:transform var(--el-transition-duration-fast) ease-in-out}.el-table__column-filter-trigger:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:2px}.el-table__column-filter-trigger i{color:var(--el-color-info);font-size:14px;vertical-align:middle}.el-table__border-left-patch{height:100%;top:0;width:1px}.el-table__border-bottom-patch,.el-table__border-left-patch{background-color:var(--el-table-border-color);left:0;position:absolute;z-index:calc(var(--el-table-index) + 2)}.el-table__border-bottom-patch{height:1px}.el-table__border-right-patch{background-color:var(--el-table-border-color);height:100%;position:absolute;top:0;width:1px;z-index:calc(var(--el-table-index) + 2)}.el-table--enable-row-transition .el-table__body td.el-table__cell{transition:background-color .25s ease}.el-table--enable-row-hover .el-table__body tr:hover>td.el-table__cell{background-color:var(--el-table-row-hover-bg-color)}.el-table [class*=el-table__row--level] .el-table__expand-icon{display:inline-block;text-align:center;width:20px}.el-table .el-table.el-table--border .el-table__cell{border-right:var(--el-table-border)}.el-table:not(.el-table--border) .el-table__cell{border-right:none}.el-table:not(.el-table--border)>.el-table__inner-wrapper:after{content:none}.el-table-column--selection .cell{padding-left:14px;padding-right:14px}.el-table-filter{background-color:#fff;border:1px solid var(--el-border-color-lighter);border-radius:2px;box-shadow:var(--el-box-shadow-light);box-sizing:border-box}.el-table-filter__list{list-style:none;margin:0;min-width:100px;outline:none;padding:5px 0}.el-table-filter__list-item{cursor:pointer;font-size:var(--el-font-size-base);line-height:36px;outline:none;padding:0 10px}.el-table-filter__list-item:focus,.el-table-filter__list-item:hover{background-color:var(--el-color-primary-light-9);color:var(--el-color-primary)}.el-table-filter__list-item.is-active{background-color:var(--el-color-primary);color:#fff}.el-table-filter__multiple{outline:none}.el-table-filter__content{min-width:100px}.el-table-filter__bottom{border-top:1px solid var(--el-border-color-lighter);padding:8px}.el-table-filter__bottom button{appearance:none;background-color:transparent;border:none;border-radius:var(--el-border-radius-base);color:var(--el-text-color-regular);cursor:pointer;font-size:var(--el-font-size-small);margin:0;outline:none;padding:0 3px;transition:transform var(--el-transition-duration-fast) ease-in-out}.el-table-filter__bottom button:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:2px}.el-table-filter__bottom button:hover{color:var(--el-color-primary)}.el-table-filter__bottom button.is-disabled{color:var(--el-disabled-text-color);cursor:not-allowed}.el-table-filter__wrap{max-height:280px}.el-table-filter__checkbox-group{padding:10px}.el-table-filter__checkbox-group label.el-checkbox{align-items:center;display:flex;height:unset;margin-bottom:12px;margin-left:5px;margin-right:5px}.el-table-filter__checkbox-group .el-checkbox:last-child{margin-bottom:0}.security-settings[data-v-3b7344a0]{padding:20px;min-height:500px}.first-settings[data-v-3b7344a0]{margin-bottom:40px}.first-title[data-v-3b7344a0]{display:flex;align-items:center;gap:8px;margin-bottom:20px;padding-bottom:12px;border-bottom:2px solid var(--el-color-primary-light-7)}.second-title[data-v-3b7344a0]{display:flex;align-items:center;gap:8px;text-align:start;margin-left:0;margin-bottom:16px;padding-bottom:8px;border-bottom:1px solid var(--el-border-color-lighter)}.first-settings[data-v-3b7344a0] .el-form{padding:16px 20px;background:var(--el-fill-color-lighter);border-radius:12px;border:1px solid var(--el-border-color-lighter);margin-bottom:20px}.first-settings[data-v-3b7344a0] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.first-settings[data-v-3b7344a0] .el-form-item:last-child{margin-bottom:0}.first-settings[data-v-3b7344a0] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary);width:auto!important}.first-settings[data-v-3b7344a0] .el-form-item__content{width:100%;max-width:400px;margin-left:0!important}.first-settings[data-v-3b7344a0] .el-input,.first-settings[data-v-3b7344a0] .el-select{width:100%}.first-settings[data-v-3b7344a0] .el-switch{--el-switch-on-color:var(--el-color-primary)}.actions[data-v-3b7344a0]{margin-top:20px;display:flex;justify-content:flex-end;gap:12px}.actions[data-v-3b7344a0] .el-button{border-radius:8px;padding:10px 20px}.token-title[data-v-3b7344a0]{display:flex;align-items:center;justify-content:space-between}.token-actions[data-v-3b7344a0]{margin-left:5px}.token-table-container[data-v-3b7344a0]{display:flex;justify-content:center;margin-top:20px;width:100%;overflow:hidden}.token-table[data-v-3b7344a0]{width:100%;border-radius:12px!important;overflow:hidden;box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.token-table[data-v-3b7344a0] .el-table__header-wrapper{border-radius:12px 12px 0 0}.token-table[data-v-3b7344a0] .el-table__body-wrapper{border-radius:0 0 12px 12px}.token-table[data-v-3b7344a0] .el-table{border-radius:12px}.token-table[data-v-3b7344a0] .el-table__header{background-color:#f8f9fa}.token-table[data-v-3b7344a0] .el-table th{background-color:#f8f9fa!important;border-bottom:1px solid #ebeef5;text-align:center}.token-table[data-v-3b7344a0] .el-table td{border-bottom:1px solid #ebeef5}.token-table[data-v-3b7344a0] .el-table__row:last-child td{border-bottom:none}.table-cell-content[data-v-3b7344a0]{display:flex;justify-content:center;align-items:center;flex-wrap:wrap;gap:4px;padding:8px 4px;min-height:40px}.action-buttons[data-v-3b7344a0]{gap:8px}.action-button[data-v-3b7344a0]{margin-left:0}.permission-tag[data-v-3b7344a0]{margin:2px!important}.token-display[data-v-3b7344a0]{font-family:Courier New,monospace;background-color:var(--text-bg-color);padding:4px 8px;border-radius:6px;font-size:12px;word-break:break-all;text-align:center;max-width:100%;overflow:hidden;text-overflow:ellipsis}@media (max-width:768px){.security-settings[data-v-3b7344a0]{padding:15px}.first-settings[data-v-3b7344a0] .el-form{padding:12px 15px}.first-settings[data-v-3b7344a0] .el-form-item__content{max-width:100%}.token-table-container[data-v-3b7344a0]{padding:0 10px}.table-cell-content[data-v-3b7344a0]{padding:6px 2px;min-height:36px}.token-display[data-v-3b7344a0]{font-size:11px;padding:3px 6px}}@media (max-width:480px){.token-table-container[data-v-3b7344a0]{padding:0 5px}.table-cell-content[data-v-3b7344a0]{padding:4px 2px;min-height:32px;font-size:12px}.action-buttons .el-button[data-v-3b7344a0]{padding:4px 8px;font-size:12px}.permission-tag[data-v-3b7344a0]{font-size:11px;padding:0 4px;height:20px;line-height:20px}}.token-result[data-v-3b7344a0]{padding:10px 0}.token-result .el-form-item[data-v-3b7344a0]{margin-bottom:20px}.dialog-footer[data-v-3b7344a0]{display:flex;justify-content:flex-end;gap:10px}.fade-slide-enter-active[data-v-3b7344a0],.fade-slide-leave-active[data-v-3b7344a0]{transition:all .3s ease-in-out}.fade-slide-enter-from[data-v-3b7344a0],.fade-slide-leave-to[data-v-3b7344a0]{opacity:0;transform:translateY(-10px)}.fade-slide-enter-to[data-v-3b7344a0],.fade-slide-leave-from[data-v-3b7344a0]{opacity:1;transform:translateY(0)}[data-v-3b7344a0] .el-dialog{border-radius:12px;background-color:var(--dialog-bg-color);backdrop-filter:blur(10px);box-shadow:var(--dialog-box-shadow)}.page-settings[data-v-7b059a1c]{padding:20px;min-height:500px}.first-settings[data-v-7b059a1c]{margin-bottom:40px}.first-title[data-v-7b059a1c]{display:flex;align-items:center;gap:8px;margin-bottom:20px;padding-bottom:12px;border-bottom:2px solid var(--el-color-primary-light-7)}.second-title[data-v-7b059a1c]{display:flex;align-items:center;gap:8px;text-align:start;margin-left:0;margin-bottom:16px;padding-bottom:8px;border-bottom:1px solid var(--el-border-color-lighter)}.first-settings[data-v-7b059a1c] .el-form{padding:16px 20px;background:var(--el-fill-color-lighter);border-radius:12px;border:1px solid var(--el-border-color-lighter)}.first-settings[data-v-7b059a1c] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.first-settings[data-v-7b059a1c] .el-form-item:last-child{margin-bottom:0}.first-settings[data-v-7b059a1c] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary);width:auto!important}.first-settings[data-v-7b059a1c] .el-form-item__content{width:100%;max-width:400px;margin-left:0!important}.first-settings[data-v-7b059a1c] .el-input,.first-settings[data-v-7b059a1c] .el-select{width:100%}.first-settings[data-v-7b059a1c] .el-switch{--el-switch-on-color:var(--el-color-primary)}.actions[data-v-7b059a1c]{margin-top:20px;display:flex;justify-content:flex-end;gap:12px}.actions[data-v-7b059a1c] .el-button{border-radius:8px;padding:10px 20px}@media (max-width:768px){.page-settings[data-v-7b059a1c]{padding:15px}.first-settings[data-v-7b059a1c] .el-form{padding:12px 15px}.first-settings[data-v-7b059a1c] .el-form-item__content{max-width:100%}}.others-settings[data-v-4d2a1bec]{padding:20px;min-height:500px}.first-settings[data-v-4d2a1bec]{margin-bottom:40px}.first-title[data-v-4d2a1bec]{display:flex;align-items:center;gap:8px;margin-bottom:20px;padding-bottom:12px;border-bottom:2px solid var(--el-color-primary-light-7)}.second-title[data-v-4d2a1bec]{display:flex;align-items:center;gap:8px;text-align:start;margin-left:0;margin-bottom:16px;padding-bottom:8px;border-bottom:1px solid var(--el-border-color-lighter)}.first-settings[data-v-4d2a1bec] .el-form{padding:16px 20px;background:var(--el-fill-color-lighter);border-radius:12px;border:1px solid var(--el-border-color-lighter);margin-bottom:20px}.first-settings[data-v-4d2a1bec] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.first-settings[data-v-4d2a1bec] .el-form-item:last-child{margin-bottom:0}.first-settings[data-v-4d2a1bec] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary);width:auto!important}.first-settings[data-v-4d2a1bec] .el-form-item__content{width:100%;max-width:400px;margin-left:0!important}.first-settings[data-v-4d2a1bec] .el-input{width:100%}.first-settings[data-v-4d2a1bec] .el-switch{--el-switch-on-color:var(--el-color-primary)}.actions[data-v-4d2a1bec]{margin-top:20px;display:flex;justify-content:flex-end;gap:12px}.actions[data-v-4d2a1bec] .el-button{border-radius:8px;padding:10px 20px}@media (max-width:768px){.others-settings[data-v-4d2a1bec]{padding:15px}.first-settings[data-v-4d2a1bec] .el-form{padding:12px 15px}.first-settings[data-v-4d2a1bec] .el-form-item__content{max-width:100%}}.container[data-v-c5d2c9c2]{background:var(--admin-container-bg-color);min-height:100vh;font-family:Arial,sans-serif;color:var(--admin-container-color);margin:0;padding:0}.header-content[data-v-c5d2c9c2]{display:flex;justify-content:space-between;align-items:center;padding:10px 24px;background:hsla(0,0%,100%,.72);backdrop-filter:blur(20px) saturate(180%);-webkit-backdrop-filter:blur(20px) saturate(180%);border:1px solid hsla(0,0%,100%,.3);border-top:1px solid hsla(0,0%,100%,.5);box-shadow:0 4px 30px rgba(0,0,0,.1),0 1px 3px rgba(0,0,0,.05),inset 0 1px 0 hsla(0,0%,100%,.4);transition:all .4s cubic-bezier(.4,0,.2,1);border-radius:16px;position:fixed;top:8px;left:50%;transform:translateX(-50%);width:calc(95% - 16px);z-index:2001;min-height:45px}html.dark .header-content[data-v-c5d2c9c2]{background:rgba(30,30,30,.75);border:1px solid hsla(0,0%,100%,.08);border-top:1px solid hsla(0,0%,100%,.12);box-shadow:0 4px 30px rgba(0,0,0,.3),0 1px 3px rgba(0,0,0,.2),inset 0 1px 0 hsla(0,0%,100%,.05)}@media (max-width:768px){.header-content[data-v-c5d2c9c2]{flex-direction:column;top:6px;width:calc(100% - 32px);border-radius:14px;padding:6px 12px;gap:4px}.header-icon[data-v-c5d2c9c2]{font-size:.95em}}.header-content[data-v-c5d2c9c2]:hover{background:hsla(0,0%,100%,.82);box-shadow:0 8px 40px rgba(0,0,0,.12),0 2px 6px rgba(0,0,0,.08),inset 0 1px 0 hsla(0,0%,100%,.5);transform:translateX(-50%) translateY(-1px)}html.dark .header-content[data-v-c5d2c9c2]:hover{background:rgba(35,35,35,.85);box-shadow:0 8px 40px rgba(0,0,0,.4),0 2px 6px rgba(0,0,0,.3),inset 0 1px 0 hsla(0,0%,100%,.08)}.header-icon[data-v-c5d2c9c2]{font-size:1.5em;cursor:pointer;transition:all .3s ease;color:var(--admin-container-color);outline:none}.header-icon[data-v-c5d2c9c2]:hover{color:#b39ddb;transform:scale(1.2)}.header-action[data-v-c5d2c9c2]{display:flex;gap:10px}.main-container[data-v-c5d2c9c2]{margin-top:60px;transition:margin-left .3s ease,width .3s ease;width:calc(100% - 280px);margin-left:170px}.main-container.collapsed[data-v-c5d2c9c2]{width:calc(100% - 150px);margin-left:80px}@media (max-width:768px){.main-container.collapsed[data-v-c5d2c9c2],.main-container[data-v-c5d2c9c2]{width:calc(100% - 80px);margin-left:70px;padding:0 10px}} \ No newline at end of file diff --git a/css/424.0b141552.css.gz b/css/424.0b141552.css.gz deleted file mode 100644 index 77d4ad1f7549822f066fd9a5adaa4b344b44d5f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9825 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 H;rIXmdiv{overflow:hidden;transition:height .35s cubic-bezier(.4,0,.2,1),width .35s cubic-bezier(.4,0,.2,1)}.plyr__menu__container:after{border:4px solid #0000;border-top-color:#ffffffe6;border:var(--plyr-menu-arrow-size,4px) solid #0000;border-top-color:var(--plyr-menu-background,#ffffffe6);content:"";height:0;position:absolute;right:14px;right:calc(var(--plyr-control-icon-size, 18px)/2 + var(--plyr-control-spacing, 10px)*.7 - var(--plyr-menu-arrow-size, 4px)/2);top:100%;width:0}.plyr__menu__container [role=menu]{padding:7px;padding:calc(var(--plyr-control-spacing, 10px)*.7)}.plyr__menu__container [role=menuitem],.plyr__menu__container [role=menuitemradio]{margin-top:2px}.plyr__menu__container [role=menuitem]:first-child,.plyr__menu__container [role=menuitemradio]:first-child{margin-top:0}.plyr__menu__container .plyr__control{align-items:center;color:#4a5464;color:var(--plyr-menu-color,#4a5464);display:flex;font-size:13px;font-size:var(--plyr-font-size-menu,var(--plyr-font-size-small,13px));padding:4.66667px 10.5px;padding:calc(var(--plyr-control-spacing, 10px)*.7/1.5) calc(var(--plyr-control-spacing, 10px)*.7*1.5);-webkit-user-select:none;user-select:none;width:100%}.plyr__menu__container .plyr__control>span{align-items:inherit;display:flex;width:100%}.plyr__menu__container .plyr__control:after{border:4px solid #0000;border:var(--plyr-menu-item-arrow-size,4px) solid #0000;content:"";position:absolute;top:50%;transform:translateY(-50%)}.plyr__menu__container .plyr__control--forward{padding-right:28px;padding-right:calc(var(--plyr-control-spacing, 10px)*.7*4)}.plyr__menu__container .plyr__control--forward:after{border-left-color:#728197;border-left-color:var(--plyr-menu-arrow-color,#728197);right:6.5px;right:calc(var(--plyr-control-spacing, 10px)*.7*1.5 - var(--plyr-menu-item-arrow-size, 4px))}.plyr__menu__container .plyr__control--forward:focus-visible:after,.plyr__menu__container .plyr__control--forward:hover:after{border-left-color:initial}.plyr__menu__container .plyr__control--back{font-weight:400;font-weight:var(--plyr-font-weight-regular,400);margin:7px;margin:calc(var(--plyr-control-spacing, 10px)*.7);margin-bottom:3.5px;margin-bottom:calc(var(--plyr-control-spacing, 10px)*.7/2);padding-left:28px;padding-left:calc(var(--plyr-control-spacing, 10px)*.7*4);position:relative;width:calc(100% - 14px);width:calc(100% - var(--plyr-control-spacing, 10px)*.7*2)}.plyr__menu__container .plyr__control--back:after{border-right-color:#728197;border-right-color:var(--plyr-menu-arrow-color,#728197);left:6.5px;left:calc(var(--plyr-control-spacing, 10px)*.7*1.5 - var(--plyr-menu-item-arrow-size, 4px))}.plyr__menu__container .plyr__control--back:before{background:#dcdfe5;background:var(--plyr-menu-back-border-color,#dcdfe5);box-shadow:0 1px 0 #fff;box-shadow:0 1px 0 var(--plyr-menu-back-border-shadow-color,#fff);content:"";height:1px;left:0;margin-top:3.5px;margin-top:calc(var(--plyr-control-spacing, 10px)*.7/2);overflow:hidden;position:absolute;right:0;top:100%}.plyr__menu__container .plyr__control--back:focus-visible:after,.plyr__menu__container .plyr__control--back:hover:after{border-right-color:initial}.plyr__menu__container .plyr__control[role=menuitemradio]{padding-left:7px;padding-left:calc(var(--plyr-control-spacing, 10px)*.7)}.plyr__menu__container .plyr__control[role=menuitemradio]:after,.plyr__menu__container .plyr__control[role=menuitemradio]:before{border-radius:100%}.plyr__menu__container .plyr__control[role=menuitemradio]:before{background:#0000001a;content:"";display:block;flex-shrink:0;height:16px;margin-right:10px;margin-right:var(--plyr-control-spacing,10px);transition:all .3s ease;width:16px}.plyr__menu__container .plyr__control[role=menuitemradio]:after{background:#fff;border:0;height:6px;left:12px;opacity:0;top:50%;transform:translateY(-50%) scale(0);transition:transform .3s ease,opacity .3s ease;width:6px}.plyr__menu__container .plyr__control[role=menuitemradio][aria-checked=true]:before{background:#00b2ff;background:var(--plyr-control-toggle-checked-background,var(--plyr-color-main,var(--plyr-color-main,#00b2ff)))}.plyr__menu__container .plyr__control[role=menuitemradio][aria-checked=true]:after{opacity:1;transform:translateY(-50%) scale(1)}.plyr__menu__container .plyr__control[role=menuitemradio]:focus-visible:before,.plyr__menu__container .plyr__control[role=menuitemradio]:hover:before{background:#23282f1a}.plyr__menu__container .plyr__menu__value{align-items:center;display:flex;margin-left:auto;margin-right:-5px;margin-right:calc(var(--plyr-control-spacing, 10px)*.7*-1 + 2px);overflow:hidden;padding-left:24.5px;padding-left:calc(var(--plyr-control-spacing, 10px)*.7*3.5);pointer-events:none}.plyr--full-ui input[type=range]{appearance:none;background:#0000;border:0;border-radius:26px;border-radius:calc(var(--plyr-range-thumb-height, 13px)*2);color:#00b2ff;color:var(--plyr-range-fill-background,var(--plyr-color-main,var(--plyr-color-main,#00b2ff)));display:block;height:19px;height:calc(var(--plyr-range-thumb-active-shadow-width, 3px)*2 + var(--plyr-range-thumb-height, 13px));margin:0;min-width:0;padding:0;transition:box-shadow .3s ease;width:100%}.plyr--full-ui input[type=range]::-webkit-slider-runnable-track{background:#0000;background-image:linear-gradient(90deg,currentColor,#0000 0);background-image:linear-gradient(to right,currentColor var(--value,0),#0000 var(--value,0));border:0;border-radius:2.5px;border-radius:calc(var(--plyr-range-track-height, 5px)/2);height:5px;height:var(--plyr-range-track-height,5px);-webkit-transition:box-shadow .3s ease;transition:box-shadow .3s ease;-webkit-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-webkit-slider-thumb{appearance:none;background:#fff;background:var(--plyr-range-thumb-background,#fff);border:0;border-radius:100%;box-shadow:0 1px 1px #23282f26,0 0 0 1px #23282f33;box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px #23282f26,0 0 0 1px #23282f33);height:13px;height:var(--plyr-range-thumb-height,13px);margin-top:-4px;margin-top:calc((var(--plyr-range-thumb-height, 13px) - var(--plyr-range-track-height, 5px))/2*-1);position:relative;-webkit-transition:all .2s ease;transition:all .2s ease;width:13px;width:var(--plyr-range-thumb-height,13px)}.plyr--full-ui input[type=range]::-moz-range-track{background:#0000;border:0;border-radius:2.5px;border-radius:calc(var(--plyr-range-track-height, 5px)/2);height:5px;height:var(--plyr-range-track-height,5px);-moz-transition:box-shadow .3s ease;transition:box-shadow .3s ease;user-select:none}.plyr--full-ui input[type=range]::-moz-range-thumb{background:#fff;background:var(--plyr-range-thumb-background,#fff);border:0;border-radius:100%;box-shadow:0 1px 1px #23282f26,0 0 0 1px #23282f33;box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px #23282f26,0 0 0 1px #23282f33);height:13px;height:var(--plyr-range-thumb-height,13px);position:relative;-moz-transition:all .2s ease;transition:all .2s ease;width:13px;width:var(--plyr-range-thumb-height,13px)}.plyr--full-ui input[type=range]::-moz-range-progress{background:currentColor;border-radius:2.5px;border-radius:calc(var(--plyr-range-track-height, 5px)/2);height:5px;height:var(--plyr-range-track-height,5px)}.plyr--full-ui input[type=range]::-ms-track{color:#0000}.plyr--full-ui input[type=range]::-ms-fill-upper,.plyr--full-ui input[type=range]::-ms-track{background:#0000;border:0;border-radius:2.5px;border-radius:calc(var(--plyr-range-track-height, 5px)/2);height:5px;height:var(--plyr-range-track-height,5px);-ms-transition:box-shadow .3s ease;transition:box-shadow .3s ease;user-select:none}.plyr--full-ui input[type=range]::-ms-fill-lower{background:#0000;background:currentColor;border:0;border-radius:2.5px;border-radius:calc(var(--plyr-range-track-height, 5px)/2);height:5px;height:var(--plyr-range-track-height,5px);-ms-transition:box-shadow .3s ease;transition:box-shadow .3s ease;user-select:none}.plyr--full-ui input[type=range]::-ms-thumb{background:#fff;background:var(--plyr-range-thumb-background,#fff);border:0;border-radius:100%;box-shadow:0 1px 1px #23282f26,0 0 0 1px #23282f33;box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px #23282f26,0 0 0 1px #23282f33);height:13px;height:var(--plyr-range-thumb-height,13px);margin-top:0;position:relative;-ms-transition:all .2s ease;transition:all .2s ease;width:13px;width:var(--plyr-range-thumb-height,13px)}.plyr--full-ui input[type=range]::-ms-tooltip{display:none}.plyr--full-ui input[type=range]::-moz-focus-outer{border:0}.plyr--full-ui input[type=range]:focus{outline:0}.plyr--full-ui input[type=range]:focus-visible::-webkit-slider-runnable-track{outline:2px dashed #00b2ff;outline:2px dashed var(--plyr-focus-visible-color,var(--plyr-color-main,var(--plyr-color-main,#00b2ff)));outline-offset:2px}.plyr--full-ui input[type=range]:focus-visible::-moz-range-track{outline:2px dashed #00b2ff;outline:2px dashed var(--plyr-focus-visible-color,var(--plyr-color-main,var(--plyr-color-main,#00b2ff)));outline-offset:2px}.plyr--full-ui input[type=range]:focus-visible::-ms-track{outline:2px dashed #00b2ff;outline:2px dashed var(--plyr-focus-visible-color,var(--plyr-color-main,var(--plyr-color-main,#00b2ff)));outline-offset:2px}.plyr__poster{background-color:#000;background-color:var(--plyr-video-background,var(--plyr-video-background,#000));background-position:50% 50%;background-repeat:no-repeat;background-size:contain;height:100%;left:0;opacity:0;position:absolute;top:0;transition:opacity .2s ease;width:100%;z-index:1}.plyr--stopped.plyr__poster-enabled .plyr__poster{opacity:1}.plyr--youtube.plyr--paused.plyr__poster-enabled:not(.plyr--stopped) .plyr__poster{display:none}.plyr__time{font-size:13px;font-size:var(--plyr-font-size-time,var(--plyr-font-size-small,13px))}.plyr__time+.plyr__time:before{content:"⁄";margin-right:10px;margin-right:var(--plyr-control-spacing,10px)}@media (max-width:767px){.plyr__time+.plyr__time{display:none}}.plyr__tooltip{background:#fff;background:var(--plyr-tooltip-background,#fff);border-radius:5px;border-radius:var(--plyr-tooltip-radius,5px);bottom:100%;box-shadow:0 1px 2px #00000026;box-shadow:var(--plyr-tooltip-shadow,0 1px 2px #00000026);color:#4a5464;color:var(--plyr-tooltip-color,#4a5464);font-size:13px;font-size:var(--plyr-font-size-small,13px);font-weight:400;font-weight:var(--plyr-font-weight-regular,400);left:50%;line-height:1.3;margin-bottom:10px;margin-bottom:calc(var(--plyr-control-spacing, 10px)/2*2);opacity:0;padding:5px 7.5px;padding:calc(var(--plyr-control-spacing, 10px)/2) calc(var(--plyr-control-spacing, 10px)/2*1.5);pointer-events:none;position:absolute;transform:translate(-50%,10px) scale(.8);transform-origin:50% 100%;transition:transform .2s ease .1s,opacity .2s ease .1s;white-space:nowrap;z-index:2}.plyr__tooltip:before{border-left:4px solid #0000;border-left:var(--plyr-tooltip-arrow-size,4px) solid #0000;border-right:4px solid #0000;border-right:var(--plyr-tooltip-arrow-size,4px) solid #0000;border-top:4px solid #fff;border-top:var(--plyr-tooltip-arrow-size,4px) solid var(--plyr-tooltip-background,#fff);bottom:-4px;bottom:calc(var(--plyr-tooltip-arrow-size, 4px)*-1);content:"";height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;z-index:2}.plyr .plyr__control:focus-visible .plyr__tooltip,.plyr .plyr__control:hover .plyr__tooltip,.plyr__tooltip--visible{opacity:1;transform:translate(-50%) scale(1)}.plyr .plyr__control:hover .plyr__tooltip{z-index:3}.plyr__controls>.plyr__control:first-child .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip{left:0;transform:translateY(10px) scale(.8);transform-origin:0 100%}.plyr__controls>.plyr__control:first-child .plyr__tooltip:before,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip:before{left:16px;left:calc(var(--plyr-control-icon-size, 18px)/2 + var(--plyr-control-spacing, 10px)*.7)}.plyr__controls>.plyr__control:last-child .plyr__tooltip{left:auto;right:0;transform:translateY(10px) scale(.8);transform-origin:100% 100%}.plyr__controls>.plyr__control:last-child .plyr__tooltip:before{left:auto;right:16px;right:calc(var(--plyr-control-icon-size, 18px)/2 + var(--plyr-control-spacing, 10px)*.7);transform:translateX(50%)}.plyr__controls>.plyr__control:first-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control:focus-visible .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control:hover .plyr__tooltip,.plyr__controls>.plyr__control:first-child:focus-visible .plyr__tooltip,.plyr__controls>.plyr__control:first-child:hover .plyr__tooltip,.plyr__controls>.plyr__control:last-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:last-child:focus-visible .plyr__tooltip,.plyr__controls>.plyr__control:last-child:hover .plyr__tooltip{transform:translate(0) scale(1)}.plyr__progress{left:6.5px;left:calc(var(--plyr-range-thumb-height, 13px)*.5);margin-right:13px;margin-right:var(--plyr-range-thumb-height,13px);position:relative}.plyr__progress input[type=range],.plyr__progress__buffer{margin-left:-6.5px;margin-left:calc(var(--plyr-range-thumb-height, 13px)*-.5);margin-right:-6.5px;margin-right:calc(var(--plyr-range-thumb-height, 13px)*-.5);width:calc(100% + 13px);width:calc(100% + var(--plyr-range-thumb-height, 13px))}.plyr__progress input[type=range]{position:relative;z-index:2}.plyr__progress .plyr__tooltip{left:0;max-width:120px;overflow-wrap:break-word}.plyr__progress__buffer{-webkit-appearance:none;background:#0000;border:0;border-radius:100px;height:5px;height:var(--plyr-range-track-height,5px);left:0;margin-top:-2.5px;margin-top:calc(var(--plyr-range-track-height, 5px)/2*-1);padding:0;position:absolute;top:50%}.plyr__progress__buffer::-webkit-progress-bar{background:#0000}.plyr__progress__buffer::-webkit-progress-value{background:currentColor;border-radius:100px;min-width:5px;min-width:var(--plyr-range-track-height,5px);-webkit-transition:width .2s ease;transition:width .2s ease}.plyr__progress__buffer::-moz-progress-bar{background:currentColor;border-radius:100px;min-width:5px;min-width:var(--plyr-range-track-height,5px);-moz-transition:width .2s ease;transition:width .2s ease}.plyr__progress__buffer::-ms-fill{border-radius:100px;-ms-transition:width .2s ease;transition:width .2s ease}.plyr--loading .plyr__progress__buffer{animation:plyr-progress 1s linear infinite;background-image:linear-gradient(-45deg,#23282f99 25%,#0000 0,#0000 50%,#23282f99 0,#23282f99 75%,#0000 0,#0000);background-image:linear-gradient(-45deg,var(--plyr-progress-loading-background,#23282f99) 25%,#0000 25%,#0000 50%,var(--plyr-progress-loading-background,#23282f99) 50%,var(--plyr-progress-loading-background,#23282f99) 75%,#0000 75%,#0000);background-repeat:repeat-x;background-size:25px 25px;background-size:var(--plyr-progress-loading-size,25px) var(--plyr-progress-loading-size,25px);color:#0000}.plyr--video.plyr--loading .plyr__progress__buffer{background-color:#ffffff40;background-color:var(--plyr-video-progress-buffered-background,#ffffff40)}.plyr--audio.plyr--loading .plyr__progress__buffer{background-color:#c1c8d199;background-color:var(--plyr-audio-progress-buffered-background,#c1c8d199)}.plyr__progress__marker{background-color:#fff;background-color:var(--plyr-progress-marker-background,#fff);border-radius:1px;height:5px;height:var(--plyr-range-track-height,5px);position:absolute;top:50%;transform:translate(-50%,-50%);width:3px;width:var(--plyr-progress-marker-width,3px);z-index:3}.plyr__volume{align-items:center;display:flex;position:relative}.plyr__volume input[type=range]{margin-left:5px;margin-left:calc(var(--plyr-control-spacing, 10px)/2);margin-right:5px;margin-right:calc(var(--plyr-control-spacing, 10px)/2);max-width:90px;min-width:60px;position:relative;z-index:2}.plyr--audio{display:block}.plyr--audio .plyr__controls{background:#fff;background:var(--plyr-audio-controls-background,#fff);border-radius:inherit;color:#4a5464;color:var(--plyr-audio-control-color,#4a5464);padding:10px;padding:var(--plyr-control-spacing,10px)}.plyr--audio .plyr__control:focus-visible,.plyr--audio .plyr__control:hover,.plyr--audio .plyr__control[aria-expanded=true]{background:#00b2ff;background:var(--plyr-audio-control-background-hover,var(--plyr-color-main,var(--plyr-color-main,#00b2ff)));color:#fff;color:var(--plyr-audio-control-color-hover,#fff)}.plyr--full-ui.plyr--audio input[type=range]::-webkit-slider-runnable-track{background-color:#c1c8d199;background-color:var(--plyr-audio-range-track-background,var(--plyr-audio-progress-buffered-background,#c1c8d199))}.plyr--full-ui.plyr--audio input[type=range]::-moz-range-track{background-color:#c1c8d199;background-color:var(--plyr-audio-range-track-background,var(--plyr-audio-progress-buffered-background,#c1c8d199))}.plyr--full-ui.plyr--audio input[type=range]::-ms-track{background-color:#c1c8d199;background-color:var(--plyr-audio-range-track-background,var(--plyr-audio-progress-buffered-background,#c1c8d199))}.plyr--full-ui.plyr--audio input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px #23282f26,0 0 0 1px #23282f33,0 0 0 3px #23282f1a;box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px #23282f26,0 0 0 1px #23282f33),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,#23282f1a)}.plyr--full-ui.plyr--audio input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px #23282f26,0 0 0 1px #23282f33,0 0 0 3px #23282f1a;box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px #23282f26,0 0 0 1px #23282f33),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,#23282f1a)}.plyr--full-ui.plyr--audio input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px #23282f26,0 0 0 1px #23282f33,0 0 0 3px #23282f1a;box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px #23282f26,0 0 0 1px #23282f33),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,#23282f1a)}.plyr--audio .plyr__progress__buffer{color:#c1c8d199;color:var(--plyr-audio-progress-buffered-background,#c1c8d199)}.plyr--video{overflow:hidden}.plyr--video.plyr--menu-open{overflow:visible}.plyr__video-wrapper{background:#000;background:var(--plyr-video-background,var(--plyr-video-background,#000));border-radius:inherit;height:100%;margin:auto;overflow:hidden;position:relative;width:100%}.plyr__video-embed,.plyr__video-wrapper--fixed-ratio{aspect-ratio:16/9}@supports not (aspect-ratio:16/9){.plyr__video-embed,.plyr__video-wrapper--fixed-ratio{height:0;padding-bottom:56.25%;position:relative}}.plyr__video-embed iframe,.plyr__video-wrapper--fixed-ratio video{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.plyr--full-ui .plyr__video-embed>.plyr__video-embed__container{padding-bottom:240%;position:relative;transform:translateY(-38.28125%)}.plyr--video .plyr__controls{background:linear-gradient(#0000,#000000bf);background:var(--plyr-video-controls-background,linear-gradient(#0000,#000000bf));border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;bottom:0;color:#fff;color:var(--plyr-video-control-color,#fff);left:0;padding:5px;padding:calc(var(--plyr-control-spacing, 10px)/2);padding-top:20px;padding-top:calc(var(--plyr-control-spacing, 10px)*2);position:absolute;right:0;transition:opacity .4s ease-in-out,transform .4s ease-in-out;z-index:3}@media (min-width:480px){.plyr--video .plyr__controls{padding:10px;padding:var(--plyr-control-spacing,10px);padding-top:35px;padding-top:calc(var(--plyr-control-spacing, 10px)*3.5)}}.plyr--video.plyr--hide-controls .plyr__controls{opacity:0;pointer-events:none;transform:translateY(100%)}.plyr--video .plyr__control:focus-visible,.plyr--video .plyr__control:hover,.plyr--video .plyr__control[aria-expanded=true]{background:#00b2ff;background:var(--plyr-video-control-background-hover,var(--plyr-color-main,var(--plyr-color-main,#00b2ff)));color:#fff;color:var(--plyr-video-control-color-hover,#fff)}.plyr__control--overlaid{background:#00b2ff;background:var(--plyr-video-control-background-hover,var(--plyr-color-main,var(--plyr-color-main,#00b2ff)));border:0;border-radius:100%;color:#fff;color:var(--plyr-video-control-color,#fff);display:none;left:50%;opacity:.9;padding:15px;padding:calc(var(--plyr-control-spacing, 10px)*1.5);position:absolute;top:50%;transform:translate(-50%,-50%);transition:.3s;z-index:2}.plyr__control--overlaid svg{left:2px;position:relative}.plyr__control--overlaid:focus,.plyr__control--overlaid:hover{opacity:1}.plyr--playing .plyr__control--overlaid{opacity:0;visibility:hidden}.plyr--full-ui.plyr--video .plyr__control--overlaid{display:block}.plyr--full-ui.plyr--video input[type=range]::-webkit-slider-runnable-track{background-color:#ffffff40;background-color:var(--plyr-video-range-track-background,var(--plyr-video-progress-buffered-background,#ffffff40))}.plyr--full-ui.plyr--video input[type=range]::-moz-range-track{background-color:#ffffff40;background-color:var(--plyr-video-range-track-background,var(--plyr-video-progress-buffered-background,#ffffff40))}.plyr--full-ui.plyr--video input[type=range]::-ms-track{background-color:#ffffff40;background-color:var(--plyr-video-range-track-background,var(--plyr-video-progress-buffered-background,#ffffff40))}.plyr--full-ui.plyr--video input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px #23282f26,0 0 0 1px #23282f33,0 0 0 3px #ffffff80;box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px #23282f26,0 0 0 1px #23282f33),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,#ffffff80)}.plyr--full-ui.plyr--video input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px #23282f26,0 0 0 1px #23282f33,0 0 0 3px #ffffff80;box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px #23282f26,0 0 0 1px #23282f33),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,#ffffff80)}.plyr--full-ui.plyr--video input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px #23282f26,0 0 0 1px #23282f33,0 0 0 3px #ffffff80;box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px #23282f26,0 0 0 1px #23282f33),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,#ffffff80)}.plyr--video .plyr__progress__buffer{color:#ffffff40;color:var(--plyr-video-progress-buffered-background,#ffffff40)}.plyr:fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:fullscreen video{height:100%}.plyr:fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:fullscreen .plyr__captions{font-size:21px;font-size:var(--plyr-font-size-xlarge,21px)}}.plyr--fullscreen-fallback{background:#000;border-radius:0!important;height:100%;inset:0;margin:0;position:fixed;width:100%;z-index:10000000}.plyr--fullscreen-fallback video{height:100%}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen{display:block}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr--fullscreen-fallback.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr--fullscreen-fallback .plyr__captions{font-size:21px;font-size:var(--plyr-font-size-xlarge,21px)}}.plyr__ads{border-radius:inherit;cursor:pointer;inset:0;overflow:hidden;position:absolute;z-index:-1}.plyr__ads>div,.plyr__ads>div iframe{height:100%;position:absolute;width:100%}.plyr__ads:after{background:#23282f;border-radius:2px;bottom:10px;bottom:var(--plyr-control-spacing,10px);color:#fff;content:attr(data-badge-text);font-size:11px;padding:2px 6px;pointer-events:none;position:absolute;right:10px;right:var(--plyr-control-spacing,10px);z-index:3}.plyr__ads:empty:after{display:none}.plyr__cues{background:currentColor;display:block;height:5px;height:var(--plyr-range-track-height,5px);left:0;opacity:.8;position:absolute;top:50%;transform:translateY(-50%);width:3px;z-index:3}.plyr__preview-thumb{background-color:#fff;background-color:var(--plyr-tooltip-background,#fff);border-radius:8px;border-radius:var(--plyr-menu-radius,8px);bottom:100%;box-shadow:0 1px 2px #00000026;box-shadow:var(--plyr-tooltip-shadow,0 1px 2px #00000026);margin-bottom:10px;margin-bottom:calc(var(--plyr-control-spacing, 10px)/2*2);opacity:0;padding:3px;pointer-events:none;position:absolute;transform:translateY(10px) scale(.8);transform-origin:50% 100%;transition:transform .2s ease .1s,opacity .2s ease .1s;z-index:2}.plyr__preview-thumb--is-shown{opacity:1;transform:translate(0) scale(1)}.plyr__preview-thumb:before{border-left:4px solid #0000;border-left:var(--plyr-tooltip-arrow-size,4px) solid #0000;border-right:4px solid #0000;border-right:var(--plyr-tooltip-arrow-size,4px) solid #0000;border-top:4px solid #fff;border-top:var(--plyr-tooltip-arrow-size,4px) solid var(--plyr-tooltip-background,#fff);bottom:-4px;bottom:calc(var(--plyr-tooltip-arrow-size, 4px)*-1);content:"";height:0;left:calc(50% + var(--preview-arrow-offset));position:absolute;transform:translateX(-50%);width:0;z-index:2}.plyr__preview-thumb__image-container{background:#c1c8d1;border-radius:7px;border-radius:calc(var(--plyr-menu-radius, 8px) - 1px);overflow:hidden;position:relative;z-index:0}.plyr__preview-thumb__image-container img,.plyr__preview-thumb__image-container:after{height:100%;left:0;position:absolute;top:0;width:100%}.plyr__preview-thumb__image-container:after{border-radius:inherit;box-shadow:inset 0 0 0 1px #00000026;content:"";pointer-events:none}.plyr__preview-thumb__image-container img{max-height:none;max-width:none}.plyr__preview-thumb__time-container{background:linear-gradient(#0000,#000000bf);background:var(--plyr-video-controls-background,linear-gradient(#0000,#000000bf));border-bottom-left-radius:7px;border-bottom-left-radius:calc(var(--plyr-menu-radius, 8px) - 1px);border-bottom-right-radius:7px;border-bottom-right-radius:calc(var(--plyr-menu-radius, 8px) - 1px);bottom:0;left:0;line-height:1.1;padding:20px 6px 6px;position:absolute;right:0;z-index:3}.plyr__preview-thumb__time-container span{color:#fff;font-size:13px;font-size:var(--plyr-font-size-time,var(--plyr-font-size-small,13px))}.plyr__preview-scrubbing{filter:blur(1px);height:100%;inset:0;margin:auto;opacity:0;overflow:hidden;pointer-events:none;position:absolute;transition:opacity .3s ease;width:100%;z-index:1}.plyr__preview-scrubbing--is-shown{opacity:1}.plyr__preview-scrubbing img{height:100%;left:0;max-height:none;max-width:none;object-fit:contain;position:absolute;top:0;width:100%}.plyr--no-transition{transition:none!important}.plyr__sr-only{clip:rect(1px,1px,1px,1px);border:0!important;height:1px!important;overflow:hidden;padding:0!important;position:absolute!important;width:1px!important}.plyr [hidden]{display:none!important}.tm-viewport[data-v-6479d338]{width:100%;height:100%;display:flex;align-items:center;justify-content:center;touch-action:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.tm-media[data-v-6479d338]{max-width:100%;max-height:100%;-o-object-fit:contain;object-fit:contain;-webkit-user-drag:none}.tm-video-wrap[data-v-6479d338]{width:100%;max-width:800px;touch-action:auto}.plyr-video[data-v-6479d338]{width:100%}.tm-audio-wrap[data-v-6479d338]{display:flex;flex-direction:column;align-items:center;gap:20px;padding:24px;width:100%;max-width:400px;touch-action:auto}.plyr-audio[data-v-6479d338]{width:100%}.audio-cover[data-v-6479d338]{width:200px;height:200px;border-radius:12px;overflow:hidden;background:hsla(0,0%,100%,.1);display:flex;align-items:center;justify-content:center;box-shadow:0 8px 32px rgba(0,0,0,.3)}.cover-img[data-v-6479d338]{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.audio-icon-large[data-v-6479d338]{width:80px;height:80px;color:hsla(0,0%,100%,.4)}.audio-info[data-v-6479d338]{text-align:center;width:100%}.audio-title[data-v-6479d338]{font-size:18px;font-weight:600;color:#fff;margin-bottom:4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio-artist[data-v-6479d338]{font-size:14px;color:hsla(0,0%,100%,.6)}.audio-placeholder[data-v-6479d338],.video-placeholder[data-v-6479d338]{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:16px;color:hsla(0,0%,100%,.4)}.video-placeholder svg[data-v-6479d338]{width:80px;height:80px}.audio-placeholder .audio-name[data-v-6479d338]{font-size:14px;color:hsla(0,0%,100%,.6);text-align:center;max-width:280px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.plyr{--plyr-color-main:#3b82f6}.plyr--audio .plyr__controls{background:hsla(0,0%,100%,.1);border-radius:8px}.plyr-custom-menu{position:relative;display:flex;align-items:center}.plyr-menu-btn{background:none;border:none;cursor:pointer;padding:8px;color:inherit;display:flex;align-items:center;justify-content:center}.plyr-menu-btn:hover{opacity:.8}.plyr-menu-dropdown{position:absolute;bottom:100%;right:0;background:#fff;border-radius:8px;box-shadow:0 4px 20px rgba(0,0,0,.3);min-width:160px;display:none;z-index:100;overflow:hidden;margin-bottom:8px}.plyr-menu-dropdown.show{display:block}.plyr-menu-item{display:flex;align-items:center;gap:12px;padding:12px 16px;cursor:pointer;color:#333;font-size:14px;transition:background .15s}.plyr-menu-item:hover{background:#f5f5f5}.plyr-menu-item svg{flex-shrink:0}.plyr-menu-item .arrow{margin-left:auto}.plyr-playmode-submenu,.plyr-speed-submenu{display:none;border-top:1px solid #eee}.plyr-playmode-submenu.show,.plyr-speed-submenu.show{display:block}.plyr-playmode-option,.plyr-speed-option{padding-left:32px;position:relative}.plyr-playmode-option.active,.plyr-speed-option.active{color:#3b82f6;font-weight:600}.plyr-playmode-option.active:before,.plyr-speed-option.active:before{content:"✓";position:absolute;left:12px}@media (max-width:768px),(pointer:coarse){.plyr--audio .plyr__volume{position:relative}.plyr--audio .plyr__volume input[type=range]{position:absolute;bottom:100%;left:50%;transform:translateX(-50%) rotate(-90deg);transform-origin:center center;width:80px;margin-bottom:40px;display:none}.plyr--audio .plyr__volume:focus-within input[type=range],.plyr--audio .plyr__volume:hover input[type=range]{display:block}.plyr--audio .plyr__volume:before{content:"";position:absolute;bottom:100%;left:50%;transform:translateX(-50%);width:36px;height:100px;background:rgba(0,0,0,.8);border-radius:8px;display:none;margin-bottom:8px}.plyr--audio .plyr__volume:focus-within:before,.plyr--audio .plyr__volume:hover:before{display:block}}#themeToggle[data-v-466b2b5c]{border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem}@media (max-width:768px){#themeToggle[data-v-466b2b5c]{width:2rem;height:2rem}}.theme_toggle_circle1[data-v-466b2b5c]{transition:cx .5s ease-in-out,cy .5s ease-in-out,r .5s ease-in-out}.theme_toggle_circle2[data-v-466b2b5c]{transition:all .5s ease-in-out;fill:var(--theme-toggle-bg-color)}.theme_toggle_svg[data-v-466b2b5c]{transition:transform .5s cubic-bezier(.68,-.55,.27,1.55);color:var(--theme-toggle-color)}.dark.theme_toggle_svg[data-v-466b2b5c]{transform:rotate(40deg)}.theme_toggle_g[data-v-466b2b5c]{transition:opacity .5s ease-in-out}.icon-fade-enter-active[data-v-466b2b5c],.icon-fade-leave-active[data-v-466b2b5c]{transition:opacity .3s ease-in-out,transform .3s ease-in-out}.icon-fade-enter-from[data-v-466b2b5c]{opacity:0;transform:scale(.8) rotate(-90deg)}.icon-fade-leave-to[data-v-466b2b5c]{opacity:0;transform:scale(.8) rotate(90deg)}.icon-fade-enter-to[data-v-466b2b5c],.icon-fade-leave-from[data-v-466b2b5c]{opacity:1;transform:scale(1) rotate(0deg)}.auto-icon[data-v-466b2b5c]{display:inline-block}.public-browse[data-v-54efcccb]{min-height:100vh;background:#0a0a0a;color:#fff}.header[data-v-54efcccb]{position:sticky;top:0;z-index:100;display:flex;align-items:center;justify-content:space-between;padding:16px 24px;background:hsla(0,0%,6%,.95);backdrop-filter:blur(10px);border-bottom:1px solid #1a1a1a;position:relative}.header-left[data-v-54efcccb]{flex:0 0 auto;z-index:1;display:flex;align-items:center;gap:8px}.theme-toggle-btn[data-v-54efcccb]{background:transparent;border-radius:8px;transition:background .2s}.theme-toggle-btn[data-v-54efcccb]:hover{background:hsla(0,0%,100%,.1)}.header-right[data-v-54efcccb]{flex:0 0 auto;z-index:1;display:flex;align-items:center;gap:12px}.header-center[data-v-54efcccb]{position:absolute;left:50%;transform:translateX(-50%);z-index:0}.logo[data-v-54efcccb]{font-size:20px;font-weight:600;color:#fff;text-decoration:none;cursor:pointer;transition:opacity .2s}.logo[data-v-54efcccb]:hover{opacity:.8}.breadcrumb[data-v-54efcccb]{display:flex;align-items:center;gap:4px;font-size:14px}.breadcrumb-item[data-v-54efcccb]{padding:6px 12px;border-radius:6px;cursor:pointer;transition:background .2s;color:#ccc}.breadcrumb-item[data-v-54efcccb]:hover{background:#252525;color:#fff}.breadcrumb-sep[data-v-54efcccb]{color:#444}.file-count[data-v-54efcccb]{color:#666;font-size:14px}.error-container[data-v-54efcccb],.loading-container[data-v-54efcccb]{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:60vh;color:#666}.error-credit[data-v-54efcccb]{margin-top:40px;text-align:center;color:hsla(0,0%,100%,.4);font-size:14px}.error-credit p[data-v-54efcccb]{margin-bottom:12px}.error-credit-links[data-v-54efcccb]{display:flex;gap:24px;justify-content:center}.error-credit-links a[data-v-54efcccb]{display:flex;align-items:center;gap:6px;color:hsla(0,0%,100%,.5);text-decoration:none;transition:color .2s}.error-credit-links a[data-v-54efcccb]:hover{color:#3b82f6}.loading-spinner[data-v-54efcccb]{width:48px;height:48px;border:3px solid #222;border-top-color:#3b82f6;border-radius:50%;animation:spin-54efcccb 1s linear infinite}.loading-spinner-small[data-v-54efcccb]{width:24px;height:24px;border:2px solid #222;border-top-color:#3b82f6;border-radius:50%;animation:spin-54efcccb 1s linear infinite}@keyframes spin-54efcccb{to{transform:rotate(1turn)}}.retry-btn[data-v-54efcccb]{margin-top:20px;padding:10px 32px;background:#3b82f6;border:none;border-radius:8px;color:#fff;font-size:14px;cursor:pointer;transition:background .2s}.retry-btn[data-v-54efcccb]:hover{background:#2563eb}.gallery-container[data-v-54efcccb]{padding:8px}@media (min-width:1200px){.gallery-container[data-v-54efcccb]{max-width:1400px;margin:0 auto;padding:24px}}.folders-section[data-v-54efcccb]{margin-bottom:24px}.folders-grid[data-v-54efcccb]{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:16px}.folder-card[data-v-54efcccb]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:24px 16px;background:#141414;border-radius:12px;border:1px solid #1a1a1a;cursor:pointer;transition:all .2s}.folder-card[data-v-54efcccb]:hover{background:#1a1a1a;border-color:#333;transform:translateY(-2px)}.folder-icon[data-v-54efcccb]{width:48px;height:48px;margin-bottom:12px;color:#555}.folder-icon svg[data-v-54efcccb]{width:100%;height:100%}.folder-name[data-v-54efcccb]{font-size:14px;color:#999;text-align:center;word-break:break-all}.waterfall[data-v-54efcccb]{display:flex;gap:16px}.waterfall-column[data-v-54efcccb]{flex:1;display:flex;flex-direction:column;gap:16px}.waterfall-item[data-v-54efcccb]{cursor:pointer}.image-wrapper[data-v-54efcccb]{position:relative;border-radius:12px;overflow:hidden;background:#141414;border:1px solid #1a1a1a;min-height:180px}.image-wrapper[data-v-54efcccb]:before{content:"";position:absolute;inset:0;background:linear-gradient(90deg,#141414 25%,#1a1a1a 50%,#141414 75%);background-size:200% 100%;animation:shimmer-54efcccb 1.5s infinite;z-index:1;pointer-events:none}.image-wrapper.loaded[data-v-54efcccb]:before{display:none}.image-wrapper.loaded[data-v-54efcccb]{min-height:auto}.image-wrapper img[data-v-54efcccb],.image-wrapper video[data-v-54efcccb]{width:100%;display:block;position:relative;z-index:2}@keyframes shimmer-54efcccb{0%{background-position:200% 0}to{background-position:-200% 0}}.image-wrapper[data-v-54efcccb]:hover{border-color:#333}.overlay[data-v-54efcccb]{position:absolute;inset:0;background:linear-gradient(transparent 50%,rgba(0,0,0,.85));opacity:0;transition:opacity .2s;display:flex;align-items:flex-end;justify-content:flex-end;padding:12px;z-index:10}.image-wrapper:hover .overlay[data-v-54efcccb]{opacity:1}.file-placeholder[data-v-54efcccb]{width:100%;height:200px;display:flex;flex-direction:column;align-items:center;justify-content:center;background:#141414;color:#555;gap:12px;padding:16px;box-sizing:border-box}.file-placeholder svg[data-v-54efcccb]{width:48px;height:48px}.file-name[data-v-54efcccb]{font-size:12px;color:hsla(0,0%,100%,.7);text-align:center;word-break:break-all;max-width:100%;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}.audio-placeholder[data-v-54efcccb]{width:100%;height:200px;display:flex;flex-direction:column;align-items:center;justify-content:center;background:linear-gradient(135deg,#1a1a2e,#16213e);gap:12px;padding:16px;box-sizing:border-box}.audio-icon[data-v-54efcccb]{width:48px;height:48px;color:hsla(0,0%,100%,.6)}.audio-name[data-v-54efcccb]{font-size:12px;color:hsla(0,0%,100%,.7);text-align:center;word-break:break-all;max-width:100%;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}.overlay-actions[data-v-54efcccb]{display:flex;gap:8px}.action-btn[data-v-54efcccb]{width:32px;height:32px;border:none;border-radius:50%;background:hsla(0,0%,100%,.08);backdrop-filter:blur(8px);cursor:pointer;transition:all .2s;display:flex;align-items:center;justify-content:center;color:hsla(0,0%,100%,.6)}.action-btn svg[data-v-54efcccb]{width:16px;height:16px}.action-btn[data-v-54efcccb]:hover{background:hsla(0,0%,100%,.2);color:#fff;transform:scale(1.1)}.load-trigger[data-v-54efcccb]{display:flex;flex-direction:column;justify-content:center;align-items:center;padding:48px;min-height:100px}.loading-more[data-v-54efcccb]{display:flex;align-items:center;gap:12px;color:#666;font-size:14px}.no-more[data-v-54efcccb]{color:#444;font-size:14px}.credit-link[data-v-54efcccb]{display:block;margin-top:8px;color:#555;font-size:12px;text-decoration:none;transition:color .2s;text-align:center}.credit-link[data-v-54efcccb]:hover{color:#888}.preview-modal[data-v-54efcccb]{position:fixed;inset:0;z-index:1000;background:rgba(0,0,0,.97);display:flex;align-items:center;justify-content:center;overflow:hidden}.preview-content[data-v-54efcccb]{padding:60px 80px;box-sizing:border-box;overflow:hidden}.preview-content-mobile[data-v-54efcccb],.preview-content[data-v-54efcccb]{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.preview-content-mobile[data-v-54efcccb]{flex-direction:column;padding:0;position:absolute;top:0;left:0}.mobile-video-native[data-v-54efcccb]{width:100%;height:100%;-o-object-fit:contain;object-fit:contain;background:#000}.mobile-audio-wrap[data-v-54efcccb]{width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;box-sizing:border-box}.mobile-audio-wrap .swipe-hint[data-v-54efcccb]{margin-top:20px}.swipe-hint[data-v-54efcccb]{font-size:12px;color:hsla(0,0%,100%,.4)}.other-file-preview[data-v-54efcccb]{width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;color:hsla(0,0%,100%,.6);gap:16px}.other-file-preview svg[data-v-54efcccb]{width:64px;height:64px}.other-file-preview .file-name[data-v-54efcccb]{font-size:14px;color:hsla(0,0%,100%,.7);text-align:center;padding:0 20px;word-break:break-all}.swipe-viewport[data-v-54efcccb]{width:100%;height:100%;overflow:hidden;position:relative}.swipe-track[data-v-54efcccb]{width:300%;height:100%;display:flex;will-change:transform}.swipe-slide[data-v-54efcccb]{width:33.333%;flex-shrink:0;height:100%;display:flex;align-items:center;justify-content:center}.preview-image[data-v-54efcccb],.preview-video[data-v-54efcccb]{max-width:100%;max-height:100%;-o-object-fit:contain;object-fit:contain;-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-user-drag:none}.preview-close[data-v-54efcccb]{position:fixed;top:20px;right:20px;background:hsla(0,0%,100%,.1);border:none;color:#fff;cursor:pointer;width:48px;height:48px;border-radius:50%;display:flex;align-items:center;justify-content:center;transition:background .2s;z-index:1010}.preview-close[data-v-54efcccb]:hover{background:hsla(0,0%,100%,.2)}.preview-close svg[data-v-54efcccb]{width:28px;height:28px}.page-indicator[data-v-54efcccb]{position:fixed;bottom:30px;left:50%;transform:translateX(-50%);background:rgba(0,0,0,.6);color:hsla(0,0%,100%,.8);padding:8px 16px;border-radius:20px;font-size:14px;z-index:1010}.preview-next[data-v-54efcccb],.preview-prev[data-v-54efcccb]{position:fixed;top:50%;transform:translateY(-50%);background:hsla(0,0%,100%,.1);border:none;color:#fff;padding:16px;cursor:pointer;border-radius:50%;width:56px;height:56px;display:flex;align-items:center;justify-content:center;transition:background .2s;z-index:1010}.preview-next[data-v-54efcccb]:hover,.preview-prev[data-v-54efcccb]:hover{background:hsla(0,0%,100%,.2)}.preview-next svg[data-v-54efcccb],.preview-prev svg[data-v-54efcccb]{width:32px;height:32px}.preview-prev[data-v-54efcccb]{left:20px}.preview-next[data-v-54efcccb]{right:20px}.rotate-btn[data-v-54efcccb]{position:fixed;bottom:30px;right:20px;background:hsla(0,0%,100%,.1);border:none;color:#fff;cursor:pointer;width:48px;height:48px;border-radius:50%;display:flex;align-items:center;justify-content:center;transition:background .2s;z-index:1010}.rotate-btn[data-v-54efcccb]:hover{background:hsla(0,0%,100%,.2)}.rotate-btn svg[data-v-54efcccb]{width:24px;height:24px}@media (max-width:768px){.page-indicator[data-v-54efcccb]{bottom:40px}}@media (max-width:1199px) and (min-width:601px){.gallery-container[data-v-54efcccb]{padding:12px}.waterfall-column[data-v-54efcccb],.waterfall[data-v-54efcccb]{gap:10px}.image-wrapper[data-v-54efcccb]{border-radius:8px}}@media (max-width:600px){.header[data-v-54efcccb]{padding:10px 12px}.header-left .logo[data-v-54efcccb]{font-size:16px}.breadcrumb[data-v-54efcccb]{font-size:12px}.breadcrumb-item[data-v-54efcccb]{padding:4px 8px}.file-count[data-v-54efcccb]{font-size:12px}.gallery-container[data-v-54efcccb]{padding:6px}.waterfall-column[data-v-54efcccb],.waterfall[data-v-54efcccb]{gap:6px}.image-wrapper[data-v-54efcccb]{border-radius:6px;min-height:120px}.folders-section[data-v-54efcccb]{margin-bottom:12px}.folders-grid[data-v-54efcccb]{grid-template-columns:repeat(2,1fr);gap:8px}.folder-card[data-v-54efcccb]{padding:16px 12px;border-radius:8px}.folder-icon[data-v-54efcccb]{width:36px;height:36px;margin-bottom:8px}.folder-name[data-v-54efcccb]{font-size:12px}.load-trigger[data-v-54efcccb]{padding:24px;min-height:60px}}.copy-toast{position:fixed;bottom:80px;left:50%;transform:translateX(-50%) translateY(20px);background:rgba(0,0,0,.8);color:#fff;padding:10px 24px;border-radius:20px;font-size:14px;opacity:0;transition:all .3s ease;z-index:9999;pointer-events:none}.copy-toast.show{opacity:1;transform:translateX(-50%) translateY(0)}:root:not(.dark) .public-browse[data-v-54efcccb]{background:#f5f5f5;color:#333}:root:not(.dark) .header[data-v-54efcccb]{background:hsla(0,0%,100%,.95);border-bottom-color:#e0e0e0}:root:not(.dark) .logo[data-v-54efcccb]{color:#333}:root:not(.dark) .breadcrumb-item[data-v-54efcccb]{color:#666}:root:not(.dark) .breadcrumb-item[data-v-54efcccb]:hover{background:#e8e8e8;color:#333}:root:not(.dark) .breadcrumb-sep[data-v-54efcccb]{color:#ccc}:root:not(.dark) .error-container[data-v-54efcccb],:root:not(.dark) .file-count[data-v-54efcccb],:root:not(.dark) .loading-container[data-v-54efcccb]{color:#999}:root:not(.dark) .error-credit[data-v-54efcccb]{color:rgba(0,0,0,.4)}:root:not(.dark) .error-credit-links a[data-v-54efcccb]{color:rgba(0,0,0,.5)}:root:not(.dark) .loading-spinner-small[data-v-54efcccb],:root:not(.dark) .loading-spinner[data-v-54efcccb]{border-color:#ddd;border-top-color:#3b82f6}:root:not(.dark) .folder-card[data-v-54efcccb]{background:#fff;border-color:#e0e0e0}:root:not(.dark) .folder-card[data-v-54efcccb]:hover{background:#fafafa;border-color:#ccc}:root:not(.dark) .folder-icon[data-v-54efcccb]{color:#999}:root:not(.dark) .folder-name[data-v-54efcccb]{color:#666}:root:not(.dark) .image-wrapper[data-v-54efcccb]{background:#fff;border-color:#e0e0e0}:root:not(.dark) .image-wrapper[data-v-54efcccb]:before{background:linear-gradient(90deg,#f5f5f5 25%,#fff 50%,#f5f5f5 75%)}:root:not(.dark) .image-wrapper[data-v-54efcccb]:hover{border-color:#ccc}:root:not(.dark) .file-placeholder[data-v-54efcccb]{background:#f5f5f5;color:#999}:root:not(.dark) .file-name[data-v-54efcccb]{color:rgba(0,0,0,.6)}:root:not(.dark) .audio-placeholder[data-v-54efcccb]{background:linear-gradient(135deg,#e8f4f8,#d4e5f7)}:root:not(.dark) .audio-icon[data-v-54efcccb]{color:rgba(0,0,0,.4)}:root:not(.dark) .audio-name[data-v-54efcccb]{color:rgba(0,0,0,.6)}:root:not(.dark) .no-more[data-v-54efcccb]{color:#bbb}:root:not(.dark) .credit-link[data-v-54efcccb]{color:#aaa}:root:not(.dark) .credit-link[data-v-54efcccb]:hover{color:#666}:root:not(.dark) .loading-more[data-v-54efcccb]{color:#999}:root:not(.dark) .theme-toggle-btn[data-v-54efcccb]:hover{background:rgba(0,0,0,.08)} \ No newline at end of file +@charset "UTF-8";@keyframes plyr-progress{to{background-position:25px 0;background-position:var(--plyr-progress-loading-size,25px) 0}}@keyframes plyr-popup{0%{opacity:.5;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes plyr-fade-in{0%{opacity:0}to{opacity:1}}.plyr{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;align-items:center;direction:ltr;display:flex;flex-direction:column;font-family:inherit;font-family:var(--plyr-font-family,inherit);font-variant-numeric:tabular-nums;font-weight:400;font-weight:var(--plyr-font-weight-regular,400);line-height:1.7;line-height:var(--plyr-line-height,1.7);max-width:100%;min-width:200px;position:relative;text-shadow:none;transition:box-shadow .3s ease;z-index:0}.plyr audio,.plyr iframe,.plyr video{display:block;height:100%;width:100%}.plyr button{font:inherit;line-height:inherit;width:auto}.plyr:focus{outline:0}.plyr--full-ui{box-sizing:border-box}.plyr--full-ui *,.plyr--full-ui :after,.plyr--full-ui :before{box-sizing:inherit}.plyr--full-ui a,.plyr--full-ui button,.plyr--full-ui input,.plyr--full-ui label{touch-action:manipulation}.plyr__badge{background:#4a5464;background:var(--plyr-badge-background,#4a5464);border-radius:2px;border-radius:var(--plyr-badge-border-radius,2px);color:#fff;color:var(--plyr-badge-text-color,#fff);font-size:9px;font-size:var(--plyr-font-size-badge,9px);line-height:1;padding:3px 4px}.plyr--full-ui ::-webkit-media-text-track-container{display:none}.plyr__captions{animation:plyr-fade-in .3s ease;bottom:0;display:none;font-size:13px;font-size:var(--plyr-font-size-small,13px);left:0;padding:10px;padding:var(--plyr-control-spacing,10px);position:absolute;text-align:center;transition:transform .4s ease-in-out;width:100%}.plyr__captions span:empty{display:none}@media (min-width:480px){.plyr__captions{font-size:15px;font-size:var(--plyr-font-size-base,15px);padding:20px;padding:calc(var(--plyr-control-spacing, 10px)*2)}}@media (min-width:768px){.plyr__captions{font-size:18px;font-size:var(--plyr-font-size-large,18px)}}.plyr--captions-active .plyr__captions{display:block}.plyr:not(.plyr--hide-controls) .plyr__controls:not(:empty)~.plyr__captions{transform:translateY(-40px);transform:translateY(calc(var(--plyr-control-spacing, 10px)*-4))}.plyr__caption{background:#000c;background:var(--plyr-captions-background,#000c);border-radius:2px;-webkit-box-decoration-break:clone;box-decoration-break:clone;color:#fff;color:var(--plyr-captions-text-color,#fff);line-height:185%;padding:.2em .5em;white-space:pre-wrap}.plyr__caption div{display:inline}.plyr__control{background:#0000;border:0;border-radius:4px;border-radius:var(--plyr-control-radius,4px);color:inherit;cursor:pointer;flex-shrink:0;overflow:visible;padding:7px;padding:calc(var(--plyr-control-spacing, 10px)*.7);position:relative;transition:all .1s ease-in-out}.plyr__control svg{display:block;fill:currentColor;height:18px;height:var(--plyr-control-icon-size,18px);pointer-events:none;width:18px;width:var(--plyr-control-icon-size,18px)}.plyr__control:focus{outline:0}.plyr__control:focus-visible{outline:2px dashed #00b2ff;outline:2px dashed var(--plyr-focus-visible-color,var(--plyr-color-main,var(--plyr-color-main,#00b2ff)));outline-offset:2px}a.plyr__control{text-decoration:none}.plyr__control.plyr__control--pressed .icon--not-pressed,.plyr__control.plyr__control--pressed .label--not-pressed,.plyr__control:not(.plyr__control--pressed) .icon--pressed,.plyr__control:not(.plyr__control--pressed) .label--pressed,a.plyr__control:after,a.plyr__control:before{display:none}.plyr--full-ui ::-webkit-media-controls{display:none}.plyr__controls{align-items:center;display:flex;justify-content:flex-end;text-align:center}.plyr__controls .plyr__progress__container{flex:1;min-width:0}.plyr__controls .plyr__controls__item{margin-left:2.5px;margin-left:calc(var(--plyr-control-spacing, 10px)/4)}.plyr__controls .plyr__controls__item:first-child{margin-left:0;margin-right:auto}.plyr__controls .plyr__controls__item.plyr__progress__container{padding-left:2.5px;padding-left:calc(var(--plyr-control-spacing, 10px)/4)}.plyr__controls .plyr__controls__item.plyr__time{padding:0 5px;padding:0 calc(var(--plyr-control-spacing, 10px)/2)}.plyr__controls .plyr__controls__item.plyr__progress__container:first-child,.plyr__controls .plyr__controls__item.plyr__time+.plyr__time,.plyr__controls .plyr__controls__item.plyr__time:first-child{padding-left:0}.plyr [data-plyr=airplay],.plyr [data-plyr=captions],.plyr [data-plyr=fullscreen],.plyr [data-plyr=pip],.plyr__controls:empty{display:none}.plyr--airplay-supported [data-plyr=airplay],.plyr--captions-enabled [data-plyr=captions],.plyr--fullscreen-enabled [data-plyr=fullscreen],.plyr--pip-supported [data-plyr=pip]{display:inline-block}.plyr__menu{display:flex;position:relative}.plyr__menu .plyr__control svg{transition:transform .3s ease}.plyr__menu .plyr__control[aria-expanded=true] svg{transform:rotate(90deg)}.plyr__menu .plyr__control[aria-expanded=true] .plyr__tooltip{display:none}.plyr__menu__container{animation:plyr-popup .2s ease;background:#ffffffe6;background:var(--plyr-menu-background,#ffffffe6);border-radius:8px;border-radius:var(--plyr-menu-radius,8px);bottom:100%;box-shadow:0 1px 2px #00000026;box-shadow:var(--plyr-menu-shadow,0 1px 2px #00000026);color:#4a5464;color:var(--plyr-menu-color,#4a5464);font-size:15px;font-size:var(--plyr-font-size-base,15px);margin-bottom:10px;position:absolute;right:-3px;text-align:left;white-space:nowrap;z-index:3}.plyr__menu__container>div{overflow:hidden;transition:height .35s cubic-bezier(.4,0,.2,1),width .35s cubic-bezier(.4,0,.2,1)}.plyr__menu__container:after{border:4px solid #0000;border-top-color:#ffffffe6;border:var(--plyr-menu-arrow-size,4px) solid #0000;border-top-color:var(--plyr-menu-background,#ffffffe6);content:"";height:0;position:absolute;right:14px;right:calc(var(--plyr-control-icon-size, 18px)/2 + var(--plyr-control-spacing, 10px)*.7 - var(--plyr-menu-arrow-size, 4px)/2);top:100%;width:0}.plyr__menu__container [role=menu]{padding:7px;padding:calc(var(--plyr-control-spacing, 10px)*.7)}.plyr__menu__container [role=menuitem],.plyr__menu__container [role=menuitemradio]{margin-top:2px}.plyr__menu__container [role=menuitem]:first-child,.plyr__menu__container [role=menuitemradio]:first-child{margin-top:0}.plyr__menu__container .plyr__control{align-items:center;color:#4a5464;color:var(--plyr-menu-color,#4a5464);display:flex;font-size:13px;font-size:var(--plyr-font-size-menu,var(--plyr-font-size-small,13px));padding:4.66667px 10.5px;padding:calc(var(--plyr-control-spacing, 10px)*.7/1.5) calc(var(--plyr-control-spacing, 10px)*.7*1.5);-webkit-user-select:none;user-select:none;width:100%}.plyr__menu__container .plyr__control>span{align-items:inherit;display:flex;width:100%}.plyr__menu__container .plyr__control:after{border:4px solid #0000;border:var(--plyr-menu-item-arrow-size,4px) solid #0000;content:"";position:absolute;top:50%;transform:translateY(-50%)}.plyr__menu__container .plyr__control--forward{padding-right:28px;padding-right:calc(var(--plyr-control-spacing, 10px)*.7*4)}.plyr__menu__container .plyr__control--forward:after{border-left-color:#728197;border-left-color:var(--plyr-menu-arrow-color,#728197);right:6.5px;right:calc(var(--plyr-control-spacing, 10px)*.7*1.5 - var(--plyr-menu-item-arrow-size, 4px))}.plyr__menu__container .plyr__control--forward:focus-visible:after,.plyr__menu__container .plyr__control--forward:hover:after{border-left-color:initial}.plyr__menu__container .plyr__control--back{font-weight:400;font-weight:var(--plyr-font-weight-regular,400);margin:7px;margin:calc(var(--plyr-control-spacing, 10px)*.7);margin-bottom:3.5px;margin-bottom:calc(var(--plyr-control-spacing, 10px)*.7/2);padding-left:28px;padding-left:calc(var(--plyr-control-spacing, 10px)*.7*4);position:relative;width:calc(100% - 14px);width:calc(100% - var(--plyr-control-spacing, 10px)*.7*2)}.plyr__menu__container .plyr__control--back:after{border-right-color:#728197;border-right-color:var(--plyr-menu-arrow-color,#728197);left:6.5px;left:calc(var(--plyr-control-spacing, 10px)*.7*1.5 - var(--plyr-menu-item-arrow-size, 4px))}.plyr__menu__container .plyr__control--back:before{background:#dcdfe5;background:var(--plyr-menu-back-border-color,#dcdfe5);box-shadow:0 1px 0 #fff;box-shadow:0 1px 0 var(--plyr-menu-back-border-shadow-color,#fff);content:"";height:1px;left:0;margin-top:3.5px;margin-top:calc(var(--plyr-control-spacing, 10px)*.7/2);overflow:hidden;position:absolute;right:0;top:100%}.plyr__menu__container .plyr__control--back:focus-visible:after,.plyr__menu__container .plyr__control--back:hover:after{border-right-color:initial}.plyr__menu__container .plyr__control[role=menuitemradio]{padding-left:7px;padding-left:calc(var(--plyr-control-spacing, 10px)*.7)}.plyr__menu__container .plyr__control[role=menuitemradio]:after,.plyr__menu__container .plyr__control[role=menuitemradio]:before{border-radius:100%}.plyr__menu__container .plyr__control[role=menuitemradio]:before{background:#0000001a;content:"";display:block;flex-shrink:0;height:16px;margin-right:10px;margin-right:var(--plyr-control-spacing,10px);transition:all .3s ease;width:16px}.plyr__menu__container .plyr__control[role=menuitemradio]:after{background:#fff;border:0;height:6px;left:12px;opacity:0;top:50%;transform:translateY(-50%) scale(0);transition:transform .3s ease,opacity .3s ease;width:6px}.plyr__menu__container .plyr__control[role=menuitemradio][aria-checked=true]:before{background:#00b2ff;background:var(--plyr-control-toggle-checked-background,var(--plyr-color-main,var(--plyr-color-main,#00b2ff)))}.plyr__menu__container .plyr__control[role=menuitemradio][aria-checked=true]:after{opacity:1;transform:translateY(-50%) scale(1)}.plyr__menu__container .plyr__control[role=menuitemradio]:focus-visible:before,.plyr__menu__container .plyr__control[role=menuitemradio]:hover:before{background:#23282f1a}.plyr__menu__container .plyr__menu__value{align-items:center;display:flex;margin-left:auto;margin-right:-5px;margin-right:calc(var(--plyr-control-spacing, 10px)*.7*-1 + 2px);overflow:hidden;padding-left:24.5px;padding-left:calc(var(--plyr-control-spacing, 10px)*.7*3.5);pointer-events:none}.plyr--full-ui input[type=range]{appearance:none;background:#0000;border:0;border-radius:26px;border-radius:calc(var(--plyr-range-thumb-height, 13px)*2);color:#00b2ff;color:var(--plyr-range-fill-background,var(--plyr-color-main,var(--plyr-color-main,#00b2ff)));display:block;height:19px;height:calc(var(--plyr-range-thumb-active-shadow-width, 3px)*2 + var(--plyr-range-thumb-height, 13px));margin:0;min-width:0;padding:0;transition:box-shadow .3s ease;width:100%}.plyr--full-ui input[type=range]::-webkit-slider-runnable-track{background:#0000;background-image:linear-gradient(90deg,currentColor,#0000 0);background-image:linear-gradient(to right,currentColor var(--value,0),#0000 var(--value,0));border:0;border-radius:2.5px;border-radius:calc(var(--plyr-range-track-height, 5px)/2);height:5px;height:var(--plyr-range-track-height,5px);-webkit-transition:box-shadow .3s ease;transition:box-shadow .3s ease;-webkit-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-webkit-slider-thumb{appearance:none;background:#fff;background:var(--plyr-range-thumb-background,#fff);border:0;border-radius:100%;box-shadow:0 1px 1px #23282f26,0 0 0 1px #23282f33;box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px #23282f26,0 0 0 1px #23282f33);height:13px;height:var(--plyr-range-thumb-height,13px);margin-top:-4px;margin-top:calc((var(--plyr-range-thumb-height, 13px) - var(--plyr-range-track-height, 5px))/2*-1);position:relative;-webkit-transition:all .2s ease;transition:all .2s ease;width:13px;width:var(--plyr-range-thumb-height,13px)}.plyr--full-ui input[type=range]::-moz-range-track{background:#0000;border:0;border-radius:2.5px;border-radius:calc(var(--plyr-range-track-height, 5px)/2);height:5px;height:var(--plyr-range-track-height,5px);-moz-transition:box-shadow .3s ease;transition:box-shadow .3s ease;user-select:none}.plyr--full-ui input[type=range]::-moz-range-thumb{background:#fff;background:var(--plyr-range-thumb-background,#fff);border:0;border-radius:100%;box-shadow:0 1px 1px #23282f26,0 0 0 1px #23282f33;box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px #23282f26,0 0 0 1px #23282f33);height:13px;height:var(--plyr-range-thumb-height,13px);position:relative;-moz-transition:all .2s ease;transition:all .2s ease;width:13px;width:var(--plyr-range-thumb-height,13px)}.plyr--full-ui input[type=range]::-moz-range-progress{background:currentColor;border-radius:2.5px;border-radius:calc(var(--plyr-range-track-height, 5px)/2);height:5px;height:var(--plyr-range-track-height,5px)}.plyr--full-ui input[type=range]::-ms-track{color:#0000}.plyr--full-ui input[type=range]::-ms-fill-upper,.plyr--full-ui input[type=range]::-ms-track{background:#0000;border:0;border-radius:2.5px;border-radius:calc(var(--plyr-range-track-height, 5px)/2);height:5px;height:var(--plyr-range-track-height,5px);-ms-transition:box-shadow .3s ease;transition:box-shadow .3s ease;user-select:none}.plyr--full-ui input[type=range]::-ms-fill-lower{background:#0000;background:currentColor;border:0;border-radius:2.5px;border-radius:calc(var(--plyr-range-track-height, 5px)/2);height:5px;height:var(--plyr-range-track-height,5px);-ms-transition:box-shadow .3s ease;transition:box-shadow .3s ease;user-select:none}.plyr--full-ui input[type=range]::-ms-thumb{background:#fff;background:var(--plyr-range-thumb-background,#fff);border:0;border-radius:100%;box-shadow:0 1px 1px #23282f26,0 0 0 1px #23282f33;box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px #23282f26,0 0 0 1px #23282f33);height:13px;height:var(--plyr-range-thumb-height,13px);margin-top:0;position:relative;-ms-transition:all .2s ease;transition:all .2s ease;width:13px;width:var(--plyr-range-thumb-height,13px)}.plyr--full-ui input[type=range]::-ms-tooltip{display:none}.plyr--full-ui input[type=range]::-moz-focus-outer{border:0}.plyr--full-ui input[type=range]:focus{outline:0}.plyr--full-ui input[type=range]:focus-visible::-webkit-slider-runnable-track{outline:2px dashed #00b2ff;outline:2px dashed var(--plyr-focus-visible-color,var(--plyr-color-main,var(--plyr-color-main,#00b2ff)));outline-offset:2px}.plyr--full-ui input[type=range]:focus-visible::-moz-range-track{outline:2px dashed #00b2ff;outline:2px dashed var(--plyr-focus-visible-color,var(--plyr-color-main,var(--plyr-color-main,#00b2ff)));outline-offset:2px}.plyr--full-ui input[type=range]:focus-visible::-ms-track{outline:2px dashed #00b2ff;outline:2px dashed var(--plyr-focus-visible-color,var(--plyr-color-main,var(--plyr-color-main,#00b2ff)));outline-offset:2px}.plyr__poster{background-color:#000;background-color:var(--plyr-video-background,var(--plyr-video-background,#000));background-position:50% 50%;background-repeat:no-repeat;background-size:contain;height:100%;left:0;opacity:0;position:absolute;top:0;transition:opacity .2s ease;width:100%;z-index:1}.plyr--stopped.plyr__poster-enabled .plyr__poster{opacity:1}.plyr--youtube.plyr--paused.plyr__poster-enabled:not(.plyr--stopped) .plyr__poster{display:none}.plyr__time{font-size:13px;font-size:var(--plyr-font-size-time,var(--plyr-font-size-small,13px))}.plyr__time+.plyr__time:before{content:"⁄";margin-right:10px;margin-right:var(--plyr-control-spacing,10px)}@media (max-width:767px){.plyr__time+.plyr__time{display:none}}.plyr__tooltip{background:#fff;background:var(--plyr-tooltip-background,#fff);border-radius:5px;border-radius:var(--plyr-tooltip-radius,5px);bottom:100%;box-shadow:0 1px 2px #00000026;box-shadow:var(--plyr-tooltip-shadow,0 1px 2px #00000026);color:#4a5464;color:var(--plyr-tooltip-color,#4a5464);font-size:13px;font-size:var(--plyr-font-size-small,13px);font-weight:400;font-weight:var(--plyr-font-weight-regular,400);left:50%;line-height:1.3;margin-bottom:10px;margin-bottom:calc(var(--plyr-control-spacing, 10px)/2*2);opacity:0;padding:5px 7.5px;padding:calc(var(--plyr-control-spacing, 10px)/2) calc(var(--plyr-control-spacing, 10px)/2*1.5);pointer-events:none;position:absolute;transform:translate(-50%,10px) scale(.8);transform-origin:50% 100%;transition:transform .2s ease .1s,opacity .2s ease .1s;white-space:nowrap;z-index:2}.plyr__tooltip:before{border-left:4px solid #0000;border-left:var(--plyr-tooltip-arrow-size,4px) solid #0000;border-right:4px solid #0000;border-right:var(--plyr-tooltip-arrow-size,4px) solid #0000;border-top:4px solid #fff;border-top:var(--plyr-tooltip-arrow-size,4px) solid var(--plyr-tooltip-background,#fff);bottom:-4px;bottom:calc(var(--plyr-tooltip-arrow-size, 4px)*-1);content:"";height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;z-index:2}.plyr .plyr__control:focus-visible .plyr__tooltip,.plyr .plyr__control:hover .plyr__tooltip,.plyr__tooltip--visible{opacity:1;transform:translate(-50%) scale(1)}.plyr .plyr__control:hover .plyr__tooltip{z-index:3}.plyr__controls>.plyr__control:first-child .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip{left:0;transform:translateY(10px) scale(.8);transform-origin:0 100%}.plyr__controls>.plyr__control:first-child .plyr__tooltip:before,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip:before{left:16px;left:calc(var(--plyr-control-icon-size, 18px)/2 + var(--plyr-control-spacing, 10px)*.7)}.plyr__controls>.plyr__control:last-child .plyr__tooltip{left:auto;right:0;transform:translateY(10px) scale(.8);transform-origin:100% 100%}.plyr__controls>.plyr__control:last-child .plyr__tooltip:before{left:auto;right:16px;right:calc(var(--plyr-control-icon-size, 18px)/2 + var(--plyr-control-spacing, 10px)*.7);transform:translateX(50%)}.plyr__controls>.plyr__control:first-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control:focus-visible .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control:hover .plyr__tooltip,.plyr__controls>.plyr__control:first-child:focus-visible .plyr__tooltip,.plyr__controls>.plyr__control:first-child:hover .plyr__tooltip,.plyr__controls>.plyr__control:last-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:last-child:focus-visible .plyr__tooltip,.plyr__controls>.plyr__control:last-child:hover .plyr__tooltip{transform:translate(0) scale(1)}.plyr__progress{left:6.5px;left:calc(var(--plyr-range-thumb-height, 13px)*.5);margin-right:13px;margin-right:var(--plyr-range-thumb-height,13px);position:relative}.plyr__progress input[type=range],.plyr__progress__buffer{margin-left:-6.5px;margin-left:calc(var(--plyr-range-thumb-height, 13px)*-.5);margin-right:-6.5px;margin-right:calc(var(--plyr-range-thumb-height, 13px)*-.5);width:calc(100% + 13px);width:calc(100% + var(--plyr-range-thumb-height, 13px))}.plyr__progress input[type=range]{position:relative;z-index:2}.plyr__progress .plyr__tooltip{left:0;max-width:120px;overflow-wrap:break-word}.plyr__progress__buffer{-webkit-appearance:none;background:#0000;border:0;border-radius:100px;height:5px;height:var(--plyr-range-track-height,5px);left:0;margin-top:-2.5px;margin-top:calc(var(--plyr-range-track-height, 5px)/2*-1);padding:0;position:absolute;top:50%}.plyr__progress__buffer::-webkit-progress-bar{background:#0000}.plyr__progress__buffer::-webkit-progress-value{background:currentColor;border-radius:100px;min-width:5px;min-width:var(--plyr-range-track-height,5px);-webkit-transition:width .2s ease;transition:width .2s ease}.plyr__progress__buffer::-moz-progress-bar{background:currentColor;border-radius:100px;min-width:5px;min-width:var(--plyr-range-track-height,5px);-moz-transition:width .2s ease;transition:width .2s ease}.plyr__progress__buffer::-ms-fill{border-radius:100px;-ms-transition:width .2s ease;transition:width .2s ease}.plyr--loading .plyr__progress__buffer{animation:plyr-progress 1s linear infinite;background-image:linear-gradient(-45deg,#23282f99 25%,#0000 0,#0000 50%,#23282f99 0,#23282f99 75%,#0000 0,#0000);background-image:linear-gradient(-45deg,var(--plyr-progress-loading-background,#23282f99) 25%,#0000 25%,#0000 50%,var(--plyr-progress-loading-background,#23282f99) 50%,var(--plyr-progress-loading-background,#23282f99) 75%,#0000 75%,#0000);background-repeat:repeat-x;background-size:25px 25px;background-size:var(--plyr-progress-loading-size,25px) var(--plyr-progress-loading-size,25px);color:#0000}.plyr--video.plyr--loading .plyr__progress__buffer{background-color:#ffffff40;background-color:var(--plyr-video-progress-buffered-background,#ffffff40)}.plyr--audio.plyr--loading .plyr__progress__buffer{background-color:#c1c8d199;background-color:var(--plyr-audio-progress-buffered-background,#c1c8d199)}.plyr__progress__marker{background-color:#fff;background-color:var(--plyr-progress-marker-background,#fff);border-radius:1px;height:5px;height:var(--plyr-range-track-height,5px);position:absolute;top:50%;transform:translate(-50%,-50%);width:3px;width:var(--plyr-progress-marker-width,3px);z-index:3}.plyr__volume{align-items:center;display:flex;position:relative}.plyr__volume input[type=range]{margin-left:5px;margin-left:calc(var(--plyr-control-spacing, 10px)/2);margin-right:5px;margin-right:calc(var(--plyr-control-spacing, 10px)/2);max-width:90px;min-width:60px;position:relative;z-index:2}.plyr--audio{display:block}.plyr--audio .plyr__controls{background:#fff;background:var(--plyr-audio-controls-background,#fff);border-radius:inherit;color:#4a5464;color:var(--plyr-audio-control-color,#4a5464);padding:10px;padding:var(--plyr-control-spacing,10px)}.plyr--audio .plyr__control:focus-visible,.plyr--audio .plyr__control:hover,.plyr--audio .plyr__control[aria-expanded=true]{background:#00b2ff;background:var(--plyr-audio-control-background-hover,var(--plyr-color-main,var(--plyr-color-main,#00b2ff)));color:#fff;color:var(--plyr-audio-control-color-hover,#fff)}.plyr--full-ui.plyr--audio input[type=range]::-webkit-slider-runnable-track{background-color:#c1c8d199;background-color:var(--plyr-audio-range-track-background,var(--plyr-audio-progress-buffered-background,#c1c8d199))}.plyr--full-ui.plyr--audio input[type=range]::-moz-range-track{background-color:#c1c8d199;background-color:var(--plyr-audio-range-track-background,var(--plyr-audio-progress-buffered-background,#c1c8d199))}.plyr--full-ui.plyr--audio input[type=range]::-ms-track{background-color:#c1c8d199;background-color:var(--plyr-audio-range-track-background,var(--plyr-audio-progress-buffered-background,#c1c8d199))}.plyr--full-ui.plyr--audio input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px #23282f26,0 0 0 1px #23282f33,0 0 0 3px #23282f1a;box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px #23282f26,0 0 0 1px #23282f33),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,#23282f1a)}.plyr--full-ui.plyr--audio input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px #23282f26,0 0 0 1px #23282f33,0 0 0 3px #23282f1a;box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px #23282f26,0 0 0 1px #23282f33),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,#23282f1a)}.plyr--full-ui.plyr--audio input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px #23282f26,0 0 0 1px #23282f33,0 0 0 3px #23282f1a;box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px #23282f26,0 0 0 1px #23282f33),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,#23282f1a)}.plyr--audio .plyr__progress__buffer{color:#c1c8d199;color:var(--plyr-audio-progress-buffered-background,#c1c8d199)}.plyr--video{overflow:hidden}.plyr--video.plyr--menu-open{overflow:visible}.plyr__video-wrapper{background:#000;background:var(--plyr-video-background,var(--plyr-video-background,#000));border-radius:inherit;height:100%;margin:auto;overflow:hidden;position:relative;width:100%}.plyr__video-embed,.plyr__video-wrapper--fixed-ratio{aspect-ratio:16/9}@supports not (aspect-ratio:16/9){.plyr__video-embed,.plyr__video-wrapper--fixed-ratio{height:0;padding-bottom:56.25%;position:relative}}.plyr__video-embed iframe,.plyr__video-wrapper--fixed-ratio video{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.plyr--full-ui .plyr__video-embed>.plyr__video-embed__container{padding-bottom:240%;position:relative;transform:translateY(-38.28125%)}.plyr--video .plyr__controls{background:linear-gradient(#0000,#000000bf);background:var(--plyr-video-controls-background,linear-gradient(#0000,#000000bf));border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;bottom:0;color:#fff;color:var(--plyr-video-control-color,#fff);left:0;padding:5px;padding:calc(var(--plyr-control-spacing, 10px)/2);padding-top:20px;padding-top:calc(var(--plyr-control-spacing, 10px)*2);position:absolute;right:0;transition:opacity .4s ease-in-out,transform .4s ease-in-out;z-index:3}@media (min-width:480px){.plyr--video .plyr__controls{padding:10px;padding:var(--plyr-control-spacing,10px);padding-top:35px;padding-top:calc(var(--plyr-control-spacing, 10px)*3.5)}}.plyr--video.plyr--hide-controls .plyr__controls{opacity:0;pointer-events:none;transform:translateY(100%)}.plyr--video .plyr__control:focus-visible,.plyr--video .plyr__control:hover,.plyr--video .plyr__control[aria-expanded=true]{background:#00b2ff;background:var(--plyr-video-control-background-hover,var(--plyr-color-main,var(--plyr-color-main,#00b2ff)));color:#fff;color:var(--plyr-video-control-color-hover,#fff)}.plyr__control--overlaid{background:#00b2ff;background:var(--plyr-video-control-background-hover,var(--plyr-color-main,var(--plyr-color-main,#00b2ff)));border:0;border-radius:100%;color:#fff;color:var(--plyr-video-control-color,#fff);display:none;left:50%;opacity:.9;padding:15px;padding:calc(var(--plyr-control-spacing, 10px)*1.5);position:absolute;top:50%;transform:translate(-50%,-50%);transition:.3s;z-index:2}.plyr__control--overlaid svg{left:2px;position:relative}.plyr__control--overlaid:focus,.plyr__control--overlaid:hover{opacity:1}.plyr--playing .plyr__control--overlaid{opacity:0;visibility:hidden}.plyr--full-ui.plyr--video .plyr__control--overlaid{display:block}.plyr--full-ui.plyr--video input[type=range]::-webkit-slider-runnable-track{background-color:#ffffff40;background-color:var(--plyr-video-range-track-background,var(--plyr-video-progress-buffered-background,#ffffff40))}.plyr--full-ui.plyr--video input[type=range]::-moz-range-track{background-color:#ffffff40;background-color:var(--plyr-video-range-track-background,var(--plyr-video-progress-buffered-background,#ffffff40))}.plyr--full-ui.plyr--video input[type=range]::-ms-track{background-color:#ffffff40;background-color:var(--plyr-video-range-track-background,var(--plyr-video-progress-buffered-background,#ffffff40))}.plyr--full-ui.plyr--video input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px #23282f26,0 0 0 1px #23282f33,0 0 0 3px #ffffff80;box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px #23282f26,0 0 0 1px #23282f33),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,#ffffff80)}.plyr--full-ui.plyr--video input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px #23282f26,0 0 0 1px #23282f33,0 0 0 3px #ffffff80;box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px #23282f26,0 0 0 1px #23282f33),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,#ffffff80)}.plyr--full-ui.plyr--video input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px #23282f26,0 0 0 1px #23282f33,0 0 0 3px #ffffff80;box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px #23282f26,0 0 0 1px #23282f33),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,#ffffff80)}.plyr--video .plyr__progress__buffer{color:#ffffff40;color:var(--plyr-video-progress-buffered-background,#ffffff40)}.plyr:fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:fullscreen video{height:100%}.plyr:fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:fullscreen .plyr__captions{font-size:21px;font-size:var(--plyr-font-size-xlarge,21px)}}.plyr--fullscreen-fallback{background:#000;border-radius:0!important;height:100%;inset:0;margin:0;position:fixed;width:100%;z-index:10000000}.plyr--fullscreen-fallback video{height:100%}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen{display:block}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr--fullscreen-fallback.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr--fullscreen-fallback .plyr__captions{font-size:21px;font-size:var(--plyr-font-size-xlarge,21px)}}.plyr__ads{border-radius:inherit;cursor:pointer;inset:0;overflow:hidden;position:absolute;z-index:-1}.plyr__ads>div,.plyr__ads>div iframe{height:100%;position:absolute;width:100%}.plyr__ads:after{background:#23282f;border-radius:2px;bottom:10px;bottom:var(--plyr-control-spacing,10px);color:#fff;content:attr(data-badge-text);font-size:11px;padding:2px 6px;pointer-events:none;position:absolute;right:10px;right:var(--plyr-control-spacing,10px);z-index:3}.plyr__ads:empty:after{display:none}.plyr__cues{background:currentColor;display:block;height:5px;height:var(--plyr-range-track-height,5px);left:0;opacity:.8;position:absolute;top:50%;transform:translateY(-50%);width:3px;z-index:3}.plyr__preview-thumb{background-color:#fff;background-color:var(--plyr-tooltip-background,#fff);border-radius:8px;border-radius:var(--plyr-menu-radius,8px);bottom:100%;box-shadow:0 1px 2px #00000026;box-shadow:var(--plyr-tooltip-shadow,0 1px 2px #00000026);margin-bottom:10px;margin-bottom:calc(var(--plyr-control-spacing, 10px)/2*2);opacity:0;padding:3px;pointer-events:none;position:absolute;transform:translateY(10px) scale(.8);transform-origin:50% 100%;transition:transform .2s ease .1s,opacity .2s ease .1s;z-index:2}.plyr__preview-thumb--is-shown{opacity:1;transform:translate(0) scale(1)}.plyr__preview-thumb:before{border-left:4px solid #0000;border-left:var(--plyr-tooltip-arrow-size,4px) solid #0000;border-right:4px solid #0000;border-right:var(--plyr-tooltip-arrow-size,4px) solid #0000;border-top:4px solid #fff;border-top:var(--plyr-tooltip-arrow-size,4px) solid var(--plyr-tooltip-background,#fff);bottom:-4px;bottom:calc(var(--plyr-tooltip-arrow-size, 4px)*-1);content:"";height:0;left:calc(50% + var(--preview-arrow-offset));position:absolute;transform:translateX(-50%);width:0;z-index:2}.plyr__preview-thumb__image-container{background:#c1c8d1;border-radius:7px;border-radius:calc(var(--plyr-menu-radius, 8px) - 1px);overflow:hidden;position:relative;z-index:0}.plyr__preview-thumb__image-container img,.plyr__preview-thumb__image-container:after{height:100%;left:0;position:absolute;top:0;width:100%}.plyr__preview-thumb__image-container:after{border-radius:inherit;box-shadow:inset 0 0 0 1px #00000026;content:"";pointer-events:none}.plyr__preview-thumb__image-container img{max-height:none;max-width:none}.plyr__preview-thumb__time-container{background:linear-gradient(#0000,#000000bf);background:var(--plyr-video-controls-background,linear-gradient(#0000,#000000bf));border-bottom-left-radius:7px;border-bottom-left-radius:calc(var(--plyr-menu-radius, 8px) - 1px);border-bottom-right-radius:7px;border-bottom-right-radius:calc(var(--plyr-menu-radius, 8px) - 1px);bottom:0;left:0;line-height:1.1;padding:20px 6px 6px;position:absolute;right:0;z-index:3}.plyr__preview-thumb__time-container span{color:#fff;font-size:13px;font-size:var(--plyr-font-size-time,var(--plyr-font-size-small,13px))}.plyr__preview-scrubbing{filter:blur(1px);height:100%;inset:0;margin:auto;opacity:0;overflow:hidden;pointer-events:none;position:absolute;transition:opacity .3s ease;width:100%;z-index:1}.plyr__preview-scrubbing--is-shown{opacity:1}.plyr__preview-scrubbing img{height:100%;left:0;max-height:none;max-width:none;object-fit:contain;position:absolute;top:0;width:100%}.plyr--no-transition{transition:none!important}.plyr__sr-only{clip:rect(1px,1px,1px,1px);border:0!important;height:1px!important;overflow:hidden;padding:0!important;position:absolute!important;width:1px!important}.plyr [hidden]{display:none!important}.tm-viewport[data-v-b1094b14]{width:100%;height:100%;display:flex;align-items:center;justify-content:center;touch-action:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.tm-media[data-v-b1094b14]{max-width:100%;max-height:100%;-o-object-fit:contain;object-fit:contain;-webkit-user-drag:none}.tm-video-wrap[data-v-b1094b14]{width:100%;max-width:800px;touch-action:auto}.plyr-video[data-v-b1094b14]{width:100%}.tm-audio-wrap[data-v-b1094b14]{display:flex;flex-direction:column;align-items:center;gap:20px;padding:24px;width:100%;max-width:400px;touch-action:auto}.plyr-audio[data-v-b1094b14]{width:100%}.audio-cover[data-v-b1094b14]{width:200px;height:200px;border-radius:12px;overflow:hidden;background:hsla(0,0%,100%,.1);display:flex;align-items:center;justify-content:center;box-shadow:0 8px 32px rgba(0,0,0,.3)}.cover-img[data-v-b1094b14]{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.audio-icon-large[data-v-b1094b14]{width:80px;height:80px;color:hsla(0,0%,100%,.4)}.audio-info[data-v-b1094b14]{text-align:center;width:100%}.audio-title[data-v-b1094b14]{font-size:18px;font-weight:600;color:#fff;margin-bottom:4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio-artist[data-v-b1094b14]{font-size:14px;color:hsla(0,0%,100%,.6)}.audio-placeholder[data-v-b1094b14],.video-placeholder[data-v-b1094b14]{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:16px;color:hsla(0,0%,100%,.4)}.video-placeholder svg[data-v-b1094b14]{width:80px;height:80px}.audio-placeholder .audio-name[data-v-b1094b14]{font-size:14px;color:hsla(0,0%,100%,.6);text-align:center;max-width:280px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.plyr{--plyr-color-main:#3b82f6}.plyr--audio .plyr__controls{background:hsla(0,0%,100%,.1);border-radius:8px}.plyr-custom-menu{position:relative;display:flex;align-items:center}.plyr-menu-btn{background:none;border:none;cursor:pointer;padding:8px;color:inherit;display:flex;align-items:center;justify-content:center}.plyr-menu-btn:hover{opacity:.8}.plyr-menu-dropdown{position:absolute;bottom:100%;right:0;background:#fff;border-radius:8px;box-shadow:0 4px 20px rgba(0,0,0,.3);min-width:160px;display:none;z-index:100;overflow:hidden;margin-bottom:8px}.plyr-menu-dropdown.show{display:block}.plyr-menu-item{display:flex;align-items:center;gap:12px;padding:12px 16px;cursor:pointer;color:#333;font-size:14px;transition:background .15s}.plyr-menu-item:hover{background:#f5f5f5}.plyr-menu-item svg{flex-shrink:0}.plyr-menu-item .arrow{margin-left:auto}.plyr-playmode-submenu,.plyr-speed-submenu{display:none;border-top:1px solid #eee}.plyr-playmode-submenu.show,.plyr-speed-submenu.show{display:block}.plyr-playmode-option,.plyr-speed-option{padding-left:32px;position:relative}.plyr-playmode-option.active,.plyr-speed-option.active{color:#3b82f6;font-weight:600}.plyr-playmode-option.active:before,.plyr-speed-option.active:before{content:"✓";position:absolute;left:12px}@media (max-width:768px),(pointer:coarse){.plyr--audio .plyr__volume{position:relative}.plyr--audio .plyr__volume input[type=range]{position:absolute;bottom:100%;left:50%;transform:translateX(-50%) rotate(-90deg);transform-origin:center center;width:80px;margin-bottom:40px;display:none}.plyr--audio .plyr__volume:focus-within input[type=range],.plyr--audio .plyr__volume:hover input[type=range]{display:block}.plyr--audio .plyr__volume:before{content:"";position:absolute;bottom:100%;left:50%;transform:translateX(-50%);width:36px;height:100px;background:rgba(0,0,0,.8);border-radius:8px;display:none;margin-bottom:8px}.plyr--audio .plyr__volume:focus-within:before,.plyr--audio .plyr__volume:hover:before{display:block}}#themeToggle[data-v-466b2b5c]{border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem}@media (max-width:768px){#themeToggle[data-v-466b2b5c]{width:2rem;height:2rem}}.theme_toggle_circle1[data-v-466b2b5c]{transition:cx .5s ease-in-out,cy .5s ease-in-out,r .5s ease-in-out}.theme_toggle_circle2[data-v-466b2b5c]{transition:all .5s ease-in-out;fill:var(--theme-toggle-bg-color)}.theme_toggle_svg[data-v-466b2b5c]{transition:transform .5s cubic-bezier(.68,-.55,.27,1.55);color:var(--theme-toggle-color)}.dark.theme_toggle_svg[data-v-466b2b5c]{transform:rotate(40deg)}.theme_toggle_g[data-v-466b2b5c]{transition:opacity .5s ease-in-out}.icon-fade-enter-active[data-v-466b2b5c],.icon-fade-leave-active[data-v-466b2b5c]{transition:opacity .3s ease-in-out,transform .3s ease-in-out}.icon-fade-enter-from[data-v-466b2b5c]{opacity:0;transform:scale(.8) rotate(-90deg)}.icon-fade-leave-to[data-v-466b2b5c]{opacity:0;transform:scale(.8) rotate(90deg)}.icon-fade-enter-to[data-v-466b2b5c],.icon-fade-leave-from[data-v-466b2b5c]{opacity:1;transform:scale(1) rotate(0deg)}.auto-icon[data-v-466b2b5c]{display:inline-block}.public-browse[data-v-40c0acc5]{min-height:100vh;background:#0a0a0a;color:#fff}.header[data-v-40c0acc5]{position:sticky;top:0;z-index:100;display:flex;align-items:center;justify-content:space-between;padding:16px 24px;background:hsla(0,0%,6%,.95);backdrop-filter:blur(10px);border-bottom:1px solid #1a1a1a;position:relative}.header-left[data-v-40c0acc5]{flex:0 0 auto;z-index:1;display:flex;align-items:center;gap:8px}.header-right[data-v-40c0acc5]{flex:0 0 auto;z-index:1;display:flex;align-items:center;gap:10px}.search-box[data-v-40c0acc5]{display:flex;align-items:center;justify-content:center;background:hsla(0,0%,100%,.1);border-radius:50%;width:28px;height:28px;padding:0;transition:all .3s ease;cursor:pointer}.search-box .search-icon[data-v-40c0acc5]{color:hsla(0,0%,100%,.8);display:flex;align-items:center;justify-content:center}.search-box .search-icon svg[data-v-40c0acc5]{width:14px;height:14px}.search-box.expanded[data-v-40c0acc5]{width:auto;min-width:160px;border-radius:14px;padding:4px 10px;background:rgba(30,30,30,.98);box-shadow:0 2px 12px rgba(0,0,0,.3)}.search-box.expanded .search-icon svg[data-v-40c0acc5]{width:12px;height:12px}.search-box.expanded .search-input[data-v-40c0acc5]{width:110px;font-size:12px}.search-box[data-v-40c0acc5]:focus-within{box-shadow:0 0 0 2px rgba(59,130,246,.5)}.search-input[data-v-40c0acc5]{background:transparent;border:none;outline:none;color:#fff;font-size:12px;transition:width .3s}.search-input[data-v-40c0acc5]::-moz-placeholder{color:hsla(0,0%,100%,.5);font-size:11px}.search-input[data-v-40c0acc5]::placeholder{color:hsla(0,0%,100%,.5);font-size:11px}.theme-toggle-btn[data-v-40c0acc5]{display:flex;align-items:center;justify-content:center;background:transparent;border-radius:8px;transition:background .2s}.theme-toggle-btn[data-v-40c0acc5]:hover{background:hsla(0,0%,100%,.1)}@media (max-width:600px){.header-right[data-v-40c0acc5]{gap:8px}.search-box[data-v-40c0acc5]{width:26px;height:26px}.search-box .search-icon svg[data-v-40c0acc5]{width:12px;height:12px}.search-box.expanded[data-v-40c0acc5]{min-width:140px;padding:3px 8px}.search-box.expanded .search-input[data-v-40c0acc5]{width:90px;font-size:11px}.search-box.expanded .search-icon svg[data-v-40c0acc5]{width:11px;height:11px}}.header-center[data-v-40c0acc5]{position:absolute;left:50%;transform:translateX(-50%);z-index:0}.logo[data-v-40c0acc5]{font-size:20px;font-weight:600;color:#fff;text-decoration:none;cursor:pointer;transition:opacity .2s}.logo[data-v-40c0acc5]:hover{opacity:.8}.breadcrumb[data-v-40c0acc5]{display:flex;align-items:center;gap:4px;font-size:14px}.breadcrumb-item[data-v-40c0acc5]{padding:6px 12px;border-radius:6px;cursor:pointer;transition:background .2s;color:#ccc}.breadcrumb-item[data-v-40c0acc5]:hover{background:#252525;color:#fff}.breadcrumb-sep[data-v-40c0acc5]{color:#444}.file-count[data-v-40c0acc5]{color:#666;font-size:14px}.error-container[data-v-40c0acc5],.loading-container[data-v-40c0acc5]{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:60vh;color:#666}.error-credit[data-v-40c0acc5]{margin-top:40px;text-align:center;color:hsla(0,0%,100%,.4);font-size:14px}.error-credit p[data-v-40c0acc5]{margin-bottom:12px}.error-credit-links[data-v-40c0acc5]{display:flex;gap:24px;justify-content:center}.error-credit-links a[data-v-40c0acc5]{display:flex;align-items:center;gap:6px;color:hsla(0,0%,100%,.5);text-decoration:none;transition:color .2s}.error-credit-links a[data-v-40c0acc5]:hover{color:#3b82f6}.loading-spinner[data-v-40c0acc5]{width:48px;height:48px;border:3px solid #222;border-top-color:#3b82f6;border-radius:50%;animation:spin-40c0acc5 1s linear infinite}.loading-spinner-small[data-v-40c0acc5]{width:24px;height:24px;border:2px solid #222;border-top-color:#3b82f6;border-radius:50%;animation:spin-40c0acc5 1s linear infinite}@keyframes spin-40c0acc5{to{transform:rotate(1turn)}}.retry-btn[data-v-40c0acc5]{margin-top:20px;padding:10px 32px;background:#3b82f6;border:none;border-radius:8px;color:#fff;font-size:14px;cursor:pointer;transition:background .2s}.retry-btn[data-v-40c0acc5]:hover{background:#2563eb}.gallery-container[data-v-40c0acc5]{padding:8px}@media (min-width:1200px){.gallery-container[data-v-40c0acc5]{max-width:1400px;margin:0 auto;padding:24px}}.folders-section[data-v-40c0acc5]{margin-bottom:24px}.folders-grid[data-v-40c0acc5]{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:16px}.folder-card[data-v-40c0acc5]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:24px 16px;background:#141414;border-radius:12px;border:1px solid #1a1a1a;cursor:pointer;transition:all .2s}.folder-card[data-v-40c0acc5]:hover{background:#1a1a1a;border-color:#333;transform:translateY(-2px)}.folder-icon[data-v-40c0acc5]{width:48px;height:48px;margin-bottom:12px;color:#555}.folder-icon svg[data-v-40c0acc5]{width:100%;height:100%}.folder-name[data-v-40c0acc5]{font-size:14px;color:#999;text-align:center;word-break:break-all}.waterfall[data-v-40c0acc5]{display:flex;gap:16px}.waterfall-column[data-v-40c0acc5]{flex:1;display:flex;flex-direction:column;gap:16px}.waterfall-item[data-v-40c0acc5]{cursor:pointer}.image-wrapper[data-v-40c0acc5]{position:relative;border-radius:12px;overflow:hidden;background:#141414;border:1px solid #1a1a1a;min-height:180px}.image-wrapper[data-v-40c0acc5]:before{content:"";position:absolute;inset:0;background:linear-gradient(90deg,#141414 25%,#1a1a1a 50%,#141414 75%);background-size:200% 100%;animation:shimmer-40c0acc5 1.5s infinite;z-index:1;pointer-events:none}.image-wrapper.loaded[data-v-40c0acc5]:before{display:none}.image-wrapper.loaded[data-v-40c0acc5]{min-height:auto}.image-wrapper img[data-v-40c0acc5],.image-wrapper video[data-v-40c0acc5]{width:100%;display:block;position:relative;z-index:2}@keyframes shimmer-40c0acc5{0%{background-position:200% 0}to{background-position:-200% 0}}.image-wrapper[data-v-40c0acc5]:hover{border-color:#333}.overlay[data-v-40c0acc5]{position:absolute;inset:0;background:linear-gradient(transparent 50%,rgba(0,0,0,.85));opacity:0;transition:opacity .2s;display:flex;align-items:flex-end;justify-content:flex-end;padding:12px;z-index:10}.image-wrapper:hover .overlay[data-v-40c0acc5]{opacity:1}.file-placeholder[data-v-40c0acc5]{width:100%;height:200px;display:flex;flex-direction:column;align-items:center;justify-content:center;background:#141414;color:#555;gap:12px;padding:16px;box-sizing:border-box}.file-placeholder svg[data-v-40c0acc5]{width:48px;height:48px}.file-name[data-v-40c0acc5]{font-size:12px;color:hsla(0,0%,100%,.7);text-align:center;word-break:break-all;max-width:100%;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}.audio-placeholder[data-v-40c0acc5]{width:100%;height:200px;display:flex;flex-direction:column;align-items:center;justify-content:center;background:linear-gradient(135deg,#1a1a2e,#16213e);gap:12px;padding:16px;box-sizing:border-box}.audio-icon[data-v-40c0acc5]{width:48px;height:48px;color:hsla(0,0%,100%,.6)}.audio-name[data-v-40c0acc5]{font-size:12px;color:hsla(0,0%,100%,.7);text-align:center;word-break:break-all;max-width:100%;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}.overlay-actions[data-v-40c0acc5]{display:flex;gap:8px}.action-btn[data-v-40c0acc5]{width:32px;height:32px;border:none;border-radius:50%;background:hsla(0,0%,100%,.08);backdrop-filter:blur(8px);cursor:pointer;transition:all .2s;display:flex;align-items:center;justify-content:center;color:hsla(0,0%,100%,.6)}.action-btn svg[data-v-40c0acc5]{width:16px;height:16px}.action-btn[data-v-40c0acc5]:hover{background:hsla(0,0%,100%,.2);color:#fff;transform:scale(1.1)}.load-trigger[data-v-40c0acc5]{display:flex;flex-direction:column;justify-content:center;align-items:center;padding:48px;min-height:100px}.floating-page-indicator[data-v-40c0acc5]{position:fixed;bottom:24px;right:24px;background:rgba(0,0,0,.6);backdrop-filter:blur(8px);color:hsla(0,0%,100%,.85);padding:6px 12px;border-radius:16px;font-size:12px;z-index:50;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;transition:opacity .3s}@media (max-width:600px){.floating-page-indicator[data-v-40c0acc5]{bottom:16px;right:16px;padding:4px 10px;font-size:11px;border-radius:12px}}.loading-more[data-v-40c0acc5]{display:flex;align-items:center;gap:12px;color:#666;font-size:14px}.no-more[data-v-40c0acc5]{color:#444;font-size:14px}.credit-link[data-v-40c0acc5]{display:block;margin-top:8px;color:#555;font-size:12px;text-decoration:none;transition:color .2s;text-align:center}.credit-link[data-v-40c0acc5]:hover{color:#888}.preview-modal[data-v-40c0acc5]{position:fixed;inset:0;z-index:1000;background:rgba(0,0,0,.97);display:flex;align-items:center;justify-content:center;overflow:hidden}.preview-content[data-v-40c0acc5]{padding:60px 80px;box-sizing:border-box;overflow:hidden}.preview-content-mobile[data-v-40c0acc5],.preview-content[data-v-40c0acc5]{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.preview-content-mobile[data-v-40c0acc5]{flex-direction:column;padding:0;position:absolute;top:0;left:0}.mobile-video-native[data-v-40c0acc5]{width:100%;height:100%;-o-object-fit:contain;object-fit:contain;background:#000}.mobile-audio-wrap[data-v-40c0acc5]{width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;box-sizing:border-box}.mobile-audio-wrap .swipe-hint[data-v-40c0acc5]{margin-top:20px}.swipe-hint[data-v-40c0acc5]{font-size:12px;color:hsla(0,0%,100%,.4)}.other-file-preview[data-v-40c0acc5]{width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;color:hsla(0,0%,100%,.6);gap:16px}.other-file-preview svg[data-v-40c0acc5]{width:64px;height:64px}.other-file-preview .file-name[data-v-40c0acc5]{font-size:14px;color:hsla(0,0%,100%,.7);text-align:center;padding:0 20px;word-break:break-all}.swipe-viewport[data-v-40c0acc5]{width:100%;height:100%;overflow:hidden;position:relative}.swipe-track[data-v-40c0acc5]{width:300%;height:100%;display:flex;will-change:transform}.swipe-slide[data-v-40c0acc5]{width:33.333%;flex-shrink:0;height:100%;display:flex;align-items:center;justify-content:center}.preview-image[data-v-40c0acc5],.preview-video[data-v-40c0acc5]{max-width:100%;max-height:100%;-o-object-fit:contain;object-fit:contain;-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-user-drag:none}.preview-close[data-v-40c0acc5]{position:fixed;top:20px;right:20px;background:hsla(0,0%,100%,.1);border:none;color:#fff;cursor:pointer;width:48px;height:48px;border-radius:50%;display:flex;align-items:center;justify-content:center;transition:background .2s;z-index:1010}.preview-close[data-v-40c0acc5]:hover{background:hsla(0,0%,100%,.2)}.preview-close svg[data-v-40c0acc5]{width:28px;height:28px}.page-indicator[data-v-40c0acc5]{position:fixed;bottom:30px;left:50%;transform:translateX(-50%);background:rgba(0,0,0,.6);color:hsla(0,0%,100%,.8);padding:8px 16px;border-radius:20px;font-size:14px;z-index:1010}.preview-next[data-v-40c0acc5],.preview-prev[data-v-40c0acc5]{position:fixed;top:50%;transform:translateY(-50%);background:hsla(0,0%,100%,.1);border:none;color:#fff;padding:16px;cursor:pointer;border-radius:50%;width:56px;height:56px;display:flex;align-items:center;justify-content:center;transition:background .2s;z-index:1010}.preview-next[data-v-40c0acc5]:hover,.preview-prev[data-v-40c0acc5]:hover{background:hsla(0,0%,100%,.2)}.preview-next svg[data-v-40c0acc5],.preview-prev svg[data-v-40c0acc5]{width:32px;height:32px}.preview-prev[data-v-40c0acc5]{left:20px}.preview-next[data-v-40c0acc5]{right:20px}.rotate-btn[data-v-40c0acc5]{position:fixed;bottom:30px;right:20px;background:hsla(0,0%,100%,.1);border:none;color:#fff;cursor:pointer;width:48px;height:48px;border-radius:50%;display:flex;align-items:center;justify-content:center;transition:background .2s;z-index:1010}.rotate-btn[data-v-40c0acc5]:hover{background:hsla(0,0%,100%,.2)}.rotate-btn svg[data-v-40c0acc5]{width:24px;height:24px}@media (max-width:768px){.page-indicator[data-v-40c0acc5]{bottom:40px}}@media (max-width:1199px) and (min-width:601px){.gallery-container[data-v-40c0acc5]{padding:12px}.waterfall-column[data-v-40c0acc5],.waterfall[data-v-40c0acc5]{gap:10px}.image-wrapper[data-v-40c0acc5]{border-radius:8px}}@media (max-width:600px){.header[data-v-40c0acc5]{padding:10px 12px}.header-left .logo[data-v-40c0acc5]{font-size:16px}.breadcrumb[data-v-40c0acc5]{font-size:12px}.breadcrumb-item[data-v-40c0acc5]{padding:4px 8px}.file-count[data-v-40c0acc5]{font-size:12px}.gallery-container[data-v-40c0acc5]{padding:6px}.waterfall-column[data-v-40c0acc5],.waterfall[data-v-40c0acc5]{gap:6px}.image-wrapper[data-v-40c0acc5]{border-radius:6px;min-height:120px}.folders-section[data-v-40c0acc5]{margin-bottom:12px}.folders-grid[data-v-40c0acc5]{grid-template-columns:repeat(2,1fr);gap:8px}.folder-card[data-v-40c0acc5]{padding:16px 12px;border-radius:8px}.folder-icon[data-v-40c0acc5]{width:36px;height:36px;margin-bottom:8px}.folder-name[data-v-40c0acc5]{font-size:12px}.load-trigger[data-v-40c0acc5]{padding:24px;min-height:60px}}.copy-toast{position:fixed;bottom:80px;left:50%;transform:translateX(-50%) translateY(20px);background:rgba(0,0,0,.8);color:#fff;padding:10px 24px;border-radius:20px;font-size:14px;opacity:0;transition:all .3s ease;z-index:9999;pointer-events:none}.copy-toast.show{opacity:1;transform:translateX(-50%) translateY(0)}:root:not(.dark) .public-browse[data-v-40c0acc5]{background:#f5f5f5;color:#333}:root:not(.dark) .header[data-v-40c0acc5]{background:hsla(0,0%,100%,.95);border-bottom-color:#e0e0e0}:root:not(.dark) .logo[data-v-40c0acc5]{color:#333}:root:not(.dark) .breadcrumb-item[data-v-40c0acc5]{color:#666}:root:not(.dark) .breadcrumb-item[data-v-40c0acc5]:hover{background:#e8e8e8;color:#333}:root:not(.dark) .breadcrumb-sep[data-v-40c0acc5]{color:#ccc}:root:not(.dark) .file-count[data-v-40c0acc5]{color:#999}:root:not(.dark) .search-box[data-v-40c0acc5]{background:rgba(0,0,0,.08)}:root:not(.dark) .search-box.expanded[data-v-40c0acc5]{background:hsla(0,0%,100%,.98);box-shadow:0 4px 20px rgba(0,0,0,.15)}:root:not(.dark) .search-box.expanded .search-input[data-v-40c0acc5]{color:#333}:root:not(.dark) .search-box.expanded .search-input[data-v-40c0acc5]::-moz-placeholder{color:rgba(0,0,0,.4)}:root:not(.dark) .search-box.expanded .search-input[data-v-40c0acc5]::placeholder{color:rgba(0,0,0,.4)}:root:not(.dark) .search-box .search-icon[data-v-40c0acc5]{color:rgba(0,0,0,.6)}:root:not(.dark) .search-box .search-icon[data-v-40c0acc5]:hover{color:#333}:root:not(.dark) .error-container[data-v-40c0acc5],:root:not(.dark) .loading-container[data-v-40c0acc5]{color:#999}:root:not(.dark) .error-credit[data-v-40c0acc5]{color:rgba(0,0,0,.4)}:root:not(.dark) .error-credit-links a[data-v-40c0acc5]{color:rgba(0,0,0,.5)}:root:not(.dark) .loading-spinner-small[data-v-40c0acc5],:root:not(.dark) .loading-spinner[data-v-40c0acc5]{border-color:#ddd;border-top-color:#3b82f6}:root:not(.dark) .folder-card[data-v-40c0acc5]{background:#fff;border-color:#e0e0e0}:root:not(.dark) .folder-card[data-v-40c0acc5]:hover{background:#fafafa;border-color:#ccc}:root:not(.dark) .folder-icon[data-v-40c0acc5]{color:#999}:root:not(.dark) .folder-name[data-v-40c0acc5]{color:#666}:root:not(.dark) .image-wrapper[data-v-40c0acc5]{background:#fff;border-color:#e0e0e0}:root:not(.dark) .image-wrapper[data-v-40c0acc5]:before{background:linear-gradient(90deg,#f5f5f5 25%,#fff 50%,#f5f5f5 75%)}:root:not(.dark) .image-wrapper[data-v-40c0acc5]:hover{border-color:#ccc}:root:not(.dark) .file-placeholder[data-v-40c0acc5]{background:#f5f5f5;color:#999}:root:not(.dark) .file-name[data-v-40c0acc5]{color:rgba(0,0,0,.6)}:root:not(.dark) .audio-placeholder[data-v-40c0acc5]{background:linear-gradient(135deg,#e8f4f8,#d4e5f7)}:root:not(.dark) .audio-icon[data-v-40c0acc5]{color:rgba(0,0,0,.4)}:root:not(.dark) .audio-name[data-v-40c0acc5]{color:rgba(0,0,0,.6)}:root:not(.dark) .no-more[data-v-40c0acc5]{color:#bbb}:root:not(.dark) .credit-link[data-v-40c0acc5]{color:#aaa}:root:not(.dark) .credit-link[data-v-40c0acc5]:hover{color:#666}:root:not(.dark) .loading-more[data-v-40c0acc5]{color:#999}:root:not(.dark) .theme-toggle-btn[data-v-40c0acc5]:hover{background:rgba(0,0,0,.08)}:root:not(.dark) .floating-page-indicator[data-v-40c0acc5]{background:hsla(0,0%,100%,.85);color:rgba(0,0,0,.7);box-shadow:0 2px 8px rgba(0,0,0,.1)} \ No newline at end of file diff --git a/css/667.a3c83e09.css.gz b/css/667.a3c83e09.css.gz new file mode 100644 index 0000000000000000000000000000000000000000..b935d054782b5f0e00f31ac018ec6cf220318b91 GIT binary patch literal 8626 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

J2w)yf0Bb~l@irlQRo-?09J zwQB`r@vgT`yc~a{%@YwW2e#eklW(1h@$ig+D17G^?gzE?u4V?shKXX|JK#w^yjpbk z`i|>1eXldQb=lh;zz5=Vm|L|9OuL4Mc?^5K6^)Dw#Yd7PMo(fLVX<)(hRiR06nmuO zxChmEM!-4qb(U-_KZ+z1_2QbT_ zWc7YAGZcndGAqLe(yak5IRm_9;QFvQti4ak0xl0v=5~gX*o7IyyGGk**4^*-np#%F zF0Baw7+F(13G{o(Zs@iyjS10>{Y=epYrmPXS+{vE`1YPO(Z*|;*>Ugx2l6*<++xxI E0G#0aga7~l literal 0 HcmV?d00001 diff --git a/css/72.15fbe389.css.gz b/css/72.15fbe389.css.gz deleted file mode 100644 index 64b15e9b6dde7e5f4528b062b80a2eef002d121c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8269 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 ImgHub

\ No newline at end of file +Sanyue ImgHub
\ No newline at end of file diff --git a/index.html.gz b/index.html.gz index 5f4fccf2ca4150b501326ff83b8b334dda492424..244b995e656f091e1ac71f911fc11c38ddc9c2c6 100644 GIT binary patch delta 409 zcmV;K0cQUH1O5Y$7%Lkz{Q_hI#V}yqX+tq=w?UR@ON}gQ679hMen^~kO^c!z0VMby z-y{^ckGzG@MwYdLWqv`Pv%}u&lrhs(%)0Posg%l+??ytC20GSH$0)Xe2xK*qjKL z)smEpMKIW5+FR~03CKy;qI%4gwqw{969z*mm)AGv?bYSwZTXl*BdZ1a9)*gr+^kir zx>mmc9#(W*iOw&(Z7!}Z&}?o?owHarnR)h@Eh3B8=zXL0=62@#R;%?}m}9%FC}Oo#orFk&gIV^>-I7h>E5&KwSWuhzJ!k=3HMI(+26XYU?s*aH9n D6YI%K delta 410 zcmV;L0cHOF1OEe%7%S5?{Q_hI#V}yqX~QsVw?UR@ON}gQ679hMen^~kO^c!z0VMby z-y{^ckGzG@MwYdLOqv`Pv%}u&lrhs(%t{Posg%l+^RFtC20G7sTJ3Xe2xK*qjKL z)smEpMKIW5+FR~03CKy;qI$@cwqw{969z*mm)AGz_UiKTwtUEYT;0$;`9IY!O+!MDH7&Z+C94Z?!sq4O1>OJf8NR4VeP0HF zLA4%D312;`jK>%p1JhwYE{s^p>ey9Q|AiPgfis5#->WrlYGk#jtqvdgFDz0(DcA!5 E0A7;Ja{vGU diff --git a/js/424.28a751ba.js b/js/289.8c3b6ce7.js similarity index 75% rename from js/424.28a751ba.js rename to js/289.8c3b6ce7.js index cfb5ba0..030b767 100644 --- a/js/424.28a751ba.js +++ b/js/289.8c3b6ce7.js @@ -1,4 +1,4 @@ -"use strict";(self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[424],{333:function(t,e,i){i(5331),i(6711)},1114:function(t,e,i){function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function n(t,e){if("object"!=s(t)||!t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,e||"default");if("object"!=s(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}function a(t){var e=n(t,"string");return"symbol"==s(e)?e:e+""}function o(t,e,i){return(e=a(e))in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}i.d(e,{A:function(){return o}})},2893:function(t,e,i){i(5331)},4396:function(t,e,i){i(5331),i(4885)},4424:function(t,e,i){i.r(e),i.d(e,{default:function(){return nu}});var s=i(6768),n=i(4232);const a={class:"menu-list"},o=["onClick"],r={class:"menu-text"};function l(t,e,i,l,h,c){const d=(0,s.g2)("font-awesome-icon");return(0,s.uX)(),(0,s.CE)("div",{class:(0,n.C4)(["sidebar-container",{"is-collapsed":i.isCollapse}])},[(0,s.Lk)("div",a,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(h.menuItems,t=>((0,s.uX)(),(0,s.CE)("div",{key:t.index,class:(0,n.C4)(["menu-item",{"is-active":i.activeIndex===t.index}]),onClick:e=>c.handleSelect(t.index)},[(0,s.bF)(d,{icon:t.icon,class:"menu-icon"},null,8,["icon"]),(0,s.Lk)("span",r,(0,n.v_)(t.title),1)],10,o))),128))]),(0,s.Lk)("div",{class:"toggle-button",onClick:e[0]||(e[0]=(...t)=>c.toggleCollapse&&c.toggleCollapse(...t))},[(0,s.bF)(d,{icon:i.isCollapse?"angle-double-right":"angle-double-left"},null,8,["icon"])])],2)}var h={name:"SysConfigTabs",props:{activeIndex:{type:String,default:"status"},isCollapse:{type:Boolean,default:!1}},data(){return{menuItems:[{index:"status",icon:"chart-bar",title:"系统状态"},{index:"upload",icon:"cloud-upload",title:"上传设置"},{index:"security",icon:"shield",title:"安全设置"},{index:"page",icon:"pager",title:"网页设置"},{index:"others",icon:"cog",title:"其他设置"}]}},methods:{toggleCollapse(){this.$emit("update:isCollapse",!this.isCollapse)},checkMobile(){const t=window.innerWidth<=768;this.$emit("update:isCollapse",t)},handleSelect(t){this.$emit("update:activeIndex",t)}},mounted(){this.checkMobile(),window.addEventListener("resize",this.checkMobile)},beforeDestroy(){window.removeEventListener("resize",this.checkMobile)}},c=i(1241);const d=(0,c.A)(h,[["render",l],["__scopeId","data-v-2bd8175a"]]);var u=d,g=i(4880),p=(i(5331),i(7128),i(8507)),f=(i(213),i(6011));const m={class:"container"},b={class:"header-content"},x={class:"header-action"};function y(t,e,i,a,o,r){const l=f.A,h=(0,s.g2)("font-awesome-icon"),c=p.R7,d=g.bZ,y=u;return(0,s.uX)(),(0,s.CE)("div",m,[(0,s.bF)(d,null,{default:(0,s.k6)(()=>[(0,s.Lk)("div",b,[(0,s.bF)(l,{activeTab:"systemConfig"}),(0,s.Lk)("div",x,[(0,s.bF)(c,{disabled:r.disableTooltip,content:"退出登录",placement:"bottom"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{icon:"sign-out-alt",class:"header-icon",onClick:r.handleLogout},null,8,["onClick"])]),_:1},8,["disabled"])])])]),_:1}),(0,s.bF)(y,{activeIndex:o.activeIndex,"onUpdate:activeIndex":e[0]||(e[0]=t=>o.activeIndex=t),isCollapse:o.isSidebarCollapse,"onUpdate:isCollapse":e[1]||(e[1]=t=>o.isSidebarCollapse=t)},null,8,["activeIndex","isCollapse"]),((0,s.uX)(),(0,s.Wv)((0,s.$y)(r.currentComponent),{class:(0,n.C4)(["main-container",{collapsed:o.isSidebarCollapse}])},null,8,["class"]))])}i(4114);var _=i(9114),v=(i(694),i(7009)),k=(i(8450),i(47));i(9648);const w={class:"status-panel"},S={class:"overview-cards"},M={class:"card-icon"},C={class:"card-content"},F={class:"card-value"},A={class:"overview-card index-status"},P={class:"card-icon"},T={class:"card-content"},L={class:"card-value"},D={class:"card-subtitle"},V={class:"card-icon"},I={class:"card-content"},E={class:"card-value"},O={class:"charts-section"},R={class:"chart-card"},W={class:"chart-header"},z={class:"chart-content"},B={key:0,class:"empty-state"},U={key:1,class:"pie-chart-container"},N={class:"pie-chart-wrapper"},j={class:"chart-center-text"},$={class:"center-value"},H={class:"chart-legend"},q={class:"legend-label"},X={class:"legend-value"},Y={class:"legend-percent"},K={class:"chart-card"},Q={class:"chart-header"},G={class:"chart-content"},J={key:0,class:"empty-state"},Z={key:1,class:"pie-chart-container"},tt={class:"pie-chart-wrapper"},et={class:"chart-center-text"},it={class:"center-value"},st={class:"chart-legend"},nt={class:"legend-label"},at={class:"legend-value"},ot={class:"legend-percent"},rt={class:"actions-section"},lt={class:"action-card"},ht={class:"action-header"},ct={class:"action-content"},dt={class:"action-buttons"},ut={class:"restore-section"},gt={key:0,class:"file-info-section"},pt={key:0,class:"file-info-card info-card-newest"},ft={class:"card-bg-wrapper"},mt=["src"],bt={key:2,class:"card-bg-fallback"},xt={class:"info-card-overlay"},yt={class:"info-card-header"},_t={class:"header-badge"},vt={class:"info-card-content"},kt={class:"info-details"},wt={class:"file-name"},St={class:"file-meta"},Mt={key:1,class:"file-info-card info-card-oldest"},Ct={class:"card-bg-wrapper"},Ft=["src"],At={key:2,class:"card-bg-fallback"},Pt={class:"info-card-overlay"},Tt={class:"info-card-header"},Lt={class:"header-badge warning"},Dt={class:"info-card-content"},Vt={class:"info-details"},It={class:"file-name"},Et={class:"file-meta"};function Ot(t,e,i,a,o,r){const l=(0,s.g2)("font-awesome-icon"),h=(0,s.g2)("Doughnut"),c=k.S2,d=p.R7,u=v.Zq,g=_.A;return(0,s.bo)(((0,s.uX)(),(0,s.CE)("div",w,[(0,s.Lk)("div",S,[(0,s.Lk)("div",{class:"overview-card total-files",onClick:e[0]||(e[0]=(...t)=>r.fetchIndexInfo&&r.fetchIndexInfo(...t))},[(0,s.Lk)("div",M,[(0,s.bF)(l,{icon:"database"})]),(0,s.Lk)("div",C,[e[7]||(e[7]=(0,s.Lk)("div",{class:"card-title"},"文件总数",-1)),(0,s.Lk)("div",F,(0,n.v_)(o.indexInfo.totalFiles?.toLocaleString()||"0"),1),e[8]||(e[8]=(0,s.Lk)("div",{class:"card-subtitle"},"点击刷新",-1))])]),(0,s.Lk)("div",A,[(0,s.Lk)("div",P,[(0,s.bF)(l,{icon:"clock"})]),(0,s.Lk)("div",T,[e[9]||(e[9]=(0,s.Lk)("div",{class:"card-title"},"索引更新时间",-1)),(0,s.Lk)("div",L,(0,n.v_)(r.formatTime(o.indexInfo.lastUpdated)),1),(0,s.Lk)("div",D,(0,n.v_)(r.getTimeAgo(o.indexInfo.lastUpdated)),1)])]),(0,s.Lk)("div",{class:"overview-card system-version",onClick:e[1]||(e[1]=(...t)=>r.openReleases&&r.openReleases(...t))},[(0,s.Lk)("div",V,[(0,s.bF)(l,{icon:"code-branch"})]),(0,s.Lk)("div",I,[e[10]||(e[10]=(0,s.Lk)("div",{class:"card-title"},"系统版本",-1)),(0,s.Lk)("div",E,"v"+(0,n.v_)(o.version),1),e[11]||(e[11]=(0,s.Lk)("div",{class:"card-subtitle"},"点击查看更新日志",-1))])])]),(0,s.Lk)("div",O,[(0,s.Lk)("div",R,[(0,s.Lk)("div",W,[(0,s.bF)(l,{icon:"share-alt"}),e[12]||(e[12]=(0,s.Lk)("span",null,"上传渠道分布",-1))]),(0,s.Lk)("div",z,[0===Object.keys(o.indexInfo.channelStats||{}).length?((0,s.uX)(),(0,s.CE)("div",B,[(0,s.bF)(l,{icon:"inbox"}),e[13]||(e[13]=(0,s.Lk)("span",null,"暂无数据",-1))])):((0,s.uX)(),(0,s.CE)("div",U,[(0,s.Lk)("div",N,[(0,s.bF)(h,{data:r.channelChartData,options:r.chartOptions},null,8,["data","options"]),(0,s.Lk)("div",j,[(0,s.Lk)("div",$,(0,n.v_)(o.indexInfo.totalFiles?.toLocaleString()||"0"),1),e[14]||(e[14]=(0,s.Lk)("div",{class:"center-label"},"文件总数",-1))])]),(0,s.Lk)("div",H,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(o.indexInfo.channelStats,(t,e,i)=>((0,s.uX)(),(0,s.CE)("div",{key:e,class:"legend-item"},[(0,s.Lk)("span",{class:"legend-color",style:(0,n.Tr)({background:r.getChartColor(i)})},null,4),(0,s.Lk)("span",q,(0,n.v_)(e),1),(0,s.Lk)("span",X,(0,n.v_)(t.toLocaleString()),1),(0,s.Lk)("span",Y,(0,n.v_)(r.getPercentage(t,o.indexInfo.totalFiles))+"%",1)]))),128))])]))])]),(0,s.Lk)("div",K,[(0,s.Lk)("div",Q,[(0,s.bF)(l,{icon:"file-alt"}),e[15]||(e[15]=(0,s.Lk)("span",null,"文件状态分布",-1))]),(0,s.Lk)("div",G,[0===Object.keys(o.indexInfo.typeStats||{}).length?((0,s.uX)(),(0,s.CE)("div",J,[(0,s.bF)(l,{icon:"inbox"}),e[16]||(e[16]=(0,s.Lk)("span",null,"暂无数据",-1))])):((0,s.uX)(),(0,s.CE)("div",Z,[(0,s.Lk)("div",tt,[(0,s.bF)(h,{data:r.typeChartData,options:r.chartOptions},null,8,["data","options"]),(0,s.Lk)("div",et,[(0,s.Lk)("div",it,(0,n.v_)(Object.keys(o.indexInfo.typeStats).length),1),e[17]||(e[17]=(0,s.Lk)("div",{class:"center-label"},"状态类型",-1))])]),(0,s.Lk)("div",st,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(o.indexInfo.typeStats,(t,e,i)=>((0,s.uX)(),(0,s.CE)("div",{key:e,class:"legend-item"},[(0,s.Lk)("span",{class:"legend-color",style:(0,n.Tr)({background:r.getTypeChartColor(i)})},null,4),(0,s.Lk)("span",nt,(0,n.v_)(e||"未知类型"),1),(0,s.Lk)("span",at,(0,n.v_)(t.toLocaleString()),1),(0,s.Lk)("span",ot,(0,n.v_)(r.getPercentage(t,o.indexInfo.totalFiles))+"%",1)]))),128))])]))])])]),(0,s.Lk)("div",rt,[(0,s.Lk)("div",lt,[(0,s.Lk)("div",ht,[(0,s.bF)(l,{icon:"tools"}),e[18]||(e[18]=(0,s.Lk)("span",null,"系统维护",-1))]),(0,s.Lk)("div",ct,[(0,s.Lk)("div",dt,[(0,s.bF)(d,{content:"重新扫描所有文件并更新索引数据,适用于数据不一致时的修复",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(c,{type:"primary",loading:o.rebuilding,onClick:r.rebuildIndex,class:"action-btn rebuild-btn"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"sync-alt"}),(0,s.eW)(" "+(0,n.v_)(o.rebuilding?"重建中...":"重建索引"),1)]),_:1},8,["loading","onClick"])]),_:1}),(0,s.bF)(d,{content:"备份所有文件元数据和系统设置到JSON文件",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(c,{type:"success",loading:o.backing,onClick:r.backupData,class:"action-btn backup-btn"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"download"}),(0,s.eW)(" "+(0,n.v_)(o.backing?"备份中...":"备份数据"),1)]),_:1},8,["loading","onClick"])]),_:1}),(0,s.bF)(d,{content:"从备份文件恢复数据,将覆盖现有的文件元数据和系统设置",placement:"top"},{default:(0,s.k6)(()=>[(0,s.Lk)("div",ut,[(0,s.Lk)("input",{type:"file",ref:"fileInput",accept:".json",onChange:e[2]||(e[2]=(...t)=>r.handleFileSelect&&r.handleFileSelect(...t)),style:{display:"none"}},null,544),(0,s.bF)(c,{type:"warning",loading:o.restoring,onClick:r.selectRestoreFile,class:"action-btn restore-btn"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"upload"}),(0,s.eW)(" "+(0,n.v_)(o.restoring?"恢复中...":"恢复数据"),1)]),_:1},8,["loading","onClick"])])]),_:1})])])])]),o.indexInfo.newestFile||o.indexInfo.oldestFile?((0,s.uX)(),(0,s.CE)("div",gt,[o.indexInfo.newestFile?((0,s.uX)(),(0,s.CE)("div",pt,[(0,s.Lk)("div",ft,[r.isImageFile(o.indexInfo.newestFile)&&!o.loadErrors["newest"]?((0,s.uX)(),(0,s.Wv)(u,{key:0,src:"/file/"+o.indexInfo.newestFile.id+"?from=admin",fit:"cover",class:"card-bg-media",onError:e[3]||(e[3]=t=>r.handleImageError("newest"))},null,8,["src"])):r.isVideoFile(o.indexInfo.newestFile)&&!o.loadErrors["newest"]?((0,s.uX)(),(0,s.CE)("video",{key:1,src:"/file/"+o.indexInfo.newestFile.id+"?from=admin",class:"card-bg-media",muted:"",loop:"",autoplay:"",onError:e[4]||(e[4]=t=>r.handleImageError("newest"))},null,40,mt)):((0,s.uX)(),(0,s.CE)("div",bt,[(0,s.bF)(l,{icon:"file-alt",class:"fallback-icon"})]))]),(0,s.Lk)("div",xt,[(0,s.Lk)("div",yt,[(0,s.Lk)("div",_t,[(0,s.bF)(l,{icon:"arrow-up"}),e[19]||(e[19]=(0,s.Lk)("span",null,"最近上传",-1))])]),(0,s.Lk)("div",vt,[(0,s.Lk)("div",kt,[(0,s.Lk)("div",wt,(0,n.v_)(o.indexInfo.newestFile.metadata?.FileName||o.indexInfo.newestFile.id),1),(0,s.Lk)("div",St,(0,n.v_)(r.formatTime(o.indexInfo.newestFile.metadata?.TimeStamp)),1)])])])])):(0,s.Q3)("",!0),o.indexInfo.oldestFile?((0,s.uX)(),(0,s.CE)("div",Mt,[(0,s.Lk)("div",Ct,[r.isImageFile(o.indexInfo.oldestFile)&&!o.loadErrors["oldest"]?((0,s.uX)(),(0,s.Wv)(u,{key:0,src:"/file/"+o.indexInfo.oldestFile.id+"?from=admin",fit:"cover",class:"card-bg-media",onError:e[5]||(e[5]=t=>r.handleImageError("oldest"))},null,8,["src"])):r.isVideoFile(o.indexInfo.oldestFile)&&!o.loadErrors["oldest"]?((0,s.uX)(),(0,s.CE)("video",{key:1,src:"/file/"+o.indexInfo.oldestFile.id+"?from=admin",class:"card-bg-media",muted:"",loop:"",autoplay:"",onError:e[6]||(e[6]=t=>r.handleImageError("oldest"))},null,40,Ft)):((0,s.uX)(),(0,s.CE)("div",At,[(0,s.bF)(l,{icon:"file-alt",class:"fallback-icon"})]))]),(0,s.Lk)("div",Pt,[(0,s.Lk)("div",Tt,[(0,s.Lk)("div",Lt,[(0,s.bF)(l,{icon:"arrow-down"}),e[20]||(e[20]=(0,s.Lk)("span",null,"最早上传",-1))])]),(0,s.Lk)("div",Dt,[(0,s.Lk)("div",Vt,[(0,s.Lk)("div",It,(0,n.v_)(o.indexInfo.oldestFile.metadata?.FileName||o.indexInfo.oldestFile.id),1),(0,s.Lk)("div",Et,(0,n.v_)(r.formatTime(o.indexInfo.oldestFile.metadata?.TimeStamp)),1)])])])])):(0,s.Q3)("",!0)])):(0,s.Q3)("",!0)])),[[g,o.loading]])}i(8111),i(1701),i(8237),i(4603),i(7566),i(8721);var Rt=i(797),Wt={rE:"2.4.4"},zt=(i(116),i(1114));i(2489),i(7588),i(3579),i(7642),i(8004),i(3853),i(5876),i(2475),i(5024),i(1698),i(3110); +"use strict";(self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[289],{333:function(t,e,i){i(5331),i(6711)},1114:function(t,e,i){function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function n(t,e){if("object"!=s(t)||!t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var n=i.call(t,e||"default");if("object"!=s(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}function a(t){var e=n(t,"string");return"symbol"==s(e)?e:e+""}function o(t,e,i){return(e=a(e))in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}i.d(e,{A:function(){return o}})},2893:function(t,e,i){i(5331)},4396:function(t,e,i){i(5331),i(4885)},4752:function(t,e,i){i(5331),i(8736),i(8785)},4885:function(t,e,i){i(5331)},5289:function(t,e,i){i.r(e),i.d(e,{default:function(){return au}});var s=i(6768),n=i(4232);const a={class:"menu-list"},o=["onClick"],r={class:"menu-text"};function l(t,e,i,l,h,c){const d=(0,s.g2)("font-awesome-icon");return(0,s.uX)(),(0,s.CE)("div",{class:(0,n.C4)(["sidebar-container",{"is-collapsed":i.isCollapse}])},[(0,s.Lk)("div",a,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(h.menuItems,t=>((0,s.uX)(),(0,s.CE)("div",{key:t.index,class:(0,n.C4)(["menu-item",{"is-active":i.activeIndex===t.index}]),onClick:e=>c.handleSelect(t.index)},[(0,s.bF)(d,{icon:t.icon,class:"menu-icon"},null,8,["icon"]),(0,s.Lk)("span",r,(0,n.v_)(t.title),1)],10,o))),128))]),(0,s.Lk)("div",{class:"toggle-button",onClick:e[0]||(e[0]=(...t)=>c.toggleCollapse&&c.toggleCollapse(...t))},[(0,s.bF)(d,{icon:i.isCollapse?"angle-double-right":"angle-double-left"},null,8,["icon"])])],2)}var h={name:"SysConfigTabs",props:{activeIndex:{type:String,default:"status"},isCollapse:{type:Boolean,default:!1}},data(){return{menuItems:[{index:"status",icon:"chart-bar",title:"系统状态"},{index:"upload",icon:"cloud-upload",title:"上传设置"},{index:"security",icon:"shield",title:"安全设置"},{index:"page",icon:"pager",title:"网页设置"},{index:"others",icon:"cog",title:"其他设置"}]}},methods:{toggleCollapse(){this.$emit("update:isCollapse",!this.isCollapse)},checkMobile(){const t=window.innerWidth<=768;this.$emit("update:isCollapse",t)},handleSelect(t){this.$emit("update:activeIndex",t)}},mounted(){this.checkMobile(),window.addEventListener("resize",this.checkMobile)},beforeDestroy(){window.removeEventListener("resize",this.checkMobile)}},c=i(1241);const d=(0,c.A)(h,[["render",l],["__scopeId","data-v-2bd8175a"]]);var u=d,g=i(4880),p=(i(5331),i(7128),i(8507)),f=(i(213),i(6011));const m={class:"container"},b={class:"header-content"},x={class:"header-action"};function y(t,e,i,a,o,r){const l=f.A,h=(0,s.g2)("font-awesome-icon"),c=p.R7,d=g.bZ,y=u;return(0,s.uX)(),(0,s.CE)("div",m,[(0,s.bF)(d,null,{default:(0,s.k6)(()=>[(0,s.Lk)("div",b,[(0,s.bF)(l,{activeTab:"systemConfig"}),(0,s.Lk)("div",x,[(0,s.bF)(c,{disabled:r.disableTooltip,content:"退出登录",placement:"bottom"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{icon:"sign-out-alt",class:"header-icon",onClick:r.handleLogout},null,8,["onClick"])]),_:1},8,["disabled"])])])]),_:1}),(0,s.bF)(y,{activeIndex:o.activeIndex,"onUpdate:activeIndex":e[0]||(e[0]=t=>o.activeIndex=t),isCollapse:o.isSidebarCollapse,"onUpdate:isCollapse":e[1]||(e[1]=t=>o.isSidebarCollapse=t)},null,8,["activeIndex","isCollapse"]),((0,s.uX)(),(0,s.Wv)((0,s.$y)(r.currentComponent),{class:(0,n.C4)(["main-container",{collapsed:o.isSidebarCollapse}])},null,8,["class"]))])}i(4114);var _=i(9114),v=(i(694),i(7009)),k=(i(8450),i(47));i(9648);const w={class:"status-panel"},S={class:"overview-cards"},M={class:"card-icon"},C={class:"card-content"},F={class:"card-value"},A={class:"overview-card index-status"},P={class:"card-icon"},T={class:"card-content"},L={class:"card-value"},D={class:"card-subtitle"},V={class:"card-icon"},I={class:"card-content"},E={class:"card-value"},O={class:"charts-section"},R={class:"chart-card"},W={class:"chart-header"},z={class:"chart-content"},B={key:0,class:"empty-state"},U={key:1,class:"pie-chart-container"},N={class:"pie-chart-wrapper"},j={class:"chart-center-text"},$={class:"center-value"},H={class:"chart-legend"},q={class:"legend-label"},X={class:"legend-value"},Y={class:"legend-percent"},K={class:"chart-card"},Q={class:"chart-header"},G={class:"chart-content"},J={key:0,class:"empty-state"},Z={key:1,class:"pie-chart-container"},tt={class:"pie-chart-wrapper"},et={class:"chart-center-text"},it={class:"center-value"},st={class:"chart-legend"},nt={class:"legend-label"},at={class:"legend-value"},ot={class:"legend-percent"},rt={class:"actions-section"},lt={class:"action-card"},ht={class:"action-header"},ct={class:"action-content"},dt={class:"action-buttons"},ut={class:"restore-section"},gt={key:0,class:"file-info-section"},pt={key:0,class:"file-info-card info-card-newest"},ft={class:"card-bg-wrapper"},mt=["src"],bt={key:2,class:"card-bg-fallback"},xt={class:"info-card-overlay"},yt={class:"info-card-header"},_t={class:"header-badge"},vt={class:"info-card-content"},kt={class:"info-details"},wt={class:"file-name"},St={class:"file-meta"},Mt={key:1,class:"file-info-card info-card-oldest"},Ct={class:"card-bg-wrapper"},Ft=["src"],At={key:2,class:"card-bg-fallback"},Pt={class:"info-card-overlay"},Tt={class:"info-card-header"},Lt={class:"header-badge warning"},Dt={class:"info-card-content"},Vt={class:"info-details"},It={class:"file-name"},Et={class:"file-meta"};function Ot(t,e,i,a,o,r){const l=(0,s.g2)("font-awesome-icon"),h=(0,s.g2)("Doughnut"),c=k.S2,d=p.R7,u=v.Zq,g=_.A;return(0,s.bo)(((0,s.uX)(),(0,s.CE)("div",w,[(0,s.Lk)("div",S,[(0,s.Lk)("div",{class:"overview-card total-files",onClick:e[0]||(e[0]=(...t)=>r.fetchIndexInfo&&r.fetchIndexInfo(...t))},[(0,s.Lk)("div",M,[(0,s.bF)(l,{icon:"database"})]),(0,s.Lk)("div",C,[e[7]||(e[7]=(0,s.Lk)("div",{class:"card-title"},"文件总数",-1)),(0,s.Lk)("div",F,(0,n.v_)(o.indexInfo.totalFiles?.toLocaleString()||"0"),1),e[8]||(e[8]=(0,s.Lk)("div",{class:"card-subtitle"},"点击刷新",-1))])]),(0,s.Lk)("div",A,[(0,s.Lk)("div",P,[(0,s.bF)(l,{icon:"clock"})]),(0,s.Lk)("div",T,[e[9]||(e[9]=(0,s.Lk)("div",{class:"card-title"},"索引更新时间",-1)),(0,s.Lk)("div",L,(0,n.v_)(r.formatTime(o.indexInfo.lastUpdated)),1),(0,s.Lk)("div",D,(0,n.v_)(r.getTimeAgo(o.indexInfo.lastUpdated)),1)])]),(0,s.Lk)("div",{class:"overview-card system-version",onClick:e[1]||(e[1]=(...t)=>r.openReleases&&r.openReleases(...t))},[(0,s.Lk)("div",V,[(0,s.bF)(l,{icon:"code-branch"})]),(0,s.Lk)("div",I,[e[10]||(e[10]=(0,s.Lk)("div",{class:"card-title"},"系统版本",-1)),(0,s.Lk)("div",E,"v"+(0,n.v_)(o.version),1),e[11]||(e[11]=(0,s.Lk)("div",{class:"card-subtitle"},"点击查看更新日志",-1))])])]),(0,s.Lk)("div",O,[(0,s.Lk)("div",R,[(0,s.Lk)("div",W,[(0,s.bF)(l,{icon:"share-alt"}),e[12]||(e[12]=(0,s.Lk)("span",null,"上传渠道分布",-1))]),(0,s.Lk)("div",z,[0===Object.keys(o.indexInfo.channelStats||{}).length?((0,s.uX)(),(0,s.CE)("div",B,[(0,s.bF)(l,{icon:"inbox"}),e[13]||(e[13]=(0,s.Lk)("span",null,"暂无数据",-1))])):((0,s.uX)(),(0,s.CE)("div",U,[(0,s.Lk)("div",N,[(0,s.bF)(h,{data:r.channelChartData,options:r.chartOptions},null,8,["data","options"]),(0,s.Lk)("div",j,[(0,s.Lk)("div",$,(0,n.v_)(o.indexInfo.totalFiles?.toLocaleString()||"0"),1),e[14]||(e[14]=(0,s.Lk)("div",{class:"center-label"},"文件总数",-1))])]),(0,s.Lk)("div",H,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(o.indexInfo.channelStats,(t,e,i)=>((0,s.uX)(),(0,s.CE)("div",{key:e,class:"legend-item"},[(0,s.Lk)("span",{class:"legend-color",style:(0,n.Tr)({background:r.getChartColor(i)})},null,4),(0,s.Lk)("span",q,(0,n.v_)(e),1),(0,s.Lk)("span",X,(0,n.v_)(t.toLocaleString()),1),(0,s.Lk)("span",Y,(0,n.v_)(r.getPercentage(t,o.indexInfo.totalFiles))+"%",1)]))),128))])]))])]),(0,s.Lk)("div",K,[(0,s.Lk)("div",Q,[(0,s.bF)(l,{icon:"file-alt"}),e[15]||(e[15]=(0,s.Lk)("span",null,"文件状态分布",-1))]),(0,s.Lk)("div",G,[0===Object.keys(o.indexInfo.typeStats||{}).length?((0,s.uX)(),(0,s.CE)("div",J,[(0,s.bF)(l,{icon:"inbox"}),e[16]||(e[16]=(0,s.Lk)("span",null,"暂无数据",-1))])):((0,s.uX)(),(0,s.CE)("div",Z,[(0,s.Lk)("div",tt,[(0,s.bF)(h,{data:r.typeChartData,options:r.chartOptions},null,8,["data","options"]),(0,s.Lk)("div",et,[(0,s.Lk)("div",it,(0,n.v_)(Object.keys(o.indexInfo.typeStats).length),1),e[17]||(e[17]=(0,s.Lk)("div",{class:"center-label"},"状态类型",-1))])]),(0,s.Lk)("div",st,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(o.indexInfo.typeStats,(t,e,i)=>((0,s.uX)(),(0,s.CE)("div",{key:e,class:"legend-item"},[(0,s.Lk)("span",{class:"legend-color",style:(0,n.Tr)({background:r.getTypeChartColor(i)})},null,4),(0,s.Lk)("span",nt,(0,n.v_)(e||"未知类型"),1),(0,s.Lk)("span",at,(0,n.v_)(t.toLocaleString()),1),(0,s.Lk)("span",ot,(0,n.v_)(r.getPercentage(t,o.indexInfo.totalFiles))+"%",1)]))),128))])]))])])]),(0,s.Lk)("div",rt,[(0,s.Lk)("div",lt,[(0,s.Lk)("div",ht,[(0,s.bF)(l,{icon:"tools"}),e[18]||(e[18]=(0,s.Lk)("span",null,"系统维护",-1))]),(0,s.Lk)("div",ct,[(0,s.Lk)("div",dt,[(0,s.bF)(d,{content:"重新扫描所有文件并更新索引数据,适用于数据不一致时的修复",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(c,{type:"primary",loading:o.rebuilding,onClick:r.rebuildIndex,class:"action-btn rebuild-btn"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"sync-alt"}),(0,s.eW)(" "+(0,n.v_)(o.rebuilding?"重建中...":"重建索引"),1)]),_:1},8,["loading","onClick"])]),_:1}),(0,s.bF)(d,{content:"备份所有文件元数据和系统设置到JSON文件",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(c,{type:"success",loading:o.backing,onClick:r.backupData,class:"action-btn backup-btn"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"download"}),(0,s.eW)(" "+(0,n.v_)(o.backing?"备份中...":"备份数据"),1)]),_:1},8,["loading","onClick"])]),_:1}),(0,s.bF)(d,{content:"从备份文件恢复数据,将覆盖现有的文件元数据和系统设置",placement:"top"},{default:(0,s.k6)(()=>[(0,s.Lk)("div",ut,[(0,s.Lk)("input",{type:"file",ref:"fileInput",accept:".json",onChange:e[2]||(e[2]=(...t)=>r.handleFileSelect&&r.handleFileSelect(...t)),style:{display:"none"}},null,544),(0,s.bF)(c,{type:"warning",loading:o.restoring,onClick:r.selectRestoreFile,class:"action-btn restore-btn"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"upload"}),(0,s.eW)(" "+(0,n.v_)(o.restoring?"恢复中...":"恢复数据"),1)]),_:1},8,["loading","onClick"])])]),_:1})])])])]),o.indexInfo.newestFile||o.indexInfo.oldestFile?((0,s.uX)(),(0,s.CE)("div",gt,[o.indexInfo.newestFile?((0,s.uX)(),(0,s.CE)("div",pt,[(0,s.Lk)("div",ft,[r.isImageFile(o.indexInfo.newestFile)&&!o.loadErrors["newest"]?((0,s.uX)(),(0,s.Wv)(u,{key:0,src:"/file/"+o.indexInfo.newestFile.id+"?from=admin",fit:"cover",class:"card-bg-media",onError:e[3]||(e[3]=t=>r.handleImageError("newest"))},null,8,["src"])):r.isVideoFile(o.indexInfo.newestFile)&&!o.loadErrors["newest"]?((0,s.uX)(),(0,s.CE)("video",{key:1,src:"/file/"+o.indexInfo.newestFile.id+"?from=admin",class:"card-bg-media",muted:"",loop:"",autoplay:"",onError:e[4]||(e[4]=t=>r.handleImageError("newest"))},null,40,mt)):((0,s.uX)(),(0,s.CE)("div",bt,[(0,s.bF)(l,{icon:"file-alt",class:"fallback-icon"})]))]),(0,s.Lk)("div",xt,[(0,s.Lk)("div",yt,[(0,s.Lk)("div",_t,[(0,s.bF)(l,{icon:"arrow-up"}),e[19]||(e[19]=(0,s.Lk)("span",null,"最近上传",-1))])]),(0,s.Lk)("div",vt,[(0,s.Lk)("div",kt,[(0,s.Lk)("div",wt,(0,n.v_)(o.indexInfo.newestFile.metadata?.FileName||o.indexInfo.newestFile.id),1),(0,s.Lk)("div",St,(0,n.v_)(r.formatTime(o.indexInfo.newestFile.metadata?.TimeStamp)),1)])])])])):(0,s.Q3)("",!0),o.indexInfo.oldestFile?((0,s.uX)(),(0,s.CE)("div",Mt,[(0,s.Lk)("div",Ct,[r.isImageFile(o.indexInfo.oldestFile)&&!o.loadErrors["oldest"]?((0,s.uX)(),(0,s.Wv)(u,{key:0,src:"/file/"+o.indexInfo.oldestFile.id+"?from=admin",fit:"cover",class:"card-bg-media",onError:e[5]||(e[5]=t=>r.handleImageError("oldest"))},null,8,["src"])):r.isVideoFile(o.indexInfo.oldestFile)&&!o.loadErrors["oldest"]?((0,s.uX)(),(0,s.CE)("video",{key:1,src:"/file/"+o.indexInfo.oldestFile.id+"?from=admin",class:"card-bg-media",muted:"",loop:"",autoplay:"",onError:e[6]||(e[6]=t=>r.handleImageError("oldest"))},null,40,Ft)):((0,s.uX)(),(0,s.CE)("div",At,[(0,s.bF)(l,{icon:"file-alt",class:"fallback-icon"})]))]),(0,s.Lk)("div",Pt,[(0,s.Lk)("div",Tt,[(0,s.Lk)("div",Lt,[(0,s.bF)(l,{icon:"arrow-down"}),e[20]||(e[20]=(0,s.Lk)("span",null,"最早上传",-1))])]),(0,s.Lk)("div",Dt,[(0,s.Lk)("div",Vt,[(0,s.Lk)("div",It,(0,n.v_)(o.indexInfo.oldestFile.metadata?.FileName||o.indexInfo.oldestFile.id),1),(0,s.Lk)("div",Et,(0,n.v_)(r.formatTime(o.indexInfo.oldestFile.metadata?.TimeStamp)),1)])])])])):(0,s.Q3)("",!0)])):(0,s.Q3)("",!0)])),[[g,o.loading]])}i(8111),i(1701),i(8237),i(4603),i(7566),i(8721);var Rt=i(797),Wt={rE:"2.4.5"},zt=(i(116),i(1114));i(2489),i(7588),i(3579),i(7642),i(8004),i(3853),i(5876),i(2475),i(5024),i(1698),i(3110); /*! * @kurkle/color v0.3.4 * https://github.com/kurkle/color#readme @@ -19,5 +19,5 @@ function Le(){}const De=(()=>{let t=0;return()=>t++})();function Ve(t){return nu * (c) 2025 Chart.js Contributors * Released under the MIT License */ -class ca{constructor(){this._request=null,this._charts=new Map,this._running=!1,this._lastDate=void 0}_notify(t,e,i,s){const n=e.listeners[s],a=e.duration;n.forEach(s=>s({chart:t,initial:e.initial,numSteps:a,currentStep:Math.min(i-e.start,a)}))}_refresh(){this._request||(this._running=!0,this._request=Ui.call(window,()=>{this._update(),this._request=null,this._running&&this._refresh()}))}_update(t=Date.now()){let e=0;this._charts.forEach((i,s)=>{if(!i.running||!i.items.length)return;const n=i.items;let a,o=n.length-1,r=!1;for(;o>=0;--o)a=n[o],a._active?(a._total>i.duration&&(i.duration=a._total),a.tick(t),r=!0):(n[o]=n[n.length-1],n.pop());r&&(s.draw(),this._notify(s,i,t,"progress")),n.length||(i.running=!1,this._notify(s,i,t,"complete"),i.initial=!1),e+=n.length}),this._lastDate=t,0===e&&(this._running=!1)}_getAnims(t){const e=this._charts;let i=e.get(t);return i||(i={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,i)),i}listen(t,e,i){this._getAnims(t).listeners[e].push(i)}add(t,e){e&&e.length&&this._getAnims(t).items.push(...e)}has(t){return this._getAnims(t).items.length>0}start(t){const e=this._charts.get(t);e&&(e.running=!0,e.start=Date.now(),e.duration=e.items.reduce((t,e)=>Math.max(t,e._duration),0),this._refresh())}running(t){if(!this._running)return!1;const e=this._charts.get(t);return!!(e&&e.running&&e.items.length)}stop(t){const e=this._charts.get(t);if(!e||!e.items.length)return;const i=e.items;let s=i.length-1;for(;s>=0;--s)i[s].cancel();e.items=[],this._notify(t,e,Date.now(),"complete")}remove(t){return this._charts.delete(t)}}var da=new ca;const ua="transparent",ga={boolean(t,e,i){return i>.5?e:t},color(t,e,i){const s=ts(t||ua),n=s.valid&&ts(e||ua);return n&&n.valid?n.mix(s,i).hexString():e},number(t,e,i){return t+(e-t)*i}};class pa{constructor(t,e,i,s){const n=e[i];s=Hs([t.to,s,n,t.from]);const a=Hs([t.from,n,s]);this._active=!0,this._fn=t.fn||ga[t.type||typeof a],this._easing=Ji[t.easing]||Ji.linear,this._start=Math.floor(Date.now()+(t.delay||0)),this._duration=this._total=Math.floor(t.duration),this._loop=!!t.loop,this._target=e,this._prop=i,this._from=a,this._to=s,this._promises=void 0}active(){return this._active}update(t,e,i){if(this._active){this._notify(!1);const s=this._target[this._prop],n=i-this._start,a=this._duration-n;this._start=i,this._duration=Math.floor(Math.max(a,t.duration)),this._total+=n,this._loop=!!t.loop,this._to=Hs([t.to,e,s,t.from]),this._from=Hs([t.from,s,e])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(t){const e=t-this._start,i=this._duration,s=this._prop,n=this._from,a=this._loop,o=this._to;let r;if(this._active=n!==o&&(a||e1?2-r:r,r=this._easing(Math.min(1,Math.max(0,r))),this._target[s]=this._fn(n,o,r))}wait(){const t=this._promises||(this._promises=[]);return new Promise((e,i)=>{t.push({res:e,rej:i})})}_notify(t){const e=t?"res":"rej",i=this._promises||[];for(let s=0;s{const n=t[s];if(!Ee(n))return;const a={};for(const t of e)a[t]=n[t];(Ie(n.properties)&&n.properties||[s]).forEach(t=>{t!==s&&i.has(t)||i.set(t,a)})})}_animateOptions(t,e){const i=e.options,s=ba(t,i);if(!s)return[];const n=this._createAnimations(s,i);return i.$shared&&ma(t.options.$animations,i).then(()=>{t.options=i},()=>{}),n}_createAnimations(t,e){const i=this._properties,s=[],n=t.$animations||(t.$animations={}),a=Object.keys(e),o=Date.now();let r;for(r=a.length-1;r>=0;--r){const l=a[r];if("$"===l.charAt(0))continue;if("options"===l){s.push(...this._animateOptions(t,e));continue}const h=e[l];let c=n[l];const d=i.get(l);if(c){if(d&&c.active()){c.update(d,h,o);continue}c.cancel()}d&&d.duration?(n[l]=c=new pa(d,t,l,h),s.push(c)):t[l]=h}return s}update(t,e){if(0===this._properties.size)return void Object.assign(t,e);const i=this._createAnimations(t,e);return i.length?(da.add(this._chart,i),!0):void 0}}function ma(t,e){const i=[],s=Object.keys(e);for(let n=0;n0||!i&&e<0)return n.index}return null}function Pa(t,e){const{chart:i,_cachedMeta:s}=t,n=i._stacks||(i._stacks={}),{iScale:a,vScale:o,index:r}=s,l=a.axis,h=o.axis,c=Ma(a,o,s),d=e.length;let u;for(let g=0;gi[t].axis===e).shift()}function La(t,e){return Xs(t,{active:!1,dataset:void 0,datasetIndex:e,index:e,mode:"default",type:"dataset"})}function Da(t,e,i){return Xs(t,{active:!1,dataIndex:e,parsed:void 0,raw:void 0,element:i,index:e,mode:"default",type:"data"})}function Va(t,e){const i=t.controller.index,s=t.vScale&&t.vScale.axis;if(s){e=e||t._parsed;for(const t of e){const e=t._stacks;if(!e||void 0===e[s]||void 0===e[s][i])return;delete e[s][i],void 0!==e[s]._visualValues&&void 0!==e[s]._visualValues[i]&&delete e[s]._visualValues[i]}}}const Ia=t=>"reset"===t||"none"===t,Ea=(t,e)=>e?t:Object.assign({},t),Oa=(t,e,i)=>t&&!e.hidden&&e._stacked&&{keys:va(i,!0),values:null};class Ra{constructor(t,e){this.chart=t,this._ctx=t.ctx,this.index=e,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){const t=this._cachedMeta;this.configure(),this.linkScales(),t._stacked=Sa(t.vScale,t),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled("filler")&&console.warn("Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options")}updateIndex(t){this.index!==t&&Va(this._cachedMeta),this.index=t}linkScales(){const t=this.chart,e=this._cachedMeta,i=this.getDataset(),s=(t,e,i,s)=>"x"===t?e:"r"===t?s:i,n=e.xAxisID=We(i.xAxisID,Ta(t,"x")),a=e.yAxisID=We(i.yAxisID,Ta(t,"y")),o=e.rAxisID=We(i.rAxisID,Ta(t,"r")),r=e.indexAxis,l=e.iAxisID=s(r,n,a,o),h=e.vAxisID=s(r,a,n,o);e.xScale=this.getScaleForId(n),e.yScale=this.getScaleForId(a),e.rScale=this.getScaleForId(o),e.iScale=this.getScaleForId(l),e.vScale=this.getScaleForId(h)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(t){return this.chart.scales[t]}_getOtherScale(t){const e=this._cachedMeta;return t===e.iScale?e.vScale:e.iScale}reset(){this._update("reset")}_destroy(){const t=this._cachedMeta;this._data&&zi(this._data,this),t._stacked&&Va(t)}_dataCheck(){const t=this.getDataset(),e=t.data||(t.data=[]),i=this._data;if(Ee(e)){const t=this._cachedMeta;this._data=wa(e,t)}else if(i!==e){if(i){zi(i,this);const t=this._cachedMeta;Va(t),t._parsed=[]}e&&Object.isExtensible(e)&&Wi(e,this),this._syncList=[],this._data=e}}addElements(){const t=this._cachedMeta;this._dataCheck(),this.datasetElementType&&(t.dataset=new this.datasetElementType)}buildOrUpdateElements(t){const e=this._cachedMeta,i=this.getDataset();let s=!1;this._dataCheck();const n=e._stacked;e._stacked=Sa(e.vScale,e),e.stack!==i.stack&&(s=!0,Va(e),e.stack=i.stack),this._resyncElements(t),(s||n!==e._stacked)&&(Pa(this,e._parsed),e._stacked=Sa(e.vScale,e))}configure(){const t=this.chart.config,e=t.datasetScopeKeys(this._type),i=t.getOptionScopes(this.getDataset(),e,!0);this.options=t.createResolver(i,this.getContext()),this._parsing=this.options.parsing,this._cachedDataOpts={}}parse(t,e){const{_cachedMeta:i,_data:s}=this,{iScale:n,_stacked:a}=i,o=n.axis;let r,l,h,c=0===t&&e===s.length||i._sorted,d=t>0&&i._parsed[t-1];if(!1===this._parsing)i._parsed=s,i._sorted=!0,h=s;else{h=Ie(s[t])?this.parseArrayData(i,s,t,e):Ee(s[t])?this.parseObjectData(i,s,t,e):this.parsePrimitiveData(i,s,t,e);const n=()=>null===l[o]||d&&l[o]e||c=0;--d)if(!g()){this.updateRangeFromParsed(l,t,u,r);break}return l}getAllParsedValues(t){const e=this._cachedMeta._parsed,i=[];let s,n,a;for(s=0,n=e.length;s=0&&tthis.getContext(i,s,e),p=l.resolveNamedOptions(d,u,g,c);return p.$shared&&(p.$shared=r,n[a]=Object.freeze(Ea(p,r))),p}_resolveAnimations(t,e,i){const s=this.chart,n=this._cachedDataOpts,a=`animation-${e}`,o=n[a];if(o)return o;let r;if(!1!==s.options.animation){const s=this.chart.config,n=s.datasetAnimationScopeKeys(this._type,e),a=s.getOptionScopes(this.getDataset(),n);r=s.createResolver(a,this.getContext(t,i,e))}const l=new fa(s,r&&r.animations);return r&&r._cacheable&&(n[a]=Object.freeze(l)),l}getSharedOptions(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}includeOptions(t,e){return!e||Ia(t)||this.chart._animationsDisabled}_getSharedOptions(t,e){const i=this.resolveDataElementOptions(t,e),s=this._sharedOptions,n=this.getSharedOptions(i),a=this.includeOptions(e,n)||n!==s;return this.updateSharedOptions(n,e,i),{sharedOptions:n,includeOptions:a}}updateElement(t,e,i,s){Ia(s)?Object.assign(t,i):this._resolveAnimations(e,s).update(t,i)}updateSharedOptions(t,e,i){t&&!Ia(e)&&this._resolveAnimations(void 0,e).update(t,i)}_setStyle(t,e,i,s){t.active=s;const n=this.getStyle(e,s);this._resolveAnimations(e,i,s).update(t,{options:!s&&this.getSharedOptions(n)||n})}removeHoverStyle(t,e,i){this._setStyle(t,i,"active",!1)}setHoverStyle(t,e,i){this._setStyle(t,i,"active",!0)}_removeDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!1)}_setDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!0)}_resyncElements(t){const e=this._data,i=this._cachedMeta.data;for(const[o,r,l]of this._syncList)this[o](r,l);this._syncList=[];const s=i.length,n=e.length,a=Math.min(n,s);a&&this.parse(0,a),n>s?this._insertElements(s,n-s,t):n{for(t.length+=e,o=t.length-1;o>=a;o--)t[o]=t[o-e]};for(r(n),o=t;ot-e))}return t._cache.$bar}function za(t){const e=t.iScale,i=Wa(e,t.type);let s,n,a,o,r=e._length;const l=()=>{32767!==a&&-32768!==a&&(ei(o)&&(r=Math.min(r,Math.abs(a-o)||r)),o=a)};for(s=0,n=i.length;s0?n[t-1]:null,r=tMath.abs(r)&&(l=r,h=o),e[i.axis]=h,e._custom={barStart:l,barEnd:h,start:n,end:a,min:o,max:r}}function ja(t,e,i,s){return Ie(t)?Na(t,e,i,s):e[i.axis]=i.parse(t,s),e}function $a(t,e,i,s){const n=t.iScale,a=t.vScale,o=n.getLabels(),r=n===a,l=[];let h,c,d,u;for(h=i,c=i+s;h=i?1:-1)}function Xa(t){let e,i,s,n,a;return t.horizontal?(e=t.base>t.x,i="left",s="right"):(e=t.baset.controller.options.grouped),n=i.options.stacked,a=[],o=this._cachedMeta.controller.getParsed(e),r=o&&o[i.axis],l=t=>{const e=t._parsed.find(t=>t[i.axis]===r),s=e&&e[t.vScale.axis];if(Ve(s)||isNaN(s))return!0};for(const h of s)if((void 0===e||!l(h))&&((!1===n||-1===a.indexOf(h.stack)||void 0===n&&void 0===h.stack)&&a.push(h.stack),h.index===t))break;return a.length||a.push(void 0),a}_getStackCount(t){return this._getStacks(void 0,t).length}_getAxisCount(){return this._getAxis().length}getFirstScaleIdForIndexAxis(){const t=this.chart.scales,e=this.chart.options.indexAxis;return Object.keys(t).filter(i=>t[i].axis===e).shift()}_getAxis(){const t={},e=this.getFirstScaleIdForIndexAxis();for(const i of this.chart.data.datasets)t[We("x"===this.chart.options.indexAxis?i.xAxisID:i.yAxisID,e)]=!0;return Object.keys(t)}_getStackIndex(t,e,i){const s=this._getStacks(t,i),n=void 0!==e?s.indexOf(e):-1;return-1===n?s.length-1:n}_getRuler(){const t=this.options,e=this._cachedMeta,i=e.iScale,s=[];let n,a;for(n=0,a=e.data.length;n=0;--i)e=Math.max(e,t[i].size(this.resolveDataElementOptions(i))/2);return e>0&&e}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart.data.labels||[],{xScale:s,yScale:n}=e,a=this.getParsed(t),o=s.getLabelForValue(a.x),r=n.getLabelForValue(a.y),l=a._custom;return{label:i[t]||"",value:"("+o+", "+r+(l?", "+l:"")+")"}}update(t){const e=this._cachedMeta.data;this.updateElements(e,0,e.length,t)}updateElements(t,e,i,s){const n="reset"===s,{iScale:a,vScale:o}=this._cachedMeta,{sharedOptions:r,includeOptions:l}=this._getSharedOptions(e,s),h=a.axis,c=o.axis;for(let d=e;dPi(t,r,l,!0)?1:Math.max(e,e*i,s,s*i),p=(t,e,s)=>Pi(t,r,l,!0)?-1:Math.min(e,e*i,s,s*i),f=g(0,h,d),m=g(ci,c,u),b=p(ai,h,d),x=p(ai+ci,c,u);s=(f-b)/2,n=(m-x)/2,a=-(f+b)/2,o=-(m+x)/2}return{ratioX:s,ratioY:n,offsetX:a,offsetY:o}}(0,zt.A)(to,"id","bubble"),(0,zt.A)(to,"defaults",{datasetElementType:!1,dataElementType:"point",animations:{numbers:{type:"number",properties:["x","y","borderWidth","radius"]}}}),(0,zt.A)(to,"overrides",{scales:{x:{type:"linear"},y:{type:"linear"}}});class io extends Ra{constructor(t,e){super(t,e),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(t,e){const i=this.getDataset().data,s=this._cachedMeta;if(!1===this._parsing)s._parsed=i;else{let n,a,o=t=>+i[t];if(Ee(i[t])){const{key:t="value"}=this._parsing;o=e=>+Ze(i[e],t)}for(n=t,a=t+e;n0&&!isNaN(t)?oi*(Math.abs(t)/e):0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,s=i.data.labels||[],n=ls(e._parsed[t],i.options.locale);return{label:s[t]||"",value:n}}getMaxBorderWidth(t){let e=0;const i=this.chart;let s,n,a,o,r;if(!t)for(s=0,n=i.data.datasets.length;s"spacing"!==t,_indexable:t=>"spacing"!==t&&!t.startsWith("borderDash")&&!t.startsWith("hoverBorderDash")}),(0,zt.A)(io,"overrides",{aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data,{labels:{pointStyle:i,textAlign:s,color:n,useBorderRadius:a,borderRadius:o}}=t.legend.options;return e.labels.length&&e.datasets.length?e.labels.map((e,r)=>{const l=t.getDatasetMeta(0),h=l.controller.getStyle(r);return{text:e,fillStyle:h.backgroundColor,fontColor:n,hidden:!t.getDataVisibility(r),lineDash:h.borderDash,lineDashOffset:h.borderDashOffset,lineJoin:h.borderJoinStyle,lineWidth:h.borderWidth,strokeStyle:h.borderColor,textAlign:s,pointStyle:i,borderRadius:a&&(o||h.borderRadius),index:r}}):[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}}}});class so extends Ra{initialize(){this.enableOptionSharing=!0,this.supportsDecimation=!0,super.initialize()}update(t){const e=this._cachedMeta,{dataset:i,data:s=[],_dataset:n}=e,a=this.chart._animationsDisabled;let{start:o,count:r}=Xi(e,s,a);this._drawStart=o,this._drawCount=r,Yi(e)&&(o=0,r=s.length),i._chart=this.chart,i._datasetIndex=this.index,i._decimated=!!n._decimated,i.points=s;const l=this.resolveDatasetElementOptions(t);this.options.showLine||(l.borderWidth=0),l.segment=this.options.segment,this.updateElement(i,void 0,{animated:!a,options:l},t),this.updateElements(s,o,r,t)}updateElements(t,e,i,s){const n="reset"===s,{iScale:a,vScale:o,_stacked:r,_dataset:l}=this._cachedMeta,{sharedOptions:h,includeOptions:c}=this._getSharedOptions(e,s),d=a.axis,u=o.axis,{spanGaps:g,segment:p}=this.options,f=yi(g)?g:Number.POSITIVE_INFINITY,m=this.chart._animationsDisabled||n||"none"===s,b=e+i,x=t.length;let y=e>0&&this.getParsed(e-1);for(let _=0;_=b){g.skip=!0;continue}const x=this.getParsed(_),v=Ve(x[u]),k=g[d]=a.getPixelForValue(x[d],_),w=g[u]=n||v?o.getBasePixel():o.getPixelForValue(r?this.applyStack(o,x,r):x[u],_);g.skip=isNaN(k)||isNaN(w)||v,g.stop=_>0&&Math.abs(x[d]-y[d])>f,p&&(g.parsed=x,g.raw=l.data[_]),c&&(g.options=h||this.resolveDataElementOptions(_,i.active?"active":s)),m||this.updateElement(i,_,g,s),y=x}}getMaxOverflow(){const t=this._cachedMeta,e=t.dataset,i=e.options&&e.options.borderWidth||0,s=t.data||[];if(!s.length)return i;const n=s[0].size(this.resolveDataElementOptions(0)),a=s[s.length-1].size(this.resolveDataElementOptions(s.length-1));return Math.max(i,n,a)/2}draw(){const t=this._cachedMeta;t.dataset.updateControlPoints(this.chart.chartArea,t.iScale.axis),super.draw()}}(0,zt.A)(so,"id","line"),(0,zt.A)(so,"defaults",{datasetElementType:"line",dataElementType:"point",showLine:!0,spanGaps:!1}),(0,zt.A)(so,"overrides",{scales:{_index_:{type:"category"},_value_:{type:"linear"}}});class no extends Ra{constructor(t,e){super(t,e),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,s=i.data.labels||[],n=ls(e._parsed[t].r,i.options.locale);return{label:s[t]||"",value:n}}parseObjectData(t,e,i,s){return pn.bind(this)(t,e,i,s)}update(t){const e=this._cachedMeta.data;this._updateRadius(),this.updateElements(e,0,e.length,t)}getMinMax(){const t=this._cachedMeta,e={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};return t.data.forEach((t,i)=>{const s=this.getParsed(i).r;!isNaN(s)&&this.chart.getDataVisibility(i)&&(se.max&&(e.max=s))}),e}_updateRadius(){const t=this.chart,e=t.chartArea,i=t.options,s=Math.min(e.right-e.left,e.bottom-e.top),n=Math.max(s/2,0),a=Math.max(i.cutoutPercentage?n/100*i.cutoutPercentage:1,0),o=(n-a)/t.getVisibleDatasetCount();this.outerRadius=n-o*this.index,this.innerRadius=this.outerRadius-o}updateElements(t,e,i,s){const n="reset"===s,a=this.chart,o=a.options,r=o.animation,l=this._cachedMeta.rScale,h=l.xCenter,c=l.yCenter,d=l.getIndexAngle(0)-.5*ai;let u,g=d;const p=360/this.countVisibleElements();for(u=0;u{!isNaN(this.getParsed(i).r)&&this.chart.getDataVisibility(i)&&e++}),e}_computeAngle(t,e,i){return this.chart.getDataVisibility(t)?ki(this.resolveDataElementOptions(t,e).angle||i):0}}(0,zt.A)(no,"id","polarArea"),(0,zt.A)(no,"defaults",{dataElementType:"arc",animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:"number",properties:["x","y","startAngle","endAngle","innerRadius","outerRadius"]}},indexAxis:"r",startAngle:0}),(0,zt.A)(no,"overrides",{aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:i,color:s}}=t.legend.options;return e.labels.map((e,n)=>{const a=t.getDatasetMeta(0),o=a.controller.getStyle(n);return{text:e,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,fontColor:s,lineWidth:o.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(n),index:n}})}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}});class ao extends io{}(0,zt.A)(ao,"id","pie"),(0,zt.A)(ao,"defaults",{cutout:0,rotation:0,circumference:360,radius:"100%"});class oo extends Ra{getLabelAndValue(t){const e=this._cachedMeta.vScale,i=this.getParsed(t);return{label:e.getLabels()[t],value:""+e.getLabelForValue(i[e.axis])}}parseObjectData(t,e,i,s){return pn.bind(this)(t,e,i,s)}update(t){const e=this._cachedMeta,i=e.dataset,s=e.data||[],n=e.iScale.getLabels();if(i.points=s,"resize"!==t){const e=this.resolveDatasetElementOptions(t);this.options.showLine||(e.borderWidth=0);const a={_loop:!0,_fullLoop:n.length===s.length,options:e};this.updateElement(i,void 0,a,t)}this.updateElements(s,0,s.length,t)}updateElements(t,e,i,s){const n=this._cachedMeta.rScale,a="reset"===s;for(let o=e;o0&&this.getParsed(e-1);for(let y=e;y0&&Math.abs(i[u]-x[u])>m,f&&(h.parsed=i,h.raw=l.data[y]),d&&(h.options=c||this.resolveDataElementOptions(y,e.active?"active":s)),b||this.updateElement(e,y,h,s),x=i}this.updateSharedOptions(c,s,h)}getMaxOverflow(){const t=this._cachedMeta,e=t.data||[];if(!this.options.showLine){let t=0;for(let i=e.length-1;i>=0;--i)t=Math.max(t,e[i].size(this.resolveDataElementOptions(i))/2);return t>0&&t}const i=t.dataset,s=i.options&&i.options.borderWidth||0;if(!e.length)return s;const n=e[0].size(this.resolveDataElementOptions(0)),a=e[e.length-1].size(this.resolveDataElementOptions(e.length-1));return Math.max(s,n,a)/2}}(0,zt.A)(ro,"id","scatter"),(0,zt.A)(ro,"defaults",{datasetElementType:!1,dataElementType:"point",showLine:!1,fill:!1}),(0,zt.A)(ro,"overrides",{interaction:{mode:"point"},scales:{x:{type:"linear"},y:{type:"linear"}}});function lo(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}class ho{static override(t){Object.assign(ho.prototype,t)}constructor(t){(0,zt.A)(this,"options",void 0),this.options=t||{}}init(){}formats(){return lo()}parse(){return lo()}format(){return lo()}add(){return lo()}diff(){return lo()}startOf(){return lo()}endOf(){return lo()}}var co={_date:ho};function uo(t,e,i,s){const{controller:n,data:a,_sorted:o}=t,r=n._cachedMeta.iScale,l=t.dataset&&t.dataset.options?t.dataset.options.spanGaps:null;if(r&&e===r.axis&&"r"!==e&&o&&a.length){const o=r._reversePixels?Ei:Ii;if(!s){const s=o(a,e,i);if(l){const{vScale:e}=n._cachedMeta,{_parsed:i}=t,a=i.slice(0,s.lo+1).reverse().findIndex(t=>!Ve(t[e.axis]));s.lo-=Math.max(0,a);const o=i.slice(s.hi).findIndex(t=>!Ve(t[e.axis]));s.hi+=Math.max(0,o)}return s}if(n._sharedOptions){const t=a[0],s="function"===typeof t.getRange&&t.getRange(e);if(s){const t=o(a,e,i-s),n=o(a,e,i+s);return{lo:t.lo,hi:n.hi}}}}return{lo:0,hi:a.length-1}}function go(t,e,i,s,n){const a=t.getSortedVisibleDatasetMetas(),o=i[e];for(let r=0,l=a.length;r{t[o]&&t[o](e[i],n)&&(a.push({element:t,datasetIndex:s,index:l}),r=r||t.inRange(e.x,e.y,n))}),s&&!r?[]:a}var _o={evaluateInteractionItems:go,modes:{index(t,e,i,s){const n=In(e,t),a=i.axis||"x",o=i.includeInvisible||!1,r=i.intersect?fo(t,n,a,s,o):xo(t,n,a,!1,s,o),l=[];return r.length?(t.getSortedVisibleDatasetMetas().forEach(t=>{const e=r[0].index,i=t.data[e];i&&!i.skip&&l.push({element:i,datasetIndex:t.index,index:e})}),l):[]},dataset(t,e,i,s){const n=In(e,t),a=i.axis||"xy",o=i.includeInvisible||!1;let r=i.intersect?fo(t,n,a,s,o):xo(t,n,a,!1,s,o);if(r.length>0){const e=r[0].datasetIndex,i=t.getDatasetMeta(e).data;r=[];for(let t=0;tt.pos===e)}function wo(t,e){return t.filter(t=>-1===vo.indexOf(t.pos)&&t.box.axis===e)}function So(t,e){return t.sort((t,i)=>{const s=e?i:t,n=e?t:i;return s.weight===n.weight?s.index-n.index:s.weight-n.weight})}function Mo(t){const e=[];let i,s,n,a,o,r;for(i=0,s=(t||[]).length;it.box.fullSize),!0),s=So(ko(e,"left"),!0),n=So(ko(e,"right")),a=So(ko(e,"top"),!0),o=So(ko(e,"bottom")),r=wo(e,"x"),l=wo(e,"y");return{fullSize:i,leftAndTop:s.concat(a),rightAndBottom:n.concat(l).concat(o).concat(r),chartArea:ko(e,"chartArea"),vertical:s.concat(n).concat(l),horizontal:a.concat(o).concat(r)}}function Po(t,e,i,s){return Math.max(t[i],e[i])+Math.max(t[s],e[s])}function To(t,e){t.top=Math.max(t.top,e.top),t.left=Math.max(t.left,e.left),t.bottom=Math.max(t.bottom,e.bottom),t.right=Math.max(t.right,e.right)}function Lo(t,e,i,s){const{pos:n,box:a}=i,o=t.maxPadding;if(!Ee(n)){i.size&&(t[n]-=i.size);const e=s[i.stack]||{size:0,count:1};e.size=Math.max(e.size,i.horizontal?a.height:a.width),i.size=e.size/e.count,t[n]+=i.size}a.getPadding&&To(o,a.getPadding());const r=Math.max(0,e.outerWidth-Po(o,t,"left","right")),l=Math.max(0,e.outerHeight-Po(o,t,"top","bottom")),h=r!==t.w,c=l!==t.h;return t.w=r,t.h=l,i.horizontal?{same:h,other:c}:{same:c,other:h}}function Do(t){const e=t.maxPadding;function i(i){const s=Math.max(e[i]-t[i],0);return t[i]+=s,s}t.y+=i("top"),t.x+=i("left"),i("right"),i("bottom")}function Vo(t,e){const i=e.maxPadding;function s(t){const s={left:0,top:0,right:0,bottom:0};return t.forEach(t=>{s[t]=Math.max(e[t],i[t])}),s}return s(t?["left","right"]:["top","bottom"])}function Io(t,e,i,s){const n=[];let a,o,r,l,h,c;for(a=0,o=t.length,h=0;a{"function"===typeof t.beforeLayout&&t.beforeLayout()});const c=l.reduce((t,e)=>e.box.options&&!1===e.box.options.display?t:t+1,0)||1,d=Object.freeze({outerWidth:e,outerHeight:i,padding:n,availableWidth:a,availableHeight:o,vBoxMaxWidth:a/2/c,hBoxMaxHeight:o/2}),u=Object.assign({},n);To(u,js(s));const g=Object.assign({maxPadding:u,w:a,h:o,x:n.left,y:n.top},n),p=Fo(l.concat(h),d);Io(r.fullSize,g,d,p),Io(l,g,d,p),Io(h,g,d,p)&&Io(l,g,d,p),Do(g),Oo(r.leftAndTop,g,d,p),g.x+=g.w,g.y+=g.h,Oo(r.rightAndBottom,g,d,p),t.chartArea={left:g.left,top:g.top,right:g.left+g.w,bottom:g.top+g.h,height:g.h,width:g.w},Ne(r.chartArea,e=>{const i=e.box;Object.assign(i,t.chartArea),i.update(g.w,g.h,{left:0,top:0,right:0,bottom:0})})}};class Wo{acquireContext(t,e){}releaseContext(t){return!1}addEventListener(t,e,i){}removeEventListener(t,e,i){}getDevicePixelRatio(){return 1}getMaximumSize(t,e,i,s){return e=Math.max(0,e||t.width),i=i||t.height,{width:e,height:Math.max(0,s?Math.floor(e/s):i)}}isAttached(t){return!0}updateConfig(t){}}class zo extends Wo{acquireContext(t){return t&&t.getContext&&t.getContext("2d")||null}updateConfig(t){t.options.animation=!1}}const Bo="$chartjs",Uo={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},No=t=>null===t||""===t;function jo(t,e){const i=t.style,s=t.getAttribute("height"),n=t.getAttribute("width");if(t[Bo]={initial:{height:s,width:n,style:{display:i.display,height:i.height,width:i.width}}},i.display=i.display||"block",i.boxSizing=i.boxSizing||"border-box",No(n)){const e=Bn(t,"width");void 0!==e&&(t.width=e)}if(No(s))if(""===t.style.height)t.height=t.width/(e||2);else{const e=Bn(t,"height");void 0!==e&&(t.height=e)}return t}const $o=!!zn&&{passive:!0};function Ho(t,e,i){t&&t.addEventListener(e,i,$o)}function qo(t,e,i){t&&t.canvas&&t.canvas.removeEventListener(e,i,$o)}function Xo(t,e){const i=Uo[t.type]||t.type,{x:s,y:n}=In(t,e);return{type:i,chart:e,native:t,x:void 0!==s?s:null,y:void 0!==n?n:null}}function Yo(t,e){for(const i of t)if(i===e||i.contains(e))return!0}function Ko(t,e,i){const s=t.canvas,n=new MutationObserver(t=>{let e=!1;for(const i of t)e=e||Yo(i.addedNodes,s),e=e&&!Yo(i.removedNodes,s);e&&i()});return n.observe(document,{childList:!0,subtree:!0}),n}function Qo(t,e,i){const s=t.canvas,n=new MutationObserver(t=>{let e=!1;for(const i of t)e=e||Yo(i.removedNodes,s),e=e&&!Yo(i.addedNodes,s);e&&i()});return n.observe(document,{childList:!0,subtree:!0}),n}const Go=new Map;let Jo=0;function Zo(){const t=window.devicePixelRatio;t!==Jo&&(Jo=t,Go.forEach((e,i)=>{i.currentDevicePixelRatio!==t&&e()}))}function tr(t,e){Go.size||window.addEventListener("resize",Zo),Go.set(t,e)}function er(t){Go.delete(t),Go.size||window.removeEventListener("resize",Zo)}function ir(t,e,i){const s=t.canvas,n=s&&Cn(s);if(!n)return;const a=Ni((t,e)=>{const s=n.clientWidth;i(t,e),s{const e=t[0],i=e.contentRect.width,s=e.contentRect.height;0===i&&0===s||a(i,s)});return o.observe(n),tr(t,a),o}function sr(t,e,i){i&&i.disconnect(),"resize"===e&&er(t)}function nr(t,e,i){const s=t.canvas,n=Ni(e=>{null!==t.ctx&&i(Xo(e,t))},t);return Ho(s,e,n),n}class ar extends Wo{acquireContext(t,e){const i=t&&t.getContext&&t.getContext("2d");return i&&i.canvas===t?(jo(t,e),i):null}releaseContext(t){const e=t.canvas;if(!e[Bo])return!1;const i=e[Bo].initial;["height","width"].forEach(t=>{const s=i[t];Ve(s)?e.removeAttribute(t):e.setAttribute(t,s)});const s=i.style||{};return Object.keys(s).forEach(t=>{e.style[t]=s[t]}),e.width=e.width,delete e[Bo],!0}addEventListener(t,e,i){this.removeEventListener(t,e);const s=t.$proxies||(t.$proxies={}),n={attach:Ko,detach:Qo,resize:ir},a=n[e]||nr;s[e]=a(t,e,i)}removeEventListener(t,e){const i=t.$proxies||(t.$proxies={}),s=i[e];if(!s)return;const n={attach:sr,detach:sr,resize:sr},a=n[e]||qo;a(t,e,s),i[e]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,i,s){return Rn(t,e,i,s)}isAttached(t){const e=t&&Cn(t);return!(!e||!e.isConnected)}}function or(t){return!Mn()||"undefined"!==typeof OffscreenCanvas&&t instanceof OffscreenCanvas?zo:ar}class rr{constructor(){(0,zt.A)(this,"x",void 0),(0,zt.A)(this,"y",void 0),(0,zt.A)(this,"active",!1),(0,zt.A)(this,"options",void 0),(0,zt.A)(this,"$animations",void 0)}tooltipPosition(t){const{x:e,y:i}=this.getProps(["x","y"],t);return{x:e,y:i}}hasValue(){return yi(this.x)&&yi(this.y)}getProps(t,e){const i=this.$animations;if(!e||!i)return this;const s={};return t.forEach(t=>{s[t]=i[t]&&i[t].active()?i[t]._to:this[t]}),s}}function lr(t,e){const i=t.options.ticks,s=hr(t),n=Math.min(i.maxTicksLimit||s,s),a=i.major.enabled?dr(e):[],o=a.length,r=a[0],l=a[o-1],h=[];if(o>n)return ur(e,h,a,o/n),h;const c=cr(a,e,n);if(o>0){let t,i;const s=o>1?Math.round((l-r)/(o-1)):null;for(gr(e,h,c,Ve(s)?0:r-s,r),t=0,i=o-1;tn)return t}return Math.max(n,1)}function dr(t){const e=[];let i,s;for(i=0,s=t.length;i"left"===t?"right":"right"===t?"left":t,mr=(t,e,i)=>"top"===e||"left"===e?t[e]+i:t[e]-i,br=(t,e)=>Math.min(e||t,t);function xr(t,e){const i=[],s=t.length/e,n=t.length;let a=0;for(;ao+r)))return h}function _r(t,e){Ne(t,t=>{const i=t.gc,s=i.length/2;let n;if(s>e){for(n=0;ns?s:i,s=n&&i>s?i:s,{min:Re(i,Re(s,i)),max:Re(s,Re(i,s))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){const t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]}getLabelItems(t=this.chart.chartArea){const e=this._labelItems||(this._labelItems=this._computeLabelItems(t));return e}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){Ue(this.options.beforeUpdate,[this])}update(t,e,i){const{beginAtZero:s,grace:n,ticks:a}=this.options,o=a.sampleSize;this.beforeUpdate(),this.maxWidth=t,this.maxHeight=e,this._margins=i=Object.assign({left:0,right:0,top:0,bottom:0},i),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+i.left+i.right:this.height+i.top+i.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=qs(this,n,s),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();const r=o=n||i<=1||!this.isHorizontal())return void(this.labelRotation=s);const h=this._getLabelSizes(),c=h.widest.width,d=h.highest.height,u=Ti(this.chart.width-c,0,this.maxWidth);a=t.offset?this.maxWidth/i:u/(i-1),c+6>a&&(a=u/(i-(t.offset?.5:1)),o=this.maxHeight-vr(t.grid)-e.padding-kr(t.title,this.chart.options.font),r=Math.sqrt(c*c+d*d),l=wi(Math.min(Math.asin(Ti((h.highest.height+6)/a,-1,1)),Math.asin(Ti(o/r,-1,1))-Math.asin(Ti(d/r,-1,1)))),l=Math.max(s,Math.min(n,l))),this.labelRotation=l}afterCalculateLabelRotation(){Ue(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){Ue(this.options.beforeFit,[this])}fit(){const t={width:0,height:0},{chart:e,options:{ticks:i,title:s,grid:n}}=this,a=this._isVisible(),o=this.isHorizontal();if(a){const a=kr(s,e.options.font);if(o?(t.width=this.maxWidth,t.height=vr(n)+a):(t.height=this.maxHeight,t.width=vr(n)+a),i.display&&this.ticks.length){const{first:e,last:s,widest:n,highest:a}=this._getLabelSizes(),r=2*i.padding,l=ki(this.labelRotation),h=Math.cos(l),c=Math.sin(l);if(o){const e=i.mirror?0:c*n.width+h*a.height;t.height=Math.min(this.maxHeight,t.height+e+r)}else{const e=i.mirror?0:h*n.width+c*a.height;t.width=Math.min(this.maxWidth,t.width+e+r)}this._calculatePadding(e,s,c,h)}}this._handleMargins(),o?(this.width=this._length=e.width-this._margins.left-this._margins.right,this.height=t.height):(this.width=t.width,this.height=this._length=e.height-this._margins.top-this._margins.bottom)}_calculatePadding(t,e,i,s){const{ticks:{align:n,padding:a},position:o}=this.options,r=0!==this.labelRotation,l="top"!==o&&"x"===this.axis;if(this.isHorizontal()){const o=this.getPixelForTick(0)-this.left,h=this.right-this.getPixelForTick(this.ticks.length-1);let c=0,d=0;r?l?(c=s*t.width,d=i*e.height):(c=i*t.height,d=s*e.width):"start"===n?d=e.width:"end"===n?c=t.width:"inner"!==n&&(c=t.width/2,d=e.width/2),this.paddingLeft=Math.max((c-o+a)*this.width/(this.width-o),0),this.paddingRight=Math.max((d-h+a)*this.width/(this.width-h),0)}else{let i=e.height/2,s=t.height/2;"start"===n?(i=0,s=t.height):"end"===n&&(i=e.height,s=0),this.paddingTop=i+a,this.paddingBottom=s+a}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){Ue(this.options.afterFit,[this])}isHorizontal(){const{axis:t,position:e}=this.options;return"top"===e||"bottom"===e||"x"===t}isFullSize(){return this.options.fullSize}_convertTicksToLabels(t){let e,i;for(this.beforeTickToLabelConversion(),this.generateTickLabels(t),e=0,i=t.length;e({width:a[t]||0,height:o[t]||0});return{first:w(0),last:w(e-1),widest:w(v),highest:w(k),widths:a,heights:o}}getLabelForValue(t){return t}getPixelForValue(t,e){return NaN}getValueForPixel(t){}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getPixelForDecimal(t){this._reversePixels&&(t=1-t);const e=this._startPixel+t*this._length;return Li(this._alignToPixels?ks(this.chart,e,0):e)}getDecimalForPixel(t){const e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){const{min:t,max:e}=this;return t<0&&e<0?e:t>0&&e>0?t:0}getContext(t){const e=this.ticks||[];if(t>=0&&to*s?o/i:r/s:r*s0}_computeGridLineItems(t){const e=this.axis,i=this.chart,s=this.options,{grid:n,position:a,border:o}=s,r=n.offset,l=this.isHorizontal(),h=this.ticks,c=h.length+(r?1:0),d=vr(n),u=[],g=o.setContext(this.getContext()),p=g.display?g.width:0,f=p/2,m=function(t){return ks(i,t,p)};let b,x,y,_,v,k,w,S,M,C,F,A;if("top"===a)b=m(this.bottom),k=this.bottom-d,S=b-f,C=m(t.top)+f,A=t.bottom;else if("bottom"===a)b=m(this.top),C=t.top,A=m(t.bottom)-f,k=b+f,S=this.top+d;else if("left"===a)b=m(this.right),v=this.right-d,w=b-f,M=m(t.left)+f,F=t.right;else if("right"===a)b=m(this.left),M=t.left,F=m(t.right)-f,v=b+f,w=this.left+d;else if("x"===e){if("center"===a)b=m((t.top+t.bottom)/2+.5);else if(Ee(a)){const t=Object.keys(a)[0],e=a[t];b=m(this.chart.scales[t].getPixelForValue(e))}C=t.top,A=t.bottom,k=b+f,S=k+d}else if("y"===e){if("center"===a)b=m((t.left+t.right)/2);else if(Ee(a)){const t=Object.keys(a)[0],e=a[t];b=m(this.chart.scales[t].getPixelForValue(e))}v=b-f,w=v-d,M=t.left,F=t.right}const P=We(s.ticks.maxTicksLimit,c),T=Math.max(1,Math.ceil(c/P));for(x=0;x0&&(a-=s/2);break}d={left:a,top:n,width:s+e.width,height:i+e.height,color:t.backdropColor}}f.push({label:y,font:S,textOffset:F,options:{rotation:p,color:i,strokeColor:r,strokeWidth:h,textAlign:u,textBaseline:A,translation:[_,v],backdrop:d}})}return f}_getXAxisLabelAlignment(){const{position:t,ticks:e}=this.options,i=-ki(this.labelRotation);if(i)return"top"===t?"left":"right";let s="center";return"start"===e.align?s="left":"end"===e.align?s="right":"inner"===e.align&&(s="inner"),s}_getYAxisLabelAlignment(t){const{position:e,ticks:{crossAlign:i,mirror:s,padding:n}}=this.options,a=this._getLabelSizes(),o=t+n,r=a.widest.width;let l,h;return"left"===e?s?(h=this.right+n,"near"===i?l="left":"center"===i?(l="center",h+=r/2):(l="right",h+=r)):(h=this.right-o,"near"===i?l="right":"center"===i?(l="center",h-=r/2):(l="left",h=this.left)):"right"===e?s?(h=this.left+n,"near"===i?l="right":"center"===i?(l="center",h-=r/2):(l="left",h-=r)):(h=this.left+o,"near"===i?l="left":"center"===i?(l="center",h+=r/2):(l="right",h=this.right)):l="right",{textAlign:l,x:h}}_computeLabelArea(){if(this.options.ticks.mirror)return;const t=this.chart,e=this.options.position;return"left"===e||"right"===e?{top:0,left:this.left,bottom:t.height,right:this.right}:"top"===e||"bottom"===e?{top:this.top,left:0,bottom:this.bottom,right:t.width}:void 0}drawBackground(){const{ctx:t,options:{backgroundColor:e},left:i,top:s,width:n,height:a}=this;e&&(t.save(),t.fillStyle=e,t.fillRect(i,s,n,a),t.restore())}getLineWidthForValue(t){const e=this.options.grid;if(!this._isVisible()||!e.display)return 0;const i=this.ticks,s=i.findIndex(e=>e.value===t);if(s>=0){const t=e.setContext(this.getContext(s));return t.lineWidth}return 0}drawGrid(t){const e=this.options.grid,i=this.ctx,s=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t));let n,a;const o=(t,e,s)=>{s.width&&s.color&&(i.save(),i.lineWidth=s.width,i.strokeStyle=s.color,i.setLineDash(s.borderDash||[]),i.lineDashOffset=s.borderDashOffset,i.beginPath(),i.moveTo(t.x,t.y),i.lineTo(e.x,e.y),i.stroke(),i.restore())};if(e.display)for(n=0,a=s.length;n{this.drawBackground(),this.drawGrid(t),this.drawTitle()}},{z:s,draw:()=>{this.drawBorder()}},{z:e,draw:t=>{this.drawLabels(t)}}]:[{z:e,draw:t=>{this.draw(t)}}]}getMatchingVisibleMetas(t){const e=this.chart.getSortedVisibleDatasetMetas(),i=this.axis+"AxisID",s=[];let n,a;for(n=0,a=e.length;n{const s=i.split("."),n=s.pop(),a=[t].concat(s).join("."),o=e[i].split("."),r=o.pop(),l=o.join(".");xs.route(a,n,l,r)})}function Lr(t){return"id"in t&&"defaults"in t}class Dr{constructor(){this.controllers=new Ar(Ra,"datasets",!0),this.elements=new Ar(rr,"elements"),this.plugins=new Ar(Object,"plugins"),this.scales=new Ar(Fr,"scales"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...t){this._each("register",t)}remove(...t){this._each("unregister",t)}addControllers(...t){this._each("register",t,this.controllers)}addElements(...t){this._each("register",t,this.elements)}addPlugins(...t){this._each("register",t,this.plugins)}addScales(...t){this._each("register",t,this.scales)}getController(t){return this._get(t,this.controllers,"controller")}getElement(t){return this._get(t,this.elements,"element")}getPlugin(t){return this._get(t,this.plugins,"plugin")}getScale(t){return this._get(t,this.scales,"scale")}removeControllers(...t){this._each("unregister",t,this.controllers)}removeElements(...t){this._each("unregister",t,this.elements)}removePlugins(...t){this._each("unregister",t,this.plugins)}removeScales(...t){this._each("unregister",t,this.scales)}_each(t,e,i){[...e].forEach(e=>{const s=i||this._getRegistryForType(e);i||s.isForType(e)||s===this.plugins&&e.id?this._exec(t,s,e):Ne(e,e=>{const s=i||this._getRegistryForType(e);this._exec(t,s,e)})})}_exec(t,e,i){const s=ti(t);Ue(i["before"+s],[],i),e[t](i),Ue(i["after"+s],[],i)}_getRegistryForType(t){for(let e=0;et.filter(t=>!e.some(e=>t.plugin.id===e.plugin.id));this._notify(s(e,i),t,"stop"),this._notify(s(i,e),t,"start")}}function Er(t){const e={},i=[],s=Object.keys(Vr.plugins.items);for(let a=0;a1&&Nr(t[0].toLowerCase());if(e)return e}throw new Error(`Cannot determine type of '${t}' axis. Please provide 'axis' or 'position' option.`)}function Hr(t,e,i){if(i[e+"AxisID"]===t)return{axis:e}}function qr(t,e){if(e.data&&e.data.datasets){const i=e.data.datasets.filter(e=>e.xAxisID===t||e.yAxisID===t);if(i.length)return Hr(t,"x",i[0])||Hr(t,"y",i[0])}return{}}function Xr(t,e){const i=gs[t.type]||{scales:{}},s=e.scales||{},n=zr(t.type,e),a=Object.create(null);return Object.keys(s).forEach(e=>{const o=s[e];if(!Ee(o))return console.error(`Invalid scale configuration for scale: ${e}`);if(o._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${e}`);const r=$r(e,o,qr(e,t),xs.scales[o.type]),l=Ur(r,n),h=i.scales||{};a[e]=Ye(Object.create(null),[{axis:r},o,h[r],h[l]])}),t.data.datasets.forEach(i=>{const n=i.type||t.type,o=i.indexAxis||zr(n,e),r=gs[n]||{},l=r.scales||{};Object.keys(l).forEach(t=>{const e=Br(t,o),n=i[e+"AxisID"]||e;a[n]=a[n]||Object.create(null),Ye(a[n],[{axis:e},s[n],l[t]])})}),Object.keys(a).forEach(t=>{const e=a[t];Ye(e,[xs.scales[e.type],xs.scale])}),a}function Yr(t){const e=t.options||(t.options={});e.plugins=We(e.plugins,{}),e.scales=Xr(t,e)}function Kr(t){return t=t||{},t.datasets=t.datasets||[],t.labels=t.labels||[],t}function Qr(t){return t=t||{},t.data=Kr(t.data),Yr(t),t}const Gr=new Map,Jr=new Set;function Zr(t,e){let i=Gr.get(t);return i||(i=e(),Gr.set(t,i),Jr.add(i)),i}const tl=(t,e,i)=>{const s=Ze(e,i);void 0!==s&&t.add(s)};class el{constructor(t){this._config=Qr(t),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(t){this._config.type=t}get data(){return this._config.data}set data(t){this._config.data=Kr(t)}get options(){return this._config.options}set options(t){this._config.options=t}get plugins(){return this._config.plugins}update(){const t=this._config;this.clearCache(),Yr(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return Zr(t,()=>[[`datasets.${t}`,""]])}datasetAnimationScopeKeys(t,e){return Zr(`${t}.transition.${e}`,()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,""]])}datasetElementScopeKeys(t,e){return Zr(`${t}-${e}`,()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,""]])}pluginScopeKeys(t){const e=t.id,i=this.type;return Zr(`${i}-plugin-${e}`,()=>[[`plugins.${e}`,...t.additionalOptionScopes||[]]])}_cachedScopes(t,e){const i=this._scopeCache;let s=i.get(t);return s&&!e||(s=new Map,i.set(t,s)),s}getOptionScopes(t,e,i){const{options:s,type:n}=this,a=this._cachedScopes(t,i),o=a.get(e);if(o)return o;const r=new Set;e.forEach(e=>{t&&(r.add(t),e.forEach(e=>tl(r,t,e))),e.forEach(t=>tl(r,s,t)),e.forEach(t=>tl(r,gs[n]||{},t)),e.forEach(t=>tl(r,xs,t)),e.forEach(t=>tl(r,ps,t))});const l=Array.from(r);return 0===l.length&&l.push(Object.create(null)),Jr.has(e)&&a.set(e,l),l}chartOptionScopes(){const{options:t,type:e}=this;return[t,gs[e]||{},xs.datasets[e]||{},{type:e},xs,ps]}resolveNamedOptions(t,e,i,s=[""]){const n={$shared:!0},{resolver:a,subPrefixes:o}=il(this._resolverCache,t,s);let r=a;if(nl(a,e)){n.$shared=!1,i=ii(i)?i():i;const e=this.createResolver(t,i,o);r=Ks(a,i,e)}for(const l of e)n[l]=r[l];return n}createResolver(t,e,i=[""],s){const{resolver:n}=il(this._resolverCache,t,i);return Ee(e)?Ks(n,e,void 0,s):n}}function il(t,e,i){let s=t.get(e);s||(s=new Map,t.set(e,s));const n=i.join();let a=s.get(n);if(!a){const t=Ys(e,i);a={resolver:t,subPrefixes:i.filter(t=>!t.toLowerCase().includes("hover"))},s.set(n,a)}return a}const sl=t=>Ee(t)&&Object.getOwnPropertyNames(t).some(e=>ii(t[e]));function nl(t,e){const{isScriptable:i,isIndexable:s}=Qs(t);for(const n of e){const e=i(n),a=s(n),o=(a||e)&&t[n];if(e&&(ii(o)||sl(o))||a&&Ie(o))return!0}return!1}var al="4.5.1";const ol=["top","bottom","left","right","chartArea"];function rl(t,e){return"top"===t||"bottom"===t||-1===ol.indexOf(t)&&"x"===e}function ll(t,e){return function(i,s){return i[t]===s[t]?i[e]-s[e]:i[t]-s[t]}}function hl(t){const e=t.chart,i=e.options.animation;e.notifyPlugins("afterRender"),Ue(i&&i.onComplete,[t],e)}function cl(t){const e=t.chart,i=e.options.animation;Ue(i&&i.onProgress,[t],e)}function dl(t){return Mn()&&"string"===typeof t?t=document.getElementById(t):t&&t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas),t}const ul={},gl=t=>{const e=dl(t);return Object.values(ul).filter(t=>t.canvas===e).pop()};function pl(t,e,i){const s=Object.keys(t);for(const n of s){const s=+n;if(s>=e){const a=t[n];delete t[n],(i>0||s>e)&&(t[s+i]=a)}}}function fl(t,e,i,s){return i&&"mouseout"!==t.type?s?e:t:null}class ml{static register(...t){Vr.add(...t),bl()}static unregister(...t){Vr.remove(...t),bl()}constructor(t,e){const i=this.config=new el(e),s=dl(t),n=gl(s);if(n)throw new Error("Canvas is already in use. Chart with ID '"+n.id+"' must be destroyed before the canvas with ID '"+n.canvas.id+"' can be reused.");const a=i.createResolver(i.chartOptionScopes(),this.getContext());this.platform=new(i.platform||or(s)),this.platform.updateConfig(i);const o=this.platform.acquireContext(s,a.aspectRatio),r=o&&o.canvas,l=r&&r.height,h=r&&r.width;this.id=De(),this.ctx=o,this.canvas=r,this.width=h,this.height=l,this._options=a,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new Ir,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=ji(t=>this.update(t),a.resizeDelay||0),this._dataChanges=[],ul[this.id]=this,o&&r?(da.listen(this,"complete",hl),da.listen(this,"progress",cl),this._initialize(),this.attached&&this.update()):console.error("Failed to create chart: can't acquire context from the given item")}get aspectRatio(){const{options:{aspectRatio:t,maintainAspectRatio:e},width:i,height:s,_aspectRatio:n}=this;return Ve(t)?e&&n?n:s?i/s:null:t}get data(){return this.config.data}set data(t){this.config.data=t}get options(){return this._options}set options(t){this.config.options=t}get registry(){return Vr}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():Wn(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return ws(this.canvas,this.ctx),this}stop(){return da.stop(this),this}resize(t,e){da.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}_resize(t,e){const i=this.options,s=this.canvas,n=i.maintainAspectRatio&&this.aspectRatio,a=this.platform.getMaximumSize(s,t,e,n),o=i.devicePixelRatio||this.platform.getDevicePixelRatio(),r=this.width?"resize":"attach";this.width=a.width,this.height=a.height,this._aspectRatio=this.aspectRatio,Wn(this,o,!0)&&(this.notifyPlugins("resize",{size:a}),Ue(i.onResize,[this,a],this),this.attached&&this._doResize(r)&&this.render())}ensureScalesHaveIDs(){const t=this.options,e=t.scales||{};Ne(e,(t,e)=>{t.id=e})}buildOrUpdateScales(){const t=this.options,e=t.scales,i=this.scales,s=Object.keys(i).reduce((t,e)=>(t[e]=!1,t),{});let n=[];e&&(n=n.concat(Object.keys(e).map(t=>{const i=e[t],s=$r(t,i),n="r"===s,a="x"===s;return{options:i,dposition:n?"chartArea":a?"bottom":"left",dtype:n?"radialLinear":a?"category":"linear"}}))),Ne(n,e=>{const n=e.options,a=n.id,o=$r(a,n),r=We(n.type,e.dtype);void 0!==n.position&&rl(n.position,o)===rl(e.dposition)||(n.position=e.dposition),s[a]=!0;let l=null;if(a in i&&i[a].type===r)l=i[a];else{const t=Vr.getScale(r);l=new t({id:a,type:r,ctx:this.ctx,chart:this}),i[l.id]=l}l.init(n,t)}),Ne(s,(t,e)=>{t||delete i[e]}),Ne(i,t=>{Ro.configure(this,t,t.options),Ro.addBox(this,t)})}_updateMetasets(){const t=this._metasets,e=this.data.datasets.length,i=t.length;if(t.sort((t,e)=>t.index-e.index),i>e){for(let t=e;te.length&&delete this._stacks,t.forEach((t,i)=>{0===e.filter(e=>e===t._dataset).length&&this._destroyDatasetMeta(i)})}buildOrUpdateControllers(){const t=[],e=this.data.datasets;let i,s;for(this._removeUnreferencedMetasets(),i=0,s=e.length;i{this.getDatasetMeta(e).controller.reset()},this)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(t){const e=this.config;e.update();const i=this._options=e.createResolver(e.chartOptionScopes(),this.getContext()),s=this._animationsDisabled=!i.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),!1===this.notifyPlugins("beforeUpdate",{mode:t,cancelable:!0}))return;const n=this.buildOrUpdateControllers();this.notifyPlugins("beforeElementsUpdate");let a=0;for(let l=0,h=this.data.datasets.length;l{t.reset()}),this._updateDatasets(t),this.notifyPlugins("afterUpdate",{mode:t}),this._layers.sort(ll("z","_idx"));const{_active:o,_lastEvent:r}=this;r?this._eventHandler(r,!0):o.length&&this._updateHoverStyles(o,o,!0),this.render()}_updateScales(){Ne(this.scales,t=>{Ro.removeBox(this,t)}),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){const t=this.options,e=new Set(Object.keys(this._listeners)),i=new Set(t.events);si(e,i)&&!!this._responsiveListeners===t.responsive||(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){const{_hiddenIndices:t}=this,e=this._getUniformDataChanges()||[];for(const{method:i,start:s,count:n}of e){const e="_removeElements"===i?-n:n;pl(t,s,e)}}_getUniformDataChanges(){const t=this._dataChanges;if(!t||!t.length)return;this._dataChanges=[];const e=this.data.datasets.length,i=e=>new Set(t.filter(t=>t[0]===e).map((t,e)=>e+","+t.splice(1).join(","))),s=i(0);for(let n=1;nt.split(",")).map(t=>({method:t[1],start:+t[2],count:+t[3]}))}_updateLayout(t){if(!1===this.notifyPlugins("beforeLayout",{cancelable:!0}))return;Ro.update(this,this.width,this.height,t);const e=this.chartArea,i=e.width<=0||e.height<=0;this._layers=[],Ne(this.boxes,t=>{i&&"chartArea"===t.position||(t.configure&&t.configure(),this._layers.push(...t._layers()))},this),this._layers.forEach((t,e)=>{t._idx=e}),this.notifyPlugins("afterLayout")}_updateDatasets(t){if(!1!==this.notifyPlugins("beforeDatasetsUpdate",{mode:t,cancelable:!0})){for(let t=0,e=this.data.datasets.length;t=0;--e)this._drawDataset(t[e]);this.notifyPlugins("afterDatasetsDraw")}_drawDataset(t){const e=this.ctx,i={meta:t,index:t.index,cancelable:!0},s=ha(this,t);!1!==this.notifyPlugins("beforeDatasetDraw",i)&&(s&&Fs(e,s),t.controller.draw(),s&&As(e),i.cancelable=!1,this.notifyPlugins("afterDatasetDraw",i))}isPointInArea(t){return Cs(t,this.chartArea,this._minPadding)}getElementsAtEventForMode(t,e,i,s){const n=_o.modes[e];return"function"===typeof n?n(this,t,i,s):[]}getDatasetMeta(t){const e=this.data.datasets[t],i=this._metasets;let s=i.filter(t=>t&&t._dataset===e).pop();return s||(s={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e&&e.order||0,index:t,_dataset:e,_parsed:[],_sorted:!1},i.push(s)),s}getContext(){return this.$context||(this.$context=Xs(null,{chart:this,type:"chart"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){const e=this.data.datasets[t];if(!e)return!1;const i=this.getDatasetMeta(t);return"boolean"===typeof i.hidden?!i.hidden:!e.hidden}setDatasetVisibility(t,e){const i=this.getDatasetMeta(t);i.hidden=!e}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateVisibility(t,e,i){const s=i?"show":"hide",n=this.getDatasetMeta(t),a=n.controller._resolveAnimations(void 0,s);ei(e)?(n.data[e].hidden=!i,this.update()):(this.setDatasetVisibility(t,i),a.update(n,{visible:i}),this.update(e=>e.datasetIndex===t?s:void 0))}hide(t,e){this._updateVisibility(t,e,!1)}show(t,e){this._updateVisibility(t,e,!0)}_destroyDatasetMeta(t){const e=this._metasets[t];e&&e.controller&&e.controller._destroy(),delete this._metasets[t]}_stop(){let t,e;for(this.stop(),da.remove(this),t=0,e=this.data.datasets.length;t{e.addEventListener(this,i,s),t[i]=s},s=(t,e,i)=>{t.offsetX=e,t.offsetY=i,this._eventHandler(t)};Ne(this.options.events,t=>i(t,s))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});const t=this._responsiveListeners,e=this.platform,i=(i,s)=>{e.addEventListener(this,i,s),t[i]=s},s=(i,s)=>{t[i]&&(e.removeEventListener(this,i,s),delete t[i])},n=(t,e)=>{this.canvas&&this.resize(t,e)};let a;const o=()=>{s("attach",o),this.attached=!0,this.resize(),i("resize",n),i("detach",a)};a=()=>{this.attached=!1,s("resize",n),this._stop(),this._resize(0,0),i("attach",o)},e.isAttached(this.canvas)?o():a()}unbindEvents(){Ne(this._listeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._listeners={},Ne(this._responsiveListeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._responsiveListeners=void 0}updateHoverStyle(t,e,i){const s=i?"set":"remove";let n,a,o,r;for("dataset"===e&&(n=this.getDatasetMeta(t[0].datasetIndex),n.controller["_"+s+"DatasetHoverStyle"]()),o=0,r=t.length;o{const i=this.getDatasetMeta(t);if(!i)throw new Error("No dataset found at index "+t);return{datasetIndex:t,element:i.data[e],index:e}}),s=!je(i,e);s&&(this._active=i,this._lastEvent=null,this._updateHoverStyles(i,e))}notifyPlugins(t,e,i){return this._plugins.notify(this,t,e,i)}isPluginEnabled(t){return 1===this._plugins._cache.filter(e=>e.plugin.id===t).length}_updateHoverStyles(t,e,i){const s=this.options.hover,n=(t,e)=>t.filter(t=>!e.some(e=>t.datasetIndex===e.datasetIndex&&t.index===e.index)),a=n(e,t),o=i?t:n(t,e);a.length&&this.updateHoverStyle(a,s.mode,!1),o.length&&s.mode&&this.updateHoverStyle(o,s.mode,!0)}_eventHandler(t,e){const i={event:t,replay:e,cancelable:!0,inChartArea:this.isPointInArea(t)},s=e=>(e.options.events||this.options.events).includes(t.native.type);if(!1===this.notifyPlugins("beforeEvent",i,s))return;const n=this._handleEvent(t,e,i.inChartArea);return i.cancelable=!1,this.notifyPlugins("afterEvent",i,s),(n||i.changed)&&this.render(),this}_handleEvent(t,e,i){const{_active:s=[],options:n}=this,a=e,o=this._getActiveElements(t,s,i,a),r=ni(t),l=fl(t,this._lastEvent,i,r);i&&(this._lastEvent=null,Ue(n.onHover,[t,o,this],this),r&&Ue(n.onClick,[t,o,this],this));const h=!je(o,s);return(h||e)&&(this._active=o,this._updateHoverStyles(o,s,e)),this._lastEvent=l,h}_getActiveElements(t,e,i,s){if("mouseout"===t.type)return[];if(!i)return e;const n=this.options.hover;return this.getElementsAtEventForMode(t,n.mode,n,s)}}function bl(){return Ne(ml.instances,t=>t._plugins.invalidate())}function xl(t,e,i){const{startAngle:s,x:n,y:a,outerRadius:o,innerRadius:r,options:l}=e,{borderWidth:h,borderJoinStyle:c}=l,d=Math.min(h/o,Ai(s-i));if(t.beginPath(),t.arc(n,a,o-h/2,s+d/2,i-d/2),r>0){const e=Math.min(h/r,Ai(s-i));t.arc(n,a,r+h/2,i-e/2,s+e/2,!0)}else{const e=Math.min(h/2,o*Ai(s-i));if("round"===c)t.arc(n,a,e,i-ai/2,s+ai/2,!0);else if("bevel"===c){const o=2*e*e,r=-o*Math.cos(i+ai/2)+n,l=-o*Math.sin(i+ai/2)+a,h=o*Math.cos(s+ai/2)+n,c=o*Math.sin(s+ai/2)+a;t.lineTo(r,l),t.lineTo(h,c)}}t.closePath(),t.moveTo(0,0),t.rect(0,0,t.canvas.width,t.canvas.height),t.clip("evenodd")}function yl(t,e,i){const{startAngle:s,pixelMargin:n,x:a,y:o,outerRadius:r,innerRadius:l}=e;let h=n/r;t.beginPath(),t.arc(a,o,r,s-h,i+h),l>n?(h=n/l,t.arc(a,o,l,i+h,s-h,!0)):t.arc(a,o,n,i+ci,s-ci),t.closePath(),t.clip()}function _l(t){return Bs(t,["outerStart","outerEnd","innerStart","innerEnd"])}function vl(t,e,i,s){const n=_l(t.options.borderRadius),a=(i-e)/2,o=Math.min(a,s*e/2),r=t=>{const e=(i-Math.min(a,t))*s/2;return Ti(t,0,Math.min(a,e))};return{outerStart:r(n.outerStart),outerEnd:r(n.outerEnd),innerStart:Ti(n.innerStart,0,o),innerEnd:Ti(n.innerEnd,0,o)}}function kl(t,e,i,s){return{x:i+t*Math.cos(e),y:s+t*Math.sin(e)}}function wl(t,e,i,s,n,a){const{x:o,y:r,startAngle:l,pixelMargin:h,innerRadius:c}=e,d=Math.max(e.outerRadius+s+i-h,0),u=c>0?c+s+i+h:0;let g=0;const p=n-l;if(s){const t=c>0?c-s:0,e=d>0?d-s:0,i=(t+e)/2,n=0!==i?p*i/(i+s):p;g=(p-n)/2}const f=Math.max(.001,p*d-i/ai)/d,m=(p-f)/2,b=l+m+g,x=n-m-g,{outerStart:y,outerEnd:_,innerStart:v,innerEnd:k}=vl(e,u,d,x-b),w=d-y,S=d-_,M=b+y/w,C=x-_/S,F=u+v,A=u+k,P=b+v/F,T=x-k/A;if(t.beginPath(),a){const e=(M+C)/2;if(t.arc(o,r,d,M,e),t.arc(o,r,d,e,C),_>0){const e=kl(S,C,o,r);t.arc(e.x,e.y,_,C,x+ci)}const i=kl(A,x,o,r);if(t.lineTo(i.x,i.y),k>0){const e=kl(A,T,o,r);t.arc(e.x,e.y,k,x+ci,T+Math.PI)}const s=(x-k/u+(b+v/u))/2;if(t.arc(o,r,u,x-k/u,s,!0),t.arc(o,r,u,s,b+v/u,!0),v>0){const e=kl(F,P,o,r);t.arc(e.x,e.y,v,P+Math.PI,b-ci)}const n=kl(w,b,o,r);if(t.lineTo(n.x,n.y),y>0){const e=kl(w,M,o,r);t.arc(e.x,e.y,y,b-ci,M)}}else{t.moveTo(o,r);const e=Math.cos(M)*d+o,i=Math.sin(M)*d+r;t.lineTo(e,i);const s=Math.cos(C)*d+o,n=Math.sin(C)*d+r;t.lineTo(s,n)}t.closePath()}function Sl(t,e,i,s,n){const{fullCircles:a,startAngle:o,circumference:r}=e;let l=e.endAngle;if(a){wl(t,e,i,s,l,n);for(let e=0;e=ai&&0===g&&"miter"!==c&&xl(t,e,f),a||(wl(t,e,i,s,f,n),t.stroke())}(0,zt.A)(ml,"defaults",xs),(0,zt.A)(ml,"instances",ul),(0,zt.A)(ml,"overrides",gs),(0,zt.A)(ml,"registry",Vr),(0,zt.A)(ml,"version",al),(0,zt.A)(ml,"getChart",gl);class Cl extends rr{constructor(t){super(),(0,zt.A)(this,"circumference",void 0),(0,zt.A)(this,"endAngle",void 0),(0,zt.A)(this,"fullCircles",void 0),(0,zt.A)(this,"innerRadius",void 0),(0,zt.A)(this,"outerRadius",void 0),(0,zt.A)(this,"pixelMargin",void 0),(0,zt.A)(this,"startAngle",void 0),this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,t&&Object.assign(this,t)}inRange(t,e,i){const s=this.getProps(["x","y"],i),{angle:n,distance:a}=Mi(s,{x:t,y:e}),{startAngle:o,endAngle:r,innerRadius:l,outerRadius:h,circumference:c}=this.getProps(["startAngle","endAngle","innerRadius","outerRadius","circumference"],i),d=(this.options.spacing+this.options.borderWidth)/2,u=We(c,r-o),g=Pi(n,o,r)&&o!==r,p=u>=oi||g,f=Di(a,l+d,h+d);return p&&f}getCenterPoint(t){const{x:e,y:i,startAngle:s,endAngle:n,innerRadius:a,outerRadius:o}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius"],t),{offset:r,spacing:l}=this.options,h=(s+n)/2,c=(a+o+l+r)/2;return{x:e+Math.cos(h)*c,y:i+Math.sin(h)*c}}tooltipPosition(t){return this.getCenterPoint(t)}draw(t){const{options:e,circumference:i}=this,s=(e.offset||0)/4,n=(e.spacing||0)/2,a=e.circular;if(this.pixelMargin="inner"===e.borderAlign?.33:0,this.fullCircles=i>oi?Math.floor(i/oi):0,0===i||this.innerRadius<0||this.outerRadius<0)return;t.save();const o=(this.startAngle+this.endAngle)/2;t.translate(Math.cos(o)*s,Math.sin(o)*s);const r=1-Math.sin(Math.min(ai,i||0)),l=s*r;t.fillStyle=e.backgroundColor,t.strokeStyle=e.borderColor,Sl(t,this,l,n,a),Ml(t,this,l,n,a),t.restore()}}function Fl(t,e,i=e){t.lineCap=We(i.borderCapStyle,e.borderCapStyle),t.setLineDash(We(i.borderDash,e.borderDash)),t.lineDashOffset=We(i.borderDashOffset,e.borderDashOffset),t.lineJoin=We(i.borderJoinStyle,e.borderJoinStyle),t.lineWidth=We(i.borderWidth,e.borderWidth),t.strokeStyle=We(i.borderColor,e.borderColor)}function Al(t,e,i){t.lineTo(i.x,i.y)}function Pl(t){return t.stepped?Ps:t.tension||"monotone"===t.cubicInterpolationMode?Ts:Al}function Tl(t,e,i={}){const s=t.length,{start:n=0,end:a=s-1}=i,{start:o,end:r}=e,l=Math.max(n,o),h=Math.min(a,r),c=nr&&a>r;return{count:s,start:l,loop:e.loop,ilen:h(o+(h?r-t:t))%a,y=()=>{g!==p&&(t.lineTo(m,p),t.lineTo(m,g),t.lineTo(m,f))};for(l&&(d=n[x(0)],t.moveTo(d.x,d.y)),c=0;c<=r;++c){if(d=n[x(c)],d.skip)continue;const e=d.x,i=d.y,s=0|e;s===u?(ip&&(p=i),m=(b*m+e)/++b):(y(),t.lineTo(e,i),u=s,b=0,g=p=i),f=i}y()}function Vl(t){const e=t.options,i=e.borderDash&&e.borderDash.length,s=!t._decimated&&!t._loop&&!e.tension&&"monotone"!==e.cubicInterpolationMode&&!e.stepped&&!i;return s?Dl:Ll}function Il(t){return t.stepped?Nn:t.tension||"monotone"===t.cubicInterpolationMode?jn:Un}function El(t,e,i,s){let n=e._path;n||(n=e._path=new Path2D,e.path(n,i,s)&&n.closePath()),Fl(t,e.options),t.stroke(n)}function Ol(t,e,i,s){const{segments:n,options:a}=e,o=Vl(e);for(const r of n)Fl(t,a,r.style),t.beginPath(),o(t,e,r,{start:i,end:i+s-1})&&t.closePath(),t.stroke()}(0,zt.A)(Cl,"id","arc"),(0,zt.A)(Cl,"defaults",{borderAlign:"center",borderColor:"#fff",borderDash:[],borderDashOffset:0,borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0,circular:!0,selfJoin:!1}),(0,zt.A)(Cl,"defaultRoutes",{backgroundColor:"backgroundColor"}),(0,zt.A)(Cl,"descriptors",{_scriptable:!0,_indexable:t=>"borderDash"!==t});const Rl="function"===typeof Path2D;function Wl(t,e,i,s){Rl&&!e.options.segment?El(t,e,i,s):Ol(t,e,i,s)}class zl extends rr{constructor(t){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,t&&Object.assign(this,t)}updateControlPoints(t,e){const i=this.options;if((i.tension||"monotone"===i.cubicInterpolationMode)&&!i.stepped&&!this._pointsUpdated){const s=i.spanGaps?this._loop:this._fullLoop;Sn(this._points,i,t,s,e),this._pointsUpdated=!0}}set points(t){this._points=t,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=ia(this,this.options.segment))}first(){const t=this.segments,e=this.points;return t.length&&e[t[0].start]}last(){const t=this.segments,e=this.points,i=t.length;return i&&e[t[i-1].end]}interpolate(t,e){const i=this.options,s=t[e],n=this.points,a=Zn(this,{property:e,start:s,end:s});if(!a.length)return;const o=[],r=Il(i);let l,h;for(l=0,h=a.length;l"borderDash"!==t&&"fill"!==t});class Ul extends rr{constructor(t){super(),(0,zt.A)(this,"parsed",void 0),(0,zt.A)(this,"skip",void 0),(0,zt.A)(this,"stop",void 0),this.options=void 0,this.parsed=void 0,this.skip=void 0,this.stop=void 0,t&&Object.assign(this,t)}inRange(t,e,i){const s=this.options,{x:n,y:a}=this.getProps(["x","y"],i);return Math.pow(t-n,2)+Math.pow(e-a,2){let{boxHeight:i=e,boxWidth:s=e}=t;return t.usePointStyle&&(i=Math.min(i,e),s=t.pointStyleWidth||Math.min(s,e)),{boxWidth:s,boxHeight:i,itemHeight:Math.max(e,i)}},Zl=(t,e)=>null!==t&&null!==e&&t.datasetIndex===e.datasetIndex&&t.index===e.index;class th extends rr{constructor(t){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e,i){this.maxWidth=t,this.maxHeight=e,this._margins=i,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){const t=this.options.labels||{};let e=Ue(t.generateLabels,[this.chart],this)||[];t.filter&&(e=e.filter(e=>t.filter(e,this.chart.data))),t.sort&&(e=e.sort((e,i)=>t.sort(e,i,this.chart.data))),this.options.reverse&&e.reverse(),this.legendItems=e}fit(){const{options:t,ctx:e}=this;if(!t.display)return void(this.width=this.height=0);const i=t.labels,s=$s(i.font),n=s.size,a=this._computeTitleHeight(),{boxWidth:o,itemHeight:r}=Jl(i,n);let l,h;e.font=s.string,this.isHorizontal()?(l=this.maxWidth,h=this._fitRows(a,n,o,r)+10):(h=this.maxHeight,l=this._fitCols(a,s,o,r)+10),this.width=Math.min(l,t.maxWidth||this.maxWidth),this.height=Math.min(h,t.maxHeight||this.maxHeight)}_fitRows(t,e,i,s){const{ctx:n,maxWidth:a,options:{labels:{padding:o}}}=this,r=this.legendHitBoxes=[],l=this.lineWidths=[0],h=s+o;let c=t;n.textAlign="left",n.textBaseline="middle";let d=-1,u=-h;return this.legendItems.forEach((t,g)=>{const p=i+e/2+n.measureText(t.text).width;(0===g||l[l.length-1]+p+2*o>a)&&(c+=h,l[l.length-(g>0?0:1)]=0,u+=h,d++),r[g]={left:0,top:u,row:d,width:p,height:s},l[l.length-1]+=p+o}),c}_fitCols(t,e,i,s){const{ctx:n,maxHeight:a,options:{labels:{padding:o}}}=this,r=this.legendHitBoxes=[],l=this.columnSizes=[],h=a-t;let c=o,d=0,u=0,g=0,p=0;return this.legendItems.forEach((t,a)=>{const{itemWidth:f,itemHeight:m}=eh(i,e,n,t,s);a>0&&u+m+2*o>h&&(c+=d+o,l.push({width:d,height:u}),g+=d+o,p++,d=u=0),r[a]={left:g,top:u,col:p,width:f,height:m},d=Math.max(d,f),u+=m+o}),c+=d,l.push({width:d,height:u}),c}adjustHitBoxes(){if(!this.options.display)return;const t=this._computeTitleHeight(),{legendHitBoxes:e,options:{align:i,labels:{padding:s},rtl:n}}=this,a=qn(n,this.left,this.width);if(this.isHorizontal()){let n=0,o=Hi(i,this.left+s,this.right-this.lineWidths[n]);for(const r of e)n!==r.row&&(n=r.row,o=Hi(i,this.left+s,this.right-this.lineWidths[n])),r.top+=this.top+t+s,r.left=a.leftForLtr(a.x(o),r.width),o+=r.width+s}else{let n=0,o=Hi(i,this.top+t+s,this.bottom-this.columnSizes[n].height);for(const r of e)r.col!==n&&(n=r.col,o=Hi(i,this.top+t+s,this.bottom-this.columnSizes[n].height)),r.top=o,r.left+=this.left+s,r.left=a.leftForLtr(a.x(r.left),r.width),o+=r.height+s}}isHorizontal(){return"top"===this.options.position||"bottom"===this.options.position}draw(){if(this.options.display){const t=this.ctx;Fs(t,this),this._draw(),As(t)}}_draw(){const{options:t,columnSizes:e,lineWidths:i,ctx:s}=this,{align:n,labels:a}=t,o=xs.color,r=qn(t.rtl,this.left,this.width),l=$s(a.font),{padding:h}=a,c=l.size,d=c/2;let u;this.drawTitle(),s.textAlign=r.textAlign("left"),s.textBaseline="middle",s.lineWidth=.5,s.font=l.string;const{boxWidth:g,boxHeight:p,itemHeight:f}=Jl(a,c),m=function(t,e,i){if(isNaN(g)||g<=0||isNaN(p)||p<0)return;s.save();const n=We(i.lineWidth,1);if(s.fillStyle=We(i.fillStyle,o),s.lineCap=We(i.lineCap,"butt"),s.lineDashOffset=We(i.lineDashOffset,0),s.lineJoin=We(i.lineJoin,"miter"),s.lineWidth=n,s.strokeStyle=We(i.strokeStyle,o),s.setLineDash(We(i.lineDash,[])),a.usePointStyle){const o={radius:p*Math.SQRT2/2,pointStyle:i.pointStyle,rotation:i.rotation,borderWidth:n},l=r.xPlus(t,g/2),h=e+d;Ms(s,o,l,h,a.pointStyleWidth&&g)}else{const a=e+Math.max((c-p)/2,0),o=r.leftForLtr(t,g),l=Ns(i.borderRadius);s.beginPath(),Object.values(l).some(t=>0!==t)?Es(s,{x:o,y:a,w:g,h:p,radius:l}):s.rect(o,a,g,p),s.fill(),0!==n&&s.stroke()}s.restore()},b=function(t,e,i){Is(s,i.text,t,e+f/2,l,{strikethrough:i.hidden,textAlign:r.textAlign(i.textAlign)})},x=this.isHorizontal(),y=this._computeTitleHeight();u=x?{x:Hi(n,this.left+h,this.right-i[0]),y:this.top+h+y,line:0}:{x:this.left+h,y:Hi(n,this.top+y+h,this.bottom-e[0].height),line:0},Xn(this.ctx,t.textDirection);const _=f+h;this.legendItems.forEach((o,c)=>{s.strokeStyle=o.fontColor,s.fillStyle=o.fontColor;const p=s.measureText(o.text).width,f=r.textAlign(o.textAlign||(o.textAlign=a.textAlign)),v=g+d+p;let k=u.x,w=u.y;r.setWidth(this.width),x?c>0&&k+v+h>this.right&&(w=u.y+=_,u.line++,k=u.x=Hi(n,this.left+h,this.right-i[u.line])):c>0&&w+_>this.bottom&&(k=u.x=k+e[u.line].width+h,u.line++,w=u.y=Hi(n,this.top+y+h,this.bottom-e[u.line].height));const S=r.x(k);if(m(S,w,o),k=qi(f,k+g+d,x?k+v:this.right,t.rtl),b(r.x(k),w,o),x)u.x+=v+h;else if("string"!==typeof o.text){const t=l.lineHeight;u.y+=nh(o,t)+h}else u.y+=_}),Yn(this.ctx,t.textDirection)}drawTitle(){const t=this.options,e=t.title,i=$s(e.font),s=js(e.padding);if(!e.display)return;const n=qn(t.rtl,this.left,this.width),a=this.ctx,o=e.position,r=i.size/2,l=s.top+r;let h,c=this.left,d=this.width;if(this.isHorizontal())d=Math.max(...this.lineWidths),h=this.top+l,c=Hi(t.align,c,this.right-d);else{const e=this.columnSizes.reduce((t,e)=>Math.max(t,e.height),0);h=l+Hi(t.align,this.top,this.bottom-e-t.labels.padding-this._computeTitleHeight())}const u=Hi(o,c,c+d);a.textAlign=n.textAlign($i(o)),a.textBaseline="middle",a.strokeStyle=e.color,a.fillStyle=e.color,a.font=i.string,Is(a,e.text,u,h,i)}_computeTitleHeight(){const t=this.options.title,e=$s(t.font),i=js(t.padding);return t.display?e.lineHeight+i.height:0}_getLegendItemAt(t,e){let i,s,n;if(Di(t,this.left,this.right)&&Di(e,this.top,this.bottom))for(n=this.legendHitBoxes,i=0;it.length>e.length?t:e)),e+i.size/2+s.measureText(n).width}function sh(t,e,i){let s=t;return"string"!==typeof e.text&&(s=nh(e,i)),s}function nh(t,e){const i=t.text?t.text.length:0;return e*i}function ah(t,e){return!("mousemove"!==t&&"mouseout"!==t||!e.onHover&&!e.onLeave)||!(!e.onClick||"click"!==t&&"mouseup"!==t)}var oh={id:"legend",_element:th,start(t,e,i){const s=t.legend=new th({ctx:t.ctx,options:i,chart:t});Ro.configure(t,s,i),Ro.addBox(t,s)},stop(t){Ro.removeBox(t,t.legend),delete t.legend},beforeUpdate(t,e,i){const s=t.legend;Ro.configure(t,s,i),s.options=i},afterUpdate(t){const e=t.legend;e.buildLabels(),e.adjustHitBoxes()},afterEvent(t,e){e.replay||t.legend.handleEvent(e.event)},defaults:{display:!0,position:"top",align:"center",fullSize:!0,reverse:!1,weight:1e3,onClick(t,e,i){const s=e.datasetIndex,n=i.chart;n.isDatasetVisible(s)?(n.hide(s),e.hidden=!0):(n.show(s),e.hidden=!1)},onHover:null,onLeave:null,labels:{color:t=>t.chart.options.color,boxWidth:40,padding:10,generateLabels(t){const e=t.data.datasets,{labels:{usePointStyle:i,pointStyle:s,textAlign:n,color:a,useBorderRadius:o,borderRadius:r}}=t.legend.options;return t._getSortedDatasetMetas().map(t=>{const l=t.controller.getStyle(i?0:void 0),h=js(l.borderWidth);return{text:e[t.index].label,fillStyle:l.backgroundColor,fontColor:a,hidden:!t.visible,lineCap:l.borderCapStyle,lineDash:l.borderDash,lineDashOffset:l.borderDashOffset,lineJoin:l.borderJoinStyle,lineWidth:(h.width+h.height)/4,strokeStyle:l.borderColor,pointStyle:s||l.pointStyle,rotation:l.rotation,textAlign:n||l.textAlign,borderRadius:o&&(r||l.borderRadius),datasetIndex:t.index}},this)}},title:{color:t=>t.chart.options.color,display:!1,position:"center",text:""}},descriptors:{_scriptable:t=>!t.startsWith("on"),labels:{_scriptable:t=>!["generateLabels","filter","sort"].includes(t)}}};new WeakMap;const rh={average(t){if(!t.length)return!1;let e,i,s=new Set,n=0,a=0;for(e=0,i=t.length;et+e)/s.size;return{x:o,y:n/a}},nearest(t,e){if(!t.length)return!1;let i,s,n,a=e.x,o=e.y,r=Number.POSITIVE_INFINITY;for(i=0,s=t.length;i-1?t.split("\n"):t}function ch(t,e){const{element:i,datasetIndex:s,index:n}=e,a=t.getDatasetMeta(s).controller,{label:o,value:r}=a.getLabelAndValue(n);return{chart:t,label:o,parsed:a.getParsed(n),raw:t.data.datasets[s].data[n],formattedValue:r,dataset:a.getDataset(),dataIndex:n,datasetIndex:s,element:i}}function dh(t,e){const i=t.chart.ctx,{body:s,footer:n,title:a}=t,{boxWidth:o,boxHeight:r}=e,l=$s(e.bodyFont),h=$s(e.titleFont),c=$s(e.footerFont),d=a.length,u=n.length,g=s.length,p=js(e.padding);let f=p.height,m=0,b=s.reduce((t,e)=>t+e.before.length+e.lines.length+e.after.length,0);if(b+=t.beforeBody.length+t.afterBody.length,d&&(f+=d*h.lineHeight+(d-1)*e.titleSpacing+e.titleMarginBottom),b){const t=e.displayColors?Math.max(r,l.lineHeight):l.lineHeight;f+=g*t+(b-g)*l.lineHeight+(b-1)*e.bodySpacing}u&&(f+=e.footerMarginTop+u*c.lineHeight+(u-1)*e.footerSpacing);let x=0;const y=function(t){m=Math.max(m,i.measureText(t).width+x)};return i.save(),i.font=h.string,Ne(t.title,y),i.font=l.string,Ne(t.beforeBody.concat(t.afterBody),y),x=e.displayColors?o+2+e.boxPadding:0,Ne(s,t=>{Ne(t.before,y),Ne(t.lines,y),Ne(t.after,y)}),x=0,i.font=c.string,Ne(t.footer,y),i.restore(),m+=p.width,{width:m,height:f}}function uh(t,e){const{y:i,height:s}=e;return it.height-s/2?"bottom":"center"}function gh(t,e,i,s){const{x:n,width:a}=s,o=i.caretSize+i.caretPadding;return"left"===t&&n+a+o>e.width||("right"===t&&n-a-o<0||void 0)}function ph(t,e,i,s){const{x:n,width:a}=i,{width:o,chartArea:{left:r,right:l}}=t;let h="center";return"center"===s?h=n<=(r+l)/2?"left":"right":n<=a/2?h="left":n>=o-a/2&&(h="right"),gh(h,t,e,i)&&(h="center"),h}function fh(t,e,i){const s=i.yAlign||e.yAlign||uh(t,i);return{xAlign:i.xAlign||e.xAlign||ph(t,e,i,s),yAlign:s}}function mh(t,e){let{x:i,width:s}=t;return"right"===e?i-=s:"center"===e&&(i-=s/2),i}function bh(t,e,i){let{y:s,height:n}=t;return"top"===e?s+=i:s-="bottom"===e?n+i:n/2,s}function xh(t,e,i,s){const{caretSize:n,caretPadding:a,cornerRadius:o}=t,{xAlign:r,yAlign:l}=i,h=n+a,{topLeft:c,topRight:d,bottomLeft:u,bottomRight:g}=Ns(o);let p=mh(e,r);const f=bh(e,l,h);return"center"===l?"left"===r?p+=h:"right"===r&&(p-=h):"left"===r?p-=Math.max(c,u)+n:"right"===r&&(p+=Math.max(d,g)+n),{x:Ti(p,0,s.width-e.width),y:Ti(f,0,s.height-e.height)}}function yh(t,e,i){const s=js(i.padding);return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-s.right:t.x+s.left}function _h(t){return lh([],hh(t))}function vh(t,e,i){return Xs(t,{tooltip:e,tooltipItems:i,type:"tooltip"})}function kh(t,e){const i=e&&e.dataset&&e.dataset.tooltip&&e.dataset.tooltip.callbacks;return i?t.override(i):t}const wh={beforeTitle:Le,title(t){if(t.length>0){const e=t[0],i=e.chart.data.labels,s=i?i.length:0;if(this&&this.options&&"dataset"===this.options.mode)return e.dataset.label||"";if(e.label)return e.label;if(s>0&&e.dataIndex{const e={before:[],lines:[],after:[]},n=kh(i,t);lh(e.before,hh(Sh(n,"beforeLabel",this,t))),lh(e.lines,Sh(n,"label",this,t)),lh(e.after,hh(Sh(n,"afterLabel",this,t))),s.push(e)}),s}getAfterBody(t,e){return _h(Sh(e.callbacks,"afterBody",this,t))}getFooter(t,e){const{callbacks:i}=e,s=Sh(i,"beforeFooter",this,t),n=Sh(i,"footer",this,t),a=Sh(i,"afterFooter",this,t);let o=[];return o=lh(o,hh(s)),o=lh(o,hh(n)),o=lh(o,hh(a)),o}_createItems(t){const e=this._active,i=this.chart.data,s=[],n=[],a=[];let o,r,l=[];for(o=0,r=e.length;ot.filter(e,s,n,i))),t.itemSort&&(l=l.sort((e,s)=>t.itemSort(e,s,i))),Ne(l,e=>{const i=kh(t.callbacks,e);s.push(Sh(i,"labelColor",this,e)),n.push(Sh(i,"labelPointStyle",this,e)),a.push(Sh(i,"labelTextColor",this,e))}),this.labelColors=s,this.labelPointStyles=n,this.labelTextColors=a,this.dataPoints=l,l}update(t,e){const i=this.options.setContext(this.getContext()),s=this._active;let n,a=[];if(s.length){const t=rh[i.position].call(this,s,this._eventPosition);a=this._createItems(i),this.title=this.getTitle(a,i),this.beforeBody=this.getBeforeBody(a,i),this.body=this.getBody(a,i),this.afterBody=this.getAfterBody(a,i),this.footer=this.getFooter(a,i);const e=this._size=dh(this,i),o=Object.assign({},t,e),r=fh(this.chart,i,o),l=xh(i,o,r,this.chart);this.xAlign=r.xAlign,this.yAlign=r.yAlign,n={opacity:1,x:l.x,y:l.y,width:e.width,height:e.height,caretX:t.x,caretY:t.y}}else 0!==this.opacity&&(n={opacity:0});this._tooltipItems=a,this.$context=void 0,n&&this._resolveAnimations().update(this,n),t&&i.external&&i.external.call(this,{chart:this.chart,tooltip:this,replay:e})}drawCaret(t,e,i,s){const n=this.getCaretPosition(t,i,s);e.lineTo(n.x1,n.y1),e.lineTo(n.x2,n.y2),e.lineTo(n.x3,n.y3)}getCaretPosition(t,e,i){const{xAlign:s,yAlign:n}=this,{caretSize:a,cornerRadius:o}=i,{topLeft:r,topRight:l,bottomLeft:h,bottomRight:c}=Ns(o),{x:d,y:u}=t,{width:g,height:p}=e;let f,m,b,x,y,_;return"center"===n?(y=u+p/2,"left"===s?(f=d,m=f-a,x=y+a,_=y-a):(f=d+g,m=f+a,x=y-a,_=y+a),b=f):(m="left"===s?d+Math.max(r,h)+a:"right"===s?d+g-Math.max(l,c)-a:this.caretX,"top"===n?(x=u,y=x-a,f=m-a,b=m+a):(x=u+p,y=x+a,f=m+a,b=m-a),_=x),{x1:f,x2:m,x3:b,y1:x,y2:y,y3:_}}drawTitle(t,e,i){const s=this.title,n=s.length;let a,o,r;if(n){const l=qn(i.rtl,this.x,this.width);for(t.x=yh(this,i.titleAlign,i),e.textAlign=l.textAlign(i.titleAlign),e.textBaseline="middle",a=$s(i.titleFont),o=i.titleSpacing,e.fillStyle=i.titleColor,e.font=a.string,r=0;r0!==t)?(t.beginPath(),t.fillStyle=n.multiKeyBackground,Es(t,{x:e,y:g,w:l,h:r,radius:o}),t.fill(),t.stroke(),t.fillStyle=a.backgroundColor,t.beginPath(),Es(t,{x:i,y:g+1,w:l-2,h:r-2,radius:o}),t.fill()):(t.fillStyle=n.multiKeyBackground,t.fillRect(e,g,l,r),t.strokeRect(e,g,l,r),t.fillStyle=a.backgroundColor,t.fillRect(i,g+1,l-2,r-2))}t.fillStyle=this.labelTextColors[i]}drawBody(t,e,i){const{body:s}=this,{bodySpacing:n,bodyAlign:a,displayColors:o,boxHeight:r,boxWidth:l,boxPadding:h}=i,c=$s(i.bodyFont);let d=c.lineHeight,u=0;const g=qn(i.rtl,this.x,this.width),p=function(i){e.fillText(i,g.x(t.x+u),t.y+d/2),t.y+=d+n},f=g.textAlign(a);let m,b,x,y,_,v,k;for(e.textAlign=a,e.textBaseline="middle",e.font=c.string,t.x=yh(this,f,i),e.fillStyle=i.bodyColor,Ne(this.beforeBody,p),u=o&&"right"!==f?"center"===a?l/2+h:l+2+h:0,y=0,v=s.length;y0&&e.stroke()}_updateAnimationTarget(t){const e=this.chart,i=this.$animations,s=i&&i.x,n=i&&i.y;if(s||n){const i=rh[t.position].call(this,this._active,this._eventPosition);if(!i)return;const a=this._size=dh(this,t),o=Object.assign({},i,this._size),r=fh(e,t,o),l=xh(t,o,r,e);s._to===l.x&&n._to===l.y||(this.xAlign=r.xAlign,this.yAlign=r.yAlign,this.width=a.width,this.height=a.height,this.caretX=i.x,this.caretY=i.y,this._resolveAnimations().update(this,l))}}_willRender(){return!!this.opacity}draw(t){const e=this.options.setContext(this.getContext());let i=this.opacity;if(!i)return;this._updateAnimationTarget(e);const s={width:this.width,height:this.height},n={x:this.x,y:this.y};i=Math.abs(i)<.001?0:i;const a=js(e.padding),o=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;e.enabled&&o&&(t.save(),t.globalAlpha=i,this.drawBackground(n,t,s,e),Xn(t,e.textDirection),n.y+=a.top,this.drawTitle(n,t,e),this.drawBody(n,t,e),this.drawFooter(n,t,e),Yn(t,e.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,e){const i=this._active,s=t.map(({datasetIndex:t,index:e})=>{const i=this.chart.getDatasetMeta(t);if(!i)throw new Error("Cannot find a dataset at index "+t);return{datasetIndex:t,element:i.data[e],index:e}}),n=!je(i,s),a=this._positionChanged(s,e);(n||a)&&(this._active=s,this._eventPosition=e,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(t,e,i=!0){if(e&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;const s=this.options,n=this._active||[],a=this._getActiveElements(t,n,e,i),o=this._positionChanged(a,t),r=e||!je(a,n)||o;return r&&(this._active=a,(s.enabled||s.external)&&(this._eventPosition={x:t.x,y:t.y},this.update(!0,e))),r}_getActiveElements(t,e,i,s){const n=this.options;if("mouseout"===t.type)return[];if(!s)return e.filter(t=>this.chart.data.datasets[t.datasetIndex]&&void 0!==this.chart.getDatasetMeta(t.datasetIndex).controller.getParsed(t.index));const a=this.chart.getElementsAtEventForMode(t,n.mode,n,i);return n.reverse&&a.reverse(),a}_positionChanged(t,e){const{caretX:i,caretY:s,options:n}=this,a=rh[n.position].call(this,t,e);return!1!==a&&(i!==a.x||s!==a.y)}}(0,zt.A)(Mh,"positioners",rh);var Ch={id:"tooltip",_element:Mh,positioners:rh,afterInit(t,e,i){i&&(t.tooltip=new Mh({chart:t,options:i}))},beforeUpdate(t,e,i){t.tooltip&&t.tooltip.initialize(i)},reset(t,e,i){t.tooltip&&t.tooltip.initialize(i)},afterDraw(t){const e=t.tooltip;if(e&&e._willRender()){const i={tooltip:e};if(!1===t.notifyPlugins("beforeTooltipDraw",{...i,cancelable:!0}))return;e.draw(t.ctx),t.notifyPlugins("afterTooltipDraw",i)}},afterEvent(t,e){if(t.tooltip){const i=e.replay;t.tooltip.handleEvent(e.event,i,e.inChartArea)&&(e.changed=!0)}},defaults:{enabled:!0,external:null,position:"average",backgroundColor:"rgba(0,0,0,0.8)",titleColor:"#fff",titleFont:{weight:"bold"},titleSpacing:2,titleMarginBottom:6,titleAlign:"left",bodyColor:"#fff",bodySpacing:2,bodyFont:{},bodyAlign:"left",footerColor:"#fff",footerSpacing:2,footerMarginTop:6,footerFont:{weight:"bold"},footerAlign:"left",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(t,e)=>e.bodyFont.size,boxWidth:(t,e)=>e.bodyFont.size,multiKeyBackground:"#fff",displayColors:!0,boxPadding:0,borderColor:"rgba(0,0,0,0)",borderWidth:0,animation:{duration:400,easing:"easeOutQuart"},animations:{numbers:{type:"number",properties:["x","y","width","height","caretX","caretY"]},opacity:{easing:"linear",duration:200}},callbacks:wh},defaultRoutes:{bodyFont:"font",footerFont:"font",titleFont:"font"},descriptors:{_scriptable:t=>"filter"!==t&&"itemSort"!==t&&"external"!==t,_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]};const Fh=(t,e,i,s)=>("string"===typeof e?(i=t.push(e)-1,s.unshift({index:i,label:e})):isNaN(e)&&(i=null),i);function Ah(t,e,i,s){const n=t.indexOf(e);if(-1===n)return Fh(t,e,i,s);const a=t.lastIndexOf(e);return n!==a?i:n}const Ph=(t,e)=>null===t?null:Ti(Math.round(t),0,e);function Th(t){const e=this.getLabels();return t>=0&&te.length-1?null:this.getPixelForValue(e[t].value)}getValueForPixel(t){return Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange)}getBasePixel(){return this.bottom}}function Dh(t,e){const i=[],s=1e-14,{bounds:n,step:a,min:o,max:r,precision:l,count:h,maxTicks:c,maxDigits:d,includeBounds:u}=t,g=a||1,p=c-1,{min:f,max:m}=e,b=!Ve(o),x=!Ve(r),y=!Ve(h),_=(m-f)/(d+1);let v,k,w,S,M=mi((m-f)/p/g)*g;if(Mp&&(M=mi(S*M/p/g)*g),Ve(l)||(v=Math.pow(10,l),M=Math.ceil(M*v)/v),"ticks"===n?(k=Math.floor(f/M)*M,w=Math.ceil(m/M)*M):(k=f,w=m),b&&x&&a&&_i((r-o)/a,M/1e3)?(S=Math.round(Math.min((r-o)/M,c)),M=(r-o)/S,k=o,w=r):y?(k=b?o:k,w=x?r:w,S=h-1,M=(w-k)/S):(S=(w-k)/M,S=fi(S,Math.round(S),M/1e3)?Math.round(S):Math.ceil(S));const C=Math.max(Si(M),Si(k));v=Math.pow(10,Ve(l)?C:l),k=Math.round(k*v)/v,w=Math.round(w*v)/v;let F=0;for(b&&(u&&k!==o?(i.push({value:o}),kr)break;i.push({value:t})}return x&&u&&w!==r?i.length&&fi(i[i.length-1].value,r,Vh(r,_,t))?i[i.length-1].value=r:i.push({value:r}):x&&w!==r||i.push({value:w}),i}function Vh(t,e,{horizontal:i,minRotation:s}){const n=ki(s),a=(i?Math.sin(n):Math.cos(n))||.001,o=.75*e*(""+t).length;return Math.min(e/a,o)}(0,zt.A)(Lh,"id","category"),(0,zt.A)(Lh,"defaults",{ticks:{callback:Th}});class Ih extends Fr{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._endValue=void 0,this._valueRange=0}parse(t,e){return Ve(t)||("number"===typeof t||t instanceof Number)&&!isFinite(+t)?null:+t}handleTickRangeOptions(){const{beginAtZero:t}=this.options,{minDefined:e,maxDefined:i}=this.getUserBounds();let{min:s,max:n}=this;const a=t=>s=e?s:t,o=t=>n=i?n:t;if(t){const t=pi(s),e=pi(n);t<0&&e<0?o(0):t>0&&e>0&&a(0)}if(s===n){let e=0===n?1:Math.abs(.05*n);o(n+e),t||a(s-e)}this.min=s,this.max=n}getTickLimit(){const t=this.options.ticks;let e,{maxTicksLimit:i,stepSize:s}=t;return s?(e=Math.ceil(this.max/s)-Math.floor(this.min/s)+1,e>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${s} would result generating up to ${e} ticks. Limiting to 1000.`),e=1e3)):(e=this.computeTickLimit(),i=i||11),i&&(e=Math.min(i,e)),e}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){const t=this.options,e=t.ticks;let i=this.getTickLimit();i=Math.max(2,i);const s={maxTicks:i,bounds:t.bounds,min:t.min,max:t.max,precision:e.precision,step:e.stepSize,count:e.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:e.minRotation||0,includeBounds:!1!==e.includeBounds},n=this._range||this,a=Dh(s,n);return"ticks"===t.bounds&&vi(a,this,"value"),t.reverse?(a.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),a}configure(){const t=this.ticks;let e=this.min,i=this.max;if(super.configure(),this.options.offset&&t.length){const s=(i-e)/Math.max(t.length-1,1)/2;e-=s,i+=s}this._startValue=e,this._endValue=i,this._valueRange=i-e}getLabelForValue(t){return ls(t,this.chart.options.locale,this.options.ticks.format)}}class Eh extends Ih{determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=Oe(t)?t:0,this.max=Oe(e)?e:1,this.handleTickRangeOptions()}computeTickLimit(){const t=this.isHorizontal(),e=t?this.width:this.height,i=ki(this.options.ticks.minRotation),s=(t?Math.sin(i):Math.cos(i))||.001,n=this._resolveTickFontOptions(0);return Math.ceil(e/Math.min(40,n.lineHeight/s))}getPixelForValue(t){return null===t?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getValueForPixel(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange}}(0,zt.A)(Eh,"id","linear"),(0,zt.A)(Eh,"defaults",{ticks:{callback:ds.formatters.numeric}});const Oh=t=>Math.floor(gi(t)),Rh=(t,e)=>Math.pow(10,Oh(t)+e);function Wh(t){const e=t/Math.pow(10,Oh(t));return 1===e}function zh(t,e,i){const s=Math.pow(10,i),n=Math.floor(t/s),a=Math.ceil(e/s);return a-n}function Bh(t,e){const i=e-t;let s=Oh(i);while(zh(t,e,s)>10)s++;while(zh(t,e,s)<10)s--;return Math.min(s,Oh(t))}function Uh(t,{min:e,max:i}){e=Re(t.min,e);const s=[],n=Oh(e);let a=Bh(e,i),o=a<0?Math.pow(10,Math.abs(a)):1;const r=Math.pow(10,a),l=n>a?Math.pow(10,n):0,h=Math.round((e-l)*o)/o,c=Math.floor((e-l)/r/10)*r*10;let d=Math.floor((h-c)/Math.pow(10,a)),u=Re(t.min,Math.round((l+c+d*Math.pow(10,a))*o)/o);while(u=10?d=d<15?15:20:d++,d>=20&&(a++,d=2,o=a>=0?1:o),u=Math.round((l+c+d*Math.pow(10,a))*o)/o;const g=Re(t.max,u);return s.push({value:g,major:Wh(g),significand:d}),s}class Nh extends Fr{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(t,e){const i=Ih.prototype.parse.apply(this,[t,e]);if(0!==i)return Oe(i)&&i>0?i:null;this._zero=!0}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=Oe(t)?Math.max(0,t):null,this.max=Oe(e)?Math.max(0,e):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!Oe(this._userMin)&&(this.min=t===Rh(this.min,0)?Rh(this.min,-1):Rh(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let i=this.min,s=this.max;const n=e=>i=t?i:e,a=t=>s=e?s:t;i===s&&(i<=0?(n(1),a(10)):(n(Rh(i,-1)),a(Rh(s,1)))),i<=0&&n(Rh(s,-1)),s<=0&&a(Rh(i,1)),this.min=i,this.max=s}buildTicks(){const t=this.options,e={min:this._userMin,max:this._userMax},i=Uh(e,this);return"ticks"===t.bounds&&vi(i,this,"value"),t.reverse?(i.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),i}getLabelForValue(t){return void 0===t?"0":ls(t,this.chart.options.locale,this.options.ticks.format)}configure(){const t=this.min;super.configure(),this._startValue=gi(t),this._valueRange=gi(this.max)-gi(t)}getPixelForValue(t){return void 0!==t&&0!==t||(t=this.min),null===t||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:(gi(t)-this._startValue)/this._valueRange)}getValueForPixel(t){const e=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+e*this._valueRange)}}function jh(t){const e=t.ticks;if(e.display&&t.display){const t=js(e.backdropPadding);return We(e.font&&e.font.size,xs.font.size)+t.height}return 0}function $h(t,e,i){return i=Ie(i)?i:[i],{w:vs(t,e.string,i),h:i.length*e.lineHeight}}function Hh(t,e,i,s,n){return t===s||t===n?{start:e-i/2,end:e+i/2}:tn?{start:e-i,end:e}:{start:e,end:e+i}}function qh(t){const e={l:t.left+t._padding.left,r:t.right-t._padding.right,t:t.top+t._padding.top,b:t.bottom-t._padding.bottom},i=Object.assign({},e),s=[],n=[],a=t._pointLabels.length,o=t.options.pointLabels,r=o.centerPointLabels?ai/a:0;for(let l=0;le.r&&(r=(s.end-e.r)/a,t.r=Math.max(t.r,e.r+r)),n.starte.b&&(l=(n.end-e.b)/o,t.b=Math.max(t.b,e.b+l))}function Yh(t,e,i){const s=t.drawingArea,{extra:n,additionalAngle:a,padding:o,size:r}=i,l=t.getPointPosition(e,s+n+o,a),h=Math.round(wi(Ai(l.angle+ci))),c=Zh(l.y,r.h,h),d=Gh(h),u=Jh(l.x,r.w,d);return{visible:!0,x:l.x,y:c,textAlign:d,left:u,top:c,right:u+r.w,bottom:c+r.h}}function Kh(t,e){if(!e)return!0;const{left:i,top:s,right:n,bottom:a}=t,o=Cs({x:i,y:s},e)||Cs({x:i,y:a},e)||Cs({x:n,y:s},e)||Cs({x:n,y:a},e);return!o}function Qh(t,e,i){const s=[],n=t._pointLabels.length,a=t.options,{centerPointLabels:o,display:r}=a.pointLabels,l={extra:jh(a)/2,additionalAngle:o?ai/n:0};let h;for(let c=0;c270||i<90)&&(t-=e),t}function tc(t,e,i){const{left:s,top:n,right:a,bottom:o}=i,{backdropColor:r}=e;if(!Ve(r)){const i=Ns(e.borderRadius),l=js(e.backdropPadding);t.fillStyle=r;const h=s-l.left,c=n-l.top,d=a-s+l.width,u=o-n+l.height;Object.values(i).some(t=>0!==t)?(t.beginPath(),Es(t,{x:h,y:c,w:d,h:u,radius:i}),t.fill()):t.fillRect(h,c,d,u)}}function ec(t,e){const{ctx:i,options:{pointLabels:s}}=t;for(let n=e-1;n>=0;n--){const e=t._pointLabelItems[n];if(!e.visible)continue;const a=s.setContext(t.getPointLabelContext(n));tc(i,a,e);const o=$s(a.font),{x:r,y:l,textAlign:h}=e;Is(i,t._pointLabels[n],r,l+o.lineHeight/2,o,{color:a.color,textAlign:h,textBaseline:"middle"})}}function ic(t,e,i,s){const{ctx:n}=t;if(i)n.arc(t.xCenter,t.yCenter,e,0,oi);else{let i=t.getPointPosition(0,e);n.moveTo(i.x,i.y);for(let a=1;a{const i=Ue(this.options.pointLabels.callback,[t,e],this);return i||0===i?i:""}).filter((t,e)=>this.chart.getDataVisibility(e))}fit(){const t=this.options;t.display&&t.pointLabels.display?qh(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(t,e,i,s){this.xCenter+=Math.floor((t-e)/2),this.yCenter+=Math.floor((i-s)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(t,e,i,s))}getIndexAngle(t){const e=oi/(this._pointLabels.length||1),i=this.options.startAngle||0;return Ai(t*e+ki(i))}getDistanceFromCenterForValue(t){if(Ve(t))return NaN;const e=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-t)*e:(t-this.min)*e}getValueForDistanceFromCenter(t){if(Ve(t))return NaN;const e=t/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-e:this.min+e}getPointLabelContext(t){const e=this._pointLabels||[];if(t>=0&&t{if(0!==e||0===e&&this.min<0){r=this.getDistanceFromCenterForValue(t.value);const i=this.getContext(e),o=s.setContext(i),l=n.setContext(i);sc(this,o,r,a,l)}}),i.display){for(t.save(),o=a-1;o>=0;o--){const s=i.setContext(this.getPointLabelContext(o)),{color:n,lineWidth:a}=s;a&&n&&(t.lineWidth=a,t.strokeStyle=n,t.setLineDash(s.borderDash),t.lineDashOffset=s.borderDashOffset,r=this.getDistanceFromCenterForValue(e.reverse?this.min:this.max),l=this.getPointPosition(o,r),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(l.x,l.y),t.stroke())}t.restore()}}drawBorder(){}drawLabels(){const t=this.ctx,e=this.options,i=e.ticks;if(!i.display)return;const s=this.getIndexAngle(0);let n,a;t.save(),t.translate(this.xCenter,this.yCenter),t.rotate(s),t.textAlign="center",t.textBaseline="middle",this.ticks.forEach((s,o)=>{if(0===o&&this.min>=0&&!e.reverse)return;const r=i.setContext(this.getContext(o)),l=$s(r.font);if(n=this.getDistanceFromCenterForValue(this.ticks[o].value),r.showLabelBackdrop){t.font=l.string,a=t.measureText(s.label).width,t.fillStyle=r.backdropColor;const e=js(r.backdropPadding);t.fillRect(-a/2-e.left,-n-l.size/2-e.top,a+e.width,l.size+e.height)}Is(t,s.label,0,-n,l,{color:r.color,strokeColor:r.textStrokeColor,strokeWidth:r.textStrokeWidth})}),t.restore()}drawTitle(){}}(0,zt.A)(ac,"id","radialLinear"),(0,zt.A)(ac,"defaults",{display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:ds.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback(t){return t},padding:5,centerPointLabels:!1}}),(0,zt.A)(ac,"defaultRoutes",{"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"}),(0,zt.A)(ac,"descriptors",{angleLines:{_fallback:"grid"}});const oc={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},rc=Object.keys(oc);function lc(t,e){return t-e}function hc(t,e){if(Ve(e))return null;const i=t._adapter,{parser:s,round:n,isoWeekday:a}=t._parseOpts;let o=e;return"function"===typeof s&&(o=s(o)),Oe(o)||(o="string"===typeof s?i.parse(o,s):i.parse(o)),null===o?null:(n&&(o="week"!==n||!yi(a)&&!0!==a?i.startOf(o,n):i.startOf(o,"isoWeek",a)),+o)}function cc(t,e,i,s){const n=rc.length;for(let a=rc.indexOf(t);a=rc.indexOf(i);a--){const i=rc[a];if(oc[i].common&&t._adapter.diff(n,s,i)>=e-1)return i}return rc[i?rc.indexOf(i):0]}function uc(t){for(let e=rc.indexOf(t)+1,i=rc.length;e=e?i[s]:i[n];t[a]=!0}}else t[e]=!0}function pc(t,e,i,s){const n=t._adapter,a=+n.startOf(e[0].value,s),o=e[e.length-1].value;let r,l;for(r=a;r<=o;r=+n.add(r,1,s))l=i[r],l>=0&&(e[l].major=!0);return e}function fc(t,e,i){const s=[],n={},a=e.length;let o,r;for(o=0;o+t.value))}initOffsets(t=[]){let e,i,s=0,n=0;this.options.offset&&t.length&&(e=this.getDecimalForValue(t[0]),s=1===t.length?1-e:(this.getDecimalForValue(t[1])-e)/2,i=this.getDecimalForValue(t[t.length-1]),n=1===t.length?i:(i-this.getDecimalForValue(t[t.length-2]))/2);const a=t.length<3?.5:.25;s=Ti(s,0,a),n=Ti(n,0,a),this._offsets={start:s,end:n,factor:1/(s+1+n)}}_generate(){const t=this._adapter,e=this.min,i=this.max,s=this.options,n=s.time,a=n.unit||cc(n.minUnit,e,i,this._getLabelCapacity(e)),o=We(s.ticks.stepSize,1),r="week"===a&&n.isoWeekday,l=yi(r)||!0===r,h={};let c,d,u=e;if(l&&(u=+t.startOf(u,"isoWeek",r)),u=+t.startOf(u,l?"day":a),t.diff(i,e,a)>1e5*o)throw new Error(e+" and "+i+" are too far apart with stepSize of "+o+" "+a);const g="data"===s.ticks.source&&this.getDataTimestamps();for(c=u,d=0;c+t)}getLabelForValue(t){const e=this._adapter,i=this.options.time;return i.tooltipFormat?e.format(t,i.tooltipFormat):e.format(t,i.displayFormats.datetime)}format(t,e){const i=this.options,s=i.time.displayFormats,n=this._unit,a=e||s[n];return this._adapter.format(t,a)}_tickFormatFunction(t,e,i,s){const n=this.options,a=n.ticks.callback;if(a)return Ue(a,[t,e,i],this);const o=n.time.displayFormats,r=this._unit,l=this._majorUnit,h=r&&o[r],c=l&&o[l],d=i[e],u=l&&c&&d&&d.major;return this._adapter.format(t,s||(u?c:h))}generateTickLabels(t){let e,i,s;for(e=0,i=t.length;e0?o:1}getDataTimestamps(){let t,e,i=this._cache.data||[];if(i.length)return i;const s=this.getMatchingVisibleMetas();if(this._normalized&&s.length)return this._cache.data=s[0].controller.getAllParsedValues(this);for(t=0,e=s.length;t=t[r].pos&&e<=t[l].pos&&({lo:r,hi:l}=Ii(t,"pos",e)),({pos:s,time:a}=t[r]),({pos:n,time:o}=t[l])):(e>=t[r].time&&e<=t[l].time&&({lo:r,hi:l}=Ii(t,"time",e)),({time:s,pos:a}=t[r]),({time:n,pos:o}=t[l]));const h=n-s;return h?a+(o-a)*(e-s)/h:a}(0,zt.A)(mc,"id","time"),(0,zt.A)(mc,"defaults",{bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{source:"auto",callback:!1,major:{enabled:!1}}});class xc extends mc{constructor(t){super(t),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){const t=this._getTimestampsForTable(),e=this._table=this.buildLookupTable(t);this._minPos=bc(e,this.min),this._tableRange=bc(e,this.max)-this._minPos,super.initOffsets(t)}buildLookupTable(t){const{min:e,max:i}=this,s=[],n=[];let a,o,r,l,h;for(a=0,o=t.length;a=e&&l<=i&&s.push(l);if(s.length<2)return[{time:e,pos:0},{time:i,pos:1}];for(a=0,o=s.length;at-e)}_getTimestampsForTable(){let t=this._cache.all||[];if(t.length)return t;const e=this.getDataTimestamps(),i=this.getLabelTimestamps();return t=e.length&&i.length?this.normalize(e.concat(i)):e.length?e:i,t=this._cache.all=t,t}getDecimalForValue(t){return(bc(this._table,t)-this._minPos)/this._tableRange}getValueForPixel(t){const e=this._offsets,i=this.getDecimalForPixel(t)/e.factor-e.end;return bc(this._table,i*this._tableRange+this._minPos,!0)}}(0,zt.A)(xc,"id","timeseries"),(0,zt.A)(xc,"defaults",mc.defaults);var yc=i(144);const _c={data:{type:Object,required:!0},options:{type:Object,default:()=>({})},plugins:{type:Array,default:()=>[]},datasetIdKey:{type:String,default:"label"},updateMode:{type:String,default:void 0}},vc={ariaLabel:{type:String},ariaDescribedby:{type:String}},kc={type:{type:String,required:!0},destroyDelay:{type:Number,default:0},..._c,...vc},wc="2"===s.rE[0]?(t,e)=>Object.assign(t,{attrs:e}):(t,e)=>Object.assign(t,e);function Sc(t){return(0,yc.ju)(t)?(0,yc.ux)(t):t}function Mc(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t;return(0,yc.ju)(e)?new Proxy(t,{}):t}function Cc(t,e){const i=t.options;i&&e&&Object.assign(i,e)}function Fc(t,e){t.labels=e}function Ac(t,e,i){const s=[];t.datasets=e.map(e=>{const n=t.datasets.find(t=>t[i]===e[i]);return n&&e.data&&!s.includes(n)?(s.push(n),Object.assign(n,e),n):{...e}})}function Pc(t,e){const i={labels:[],datasets:[]};return Fc(i,t.labels),Ac(i,t.datasets,e),i}const Tc=(0,s.pM)({props:kc,setup(t,e){let{expose:i,slots:n}=e;const a=(0,yc.KR)(null),o=(0,yc.IJ)(null);i({chart:o});const r=()=>{if(!a.value)return;const{type:e,data:i,options:s,plugins:n,datasetIdKey:r}=t,l=Pc(i,r),h=Mc(l,i);o.value=new ml(a.value,{type:e,data:h,options:{...s},plugins:n})},l=()=>{const e=(0,yc.ux)(o.value);e&&(t.destroyDelay>0?setTimeout(()=>{e.destroy(),o.value=null},t.destroyDelay):(e.destroy(),o.value=null))},h=e=>{e.update(t.updateMode)};return(0,s.sV)(r),(0,s.hi)(l),(0,s.wB)([()=>t.options,()=>t.data],(e,i)=>{let[n,a]=e,[r,l]=i;const c=(0,yc.ux)(o.value);if(!c)return;let d=!1;if(n){const t=Sc(n),e=Sc(r);t&&t!==e&&(Cc(c,t),d=!0)}if(a){const e=Sc(a.labels),i=Sc(l.labels),s=Sc(a.datasets),n=Sc(l.datasets);e!==i&&(Fc(c.config.data,e),d=!0),s&&s!==n&&(Ac(c.config.data,s,t.datasetIdKey),d=!0)}d&&(0,s.dY)(()=>{h(c)})},{deep:!0}),()=>(0,s.h)("canvas",{role:"img","aria-label":t.ariaLabel,"aria-describedby":t.ariaDescribedby,ref:a},[(0,s.h)("p",{},[n.default?n.default():""])])}});function Lc(t,e){return ml.register(e),(0,s.pM)({props:_c,setup(e,i){let{expose:n}=i;const a=(0,yc.IJ)(null),o=t=>{a.value=t?.chart};return n({chart:a}),()=>(0,s.h)(Tc,wc({ref:o},{type:t,...e}))}})}const Dc=Lc("doughnut",io);ml.register(Cl,Ch,oh);var Vc={name:"SysCogStatus",components:{Doughnut:Dc},data(){return{loading:!1,rebuilding:!1,backing:!1,restoring:!1,indexInfo:{},version:Wt.rE,loadErrors:{newest:!1,oldest:!1},channelColors:["#8B5CF6","#EC4899","#06B6D4","#10B981","#F59E0B","#EF4444","#6366F1","#84CC16"],typeColors:["#10B981","#3B82F6","#F59E0B","#EF4444","#8B5CF6","#EC4899","#06B6D4","#84CC16"]}},computed:{channelChartData(){const t=this.indexInfo.channelStats||{};return{labels:Object.keys(t),datasets:[{data:Object.values(t),backgroundColor:this.channelColors.slice(0,Object.keys(t).length),borderWidth:0}]}},typeChartData(){const t=this.indexInfo.typeStats||{};return{labels:Object.keys(t).map(t=>t||"未知类型"),datasets:[{data:Object.values(t),backgroundColor:this.typeColors.slice(0,Object.keys(t).length),borderWidth:0}]}},chartOptions(){return{responsive:!0,maintainAspectRatio:!0,cutout:"65%",plugins:{legend:{display:!1},tooltip:{backgroundColor:"rgba(0, 0, 0, 0.8)",titleColor:"#fff",bodyColor:"#fff",padding:12,cornerRadius:8,displayColors:!0,callbacks:{label:t=>{const e=t.raw,i=t.dataset.data.reduce((t,e)=>t+e,0),s=(e/i*100).toFixed(1);return` ${e.toLocaleString()} (${s}%)`}}}},animation:{animateRotate:!0,animateScale:!0}}}},mounted(){this.fetchIndexInfo()},methods:{getChartColor(t){return this.channelColors[t%this.channelColors.length]},getTypeChartColor(t){return this.typeColors[t%this.typeColors.length]},async fetchIndexInfo(){this.loading=!0;try{const t=await(0,Rt.A)("/api/manage/list?action=info",{method:"GET"});if(!t.ok)throw new Error("API请求失败");{const e=await t.json();this.indexInfo=e}}catch(t){console.error("获取索引信息失败:",t),this.$message.error("获取索引信息失败")}finally{this.loading=!1}},async rebuildIndex(){this.rebuilding=!0;try{const t=await(0,Rt.A)("/api/manage/list?action=rebuild",{method:"GET"});if(!t.ok)throw new Error("API请求失败");this.$message.success("索引重建已启动,请稍后刷新查看最新状态"),setTimeout(()=>{this.fetchIndexInfo()},3e3)}catch(t){console.error("重建索引失败:",t),this.$message.error("重建索引失败")}finally{this.rebuilding=!1}},async backupData(){this.backing=!0;try{const t=await(0,Rt.A)("/api/manage/sysConfig/backup?action=backup",{method:"GET"});if(!t.ok){const e=await t.json();throw new Error(e.error||"API请求失败")}{const e=await t.blob(),i=window.URL.createObjectURL(e),s=document.createElement("a");s.href=i,s.download=`imgbed_backup_${(new Date).toISOString().split("T")[0]}.json`,document.body.appendChild(s),s.click(),document.body.removeChild(s),window.URL.revokeObjectURL(i),this.$message.success("备份文件已下载")}}catch(t){console.error("备份数据失败:",t),this.$message.error("备份数据失败: "+t.message)}finally{this.backing=!1}},selectRestoreFile(){this.restoring||this.$refs.fileInput.click()},async handleFileSelect(t){const e=t.target.files[0];if(e)if(e.name.endsWith(".json")){try{await this.$confirm("恢复操作将覆盖现有的文件元数据和系统设置,此操作不可逆。确定要继续吗?","确认恢复",{confirmButtonText:"确定恢复",cancelButtonText:"取消",type:"warning"}),await this.restoreData(e)}catch(i){"cancel"!==i&&console.error("确认恢复失败:",i)}t.target.value=""}else this.$message.error("请选择JSON格式的备份文件")},async restoreData(t){this.restoring=!0;try{const e=await(0,Rt.A)("/api/manage/sysConfig/backup?action=restore",{method:"POST",headers:{"Content-Type":"application/json"},body:await t.text()});if(!e.ok){const t=await e.json();throw new Error(t.error||"API请求失败")}{const t=await e.json();this.$message.success(`恢复完成!已恢复 ${t.stats.restoredFiles} 个文件和 ${t.stats.restoredSettings} 个设置项`),setTimeout(()=>{this.fetchIndexInfo()},1e3)}}catch(e){console.error("恢复数据失败:",e),this.$message.error("恢复数据失败: "+e.message)}finally{this.restoring=!1}},formatTime(t){if(!t)return"未知";const e=new Date(t);return e.toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"})},getPercentage(t,e){return e&&0!==e?Math.round(t/e*100):0},getTimeAgo(t){if(!t)return"";const e=Date.now(),i=e-t,s=Math.floor(i/6e4),n=Math.floor(i/36e5),a=Math.floor(i/864e5);return a>0?`${a}天前`:n>0?`${n}小时前`:s>0?`${s}分钟前`:"刚刚"},handleImageError(t){this.loadErrors[t]=!0},isValidPreview(t,e){return!this.loadErrors[t]&&(!!e?.metadata?.FileType&&(e.metadata.FileType.includes("image")||e.metadata.FileType.includes("video")))},openReleases(){window.open("https://github.com/MarSeventh/CloudFlare-ImgBed/releases","_blank")},isImageFile(t){if(!t)return!1;if(t.metadata?.FileType?.includes("image"))return!0;const e=t.metadata?.FileName||t.id||"",i=e.substring(e.lastIndexOf(".")+1).toLowerCase(),s=["jpg","jpeg","png","gif","bmp","webp","svg","ico","tiff","tif","avif","heic","heif"];return s.includes(i)},isVideoFile(t){if(!t)return!1;if(t.metadata?.FileType?.includes("video"))return!0;const e=t.metadata?.FileName||t.id||"",i=e.substring(e.lastIndexOf(".")+1).toLowerCase(),s=["mp4","webm","ogg","avi","mov","flv","wmv","mkv","m4v","3gp","mpeg","mpg"];return s.includes(i)}}};const Ic=(0,c.A)(Vc,[["render",Ot],["__scopeId","data-v-54756a6a"]]);var Ec=Ic,Oc=i(9655),Rc=(i(2893),i(1418)),Wc=(i(333),i(9623)),zc=(i(6711),i(2006)),Bc=i(5558),Uc=(i(8075),i(6810));i(4396),i(4885);const Nc={class:"upload-settings"},jc={class:"upload-channel"},$c={class:"first-title"},Hc={class:"channel-settings"},qc={class:"second-title"},Xc={key:0},Yc={key:1},Kc={class:"quota-status"},Qc={key:2},Gc={class:"quota-status"},Jc={key:3},Zc={class:"discord-limit-tip"},td={key:4},ed={class:"huggingface-tip"},id={class:"actions"};function sd(t,e,i,a,o,r){const l=(0,s.g2)("font-awesome-icon"),h=p.R7,c=Uc.ll,d=Uc.MQ,u=Bc.qi,g=zc.xE,f=zc.US,m=Wc.WK,b=k.S2,x=Rc.lq,y=Oc.ve,v=_.A;return(0,s.bo)(((0,s.uX)(),(0,s.CE)("div",Nc,[(0,s.Lk)("div",jc,[(0,s.Lk)("h3",$c,[e[5]||(e[5]=(0,s.eW)("上传渠道 ",-1)),(0,s.bF)(h,{content:"设置每类上传渠道的详细配置
点击“保存设置”会同时保存对每类配置的修改",placement:"right","raw-content":""},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),(0,s.bF)(d,{modelValue:o.activeChannel,"onUpdate:modelValue":e[0]||(e[0]=t=>o.activeChannel=t)},{default:(0,s.k6)(()=>[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(o.channels,t=>((0,s.uX)(),(0,s.Wv)(c,{key:t.value,label:t.value},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(t.label),1)]),_:2},1032,["label"]))),128))]),_:1},8,["modelValue"])]),(0,s.Lk)("div",Hc,[(0,s.Lk)("h4",qc,[(0,s.eW)((0,n.v_)(r.activeChannelLabel)+" 设置 ",1),"telegram"===o.activeChannel?((0,s.uX)(),(0,s.Wv)(h,{key:0,content:"为保证兼容性,v2版本前设置的 Telegram 相关环境变量请保留",placement:"right"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})):(0,s.Q3)("",!0)]),"telegram"===o.activeChannel?((0,s.uX)(),(0,s.CE)("div",Xc,[(0,s.bF)(f,{model:o.telegramSettings,"label-position":"top",class:"channel-form"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{label:"负载均衡"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:o.telegramSettings.loadBalance.enabled,"onUpdate:modelValue":e[1]||(e[1]=t=>o.telegramSettings.loadBalance.enabled=t)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"]),((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(o.telegramSettings.channels,(t,e)=>((0,s.uX)(),(0,s.Wv)(f,{key:e,model:t,"label-position":"top",rules:o.tgRules,ref_for:!0,ref:"tgChannelForm",class:"channel-form"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{label:"渠道名",prop:"name"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.name,"onUpdate:modelValue":e=>t.name=e,disabled:t.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"启用渠道",prop:"enabled"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:t.enabled,"onUpdate:modelValue":e=>t.enabled=e},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),(0,s.bF)(g,{label:"Bot Token",prop:"botToken"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.botToken,"onUpdate:modelValue":e=>t.botToken=e,disabled:t.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"Chat ID",prop:"chatId"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.chatId,"onUpdate:modelValue":e=>t.chatId=e,disabled:t.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,null,{default:(0,s.k6)(()=>[(0,s.bF)(b,{type:"danger",onClick:t=>r.deleteChannel(e),size:"small",disabled:t.fixed},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"trash-alt"})]),_:1},8,["onClick","disabled"])]),_:2},1024)]),_:2},1032,["model","rules"]))),128))])):(0,s.Q3)("",!0),"cfr2"===o.activeChannel?((0,s.uX)(),(0,s.CE)("div",Yc,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(o.cfr2Settings.channels,(t,i)=>((0,s.uX)(),(0,s.Wv)(f,{model:t,"label-position":"top",class:"channel-form"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{label:"渠道名"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.name,"onUpdate:modelValue":e=>t.name=e,disabled:t.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"启用渠道"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:t.enabled,"onUpdate:modelValue":e=>t.enabled=e},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),(0,s.bF)(g,null,{label:(0,s.k6)(()=>[e[6]||(e[6]=(0,s.eW)(" 公开访问链接 ",-1)),(0,s.bF)(h,{content:"若启用图像审查,请设置该项",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.publicUrl,"onUpdate:modelValue":e=>t.publicUrl=e},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),(0,s.bF)(g,null,{label:(0,s.k6)(()=>[e[7]||(e[7]=(0,s.eW)(" 容量限制 ",-1)),(0,s.bF)(h,{content:"启用后,当存储容量达到阈值时,该渠道将自动停止接收新文件,上传会自动切换到其他可用渠道",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:t.quota.enabled,"onUpdate:modelValue":e=>t.quota.enabled=e,onChange:e=>r.onQuotaEnabledChange(e,t)},null,8,["modelValue","onUpdate:modelValue","onChange"])]),_:2},1024),t.quota.enabled?((0,s.uX)(),(0,s.Wv)(g,{key:0,label:"容量上限 (GB)"},{default:(0,s.k6)(()=>[(0,s.bF)(x,{modelValue:t.quota.limitGB,"onUpdate:modelValue":e=>t.quota.limitGB=e,min:.1,step:1,precision:1},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024)):(0,s.Q3)("",!0),t.quota.enabled?((0,s.uX)(),(0,s.Wv)(g,{key:1},{label:(0,s.k6)(()=>[e[8]||(e[8]=(0,s.eW)(" 阈值 (%) ",-1)),(0,s.bF)(h,{content:"当已用容量达到此百分比时停止写入,默认95%",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(x,{modelValue:t.quota.threshold,"onUpdate:modelValue":e=>t.quota.threshold=e,min:50,max:100,step:5},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024)):(0,s.Q3)("",!0),t.quota.enabled&&t.name?((0,s.uX)(),(0,s.Wv)(g,{key:2},{label:(0,s.k6)(()=>[e[9]||(e[9]=(0,s.eW)(" 当前用量 ",-1)),(0,s.bF)(b,{link:"",type:"primary",onClick:r.refreshQuota,loading:o.quotaLoading,style:{"margin-left":"8px"}},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"sync-alt"})]),_:1},8,["onClick","loading"])]),default:(0,s.k6)(()=>[(0,s.Lk)("div",Kc,[(0,s.bF)(y,{percentage:r.getQuotaPercentage(t),status:r.getQuotaStatus(t),"stroke-width":20,"text-inside":!0,format:()=>r.getQuotaText(t)},null,8,["percentage","status","format"]),(0,s.Lk)("div",{class:(0,n.C4)(["quota-info",{"quota-warning":r.isQuotaExceeded(t)}])},(0,n.v_)(r.getQuotaStatusText(t)),3)])]),_:2},1024)):(0,s.Q3)("",!0)]),_:2},1032,["model"]))),256))])):(0,s.Q3)("",!0),"s3"===o.activeChannel?((0,s.uX)(),(0,s.CE)("div",Qc,[(0,s.bF)(f,{model:o.s3Settings,"label-position":"top",class:"channel-form"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{label:"负载均衡"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:o.s3Settings.loadBalance.enabled,"onUpdate:modelValue":e[2]||(e[2]=t=>o.s3Settings.loadBalance.enabled=t)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"]),((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(o.s3Settings.channels,(t,i)=>((0,s.uX)(),(0,s.Wv)(f,{model:t,"label-position":"top",rules:o.s3Rules,ref_for:!0,ref:"s3ChannelForm",class:"channel-form"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{label:"渠道名",prop:"name"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.name,"onUpdate:modelValue":e=>t.name=e,disabled:t.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"启用渠道",prop:"enabled"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:t.enabled,"onUpdate:modelValue":e=>t.enabled=e},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),(0,s.bF)(g,{prop:"endpoint"},{label:(0,s.k6)(()=>[e[10]||(e[10]=(0,s.eW)(" Endpoint ",-1)),(0,s.bF)(h,{content:"服务提供商 Endpoint,例如 https://s3.us-east-005.backblazeb2.com",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.endpoint,"onUpdate:modelValue":e=>t.endpoint=e,disabled:t.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"路径风格",prop:"pathStyle"},{label:(0,s.k6)(()=>[e[11]||(e[11]=(0,s.eW)(" 路径风格 ",-1)),(0,s.bF)(h,{content:"S3 路径风格/虚拟主机风格,使用 OpenList 作为 S3 提供者时需打开此开关
路径风格:https://s3.example.com/下方存储桶名称/文件路径
虚拟主机风格:https://下方存储桶名称.s3.example.com/文件路径",placement:"top","raw-content":""},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:t.pathStyle,"onUpdate:modelValue":e=>t.pathStyle=e,disabled:t.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"存储桶名称",prop:"bucketName"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.bucketName,"onUpdate:modelValue":e=>t.bucketName=e,disabled:t.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"存储桶区域",prop:"region"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.region,"onUpdate:modelValue":e=>t.region=e,placeholder:"默认填写 auto 即可",disabled:t.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"访问密钥 ID",prop:"accessKeyId"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.accessKeyId,"onUpdate:modelValue":e=>t.accessKeyId=e,disabled:t.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"机密访问密钥",prop:"secretAccessKey"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.secretAccessKey,"onUpdate:modelValue":e=>t.secretAccessKey=e,disabled:t.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,null,{label:(0,s.k6)(()=>[e[12]||(e[12]=(0,s.eW)(" 容量限制 ",-1)),(0,s.bF)(h,{content:"启用后,当存储容量达到阈值时,该渠道将自动停止接收新文件,上传会自动切换到其他可用渠道",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:t.quota.enabled,"onUpdate:modelValue":e=>t.quota.enabled=e,onChange:e=>r.onQuotaEnabledChange(e,t)},null,8,["modelValue","onUpdate:modelValue","onChange"])]),_:2},1024),t.quota.enabled?((0,s.uX)(),(0,s.Wv)(g,{key:0,label:"容量上限 (GB)"},{default:(0,s.k6)(()=>[(0,s.bF)(x,{modelValue:t.quota.limitGB,"onUpdate:modelValue":e=>t.quota.limitGB=e,min:.1,step:1,precision:1},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024)):(0,s.Q3)("",!0),t.quota.enabled?((0,s.uX)(),(0,s.Wv)(g,{key:1},{label:(0,s.k6)(()=>[e[13]||(e[13]=(0,s.eW)(" 阈值 (%) ",-1)),(0,s.bF)(h,{content:"当已用容量达到此百分比时停止写入,默认95%",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(x,{modelValue:t.quota.threshold,"onUpdate:modelValue":e=>t.quota.threshold=e,min:50,max:100,step:5},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024)):(0,s.Q3)("",!0),t.quota.enabled&&t.name?((0,s.uX)(),(0,s.Wv)(g,{key:2},{label:(0,s.k6)(()=>[e[14]||(e[14]=(0,s.eW)(" 当前用量 ",-1)),(0,s.bF)(b,{link:"",type:"primary",onClick:r.refreshQuota,loading:o.quotaLoading,style:{"margin-left":"8px"}},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"sync-alt"})]),_:1},8,["onClick","loading"])]),default:(0,s.k6)(()=>[(0,s.Lk)("div",Gc,[(0,s.bF)(y,{percentage:r.getQuotaPercentage(t),status:r.getQuotaStatus(t),"stroke-width":20,"text-inside":!0,format:()=>r.getQuotaText(t)},null,8,["percentage","status","format"]),(0,s.Lk)("div",{class:(0,n.C4)(["quota-info",{"quota-warning":r.isQuotaExceeded(t)}])},(0,n.v_)(r.getQuotaStatusText(t)),3)])]),_:2},1024)):(0,s.Q3)("",!0),(0,s.bF)(g,null,{default:(0,s.k6)(()=>[(0,s.bF)(b,{type:"danger",onClick:t=>r.deleteChannel(i),size:"small",disabled:t.fixed},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"trash-alt"})]),_:1},8,["onClick","disabled"])]),_:2},1024)]),_:2},1032,["model","rules"]))),256))])):(0,s.Q3)("",!0),"discord"===o.activeChannel?((0,s.uX)(),(0,s.CE)("div",Jc,[(0,s.bF)(f,{model:o.discordSettings,"label-position":"top",class:"channel-form"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{label:"负载均衡"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:o.discordSettings.loadBalance.enabled,"onUpdate:modelValue":e[3]||(e[3]=t=>o.discordSettings.loadBalance.enabled=t)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"]),((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(o.discordSettings.channels,(t,i)=>((0,s.uX)(),(0,s.Wv)(f,{key:i,model:t,"label-position":"top",rules:o.discordRules,ref_for:!0,ref:"discordChannelForm",class:"channel-form"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{label:"渠道名",prop:"name"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.name,"onUpdate:modelValue":e=>t.name=e,disabled:t.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"启用渠道",prop:"enabled"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:t.enabled,"onUpdate:modelValue":e=>t.enabled=e},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),(0,s.bF)(g,{label:"Bot Token",prop:"botToken"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.botToken,"onUpdate:modelValue":e=>t.botToken=e,disabled:t.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"Channel ID",prop:"channelId"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.channelId,"onUpdate:modelValue":e=>t.channelId=e,disabled:t.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,null,{label:(0,s.k6)(()=>[e[15]||(e[15]=(0,s.eW)(" 代理域名 ",-1)),(0,s.bF)(h,{content:"可选,用于国内访问 Discord CDN,填写代理域名(不含 https://)",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.proxyUrl,"onUpdate:modelValue":e=>t.proxyUrl=e,placeholder:"例如: your-proxy.example.com"},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),(0,s.bF)(g,null,{label:(0,s.k6)(()=>[e[16]||(e[16]=(0,s.eW)(" Nitro 会员 ",-1)),(0,s.bF)(h,{content:"开启后单文件限制提升至 25MB,关闭则为 10MB",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:t.isNitro,"onUpdate:modelValue":e=>t.isNitro=e},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),(0,s.bF)(g,null,{default:(0,s.k6)(()=>[(0,s.Lk)("div",Zc,[(0,s.bF)(l,{icon:"info-circle",style:{"margin-right":"5px"}}),(0,s.eW)(" "+(0,n.v_)(t.isNitro?"Nitro 会员单文件限制 25MB,超过将自动切换其他渠道":"Discord 免费用户单文件限制 10MB,超过将自动切换其他渠道"),1)])]),_:2},1024),(0,s.bF)(g,null,{default:(0,s.k6)(()=>[(0,s.bF)(b,{type:"danger",onClick:t=>r.deleteChannel(i),size:"small",disabled:t.fixed},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"trash-alt"})]),_:1},8,["onClick","disabled"])]),_:2},1024)]),_:2},1032,["model","rules"]))),128))])):(0,s.Q3)("",!0),"huggingface"===o.activeChannel?((0,s.uX)(),(0,s.CE)("div",td,[(0,s.bF)(f,{model:o.huggingfaceSettings,"label-position":"top",class:"channel-form"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{label:"负载均衡"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:o.huggingfaceSettings.loadBalance.enabled,"onUpdate:modelValue":e[4]||(e[4]=t=>o.huggingfaceSettings.loadBalance.enabled=t)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"]),((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(o.huggingfaceSettings.channels,(t,i)=>((0,s.uX)(),(0,s.Wv)(f,{key:i,model:t,"label-position":"top",rules:o.huggingfaceRules,ref_for:!0,ref:"huggingfaceChannelForm",class:"channel-form"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{label:"渠道名",prop:"name"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.name,"onUpdate:modelValue":e=>t.name=e,disabled:t.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"启用渠道",prop:"enabled"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:t.enabled,"onUpdate:modelValue":e=>t.enabled=e},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),(0,s.bF)(g,{prop:"repo"},{label:(0,s.k6)(()=>[e[17]||(e[17]=(0,s.eW)(" 仓库名 ",-1)),(0,s.bF)(h,{content:"格式:用户名/仓库名,例如 username/my-images",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.repo,"onUpdate:modelValue":e=>t.repo=e,disabled:t.fixed,placeholder:"username/repo-name"},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"Access Token",prop:"token"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.token,"onUpdate:modelValue":e=>t.token=e,disabled:t.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,null,{label:(0,s.k6)(()=>[e[18]||(e[18]=(0,s.eW)(" 私有仓库 ",-1)),(0,s.bF)(h,{content:"开启后仓库将设为私有,访问时需要通过服务器代理",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:t.isPrivate,"onUpdate:modelValue":e=>t.isPrivate=e},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),(0,s.bF)(g,null,{default:(0,s.k6)(()=>[(0,s.Lk)("div",ed,[(0,s.bF)(l,{icon:"info-circle",style:{"margin-right":"5px"}}),(0,s.eW)(" "+(0,n.v_)(t.isPrivate?"私有仓库限制 100GB,访问时服务器会代理请求":"公开仓库无容量限制,文件可直接访问"),1)])]),_:2},1024),(0,s.bF)(g,null,{default:(0,s.k6)(()=>[(0,s.bF)(b,{type:"danger",onClick:t=>r.deleteChannel(i),size:"small",disabled:t.fixed},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"trash-alt"})]),_:1},8,["onClick","disabled"])]),_:2},1024)]),_:2},1032,["model","rules"]))),128))])):(0,s.Q3)("",!0)]),(0,s.Lk)("div",id,[(0,s.bF)(b,{type:"primary",onClick:r.addChannel},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"plus"})]),_:1},8,["onClick"]),(0,s.bF)(b,{type:"primary",onClick:r.saveSettings},{default:(0,s.k6)(()=>[...e[19]||(e[19]=[(0,s.eW)("保存设置",-1)])]),_:1},8,["onClick"])])])),[[v,o.loading]])}i(1148);var nd={data(){return{channels:[{value:"telegram",label:"Telegram"},{value:"cfr2",label:"CloudFlare R2"},{value:"s3",label:"S3"},{value:"discord",label:"Discord"},{value:"huggingface",label:"HuggingFace"}],activeChannel:"telegram",telegramSettings:{loadBalance:{},channels:[]},tgRules:{name:[{required:!0,message:"请输入渠道名",trigger:"blur"},{validator:(t,e,i)=>{const s=this.telegramSettings.channels.map(t=>t.name);if(s.filter(t=>t===e).length>1)i(new Error("渠道名不能重复"));else if("Telegram_env"===e){const t=this.telegramSettings.channels.find(t=>t.name===e).savePath;"environment variable"!==t?i(new Error("渠道名不能为保留值")):i()}else i()},trigger:"blur"}],botToken:[{required:!0,message:"请输入 Bot Token",trigger:"blur"}],chatId:[{required:!0,message:"请输入 Chat ID",trigger:"blur"}]},cfr2Settings:{channels:[]},s3Settings:{loadBalance:{},channels:[]},discordSettings:{loadBalance:{},channels:[]},huggingfaceSettings:{loadBalance:{},channels:[]},huggingfaceRules:{name:[{required:!0,message:"请输入渠道名",trigger:"blur"},{validator:(t,e,i)=>{const s=this.huggingfaceSettings.channels.map(t=>t.name);if(s.filter(t=>t===e).length>1)i(new Error("渠道名不能重复"));else if("HuggingFace_env"===e){const t=this.huggingfaceSettings.channels.find(t=>t.name===e).savePath;"environment variable"!==t?i(new Error("渠道名不能为保留值")):i()}else i()},trigger:"blur"}],token:[{required:!0,message:"请输入 Access Token",trigger:"blur"}],repo:[{required:!0,message:"请输入仓库名",trigger:"blur"}]},discordRules:{name:[{required:!0,message:"请输入渠道名",trigger:"blur"},{validator:(t,e,i)=>{const s=this.discordSettings.channels.map(t=>t.name);if(s.filter(t=>t===e).length>1)i(new Error("渠道名不能重复"));else if("Discord_env"===e){const t=this.discordSettings.channels.find(t=>t.name===e).savePath;"environment variable"!==t?i(new Error("渠道名不能为保留值")):i()}else i()},trigger:"blur"}],botToken:[{required:!0,message:"请输入 Bot Token",trigger:"blur"}],channelId:[{required:!0,message:"请输入 Channel ID",trigger:"blur"}]},quotaStats:{},quotaLoading:!1,s3Rules:{name:[{required:!0,message:"请输入渠道名",trigger:"blur"},{validator:(t,e,i)=>{const s=this.s3Settings.channels.map(t=>t.name);if(s.filter(t=>t===e).length>1)i(new Error("渠道名不能重复"));else if("S3_env"===e){const t=this.s3Settings.channels.find(t=>t.name===e).savePath;"environment variable"!==t?i(new Error("渠道名不能为保留值")):i()}else i()},trigger:"blur"}],endpoint:[{required:!0,message:"请输入 Endpoint",trigger:"blur"}],bucketName:[{required:!0,message:"请输入存储桶名称",trigger:"blur"}],region:[{required:!0,message:"请输入存储桶区域",trigger:"blur"}],accessKeyId:[{required:!0,message:"请输入访问密钥 ID",trigger:"blur"}],secretAccessKey:[{required:!0,message:"请输入机密访问密钥",trigger:"blur"}]},loading:!1}},computed:{activeChannelLabel(){const t=this.channels.find(t=>t.value===this.activeChannel);return t?t.label:""}},methods:{addChannel(){switch(this.activeChannel){case"telegram":this.telegramSettings.channels.push({id:this.telegramSettings.channels.length+1,name:"",type:"telegram",savePath:"database",botToken:"",chatId:"",enabled:!0,fixed:!1});break;case"cfr2":this.$message.error("R2渠道请通过绑定 R2 存储桶或通过 S3 渠道添加");break;case"s3":this.s3Settings.channels.push({id:this.s3Settings.channels.length+1,name:"",type:"s3",savePath:"database",accessKeyId:"",secretAccessKey:"",region:"",bucketName:"",endpoint:"",pathStyle:!1,enabled:!0,fixed:!1,quota:{enabled:!1,limitGB:10,threshold:95}});break;case"discord":this.discordSettings.channels.push({id:this.discordSettings.channels.length+1,name:"",type:"discord",savePath:"database",botToken:"",channelId:"",proxyUrl:"",isNitro:!1,enabled:!0,fixed:!1});break;case"huggingface":this.huggingfaceSettings.channels.push({id:this.huggingfaceSettings.channels.length+1,name:"",type:"huggingface",savePath:"database",token:"",repo:"",isPrivate:!1,enabled:!0,fixed:!1});break}},deleteChannel(t){switch(this.activeChannel){case"telegram":this.telegramSettings.channels.forEach((e,i)=>{i>t&&(e.id-=1)}),this.telegramSettings.channels.splice(t,1);break;case"cfr2":this.cfr2Settings.channels.forEach((e,i)=>{i>t&&(e.id-=1)}),this.cfr2Settings.channels.splice(t,1);break;case"s3":this.s3Settings.channels.forEach((e,i)=>{i>t&&(e.id-=1)}),this.s3Settings.channels.splice(t,1);break;case"discord":this.discordSettings.channels.forEach((e,i)=>{i>t&&(e.id-=1)}),this.discordSettings.channels.splice(t,1);break;case"huggingface":this.huggingfaceSettings.channels.forEach((e,i)=>{i>t&&(e.id-=1)}),this.huggingfaceSettings.channels.splice(t,1);break}},saveSettings(){let t=[];this.$refs.tgChannelForm&&this.$refs.tgChannelForm.forEach(e=>{t.push(new Promise(t=>{e.validate(e=>t(e))}))}),this.$refs.s3ChannelForm&&this.$refs.s3ChannelForm.forEach(e=>{t.push(new Promise(t=>{e.validate(e=>t(e))}))}),this.$refs.discordChannelForm&&this.$refs.discordChannelForm.forEach(e=>{t.push(new Promise(t=>{e.validate(e=>t(e))}))}),this.$refs.huggingfaceChannelForm&&this.$refs.huggingfaceChannelForm.forEach(e=>{t.push(new Promise(t=>{e.validate(e=>t(e))}))}),Promise.all(t).then(t=>{const e=t.every(t=>t);if(!e)return;const i={telegram:this.telegramSettings,cfr2:this.cfr2Settings,s3:this.s3Settings,discord:this.discordSettings,huggingface:this.huggingfaceSettings};(0,Rt.A)("/api/manage/sysConfig/upload",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)}).then(()=>{this.$message.success("设置已保存")})})},async refreshQuota(){this.quotaLoading=!0;try{const t=await(0,Rt.A)("/api/manage/quota",{method:"POST"}),e=await t.json();if(e.success)this.quotaStats=e.channelStats||{};else{const t=await(0,Rt.A)("/api/manage/quota"),e=await t.json();e.success&&(this.quotaStats=e.quotaStats||{})}}catch(t){console.error("Failed to refresh quota stats:",t)}finally{this.quotaLoading=!1}},async loadQuotaStats(){try{const t=await(0,Rt.A)("/api/manage/quota"),e=await t.json();e.success&&(this.quotaStats=e.quotaStats||{})}catch(t){console.error("Failed to load quota stats:",t)}},getChannelUsedGB(t){const e=this.quotaStats[t.name];return e?(e.usedMB||0)/1024:0},getQuotaPercentage(t){const e=this.getChannelUsedGB(t),i=t.quota?.limitGB||10,s=e/i*100;return Math.min(100,Math.round(10*s)/10)},getQuotaStatus(t){const e=this.getQuotaPercentage(t),i=t.quota?.threshold||95;return e>=i?"exception":e>=80?"warning":"success"},getQuotaText(t){const e=this.getChannelUsedGB(t),i=t.quota?.limitGB||10;return`${e.toFixed(2)} / ${i} GB`},isQuotaExceeded(t){const e=this.getQuotaPercentage(t),i=t.quota?.threshold||95;return e>=i},getQuotaStatusText(t){const e=this.getQuotaPercentage(t),i=t.quota?.threshold||95;return e>=i?`⚠️ 已达到容量阈值 (${i}%),渠道写入已暂停`:e>=80?"⚡ 容量使用较高,接近阈值":"✓ 容量正常"},async onQuotaEnabledChange(t,e){if(t&&e.name){const t=this.quotaStats[e.name];t||this.$confirm("首次启用容量限制需要统计现有文件容量,这可能需要一些时间。是否立即统计?","初始化容量统计",{confirmButtonText:"立即统计",cancelButtonText:"稍后手动统计",type:"info"}).then(async()=>{await this.recalculateQuota()}).catch(()=>{this.$message.info("您可以稍后点击刷新按钮手动统计")})}},async recalculateQuota(){this.quotaLoading=!0;try{this.$message.info("正在统计容量,请稍候...");const t=await(0,Rt.A)("/api/manage/quota",{method:"POST"}),e=await t.json();e.success?(this.quotaStats=e.channelStats||{},this.$message.success("容量统计完成")):this.$message.error("统计失败: "+(e.error||"未知错误"))}catch(t){console.error("Failed to recalculate quota:",t),this.$message.error("统计失败")}finally{this.quotaLoading=!1}}},mounted(){this.loading=!0,(0,Rt.A)("/api/manage/sysConfig/upload").then(t=>t.json()).then(t=>{this.telegramSettings=t.telegram,t.cfr2&&t.cfr2.channels&&(t.cfr2.channels=t.cfr2.channels.map(t=>({...t,quota:t.quota||{enabled:!1,limitGB:10,threshold:95}}))),this.cfr2Settings=t.cfr2,t.s3&&t.s3.channels&&(t.s3.channels=t.s3.channels.map(t=>({...t,quota:t.quota||{enabled:!1,limitGB:10,threshold:95}}))),this.s3Settings=t.s3,t.discord&&t.discord.channels&&(t.discord.channels=t.discord.channels.map(t=>({...t,proxyUrl:t.proxyUrl||""}))),this.discordSettings=t.discord||{loadBalance:{},channels:[]},t.huggingface&&t.huggingface.channels&&(t.huggingface.channels=t.huggingface.channels.map(t=>({...t,isPrivate:t.isPrivate||!1}))),this.huggingfaceSettings=t.huggingface||{loadBalance:{},channels:[]},this.loadQuotaStats()}).finally(()=>{this.loading=!1})}};const ad=(0,c.A)(nd,[["render",sd],["__scopeId","data-v-d5b2dcdc"]]);var od=ad,rd=i(9267),ld=(i(5616),i(850)),hd=(i(8736),i(6018)),cd=(i(6808),i(200),i(7138)),dd=(i(5802),i(2687)),ud=(i(8785),i(4752),i(5130));const gd={class:"security-settings"},pd={class:"first-settings"},fd={class:"second-title token-title"},md={class:"token-actions"},bd={class:"token-table-container"},xd={class:"table-cell-content"},yd={class:"table-cell-content"},_d={class:"token-display"},vd={class:"table-cell-content"},kd={class:"table-cell-content"},wd={class:"table-cell-content action-buttons"},Sd={class:"first-settings"},Md={class:"second-title"},Cd={class:"first-settings"},Fd={class:"actions"},Ad={class:"dialog-footer"},Pd={class:"dialog-footer"},Td={class:"token-result"},Ld={style:{"margin-bottom":"15px",color:"#e6a23c"}},Dd={class:"dialog-footer"};function Vd(t,e,i,a,o,r){const l=Wc.WK,h=zc.xE,c=zc.US,d=(0,s.g2)("font-awesome-icon"),u=k.S2,g=cd.o8,f=dd.u,m=cd.Up,b=p.R7,x=Bc.qi,y=hd.P9,v=hd.AV,w=ld.dI,S=ld.o5,M=rd.kZ,C=_.A;return(0,s.bo)(((0,s.uX)(),(0,s.CE)("div",gd,[(0,s.Lk)("div",pd,[e[26]||(e[26]=(0,s.Lk)("h3",{class:"first-title"},"认证管理",-1)),e[27]||(e[27]=(0,s.Lk)("h4",{class:"second-title"},"用户端认证",-1)),(0,s.bF)(c,{model:o.authSettings.user,rules:o.userPassRules,ref:"userPassForm","label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{label:"上传密码",prop:"authCode"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:o.authSettings.user.authCode,"onUpdate:modelValue":e[0]||(e[0]=t=>o.authSettings.user.authCode=t),type:"password","show-password":"",onInput:r.handleUserPassInput,autocomplete:"new-password"},null,8,["modelValue","onInput"])]),_:1}),(0,s.bF)(ud.eB,{name:"fade-slide",mode:"out-in"},{default:(0,s.k6)(()=>[o.showUserPassConfirm?((0,s.uX)(),(0,s.Wv)(h,{label:"确认密码",prop:"confirmNewUserPassword",key:"user-confirm"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:o.authSettings.user.confirmNewUserPassword,"onUpdate:modelValue":e[1]||(e[1]=t=>o.authSettings.user.confirmNewUserPassword=t),type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue"])]),_:1})):(0,s.Q3)("",!0)]),_:1})]),_:1},8,["model","rules"]),e[28]||(e[28]=(0,s.Lk)("h4",{class:"second-title"},"管理端认证",-1)),(0,s.bF)(c,{model:o.authSettings.admin,rules:o.adminPassRules,ref:"adminPassForm","label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{label:"用户名",prop:"adminUsername"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:o.authSettings.admin.adminUsername,"onUpdate:modelValue":e[2]||(e[2]=t=>o.authSettings.admin.adminUsername=t),autocomplete:"new-password"},null,8,["modelValue"])]),_:1}),(0,s.bF)(h,{label:"密码",prop:"adminPassword"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:o.authSettings.admin.adminPassword,"onUpdate:modelValue":e[3]||(e[3]=t=>o.authSettings.admin.adminPassword=t),type:"password","show-password":"",onInput:r.handleAdminPassInput,autocomplete:"new-password"},null,8,["modelValue","onInput"])]),_:1}),(0,s.bF)(ud.eB,{name:"fade-slide",mode:"out-in"},{default:(0,s.k6)(()=>[o.showAdminPassConfirm?((0,s.uX)(),(0,s.Wv)(h,{label:"确认密码",prop:"confirmNewAdminPassword",key:"admin-confirm"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:o.authSettings.admin.confirmNewAdminPassword,"onUpdate:modelValue":e[4]||(e[4]=t=>o.authSettings.admin.confirmNewAdminPassword=t),type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue"])]),_:1})):(0,s.Q3)("",!0)]),_:1})]),_:1},8,["model","rules"]),(0,s.Lk)("h4",fd,[e[23]||(e[23]=(0,s.eW)("API Token 管理 ",-1)),(0,s.Lk)("a",md,[(0,s.bF)(u,{type:"primary",size:"small",onClick:e[5]||(e[5]=t=>o.showCreateTokenDialog=!0),circle:""},{default:(0,s.k6)(()=>[(0,s.bF)(d,{icon:"plus"})]),_:1})])]),(0,s.Lk)("div",bd,[(0,s.bo)(((0,s.uX)(),(0,s.Wv)(m,{data:o.apiTokens,class:"token-table"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{prop:"name",label:"名称","header-align":"center"},{default:(0,s.k6)(t=>[(0,s.Lk)("div",xd,(0,n.v_)(t.row.name),1)]),_:1}),(0,s.bF)(g,{prop:"token",label:"Token","header-align":"center"},{default:(0,s.k6)(t=>[(0,s.Lk)("div",yd,[(0,s.Lk)("span",_d,(0,n.v_)(t.row.token),1)])]),_:1}),(0,s.bF)(g,{prop:"permissions",label:"权限","header-align":"center"},{default:(0,s.k6)(t=>[(0,s.Lk)("div",vd,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(t.row.permissions,t=>((0,s.uX)(),(0,s.Wv)(f,{key:t,size:"small",class:"permission-tag"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(r.getPermissionText(t)),1)]),_:2},1024))),128))])]),_:1}),(0,s.bF)(g,{prop:"createdAt",label:"创建时间","header-align":"center"},{default:(0,s.k6)(t=>[(0,s.Lk)("div",kd,(0,n.v_)(r.formatDate(t.row.createdAt)),1)]),_:1}),(0,s.bF)(g,{label:"操作",fixed:"right","header-align":"center"},{default:(0,s.k6)(t=>[(0,s.Lk)("div",wd,[(0,s.bF)(u,{class:"action-button",size:"small",onClick:e=>r.editToken(t.row)},{default:(0,s.k6)(()=>[...e[24]||(e[24]=[(0,s.eW)("编辑",-1)])]),_:1},8,["onClick"]),(0,s.bF)(u,{class:"action-button",size:"small",type:"danger",onClick:e=>r.deleteToken(t.row.id)},{default:(0,s.k6)(()=>[...e[25]||(e[25]=[(0,s.eW)("删除",-1)])]),_:1},8,["onClick"])])]),_:1})]),_:1},8,["data"])),[[C,o.tokenLoading]])])]),(0,s.Lk)("div",Sd,[e[30]||(e[30]=(0,s.Lk)("h3",{class:"first-title"},"上传管理",-1)),(0,s.Lk)("h4",Md,[e[29]||(e[29]=(0,s.eW)("图像审查 ",-1)),(0,s.bF)(b,{content:"仅对非分块上传文件生效,支持 nsfwjs 和 moderatecontent.com 渠道",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(d,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),(0,s.bF)(c,{model:o.uploadSettings.moderate,"label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{label:"开启审查"},{default:(0,s.k6)(()=>[(0,s.bF)(x,{modelValue:o.uploadSettings.moderate.enabled,"onUpdate:modelValue":e[6]||(e[6]=t=>o.uploadSettings.moderate.enabled=t)},null,8,["modelValue"])]),_:1}),(0,s.bF)(h,{label:"审查渠道"},{default:(0,s.k6)(()=>[(0,s.bF)(v,{modelValue:o.uploadSettings.moderate.channel,"onUpdate:modelValue":e[7]||(e[7]=t=>o.uploadSettings.moderate.channel=t),placeholder:"请选择审查渠道"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{label:"moderatecontent.com",value:"moderatecontent.com"}),(0,s.bF)(y,{label:"nsfwjs",value:"nsfwjs"})]),_:1},8,["modelValue"])]),_:1}),"moderatecontent.com"===o.uploadSettings.moderate.channel?((0,s.uX)(),(0,s.Wv)(h,{key:0,label:"API Key"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:o.uploadSettings.moderate.moderateContentApiKey,"onUpdate:modelValue":e[8]||(e[8]=t=>o.uploadSettings.moderate.moderateContentApiKey=t)},null,8,["modelValue"])]),_:1})):(0,s.Q3)("",!0),"nsfwjs"===o.uploadSettings.moderate.channel?((0,s.uX)(),(0,s.Wv)(h,{key:1,label:"API 路径"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:o.uploadSettings.moderate.nsfwApiPath,"onUpdate:modelValue":e[9]||(e[9]=t=>o.uploadSettings.moderate.nsfwApiPath=t),placeholder:"https://nsfwjs.your.domain"},null,8,["modelValue"])]),_:1})):(0,s.Q3)("",!0)]),_:1},8,["model"])]),(0,s.Lk)("div",Cd,[e[33]||(e[33]=(0,s.Lk)("h3",{class:"first-title"},"访问管理",-1)),e[34]||(e[34]=(0,s.Lk)("h4",{class:"second-title"},"域名过滤",-1)),(0,s.bF)(c,{model:o.accessSettings,"label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(h,null,{label:(0,s.k6)(()=>[e[31]||(e[31]=(0,s.eW)(" 放行域名 ",-1)),(0,s.bF)(b,{content:"1.针对访问域名设置权限
2.留空默认全部放行,多个域名请用英文逗号分隔",placement:"top","raw-content":""},{default:(0,s.k6)(()=>[(0,s.bF)(d,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:o.accessSettings.allowedDomains,"onUpdate:modelValue":e[10]||(e[10]=t=>o.accessSettings.allowedDomains=t)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"]),e[35]||(e[35]=(0,s.Lk)("h4",{class:"second-title"},"白名单模式",-1)),(0,s.bF)(c,{model:o.accessSettings,"label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(h,null,{label:(0,s.k6)(()=>[e[32]||(e[32]=(0,s.eW)(" 是否开启 ",-1)),(0,s.bF)(b,{content:"1.针对文件设置权限
2.开启后,仅被加入白名单的文件可被访问",placement:"top","raw-content":""},{default:(0,s.k6)(()=>[(0,s.bF)(d,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(x,{modelValue:o.accessSettings.whiteListMode,"onUpdate:modelValue":e[11]||(e[11]=t=>o.accessSettings.whiteListMode=t)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])]),(0,s.Lk)("div",Fd,[(0,s.bF)(u,{type:"primary",onClick:r.saveSettings},{default:(0,s.k6)(()=>[...e[36]||(e[36]=[(0,s.eW)("保存设置",-1)])]),_:1},8,["onClick"])]),(0,s.bF)(M,{modelValue:o.showCreateTokenDialog,"onUpdate:modelValue":e[15]||(e[15]=t=>o.showCreateTokenDialog=t),title:"创建新 API Token",width:r.dialogWidth},{footer:(0,s.k6)(()=>[(0,s.Lk)("span",Ad,[(0,s.bF)(u,{onClick:e[14]||(e[14]=t=>o.showCreateTokenDialog=!1)},{default:(0,s.k6)(()=>[...e[40]||(e[40]=[(0,s.eW)("取消",-1)])]),_:1}),(0,s.bF)(u,{type:"primary",onClick:r.createToken},{default:(0,s.k6)(()=>[...e[41]||(e[41]=[(0,s.eW)("创建",-1)])]),_:1},8,["onClick"])])]),default:(0,s.k6)(()=>[(0,s.bF)(c,{model:o.newToken,rules:o.tokenRules,ref:"tokenForm","label-width":"100px"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{label:"Token 名称",prop:"name"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:o.newToken.name,"onUpdate:modelValue":e[12]||(e[12]=t=>o.newToken.name=t),placeholder:"请输入Token名称"},null,8,["modelValue"])]),_:1}),(0,s.bF)(h,{label:"权限",prop:"permissions"},{default:(0,s.k6)(()=>[(0,s.bF)(S,{modelValue:o.newToken.permissions,"onUpdate:modelValue":e[13]||(e[13]=t=>o.newToken.permissions=t)},{default:(0,s.k6)(()=>[(0,s.bF)(w,{label:"upload"},{default:(0,s.k6)(()=>[...e[37]||(e[37]=[(0,s.eW)("上传",-1)])]),_:1}),(0,s.bF)(w,{label:"delete"},{default:(0,s.k6)(()=>[...e[38]||(e[38]=[(0,s.eW)("删除",-1)])]),_:1}),(0,s.bF)(w,{label:"list"},{default:(0,s.k6)(()=>[...e[39]||(e[39]=[(0,s.eW)("列出",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1})]),_:1},8,["model","rules"])]),_:1},8,["modelValue","width"]),(0,s.bF)(M,{modelValue:o.showEditTokenDialog,"onUpdate:modelValue":e[19]||(e[19]=t=>o.showEditTokenDialog=t),title:"编辑 API Token",width:r.dialogWidth},{footer:(0,s.k6)(()=>[(0,s.Lk)("span",Pd,[(0,s.bF)(u,{onClick:e[18]||(e[18]=t=>o.showEditTokenDialog=!1)},{default:(0,s.k6)(()=>[...e[45]||(e[45]=[(0,s.eW)("取消",-1)])]),_:1}),(0,s.bF)(u,{type:"primary",onClick:r.updateToken},{default:(0,s.k6)(()=>[...e[46]||(e[46]=[(0,s.eW)("更新",-1)])]),_:1},8,["onClick"])])]),default:(0,s.k6)(()=>[(0,s.bF)(c,{model:o.editingToken,rules:o.tokenRules,ref:"editTokenForm","label-width":"100px"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{label:"Token 名称"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:o.editingToken.name,"onUpdate:modelValue":e[16]||(e[16]=t=>o.editingToken.name=t),disabled:""},null,8,["modelValue"])]),_:1}),(0,s.bF)(h,{label:"权限",prop:"permissions"},{default:(0,s.k6)(()=>[(0,s.bF)(S,{modelValue:o.editingToken.permissions,"onUpdate:modelValue":e[17]||(e[17]=t=>o.editingToken.permissions=t)},{default:(0,s.k6)(()=>[(0,s.bF)(w,{label:"upload"},{default:(0,s.k6)(()=>[...e[42]||(e[42]=[(0,s.eW)("上传",-1)])]),_:1}),(0,s.bF)(w,{label:"delete"},{default:(0,s.k6)(()=>[...e[43]||(e[43]=[(0,s.eW)("删除",-1)])]),_:1}),(0,s.bF)(w,{label:"list"},{default:(0,s.k6)(()=>[...e[44]||(e[44]=[(0,s.eW)("列出",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1})]),_:1},8,["model","rules"])]),_:1},8,["modelValue","width"]),(0,s.bF)(M,{modelValue:o.showTokenResultDialog,"onUpdate:modelValue":e[22]||(e[22]=t=>o.showTokenResultDialog=t),title:"Token 创建成功",width:r.dialogWidth},{footer:(0,s.k6)(()=>[(0,s.Lk)("span",Dd,[(0,s.bF)(u,{type:"primary",onClick:e[21]||(e[21]=t=>o.showTokenResultDialog=!1)},{default:(0,s.k6)(()=>[...e[49]||(e[49]=[(0,s.eW)("我已保存",-1)])]),_:1})])]),default:(0,s.k6)(()=>[(0,s.Lk)("div",Td,[(0,s.Lk)("p",Ld,[(0,s.bF)(d,{icon:"exclamation-triangle",style:{"margin-right":"5px"}}),e[47]||(e[47]=(0,s.eW)(" 请妥善保存以下Token,关闭此窗口后将无法再次查看完整Token! ",-1))]),(0,s.bF)(c,{"label-width":"100px"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{label:"Token 名称"},{default:(0,s.k6)(()=>[(0,s.Lk)("span",null,(0,n.v_)(o.createdToken.name),1)]),_:1}),(0,s.bF)(h,{label:"完整Token"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:o.createdToken.token,"onUpdate:modelValue":e[20]||(e[20]=t=>o.createdToken.token=t),readonly:""},{append:(0,s.k6)(()=>[(0,s.bF)(u,{onClick:r.copyToken},{default:(0,s.k6)(()=>[...e[48]||(e[48]=[(0,s.eW)("复制",-1)])]),_:1},8,["onClick"])]),_:1},8,["modelValue"])]),_:1})]),_:1})])]),_:1},8,["modelValue","width"])])),[[C,o.loading]])}var Id={data(){return{authSettings:{user:{},admin:{}},uploadSettings:{moderate:{}},accessSettings:{},apiTokens:[],loading:!1,tokenLoading:!1,oriUserPassword:"",oriAdminPassword:"",showUserPassConfirm:!1,showAdminPassConfirm:!1,showCreateTokenDialog:!1,showEditTokenDialog:!1,showTokenResultDialog:!1,newToken:{name:"",owner:"",permissions:[]},editingToken:{id:"",name:"",owner:"",permissions:[]},createdToken:{name:"",token:""},userPassRules:{authCode:[{validator:(t,e,i)=>{const s=["%","&","?","#","/"],n=s.some(t=>e&&e.includes(t));n?i(new Error("密码不能包含部分URL保留字符: % & ? # /")):i()},trigger:"blur"}],confirmNewUserPassword:[{message:"请再次输入上传密码",trigger:"blur"},{validator:(t,e,i)=>{e&&e!==this.authSettings.user.authCode?i(new Error("两次输入密码不一致")):i()},trigger:"blur"}]},adminPassRules:{confirmNewAdminPassword:[{message:"请再次输入管理密码",trigger:"blur"},{validator:(t,e,i)=>{e&&e!==this.authSettings.admin.adminPassword?i(new Error("两次输入密码不一致")):i()},trigger:"blur"}]},tokenRules:{name:[{required:!0,message:"请输入Token名称",trigger:"blur"}],permissions:[{required:!0,message:"请选择权限",trigger:"change"}]}}},computed:{dialogWidth(){return window.innerWidth>768?"50%":"90%"}},methods:{handleUserPassInput(){this.authSettings.user.authCode!==this.oriUserPassword?this.showUserPassConfirm=!0:this.showUserPassConfirm=!1},handleAdminPassInput(){this.authSettings.admin.adminPassword!==this.oriAdminPassword?this.showAdminPassConfirm=!0:this.showAdminPassConfirm=!1},getPermissionText(t){const e={upload:"上传",delete:"删除",list:"列出"};return e[t]||t},formatDate(t){return new Date(t).toLocaleString("zh-CN")},async loadApiTokens(){this.tokenLoading=!0;try{const t=await(0,Rt.A)("/api/manage/apiTokens"),e=await t.json();this.apiTokens=e.tokens||[]}catch(t){this.$message.error("获取Token列表失败")}finally{this.tokenLoading=!1}},createToken(){this.$refs.tokenForm.validate(async t=>{if(t)try{this.newToken.owner="admin";const t=await(0,Rt.A)("/api/manage/apiTokens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(this.newToken)}),e=await t.json();t.ok?(this.createdToken={name:e.name,token:e.token},this.showCreateTokenDialog=!1,this.showTokenResultDialog=!0,this.newToken={name:"",owner:"",permissions:[]},await this.loadApiTokens(),this.$message.success("Token创建成功")):this.$message.error(e.error||"Token创建失败")}catch(e){this.$message.error("Token创建失败")}})},editToken(t){this.editingToken={id:t.id,name:t.name,owner:t.owner,permissions:[...t.permissions]},this.showEditTokenDialog=!0},updateToken(){this.$refs.editTokenForm.validate(async t=>{if(t)try{const t=await(0,Rt.A)("/api/manage/apiTokens",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({tokenId:this.editingToken.id,permissions:this.editingToken.permissions})}),e=await t.json();t.ok?(this.showEditTokenDialog=!1,await this.loadApiTokens(),this.$message.success("Token权限更新成功")):this.$message.error(e.error||"Token更新失败")}catch(e){this.$message.error("Token更新失败")}})},async deleteToken(t){try{await this.$confirm("此操作将永久删除该Token,是否继续?","提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"});const e=await(0,Rt.A)(`/api/manage/apiTokens?id=${t}`,{method:"DELETE"}),i=await e.json();e.ok?(await this.loadApiTokens(),this.$message.success("Token删除成功")):this.$message.error(i.error||"Token删除失败")}catch(e){"cancel"!==e&&this.$message.error("Token删除失败")}},async copyToken(){try{await navigator.clipboard.writeText(this.createdToken.token),this.$message.success("Token已复制到剪贴板")}catch(t){this.$message.error("复制失败,请手动复制")}},saveSettings(){let t=[];t.push(new Promise(t=>{this.$refs.userPassForm.validate(e=>{t(e)})})),t.push(new Promise(t=>{this.$refs.adminPassForm.validate(e=>{t(e)})})),Promise.all(t).then(t=>{const e=t.every(t=>t);if(!e)return;const i={auth:this.authSettings,upload:this.uploadSettings,access:this.accessSettings};delete i.auth.user.confirmNewUserPassword,delete i.auth.admin.confirmNewAdminPassword,(0,Rt.A)("/api/manage/sysConfig/security",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)}).then(()=>{this.$message.success("设置已保存"),this.oriUserPassword=this.authSettings.user.authCode,this.oriAdminPassword=this.authSettings.admin.adminPassword,this.showUserPassConfirm=!1,this.showAdminPassConfirm=!1})})}},mounted(){this.loading=!0,(0,Rt.A)("/api/manage/sysConfig/security").then(t=>t.json()).then(t=>{this.authSettings=t.auth,this.uploadSettings=t.upload,this.accessSettings=t.access,this.oriUserPassword=this.authSettings.user.authCode,this.oriAdminPassword=this.authSettings.admin.adminPassword,this.authSettings.user.confirmNewUserPassword="",this.authSettings.admin.confirmNewAdminPassword="",this.loadApiTokens()}).finally(()=>{this.loading=!1})}};const Ed=(0,c.A)(Id,[["render",Vd],["__scopeId","data-v-3b7344a0"]]);var Od=Ed;const Rd={class:"page-settings"},Wd={class:"first-title"},zd={class:"actions"};function Bd(t,e,i,a,o,r){const l=(0,s.g2)("font-awesome-icon"),h=p.R7,c=hd.P9,d=hd.AV,u=Bc.qi,g=Wc.WK,f=zc.xE,m=zc.US,b=k.S2,x=_.A;return(0,s.bo)(((0,s.uX)(),(0,s.CE)("div",Rd,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(r.groupedSettings,(t,e)=>((0,s.uX)(),(0,s.CE)("div",{key:e,class:"first-settings"},[(0,s.Lk)("h3",Wd,(0,n.v_)(e),1),(0,s.bF)(m,{model:o.settings,"label-width":"150px"},{default:(0,s.k6)(()=>[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(t,(t,e)=>((0,s.uX)(),(0,s.Wv)(f,{key:t.id},{label:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(t.label)+" ",1),t.tooltip?((0,s.uX)(),(0,s.Wv)(h,{key:0,content:t.tooltip,placement:"top","raw-content":""},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])):(0,s.Q3)("",!0)]),default:(0,s.k6)(()=>["select"===t.type?((0,s.uX)(),(0,s.Wv)(d,{key:0,modelValue:t.value,"onUpdate:modelValue":e=>t.value=e,disabled:t.fixed,placeholder:t.placeholder,style:{width:"100%"}},{default:(0,s.k6)(()=>[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(t.options,t=>((0,s.uX)(),(0,s.Wv)(c,{key:t.value,label:t.label,value:t.value},null,8,["label","value"]))),128))]),_:2},1032,["modelValue","onUpdate:modelValue","disabled","placeholder"])):"boolean"===t.type?((0,s.uX)(),(0,s.Wv)(u,{key:1,modelValue:t.value,"onUpdate:modelValue":e=>t.value=e,disabled:t.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])):((0,s.uX)(),(0,s.Wv)(g,{key:2,modelValue:t.value,"onUpdate:modelValue":e=>t.value=e,disabled:t.fixed,placeholder:t.placeholder},null,8,["modelValue","onUpdate:modelValue","disabled","placeholder"]))]),_:2},1024))),128))]),_:2},1032,["model"])]))),128)),(0,s.Lk)("div",zd,[(0,s.bF)(b,{type:"primary",onClick:r.saveSettings},{default:(0,s.k6)(()=>[...e[0]||(e[0]=[(0,s.eW)("保存设置",-1)])]),_:1},8,["onClick"])])])),[[x,o.loading]])}var Ud={data(){return{settings:{config:[]},loading:!1}},computed:{groupedSettings(){const t={};return this.settings.config&&this.settings.config.forEach(e=>{const i=e.category||"其他设置";t[i]||(t[i]=[]),t[i].push(e)}),t}},methods:{saveSettings(){(0,Rt.A)("/api/manage/sysConfig/page",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(this.settings)}).then(()=>this.$message.success("设置已保存"))}},mounted(){this.loading=!0,(0,Rt.A)("/api/manage/sysConfig/page").then(t=>t.json()).then(t=>{this.settings=t,this.settings.config&&this.settings.config.forEach(t=>{"boolean"===t.type&&("string"===typeof t.value?t.value="true"===t.value:void 0!==t.value&&null!==t.value||(t.value=t.default||!1))})}).finally(()=>{this.loading=!1})}};const Nd=(0,c.A)(Ud,[["render",Bd],["__scopeId","data-v-7b059a1c"]]);var jd=Nd;const $d={class:"others-settings"},Hd={class:"first-settings"},qd={class:"first-title"},Xd={class:"first-title"},Yd={class:"first-title"},Kd={class:"first-title"},Qd={class:"first-title"},Gd={class:"actions"};function Jd(t,e,i,n,a,o){const r=(0,s.g2)("font-awesome-icon"),l=p.R7,h=Bc.qi,c=zc.xE,d=zc.US,u=Wc.WK,g=k.S2,f=_.A;return(0,s.bo)(((0,s.uX)(),(0,s.CE)("div",$d,[(0,s.Lk)("div",Hd,[(0,s.Lk)("h3",qd,[e[11]||(e[11]=(0,s.eW)("远端遥测 ",-1)),(0,s.bF)(l,{content:"便于问题查找和定位,建议开启",placement:"right"},{default:(0,s.k6)(()=>[(0,s.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),(0,s.bF)(d,{model:a.settings.telemetry,"label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(c,{label:"启用"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{modelValue:a.settings.telemetry.enabled,"onUpdate:modelValue":e[0]||(e[0]=t=>a.settings.telemetry.enabled=t),disabled:a.settings.telemetry.fixed},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"]),(0,s.Lk)("h3",Xd,[e[12]||(e[12]=(0,s.eW)("随机图像API ",-1)),(0,s.bF)(l,{content:"API具体用法请查阅文档",placement:"right"},{default:(0,s.k6)(()=>[(0,s.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),(0,s.bF)(d,{model:a.settings.randomImageAPI,"label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(c,{label:"启用"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{modelValue:a.settings.randomImageAPI.enabled,"onUpdate:modelValue":e[1]||(e[1]=t=>a.settings.randomImageAPI.enabled=t),disabled:a.settings.randomImageAPI.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(c,{prop:"randomImageAPI.allowedDir"},{label:(0,s.k6)(()=>[e[13]||(e[13]=(0,s.Lk)("span",null,"目录",-1)),(0,s.bF)(l,{content:"1. 开放随机图权限的目录,默认为根目录,多个目录用逗号分隔
2. 目录均采用绝对路径,例如/img/cover,表示该目录及其所有子目录的文件可被随机图API访问",placement:"right","raw-content":""},{default:(0,s.k6)(()=>[(0,s.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:a.settings.randomImageAPI.allowedDir,"onUpdate:modelValue":e[2]||(e[2]=t=>a.settings.randomImageAPI.allowedDir=t),disabled:a.settings.randomImageAPI.fixed},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"]),(0,s.Lk)("h3",Yd,[e[14]||(e[14]=(0,s.eW)("访客图库 ",-1)),(0,s.bF)(l,{content:"启用后,访客可通过 /browse 路径浏览指定目录的图片(只读,无法删除/移动)",placement:"right","raw-content":""},{default:(0,s.k6)(()=>[(0,s.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),(0,s.bF)(d,{model:a.settings.publicBrowse,"label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(c,{label:"启用"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{modelValue:a.settings.publicBrowse.enabled,"onUpdate:modelValue":e[3]||(e[3]=t=>a.settings.publicBrowse.enabled=t),disabled:a.settings.publicBrowse.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(c,{prop:"publicBrowse.allowedDir"},{label:(0,s.k6)(()=>[e[16]||(e[16]=(0,s.Lk)("span",null,"开放目录",-1)),(0,s.bF)(l,{placement:"right","raw-content":""},{content:(0,s.k6)(()=>[...e[15]||(e[15]=[(0,s.Lk)("div",{style:{"max-width":"320px","line-height":"1.6"}},[(0,s.Lk)("p",{style:{margin:"0 0 8px 0"}},[(0,s.Lk)("b",null,"允许公开浏览的目录,多个目录用逗号分隔")]),(0,s.Lk)("p",{style:{margin:"0 0 8px 0"}},"示例:wallpaper,photos,album"),(0,s.Lk)("p",{style:{margin:"0 0 8px 0",color:"#909399"}},"支持子目录:2026/lucky,2026/rich"),(0,s.Lk)("p",{style:{margin:"0",color:"#67c23a"}},"访问链接:https://你的域名/browse/2026/lucky")],-1)])]),default:(0,s.k6)(()=>[(0,s.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:a.settings.publicBrowse.allowedDir,"onUpdate:modelValue":e[4]||(e[4]=t=>a.settings.publicBrowse.allowedDir=t),disabled:a.settings.publicBrowse.fixed,placeholder:"wallpaper,photos,album"},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"]),(0,s.Lk)("h3",Kd,[e[17]||(e[17]=(0,s.eW)("CloudFlare API Token ",-1)),(0,s.bF)(l,{content:"设置后可以使后端拉黑、删除等操作不受CDN缓存限制
建议设置,设置方式请查阅文档",placement:"right","raw-content":""},{default:(0,s.k6)(()=>[(0,s.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),(0,s.bF)(d,{model:a.settings.cloudflareApiToken,"label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(c,{label:"区域ID"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:a.settings.cloudflareApiToken.CF_ZONE_ID,"onUpdate:modelValue":e[5]||(e[5]=t=>a.settings.cloudflareApiToken.CF_ZONE_ID=t),disabled:a.settings.cloudflareApiToken.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(c,{label:"账户邮箱"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:a.settings.cloudflareApiToken.CF_EMAIL,"onUpdate:modelValue":e[6]||(e[6]=t=>a.settings.cloudflareApiToken.CF_EMAIL=t),disabled:a.settings.cloudflareApiToken.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(c,{label:"API Key"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:a.settings.cloudflareApiToken.CF_API_KEY,"onUpdate:modelValue":e[7]||(e[7]=t=>a.settings.cloudflareApiToken.CF_API_KEY=t),disabled:a.settings.cloudflareApiToken.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"]),(0,s.Lk)("h3",Qd,[e[18]||(e[18]=(0,s.eW)("WebDAV ",-1)),(0,s.bF)(l,{content:"启用后,可以通过WebDAV协议访问和管理图片",placement:"right","raw-content":""},{default:(0,s.k6)(()=>[(0,s.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),(0,s.bF)(d,{model:a.settings.webDAV,"label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(c,{label:"启用"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{modelValue:a.settings.webDAV.enabled,"onUpdate:modelValue":e[8]||(e[8]=t=>a.settings.webDAV.enabled=t),disabled:a.settings.webDAV.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(c,{label:"用户名"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:a.settings.webDAV.username,"onUpdate:modelValue":e[9]||(e[9]=t=>a.settings.webDAV.username=t),disabled:a.settings.webDAV.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(c,{label:"密码"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:a.settings.webDAV.password,"onUpdate:modelValue":e[10]||(e[10]=t=>a.settings.webDAV.password=t),disabled:a.settings.webDAV.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"])]),(0,s.Lk)("div",Gd,[(0,s.bF)(g,{type:"primary",onClick:o.saveSettings},{default:(0,s.k6)(()=>[...e[19]||(e[19]=[(0,s.eW)("保存设置",-1)])]),_:1},8,["onClick"])])])),[[f,a.loading]])}var Zd={data(){return{settings:{telemetry:{},randomImageAPI:{},cloudflareApiToken:{},webDAV:{},publicBrowse:{}},loading:!1}},computed:{},methods:{saveSettings(){(0,Rt.A)("/api/manage/sysConfig/others",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(this.settings)}).then(()=>this.$message.success("设置已保存"))}},mounted(){this.loading=!0,(0,Rt.A)("/api/manage/sysConfig/others").then(t=>t.json()).then(t=>{this.settings=t}).finally(()=>{this.loading=!1})}};const tu=(0,c.A)(Zd,[["render",Jd],["__scopeId","data-v-4d2a1bec"]]);var eu=tu,iu={name:"SystemConfig",data(){return{activeIndex:"status",isSidebarCollapse:!1}},watch:{"$route.hash":{immediate:!0,handler(t){this.activeIndex=t.replace("#",""),window.scrollTo(0,0)}},activeIndex(t){const e=`#${t}`;this.$router.push({hash:e})}},components:{DashboardTabs:f.A,SysConfigTabs:u,SysCogStatus:Ec,SysCogUpload:od,SysCogSecurity:Od,SysCogPage:jd,SysCogOthers:eu},computed:{disableTooltip(){return window.innerWidth<768},currentComponent(){const t=this.$route.hash.replace("#","");switch(t){case"status":return Ec;case"upload":return od;case"security":return Od;case"page":return jd;case"others":return eu;default:return Ec}}},methods:{handleLogout(){this.$store.commit("setCredentials",null),this.$router.push("/adminLogin")},setDefaultHash(){const t="#status";window.location.hash=t,this.activeIndex=t.replace("#","")}},mounted(){window.location.hash||this.setDefaultHash()}};const su=(0,c.A)(iu,[["render",y],["__scopeId","data-v-c5d2c9c2"]]);var nu=su},4752:function(t,e,i){i(5331),i(8736),i(8785)},4885:function(t,e,i){i(5331)},5616:function(t,e,i){i(5331),i(7197)},5802:function(t,e,i){i(5331),i(8736),i(213),i(5970)}}]); -//# sourceMappingURL=424.28a751ba.js.map \ No newline at end of file +class ca{constructor(){this._request=null,this._charts=new Map,this._running=!1,this._lastDate=void 0}_notify(t,e,i,s){const n=e.listeners[s],a=e.duration;n.forEach(s=>s({chart:t,initial:e.initial,numSteps:a,currentStep:Math.min(i-e.start,a)}))}_refresh(){this._request||(this._running=!0,this._request=Ui.call(window,()=>{this._update(),this._request=null,this._running&&this._refresh()}))}_update(t=Date.now()){let e=0;this._charts.forEach((i,s)=>{if(!i.running||!i.items.length)return;const n=i.items;let a,o=n.length-1,r=!1;for(;o>=0;--o)a=n[o],a._active?(a._total>i.duration&&(i.duration=a._total),a.tick(t),r=!0):(n[o]=n[n.length-1],n.pop());r&&(s.draw(),this._notify(s,i,t,"progress")),n.length||(i.running=!1,this._notify(s,i,t,"complete"),i.initial=!1),e+=n.length}),this._lastDate=t,0===e&&(this._running=!1)}_getAnims(t){const e=this._charts;let i=e.get(t);return i||(i={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,i)),i}listen(t,e,i){this._getAnims(t).listeners[e].push(i)}add(t,e){e&&e.length&&this._getAnims(t).items.push(...e)}has(t){return this._getAnims(t).items.length>0}start(t){const e=this._charts.get(t);e&&(e.running=!0,e.start=Date.now(),e.duration=e.items.reduce((t,e)=>Math.max(t,e._duration),0),this._refresh())}running(t){if(!this._running)return!1;const e=this._charts.get(t);return!!(e&&e.running&&e.items.length)}stop(t){const e=this._charts.get(t);if(!e||!e.items.length)return;const i=e.items;let s=i.length-1;for(;s>=0;--s)i[s].cancel();e.items=[],this._notify(t,e,Date.now(),"complete")}remove(t){return this._charts.delete(t)}}var da=new ca;const ua="transparent",ga={boolean(t,e,i){return i>.5?e:t},color(t,e,i){const s=ts(t||ua),n=s.valid&&ts(e||ua);return n&&n.valid?n.mix(s,i).hexString():e},number(t,e,i){return t+(e-t)*i}};class pa{constructor(t,e,i,s){const n=e[i];s=Hs([t.to,s,n,t.from]);const a=Hs([t.from,n,s]);this._active=!0,this._fn=t.fn||ga[t.type||typeof a],this._easing=Ji[t.easing]||Ji.linear,this._start=Math.floor(Date.now()+(t.delay||0)),this._duration=this._total=Math.floor(t.duration),this._loop=!!t.loop,this._target=e,this._prop=i,this._from=a,this._to=s,this._promises=void 0}active(){return this._active}update(t,e,i){if(this._active){this._notify(!1);const s=this._target[this._prop],n=i-this._start,a=this._duration-n;this._start=i,this._duration=Math.floor(Math.max(a,t.duration)),this._total+=n,this._loop=!!t.loop,this._to=Hs([t.to,e,s,t.from]),this._from=Hs([t.from,s,e])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(t){const e=t-this._start,i=this._duration,s=this._prop,n=this._from,a=this._loop,o=this._to;let r;if(this._active=n!==o&&(a||e1?2-r:r,r=this._easing(Math.min(1,Math.max(0,r))),this._target[s]=this._fn(n,o,r))}wait(){const t=this._promises||(this._promises=[]);return new Promise((e,i)=>{t.push({res:e,rej:i})})}_notify(t){const e=t?"res":"rej",i=this._promises||[];for(let s=0;s{const n=t[s];if(!Ee(n))return;const a={};for(const t of e)a[t]=n[t];(Ie(n.properties)&&n.properties||[s]).forEach(t=>{t!==s&&i.has(t)||i.set(t,a)})})}_animateOptions(t,e){const i=e.options,s=ba(t,i);if(!s)return[];const n=this._createAnimations(s,i);return i.$shared&&ma(t.options.$animations,i).then(()=>{t.options=i},()=>{}),n}_createAnimations(t,e){const i=this._properties,s=[],n=t.$animations||(t.$animations={}),a=Object.keys(e),o=Date.now();let r;for(r=a.length-1;r>=0;--r){const l=a[r];if("$"===l.charAt(0))continue;if("options"===l){s.push(...this._animateOptions(t,e));continue}const h=e[l];let c=n[l];const d=i.get(l);if(c){if(d&&c.active()){c.update(d,h,o);continue}c.cancel()}d&&d.duration?(n[l]=c=new pa(d,t,l,h),s.push(c)):t[l]=h}return s}update(t,e){if(0===this._properties.size)return void Object.assign(t,e);const i=this._createAnimations(t,e);return i.length?(da.add(this._chart,i),!0):void 0}}function ma(t,e){const i=[],s=Object.keys(e);for(let n=0;n0||!i&&e<0)return n.index}return null}function Pa(t,e){const{chart:i,_cachedMeta:s}=t,n=i._stacks||(i._stacks={}),{iScale:a,vScale:o,index:r}=s,l=a.axis,h=o.axis,c=Ma(a,o,s),d=e.length;let u;for(let g=0;gi[t].axis===e).shift()}function La(t,e){return Xs(t,{active:!1,dataset:void 0,datasetIndex:e,index:e,mode:"default",type:"dataset"})}function Da(t,e,i){return Xs(t,{active:!1,dataIndex:e,parsed:void 0,raw:void 0,element:i,index:e,mode:"default",type:"data"})}function Va(t,e){const i=t.controller.index,s=t.vScale&&t.vScale.axis;if(s){e=e||t._parsed;for(const t of e){const e=t._stacks;if(!e||void 0===e[s]||void 0===e[s][i])return;delete e[s][i],void 0!==e[s]._visualValues&&void 0!==e[s]._visualValues[i]&&delete e[s]._visualValues[i]}}}const Ia=t=>"reset"===t||"none"===t,Ea=(t,e)=>e?t:Object.assign({},t),Oa=(t,e,i)=>t&&!e.hidden&&e._stacked&&{keys:va(i,!0),values:null};class Ra{constructor(t,e){this.chart=t,this._ctx=t.ctx,this.index=e,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){const t=this._cachedMeta;this.configure(),this.linkScales(),t._stacked=Sa(t.vScale,t),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled("filler")&&console.warn("Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options")}updateIndex(t){this.index!==t&&Va(this._cachedMeta),this.index=t}linkScales(){const t=this.chart,e=this._cachedMeta,i=this.getDataset(),s=(t,e,i,s)=>"x"===t?e:"r"===t?s:i,n=e.xAxisID=We(i.xAxisID,Ta(t,"x")),a=e.yAxisID=We(i.yAxisID,Ta(t,"y")),o=e.rAxisID=We(i.rAxisID,Ta(t,"r")),r=e.indexAxis,l=e.iAxisID=s(r,n,a,o),h=e.vAxisID=s(r,a,n,o);e.xScale=this.getScaleForId(n),e.yScale=this.getScaleForId(a),e.rScale=this.getScaleForId(o),e.iScale=this.getScaleForId(l),e.vScale=this.getScaleForId(h)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(t){return this.chart.scales[t]}_getOtherScale(t){const e=this._cachedMeta;return t===e.iScale?e.vScale:e.iScale}reset(){this._update("reset")}_destroy(){const t=this._cachedMeta;this._data&&zi(this._data,this),t._stacked&&Va(t)}_dataCheck(){const t=this.getDataset(),e=t.data||(t.data=[]),i=this._data;if(Ee(e)){const t=this._cachedMeta;this._data=wa(e,t)}else if(i!==e){if(i){zi(i,this);const t=this._cachedMeta;Va(t),t._parsed=[]}e&&Object.isExtensible(e)&&Wi(e,this),this._syncList=[],this._data=e}}addElements(){const t=this._cachedMeta;this._dataCheck(),this.datasetElementType&&(t.dataset=new this.datasetElementType)}buildOrUpdateElements(t){const e=this._cachedMeta,i=this.getDataset();let s=!1;this._dataCheck();const n=e._stacked;e._stacked=Sa(e.vScale,e),e.stack!==i.stack&&(s=!0,Va(e),e.stack=i.stack),this._resyncElements(t),(s||n!==e._stacked)&&(Pa(this,e._parsed),e._stacked=Sa(e.vScale,e))}configure(){const t=this.chart.config,e=t.datasetScopeKeys(this._type),i=t.getOptionScopes(this.getDataset(),e,!0);this.options=t.createResolver(i,this.getContext()),this._parsing=this.options.parsing,this._cachedDataOpts={}}parse(t,e){const{_cachedMeta:i,_data:s}=this,{iScale:n,_stacked:a}=i,o=n.axis;let r,l,h,c=0===t&&e===s.length||i._sorted,d=t>0&&i._parsed[t-1];if(!1===this._parsing)i._parsed=s,i._sorted=!0,h=s;else{h=Ie(s[t])?this.parseArrayData(i,s,t,e):Ee(s[t])?this.parseObjectData(i,s,t,e):this.parsePrimitiveData(i,s,t,e);const n=()=>null===l[o]||d&&l[o]e||c=0;--d)if(!g()){this.updateRangeFromParsed(l,t,u,r);break}return l}getAllParsedValues(t){const e=this._cachedMeta._parsed,i=[];let s,n,a;for(s=0,n=e.length;s=0&&tthis.getContext(i,s,e),p=l.resolveNamedOptions(d,u,g,c);return p.$shared&&(p.$shared=r,n[a]=Object.freeze(Ea(p,r))),p}_resolveAnimations(t,e,i){const s=this.chart,n=this._cachedDataOpts,a=`animation-${e}`,o=n[a];if(o)return o;let r;if(!1!==s.options.animation){const s=this.chart.config,n=s.datasetAnimationScopeKeys(this._type,e),a=s.getOptionScopes(this.getDataset(),n);r=s.createResolver(a,this.getContext(t,i,e))}const l=new fa(s,r&&r.animations);return r&&r._cacheable&&(n[a]=Object.freeze(l)),l}getSharedOptions(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}includeOptions(t,e){return!e||Ia(t)||this.chart._animationsDisabled}_getSharedOptions(t,e){const i=this.resolveDataElementOptions(t,e),s=this._sharedOptions,n=this.getSharedOptions(i),a=this.includeOptions(e,n)||n!==s;return this.updateSharedOptions(n,e,i),{sharedOptions:n,includeOptions:a}}updateElement(t,e,i,s){Ia(s)?Object.assign(t,i):this._resolveAnimations(e,s).update(t,i)}updateSharedOptions(t,e,i){t&&!Ia(e)&&this._resolveAnimations(void 0,e).update(t,i)}_setStyle(t,e,i,s){t.active=s;const n=this.getStyle(e,s);this._resolveAnimations(e,i,s).update(t,{options:!s&&this.getSharedOptions(n)||n})}removeHoverStyle(t,e,i){this._setStyle(t,i,"active",!1)}setHoverStyle(t,e,i){this._setStyle(t,i,"active",!0)}_removeDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!1)}_setDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!0)}_resyncElements(t){const e=this._data,i=this._cachedMeta.data;for(const[o,r,l]of this._syncList)this[o](r,l);this._syncList=[];const s=i.length,n=e.length,a=Math.min(n,s);a&&this.parse(0,a),n>s?this._insertElements(s,n-s,t):n{for(t.length+=e,o=t.length-1;o>=a;o--)t[o]=t[o-e]};for(r(n),o=t;ot-e))}return t._cache.$bar}function za(t){const e=t.iScale,i=Wa(e,t.type);let s,n,a,o,r=e._length;const l=()=>{32767!==a&&-32768!==a&&(ei(o)&&(r=Math.min(r,Math.abs(a-o)||r)),o=a)};for(s=0,n=i.length;s0?n[t-1]:null,r=tMath.abs(r)&&(l=r,h=o),e[i.axis]=h,e._custom={barStart:l,barEnd:h,start:n,end:a,min:o,max:r}}function ja(t,e,i,s){return Ie(t)?Na(t,e,i,s):e[i.axis]=i.parse(t,s),e}function $a(t,e,i,s){const n=t.iScale,a=t.vScale,o=n.getLabels(),r=n===a,l=[];let h,c,d,u;for(h=i,c=i+s;h=i?1:-1)}function Xa(t){let e,i,s,n,a;return t.horizontal?(e=t.base>t.x,i="left",s="right"):(e=t.baset.controller.options.grouped),n=i.options.stacked,a=[],o=this._cachedMeta.controller.getParsed(e),r=o&&o[i.axis],l=t=>{const e=t._parsed.find(t=>t[i.axis]===r),s=e&&e[t.vScale.axis];if(Ve(s)||isNaN(s))return!0};for(const h of s)if((void 0===e||!l(h))&&((!1===n||-1===a.indexOf(h.stack)||void 0===n&&void 0===h.stack)&&a.push(h.stack),h.index===t))break;return a.length||a.push(void 0),a}_getStackCount(t){return this._getStacks(void 0,t).length}_getAxisCount(){return this._getAxis().length}getFirstScaleIdForIndexAxis(){const t=this.chart.scales,e=this.chart.options.indexAxis;return Object.keys(t).filter(i=>t[i].axis===e).shift()}_getAxis(){const t={},e=this.getFirstScaleIdForIndexAxis();for(const i of this.chart.data.datasets)t[We("x"===this.chart.options.indexAxis?i.xAxisID:i.yAxisID,e)]=!0;return Object.keys(t)}_getStackIndex(t,e,i){const s=this._getStacks(t,i),n=void 0!==e?s.indexOf(e):-1;return-1===n?s.length-1:n}_getRuler(){const t=this.options,e=this._cachedMeta,i=e.iScale,s=[];let n,a;for(n=0,a=e.data.length;n=0;--i)e=Math.max(e,t[i].size(this.resolveDataElementOptions(i))/2);return e>0&&e}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart.data.labels||[],{xScale:s,yScale:n}=e,a=this.getParsed(t),o=s.getLabelForValue(a.x),r=n.getLabelForValue(a.y),l=a._custom;return{label:i[t]||"",value:"("+o+", "+r+(l?", "+l:"")+")"}}update(t){const e=this._cachedMeta.data;this.updateElements(e,0,e.length,t)}updateElements(t,e,i,s){const n="reset"===s,{iScale:a,vScale:o}=this._cachedMeta,{sharedOptions:r,includeOptions:l}=this._getSharedOptions(e,s),h=a.axis,c=o.axis;for(let d=e;dPi(t,r,l,!0)?1:Math.max(e,e*i,s,s*i),p=(t,e,s)=>Pi(t,r,l,!0)?-1:Math.min(e,e*i,s,s*i),f=g(0,h,d),m=g(ci,c,u),b=p(ai,h,d),x=p(ai+ci,c,u);s=(f-b)/2,n=(m-x)/2,a=-(f+b)/2,o=-(m+x)/2}return{ratioX:s,ratioY:n,offsetX:a,offsetY:o}}(0,zt.A)(to,"id","bubble"),(0,zt.A)(to,"defaults",{datasetElementType:!1,dataElementType:"point",animations:{numbers:{type:"number",properties:["x","y","borderWidth","radius"]}}}),(0,zt.A)(to,"overrides",{scales:{x:{type:"linear"},y:{type:"linear"}}});class io extends Ra{constructor(t,e){super(t,e),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(t,e){const i=this.getDataset().data,s=this._cachedMeta;if(!1===this._parsing)s._parsed=i;else{let n,a,o=t=>+i[t];if(Ee(i[t])){const{key:t="value"}=this._parsing;o=e=>+Ze(i[e],t)}for(n=t,a=t+e;n0&&!isNaN(t)?oi*(Math.abs(t)/e):0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,s=i.data.labels||[],n=ls(e._parsed[t],i.options.locale);return{label:s[t]||"",value:n}}getMaxBorderWidth(t){let e=0;const i=this.chart;let s,n,a,o,r;if(!t)for(s=0,n=i.data.datasets.length;s"spacing"!==t,_indexable:t=>"spacing"!==t&&!t.startsWith("borderDash")&&!t.startsWith("hoverBorderDash")}),(0,zt.A)(io,"overrides",{aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data,{labels:{pointStyle:i,textAlign:s,color:n,useBorderRadius:a,borderRadius:o}}=t.legend.options;return e.labels.length&&e.datasets.length?e.labels.map((e,r)=>{const l=t.getDatasetMeta(0),h=l.controller.getStyle(r);return{text:e,fillStyle:h.backgroundColor,fontColor:n,hidden:!t.getDataVisibility(r),lineDash:h.borderDash,lineDashOffset:h.borderDashOffset,lineJoin:h.borderJoinStyle,lineWidth:h.borderWidth,strokeStyle:h.borderColor,textAlign:s,pointStyle:i,borderRadius:a&&(o||h.borderRadius),index:r}}):[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}}}});class so extends Ra{initialize(){this.enableOptionSharing=!0,this.supportsDecimation=!0,super.initialize()}update(t){const e=this._cachedMeta,{dataset:i,data:s=[],_dataset:n}=e,a=this.chart._animationsDisabled;let{start:o,count:r}=Xi(e,s,a);this._drawStart=o,this._drawCount=r,Yi(e)&&(o=0,r=s.length),i._chart=this.chart,i._datasetIndex=this.index,i._decimated=!!n._decimated,i.points=s;const l=this.resolveDatasetElementOptions(t);this.options.showLine||(l.borderWidth=0),l.segment=this.options.segment,this.updateElement(i,void 0,{animated:!a,options:l},t),this.updateElements(s,o,r,t)}updateElements(t,e,i,s){const n="reset"===s,{iScale:a,vScale:o,_stacked:r,_dataset:l}=this._cachedMeta,{sharedOptions:h,includeOptions:c}=this._getSharedOptions(e,s),d=a.axis,u=o.axis,{spanGaps:g,segment:p}=this.options,f=yi(g)?g:Number.POSITIVE_INFINITY,m=this.chart._animationsDisabled||n||"none"===s,b=e+i,x=t.length;let y=e>0&&this.getParsed(e-1);for(let _=0;_=b){g.skip=!0;continue}const x=this.getParsed(_),v=Ve(x[u]),k=g[d]=a.getPixelForValue(x[d],_),w=g[u]=n||v?o.getBasePixel():o.getPixelForValue(r?this.applyStack(o,x,r):x[u],_);g.skip=isNaN(k)||isNaN(w)||v,g.stop=_>0&&Math.abs(x[d]-y[d])>f,p&&(g.parsed=x,g.raw=l.data[_]),c&&(g.options=h||this.resolveDataElementOptions(_,i.active?"active":s)),m||this.updateElement(i,_,g,s),y=x}}getMaxOverflow(){const t=this._cachedMeta,e=t.dataset,i=e.options&&e.options.borderWidth||0,s=t.data||[];if(!s.length)return i;const n=s[0].size(this.resolveDataElementOptions(0)),a=s[s.length-1].size(this.resolveDataElementOptions(s.length-1));return Math.max(i,n,a)/2}draw(){const t=this._cachedMeta;t.dataset.updateControlPoints(this.chart.chartArea,t.iScale.axis),super.draw()}}(0,zt.A)(so,"id","line"),(0,zt.A)(so,"defaults",{datasetElementType:"line",dataElementType:"point",showLine:!0,spanGaps:!1}),(0,zt.A)(so,"overrides",{scales:{_index_:{type:"category"},_value_:{type:"linear"}}});class no extends Ra{constructor(t,e){super(t,e),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,s=i.data.labels||[],n=ls(e._parsed[t].r,i.options.locale);return{label:s[t]||"",value:n}}parseObjectData(t,e,i,s){return pn.bind(this)(t,e,i,s)}update(t){const e=this._cachedMeta.data;this._updateRadius(),this.updateElements(e,0,e.length,t)}getMinMax(){const t=this._cachedMeta,e={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};return t.data.forEach((t,i)=>{const s=this.getParsed(i).r;!isNaN(s)&&this.chart.getDataVisibility(i)&&(se.max&&(e.max=s))}),e}_updateRadius(){const t=this.chart,e=t.chartArea,i=t.options,s=Math.min(e.right-e.left,e.bottom-e.top),n=Math.max(s/2,0),a=Math.max(i.cutoutPercentage?n/100*i.cutoutPercentage:1,0),o=(n-a)/t.getVisibleDatasetCount();this.outerRadius=n-o*this.index,this.innerRadius=this.outerRadius-o}updateElements(t,e,i,s){const n="reset"===s,a=this.chart,o=a.options,r=o.animation,l=this._cachedMeta.rScale,h=l.xCenter,c=l.yCenter,d=l.getIndexAngle(0)-.5*ai;let u,g=d;const p=360/this.countVisibleElements();for(u=0;u{!isNaN(this.getParsed(i).r)&&this.chart.getDataVisibility(i)&&e++}),e}_computeAngle(t,e,i){return this.chart.getDataVisibility(t)?ki(this.resolveDataElementOptions(t,e).angle||i):0}}(0,zt.A)(no,"id","polarArea"),(0,zt.A)(no,"defaults",{dataElementType:"arc",animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:"number",properties:["x","y","startAngle","endAngle","innerRadius","outerRadius"]}},indexAxis:"r",startAngle:0}),(0,zt.A)(no,"overrides",{aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:i,color:s}}=t.legend.options;return e.labels.map((e,n)=>{const a=t.getDatasetMeta(0),o=a.controller.getStyle(n);return{text:e,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,fontColor:s,lineWidth:o.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(n),index:n}})}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}});class ao extends io{}(0,zt.A)(ao,"id","pie"),(0,zt.A)(ao,"defaults",{cutout:0,rotation:0,circumference:360,radius:"100%"});class oo extends Ra{getLabelAndValue(t){const e=this._cachedMeta.vScale,i=this.getParsed(t);return{label:e.getLabels()[t],value:""+e.getLabelForValue(i[e.axis])}}parseObjectData(t,e,i,s){return pn.bind(this)(t,e,i,s)}update(t){const e=this._cachedMeta,i=e.dataset,s=e.data||[],n=e.iScale.getLabels();if(i.points=s,"resize"!==t){const e=this.resolveDatasetElementOptions(t);this.options.showLine||(e.borderWidth=0);const a={_loop:!0,_fullLoop:n.length===s.length,options:e};this.updateElement(i,void 0,a,t)}this.updateElements(s,0,s.length,t)}updateElements(t,e,i,s){const n=this._cachedMeta.rScale,a="reset"===s;for(let o=e;o0&&this.getParsed(e-1);for(let y=e;y0&&Math.abs(i[u]-x[u])>m,f&&(h.parsed=i,h.raw=l.data[y]),d&&(h.options=c||this.resolveDataElementOptions(y,e.active?"active":s)),b||this.updateElement(e,y,h,s),x=i}this.updateSharedOptions(c,s,h)}getMaxOverflow(){const t=this._cachedMeta,e=t.data||[];if(!this.options.showLine){let t=0;for(let i=e.length-1;i>=0;--i)t=Math.max(t,e[i].size(this.resolveDataElementOptions(i))/2);return t>0&&t}const i=t.dataset,s=i.options&&i.options.borderWidth||0;if(!e.length)return s;const n=e[0].size(this.resolveDataElementOptions(0)),a=e[e.length-1].size(this.resolveDataElementOptions(e.length-1));return Math.max(s,n,a)/2}}(0,zt.A)(ro,"id","scatter"),(0,zt.A)(ro,"defaults",{datasetElementType:!1,dataElementType:"point",showLine:!1,fill:!1}),(0,zt.A)(ro,"overrides",{interaction:{mode:"point"},scales:{x:{type:"linear"},y:{type:"linear"}}});function lo(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}class ho{static override(t){Object.assign(ho.prototype,t)}constructor(t){(0,zt.A)(this,"options",void 0),this.options=t||{}}init(){}formats(){return lo()}parse(){return lo()}format(){return lo()}add(){return lo()}diff(){return lo()}startOf(){return lo()}endOf(){return lo()}}var co={_date:ho};function uo(t,e,i,s){const{controller:n,data:a,_sorted:o}=t,r=n._cachedMeta.iScale,l=t.dataset&&t.dataset.options?t.dataset.options.spanGaps:null;if(r&&e===r.axis&&"r"!==e&&o&&a.length){const o=r._reversePixels?Ei:Ii;if(!s){const s=o(a,e,i);if(l){const{vScale:e}=n._cachedMeta,{_parsed:i}=t,a=i.slice(0,s.lo+1).reverse().findIndex(t=>!Ve(t[e.axis]));s.lo-=Math.max(0,a);const o=i.slice(s.hi).findIndex(t=>!Ve(t[e.axis]));s.hi+=Math.max(0,o)}return s}if(n._sharedOptions){const t=a[0],s="function"===typeof t.getRange&&t.getRange(e);if(s){const t=o(a,e,i-s),n=o(a,e,i+s);return{lo:t.lo,hi:n.hi}}}}return{lo:0,hi:a.length-1}}function go(t,e,i,s,n){const a=t.getSortedVisibleDatasetMetas(),o=i[e];for(let r=0,l=a.length;r{t[o]&&t[o](e[i],n)&&(a.push({element:t,datasetIndex:s,index:l}),r=r||t.inRange(e.x,e.y,n))}),s&&!r?[]:a}var _o={evaluateInteractionItems:go,modes:{index(t,e,i,s){const n=In(e,t),a=i.axis||"x",o=i.includeInvisible||!1,r=i.intersect?fo(t,n,a,s,o):xo(t,n,a,!1,s,o),l=[];return r.length?(t.getSortedVisibleDatasetMetas().forEach(t=>{const e=r[0].index,i=t.data[e];i&&!i.skip&&l.push({element:i,datasetIndex:t.index,index:e})}),l):[]},dataset(t,e,i,s){const n=In(e,t),a=i.axis||"xy",o=i.includeInvisible||!1;let r=i.intersect?fo(t,n,a,s,o):xo(t,n,a,!1,s,o);if(r.length>0){const e=r[0].datasetIndex,i=t.getDatasetMeta(e).data;r=[];for(let t=0;tt.pos===e)}function wo(t,e){return t.filter(t=>-1===vo.indexOf(t.pos)&&t.box.axis===e)}function So(t,e){return t.sort((t,i)=>{const s=e?i:t,n=e?t:i;return s.weight===n.weight?s.index-n.index:s.weight-n.weight})}function Mo(t){const e=[];let i,s,n,a,o,r;for(i=0,s=(t||[]).length;it.box.fullSize),!0),s=So(ko(e,"left"),!0),n=So(ko(e,"right")),a=So(ko(e,"top"),!0),o=So(ko(e,"bottom")),r=wo(e,"x"),l=wo(e,"y");return{fullSize:i,leftAndTop:s.concat(a),rightAndBottom:n.concat(l).concat(o).concat(r),chartArea:ko(e,"chartArea"),vertical:s.concat(n).concat(l),horizontal:a.concat(o).concat(r)}}function Po(t,e,i,s){return Math.max(t[i],e[i])+Math.max(t[s],e[s])}function To(t,e){t.top=Math.max(t.top,e.top),t.left=Math.max(t.left,e.left),t.bottom=Math.max(t.bottom,e.bottom),t.right=Math.max(t.right,e.right)}function Lo(t,e,i,s){const{pos:n,box:a}=i,o=t.maxPadding;if(!Ee(n)){i.size&&(t[n]-=i.size);const e=s[i.stack]||{size:0,count:1};e.size=Math.max(e.size,i.horizontal?a.height:a.width),i.size=e.size/e.count,t[n]+=i.size}a.getPadding&&To(o,a.getPadding());const r=Math.max(0,e.outerWidth-Po(o,t,"left","right")),l=Math.max(0,e.outerHeight-Po(o,t,"top","bottom")),h=r!==t.w,c=l!==t.h;return t.w=r,t.h=l,i.horizontal?{same:h,other:c}:{same:c,other:h}}function Do(t){const e=t.maxPadding;function i(i){const s=Math.max(e[i]-t[i],0);return t[i]+=s,s}t.y+=i("top"),t.x+=i("left"),i("right"),i("bottom")}function Vo(t,e){const i=e.maxPadding;function s(t){const s={left:0,top:0,right:0,bottom:0};return t.forEach(t=>{s[t]=Math.max(e[t],i[t])}),s}return s(t?["left","right"]:["top","bottom"])}function Io(t,e,i,s){const n=[];let a,o,r,l,h,c;for(a=0,o=t.length,h=0;a{"function"===typeof t.beforeLayout&&t.beforeLayout()});const c=l.reduce((t,e)=>e.box.options&&!1===e.box.options.display?t:t+1,0)||1,d=Object.freeze({outerWidth:e,outerHeight:i,padding:n,availableWidth:a,availableHeight:o,vBoxMaxWidth:a/2/c,hBoxMaxHeight:o/2}),u=Object.assign({},n);To(u,js(s));const g=Object.assign({maxPadding:u,w:a,h:o,x:n.left,y:n.top},n),p=Fo(l.concat(h),d);Io(r.fullSize,g,d,p),Io(l,g,d,p),Io(h,g,d,p)&&Io(l,g,d,p),Do(g),Oo(r.leftAndTop,g,d,p),g.x+=g.w,g.y+=g.h,Oo(r.rightAndBottom,g,d,p),t.chartArea={left:g.left,top:g.top,right:g.left+g.w,bottom:g.top+g.h,height:g.h,width:g.w},Ne(r.chartArea,e=>{const i=e.box;Object.assign(i,t.chartArea),i.update(g.w,g.h,{left:0,top:0,right:0,bottom:0})})}};class Wo{acquireContext(t,e){}releaseContext(t){return!1}addEventListener(t,e,i){}removeEventListener(t,e,i){}getDevicePixelRatio(){return 1}getMaximumSize(t,e,i,s){return e=Math.max(0,e||t.width),i=i||t.height,{width:e,height:Math.max(0,s?Math.floor(e/s):i)}}isAttached(t){return!0}updateConfig(t){}}class zo extends Wo{acquireContext(t){return t&&t.getContext&&t.getContext("2d")||null}updateConfig(t){t.options.animation=!1}}const Bo="$chartjs",Uo={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},No=t=>null===t||""===t;function jo(t,e){const i=t.style,s=t.getAttribute("height"),n=t.getAttribute("width");if(t[Bo]={initial:{height:s,width:n,style:{display:i.display,height:i.height,width:i.width}}},i.display=i.display||"block",i.boxSizing=i.boxSizing||"border-box",No(n)){const e=Bn(t,"width");void 0!==e&&(t.width=e)}if(No(s))if(""===t.style.height)t.height=t.width/(e||2);else{const e=Bn(t,"height");void 0!==e&&(t.height=e)}return t}const $o=!!zn&&{passive:!0};function Ho(t,e,i){t&&t.addEventListener(e,i,$o)}function qo(t,e,i){t&&t.canvas&&t.canvas.removeEventListener(e,i,$o)}function Xo(t,e){const i=Uo[t.type]||t.type,{x:s,y:n}=In(t,e);return{type:i,chart:e,native:t,x:void 0!==s?s:null,y:void 0!==n?n:null}}function Yo(t,e){for(const i of t)if(i===e||i.contains(e))return!0}function Ko(t,e,i){const s=t.canvas,n=new MutationObserver(t=>{let e=!1;for(const i of t)e=e||Yo(i.addedNodes,s),e=e&&!Yo(i.removedNodes,s);e&&i()});return n.observe(document,{childList:!0,subtree:!0}),n}function Qo(t,e,i){const s=t.canvas,n=new MutationObserver(t=>{let e=!1;for(const i of t)e=e||Yo(i.removedNodes,s),e=e&&!Yo(i.addedNodes,s);e&&i()});return n.observe(document,{childList:!0,subtree:!0}),n}const Go=new Map;let Jo=0;function Zo(){const t=window.devicePixelRatio;t!==Jo&&(Jo=t,Go.forEach((e,i)=>{i.currentDevicePixelRatio!==t&&e()}))}function tr(t,e){Go.size||window.addEventListener("resize",Zo),Go.set(t,e)}function er(t){Go.delete(t),Go.size||window.removeEventListener("resize",Zo)}function ir(t,e,i){const s=t.canvas,n=s&&Cn(s);if(!n)return;const a=Ni((t,e)=>{const s=n.clientWidth;i(t,e),s{const e=t[0],i=e.contentRect.width,s=e.contentRect.height;0===i&&0===s||a(i,s)});return o.observe(n),tr(t,a),o}function sr(t,e,i){i&&i.disconnect(),"resize"===e&&er(t)}function nr(t,e,i){const s=t.canvas,n=Ni(e=>{null!==t.ctx&&i(Xo(e,t))},t);return Ho(s,e,n),n}class ar extends Wo{acquireContext(t,e){const i=t&&t.getContext&&t.getContext("2d");return i&&i.canvas===t?(jo(t,e),i):null}releaseContext(t){const e=t.canvas;if(!e[Bo])return!1;const i=e[Bo].initial;["height","width"].forEach(t=>{const s=i[t];Ve(s)?e.removeAttribute(t):e.setAttribute(t,s)});const s=i.style||{};return Object.keys(s).forEach(t=>{e.style[t]=s[t]}),e.width=e.width,delete e[Bo],!0}addEventListener(t,e,i){this.removeEventListener(t,e);const s=t.$proxies||(t.$proxies={}),n={attach:Ko,detach:Qo,resize:ir},a=n[e]||nr;s[e]=a(t,e,i)}removeEventListener(t,e){const i=t.$proxies||(t.$proxies={}),s=i[e];if(!s)return;const n={attach:sr,detach:sr,resize:sr},a=n[e]||qo;a(t,e,s),i[e]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,i,s){return Rn(t,e,i,s)}isAttached(t){const e=t&&Cn(t);return!(!e||!e.isConnected)}}function or(t){return!Mn()||"undefined"!==typeof OffscreenCanvas&&t instanceof OffscreenCanvas?zo:ar}class rr{constructor(){(0,zt.A)(this,"x",void 0),(0,zt.A)(this,"y",void 0),(0,zt.A)(this,"active",!1),(0,zt.A)(this,"options",void 0),(0,zt.A)(this,"$animations",void 0)}tooltipPosition(t){const{x:e,y:i}=this.getProps(["x","y"],t);return{x:e,y:i}}hasValue(){return yi(this.x)&&yi(this.y)}getProps(t,e){const i=this.$animations;if(!e||!i)return this;const s={};return t.forEach(t=>{s[t]=i[t]&&i[t].active()?i[t]._to:this[t]}),s}}function lr(t,e){const i=t.options.ticks,s=hr(t),n=Math.min(i.maxTicksLimit||s,s),a=i.major.enabled?dr(e):[],o=a.length,r=a[0],l=a[o-1],h=[];if(o>n)return ur(e,h,a,o/n),h;const c=cr(a,e,n);if(o>0){let t,i;const s=o>1?Math.round((l-r)/(o-1)):null;for(gr(e,h,c,Ve(s)?0:r-s,r),t=0,i=o-1;tn)return t}return Math.max(n,1)}function dr(t){const e=[];let i,s;for(i=0,s=t.length;i"left"===t?"right":"right"===t?"left":t,mr=(t,e,i)=>"top"===e||"left"===e?t[e]+i:t[e]-i,br=(t,e)=>Math.min(e||t,t);function xr(t,e){const i=[],s=t.length/e,n=t.length;let a=0;for(;ao+r)))return h}function _r(t,e){Ne(t,t=>{const i=t.gc,s=i.length/2;let n;if(s>e){for(n=0;ns?s:i,s=n&&i>s?i:s,{min:Re(i,Re(s,i)),max:Re(s,Re(i,s))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){const t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]}getLabelItems(t=this.chart.chartArea){const e=this._labelItems||(this._labelItems=this._computeLabelItems(t));return e}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){Ue(this.options.beforeUpdate,[this])}update(t,e,i){const{beginAtZero:s,grace:n,ticks:a}=this.options,o=a.sampleSize;this.beforeUpdate(),this.maxWidth=t,this.maxHeight=e,this._margins=i=Object.assign({left:0,right:0,top:0,bottom:0},i),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+i.left+i.right:this.height+i.top+i.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=qs(this,n,s),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();const r=o=n||i<=1||!this.isHorizontal())return void(this.labelRotation=s);const h=this._getLabelSizes(),c=h.widest.width,d=h.highest.height,u=Ti(this.chart.width-c,0,this.maxWidth);a=t.offset?this.maxWidth/i:u/(i-1),c+6>a&&(a=u/(i-(t.offset?.5:1)),o=this.maxHeight-vr(t.grid)-e.padding-kr(t.title,this.chart.options.font),r=Math.sqrt(c*c+d*d),l=wi(Math.min(Math.asin(Ti((h.highest.height+6)/a,-1,1)),Math.asin(Ti(o/r,-1,1))-Math.asin(Ti(d/r,-1,1)))),l=Math.max(s,Math.min(n,l))),this.labelRotation=l}afterCalculateLabelRotation(){Ue(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){Ue(this.options.beforeFit,[this])}fit(){const t={width:0,height:0},{chart:e,options:{ticks:i,title:s,grid:n}}=this,a=this._isVisible(),o=this.isHorizontal();if(a){const a=kr(s,e.options.font);if(o?(t.width=this.maxWidth,t.height=vr(n)+a):(t.height=this.maxHeight,t.width=vr(n)+a),i.display&&this.ticks.length){const{first:e,last:s,widest:n,highest:a}=this._getLabelSizes(),r=2*i.padding,l=ki(this.labelRotation),h=Math.cos(l),c=Math.sin(l);if(o){const e=i.mirror?0:c*n.width+h*a.height;t.height=Math.min(this.maxHeight,t.height+e+r)}else{const e=i.mirror?0:h*n.width+c*a.height;t.width=Math.min(this.maxWidth,t.width+e+r)}this._calculatePadding(e,s,c,h)}}this._handleMargins(),o?(this.width=this._length=e.width-this._margins.left-this._margins.right,this.height=t.height):(this.width=t.width,this.height=this._length=e.height-this._margins.top-this._margins.bottom)}_calculatePadding(t,e,i,s){const{ticks:{align:n,padding:a},position:o}=this.options,r=0!==this.labelRotation,l="top"!==o&&"x"===this.axis;if(this.isHorizontal()){const o=this.getPixelForTick(0)-this.left,h=this.right-this.getPixelForTick(this.ticks.length-1);let c=0,d=0;r?l?(c=s*t.width,d=i*e.height):(c=i*t.height,d=s*e.width):"start"===n?d=e.width:"end"===n?c=t.width:"inner"!==n&&(c=t.width/2,d=e.width/2),this.paddingLeft=Math.max((c-o+a)*this.width/(this.width-o),0),this.paddingRight=Math.max((d-h+a)*this.width/(this.width-h),0)}else{let i=e.height/2,s=t.height/2;"start"===n?(i=0,s=t.height):"end"===n&&(i=e.height,s=0),this.paddingTop=i+a,this.paddingBottom=s+a}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){Ue(this.options.afterFit,[this])}isHorizontal(){const{axis:t,position:e}=this.options;return"top"===e||"bottom"===e||"x"===t}isFullSize(){return this.options.fullSize}_convertTicksToLabels(t){let e,i;for(this.beforeTickToLabelConversion(),this.generateTickLabels(t),e=0,i=t.length;e({width:a[t]||0,height:o[t]||0});return{first:w(0),last:w(e-1),widest:w(v),highest:w(k),widths:a,heights:o}}getLabelForValue(t){return t}getPixelForValue(t,e){return NaN}getValueForPixel(t){}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getPixelForDecimal(t){this._reversePixels&&(t=1-t);const e=this._startPixel+t*this._length;return Li(this._alignToPixels?ks(this.chart,e,0):e)}getDecimalForPixel(t){const e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){const{min:t,max:e}=this;return t<0&&e<0?e:t>0&&e>0?t:0}getContext(t){const e=this.ticks||[];if(t>=0&&to*s?o/i:r/s:r*s0}_computeGridLineItems(t){const e=this.axis,i=this.chart,s=this.options,{grid:n,position:a,border:o}=s,r=n.offset,l=this.isHorizontal(),h=this.ticks,c=h.length+(r?1:0),d=vr(n),u=[],g=o.setContext(this.getContext()),p=g.display?g.width:0,f=p/2,m=function(t){return ks(i,t,p)};let b,x,y,_,v,k,w,S,M,C,F,A;if("top"===a)b=m(this.bottom),k=this.bottom-d,S=b-f,C=m(t.top)+f,A=t.bottom;else if("bottom"===a)b=m(this.top),C=t.top,A=m(t.bottom)-f,k=b+f,S=this.top+d;else if("left"===a)b=m(this.right),v=this.right-d,w=b-f,M=m(t.left)+f,F=t.right;else if("right"===a)b=m(this.left),M=t.left,F=m(t.right)-f,v=b+f,w=this.left+d;else if("x"===e){if("center"===a)b=m((t.top+t.bottom)/2+.5);else if(Ee(a)){const t=Object.keys(a)[0],e=a[t];b=m(this.chart.scales[t].getPixelForValue(e))}C=t.top,A=t.bottom,k=b+f,S=k+d}else if("y"===e){if("center"===a)b=m((t.left+t.right)/2);else if(Ee(a)){const t=Object.keys(a)[0],e=a[t];b=m(this.chart.scales[t].getPixelForValue(e))}v=b-f,w=v-d,M=t.left,F=t.right}const P=We(s.ticks.maxTicksLimit,c),T=Math.max(1,Math.ceil(c/P));for(x=0;x0&&(a-=s/2);break}d={left:a,top:n,width:s+e.width,height:i+e.height,color:t.backdropColor}}f.push({label:y,font:S,textOffset:F,options:{rotation:p,color:i,strokeColor:r,strokeWidth:h,textAlign:u,textBaseline:A,translation:[_,v],backdrop:d}})}return f}_getXAxisLabelAlignment(){const{position:t,ticks:e}=this.options,i=-ki(this.labelRotation);if(i)return"top"===t?"left":"right";let s="center";return"start"===e.align?s="left":"end"===e.align?s="right":"inner"===e.align&&(s="inner"),s}_getYAxisLabelAlignment(t){const{position:e,ticks:{crossAlign:i,mirror:s,padding:n}}=this.options,a=this._getLabelSizes(),o=t+n,r=a.widest.width;let l,h;return"left"===e?s?(h=this.right+n,"near"===i?l="left":"center"===i?(l="center",h+=r/2):(l="right",h+=r)):(h=this.right-o,"near"===i?l="right":"center"===i?(l="center",h-=r/2):(l="left",h=this.left)):"right"===e?s?(h=this.left+n,"near"===i?l="right":"center"===i?(l="center",h-=r/2):(l="left",h-=r)):(h=this.left+o,"near"===i?l="left":"center"===i?(l="center",h+=r/2):(l="right",h=this.right)):l="right",{textAlign:l,x:h}}_computeLabelArea(){if(this.options.ticks.mirror)return;const t=this.chart,e=this.options.position;return"left"===e||"right"===e?{top:0,left:this.left,bottom:t.height,right:this.right}:"top"===e||"bottom"===e?{top:this.top,left:0,bottom:this.bottom,right:t.width}:void 0}drawBackground(){const{ctx:t,options:{backgroundColor:e},left:i,top:s,width:n,height:a}=this;e&&(t.save(),t.fillStyle=e,t.fillRect(i,s,n,a),t.restore())}getLineWidthForValue(t){const e=this.options.grid;if(!this._isVisible()||!e.display)return 0;const i=this.ticks,s=i.findIndex(e=>e.value===t);if(s>=0){const t=e.setContext(this.getContext(s));return t.lineWidth}return 0}drawGrid(t){const e=this.options.grid,i=this.ctx,s=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t));let n,a;const o=(t,e,s)=>{s.width&&s.color&&(i.save(),i.lineWidth=s.width,i.strokeStyle=s.color,i.setLineDash(s.borderDash||[]),i.lineDashOffset=s.borderDashOffset,i.beginPath(),i.moveTo(t.x,t.y),i.lineTo(e.x,e.y),i.stroke(),i.restore())};if(e.display)for(n=0,a=s.length;n{this.drawBackground(),this.drawGrid(t),this.drawTitle()}},{z:s,draw:()=>{this.drawBorder()}},{z:e,draw:t=>{this.drawLabels(t)}}]:[{z:e,draw:t=>{this.draw(t)}}]}getMatchingVisibleMetas(t){const e=this.chart.getSortedVisibleDatasetMetas(),i=this.axis+"AxisID",s=[];let n,a;for(n=0,a=e.length;n{const s=i.split("."),n=s.pop(),a=[t].concat(s).join("."),o=e[i].split("."),r=o.pop(),l=o.join(".");xs.route(a,n,l,r)})}function Lr(t){return"id"in t&&"defaults"in t}class Dr{constructor(){this.controllers=new Ar(Ra,"datasets",!0),this.elements=new Ar(rr,"elements"),this.plugins=new Ar(Object,"plugins"),this.scales=new Ar(Fr,"scales"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...t){this._each("register",t)}remove(...t){this._each("unregister",t)}addControllers(...t){this._each("register",t,this.controllers)}addElements(...t){this._each("register",t,this.elements)}addPlugins(...t){this._each("register",t,this.plugins)}addScales(...t){this._each("register",t,this.scales)}getController(t){return this._get(t,this.controllers,"controller")}getElement(t){return this._get(t,this.elements,"element")}getPlugin(t){return this._get(t,this.plugins,"plugin")}getScale(t){return this._get(t,this.scales,"scale")}removeControllers(...t){this._each("unregister",t,this.controllers)}removeElements(...t){this._each("unregister",t,this.elements)}removePlugins(...t){this._each("unregister",t,this.plugins)}removeScales(...t){this._each("unregister",t,this.scales)}_each(t,e,i){[...e].forEach(e=>{const s=i||this._getRegistryForType(e);i||s.isForType(e)||s===this.plugins&&e.id?this._exec(t,s,e):Ne(e,e=>{const s=i||this._getRegistryForType(e);this._exec(t,s,e)})})}_exec(t,e,i){const s=ti(t);Ue(i["before"+s],[],i),e[t](i),Ue(i["after"+s],[],i)}_getRegistryForType(t){for(let e=0;et.filter(t=>!e.some(e=>t.plugin.id===e.plugin.id));this._notify(s(e,i),t,"stop"),this._notify(s(i,e),t,"start")}}function Er(t){const e={},i=[],s=Object.keys(Vr.plugins.items);for(let a=0;a1&&Nr(t[0].toLowerCase());if(e)return e}throw new Error(`Cannot determine type of '${t}' axis. Please provide 'axis' or 'position' option.`)}function Hr(t,e,i){if(i[e+"AxisID"]===t)return{axis:e}}function qr(t,e){if(e.data&&e.data.datasets){const i=e.data.datasets.filter(e=>e.xAxisID===t||e.yAxisID===t);if(i.length)return Hr(t,"x",i[0])||Hr(t,"y",i[0])}return{}}function Xr(t,e){const i=gs[t.type]||{scales:{}},s=e.scales||{},n=zr(t.type,e),a=Object.create(null);return Object.keys(s).forEach(e=>{const o=s[e];if(!Ee(o))return console.error(`Invalid scale configuration for scale: ${e}`);if(o._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${e}`);const r=$r(e,o,qr(e,t),xs.scales[o.type]),l=Ur(r,n),h=i.scales||{};a[e]=Ye(Object.create(null),[{axis:r},o,h[r],h[l]])}),t.data.datasets.forEach(i=>{const n=i.type||t.type,o=i.indexAxis||zr(n,e),r=gs[n]||{},l=r.scales||{};Object.keys(l).forEach(t=>{const e=Br(t,o),n=i[e+"AxisID"]||e;a[n]=a[n]||Object.create(null),Ye(a[n],[{axis:e},s[n],l[t]])})}),Object.keys(a).forEach(t=>{const e=a[t];Ye(e,[xs.scales[e.type],xs.scale])}),a}function Yr(t){const e=t.options||(t.options={});e.plugins=We(e.plugins,{}),e.scales=Xr(t,e)}function Kr(t){return t=t||{},t.datasets=t.datasets||[],t.labels=t.labels||[],t}function Qr(t){return t=t||{},t.data=Kr(t.data),Yr(t),t}const Gr=new Map,Jr=new Set;function Zr(t,e){let i=Gr.get(t);return i||(i=e(),Gr.set(t,i),Jr.add(i)),i}const tl=(t,e,i)=>{const s=Ze(e,i);void 0!==s&&t.add(s)};class el{constructor(t){this._config=Qr(t),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(t){this._config.type=t}get data(){return this._config.data}set data(t){this._config.data=Kr(t)}get options(){return this._config.options}set options(t){this._config.options=t}get plugins(){return this._config.plugins}update(){const t=this._config;this.clearCache(),Yr(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return Zr(t,()=>[[`datasets.${t}`,""]])}datasetAnimationScopeKeys(t,e){return Zr(`${t}.transition.${e}`,()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,""]])}datasetElementScopeKeys(t,e){return Zr(`${t}-${e}`,()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,""]])}pluginScopeKeys(t){const e=t.id,i=this.type;return Zr(`${i}-plugin-${e}`,()=>[[`plugins.${e}`,...t.additionalOptionScopes||[]]])}_cachedScopes(t,e){const i=this._scopeCache;let s=i.get(t);return s&&!e||(s=new Map,i.set(t,s)),s}getOptionScopes(t,e,i){const{options:s,type:n}=this,a=this._cachedScopes(t,i),o=a.get(e);if(o)return o;const r=new Set;e.forEach(e=>{t&&(r.add(t),e.forEach(e=>tl(r,t,e))),e.forEach(t=>tl(r,s,t)),e.forEach(t=>tl(r,gs[n]||{},t)),e.forEach(t=>tl(r,xs,t)),e.forEach(t=>tl(r,ps,t))});const l=Array.from(r);return 0===l.length&&l.push(Object.create(null)),Jr.has(e)&&a.set(e,l),l}chartOptionScopes(){const{options:t,type:e}=this;return[t,gs[e]||{},xs.datasets[e]||{},{type:e},xs,ps]}resolveNamedOptions(t,e,i,s=[""]){const n={$shared:!0},{resolver:a,subPrefixes:o}=il(this._resolverCache,t,s);let r=a;if(nl(a,e)){n.$shared=!1,i=ii(i)?i():i;const e=this.createResolver(t,i,o);r=Ks(a,i,e)}for(const l of e)n[l]=r[l];return n}createResolver(t,e,i=[""],s){const{resolver:n}=il(this._resolverCache,t,i);return Ee(e)?Ks(n,e,void 0,s):n}}function il(t,e,i){let s=t.get(e);s||(s=new Map,t.set(e,s));const n=i.join();let a=s.get(n);if(!a){const t=Ys(e,i);a={resolver:t,subPrefixes:i.filter(t=>!t.toLowerCase().includes("hover"))},s.set(n,a)}return a}const sl=t=>Ee(t)&&Object.getOwnPropertyNames(t).some(e=>ii(t[e]));function nl(t,e){const{isScriptable:i,isIndexable:s}=Qs(t);for(const n of e){const e=i(n),a=s(n),o=(a||e)&&t[n];if(e&&(ii(o)||sl(o))||a&&Ie(o))return!0}return!1}var al="4.5.1";const ol=["top","bottom","left","right","chartArea"];function rl(t,e){return"top"===t||"bottom"===t||-1===ol.indexOf(t)&&"x"===e}function ll(t,e){return function(i,s){return i[t]===s[t]?i[e]-s[e]:i[t]-s[t]}}function hl(t){const e=t.chart,i=e.options.animation;e.notifyPlugins("afterRender"),Ue(i&&i.onComplete,[t],e)}function cl(t){const e=t.chart,i=e.options.animation;Ue(i&&i.onProgress,[t],e)}function dl(t){return Mn()&&"string"===typeof t?t=document.getElementById(t):t&&t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas),t}const ul={},gl=t=>{const e=dl(t);return Object.values(ul).filter(t=>t.canvas===e).pop()};function pl(t,e,i){const s=Object.keys(t);for(const n of s){const s=+n;if(s>=e){const a=t[n];delete t[n],(i>0||s>e)&&(t[s+i]=a)}}}function fl(t,e,i,s){return i&&"mouseout"!==t.type?s?e:t:null}class ml{static register(...t){Vr.add(...t),bl()}static unregister(...t){Vr.remove(...t),bl()}constructor(t,e){const i=this.config=new el(e),s=dl(t),n=gl(s);if(n)throw new Error("Canvas is already in use. Chart with ID '"+n.id+"' must be destroyed before the canvas with ID '"+n.canvas.id+"' can be reused.");const a=i.createResolver(i.chartOptionScopes(),this.getContext());this.platform=new(i.platform||or(s)),this.platform.updateConfig(i);const o=this.platform.acquireContext(s,a.aspectRatio),r=o&&o.canvas,l=r&&r.height,h=r&&r.width;this.id=De(),this.ctx=o,this.canvas=r,this.width=h,this.height=l,this._options=a,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new Ir,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=ji(t=>this.update(t),a.resizeDelay||0),this._dataChanges=[],ul[this.id]=this,o&&r?(da.listen(this,"complete",hl),da.listen(this,"progress",cl),this._initialize(),this.attached&&this.update()):console.error("Failed to create chart: can't acquire context from the given item")}get aspectRatio(){const{options:{aspectRatio:t,maintainAspectRatio:e},width:i,height:s,_aspectRatio:n}=this;return Ve(t)?e&&n?n:s?i/s:null:t}get data(){return this.config.data}set data(t){this.config.data=t}get options(){return this._options}set options(t){this.config.options=t}get registry(){return Vr}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():Wn(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return ws(this.canvas,this.ctx),this}stop(){return da.stop(this),this}resize(t,e){da.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}_resize(t,e){const i=this.options,s=this.canvas,n=i.maintainAspectRatio&&this.aspectRatio,a=this.platform.getMaximumSize(s,t,e,n),o=i.devicePixelRatio||this.platform.getDevicePixelRatio(),r=this.width?"resize":"attach";this.width=a.width,this.height=a.height,this._aspectRatio=this.aspectRatio,Wn(this,o,!0)&&(this.notifyPlugins("resize",{size:a}),Ue(i.onResize,[this,a],this),this.attached&&this._doResize(r)&&this.render())}ensureScalesHaveIDs(){const t=this.options,e=t.scales||{};Ne(e,(t,e)=>{t.id=e})}buildOrUpdateScales(){const t=this.options,e=t.scales,i=this.scales,s=Object.keys(i).reduce((t,e)=>(t[e]=!1,t),{});let n=[];e&&(n=n.concat(Object.keys(e).map(t=>{const i=e[t],s=$r(t,i),n="r"===s,a="x"===s;return{options:i,dposition:n?"chartArea":a?"bottom":"left",dtype:n?"radialLinear":a?"category":"linear"}}))),Ne(n,e=>{const n=e.options,a=n.id,o=$r(a,n),r=We(n.type,e.dtype);void 0!==n.position&&rl(n.position,o)===rl(e.dposition)||(n.position=e.dposition),s[a]=!0;let l=null;if(a in i&&i[a].type===r)l=i[a];else{const t=Vr.getScale(r);l=new t({id:a,type:r,ctx:this.ctx,chart:this}),i[l.id]=l}l.init(n,t)}),Ne(s,(t,e)=>{t||delete i[e]}),Ne(i,t=>{Ro.configure(this,t,t.options),Ro.addBox(this,t)})}_updateMetasets(){const t=this._metasets,e=this.data.datasets.length,i=t.length;if(t.sort((t,e)=>t.index-e.index),i>e){for(let t=e;te.length&&delete this._stacks,t.forEach((t,i)=>{0===e.filter(e=>e===t._dataset).length&&this._destroyDatasetMeta(i)})}buildOrUpdateControllers(){const t=[],e=this.data.datasets;let i,s;for(this._removeUnreferencedMetasets(),i=0,s=e.length;i{this.getDatasetMeta(e).controller.reset()},this)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(t){const e=this.config;e.update();const i=this._options=e.createResolver(e.chartOptionScopes(),this.getContext()),s=this._animationsDisabled=!i.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),!1===this.notifyPlugins("beforeUpdate",{mode:t,cancelable:!0}))return;const n=this.buildOrUpdateControllers();this.notifyPlugins("beforeElementsUpdate");let a=0;for(let l=0,h=this.data.datasets.length;l{t.reset()}),this._updateDatasets(t),this.notifyPlugins("afterUpdate",{mode:t}),this._layers.sort(ll("z","_idx"));const{_active:o,_lastEvent:r}=this;r?this._eventHandler(r,!0):o.length&&this._updateHoverStyles(o,o,!0),this.render()}_updateScales(){Ne(this.scales,t=>{Ro.removeBox(this,t)}),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){const t=this.options,e=new Set(Object.keys(this._listeners)),i=new Set(t.events);si(e,i)&&!!this._responsiveListeners===t.responsive||(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){const{_hiddenIndices:t}=this,e=this._getUniformDataChanges()||[];for(const{method:i,start:s,count:n}of e){const e="_removeElements"===i?-n:n;pl(t,s,e)}}_getUniformDataChanges(){const t=this._dataChanges;if(!t||!t.length)return;this._dataChanges=[];const e=this.data.datasets.length,i=e=>new Set(t.filter(t=>t[0]===e).map((t,e)=>e+","+t.splice(1).join(","))),s=i(0);for(let n=1;nt.split(",")).map(t=>({method:t[1],start:+t[2],count:+t[3]}))}_updateLayout(t){if(!1===this.notifyPlugins("beforeLayout",{cancelable:!0}))return;Ro.update(this,this.width,this.height,t);const e=this.chartArea,i=e.width<=0||e.height<=0;this._layers=[],Ne(this.boxes,t=>{i&&"chartArea"===t.position||(t.configure&&t.configure(),this._layers.push(...t._layers()))},this),this._layers.forEach((t,e)=>{t._idx=e}),this.notifyPlugins("afterLayout")}_updateDatasets(t){if(!1!==this.notifyPlugins("beforeDatasetsUpdate",{mode:t,cancelable:!0})){for(let t=0,e=this.data.datasets.length;t=0;--e)this._drawDataset(t[e]);this.notifyPlugins("afterDatasetsDraw")}_drawDataset(t){const e=this.ctx,i={meta:t,index:t.index,cancelable:!0},s=ha(this,t);!1!==this.notifyPlugins("beforeDatasetDraw",i)&&(s&&Fs(e,s),t.controller.draw(),s&&As(e),i.cancelable=!1,this.notifyPlugins("afterDatasetDraw",i))}isPointInArea(t){return Cs(t,this.chartArea,this._minPadding)}getElementsAtEventForMode(t,e,i,s){const n=_o.modes[e];return"function"===typeof n?n(this,t,i,s):[]}getDatasetMeta(t){const e=this.data.datasets[t],i=this._metasets;let s=i.filter(t=>t&&t._dataset===e).pop();return s||(s={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e&&e.order||0,index:t,_dataset:e,_parsed:[],_sorted:!1},i.push(s)),s}getContext(){return this.$context||(this.$context=Xs(null,{chart:this,type:"chart"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){const e=this.data.datasets[t];if(!e)return!1;const i=this.getDatasetMeta(t);return"boolean"===typeof i.hidden?!i.hidden:!e.hidden}setDatasetVisibility(t,e){const i=this.getDatasetMeta(t);i.hidden=!e}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateVisibility(t,e,i){const s=i?"show":"hide",n=this.getDatasetMeta(t),a=n.controller._resolveAnimations(void 0,s);ei(e)?(n.data[e].hidden=!i,this.update()):(this.setDatasetVisibility(t,i),a.update(n,{visible:i}),this.update(e=>e.datasetIndex===t?s:void 0))}hide(t,e){this._updateVisibility(t,e,!1)}show(t,e){this._updateVisibility(t,e,!0)}_destroyDatasetMeta(t){const e=this._metasets[t];e&&e.controller&&e.controller._destroy(),delete this._metasets[t]}_stop(){let t,e;for(this.stop(),da.remove(this),t=0,e=this.data.datasets.length;t{e.addEventListener(this,i,s),t[i]=s},s=(t,e,i)=>{t.offsetX=e,t.offsetY=i,this._eventHandler(t)};Ne(this.options.events,t=>i(t,s))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});const t=this._responsiveListeners,e=this.platform,i=(i,s)=>{e.addEventListener(this,i,s),t[i]=s},s=(i,s)=>{t[i]&&(e.removeEventListener(this,i,s),delete t[i])},n=(t,e)=>{this.canvas&&this.resize(t,e)};let a;const o=()=>{s("attach",o),this.attached=!0,this.resize(),i("resize",n),i("detach",a)};a=()=>{this.attached=!1,s("resize",n),this._stop(),this._resize(0,0),i("attach",o)},e.isAttached(this.canvas)?o():a()}unbindEvents(){Ne(this._listeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._listeners={},Ne(this._responsiveListeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._responsiveListeners=void 0}updateHoverStyle(t,e,i){const s=i?"set":"remove";let n,a,o,r;for("dataset"===e&&(n=this.getDatasetMeta(t[0].datasetIndex),n.controller["_"+s+"DatasetHoverStyle"]()),o=0,r=t.length;o{const i=this.getDatasetMeta(t);if(!i)throw new Error("No dataset found at index "+t);return{datasetIndex:t,element:i.data[e],index:e}}),s=!je(i,e);s&&(this._active=i,this._lastEvent=null,this._updateHoverStyles(i,e))}notifyPlugins(t,e,i){return this._plugins.notify(this,t,e,i)}isPluginEnabled(t){return 1===this._plugins._cache.filter(e=>e.plugin.id===t).length}_updateHoverStyles(t,e,i){const s=this.options.hover,n=(t,e)=>t.filter(t=>!e.some(e=>t.datasetIndex===e.datasetIndex&&t.index===e.index)),a=n(e,t),o=i?t:n(t,e);a.length&&this.updateHoverStyle(a,s.mode,!1),o.length&&s.mode&&this.updateHoverStyle(o,s.mode,!0)}_eventHandler(t,e){const i={event:t,replay:e,cancelable:!0,inChartArea:this.isPointInArea(t)},s=e=>(e.options.events||this.options.events).includes(t.native.type);if(!1===this.notifyPlugins("beforeEvent",i,s))return;const n=this._handleEvent(t,e,i.inChartArea);return i.cancelable=!1,this.notifyPlugins("afterEvent",i,s),(n||i.changed)&&this.render(),this}_handleEvent(t,e,i){const{_active:s=[],options:n}=this,a=e,o=this._getActiveElements(t,s,i,a),r=ni(t),l=fl(t,this._lastEvent,i,r);i&&(this._lastEvent=null,Ue(n.onHover,[t,o,this],this),r&&Ue(n.onClick,[t,o,this],this));const h=!je(o,s);return(h||e)&&(this._active=o,this._updateHoverStyles(o,s,e)),this._lastEvent=l,h}_getActiveElements(t,e,i,s){if("mouseout"===t.type)return[];if(!i)return e;const n=this.options.hover;return this.getElementsAtEventForMode(t,n.mode,n,s)}}function bl(){return Ne(ml.instances,t=>t._plugins.invalidate())}function xl(t,e,i){const{startAngle:s,x:n,y:a,outerRadius:o,innerRadius:r,options:l}=e,{borderWidth:h,borderJoinStyle:c}=l,d=Math.min(h/o,Ai(s-i));if(t.beginPath(),t.arc(n,a,o-h/2,s+d/2,i-d/2),r>0){const e=Math.min(h/r,Ai(s-i));t.arc(n,a,r+h/2,i-e/2,s+e/2,!0)}else{const e=Math.min(h/2,o*Ai(s-i));if("round"===c)t.arc(n,a,e,i-ai/2,s+ai/2,!0);else if("bevel"===c){const o=2*e*e,r=-o*Math.cos(i+ai/2)+n,l=-o*Math.sin(i+ai/2)+a,h=o*Math.cos(s+ai/2)+n,c=o*Math.sin(s+ai/2)+a;t.lineTo(r,l),t.lineTo(h,c)}}t.closePath(),t.moveTo(0,0),t.rect(0,0,t.canvas.width,t.canvas.height),t.clip("evenodd")}function yl(t,e,i){const{startAngle:s,pixelMargin:n,x:a,y:o,outerRadius:r,innerRadius:l}=e;let h=n/r;t.beginPath(),t.arc(a,o,r,s-h,i+h),l>n?(h=n/l,t.arc(a,o,l,i+h,s-h,!0)):t.arc(a,o,n,i+ci,s-ci),t.closePath(),t.clip()}function _l(t){return Bs(t,["outerStart","outerEnd","innerStart","innerEnd"])}function vl(t,e,i,s){const n=_l(t.options.borderRadius),a=(i-e)/2,o=Math.min(a,s*e/2),r=t=>{const e=(i-Math.min(a,t))*s/2;return Ti(t,0,Math.min(a,e))};return{outerStart:r(n.outerStart),outerEnd:r(n.outerEnd),innerStart:Ti(n.innerStart,0,o),innerEnd:Ti(n.innerEnd,0,o)}}function kl(t,e,i,s){return{x:i+t*Math.cos(e),y:s+t*Math.sin(e)}}function wl(t,e,i,s,n,a){const{x:o,y:r,startAngle:l,pixelMargin:h,innerRadius:c}=e,d=Math.max(e.outerRadius+s+i-h,0),u=c>0?c+s+i+h:0;let g=0;const p=n-l;if(s){const t=c>0?c-s:0,e=d>0?d-s:0,i=(t+e)/2,n=0!==i?p*i/(i+s):p;g=(p-n)/2}const f=Math.max(.001,p*d-i/ai)/d,m=(p-f)/2,b=l+m+g,x=n-m-g,{outerStart:y,outerEnd:_,innerStart:v,innerEnd:k}=vl(e,u,d,x-b),w=d-y,S=d-_,M=b+y/w,C=x-_/S,F=u+v,A=u+k,P=b+v/F,T=x-k/A;if(t.beginPath(),a){const e=(M+C)/2;if(t.arc(o,r,d,M,e),t.arc(o,r,d,e,C),_>0){const e=kl(S,C,o,r);t.arc(e.x,e.y,_,C,x+ci)}const i=kl(A,x,o,r);if(t.lineTo(i.x,i.y),k>0){const e=kl(A,T,o,r);t.arc(e.x,e.y,k,x+ci,T+Math.PI)}const s=(x-k/u+(b+v/u))/2;if(t.arc(o,r,u,x-k/u,s,!0),t.arc(o,r,u,s,b+v/u,!0),v>0){const e=kl(F,P,o,r);t.arc(e.x,e.y,v,P+Math.PI,b-ci)}const n=kl(w,b,o,r);if(t.lineTo(n.x,n.y),y>0){const e=kl(w,M,o,r);t.arc(e.x,e.y,y,b-ci,M)}}else{t.moveTo(o,r);const e=Math.cos(M)*d+o,i=Math.sin(M)*d+r;t.lineTo(e,i);const s=Math.cos(C)*d+o,n=Math.sin(C)*d+r;t.lineTo(s,n)}t.closePath()}function Sl(t,e,i,s,n){const{fullCircles:a,startAngle:o,circumference:r}=e;let l=e.endAngle;if(a){wl(t,e,i,s,l,n);for(let e=0;e=ai&&0===g&&"miter"!==c&&xl(t,e,f),a||(wl(t,e,i,s,f,n),t.stroke())}(0,zt.A)(ml,"defaults",xs),(0,zt.A)(ml,"instances",ul),(0,zt.A)(ml,"overrides",gs),(0,zt.A)(ml,"registry",Vr),(0,zt.A)(ml,"version",al),(0,zt.A)(ml,"getChart",gl);class Cl extends rr{constructor(t){super(),(0,zt.A)(this,"circumference",void 0),(0,zt.A)(this,"endAngle",void 0),(0,zt.A)(this,"fullCircles",void 0),(0,zt.A)(this,"innerRadius",void 0),(0,zt.A)(this,"outerRadius",void 0),(0,zt.A)(this,"pixelMargin",void 0),(0,zt.A)(this,"startAngle",void 0),this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,t&&Object.assign(this,t)}inRange(t,e,i){const s=this.getProps(["x","y"],i),{angle:n,distance:a}=Mi(s,{x:t,y:e}),{startAngle:o,endAngle:r,innerRadius:l,outerRadius:h,circumference:c}=this.getProps(["startAngle","endAngle","innerRadius","outerRadius","circumference"],i),d=(this.options.spacing+this.options.borderWidth)/2,u=We(c,r-o),g=Pi(n,o,r)&&o!==r,p=u>=oi||g,f=Di(a,l+d,h+d);return p&&f}getCenterPoint(t){const{x:e,y:i,startAngle:s,endAngle:n,innerRadius:a,outerRadius:o}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius"],t),{offset:r,spacing:l}=this.options,h=(s+n)/2,c=(a+o+l+r)/2;return{x:e+Math.cos(h)*c,y:i+Math.sin(h)*c}}tooltipPosition(t){return this.getCenterPoint(t)}draw(t){const{options:e,circumference:i}=this,s=(e.offset||0)/4,n=(e.spacing||0)/2,a=e.circular;if(this.pixelMargin="inner"===e.borderAlign?.33:0,this.fullCircles=i>oi?Math.floor(i/oi):0,0===i||this.innerRadius<0||this.outerRadius<0)return;t.save();const o=(this.startAngle+this.endAngle)/2;t.translate(Math.cos(o)*s,Math.sin(o)*s);const r=1-Math.sin(Math.min(ai,i||0)),l=s*r;t.fillStyle=e.backgroundColor,t.strokeStyle=e.borderColor,Sl(t,this,l,n,a),Ml(t,this,l,n,a),t.restore()}}function Fl(t,e,i=e){t.lineCap=We(i.borderCapStyle,e.borderCapStyle),t.setLineDash(We(i.borderDash,e.borderDash)),t.lineDashOffset=We(i.borderDashOffset,e.borderDashOffset),t.lineJoin=We(i.borderJoinStyle,e.borderJoinStyle),t.lineWidth=We(i.borderWidth,e.borderWidth),t.strokeStyle=We(i.borderColor,e.borderColor)}function Al(t,e,i){t.lineTo(i.x,i.y)}function Pl(t){return t.stepped?Ps:t.tension||"monotone"===t.cubicInterpolationMode?Ts:Al}function Tl(t,e,i={}){const s=t.length,{start:n=0,end:a=s-1}=i,{start:o,end:r}=e,l=Math.max(n,o),h=Math.min(a,r),c=nr&&a>r;return{count:s,start:l,loop:e.loop,ilen:h(o+(h?r-t:t))%a,y=()=>{g!==p&&(t.lineTo(m,p),t.lineTo(m,g),t.lineTo(m,f))};for(l&&(d=n[x(0)],t.moveTo(d.x,d.y)),c=0;c<=r;++c){if(d=n[x(c)],d.skip)continue;const e=d.x,i=d.y,s=0|e;s===u?(ip&&(p=i),m=(b*m+e)/++b):(y(),t.lineTo(e,i),u=s,b=0,g=p=i),f=i}y()}function Vl(t){const e=t.options,i=e.borderDash&&e.borderDash.length,s=!t._decimated&&!t._loop&&!e.tension&&"monotone"!==e.cubicInterpolationMode&&!e.stepped&&!i;return s?Dl:Ll}function Il(t){return t.stepped?Nn:t.tension||"monotone"===t.cubicInterpolationMode?jn:Un}function El(t,e,i,s){let n=e._path;n||(n=e._path=new Path2D,e.path(n,i,s)&&n.closePath()),Fl(t,e.options),t.stroke(n)}function Ol(t,e,i,s){const{segments:n,options:a}=e,o=Vl(e);for(const r of n)Fl(t,a,r.style),t.beginPath(),o(t,e,r,{start:i,end:i+s-1})&&t.closePath(),t.stroke()}(0,zt.A)(Cl,"id","arc"),(0,zt.A)(Cl,"defaults",{borderAlign:"center",borderColor:"#fff",borderDash:[],borderDashOffset:0,borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0,circular:!0,selfJoin:!1}),(0,zt.A)(Cl,"defaultRoutes",{backgroundColor:"backgroundColor"}),(0,zt.A)(Cl,"descriptors",{_scriptable:!0,_indexable:t=>"borderDash"!==t});const Rl="function"===typeof Path2D;function Wl(t,e,i,s){Rl&&!e.options.segment?El(t,e,i,s):Ol(t,e,i,s)}class zl extends rr{constructor(t){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,t&&Object.assign(this,t)}updateControlPoints(t,e){const i=this.options;if((i.tension||"monotone"===i.cubicInterpolationMode)&&!i.stepped&&!this._pointsUpdated){const s=i.spanGaps?this._loop:this._fullLoop;Sn(this._points,i,t,s,e),this._pointsUpdated=!0}}set points(t){this._points=t,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=ia(this,this.options.segment))}first(){const t=this.segments,e=this.points;return t.length&&e[t[0].start]}last(){const t=this.segments,e=this.points,i=t.length;return i&&e[t[i-1].end]}interpolate(t,e){const i=this.options,s=t[e],n=this.points,a=Zn(this,{property:e,start:s,end:s});if(!a.length)return;const o=[],r=Il(i);let l,h;for(l=0,h=a.length;l"borderDash"!==t&&"fill"!==t});class Ul extends rr{constructor(t){super(),(0,zt.A)(this,"parsed",void 0),(0,zt.A)(this,"skip",void 0),(0,zt.A)(this,"stop",void 0),this.options=void 0,this.parsed=void 0,this.skip=void 0,this.stop=void 0,t&&Object.assign(this,t)}inRange(t,e,i){const s=this.options,{x:n,y:a}=this.getProps(["x","y"],i);return Math.pow(t-n,2)+Math.pow(e-a,2){let{boxHeight:i=e,boxWidth:s=e}=t;return t.usePointStyle&&(i=Math.min(i,e),s=t.pointStyleWidth||Math.min(s,e)),{boxWidth:s,boxHeight:i,itemHeight:Math.max(e,i)}},Zl=(t,e)=>null!==t&&null!==e&&t.datasetIndex===e.datasetIndex&&t.index===e.index;class th extends rr{constructor(t){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e,i){this.maxWidth=t,this.maxHeight=e,this._margins=i,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){const t=this.options.labels||{};let e=Ue(t.generateLabels,[this.chart],this)||[];t.filter&&(e=e.filter(e=>t.filter(e,this.chart.data))),t.sort&&(e=e.sort((e,i)=>t.sort(e,i,this.chart.data))),this.options.reverse&&e.reverse(),this.legendItems=e}fit(){const{options:t,ctx:e}=this;if(!t.display)return void(this.width=this.height=0);const i=t.labels,s=$s(i.font),n=s.size,a=this._computeTitleHeight(),{boxWidth:o,itemHeight:r}=Jl(i,n);let l,h;e.font=s.string,this.isHorizontal()?(l=this.maxWidth,h=this._fitRows(a,n,o,r)+10):(h=this.maxHeight,l=this._fitCols(a,s,o,r)+10),this.width=Math.min(l,t.maxWidth||this.maxWidth),this.height=Math.min(h,t.maxHeight||this.maxHeight)}_fitRows(t,e,i,s){const{ctx:n,maxWidth:a,options:{labels:{padding:o}}}=this,r=this.legendHitBoxes=[],l=this.lineWidths=[0],h=s+o;let c=t;n.textAlign="left",n.textBaseline="middle";let d=-1,u=-h;return this.legendItems.forEach((t,g)=>{const p=i+e/2+n.measureText(t.text).width;(0===g||l[l.length-1]+p+2*o>a)&&(c+=h,l[l.length-(g>0?0:1)]=0,u+=h,d++),r[g]={left:0,top:u,row:d,width:p,height:s},l[l.length-1]+=p+o}),c}_fitCols(t,e,i,s){const{ctx:n,maxHeight:a,options:{labels:{padding:o}}}=this,r=this.legendHitBoxes=[],l=this.columnSizes=[],h=a-t;let c=o,d=0,u=0,g=0,p=0;return this.legendItems.forEach((t,a)=>{const{itemWidth:f,itemHeight:m}=eh(i,e,n,t,s);a>0&&u+m+2*o>h&&(c+=d+o,l.push({width:d,height:u}),g+=d+o,p++,d=u=0),r[a]={left:g,top:u,col:p,width:f,height:m},d=Math.max(d,f),u+=m+o}),c+=d,l.push({width:d,height:u}),c}adjustHitBoxes(){if(!this.options.display)return;const t=this._computeTitleHeight(),{legendHitBoxes:e,options:{align:i,labels:{padding:s},rtl:n}}=this,a=qn(n,this.left,this.width);if(this.isHorizontal()){let n=0,o=Hi(i,this.left+s,this.right-this.lineWidths[n]);for(const r of e)n!==r.row&&(n=r.row,o=Hi(i,this.left+s,this.right-this.lineWidths[n])),r.top+=this.top+t+s,r.left=a.leftForLtr(a.x(o),r.width),o+=r.width+s}else{let n=0,o=Hi(i,this.top+t+s,this.bottom-this.columnSizes[n].height);for(const r of e)r.col!==n&&(n=r.col,o=Hi(i,this.top+t+s,this.bottom-this.columnSizes[n].height)),r.top=o,r.left+=this.left+s,r.left=a.leftForLtr(a.x(r.left),r.width),o+=r.height+s}}isHorizontal(){return"top"===this.options.position||"bottom"===this.options.position}draw(){if(this.options.display){const t=this.ctx;Fs(t,this),this._draw(),As(t)}}_draw(){const{options:t,columnSizes:e,lineWidths:i,ctx:s}=this,{align:n,labels:a}=t,o=xs.color,r=qn(t.rtl,this.left,this.width),l=$s(a.font),{padding:h}=a,c=l.size,d=c/2;let u;this.drawTitle(),s.textAlign=r.textAlign("left"),s.textBaseline="middle",s.lineWidth=.5,s.font=l.string;const{boxWidth:g,boxHeight:p,itemHeight:f}=Jl(a,c),m=function(t,e,i){if(isNaN(g)||g<=0||isNaN(p)||p<0)return;s.save();const n=We(i.lineWidth,1);if(s.fillStyle=We(i.fillStyle,o),s.lineCap=We(i.lineCap,"butt"),s.lineDashOffset=We(i.lineDashOffset,0),s.lineJoin=We(i.lineJoin,"miter"),s.lineWidth=n,s.strokeStyle=We(i.strokeStyle,o),s.setLineDash(We(i.lineDash,[])),a.usePointStyle){const o={radius:p*Math.SQRT2/2,pointStyle:i.pointStyle,rotation:i.rotation,borderWidth:n},l=r.xPlus(t,g/2),h=e+d;Ms(s,o,l,h,a.pointStyleWidth&&g)}else{const a=e+Math.max((c-p)/2,0),o=r.leftForLtr(t,g),l=Ns(i.borderRadius);s.beginPath(),Object.values(l).some(t=>0!==t)?Es(s,{x:o,y:a,w:g,h:p,radius:l}):s.rect(o,a,g,p),s.fill(),0!==n&&s.stroke()}s.restore()},b=function(t,e,i){Is(s,i.text,t,e+f/2,l,{strikethrough:i.hidden,textAlign:r.textAlign(i.textAlign)})},x=this.isHorizontal(),y=this._computeTitleHeight();u=x?{x:Hi(n,this.left+h,this.right-i[0]),y:this.top+h+y,line:0}:{x:this.left+h,y:Hi(n,this.top+y+h,this.bottom-e[0].height),line:0},Xn(this.ctx,t.textDirection);const _=f+h;this.legendItems.forEach((o,c)=>{s.strokeStyle=o.fontColor,s.fillStyle=o.fontColor;const p=s.measureText(o.text).width,f=r.textAlign(o.textAlign||(o.textAlign=a.textAlign)),v=g+d+p;let k=u.x,w=u.y;r.setWidth(this.width),x?c>0&&k+v+h>this.right&&(w=u.y+=_,u.line++,k=u.x=Hi(n,this.left+h,this.right-i[u.line])):c>0&&w+_>this.bottom&&(k=u.x=k+e[u.line].width+h,u.line++,w=u.y=Hi(n,this.top+y+h,this.bottom-e[u.line].height));const S=r.x(k);if(m(S,w,o),k=qi(f,k+g+d,x?k+v:this.right,t.rtl),b(r.x(k),w,o),x)u.x+=v+h;else if("string"!==typeof o.text){const t=l.lineHeight;u.y+=nh(o,t)+h}else u.y+=_}),Yn(this.ctx,t.textDirection)}drawTitle(){const t=this.options,e=t.title,i=$s(e.font),s=js(e.padding);if(!e.display)return;const n=qn(t.rtl,this.left,this.width),a=this.ctx,o=e.position,r=i.size/2,l=s.top+r;let h,c=this.left,d=this.width;if(this.isHorizontal())d=Math.max(...this.lineWidths),h=this.top+l,c=Hi(t.align,c,this.right-d);else{const e=this.columnSizes.reduce((t,e)=>Math.max(t,e.height),0);h=l+Hi(t.align,this.top,this.bottom-e-t.labels.padding-this._computeTitleHeight())}const u=Hi(o,c,c+d);a.textAlign=n.textAlign($i(o)),a.textBaseline="middle",a.strokeStyle=e.color,a.fillStyle=e.color,a.font=i.string,Is(a,e.text,u,h,i)}_computeTitleHeight(){const t=this.options.title,e=$s(t.font),i=js(t.padding);return t.display?e.lineHeight+i.height:0}_getLegendItemAt(t,e){let i,s,n;if(Di(t,this.left,this.right)&&Di(e,this.top,this.bottom))for(n=this.legendHitBoxes,i=0;it.length>e.length?t:e)),e+i.size/2+s.measureText(n).width}function sh(t,e,i){let s=t;return"string"!==typeof e.text&&(s=nh(e,i)),s}function nh(t,e){const i=t.text?t.text.length:0;return e*i}function ah(t,e){return!("mousemove"!==t&&"mouseout"!==t||!e.onHover&&!e.onLeave)||!(!e.onClick||"click"!==t&&"mouseup"!==t)}var oh={id:"legend",_element:th,start(t,e,i){const s=t.legend=new th({ctx:t.ctx,options:i,chart:t});Ro.configure(t,s,i),Ro.addBox(t,s)},stop(t){Ro.removeBox(t,t.legend),delete t.legend},beforeUpdate(t,e,i){const s=t.legend;Ro.configure(t,s,i),s.options=i},afterUpdate(t){const e=t.legend;e.buildLabels(),e.adjustHitBoxes()},afterEvent(t,e){e.replay||t.legend.handleEvent(e.event)},defaults:{display:!0,position:"top",align:"center",fullSize:!0,reverse:!1,weight:1e3,onClick(t,e,i){const s=e.datasetIndex,n=i.chart;n.isDatasetVisible(s)?(n.hide(s),e.hidden=!0):(n.show(s),e.hidden=!1)},onHover:null,onLeave:null,labels:{color:t=>t.chart.options.color,boxWidth:40,padding:10,generateLabels(t){const e=t.data.datasets,{labels:{usePointStyle:i,pointStyle:s,textAlign:n,color:a,useBorderRadius:o,borderRadius:r}}=t.legend.options;return t._getSortedDatasetMetas().map(t=>{const l=t.controller.getStyle(i?0:void 0),h=js(l.borderWidth);return{text:e[t.index].label,fillStyle:l.backgroundColor,fontColor:a,hidden:!t.visible,lineCap:l.borderCapStyle,lineDash:l.borderDash,lineDashOffset:l.borderDashOffset,lineJoin:l.borderJoinStyle,lineWidth:(h.width+h.height)/4,strokeStyle:l.borderColor,pointStyle:s||l.pointStyle,rotation:l.rotation,textAlign:n||l.textAlign,borderRadius:o&&(r||l.borderRadius),datasetIndex:t.index}},this)}},title:{color:t=>t.chart.options.color,display:!1,position:"center",text:""}},descriptors:{_scriptable:t=>!t.startsWith("on"),labels:{_scriptable:t=>!["generateLabels","filter","sort"].includes(t)}}};new WeakMap;const rh={average(t){if(!t.length)return!1;let e,i,s=new Set,n=0,a=0;for(e=0,i=t.length;et+e)/s.size;return{x:o,y:n/a}},nearest(t,e){if(!t.length)return!1;let i,s,n,a=e.x,o=e.y,r=Number.POSITIVE_INFINITY;for(i=0,s=t.length;i-1?t.split("\n"):t}function ch(t,e){const{element:i,datasetIndex:s,index:n}=e,a=t.getDatasetMeta(s).controller,{label:o,value:r}=a.getLabelAndValue(n);return{chart:t,label:o,parsed:a.getParsed(n),raw:t.data.datasets[s].data[n],formattedValue:r,dataset:a.getDataset(),dataIndex:n,datasetIndex:s,element:i}}function dh(t,e){const i=t.chart.ctx,{body:s,footer:n,title:a}=t,{boxWidth:o,boxHeight:r}=e,l=$s(e.bodyFont),h=$s(e.titleFont),c=$s(e.footerFont),d=a.length,u=n.length,g=s.length,p=js(e.padding);let f=p.height,m=0,b=s.reduce((t,e)=>t+e.before.length+e.lines.length+e.after.length,0);if(b+=t.beforeBody.length+t.afterBody.length,d&&(f+=d*h.lineHeight+(d-1)*e.titleSpacing+e.titleMarginBottom),b){const t=e.displayColors?Math.max(r,l.lineHeight):l.lineHeight;f+=g*t+(b-g)*l.lineHeight+(b-1)*e.bodySpacing}u&&(f+=e.footerMarginTop+u*c.lineHeight+(u-1)*e.footerSpacing);let x=0;const y=function(t){m=Math.max(m,i.measureText(t).width+x)};return i.save(),i.font=h.string,Ne(t.title,y),i.font=l.string,Ne(t.beforeBody.concat(t.afterBody),y),x=e.displayColors?o+2+e.boxPadding:0,Ne(s,t=>{Ne(t.before,y),Ne(t.lines,y),Ne(t.after,y)}),x=0,i.font=c.string,Ne(t.footer,y),i.restore(),m+=p.width,{width:m,height:f}}function uh(t,e){const{y:i,height:s}=e;return it.height-s/2?"bottom":"center"}function gh(t,e,i,s){const{x:n,width:a}=s,o=i.caretSize+i.caretPadding;return"left"===t&&n+a+o>e.width||("right"===t&&n-a-o<0||void 0)}function ph(t,e,i,s){const{x:n,width:a}=i,{width:o,chartArea:{left:r,right:l}}=t;let h="center";return"center"===s?h=n<=(r+l)/2?"left":"right":n<=a/2?h="left":n>=o-a/2&&(h="right"),gh(h,t,e,i)&&(h="center"),h}function fh(t,e,i){const s=i.yAlign||e.yAlign||uh(t,i);return{xAlign:i.xAlign||e.xAlign||ph(t,e,i,s),yAlign:s}}function mh(t,e){let{x:i,width:s}=t;return"right"===e?i-=s:"center"===e&&(i-=s/2),i}function bh(t,e,i){let{y:s,height:n}=t;return"top"===e?s+=i:s-="bottom"===e?n+i:n/2,s}function xh(t,e,i,s){const{caretSize:n,caretPadding:a,cornerRadius:o}=t,{xAlign:r,yAlign:l}=i,h=n+a,{topLeft:c,topRight:d,bottomLeft:u,bottomRight:g}=Ns(o);let p=mh(e,r);const f=bh(e,l,h);return"center"===l?"left"===r?p+=h:"right"===r&&(p-=h):"left"===r?p-=Math.max(c,u)+n:"right"===r&&(p+=Math.max(d,g)+n),{x:Ti(p,0,s.width-e.width),y:Ti(f,0,s.height-e.height)}}function yh(t,e,i){const s=js(i.padding);return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-s.right:t.x+s.left}function _h(t){return lh([],hh(t))}function vh(t,e,i){return Xs(t,{tooltip:e,tooltipItems:i,type:"tooltip"})}function kh(t,e){const i=e&&e.dataset&&e.dataset.tooltip&&e.dataset.tooltip.callbacks;return i?t.override(i):t}const wh={beforeTitle:Le,title(t){if(t.length>0){const e=t[0],i=e.chart.data.labels,s=i?i.length:0;if(this&&this.options&&"dataset"===this.options.mode)return e.dataset.label||"";if(e.label)return e.label;if(s>0&&e.dataIndex{const e={before:[],lines:[],after:[]},n=kh(i,t);lh(e.before,hh(Sh(n,"beforeLabel",this,t))),lh(e.lines,Sh(n,"label",this,t)),lh(e.after,hh(Sh(n,"afterLabel",this,t))),s.push(e)}),s}getAfterBody(t,e){return _h(Sh(e.callbacks,"afterBody",this,t))}getFooter(t,e){const{callbacks:i}=e,s=Sh(i,"beforeFooter",this,t),n=Sh(i,"footer",this,t),a=Sh(i,"afterFooter",this,t);let o=[];return o=lh(o,hh(s)),o=lh(o,hh(n)),o=lh(o,hh(a)),o}_createItems(t){const e=this._active,i=this.chart.data,s=[],n=[],a=[];let o,r,l=[];for(o=0,r=e.length;ot.filter(e,s,n,i))),t.itemSort&&(l=l.sort((e,s)=>t.itemSort(e,s,i))),Ne(l,e=>{const i=kh(t.callbacks,e);s.push(Sh(i,"labelColor",this,e)),n.push(Sh(i,"labelPointStyle",this,e)),a.push(Sh(i,"labelTextColor",this,e))}),this.labelColors=s,this.labelPointStyles=n,this.labelTextColors=a,this.dataPoints=l,l}update(t,e){const i=this.options.setContext(this.getContext()),s=this._active;let n,a=[];if(s.length){const t=rh[i.position].call(this,s,this._eventPosition);a=this._createItems(i),this.title=this.getTitle(a,i),this.beforeBody=this.getBeforeBody(a,i),this.body=this.getBody(a,i),this.afterBody=this.getAfterBody(a,i),this.footer=this.getFooter(a,i);const e=this._size=dh(this,i),o=Object.assign({},t,e),r=fh(this.chart,i,o),l=xh(i,o,r,this.chart);this.xAlign=r.xAlign,this.yAlign=r.yAlign,n={opacity:1,x:l.x,y:l.y,width:e.width,height:e.height,caretX:t.x,caretY:t.y}}else 0!==this.opacity&&(n={opacity:0});this._tooltipItems=a,this.$context=void 0,n&&this._resolveAnimations().update(this,n),t&&i.external&&i.external.call(this,{chart:this.chart,tooltip:this,replay:e})}drawCaret(t,e,i,s){const n=this.getCaretPosition(t,i,s);e.lineTo(n.x1,n.y1),e.lineTo(n.x2,n.y2),e.lineTo(n.x3,n.y3)}getCaretPosition(t,e,i){const{xAlign:s,yAlign:n}=this,{caretSize:a,cornerRadius:o}=i,{topLeft:r,topRight:l,bottomLeft:h,bottomRight:c}=Ns(o),{x:d,y:u}=t,{width:g,height:p}=e;let f,m,b,x,y,_;return"center"===n?(y=u+p/2,"left"===s?(f=d,m=f-a,x=y+a,_=y-a):(f=d+g,m=f+a,x=y-a,_=y+a),b=f):(m="left"===s?d+Math.max(r,h)+a:"right"===s?d+g-Math.max(l,c)-a:this.caretX,"top"===n?(x=u,y=x-a,f=m-a,b=m+a):(x=u+p,y=x+a,f=m+a,b=m-a),_=x),{x1:f,x2:m,x3:b,y1:x,y2:y,y3:_}}drawTitle(t,e,i){const s=this.title,n=s.length;let a,o,r;if(n){const l=qn(i.rtl,this.x,this.width);for(t.x=yh(this,i.titleAlign,i),e.textAlign=l.textAlign(i.titleAlign),e.textBaseline="middle",a=$s(i.titleFont),o=i.titleSpacing,e.fillStyle=i.titleColor,e.font=a.string,r=0;r0!==t)?(t.beginPath(),t.fillStyle=n.multiKeyBackground,Es(t,{x:e,y:g,w:l,h:r,radius:o}),t.fill(),t.stroke(),t.fillStyle=a.backgroundColor,t.beginPath(),Es(t,{x:i,y:g+1,w:l-2,h:r-2,radius:o}),t.fill()):(t.fillStyle=n.multiKeyBackground,t.fillRect(e,g,l,r),t.strokeRect(e,g,l,r),t.fillStyle=a.backgroundColor,t.fillRect(i,g+1,l-2,r-2))}t.fillStyle=this.labelTextColors[i]}drawBody(t,e,i){const{body:s}=this,{bodySpacing:n,bodyAlign:a,displayColors:o,boxHeight:r,boxWidth:l,boxPadding:h}=i,c=$s(i.bodyFont);let d=c.lineHeight,u=0;const g=qn(i.rtl,this.x,this.width),p=function(i){e.fillText(i,g.x(t.x+u),t.y+d/2),t.y+=d+n},f=g.textAlign(a);let m,b,x,y,_,v,k;for(e.textAlign=a,e.textBaseline="middle",e.font=c.string,t.x=yh(this,f,i),e.fillStyle=i.bodyColor,Ne(this.beforeBody,p),u=o&&"right"!==f?"center"===a?l/2+h:l+2+h:0,y=0,v=s.length;y0&&e.stroke()}_updateAnimationTarget(t){const e=this.chart,i=this.$animations,s=i&&i.x,n=i&&i.y;if(s||n){const i=rh[t.position].call(this,this._active,this._eventPosition);if(!i)return;const a=this._size=dh(this,t),o=Object.assign({},i,this._size),r=fh(e,t,o),l=xh(t,o,r,e);s._to===l.x&&n._to===l.y||(this.xAlign=r.xAlign,this.yAlign=r.yAlign,this.width=a.width,this.height=a.height,this.caretX=i.x,this.caretY=i.y,this._resolveAnimations().update(this,l))}}_willRender(){return!!this.opacity}draw(t){const e=this.options.setContext(this.getContext());let i=this.opacity;if(!i)return;this._updateAnimationTarget(e);const s={width:this.width,height:this.height},n={x:this.x,y:this.y};i=Math.abs(i)<.001?0:i;const a=js(e.padding),o=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;e.enabled&&o&&(t.save(),t.globalAlpha=i,this.drawBackground(n,t,s,e),Xn(t,e.textDirection),n.y+=a.top,this.drawTitle(n,t,e),this.drawBody(n,t,e),this.drawFooter(n,t,e),Yn(t,e.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,e){const i=this._active,s=t.map(({datasetIndex:t,index:e})=>{const i=this.chart.getDatasetMeta(t);if(!i)throw new Error("Cannot find a dataset at index "+t);return{datasetIndex:t,element:i.data[e],index:e}}),n=!je(i,s),a=this._positionChanged(s,e);(n||a)&&(this._active=s,this._eventPosition=e,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(t,e,i=!0){if(e&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;const s=this.options,n=this._active||[],a=this._getActiveElements(t,n,e,i),o=this._positionChanged(a,t),r=e||!je(a,n)||o;return r&&(this._active=a,(s.enabled||s.external)&&(this._eventPosition={x:t.x,y:t.y},this.update(!0,e))),r}_getActiveElements(t,e,i,s){const n=this.options;if("mouseout"===t.type)return[];if(!s)return e.filter(t=>this.chart.data.datasets[t.datasetIndex]&&void 0!==this.chart.getDatasetMeta(t.datasetIndex).controller.getParsed(t.index));const a=this.chart.getElementsAtEventForMode(t,n.mode,n,i);return n.reverse&&a.reverse(),a}_positionChanged(t,e){const{caretX:i,caretY:s,options:n}=this,a=rh[n.position].call(this,t,e);return!1!==a&&(i!==a.x||s!==a.y)}}(0,zt.A)(Mh,"positioners",rh);var Ch={id:"tooltip",_element:Mh,positioners:rh,afterInit(t,e,i){i&&(t.tooltip=new Mh({chart:t,options:i}))},beforeUpdate(t,e,i){t.tooltip&&t.tooltip.initialize(i)},reset(t,e,i){t.tooltip&&t.tooltip.initialize(i)},afterDraw(t){const e=t.tooltip;if(e&&e._willRender()){const i={tooltip:e};if(!1===t.notifyPlugins("beforeTooltipDraw",{...i,cancelable:!0}))return;e.draw(t.ctx),t.notifyPlugins("afterTooltipDraw",i)}},afterEvent(t,e){if(t.tooltip){const i=e.replay;t.tooltip.handleEvent(e.event,i,e.inChartArea)&&(e.changed=!0)}},defaults:{enabled:!0,external:null,position:"average",backgroundColor:"rgba(0,0,0,0.8)",titleColor:"#fff",titleFont:{weight:"bold"},titleSpacing:2,titleMarginBottom:6,titleAlign:"left",bodyColor:"#fff",bodySpacing:2,bodyFont:{},bodyAlign:"left",footerColor:"#fff",footerSpacing:2,footerMarginTop:6,footerFont:{weight:"bold"},footerAlign:"left",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(t,e)=>e.bodyFont.size,boxWidth:(t,e)=>e.bodyFont.size,multiKeyBackground:"#fff",displayColors:!0,boxPadding:0,borderColor:"rgba(0,0,0,0)",borderWidth:0,animation:{duration:400,easing:"easeOutQuart"},animations:{numbers:{type:"number",properties:["x","y","width","height","caretX","caretY"]},opacity:{easing:"linear",duration:200}},callbacks:wh},defaultRoutes:{bodyFont:"font",footerFont:"font",titleFont:"font"},descriptors:{_scriptable:t=>"filter"!==t&&"itemSort"!==t&&"external"!==t,_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]};const Fh=(t,e,i,s)=>("string"===typeof e?(i=t.push(e)-1,s.unshift({index:i,label:e})):isNaN(e)&&(i=null),i);function Ah(t,e,i,s){const n=t.indexOf(e);if(-1===n)return Fh(t,e,i,s);const a=t.lastIndexOf(e);return n!==a?i:n}const Ph=(t,e)=>null===t?null:Ti(Math.round(t),0,e);function Th(t){const e=this.getLabels();return t>=0&&te.length-1?null:this.getPixelForValue(e[t].value)}getValueForPixel(t){return Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange)}getBasePixel(){return this.bottom}}function Dh(t,e){const i=[],s=1e-14,{bounds:n,step:a,min:o,max:r,precision:l,count:h,maxTicks:c,maxDigits:d,includeBounds:u}=t,g=a||1,p=c-1,{min:f,max:m}=e,b=!Ve(o),x=!Ve(r),y=!Ve(h),_=(m-f)/(d+1);let v,k,w,S,M=mi((m-f)/p/g)*g;if(Mp&&(M=mi(S*M/p/g)*g),Ve(l)||(v=Math.pow(10,l),M=Math.ceil(M*v)/v),"ticks"===n?(k=Math.floor(f/M)*M,w=Math.ceil(m/M)*M):(k=f,w=m),b&&x&&a&&_i((r-o)/a,M/1e3)?(S=Math.round(Math.min((r-o)/M,c)),M=(r-o)/S,k=o,w=r):y?(k=b?o:k,w=x?r:w,S=h-1,M=(w-k)/S):(S=(w-k)/M,S=fi(S,Math.round(S),M/1e3)?Math.round(S):Math.ceil(S));const C=Math.max(Si(M),Si(k));v=Math.pow(10,Ve(l)?C:l),k=Math.round(k*v)/v,w=Math.round(w*v)/v;let F=0;for(b&&(u&&k!==o?(i.push({value:o}),kr)break;i.push({value:t})}return x&&u&&w!==r?i.length&&fi(i[i.length-1].value,r,Vh(r,_,t))?i[i.length-1].value=r:i.push({value:r}):x&&w!==r||i.push({value:w}),i}function Vh(t,e,{horizontal:i,minRotation:s}){const n=ki(s),a=(i?Math.sin(n):Math.cos(n))||.001,o=.75*e*(""+t).length;return Math.min(e/a,o)}(0,zt.A)(Lh,"id","category"),(0,zt.A)(Lh,"defaults",{ticks:{callback:Th}});class Ih extends Fr{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._endValue=void 0,this._valueRange=0}parse(t,e){return Ve(t)||("number"===typeof t||t instanceof Number)&&!isFinite(+t)?null:+t}handleTickRangeOptions(){const{beginAtZero:t}=this.options,{minDefined:e,maxDefined:i}=this.getUserBounds();let{min:s,max:n}=this;const a=t=>s=e?s:t,o=t=>n=i?n:t;if(t){const t=pi(s),e=pi(n);t<0&&e<0?o(0):t>0&&e>0&&a(0)}if(s===n){let e=0===n?1:Math.abs(.05*n);o(n+e),t||a(s-e)}this.min=s,this.max=n}getTickLimit(){const t=this.options.ticks;let e,{maxTicksLimit:i,stepSize:s}=t;return s?(e=Math.ceil(this.max/s)-Math.floor(this.min/s)+1,e>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${s} would result generating up to ${e} ticks. Limiting to 1000.`),e=1e3)):(e=this.computeTickLimit(),i=i||11),i&&(e=Math.min(i,e)),e}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){const t=this.options,e=t.ticks;let i=this.getTickLimit();i=Math.max(2,i);const s={maxTicks:i,bounds:t.bounds,min:t.min,max:t.max,precision:e.precision,step:e.stepSize,count:e.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:e.minRotation||0,includeBounds:!1!==e.includeBounds},n=this._range||this,a=Dh(s,n);return"ticks"===t.bounds&&vi(a,this,"value"),t.reverse?(a.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),a}configure(){const t=this.ticks;let e=this.min,i=this.max;if(super.configure(),this.options.offset&&t.length){const s=(i-e)/Math.max(t.length-1,1)/2;e-=s,i+=s}this._startValue=e,this._endValue=i,this._valueRange=i-e}getLabelForValue(t){return ls(t,this.chart.options.locale,this.options.ticks.format)}}class Eh extends Ih{determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=Oe(t)?t:0,this.max=Oe(e)?e:1,this.handleTickRangeOptions()}computeTickLimit(){const t=this.isHorizontal(),e=t?this.width:this.height,i=ki(this.options.ticks.minRotation),s=(t?Math.sin(i):Math.cos(i))||.001,n=this._resolveTickFontOptions(0);return Math.ceil(e/Math.min(40,n.lineHeight/s))}getPixelForValue(t){return null===t?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getValueForPixel(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange}}(0,zt.A)(Eh,"id","linear"),(0,zt.A)(Eh,"defaults",{ticks:{callback:ds.formatters.numeric}});const Oh=t=>Math.floor(gi(t)),Rh=(t,e)=>Math.pow(10,Oh(t)+e);function Wh(t){const e=t/Math.pow(10,Oh(t));return 1===e}function zh(t,e,i){const s=Math.pow(10,i),n=Math.floor(t/s),a=Math.ceil(e/s);return a-n}function Bh(t,e){const i=e-t;let s=Oh(i);while(zh(t,e,s)>10)s++;while(zh(t,e,s)<10)s--;return Math.min(s,Oh(t))}function Uh(t,{min:e,max:i}){e=Re(t.min,e);const s=[],n=Oh(e);let a=Bh(e,i),o=a<0?Math.pow(10,Math.abs(a)):1;const r=Math.pow(10,a),l=n>a?Math.pow(10,n):0,h=Math.round((e-l)*o)/o,c=Math.floor((e-l)/r/10)*r*10;let d=Math.floor((h-c)/Math.pow(10,a)),u=Re(t.min,Math.round((l+c+d*Math.pow(10,a))*o)/o);while(u=10?d=d<15?15:20:d++,d>=20&&(a++,d=2,o=a>=0?1:o),u=Math.round((l+c+d*Math.pow(10,a))*o)/o;const g=Re(t.max,u);return s.push({value:g,major:Wh(g),significand:d}),s}class Nh extends Fr{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(t,e){const i=Ih.prototype.parse.apply(this,[t,e]);if(0!==i)return Oe(i)&&i>0?i:null;this._zero=!0}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=Oe(t)?Math.max(0,t):null,this.max=Oe(e)?Math.max(0,e):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!Oe(this._userMin)&&(this.min=t===Rh(this.min,0)?Rh(this.min,-1):Rh(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let i=this.min,s=this.max;const n=e=>i=t?i:e,a=t=>s=e?s:t;i===s&&(i<=0?(n(1),a(10)):(n(Rh(i,-1)),a(Rh(s,1)))),i<=0&&n(Rh(s,-1)),s<=0&&a(Rh(i,1)),this.min=i,this.max=s}buildTicks(){const t=this.options,e={min:this._userMin,max:this._userMax},i=Uh(e,this);return"ticks"===t.bounds&&vi(i,this,"value"),t.reverse?(i.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),i}getLabelForValue(t){return void 0===t?"0":ls(t,this.chart.options.locale,this.options.ticks.format)}configure(){const t=this.min;super.configure(),this._startValue=gi(t),this._valueRange=gi(this.max)-gi(t)}getPixelForValue(t){return void 0!==t&&0!==t||(t=this.min),null===t||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:(gi(t)-this._startValue)/this._valueRange)}getValueForPixel(t){const e=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+e*this._valueRange)}}function jh(t){const e=t.ticks;if(e.display&&t.display){const t=js(e.backdropPadding);return We(e.font&&e.font.size,xs.font.size)+t.height}return 0}function $h(t,e,i){return i=Ie(i)?i:[i],{w:vs(t,e.string,i),h:i.length*e.lineHeight}}function Hh(t,e,i,s,n){return t===s||t===n?{start:e-i/2,end:e+i/2}:tn?{start:e-i,end:e}:{start:e,end:e+i}}function qh(t){const e={l:t.left+t._padding.left,r:t.right-t._padding.right,t:t.top+t._padding.top,b:t.bottom-t._padding.bottom},i=Object.assign({},e),s=[],n=[],a=t._pointLabels.length,o=t.options.pointLabels,r=o.centerPointLabels?ai/a:0;for(let l=0;le.r&&(r=(s.end-e.r)/a,t.r=Math.max(t.r,e.r+r)),n.starte.b&&(l=(n.end-e.b)/o,t.b=Math.max(t.b,e.b+l))}function Yh(t,e,i){const s=t.drawingArea,{extra:n,additionalAngle:a,padding:o,size:r}=i,l=t.getPointPosition(e,s+n+o,a),h=Math.round(wi(Ai(l.angle+ci))),c=Zh(l.y,r.h,h),d=Gh(h),u=Jh(l.x,r.w,d);return{visible:!0,x:l.x,y:c,textAlign:d,left:u,top:c,right:u+r.w,bottom:c+r.h}}function Kh(t,e){if(!e)return!0;const{left:i,top:s,right:n,bottom:a}=t,o=Cs({x:i,y:s},e)||Cs({x:i,y:a},e)||Cs({x:n,y:s},e)||Cs({x:n,y:a},e);return!o}function Qh(t,e,i){const s=[],n=t._pointLabels.length,a=t.options,{centerPointLabels:o,display:r}=a.pointLabels,l={extra:jh(a)/2,additionalAngle:o?ai/n:0};let h;for(let c=0;c270||i<90)&&(t-=e),t}function tc(t,e,i){const{left:s,top:n,right:a,bottom:o}=i,{backdropColor:r}=e;if(!Ve(r)){const i=Ns(e.borderRadius),l=js(e.backdropPadding);t.fillStyle=r;const h=s-l.left,c=n-l.top,d=a-s+l.width,u=o-n+l.height;Object.values(i).some(t=>0!==t)?(t.beginPath(),Es(t,{x:h,y:c,w:d,h:u,radius:i}),t.fill()):t.fillRect(h,c,d,u)}}function ec(t,e){const{ctx:i,options:{pointLabels:s}}=t;for(let n=e-1;n>=0;n--){const e=t._pointLabelItems[n];if(!e.visible)continue;const a=s.setContext(t.getPointLabelContext(n));tc(i,a,e);const o=$s(a.font),{x:r,y:l,textAlign:h}=e;Is(i,t._pointLabels[n],r,l+o.lineHeight/2,o,{color:a.color,textAlign:h,textBaseline:"middle"})}}function ic(t,e,i,s){const{ctx:n}=t;if(i)n.arc(t.xCenter,t.yCenter,e,0,oi);else{let i=t.getPointPosition(0,e);n.moveTo(i.x,i.y);for(let a=1;a{const i=Ue(this.options.pointLabels.callback,[t,e],this);return i||0===i?i:""}).filter((t,e)=>this.chart.getDataVisibility(e))}fit(){const t=this.options;t.display&&t.pointLabels.display?qh(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(t,e,i,s){this.xCenter+=Math.floor((t-e)/2),this.yCenter+=Math.floor((i-s)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(t,e,i,s))}getIndexAngle(t){const e=oi/(this._pointLabels.length||1),i=this.options.startAngle||0;return Ai(t*e+ki(i))}getDistanceFromCenterForValue(t){if(Ve(t))return NaN;const e=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-t)*e:(t-this.min)*e}getValueForDistanceFromCenter(t){if(Ve(t))return NaN;const e=t/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-e:this.min+e}getPointLabelContext(t){const e=this._pointLabels||[];if(t>=0&&t{if(0!==e||0===e&&this.min<0){r=this.getDistanceFromCenterForValue(t.value);const i=this.getContext(e),o=s.setContext(i),l=n.setContext(i);sc(this,o,r,a,l)}}),i.display){for(t.save(),o=a-1;o>=0;o--){const s=i.setContext(this.getPointLabelContext(o)),{color:n,lineWidth:a}=s;a&&n&&(t.lineWidth=a,t.strokeStyle=n,t.setLineDash(s.borderDash),t.lineDashOffset=s.borderDashOffset,r=this.getDistanceFromCenterForValue(e.reverse?this.min:this.max),l=this.getPointPosition(o,r),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(l.x,l.y),t.stroke())}t.restore()}}drawBorder(){}drawLabels(){const t=this.ctx,e=this.options,i=e.ticks;if(!i.display)return;const s=this.getIndexAngle(0);let n,a;t.save(),t.translate(this.xCenter,this.yCenter),t.rotate(s),t.textAlign="center",t.textBaseline="middle",this.ticks.forEach((s,o)=>{if(0===o&&this.min>=0&&!e.reverse)return;const r=i.setContext(this.getContext(o)),l=$s(r.font);if(n=this.getDistanceFromCenterForValue(this.ticks[o].value),r.showLabelBackdrop){t.font=l.string,a=t.measureText(s.label).width,t.fillStyle=r.backdropColor;const e=js(r.backdropPadding);t.fillRect(-a/2-e.left,-n-l.size/2-e.top,a+e.width,l.size+e.height)}Is(t,s.label,0,-n,l,{color:r.color,strokeColor:r.textStrokeColor,strokeWidth:r.textStrokeWidth})}),t.restore()}drawTitle(){}}(0,zt.A)(ac,"id","radialLinear"),(0,zt.A)(ac,"defaults",{display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:ds.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback(t){return t},padding:5,centerPointLabels:!1}}),(0,zt.A)(ac,"defaultRoutes",{"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"}),(0,zt.A)(ac,"descriptors",{angleLines:{_fallback:"grid"}});const oc={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},rc=Object.keys(oc);function lc(t,e){return t-e}function hc(t,e){if(Ve(e))return null;const i=t._adapter,{parser:s,round:n,isoWeekday:a}=t._parseOpts;let o=e;return"function"===typeof s&&(o=s(o)),Oe(o)||(o="string"===typeof s?i.parse(o,s):i.parse(o)),null===o?null:(n&&(o="week"!==n||!yi(a)&&!0!==a?i.startOf(o,n):i.startOf(o,"isoWeek",a)),+o)}function cc(t,e,i,s){const n=rc.length;for(let a=rc.indexOf(t);a=rc.indexOf(i);a--){const i=rc[a];if(oc[i].common&&t._adapter.diff(n,s,i)>=e-1)return i}return rc[i?rc.indexOf(i):0]}function uc(t){for(let e=rc.indexOf(t)+1,i=rc.length;e=e?i[s]:i[n];t[a]=!0}}else t[e]=!0}function pc(t,e,i,s){const n=t._adapter,a=+n.startOf(e[0].value,s),o=e[e.length-1].value;let r,l;for(r=a;r<=o;r=+n.add(r,1,s))l=i[r],l>=0&&(e[l].major=!0);return e}function fc(t,e,i){const s=[],n={},a=e.length;let o,r;for(o=0;o+t.value))}initOffsets(t=[]){let e,i,s=0,n=0;this.options.offset&&t.length&&(e=this.getDecimalForValue(t[0]),s=1===t.length?1-e:(this.getDecimalForValue(t[1])-e)/2,i=this.getDecimalForValue(t[t.length-1]),n=1===t.length?i:(i-this.getDecimalForValue(t[t.length-2]))/2);const a=t.length<3?.5:.25;s=Ti(s,0,a),n=Ti(n,0,a),this._offsets={start:s,end:n,factor:1/(s+1+n)}}_generate(){const t=this._adapter,e=this.min,i=this.max,s=this.options,n=s.time,a=n.unit||cc(n.minUnit,e,i,this._getLabelCapacity(e)),o=We(s.ticks.stepSize,1),r="week"===a&&n.isoWeekday,l=yi(r)||!0===r,h={};let c,d,u=e;if(l&&(u=+t.startOf(u,"isoWeek",r)),u=+t.startOf(u,l?"day":a),t.diff(i,e,a)>1e5*o)throw new Error(e+" and "+i+" are too far apart with stepSize of "+o+" "+a);const g="data"===s.ticks.source&&this.getDataTimestamps();for(c=u,d=0;c+t)}getLabelForValue(t){const e=this._adapter,i=this.options.time;return i.tooltipFormat?e.format(t,i.tooltipFormat):e.format(t,i.displayFormats.datetime)}format(t,e){const i=this.options,s=i.time.displayFormats,n=this._unit,a=e||s[n];return this._adapter.format(t,a)}_tickFormatFunction(t,e,i,s){const n=this.options,a=n.ticks.callback;if(a)return Ue(a,[t,e,i],this);const o=n.time.displayFormats,r=this._unit,l=this._majorUnit,h=r&&o[r],c=l&&o[l],d=i[e],u=l&&c&&d&&d.major;return this._adapter.format(t,s||(u?c:h))}generateTickLabels(t){let e,i,s;for(e=0,i=t.length;e0?o:1}getDataTimestamps(){let t,e,i=this._cache.data||[];if(i.length)return i;const s=this.getMatchingVisibleMetas();if(this._normalized&&s.length)return this._cache.data=s[0].controller.getAllParsedValues(this);for(t=0,e=s.length;t=t[r].pos&&e<=t[l].pos&&({lo:r,hi:l}=Ii(t,"pos",e)),({pos:s,time:a}=t[r]),({pos:n,time:o}=t[l])):(e>=t[r].time&&e<=t[l].time&&({lo:r,hi:l}=Ii(t,"time",e)),({time:s,pos:a}=t[r]),({time:n,pos:o}=t[l]));const h=n-s;return h?a+(o-a)*(e-s)/h:a}(0,zt.A)(mc,"id","time"),(0,zt.A)(mc,"defaults",{bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{source:"auto",callback:!1,major:{enabled:!1}}});class xc extends mc{constructor(t){super(t),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){const t=this._getTimestampsForTable(),e=this._table=this.buildLookupTable(t);this._minPos=bc(e,this.min),this._tableRange=bc(e,this.max)-this._minPos,super.initOffsets(t)}buildLookupTable(t){const{min:e,max:i}=this,s=[],n=[];let a,o,r,l,h;for(a=0,o=t.length;a=e&&l<=i&&s.push(l);if(s.length<2)return[{time:e,pos:0},{time:i,pos:1}];for(a=0,o=s.length;at-e)}_getTimestampsForTable(){let t=this._cache.all||[];if(t.length)return t;const e=this.getDataTimestamps(),i=this.getLabelTimestamps();return t=e.length&&i.length?this.normalize(e.concat(i)):e.length?e:i,t=this._cache.all=t,t}getDecimalForValue(t){return(bc(this._table,t)-this._minPos)/this._tableRange}getValueForPixel(t){const e=this._offsets,i=this.getDecimalForPixel(t)/e.factor-e.end;return bc(this._table,i*this._tableRange+this._minPos,!0)}}(0,zt.A)(xc,"id","timeseries"),(0,zt.A)(xc,"defaults",mc.defaults);var yc=i(144);const _c={data:{type:Object,required:!0},options:{type:Object,default:()=>({})},plugins:{type:Array,default:()=>[]},datasetIdKey:{type:String,default:"label"},updateMode:{type:String,default:void 0}},vc={ariaLabel:{type:String},ariaDescribedby:{type:String}},kc={type:{type:String,required:!0},destroyDelay:{type:Number,default:0},..._c,...vc},wc="2"===s.rE[0]?(t,e)=>Object.assign(t,{attrs:e}):(t,e)=>Object.assign(t,e);function Sc(t){return(0,yc.ju)(t)?(0,yc.ux)(t):t}function Mc(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t;return(0,yc.ju)(e)?new Proxy(t,{}):t}function Cc(t,e){const i=t.options;i&&e&&Object.assign(i,e)}function Fc(t,e){t.labels=e}function Ac(t,e,i){const s=[];t.datasets=e.map(e=>{const n=t.datasets.find(t=>t[i]===e[i]);return n&&e.data&&!s.includes(n)?(s.push(n),Object.assign(n,e),n):{...e}})}function Pc(t,e){const i={labels:[],datasets:[]};return Fc(i,t.labels),Ac(i,t.datasets,e),i}const Tc=(0,s.pM)({props:kc,setup(t,e){let{expose:i,slots:n}=e;const a=(0,yc.KR)(null),o=(0,yc.IJ)(null);i({chart:o});const r=()=>{if(!a.value)return;const{type:e,data:i,options:s,plugins:n,datasetIdKey:r}=t,l=Pc(i,r),h=Mc(l,i);o.value=new ml(a.value,{type:e,data:h,options:{...s},plugins:n})},l=()=>{const e=(0,yc.ux)(o.value);e&&(t.destroyDelay>0?setTimeout(()=>{e.destroy(),o.value=null},t.destroyDelay):(e.destroy(),o.value=null))},h=e=>{e.update(t.updateMode)};return(0,s.sV)(r),(0,s.hi)(l),(0,s.wB)([()=>t.options,()=>t.data],(e,i)=>{let[n,a]=e,[r,l]=i;const c=(0,yc.ux)(o.value);if(!c)return;let d=!1;if(n){const t=Sc(n),e=Sc(r);t&&t!==e&&(Cc(c,t),d=!0)}if(a){const e=Sc(a.labels),i=Sc(l.labels),s=Sc(a.datasets),n=Sc(l.datasets);e!==i&&(Fc(c.config.data,e),d=!0),s&&s!==n&&(Ac(c.config.data,s,t.datasetIdKey),d=!0)}d&&(0,s.dY)(()=>{h(c)})},{deep:!0}),()=>(0,s.h)("canvas",{role:"img","aria-label":t.ariaLabel,"aria-describedby":t.ariaDescribedby,ref:a},[(0,s.h)("p",{},[n.default?n.default():""])])}});function Lc(t,e){return ml.register(e),(0,s.pM)({props:_c,setup(e,i){let{expose:n}=i;const a=(0,yc.IJ)(null),o=t=>{a.value=t?.chart};return n({chart:a}),()=>(0,s.h)(Tc,wc({ref:o},{type:t,...e}))}})}const Dc=Lc("doughnut",io);ml.register(Cl,Ch,oh);var Vc={name:"SysCogStatus",components:{Doughnut:Dc},data(){return{loading:!1,rebuilding:!1,backing:!1,restoring:!1,indexInfo:{},version:Wt.rE,loadErrors:{newest:!1,oldest:!1},channelColors:["#8B5CF6","#EC4899","#06B6D4","#10B981","#F59E0B","#EF4444","#6366F1","#84CC16"],typeColors:["#10B981","#3B82F6","#F59E0B","#EF4444","#8B5CF6","#EC4899","#06B6D4","#84CC16"]}},computed:{channelChartData(){const t=this.indexInfo.channelStats||{};return{labels:Object.keys(t),datasets:[{data:Object.values(t),backgroundColor:this.channelColors.slice(0,Object.keys(t).length),borderWidth:0}]}},typeChartData(){const t=this.indexInfo.typeStats||{};return{labels:Object.keys(t).map(t=>t||"未知类型"),datasets:[{data:Object.values(t),backgroundColor:this.typeColors.slice(0,Object.keys(t).length),borderWidth:0}]}},chartOptions(){return{responsive:!0,maintainAspectRatio:!0,cutout:"65%",plugins:{legend:{display:!1},tooltip:{backgroundColor:"rgba(0, 0, 0, 0.8)",titleColor:"#fff",bodyColor:"#fff",padding:12,cornerRadius:8,displayColors:!0,callbacks:{label:t=>{const e=t.raw,i=t.dataset.data.reduce((t,e)=>t+e,0),s=(e/i*100).toFixed(1);return` ${e.toLocaleString()} (${s}%)`}}}},animation:{animateRotate:!0,animateScale:!0}}}},mounted(){this.fetchIndexInfo()},methods:{getChartColor(t){return this.channelColors[t%this.channelColors.length]},getTypeChartColor(t){return this.typeColors[t%this.typeColors.length]},async fetchIndexInfo(){this.loading=!0;try{const t=await(0,Rt.A)("/api/manage/list?action=info",{method:"GET"});if(!t.ok)throw new Error("API请求失败");{const e=await t.json();this.indexInfo=e}}catch(t){console.error("获取索引信息失败:",t),this.$message.error("获取索引信息失败")}finally{this.loading=!1}},async rebuildIndex(){this.rebuilding=!0;try{const t=await(0,Rt.A)("/api/manage/list?action=rebuild",{method:"GET"});if(!t.ok)throw new Error("API请求失败");this.$message.success("索引重建已启动,请稍后刷新查看最新状态"),setTimeout(()=>{this.fetchIndexInfo()},3e3)}catch(t){console.error("重建索引失败:",t),this.$message.error("重建索引失败")}finally{this.rebuilding=!1}},async backupData(){this.backing=!0;try{const t=await(0,Rt.A)("/api/manage/sysConfig/backup?action=backup",{method:"GET"});if(!t.ok){const e=await t.json();throw new Error(e.error||"API请求失败")}{const e=await t.blob(),i=window.URL.createObjectURL(e),s=document.createElement("a");s.href=i,s.download=`imgbed_backup_${(new Date).toISOString().split("T")[0]}.json`,document.body.appendChild(s),s.click(),document.body.removeChild(s),window.URL.revokeObjectURL(i),this.$message.success("备份文件已下载")}}catch(t){console.error("备份数据失败:",t),this.$message.error("备份数据失败: "+t.message)}finally{this.backing=!1}},selectRestoreFile(){this.restoring||this.$refs.fileInput.click()},async handleFileSelect(t){const e=t.target.files[0];if(e)if(e.name.endsWith(".json")){try{await this.$confirm("恢复操作将覆盖现有的文件元数据和系统设置,此操作不可逆。确定要继续吗?","确认恢复",{confirmButtonText:"确定恢复",cancelButtonText:"取消",type:"warning"}),await this.restoreData(e)}catch(i){"cancel"!==i&&console.error("确认恢复失败:",i)}t.target.value=""}else this.$message.error("请选择JSON格式的备份文件")},async restoreData(t){this.restoring=!0;try{const e=await(0,Rt.A)("/api/manage/sysConfig/backup?action=restore",{method:"POST",headers:{"Content-Type":"application/json"},body:await t.text()});if(!e.ok){const t=await e.json();throw new Error(t.error||"API请求失败")}{const t=await e.json();this.$message.success(`恢复完成!已恢复 ${t.stats.restoredFiles} 个文件和 ${t.stats.restoredSettings} 个设置项`),setTimeout(()=>{this.fetchIndexInfo()},1e3)}}catch(e){console.error("恢复数据失败:",e),this.$message.error("恢复数据失败: "+e.message)}finally{this.restoring=!1}},formatTime(t){if(!t)return"未知";const e=new Date(t);return e.toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"})},getPercentage(t,e){return e&&0!==e?Math.round(t/e*100):0},getTimeAgo(t){if(!t)return"";const e=Date.now(),i=e-t,s=Math.floor(i/6e4),n=Math.floor(i/36e5),a=Math.floor(i/864e5);return a>0?`${a}天前`:n>0?`${n}小时前`:s>0?`${s}分钟前`:"刚刚"},handleImageError(t){this.loadErrors[t]=!0},isValidPreview(t,e){return!this.loadErrors[t]&&(!!e?.metadata?.FileType&&(e.metadata.FileType.includes("image")||e.metadata.FileType.includes("video")))},openReleases(){window.open("https://github.com/MarSeventh/CloudFlare-ImgBed/releases","_blank")},isImageFile(t){if(!t)return!1;if(t.metadata?.FileType?.includes("image"))return!0;const e=t.metadata?.FileName||t.id||"",i=e.substring(e.lastIndexOf(".")+1).toLowerCase(),s=["jpg","jpeg","png","gif","bmp","webp","svg","ico","tiff","tif","avif","heic","heif"];return s.includes(i)},isVideoFile(t){if(!t)return!1;if(t.metadata?.FileType?.includes("video"))return!0;const e=t.metadata?.FileName||t.id||"",i=e.substring(e.lastIndexOf(".")+1).toLowerCase(),s=["mp4","webm","ogg","avi","mov","flv","wmv","mkv","m4v","3gp","mpeg","mpg"];return s.includes(i)}}};const Ic=(0,c.A)(Vc,[["render",Ot],["__scopeId","data-v-54756a6a"]]);var Ec=Ic,Oc=i(9655),Rc=(i(2893),i(1418)),Wc=(i(333),i(9623)),zc=(i(6711),i(2006)),Bc=i(5558),Uc=(i(8075),i(6810));i(4396),i(4885);const Nc={class:"upload-settings"},jc={class:"upload-channel"},$c={class:"first-title"},Hc={class:"channel-settings"},qc={class:"second-title"},Xc={key:0},Yc={key:1},Kc={class:"quota-status"},Qc={key:2},Gc={class:"quota-status"},Jc={key:3},Zc={class:"discord-limit-tip"},td={class:"discord-rate-limit-tip"},ed={key:4},id={class:"huggingface-tip"},sd={class:"actions"};function nd(t,e,i,a,o,r){const l=(0,s.g2)("font-awesome-icon"),h=p.R7,c=Uc.ll,d=Uc.MQ,u=Bc.qi,g=zc.xE,f=zc.US,m=Wc.WK,b=k.S2,x=Rc.lq,y=Oc.ve,v=_.A;return(0,s.bo)(((0,s.uX)(),(0,s.CE)("div",Nc,[(0,s.Lk)("div",jc,[(0,s.Lk)("h3",$c,[e[5]||(e[5]=(0,s.eW)("上传渠道 ",-1)),(0,s.bF)(h,{content:"设置每类上传渠道的详细配置
点击“保存设置”会同时保存对每类配置的修改",placement:"right","raw-content":""},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),(0,s.bF)(d,{modelValue:o.activeChannel,"onUpdate:modelValue":e[0]||(e[0]=t=>o.activeChannel=t)},{default:(0,s.k6)(()=>[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(o.channels,t=>((0,s.uX)(),(0,s.Wv)(c,{key:t.value,label:t.value},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(t.label),1)]),_:2},1032,["label"]))),128))]),_:1},8,["modelValue"])]),(0,s.Lk)("div",Hc,[(0,s.Lk)("h4",qc,[(0,s.eW)((0,n.v_)(r.activeChannelLabel)+" 设置 ",1),"telegram"===o.activeChannel?((0,s.uX)(),(0,s.Wv)(h,{key:0,content:"为保证兼容性,v2版本前设置的 Telegram 相关环境变量请保留",placement:"right"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})):(0,s.Q3)("",!0)]),"telegram"===o.activeChannel?((0,s.uX)(),(0,s.CE)("div",Xc,[(0,s.bF)(f,{model:o.telegramSettings,"label-position":"top",class:"channel-form"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{label:"负载均衡"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:o.telegramSettings.loadBalance.enabled,"onUpdate:modelValue":e[1]||(e[1]=t=>o.telegramSettings.loadBalance.enabled=t)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"]),((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(o.telegramSettings.channels,(t,e)=>((0,s.uX)(),(0,s.Wv)(f,{key:e,model:t,"label-position":"top",rules:o.tgRules,ref_for:!0,ref:"tgChannelForm",class:"channel-form"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{label:"渠道名",prop:"name"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.name,"onUpdate:modelValue":e=>t.name=e,disabled:t.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"启用渠道",prop:"enabled"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:t.enabled,"onUpdate:modelValue":e=>t.enabled=e},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),(0,s.bF)(g,{label:"Bot Token",prop:"botToken"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.botToken,"onUpdate:modelValue":e=>t.botToken=e,disabled:t.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"Chat ID",prop:"chatId"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.chatId,"onUpdate:modelValue":e=>t.chatId=e,disabled:t.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,null,{default:(0,s.k6)(()=>[(0,s.bF)(b,{type:"danger",onClick:t=>r.deleteChannel(e),size:"small",disabled:t.fixed},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"trash-alt"})]),_:1},8,["onClick","disabled"])]),_:2},1024)]),_:2},1032,["model","rules"]))),128))])):(0,s.Q3)("",!0),"cfr2"===o.activeChannel?((0,s.uX)(),(0,s.CE)("div",Yc,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(o.cfr2Settings.channels,(t,i)=>((0,s.uX)(),(0,s.Wv)(f,{model:t,"label-position":"top",class:"channel-form"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{label:"渠道名"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.name,"onUpdate:modelValue":e=>t.name=e,disabled:t.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"启用渠道"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:t.enabled,"onUpdate:modelValue":e=>t.enabled=e},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),(0,s.bF)(g,null,{label:(0,s.k6)(()=>[e[6]||(e[6]=(0,s.eW)(" 公开访问链接 ",-1)),(0,s.bF)(h,{content:"若启用图像审查,请设置该项",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.publicUrl,"onUpdate:modelValue":e=>t.publicUrl=e},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),(0,s.bF)(g,null,{label:(0,s.k6)(()=>[e[7]||(e[7]=(0,s.eW)(" 容量限制 ",-1)),(0,s.bF)(h,{content:"启用后,当存储容量达到阈值时,该渠道将自动停止接收新文件,上传会自动切换到其他可用渠道",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:t.quota.enabled,"onUpdate:modelValue":e=>t.quota.enabled=e,onChange:e=>r.onQuotaEnabledChange(e,t)},null,8,["modelValue","onUpdate:modelValue","onChange"])]),_:2},1024),t.quota.enabled?((0,s.uX)(),(0,s.Wv)(g,{key:0,label:"容量上限 (GB)"},{default:(0,s.k6)(()=>[(0,s.bF)(x,{modelValue:t.quota.limitGB,"onUpdate:modelValue":e=>t.quota.limitGB=e,min:.1,step:1,precision:1},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024)):(0,s.Q3)("",!0),t.quota.enabled?((0,s.uX)(),(0,s.Wv)(g,{key:1},{label:(0,s.k6)(()=>[e[8]||(e[8]=(0,s.eW)(" 阈值 (%) ",-1)),(0,s.bF)(h,{content:"当已用容量达到此百分比时停止写入,默认95%",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(x,{modelValue:t.quota.threshold,"onUpdate:modelValue":e=>t.quota.threshold=e,min:50,max:100,step:5},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024)):(0,s.Q3)("",!0),t.quota.enabled&&t.name?((0,s.uX)(),(0,s.Wv)(g,{key:2},{label:(0,s.k6)(()=>[e[9]||(e[9]=(0,s.eW)(" 当前用量 ",-1)),(0,s.bF)(b,{link:"",type:"primary",onClick:r.refreshQuota,loading:o.quotaLoading,style:{"margin-left":"8px"}},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"sync-alt"})]),_:1},8,["onClick","loading"])]),default:(0,s.k6)(()=>[(0,s.Lk)("div",Kc,[(0,s.bF)(y,{percentage:r.getQuotaPercentage(t),status:r.getQuotaStatus(t),"stroke-width":20,"text-inside":!0,format:()=>r.getQuotaText(t)},null,8,["percentage","status","format"]),(0,s.Lk)("div",{class:(0,n.C4)(["quota-info",{"quota-warning":r.isQuotaExceeded(t)}])},(0,n.v_)(r.getQuotaStatusText(t)),3)])]),_:2},1024)):(0,s.Q3)("",!0)]),_:2},1032,["model"]))),256))])):(0,s.Q3)("",!0),"s3"===o.activeChannel?((0,s.uX)(),(0,s.CE)("div",Qc,[(0,s.bF)(f,{model:o.s3Settings,"label-position":"top",class:"channel-form"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{label:"负载均衡"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:o.s3Settings.loadBalance.enabled,"onUpdate:modelValue":e[2]||(e[2]=t=>o.s3Settings.loadBalance.enabled=t)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"]),((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(o.s3Settings.channels,(t,i)=>((0,s.uX)(),(0,s.Wv)(f,{model:t,"label-position":"top",rules:o.s3Rules,ref_for:!0,ref:"s3ChannelForm",class:"channel-form"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{label:"渠道名",prop:"name"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.name,"onUpdate:modelValue":e=>t.name=e,disabled:t.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"启用渠道",prop:"enabled"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:t.enabled,"onUpdate:modelValue":e=>t.enabled=e},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),(0,s.bF)(g,{prop:"endpoint"},{label:(0,s.k6)(()=>[e[10]||(e[10]=(0,s.eW)(" Endpoint ",-1)),(0,s.bF)(h,{content:"服务提供商 Endpoint,例如 https://s3.us-east-005.backblazeb2.com",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.endpoint,"onUpdate:modelValue":e=>t.endpoint=e,disabled:t.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"路径风格",prop:"pathStyle"},{label:(0,s.k6)(()=>[e[11]||(e[11]=(0,s.eW)(" 路径风格 ",-1)),(0,s.bF)(h,{content:"S3 路径风格/虚拟主机风格,使用 OpenList 作为 S3 提供者时需打开此开关
路径风格:https://s3.example.com/下方存储桶名称/文件路径
虚拟主机风格:https://下方存储桶名称.s3.example.com/文件路径",placement:"top","raw-content":""},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:t.pathStyle,"onUpdate:modelValue":e=>t.pathStyle=e,disabled:t.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"存储桶名称",prop:"bucketName"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.bucketName,"onUpdate:modelValue":e=>t.bucketName=e,disabled:t.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"存储桶区域",prop:"region"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.region,"onUpdate:modelValue":e=>t.region=e,placeholder:"默认填写 auto 即可",disabled:t.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"访问密钥 ID",prop:"accessKeyId"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.accessKeyId,"onUpdate:modelValue":e=>t.accessKeyId=e,disabled:t.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"机密访问密钥",prop:"secretAccessKey"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.secretAccessKey,"onUpdate:modelValue":e=>t.secretAccessKey=e,disabled:t.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,null,{label:(0,s.k6)(()=>[e[12]||(e[12]=(0,s.eW)(" 容量限制 ",-1)),(0,s.bF)(h,{content:"启用后,当存储容量达到阈值时,该渠道将自动停止接收新文件,上传会自动切换到其他可用渠道",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:t.quota.enabled,"onUpdate:modelValue":e=>t.quota.enabled=e,onChange:e=>r.onQuotaEnabledChange(e,t)},null,8,["modelValue","onUpdate:modelValue","onChange"])]),_:2},1024),t.quota.enabled?((0,s.uX)(),(0,s.Wv)(g,{key:0,label:"容量上限 (GB)"},{default:(0,s.k6)(()=>[(0,s.bF)(x,{modelValue:t.quota.limitGB,"onUpdate:modelValue":e=>t.quota.limitGB=e,min:.1,step:1,precision:1},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024)):(0,s.Q3)("",!0),t.quota.enabled?((0,s.uX)(),(0,s.Wv)(g,{key:1},{label:(0,s.k6)(()=>[e[13]||(e[13]=(0,s.eW)(" 阈值 (%) ",-1)),(0,s.bF)(h,{content:"当已用容量达到此百分比时停止写入,默认95%",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(x,{modelValue:t.quota.threshold,"onUpdate:modelValue":e=>t.quota.threshold=e,min:50,max:100,step:5},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024)):(0,s.Q3)("",!0),t.quota.enabled&&t.name?((0,s.uX)(),(0,s.Wv)(g,{key:2},{label:(0,s.k6)(()=>[e[14]||(e[14]=(0,s.eW)(" 当前用量 ",-1)),(0,s.bF)(b,{link:"",type:"primary",onClick:r.refreshQuota,loading:o.quotaLoading,style:{"margin-left":"8px"}},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"sync-alt"})]),_:1},8,["onClick","loading"])]),default:(0,s.k6)(()=>[(0,s.Lk)("div",Gc,[(0,s.bF)(y,{percentage:r.getQuotaPercentage(t),status:r.getQuotaStatus(t),"stroke-width":20,"text-inside":!0,format:()=>r.getQuotaText(t)},null,8,["percentage","status","format"]),(0,s.Lk)("div",{class:(0,n.C4)(["quota-info",{"quota-warning":r.isQuotaExceeded(t)}])},(0,n.v_)(r.getQuotaStatusText(t)),3)])]),_:2},1024)):(0,s.Q3)("",!0),(0,s.bF)(g,null,{default:(0,s.k6)(()=>[(0,s.bF)(b,{type:"danger",onClick:t=>r.deleteChannel(i),size:"small",disabled:t.fixed},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"trash-alt"})]),_:1},8,["onClick","disabled"])]),_:2},1024)]),_:2},1032,["model","rules"]))),256))])):(0,s.Q3)("",!0),"discord"===o.activeChannel?((0,s.uX)(),(0,s.CE)("div",Jc,[(0,s.bF)(f,{model:o.discordSettings,"label-position":"top",class:"channel-form"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{label:"负载均衡"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:o.discordSettings.loadBalance.enabled,"onUpdate:modelValue":e[3]||(e[3]=t=>o.discordSettings.loadBalance.enabled=t)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"]),((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(o.discordSettings.channels,(t,i)=>((0,s.uX)(),(0,s.Wv)(f,{key:i,model:t,"label-position":"top",rules:o.discordRules,ref_for:!0,ref:"discordChannelForm",class:"channel-form"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{label:"渠道名",prop:"name"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.name,"onUpdate:modelValue":e=>t.name=e,disabled:t.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"启用渠道",prop:"enabled"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:t.enabled,"onUpdate:modelValue":e=>t.enabled=e},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),(0,s.bF)(g,{label:"Bot Token",prop:"botToken"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.botToken,"onUpdate:modelValue":e=>t.botToken=e,disabled:t.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"Channel ID",prop:"channelId"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.channelId,"onUpdate:modelValue":e=>t.channelId=e,disabled:t.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,null,{label:(0,s.k6)(()=>[e[15]||(e[15]=(0,s.eW)(" 代理域名 ",-1)),(0,s.bF)(h,{content:"可选,用于国内访问 Discord CDN,填写代理域名(不含 https://)",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.proxyUrl,"onUpdate:modelValue":e=>t.proxyUrl=e,placeholder:"例如: your-proxy.example.com"},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),(0,s.bF)(g,null,{label:(0,s.k6)(()=>[e[16]||(e[16]=(0,s.eW)(" Nitro 会员 ",-1)),(0,s.bF)(h,{content:"开启后单文件限制提升至 25MB,关闭则为 10MB",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:t.isNitro,"onUpdate:modelValue":e=>t.isNitro=e},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),(0,s.bF)(g,null,{default:(0,s.k6)(()=>[(0,s.Lk)("div",Zc,[(0,s.bF)(l,{icon:"info-circle",style:{"margin-right":"5px"}}),(0,s.eW)(" "+(0,n.v_)(t.isNitro?"Nitro 会员单文件限制 25MB":"Discord 免费用户单文件限制 10MB"),1)])]),_:2},1024),(0,s.bF)(g,null,{default:(0,s.k6)(()=>[(0,s.Lk)("div",td,[(0,s.bF)(l,{icon:"exclamation-triangle",style:{"margin-right":"5px"}}),e[17]||(e[17]=(0,s.eW)(" Discord 有接口频率限制,不建议将其用作大规模并发场景 ",-1))])]),_:1}),(0,s.bF)(g,null,{default:(0,s.k6)(()=>[(0,s.bF)(b,{type:"danger",onClick:t=>r.deleteChannel(i),size:"small",disabled:t.fixed},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"trash-alt"})]),_:1},8,["onClick","disabled"])]),_:2},1024)]),_:2},1032,["model","rules"]))),128))])):(0,s.Q3)("",!0),"huggingface"===o.activeChannel?((0,s.uX)(),(0,s.CE)("div",ed,[(0,s.bF)(f,{model:o.huggingfaceSettings,"label-position":"top",class:"channel-form"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{label:"负载均衡"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:o.huggingfaceSettings.loadBalance.enabled,"onUpdate:modelValue":e[4]||(e[4]=t=>o.huggingfaceSettings.loadBalance.enabled=t)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"]),((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(o.huggingfaceSettings.channels,(t,i)=>((0,s.uX)(),(0,s.Wv)(f,{key:i,model:t,"label-position":"top",rules:o.huggingfaceRules,ref_for:!0,ref:"huggingfaceChannelForm",class:"channel-form"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{label:"渠道名",prop:"name"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.name,"onUpdate:modelValue":e=>t.name=e,disabled:t.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"启用渠道",prop:"enabled"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:t.enabled,"onUpdate:modelValue":e=>t.enabled=e},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),(0,s.bF)(g,{prop:"repo"},{label:(0,s.k6)(()=>[e[18]||(e[18]=(0,s.eW)(" 仓库名 ",-1)),(0,s.bF)(h,{content:"格式:用户名/仓库名,例如 username/my-images",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.repo,"onUpdate:modelValue":e=>t.repo=e,disabled:t.fixed,placeholder:"username/repo-name"},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,{label:"Access Token",prop:"token"},{default:(0,s.k6)(()=>[(0,s.bF)(m,{modelValue:t.token,"onUpdate:modelValue":e=>t.token=e,disabled:t.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:2},1024),(0,s.bF)(g,null,{label:(0,s.k6)(()=>[e[19]||(e[19]=(0,s.eW)(" 私有仓库 ",-1)),(0,s.bF)(h,{content:"开启后仓库将设为私有,访问时需要通过服务器代理",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:t.isPrivate,"onUpdate:modelValue":e=>t.isPrivate=e},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024),(0,s.bF)(g,null,{default:(0,s.k6)(()=>[(0,s.Lk)("div",id,[(0,s.bF)(l,{icon:"info-circle",style:{"margin-right":"5px"}}),(0,s.eW)(" "+(0,n.v_)(t.isPrivate?"私有仓库限制 100GB,访问时服务器会代理请求":"公开仓库无容量限制,文件可直接访问"),1)])]),_:2},1024),(0,s.bF)(g,null,{default:(0,s.k6)(()=>[(0,s.bF)(b,{type:"danger",onClick:t=>r.deleteChannel(i),size:"small",disabled:t.fixed},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"trash-alt"})]),_:1},8,["onClick","disabled"])]),_:2},1024)]),_:2},1032,["model","rules"]))),128))])):(0,s.Q3)("",!0)]),(0,s.Lk)("div",sd,[(0,s.bF)(b,{type:"primary",onClick:r.addChannel},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"plus"})]),_:1},8,["onClick"]),(0,s.bF)(b,{type:"primary",onClick:r.saveSettings},{default:(0,s.k6)(()=>[...e[20]||(e[20]=[(0,s.eW)("保存设置",-1)])]),_:1},8,["onClick"])])])),[[v,o.loading]])}i(1148);var ad={data(){return{channels:[{value:"telegram",label:"Telegram"},{value:"cfr2",label:"CloudFlare R2"},{value:"s3",label:"S3"},{value:"discord",label:"Discord"},{value:"huggingface",label:"HuggingFace"}],activeChannel:"telegram",telegramSettings:{loadBalance:{},channels:[]},tgRules:{name:[{required:!0,message:"请输入渠道名",trigger:"blur"},{validator:(t,e,i)=>{const s=this.telegramSettings.channels.map(t=>t.name);if(s.filter(t=>t===e).length>1)i(new Error("渠道名不能重复"));else if("Telegram_env"===e){const t=this.telegramSettings.channels.find(t=>t.name===e).savePath;"environment variable"!==t?i(new Error("渠道名不能为保留值")):i()}else i()},trigger:"blur"}],botToken:[{required:!0,message:"请输入 Bot Token",trigger:"blur"}],chatId:[{required:!0,message:"请输入 Chat ID",trigger:"blur"}]},cfr2Settings:{channels:[]},s3Settings:{loadBalance:{},channels:[]},discordSettings:{loadBalance:{},channels:[]},huggingfaceSettings:{loadBalance:{},channels:[]},huggingfaceRules:{name:[{required:!0,message:"请输入渠道名",trigger:"blur"},{validator:(t,e,i)=>{const s=this.huggingfaceSettings.channels.map(t=>t.name);if(s.filter(t=>t===e).length>1)i(new Error("渠道名不能重复"));else if("HuggingFace_env"===e){const t=this.huggingfaceSettings.channels.find(t=>t.name===e).savePath;"environment variable"!==t?i(new Error("渠道名不能为保留值")):i()}else i()},trigger:"blur"}],token:[{required:!0,message:"请输入 Access Token",trigger:"blur"}],repo:[{required:!0,message:"请输入仓库名",trigger:"blur"}]},discordRules:{name:[{required:!0,message:"请输入渠道名",trigger:"blur"},{validator:(t,e,i)=>{const s=this.discordSettings.channels.map(t=>t.name);if(s.filter(t=>t===e).length>1)i(new Error("渠道名不能重复"));else if("Discord_env"===e){const t=this.discordSettings.channels.find(t=>t.name===e).savePath;"environment variable"!==t?i(new Error("渠道名不能为保留值")):i()}else i()},trigger:"blur"}],botToken:[{required:!0,message:"请输入 Bot Token",trigger:"blur"}],channelId:[{required:!0,message:"请输入 Channel ID",trigger:"blur"}]},quotaStats:{},quotaLoading:!1,s3Rules:{name:[{required:!0,message:"请输入渠道名",trigger:"blur"},{validator:(t,e,i)=>{const s=this.s3Settings.channels.map(t=>t.name);if(s.filter(t=>t===e).length>1)i(new Error("渠道名不能重复"));else if("S3_env"===e){const t=this.s3Settings.channels.find(t=>t.name===e).savePath;"environment variable"!==t?i(new Error("渠道名不能为保留值")):i()}else i()},trigger:"blur"}],endpoint:[{required:!0,message:"请输入 Endpoint",trigger:"blur"}],bucketName:[{required:!0,message:"请输入存储桶名称",trigger:"blur"}],region:[{required:!0,message:"请输入存储桶区域",trigger:"blur"}],accessKeyId:[{required:!0,message:"请输入访问密钥 ID",trigger:"blur"}],secretAccessKey:[{required:!0,message:"请输入机密访问密钥",trigger:"blur"}]},loading:!1}},computed:{activeChannelLabel(){const t=this.channels.find(t=>t.value===this.activeChannel);return t?t.label:""}},methods:{addChannel(){switch(this.activeChannel){case"telegram":this.telegramSettings.channels.push({id:this.telegramSettings.channels.length+1,name:"",type:"telegram",savePath:"database",botToken:"",chatId:"",enabled:!0,fixed:!1});break;case"cfr2":this.$message.error("R2渠道请通过绑定 R2 存储桶或通过 S3 渠道添加");break;case"s3":this.s3Settings.channels.push({id:this.s3Settings.channels.length+1,name:"",type:"s3",savePath:"database",accessKeyId:"",secretAccessKey:"",region:"",bucketName:"",endpoint:"",pathStyle:!1,enabled:!0,fixed:!1,quota:{enabled:!1,limitGB:10,threshold:95}});break;case"discord":this.discordSettings.channels.push({id:this.discordSettings.channels.length+1,name:"",type:"discord",savePath:"database",botToken:"",channelId:"",proxyUrl:"",isNitro:!1,enabled:!0,fixed:!1});break;case"huggingface":this.huggingfaceSettings.channels.push({id:this.huggingfaceSettings.channels.length+1,name:"",type:"huggingface",savePath:"database",token:"",repo:"",isPrivate:!1,enabled:!0,fixed:!1});break}},deleteChannel(t){switch(this.activeChannel){case"telegram":this.telegramSettings.channels.forEach((e,i)=>{i>t&&(e.id-=1)}),this.telegramSettings.channels.splice(t,1);break;case"cfr2":this.cfr2Settings.channels.forEach((e,i)=>{i>t&&(e.id-=1)}),this.cfr2Settings.channels.splice(t,1);break;case"s3":this.s3Settings.channels.forEach((e,i)=>{i>t&&(e.id-=1)}),this.s3Settings.channels.splice(t,1);break;case"discord":this.discordSettings.channels.forEach((e,i)=>{i>t&&(e.id-=1)}),this.discordSettings.channels.splice(t,1);break;case"huggingface":this.huggingfaceSettings.channels.forEach((e,i)=>{i>t&&(e.id-=1)}),this.huggingfaceSettings.channels.splice(t,1);break}},saveSettings(){let t=[];this.$refs.tgChannelForm&&this.$refs.tgChannelForm.forEach(e=>{t.push(new Promise(t=>{e.validate(e=>t(e))}))}),this.$refs.s3ChannelForm&&this.$refs.s3ChannelForm.forEach(e=>{t.push(new Promise(t=>{e.validate(e=>t(e))}))}),this.$refs.discordChannelForm&&this.$refs.discordChannelForm.forEach(e=>{t.push(new Promise(t=>{e.validate(e=>t(e))}))}),this.$refs.huggingfaceChannelForm&&this.$refs.huggingfaceChannelForm.forEach(e=>{t.push(new Promise(t=>{e.validate(e=>t(e))}))}),Promise.all(t).then(t=>{const e=t.every(t=>t);if(!e)return;const i={telegram:this.telegramSettings,cfr2:this.cfr2Settings,s3:this.s3Settings,discord:this.discordSettings,huggingface:this.huggingfaceSettings};(0,Rt.A)("/api/manage/sysConfig/upload",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)}).then(()=>{this.$message.success("设置已保存")})})},async refreshQuota(){this.quotaLoading=!0;try{const t=await(0,Rt.A)("/api/manage/quota",{method:"POST"}),e=await t.json();if(e.success)this.quotaStats=e.channelStats||{};else{const t=await(0,Rt.A)("/api/manage/quota"),e=await t.json();e.success&&(this.quotaStats=e.quotaStats||{})}}catch(t){console.error("Failed to refresh quota stats:",t)}finally{this.quotaLoading=!1}},async loadQuotaStats(){try{const t=await(0,Rt.A)("/api/manage/quota"),e=await t.json();e.success&&(this.quotaStats=e.quotaStats||{})}catch(t){console.error("Failed to load quota stats:",t)}},getChannelUsedGB(t){const e=this.quotaStats[t.name];return e?(e.usedMB||0)/1024:0},getQuotaPercentage(t){const e=this.getChannelUsedGB(t),i=t.quota?.limitGB||10,s=e/i*100;return Math.min(100,Math.round(10*s)/10)},getQuotaStatus(t){const e=this.getQuotaPercentage(t),i=t.quota?.threshold||95;return e>=i?"exception":e>=80?"warning":"success"},getQuotaText(t){const e=this.getChannelUsedGB(t),i=t.quota?.limitGB||10;return`${e.toFixed(2)} / ${i} GB`},isQuotaExceeded(t){const e=this.getQuotaPercentage(t),i=t.quota?.threshold||95;return e>=i},getQuotaStatusText(t){const e=this.getQuotaPercentage(t),i=t.quota?.threshold||95;return e>=i?`⚠️ 已达到容量阈值 (${i}%),渠道写入已暂停`:e>=80?"⚡ 容量使用较高,接近阈值":"✓ 容量正常"},async onQuotaEnabledChange(t,e){if(t&&e.name){const t=this.quotaStats[e.name];t||this.$confirm("首次启用容量限制需要统计现有文件容量,这可能需要一些时间。是否立即统计?","初始化容量统计",{confirmButtonText:"立即统计",cancelButtonText:"稍后手动统计",type:"info"}).then(async()=>{await this.recalculateQuota()}).catch(()=>{this.$message.info("您可以稍后点击刷新按钮手动统计")})}},async recalculateQuota(){this.quotaLoading=!0;try{this.$message.info("正在统计容量,请稍候...");const t=await(0,Rt.A)("/api/manage/quota",{method:"POST"}),e=await t.json();e.success?(this.quotaStats=e.channelStats||{},this.$message.success("容量统计完成")):this.$message.error("统计失败: "+(e.error||"未知错误"))}catch(t){console.error("Failed to recalculate quota:",t),this.$message.error("统计失败")}finally{this.quotaLoading=!1}}},mounted(){this.loading=!0,(0,Rt.A)("/api/manage/sysConfig/upload").then(t=>t.json()).then(t=>{this.telegramSettings=t.telegram,t.cfr2&&t.cfr2.channels&&(t.cfr2.channels=t.cfr2.channels.map(t=>({...t,quota:t.quota||{enabled:!1,limitGB:10,threshold:95}}))),this.cfr2Settings=t.cfr2,t.s3&&t.s3.channels&&(t.s3.channels=t.s3.channels.map(t=>({...t,quota:t.quota||{enabled:!1,limitGB:10,threshold:95}}))),this.s3Settings=t.s3,t.discord&&t.discord.channels&&(t.discord.channels=t.discord.channels.map(t=>({...t,proxyUrl:t.proxyUrl||""}))),this.discordSettings=t.discord||{loadBalance:{},channels:[]},t.huggingface&&t.huggingface.channels&&(t.huggingface.channels=t.huggingface.channels.map(t=>({...t,isPrivate:t.isPrivate||!1}))),this.huggingfaceSettings=t.huggingface||{loadBalance:{},channels:[]},this.loadQuotaStats()}).finally(()=>{this.loading=!1})}};const od=(0,c.A)(ad,[["render",nd],["__scopeId","data-v-70372bf9"]]);var rd=od,ld=i(9267),hd=(i(5616),i(850)),cd=(i(8736),i(6018)),dd=(i(6808),i(200),i(7138)),ud=(i(5802),i(2687)),gd=(i(8785),i(4752),i(5130));const pd={class:"security-settings"},fd={class:"first-settings"},md={class:"second-title token-title"},bd={class:"token-actions"},xd={class:"token-table-container"},yd={class:"table-cell-content"},_d={class:"table-cell-content"},vd={class:"token-display"},kd={class:"table-cell-content"},wd={class:"table-cell-content"},Sd={class:"table-cell-content action-buttons"},Md={class:"first-settings"},Cd={class:"second-title"},Fd={class:"first-settings"},Ad={class:"actions"},Pd={class:"dialog-footer"},Td={class:"dialog-footer"},Ld={class:"token-result"},Dd={style:{"margin-bottom":"15px",color:"#e6a23c"}},Vd={class:"dialog-footer"};function Id(t,e,i,a,o,r){const l=Wc.WK,h=zc.xE,c=zc.US,d=(0,s.g2)("font-awesome-icon"),u=k.S2,g=dd.o8,f=ud.u,m=dd.Up,b=p.R7,x=Bc.qi,y=cd.P9,v=cd.AV,w=hd.dI,S=hd.o5,M=ld.kZ,C=_.A;return(0,s.bo)(((0,s.uX)(),(0,s.CE)("div",pd,[(0,s.Lk)("div",fd,[e[26]||(e[26]=(0,s.Lk)("h3",{class:"first-title"},"认证管理",-1)),e[27]||(e[27]=(0,s.Lk)("h4",{class:"second-title"},"用户端认证",-1)),(0,s.bF)(c,{model:o.authSettings.user,rules:o.userPassRules,ref:"userPassForm","label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{label:"上传密码",prop:"authCode"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:o.authSettings.user.authCode,"onUpdate:modelValue":e[0]||(e[0]=t=>o.authSettings.user.authCode=t),type:"password","show-password":"",onInput:r.handleUserPassInput,autocomplete:"new-password"},null,8,["modelValue","onInput"])]),_:1}),(0,s.bF)(gd.eB,{name:"fade-slide",mode:"out-in"},{default:(0,s.k6)(()=>[o.showUserPassConfirm?((0,s.uX)(),(0,s.Wv)(h,{label:"确认密码",prop:"confirmNewUserPassword",key:"user-confirm"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:o.authSettings.user.confirmNewUserPassword,"onUpdate:modelValue":e[1]||(e[1]=t=>o.authSettings.user.confirmNewUserPassword=t),type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue"])]),_:1})):(0,s.Q3)("",!0)]),_:1})]),_:1},8,["model","rules"]),e[28]||(e[28]=(0,s.Lk)("h4",{class:"second-title"},"管理端认证",-1)),(0,s.bF)(c,{model:o.authSettings.admin,rules:o.adminPassRules,ref:"adminPassForm","label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{label:"用户名",prop:"adminUsername"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:o.authSettings.admin.adminUsername,"onUpdate:modelValue":e[2]||(e[2]=t=>o.authSettings.admin.adminUsername=t),autocomplete:"new-password"},null,8,["modelValue"])]),_:1}),(0,s.bF)(h,{label:"密码",prop:"adminPassword"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:o.authSettings.admin.adminPassword,"onUpdate:modelValue":e[3]||(e[3]=t=>o.authSettings.admin.adminPassword=t),type:"password","show-password":"",onInput:r.handleAdminPassInput,autocomplete:"new-password"},null,8,["modelValue","onInput"])]),_:1}),(0,s.bF)(gd.eB,{name:"fade-slide",mode:"out-in"},{default:(0,s.k6)(()=>[o.showAdminPassConfirm?((0,s.uX)(),(0,s.Wv)(h,{label:"确认密码",prop:"confirmNewAdminPassword",key:"admin-confirm"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:o.authSettings.admin.confirmNewAdminPassword,"onUpdate:modelValue":e[4]||(e[4]=t=>o.authSettings.admin.confirmNewAdminPassword=t),type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue"])]),_:1})):(0,s.Q3)("",!0)]),_:1})]),_:1},8,["model","rules"]),(0,s.Lk)("h4",md,[e[23]||(e[23]=(0,s.eW)("API Token 管理 ",-1)),(0,s.Lk)("a",bd,[(0,s.bF)(u,{type:"primary",size:"small",onClick:e[5]||(e[5]=t=>o.showCreateTokenDialog=!0),circle:""},{default:(0,s.k6)(()=>[(0,s.bF)(d,{icon:"plus"})]),_:1})])]),(0,s.Lk)("div",xd,[(0,s.bo)(((0,s.uX)(),(0,s.Wv)(m,{data:o.apiTokens,class:"token-table"},{default:(0,s.k6)(()=>[(0,s.bF)(g,{prop:"name",label:"名称","header-align":"center"},{default:(0,s.k6)(t=>[(0,s.Lk)("div",yd,(0,n.v_)(t.row.name),1)]),_:1}),(0,s.bF)(g,{prop:"token",label:"Token","header-align":"center"},{default:(0,s.k6)(t=>[(0,s.Lk)("div",_d,[(0,s.Lk)("span",vd,(0,n.v_)(t.row.token),1)])]),_:1}),(0,s.bF)(g,{prop:"permissions",label:"权限","header-align":"center"},{default:(0,s.k6)(t=>[(0,s.Lk)("div",kd,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(t.row.permissions,t=>((0,s.uX)(),(0,s.Wv)(f,{key:t,size:"small",class:"permission-tag"},{default:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(r.getPermissionText(t)),1)]),_:2},1024))),128))])]),_:1}),(0,s.bF)(g,{prop:"createdAt",label:"创建时间","header-align":"center"},{default:(0,s.k6)(t=>[(0,s.Lk)("div",wd,(0,n.v_)(r.formatDate(t.row.createdAt)),1)]),_:1}),(0,s.bF)(g,{label:"操作",fixed:"right","header-align":"center"},{default:(0,s.k6)(t=>[(0,s.Lk)("div",Sd,[(0,s.bF)(u,{class:"action-button",size:"small",onClick:e=>r.editToken(t.row)},{default:(0,s.k6)(()=>[...e[24]||(e[24]=[(0,s.eW)("编辑",-1)])]),_:1},8,["onClick"]),(0,s.bF)(u,{class:"action-button",size:"small",type:"danger",onClick:e=>r.deleteToken(t.row.id)},{default:(0,s.k6)(()=>[...e[25]||(e[25]=[(0,s.eW)("删除",-1)])]),_:1},8,["onClick"])])]),_:1})]),_:1},8,["data"])),[[C,o.tokenLoading]])])]),(0,s.Lk)("div",Md,[e[30]||(e[30]=(0,s.Lk)("h3",{class:"first-title"},"上传管理",-1)),(0,s.Lk)("h4",Cd,[e[29]||(e[29]=(0,s.eW)("图像审查 ",-1)),(0,s.bF)(b,{content:"仅对非分块上传文件生效,支持 nsfwjs 和 moderatecontent.com 渠道",placement:"top"},{default:(0,s.k6)(()=>[(0,s.bF)(d,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),(0,s.bF)(c,{model:o.uploadSettings.moderate,"label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{label:"开启审查"},{default:(0,s.k6)(()=>[(0,s.bF)(x,{modelValue:o.uploadSettings.moderate.enabled,"onUpdate:modelValue":e[6]||(e[6]=t=>o.uploadSettings.moderate.enabled=t)},null,8,["modelValue"])]),_:1}),(0,s.bF)(h,{label:"审查渠道"},{default:(0,s.k6)(()=>[(0,s.bF)(v,{modelValue:o.uploadSettings.moderate.channel,"onUpdate:modelValue":e[7]||(e[7]=t=>o.uploadSettings.moderate.channel=t),placeholder:"请选择审查渠道"},{default:(0,s.k6)(()=>[(0,s.bF)(y,{label:"moderatecontent.com",value:"moderatecontent.com"}),(0,s.bF)(y,{label:"nsfwjs",value:"nsfwjs"})]),_:1},8,["modelValue"])]),_:1}),"moderatecontent.com"===o.uploadSettings.moderate.channel?((0,s.uX)(),(0,s.Wv)(h,{key:0,label:"API Key"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:o.uploadSettings.moderate.moderateContentApiKey,"onUpdate:modelValue":e[8]||(e[8]=t=>o.uploadSettings.moderate.moderateContentApiKey=t)},null,8,["modelValue"])]),_:1})):(0,s.Q3)("",!0),"nsfwjs"===o.uploadSettings.moderate.channel?((0,s.uX)(),(0,s.Wv)(h,{key:1,label:"API 路径"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:o.uploadSettings.moderate.nsfwApiPath,"onUpdate:modelValue":e[9]||(e[9]=t=>o.uploadSettings.moderate.nsfwApiPath=t),placeholder:"https://nsfwjs.your.domain"},null,8,["modelValue"])]),_:1})):(0,s.Q3)("",!0)]),_:1},8,["model"])]),(0,s.Lk)("div",Fd,[e[33]||(e[33]=(0,s.Lk)("h3",{class:"first-title"},"访问管理",-1)),e[34]||(e[34]=(0,s.Lk)("h4",{class:"second-title"},"域名过滤",-1)),(0,s.bF)(c,{model:o.accessSettings,"label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(h,null,{label:(0,s.k6)(()=>[e[31]||(e[31]=(0,s.eW)(" 放行域名 ",-1)),(0,s.bF)(b,{content:"1.针对访问域名设置权限
2.留空默认全部放行,多个域名请用英文逗号分隔",placement:"top","raw-content":""},{default:(0,s.k6)(()=>[(0,s.bF)(d,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:o.accessSettings.allowedDomains,"onUpdate:modelValue":e[10]||(e[10]=t=>o.accessSettings.allowedDomains=t)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"]),e[35]||(e[35]=(0,s.Lk)("h4",{class:"second-title"},"白名单模式",-1)),(0,s.bF)(c,{model:o.accessSettings,"label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(h,null,{label:(0,s.k6)(()=>[e[32]||(e[32]=(0,s.eW)(" 是否开启 ",-1)),(0,s.bF)(b,{content:"1.针对文件设置权限
2.开启后,仅被加入白名单的文件可被访问",placement:"top","raw-content":""},{default:(0,s.k6)(()=>[(0,s.bF)(d,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(x,{modelValue:o.accessSettings.whiteListMode,"onUpdate:modelValue":e[11]||(e[11]=t=>o.accessSettings.whiteListMode=t)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])]),(0,s.Lk)("div",Ad,[(0,s.bF)(u,{type:"primary",onClick:r.saveSettings},{default:(0,s.k6)(()=>[...e[36]||(e[36]=[(0,s.eW)("保存设置",-1)])]),_:1},8,["onClick"])]),(0,s.bF)(M,{modelValue:o.showCreateTokenDialog,"onUpdate:modelValue":e[15]||(e[15]=t=>o.showCreateTokenDialog=t),title:"创建新 API Token",width:r.dialogWidth},{footer:(0,s.k6)(()=>[(0,s.Lk)("span",Pd,[(0,s.bF)(u,{onClick:e[14]||(e[14]=t=>o.showCreateTokenDialog=!1)},{default:(0,s.k6)(()=>[...e[40]||(e[40]=[(0,s.eW)("取消",-1)])]),_:1}),(0,s.bF)(u,{type:"primary",onClick:r.createToken},{default:(0,s.k6)(()=>[...e[41]||(e[41]=[(0,s.eW)("创建",-1)])]),_:1},8,["onClick"])])]),default:(0,s.k6)(()=>[(0,s.bF)(c,{model:o.newToken,rules:o.tokenRules,ref:"tokenForm","label-width":"100px"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{label:"Token 名称",prop:"name"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:o.newToken.name,"onUpdate:modelValue":e[12]||(e[12]=t=>o.newToken.name=t),placeholder:"请输入Token名称"},null,8,["modelValue"])]),_:1}),(0,s.bF)(h,{label:"权限",prop:"permissions"},{default:(0,s.k6)(()=>[(0,s.bF)(S,{modelValue:o.newToken.permissions,"onUpdate:modelValue":e[13]||(e[13]=t=>o.newToken.permissions=t)},{default:(0,s.k6)(()=>[(0,s.bF)(w,{label:"upload"},{default:(0,s.k6)(()=>[...e[37]||(e[37]=[(0,s.eW)("上传",-1)])]),_:1}),(0,s.bF)(w,{label:"delete"},{default:(0,s.k6)(()=>[...e[38]||(e[38]=[(0,s.eW)("删除",-1)])]),_:1}),(0,s.bF)(w,{label:"list"},{default:(0,s.k6)(()=>[...e[39]||(e[39]=[(0,s.eW)("列出",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1})]),_:1},8,["model","rules"])]),_:1},8,["modelValue","width"]),(0,s.bF)(M,{modelValue:o.showEditTokenDialog,"onUpdate:modelValue":e[19]||(e[19]=t=>o.showEditTokenDialog=t),title:"编辑 API Token",width:r.dialogWidth},{footer:(0,s.k6)(()=>[(0,s.Lk)("span",Td,[(0,s.bF)(u,{onClick:e[18]||(e[18]=t=>o.showEditTokenDialog=!1)},{default:(0,s.k6)(()=>[...e[45]||(e[45]=[(0,s.eW)("取消",-1)])]),_:1}),(0,s.bF)(u,{type:"primary",onClick:r.updateToken},{default:(0,s.k6)(()=>[...e[46]||(e[46]=[(0,s.eW)("更新",-1)])]),_:1},8,["onClick"])])]),default:(0,s.k6)(()=>[(0,s.bF)(c,{model:o.editingToken,rules:o.tokenRules,ref:"editTokenForm","label-width":"100px"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{label:"Token 名称"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:o.editingToken.name,"onUpdate:modelValue":e[16]||(e[16]=t=>o.editingToken.name=t),disabled:""},null,8,["modelValue"])]),_:1}),(0,s.bF)(h,{label:"权限",prop:"permissions"},{default:(0,s.k6)(()=>[(0,s.bF)(S,{modelValue:o.editingToken.permissions,"onUpdate:modelValue":e[17]||(e[17]=t=>o.editingToken.permissions=t)},{default:(0,s.k6)(()=>[(0,s.bF)(w,{label:"upload"},{default:(0,s.k6)(()=>[...e[42]||(e[42]=[(0,s.eW)("上传",-1)])]),_:1}),(0,s.bF)(w,{label:"delete"},{default:(0,s.k6)(()=>[...e[43]||(e[43]=[(0,s.eW)("删除",-1)])]),_:1}),(0,s.bF)(w,{label:"list"},{default:(0,s.k6)(()=>[...e[44]||(e[44]=[(0,s.eW)("列出",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1})]),_:1},8,["model","rules"])]),_:1},8,["modelValue","width"]),(0,s.bF)(M,{modelValue:o.showTokenResultDialog,"onUpdate:modelValue":e[22]||(e[22]=t=>o.showTokenResultDialog=t),title:"Token 创建成功",width:r.dialogWidth},{footer:(0,s.k6)(()=>[(0,s.Lk)("span",Vd,[(0,s.bF)(u,{type:"primary",onClick:e[21]||(e[21]=t=>o.showTokenResultDialog=!1)},{default:(0,s.k6)(()=>[...e[49]||(e[49]=[(0,s.eW)("我已保存",-1)])]),_:1})])]),default:(0,s.k6)(()=>[(0,s.Lk)("div",Ld,[(0,s.Lk)("p",Dd,[(0,s.bF)(d,{icon:"exclamation-triangle",style:{"margin-right":"5px"}}),e[47]||(e[47]=(0,s.eW)(" 请妥善保存以下Token,关闭此窗口后将无法再次查看完整Token! ",-1))]),(0,s.bF)(c,{"label-width":"100px"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{label:"Token 名称"},{default:(0,s.k6)(()=>[(0,s.Lk)("span",null,(0,n.v_)(o.createdToken.name),1)]),_:1}),(0,s.bF)(h,{label:"完整Token"},{default:(0,s.k6)(()=>[(0,s.bF)(l,{modelValue:o.createdToken.token,"onUpdate:modelValue":e[20]||(e[20]=t=>o.createdToken.token=t),readonly:""},{append:(0,s.k6)(()=>[(0,s.bF)(u,{onClick:r.copyToken},{default:(0,s.k6)(()=>[...e[48]||(e[48]=[(0,s.eW)("复制",-1)])]),_:1},8,["onClick"])]),_:1},8,["modelValue"])]),_:1})]),_:1})])]),_:1},8,["modelValue","width"])])),[[C,o.loading]])}var Ed={data(){return{authSettings:{user:{},admin:{}},uploadSettings:{moderate:{}},accessSettings:{},apiTokens:[],loading:!1,tokenLoading:!1,oriUserPassword:"",oriAdminPassword:"",showUserPassConfirm:!1,showAdminPassConfirm:!1,showCreateTokenDialog:!1,showEditTokenDialog:!1,showTokenResultDialog:!1,newToken:{name:"",owner:"",permissions:[]},editingToken:{id:"",name:"",owner:"",permissions:[]},createdToken:{name:"",token:""},userPassRules:{authCode:[{validator:(t,e,i)=>{const s=["%","&","?","#","/"],n=s.some(t=>e&&e.includes(t));n?i(new Error("密码不能包含部分URL保留字符: % & ? # /")):i()},trigger:"blur"}],confirmNewUserPassword:[{message:"请再次输入上传密码",trigger:"blur"},{validator:(t,e,i)=>{e&&e!==this.authSettings.user.authCode?i(new Error("两次输入密码不一致")):i()},trigger:"blur"}]},adminPassRules:{confirmNewAdminPassword:[{message:"请再次输入管理密码",trigger:"blur"},{validator:(t,e,i)=>{e&&e!==this.authSettings.admin.adminPassword?i(new Error("两次输入密码不一致")):i()},trigger:"blur"}]},tokenRules:{name:[{required:!0,message:"请输入Token名称",trigger:"blur"}],permissions:[{required:!0,message:"请选择权限",trigger:"change"}]}}},computed:{dialogWidth(){return window.innerWidth>768?"50%":"90%"}},methods:{handleUserPassInput(){this.authSettings.user.authCode!==this.oriUserPassword?this.showUserPassConfirm=!0:this.showUserPassConfirm=!1},handleAdminPassInput(){this.authSettings.admin.adminPassword!==this.oriAdminPassword?this.showAdminPassConfirm=!0:this.showAdminPassConfirm=!1},getPermissionText(t){const e={upload:"上传",delete:"删除",list:"列出"};return e[t]||t},formatDate(t){return new Date(t).toLocaleString("zh-CN")},async loadApiTokens(){this.tokenLoading=!0;try{const t=await(0,Rt.A)("/api/manage/apiTokens"),e=await t.json();this.apiTokens=e.tokens||[]}catch(t){this.$message.error("获取Token列表失败")}finally{this.tokenLoading=!1}},createToken(){this.$refs.tokenForm.validate(async t=>{if(t)try{this.newToken.owner="admin";const t=await(0,Rt.A)("/api/manage/apiTokens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(this.newToken)}),e=await t.json();t.ok?(this.createdToken={name:e.name,token:e.token},this.showCreateTokenDialog=!1,this.showTokenResultDialog=!0,this.newToken={name:"",owner:"",permissions:[]},await this.loadApiTokens(),this.$message.success("Token创建成功")):this.$message.error(e.error||"Token创建失败")}catch(e){this.$message.error("Token创建失败")}})},editToken(t){this.editingToken={id:t.id,name:t.name,owner:t.owner,permissions:[...t.permissions]},this.showEditTokenDialog=!0},updateToken(){this.$refs.editTokenForm.validate(async t=>{if(t)try{const t=await(0,Rt.A)("/api/manage/apiTokens",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({tokenId:this.editingToken.id,permissions:this.editingToken.permissions})}),e=await t.json();t.ok?(this.showEditTokenDialog=!1,await this.loadApiTokens(),this.$message.success("Token权限更新成功")):this.$message.error(e.error||"Token更新失败")}catch(e){this.$message.error("Token更新失败")}})},async deleteToken(t){try{await this.$confirm("此操作将永久删除该Token,是否继续?","提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"});const e=await(0,Rt.A)(`/api/manage/apiTokens?id=${t}`,{method:"DELETE"}),i=await e.json();e.ok?(await this.loadApiTokens(),this.$message.success("Token删除成功")):this.$message.error(i.error||"Token删除失败")}catch(e){"cancel"!==e&&this.$message.error("Token删除失败")}},async copyToken(){try{await navigator.clipboard.writeText(this.createdToken.token),this.$message.success("Token已复制到剪贴板")}catch(t){this.$message.error("复制失败,请手动复制")}},saveSettings(){let t=[];t.push(new Promise(t=>{this.$refs.userPassForm.validate(e=>{t(e)})})),t.push(new Promise(t=>{this.$refs.adminPassForm.validate(e=>{t(e)})})),Promise.all(t).then(t=>{const e=t.every(t=>t);if(!e)return;const i={auth:this.authSettings,upload:this.uploadSettings,access:this.accessSettings};delete i.auth.user.confirmNewUserPassword,delete i.auth.admin.confirmNewAdminPassword,(0,Rt.A)("/api/manage/sysConfig/security",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)}).then(()=>{this.$message.success("设置已保存"),this.oriUserPassword=this.authSettings.user.authCode,this.oriAdminPassword=this.authSettings.admin.adminPassword,this.showUserPassConfirm=!1,this.showAdminPassConfirm=!1})})}},mounted(){this.loading=!0,(0,Rt.A)("/api/manage/sysConfig/security").then(t=>t.json()).then(t=>{this.authSettings=t.auth,this.uploadSettings=t.upload,this.accessSettings=t.access,this.oriUserPassword=this.authSettings.user.authCode,this.oriAdminPassword=this.authSettings.admin.adminPassword,this.authSettings.user.confirmNewUserPassword="",this.authSettings.admin.confirmNewAdminPassword="",this.loadApiTokens()}).finally(()=>{this.loading=!1})}};const Od=(0,c.A)(Ed,[["render",Id],["__scopeId","data-v-3b7344a0"]]);var Rd=Od;const Wd={class:"page-settings"},zd={class:"first-title"},Bd={class:"actions"};function Ud(t,e,i,a,o,r){const l=(0,s.g2)("font-awesome-icon"),h=p.R7,c=cd.P9,d=cd.AV,u=Bc.qi,g=Wc.WK,f=zc.xE,m=zc.US,b=k.S2,x=_.A;return(0,s.bo)(((0,s.uX)(),(0,s.CE)("div",Wd,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(r.groupedSettings,(t,e)=>((0,s.uX)(),(0,s.CE)("div",{key:e,class:"first-settings"},[(0,s.Lk)("h3",zd,(0,n.v_)(e),1),(0,s.bF)(m,{model:o.settings,"label-width":"150px"},{default:(0,s.k6)(()=>[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(t,(t,e)=>((0,s.uX)(),(0,s.Wv)(f,{key:t.id},{label:(0,s.k6)(()=>[(0,s.eW)((0,n.v_)(t.label)+" ",1),t.tooltip?((0,s.uX)(),(0,s.Wv)(h,{key:0,content:t.tooltip,placement:"top","raw-content":""},{default:(0,s.k6)(()=>[(0,s.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])):(0,s.Q3)("",!0)]),default:(0,s.k6)(()=>["select"===t.type?((0,s.uX)(),(0,s.Wv)(d,{key:0,modelValue:t.value,"onUpdate:modelValue":e=>t.value=e,disabled:t.fixed,placeholder:t.placeholder,style:{width:"100%"}},{default:(0,s.k6)(()=>[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(t.options,t=>((0,s.uX)(),(0,s.Wv)(c,{key:t.value,label:t.label,value:t.value},null,8,["label","value"]))),128))]),_:2},1032,["modelValue","onUpdate:modelValue","disabled","placeholder"])):"boolean"===t.type?((0,s.uX)(),(0,s.Wv)(u,{key:1,modelValue:t.value,"onUpdate:modelValue":e=>t.value=e,disabled:t.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])):((0,s.uX)(),(0,s.Wv)(g,{key:2,modelValue:t.value,"onUpdate:modelValue":e=>t.value=e,disabled:t.fixed,placeholder:t.placeholder},null,8,["modelValue","onUpdate:modelValue","disabled","placeholder"]))]),_:2},1024))),128))]),_:2},1032,["model"])]))),128)),(0,s.Lk)("div",Bd,[(0,s.bF)(b,{type:"primary",onClick:r.saveSettings},{default:(0,s.k6)(()=>[...e[0]||(e[0]=[(0,s.eW)("保存设置",-1)])]),_:1},8,["onClick"])])])),[[x,o.loading]])}var Nd={data(){return{settings:{config:[]},loading:!1}},computed:{groupedSettings(){const t={};return this.settings.config&&this.settings.config.forEach(e=>{const i=e.category||"其他设置";t[i]||(t[i]=[]),t[i].push(e)}),t}},methods:{saveSettings(){(0,Rt.A)("/api/manage/sysConfig/page",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(this.settings)}).then(()=>this.$message.success("设置已保存"))}},mounted(){this.loading=!0,(0,Rt.A)("/api/manage/sysConfig/page").then(t=>t.json()).then(t=>{this.settings=t,this.settings.config&&this.settings.config.forEach(t=>{"boolean"===t.type&&("string"===typeof t.value?t.value="true"===t.value:void 0!==t.value&&null!==t.value||(t.value=t.default||!1))})}).finally(()=>{this.loading=!1})}};const jd=(0,c.A)(Nd,[["render",Ud],["__scopeId","data-v-7b059a1c"]]);var $d=jd;const Hd={class:"others-settings"},qd={class:"first-settings"},Xd={class:"first-title"},Yd={class:"first-title"},Kd={class:"first-title"},Qd={class:"first-title"},Gd={class:"first-title"},Jd={class:"actions"};function Zd(t,e,i,n,a,o){const r=(0,s.g2)("font-awesome-icon"),l=p.R7,h=Bc.qi,c=zc.xE,d=zc.US,u=Wc.WK,g=k.S2,f=_.A;return(0,s.bo)(((0,s.uX)(),(0,s.CE)("div",Hd,[(0,s.Lk)("div",qd,[(0,s.Lk)("h3",Xd,[e[11]||(e[11]=(0,s.eW)("远端遥测 ",-1)),(0,s.bF)(l,{content:"便于问题查找和定位,建议开启",placement:"right"},{default:(0,s.k6)(()=>[(0,s.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),(0,s.bF)(d,{model:a.settings.telemetry,"label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(c,{label:"启用"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{modelValue:a.settings.telemetry.enabled,"onUpdate:modelValue":e[0]||(e[0]=t=>a.settings.telemetry.enabled=t),disabled:a.settings.telemetry.fixed},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"]),(0,s.Lk)("h3",Yd,[e[12]||(e[12]=(0,s.eW)("随机图像API ",-1)),(0,s.bF)(l,{content:"API具体用法请查阅文档",placement:"right"},{default:(0,s.k6)(()=>[(0,s.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),(0,s.bF)(d,{model:a.settings.randomImageAPI,"label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(c,{label:"启用"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{modelValue:a.settings.randomImageAPI.enabled,"onUpdate:modelValue":e[1]||(e[1]=t=>a.settings.randomImageAPI.enabled=t),disabled:a.settings.randomImageAPI.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(c,{prop:"randomImageAPI.allowedDir"},{label:(0,s.k6)(()=>[e[13]||(e[13]=(0,s.Lk)("span",null,"目录",-1)),(0,s.bF)(l,{content:"1. 开放随机图权限的目录,默认为根目录,多个目录用逗号分隔
2. 目录均采用绝对路径,例如/img/cover,表示该目录及其所有子目录的文件可被随机图API访问",placement:"right","raw-content":""},{default:(0,s.k6)(()=>[(0,s.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:a.settings.randomImageAPI.allowedDir,"onUpdate:modelValue":e[2]||(e[2]=t=>a.settings.randomImageAPI.allowedDir=t),disabled:a.settings.randomImageAPI.fixed},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"]),(0,s.Lk)("h3",Kd,[e[14]||(e[14]=(0,s.eW)("访客图库 ",-1)),(0,s.bF)(l,{content:"启用后,访客可通过 /browse 路径浏览指定目录的图片(只读,无法删除/移动)",placement:"right","raw-content":""},{default:(0,s.k6)(()=>[(0,s.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),(0,s.bF)(d,{model:a.settings.publicBrowse,"label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(c,{label:"启用"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{modelValue:a.settings.publicBrowse.enabled,"onUpdate:modelValue":e[3]||(e[3]=t=>a.settings.publicBrowse.enabled=t),disabled:a.settings.publicBrowse.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(c,{prop:"publicBrowse.allowedDir"},{label:(0,s.k6)(()=>[e[16]||(e[16]=(0,s.Lk)("span",null,"开放目录",-1)),(0,s.bF)(l,{placement:"right","raw-content":""},{content:(0,s.k6)(()=>[...e[15]||(e[15]=[(0,s.Lk)("div",{style:{"max-width":"320px","line-height":"1.6"}},[(0,s.Lk)("p",{style:{margin:"0 0 8px 0"}},[(0,s.Lk)("b",null,"允许公开浏览的目录,多个目录用逗号分隔")]),(0,s.Lk)("p",{style:{margin:"0 0 8px 0"}},"示例:wallpaper,photos,album"),(0,s.Lk)("p",{style:{margin:"0 0 8px 0",color:"#909399"}},"支持子目录:2026/lucky,2026/rich"),(0,s.Lk)("p",{style:{margin:"0",color:"#67c23a"}},"访问链接:https://你的域名/browse/2026/lucky")],-1)])]),default:(0,s.k6)(()=>[(0,s.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:a.settings.publicBrowse.allowedDir,"onUpdate:modelValue":e[4]||(e[4]=t=>a.settings.publicBrowse.allowedDir=t),disabled:a.settings.publicBrowse.fixed,placeholder:"wallpaper,photos,album"},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"]),(0,s.Lk)("h3",Qd,[e[17]||(e[17]=(0,s.eW)("CloudFlare API Token ",-1)),(0,s.bF)(l,{content:"设置后可以使后端拉黑、删除等操作不受CDN缓存限制
建议设置,设置方式请查阅文档",placement:"right","raw-content":""},{default:(0,s.k6)(()=>[(0,s.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),(0,s.bF)(d,{model:a.settings.cloudflareApiToken,"label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(c,{label:"区域ID"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:a.settings.cloudflareApiToken.CF_ZONE_ID,"onUpdate:modelValue":e[5]||(e[5]=t=>a.settings.cloudflareApiToken.CF_ZONE_ID=t),disabled:a.settings.cloudflareApiToken.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(c,{label:"账户邮箱"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:a.settings.cloudflareApiToken.CF_EMAIL,"onUpdate:modelValue":e[6]||(e[6]=t=>a.settings.cloudflareApiToken.CF_EMAIL=t),disabled:a.settings.cloudflareApiToken.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(c,{label:"API Key"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:a.settings.cloudflareApiToken.CF_API_KEY,"onUpdate:modelValue":e[7]||(e[7]=t=>a.settings.cloudflareApiToken.CF_API_KEY=t),disabled:a.settings.cloudflareApiToken.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"]),(0,s.Lk)("h3",Gd,[e[18]||(e[18]=(0,s.eW)("WebDAV ",-1)),(0,s.bF)(l,{content:"启用后,可以通过WebDAV协议访问和管理图片",placement:"right","raw-content":""},{default:(0,s.k6)(()=>[(0,s.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),(0,s.bF)(d,{model:a.settings.webDAV,"label-width":"120px"},{default:(0,s.k6)(()=>[(0,s.bF)(c,{label:"启用"},{default:(0,s.k6)(()=>[(0,s.bF)(h,{modelValue:a.settings.webDAV.enabled,"onUpdate:modelValue":e[8]||(e[8]=t=>a.settings.webDAV.enabled=t),disabled:a.settings.webDAV.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(c,{label:"用户名"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:a.settings.webDAV.username,"onUpdate:modelValue":e[9]||(e[9]=t=>a.settings.webDAV.username=t),disabled:a.settings.webDAV.fixed},null,8,["modelValue","disabled"])]),_:1}),(0,s.bF)(c,{label:"密码"},{default:(0,s.k6)(()=>[(0,s.bF)(u,{modelValue:a.settings.webDAV.password,"onUpdate:modelValue":e[10]||(e[10]=t=>a.settings.webDAV.password=t),disabled:a.settings.webDAV.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"])]),(0,s.Lk)("div",Jd,[(0,s.bF)(g,{type:"primary",onClick:o.saveSettings},{default:(0,s.k6)(()=>[...e[19]||(e[19]=[(0,s.eW)("保存设置",-1)])]),_:1},8,["onClick"])])])),[[f,a.loading]])}var tu={data(){return{settings:{telemetry:{},randomImageAPI:{},cloudflareApiToken:{},webDAV:{},publicBrowse:{}},loading:!1}},computed:{},methods:{saveSettings(){(0,Rt.A)("/api/manage/sysConfig/others",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(this.settings)}).then(()=>this.$message.success("设置已保存"))}},mounted(){this.loading=!0,(0,Rt.A)("/api/manage/sysConfig/others").then(t=>t.json()).then(t=>{this.settings=t}).finally(()=>{this.loading=!1})}};const eu=(0,c.A)(tu,[["render",Zd],["__scopeId","data-v-4d2a1bec"]]);var iu=eu,su={name:"SystemConfig",data(){return{activeIndex:"status",isSidebarCollapse:!1}},watch:{"$route.hash":{immediate:!0,handler(t){this.activeIndex=t.replace("#",""),window.scrollTo(0,0)}},activeIndex(t){const e=`#${t}`;this.$router.push({hash:e})}},components:{DashboardTabs:f.A,SysConfigTabs:u,SysCogStatus:Ec,SysCogUpload:rd,SysCogSecurity:Rd,SysCogPage:$d,SysCogOthers:iu},computed:{disableTooltip(){return window.innerWidth<768},currentComponent(){const t=this.$route.hash.replace("#","");switch(t){case"status":return Ec;case"upload":return rd;case"security":return Rd;case"page":return $d;case"others":return iu;default:return Ec}}},methods:{handleLogout(){this.$store.commit("setCredentials",null),this.$router.push("/adminLogin")},setDefaultHash(){const t="#status";window.location.hash=t,this.activeIndex=t.replace("#","")}},mounted(){window.location.hash||this.setDefaultHash()}};const nu=(0,c.A)(su,[["render",y],["__scopeId","data-v-c5d2c9c2"]]);var au=nu},5616:function(t,e,i){i(5331),i(7197)},5802:function(t,e,i){i(5331),i(8736),i(213),i(5970)}}]); +//# sourceMappingURL=289.8c3b6ce7.js.map \ No newline at end of file diff --git a/js/289.8c3b6ce7.js.gz b/js/289.8c3b6ce7.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..c633c0a8e81dac6dd51f1454596d6399a919b412 GIT binary patch literal 83430 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 F1OW6y@|*ww literal 0 HcmV?d00001 diff --git a/js/289.8c3b6ce7.js.map b/js/289.8c3b6ce7.js.map new file mode 100644 index 0000000..1dd85b4 --- /dev/null +++ b/js/289.8c3b6ce7.js.map @@ -0,0 +1 @@ +{"version":3,"file":"js/289.8c3b6ce7.js","mappings":"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","sources":["webpack://sanyue_imghub/./node_modules/@babel/runtime/helpers/esm/typeof.js","webpack://sanyue_imghub/./node_modules/@babel/runtime/helpers/esm/toPrimitive.js","webpack://sanyue_imghub/./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","webpack://sanyue_imghub/./node_modules/@babel/runtime/helpers/esm/defineProperty.js","webpack://sanyue_imghub/./src/components/SysConfigTabs.vue?60fe","webpack://sanyue_imghub/./src/components/SysConfigTabs.vue","webpack://sanyue_imghub/./src/components/SysConfigTabs.vue?909a","webpack://sanyue_imghub/./src/views/SystemConfig.vue?5830","webpack://sanyue_imghub/./src/components/SysCogStatus.vue?b122","webpack://sanyue_imghub/./node_modules/@kurkle/color/dist/color.esm.js","webpack://sanyue_imghub/../../src/helpers/helpers.core.ts","webpack://sanyue_imghub/../../src/helpers/helpers.math.ts","webpack://sanyue_imghub/../../src/helpers/helpers.collection.ts","webpack://sanyue_imghub/../../src/helpers/helpers.extras.ts","webpack://sanyue_imghub/../../src/helpers/helpers.easing.ts","webpack://sanyue_imghub/../../src/helpers/helpers.color.ts","webpack://sanyue_imghub/../../src/core/core.animations.defaults.js","webpack://sanyue_imghub/../../src/core/core.layouts.defaults.js","webpack://sanyue_imghub/../../src/helpers/helpers.intl.ts","webpack://sanyue_imghub/../../src/core/core.ticks.js","webpack://sanyue_imghub/../../src/core/core.scale.defaults.js","webpack://sanyue_imghub/../../src/core/core.defaults.js","webpack://sanyue_imghub/../../src/helpers/helpers.canvas.ts","webpack://sanyue_imghub/../../src/helpers/helpers.options.ts","webpack://sanyue_imghub/../../src/helpers/helpers.config.ts","webpack://sanyue_imghub/../../src/helpers/helpers.curve.ts","webpack://sanyue_imghub/../../src/helpers/helpers.dom.ts","webpack://sanyue_imghub/../../src/helpers/helpers.interpolation.ts","webpack://sanyue_imghub/../../src/helpers/helpers.rtl.ts","webpack://sanyue_imghub/../../src/helpers/helpers.segment.js","webpack://sanyue_imghub/../../src/helpers/helpers.dataset.ts","webpack://sanyue_imghub/../src/core/core.animator.js","webpack://sanyue_imghub/../src/core/core.animation.js","webpack://sanyue_imghub/../src/core/core.animations.js","webpack://sanyue_imghub/../src/core/core.datasetController.js","webpack://sanyue_imghub/../src/controllers/controller.bar.js","webpack://sanyue_imghub/../src/controllers/controller.bubble.js","webpack://sanyue_imghub/../src/controllers/controller.doughnut.js","webpack://sanyue_imghub/../src/controllers/controller.line.js","webpack://sanyue_imghub/../src/controllers/controller.polarArea.js","webpack://sanyue_imghub/../src/controllers/controller.pie.js","webpack://sanyue_imghub/../src/controllers/controller.radar.js","webpack://sanyue_imghub/../src/controllers/controller.scatter.js","webpack://sanyue_imghub/../src/core/core.adapters.ts","webpack://sanyue_imghub/../src/core/core.interaction.js","webpack://sanyue_imghub/../src/core/core.layouts.js","webpack://sanyue_imghub/../src/platform/platform.base.js","webpack://sanyue_imghub/../src/platform/platform.basic.js","webpack://sanyue_imghub/../src/platform/platform.dom.js","webpack://sanyue_imghub/../src/platform/index.js","webpack://sanyue_imghub/../src/core/core.element.ts","webpack://sanyue_imghub/../src/core/core.scale.autoskip.js","webpack://sanyue_imghub/../src/core/core.scale.js","webpack://sanyue_imghub/../src/core/core.typedRegistry.js","webpack://sanyue_imghub/../src/core/core.registry.js","webpack://sanyue_imghub/../src/core/core.plugins.js","webpack://sanyue_imghub/../src/core/core.config.js","webpack://sanyue_imghub/../src/core/core.controller.js","webpack://sanyue_imghub/../src/elements/element.arc.ts","webpack://sanyue_imghub/../src/elements/element.line.js","webpack://sanyue_imghub/../src/elements/element.point.ts","webpack://sanyue_imghub/../src/elements/element.bar.js","webpack://sanyue_imghub/../src/plugins/plugin.legend.js","webpack://sanyue_imghub/../src/plugins/plugin.subtitle.js","webpack://sanyue_imghub/../src/plugins/plugin.tooltip.js","webpack://sanyue_imghub/../src/scales/scale.category.js","webpack://sanyue_imghub/../src/scales/scale.linearbase.js","webpack://sanyue_imghub/../src/scales/scale.linear.js","webpack://sanyue_imghub/../src/scales/scale.logarithmic.js","webpack://sanyue_imghub/../src/scales/scale.radialLinear.js","webpack://sanyue_imghub/../src/scales/scale.time.js","webpack://sanyue_imghub/../src/scales/scale.timeseries.js","webpack://sanyue_imghub/../src/props.ts","webpack://sanyue_imghub/../src/utils.ts","webpack://sanyue_imghub/../src/chart.ts","webpack://sanyue_imghub/../src/typedCharts.ts","webpack://sanyue_imghub/./src/components/SysCogStatus.vue","webpack://sanyue_imghub/./src/components/SysCogStatus.vue?535e","webpack://sanyue_imghub/./src/components/SysCogUpload.vue?c5d6","webpack://sanyue_imghub/./src/components/SysCogUpload.vue","webpack://sanyue_imghub/./src/components/SysCogUpload.vue?5e68","webpack://sanyue_imghub/./src/components/SysCogSecurity.vue?22c7","webpack://sanyue_imghub/./src/components/SysCogSecurity.vue","webpack://sanyue_imghub/./src/components/SysCogSecurity.vue?e29e","webpack://sanyue_imghub/./src/components/SysCogPage.vue?9732","webpack://sanyue_imghub/./src/components/SysCogPage.vue","webpack://sanyue_imghub/./src/components/SysCogPage.vue?c23d","webpack://sanyue_imghub/./src/components/SysCogOthers.vue?66f0","webpack://sanyue_imghub/./src/components/SysCogOthers.vue","webpack://sanyue_imghub/./src/components/SysCogOthers.vue?ad31","webpack://sanyue_imghub/./src/views/SystemConfig.vue","webpack://sanyue_imghub/./src/views/SystemConfig.vue?d269"],"sourcesContent":["function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\nexport { _typeof as default };","import _typeof from \"./typeof.js\";\nfunction toPrimitive(t, r) {\n if (\"object\" != _typeof(t) || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != _typeof(i)) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nexport { toPrimitive as default };","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nfunction toPropertyKey(t) {\n var i = toPrimitive(t, \"string\");\n return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nexport { toPropertyKey as default };","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperty(e, r, t) {\n return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\nexport { _defineProperty as default };","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, resolveComponent as _resolveComponent, createVNode as _createVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, normalizeClass as _normalizeClass } from \"vue\";\nconst _hoisted_1 = {\n class: \"menu-list\"\n};\nconst _hoisted_2 = [\"onClick\"];\nconst _hoisted_3 = {\n class: \"menu-text\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"div\", {\n class: _normalizeClass([\"sidebar-container\", {\n 'is-collapsed': $props.isCollapse\n }])\n }, [_createElementVNode(\"div\", _hoisted_1, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.menuItems, item => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: item.index,\n class: _normalizeClass([\"menu-item\", {\n 'is-active': $props.activeIndex === item.index\n }]),\n onClick: $event => $options.handleSelect(item.index)\n }, [_createVNode(_component_font_awesome_icon, {\n icon: item.icon,\n class: \"menu-icon\"\n }, null, 8, [\"icon\"]), _createElementVNode(\"span\", _hoisted_3, _toDisplayString(item.title), 1)], 10, _hoisted_2);\n }), 128))]), _createElementVNode(\"div\", {\n class: \"toggle-button\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.toggleCollapse && $options.toggleCollapse(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: $props.isCollapse ? 'angle-double-right' : 'angle-double-left'\n }, null, 8, [\"icon\"])])], 2);\n}","export default {\n name: 'SysConfigTabs',\n props: {\n activeIndex: {\n type: String,\n default: 'status'\n },\n isCollapse: {\n type: Boolean,\n default: false\n }\n },\n data() {\n return {\n menuItems: [{\n index: 'status',\n icon: 'chart-bar',\n title: '系统状态'\n }, {\n index: 'upload',\n icon: 'cloud-upload',\n title: '上传设置'\n }, {\n index: 'security',\n icon: 'shield',\n title: '安全设置'\n }, {\n index: 'page',\n icon: 'pager',\n title: '网页设置'\n }, {\n index: 'others',\n icon: 'cog',\n title: '其他设置'\n }]\n };\n },\n methods: {\n toggleCollapse() {\n this.$emit('update:isCollapse', !this.isCollapse);\n },\n checkMobile() {\n const isMobile = window.innerWidth <= 768;\n this.$emit('update:isCollapse', isMobile);\n },\n handleSelect(index) {\n this.$emit('update:activeIndex', index);\n }\n },\n mounted() {\n this.checkMobile();\n window.addEventListener('resize', this.checkMobile);\n },\n beforeDestroy() {\n window.removeEventListener('resize', this.checkMobile);\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysConfigTabs.vue?vue&type=template&id=2bd8175a&scoped=true\"\nimport script from \"./SysConfigTabs.vue?vue&type=script&lang=js\"\nexport * from \"./SysConfigTabs.vue?vue&type=script&lang=js\"\n\nimport \"./SysConfigTabs.vue?vue&type=style&index=0&id=2bd8175a&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-2bd8175a\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createElementVNode as _createElementVNode, resolveDynamicComponent as _resolveDynamicComponent, normalizeClass as _normalizeClass, openBlock as _openBlock, createBlock as _createBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"container\"\n};\nconst _hoisted_2 = {\n class: \"header-content\"\n};\nconst _hoisted_3 = {\n class: \"header-action\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_DashboardTabs = _resolveComponent(\"DashboardTabs\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_header = _resolveComponent(\"el-header\");\n const _component_SysConfigTabs = _resolveComponent(\"SysConfigTabs\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createVNode(_component_el_header, null, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_2, [_createVNode(_component_DashboardTabs, {\n activeTab: \"systemConfig\"\n }), _createElementVNode(\"div\", _hoisted_3, [_createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: \"退出登录\",\n placement: \"bottom\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sign-out-alt\",\n class: \"header-icon\",\n onClick: $options.handleLogout\n }, null, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"disabled\"])])])]),\n _: 1\n }), _createVNode(_component_SysConfigTabs, {\n activeIndex: $data.activeIndex,\n \"onUpdate:activeIndex\": _cache[0] || (_cache[0] = $event => $data.activeIndex = $event),\n isCollapse: $data.isSidebarCollapse,\n \"onUpdate:isCollapse\": _cache[1] || (_cache[1] = $event => $data.isSidebarCollapse = $event)\n }, null, 8, [\"activeIndex\", \"isCollapse\"]), (_openBlock(), _createBlock(_resolveDynamicComponent($options.currentComponent), {\n class: _normalizeClass(['main-container', {\n 'collapsed': $data.isSidebarCollapse\n }])\n }, null, 8, [\"class\"]))]);\n}","import { resolveComponent as _resolveComponent, createVNode as _createVNode, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, normalizeStyle as _normalizeStyle, createTextVNode as _createTextVNode, withCtx as _withCtx, createBlock as _createBlock, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"status-panel\"\n};\nconst _hoisted_2 = {\n class: \"overview-cards\"\n};\nconst _hoisted_3 = {\n class: \"card-icon\"\n};\nconst _hoisted_4 = {\n class: \"card-content\"\n};\nconst _hoisted_5 = {\n class: \"card-value\"\n};\nconst _hoisted_6 = {\n class: \"overview-card index-status\"\n};\nconst _hoisted_7 = {\n class: \"card-icon\"\n};\nconst _hoisted_8 = {\n class: \"card-content\"\n};\nconst _hoisted_9 = {\n class: \"card-value\"\n};\nconst _hoisted_10 = {\n class: \"card-subtitle\"\n};\nconst _hoisted_11 = {\n class: \"card-icon\"\n};\nconst _hoisted_12 = {\n class: \"card-content\"\n};\nconst _hoisted_13 = {\n class: \"card-value\"\n};\nconst _hoisted_14 = {\n class: \"charts-section\"\n};\nconst _hoisted_15 = {\n class: \"chart-card\"\n};\nconst _hoisted_16 = {\n class: \"chart-header\"\n};\nconst _hoisted_17 = {\n class: \"chart-content\"\n};\nconst _hoisted_18 = {\n key: 0,\n class: \"empty-state\"\n};\nconst _hoisted_19 = {\n key: 1,\n class: \"pie-chart-container\"\n};\nconst _hoisted_20 = {\n class: \"pie-chart-wrapper\"\n};\nconst _hoisted_21 = {\n class: \"chart-center-text\"\n};\nconst _hoisted_22 = {\n class: \"center-value\"\n};\nconst _hoisted_23 = {\n class: \"chart-legend\"\n};\nconst _hoisted_24 = {\n class: \"legend-label\"\n};\nconst _hoisted_25 = {\n class: \"legend-value\"\n};\nconst _hoisted_26 = {\n class: \"legend-percent\"\n};\nconst _hoisted_27 = {\n class: \"chart-card\"\n};\nconst _hoisted_28 = {\n class: \"chart-header\"\n};\nconst _hoisted_29 = {\n class: \"chart-content\"\n};\nconst _hoisted_30 = {\n key: 0,\n class: \"empty-state\"\n};\nconst _hoisted_31 = {\n key: 1,\n class: \"pie-chart-container\"\n};\nconst _hoisted_32 = {\n class: \"pie-chart-wrapper\"\n};\nconst _hoisted_33 = {\n class: \"chart-center-text\"\n};\nconst _hoisted_34 = {\n class: \"center-value\"\n};\nconst _hoisted_35 = {\n class: \"chart-legend\"\n};\nconst _hoisted_36 = {\n class: \"legend-label\"\n};\nconst _hoisted_37 = {\n class: \"legend-value\"\n};\nconst _hoisted_38 = {\n class: \"legend-percent\"\n};\nconst _hoisted_39 = {\n class: \"actions-section\"\n};\nconst _hoisted_40 = {\n class: \"action-card\"\n};\nconst _hoisted_41 = {\n class: \"action-header\"\n};\nconst _hoisted_42 = {\n class: \"action-content\"\n};\nconst _hoisted_43 = {\n class: \"action-buttons\"\n};\nconst _hoisted_44 = {\n class: \"restore-section\"\n};\nconst _hoisted_45 = {\n key: 0,\n class: \"file-info-section\"\n};\nconst _hoisted_46 = {\n key: 0,\n class: \"file-info-card info-card-newest\"\n};\nconst _hoisted_47 = {\n class: \"card-bg-wrapper\"\n};\nconst _hoisted_48 = [\"src\"];\nconst _hoisted_49 = {\n key: 2,\n class: \"card-bg-fallback\"\n};\nconst _hoisted_50 = {\n class: \"info-card-overlay\"\n};\nconst _hoisted_51 = {\n class: \"info-card-header\"\n};\nconst _hoisted_52 = {\n class: \"header-badge\"\n};\nconst _hoisted_53 = {\n class: \"info-card-content\"\n};\nconst _hoisted_54 = {\n class: \"info-details\"\n};\nconst _hoisted_55 = {\n class: \"file-name\"\n};\nconst _hoisted_56 = {\n class: \"file-meta\"\n};\nconst _hoisted_57 = {\n key: 1,\n class: \"file-info-card info-card-oldest\"\n};\nconst _hoisted_58 = {\n class: \"card-bg-wrapper\"\n};\nconst _hoisted_59 = [\"src\"];\nconst _hoisted_60 = {\n key: 2,\n class: \"card-bg-fallback\"\n};\nconst _hoisted_61 = {\n class: \"info-card-overlay\"\n};\nconst _hoisted_62 = {\n class: \"info-card-header\"\n};\nconst _hoisted_63 = {\n class: \"header-badge warning\"\n};\nconst _hoisted_64 = {\n class: \"info-card-content\"\n};\nconst _hoisted_65 = {\n class: \"info-details\"\n};\nconst _hoisted_66 = {\n class: \"file-name\"\n};\nconst _hoisted_67 = {\n class: \"file-meta\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_Doughnut = _resolveComponent(\"Doughnut\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_image = _resolveComponent(\"el-image\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"div\", {\n class: \"overview-card total-files\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.fetchIndexInfo && $options.fetchIndexInfo(...args))\n }, [_createElementVNode(\"div\", _hoisted_3, [_createVNode(_component_font_awesome_icon, {\n icon: \"database\"\n })]), _createElementVNode(\"div\", _hoisted_4, [_cache[7] || (_cache[7] = _createElementVNode(\"div\", {\n class: \"card-title\"\n }, \"文件总数\", -1)), _createElementVNode(\"div\", _hoisted_5, _toDisplayString($data.indexInfo.totalFiles?.toLocaleString() || '0'), 1), _cache[8] || (_cache[8] = _createElementVNode(\"div\", {\n class: \"card-subtitle\"\n }, \"点击刷新\", -1))])]), _createElementVNode(\"div\", _hoisted_6, [_createElementVNode(\"div\", _hoisted_7, [_createVNode(_component_font_awesome_icon, {\n icon: \"clock\"\n })]), _createElementVNode(\"div\", _hoisted_8, [_cache[9] || (_cache[9] = _createElementVNode(\"div\", {\n class: \"card-title\"\n }, \"索引更新时间\", -1)), _createElementVNode(\"div\", _hoisted_9, _toDisplayString($options.formatTime($data.indexInfo.lastUpdated)), 1), _createElementVNode(\"div\", _hoisted_10, _toDisplayString($options.getTimeAgo($data.indexInfo.lastUpdated)), 1)])]), _createElementVNode(\"div\", {\n class: \"overview-card system-version\",\n onClick: _cache[1] || (_cache[1] = (...args) => $options.openReleases && $options.openReleases(...args))\n }, [_createElementVNode(\"div\", _hoisted_11, [_createVNode(_component_font_awesome_icon, {\n icon: \"code-branch\"\n })]), _createElementVNode(\"div\", _hoisted_12, [_cache[10] || (_cache[10] = _createElementVNode(\"div\", {\n class: \"card-title\"\n }, \"系统版本\", -1)), _createElementVNode(\"div\", _hoisted_13, \"v\" + _toDisplayString($data.version), 1), _cache[11] || (_cache[11] = _createElementVNode(\"div\", {\n class: \"card-subtitle\"\n }, \"点击查看更新日志\", -1))])])]), _createElementVNode(\"div\", _hoisted_14, [_createElementVNode(\"div\", _hoisted_15, [_createElementVNode(\"div\", _hoisted_16, [_createVNode(_component_font_awesome_icon, {\n icon: \"share-alt\"\n }), _cache[12] || (_cache[12] = _createElementVNode(\"span\", null, \"上传渠道分布\", -1))]), _createElementVNode(\"div\", _hoisted_17, [Object.keys($data.indexInfo.channelStats || {}).length === 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_18, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\"\n }), _cache[13] || (_cache[13] = _createElementVNode(\"span\", null, \"暂无数据\", -1))])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_19, [_createElementVNode(\"div\", _hoisted_20, [_createVNode(_component_Doughnut, {\n data: $options.channelChartData,\n options: $options.chartOptions\n }, null, 8, [\"data\", \"options\"]), _createElementVNode(\"div\", _hoisted_21, [_createElementVNode(\"div\", _hoisted_22, _toDisplayString($data.indexInfo.totalFiles?.toLocaleString() || '0'), 1), _cache[14] || (_cache[14] = _createElementVNode(\"div\", {\n class: \"center-label\"\n }, \"文件总数\", -1))])]), _createElementVNode(\"div\", _hoisted_23, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.indexInfo.channelStats, (count, channel, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: channel,\n class: \"legend-item\"\n }, [_createElementVNode(\"span\", {\n class: \"legend-color\",\n style: _normalizeStyle({\n background: $options.getChartColor(index)\n })\n }, null, 4), _createElementVNode(\"span\", _hoisted_24, _toDisplayString(channel), 1), _createElementVNode(\"span\", _hoisted_25, _toDisplayString(count.toLocaleString()), 1), _createElementVNode(\"span\", _hoisted_26, _toDisplayString($options.getPercentage(count, $data.indexInfo.totalFiles)) + \"%\", 1)]);\n }), 128))])]))])]), _createElementVNode(\"div\", _hoisted_27, [_createElementVNode(\"div\", _hoisted_28, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\"\n }), _cache[15] || (_cache[15] = _createElementVNode(\"span\", null, \"文件状态分布\", -1))]), _createElementVNode(\"div\", _hoisted_29, [Object.keys($data.indexInfo.typeStats || {}).length === 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_30, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\"\n }), _cache[16] || (_cache[16] = _createElementVNode(\"span\", null, \"暂无数据\", -1))])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_31, [_createElementVNode(\"div\", _hoisted_32, [_createVNode(_component_Doughnut, {\n data: $options.typeChartData,\n options: $options.chartOptions\n }, null, 8, [\"data\", \"options\"]), _createElementVNode(\"div\", _hoisted_33, [_createElementVNode(\"div\", _hoisted_34, _toDisplayString(Object.keys($data.indexInfo.typeStats).length), 1), _cache[17] || (_cache[17] = _createElementVNode(\"div\", {\n class: \"center-label\"\n }, \"状态类型\", -1))])]), _createElementVNode(\"div\", _hoisted_35, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.indexInfo.typeStats, (count, type, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: type,\n class: \"legend-item\"\n }, [_createElementVNode(\"span\", {\n class: \"legend-color\",\n style: _normalizeStyle({\n background: $options.getTypeChartColor(index)\n })\n }, null, 4), _createElementVNode(\"span\", _hoisted_36, _toDisplayString(type || '未知类型'), 1), _createElementVNode(\"span\", _hoisted_37, _toDisplayString(count.toLocaleString()), 1), _createElementVNode(\"span\", _hoisted_38, _toDisplayString($options.getPercentage(count, $data.indexInfo.totalFiles)) + \"%\", 1)]);\n }), 128))])]))])])]), _createElementVNode(\"div\", _hoisted_39, [_createElementVNode(\"div\", _hoisted_40, [_createElementVNode(\"div\", _hoisted_41, [_createVNode(_component_font_awesome_icon, {\n icon: \"tools\"\n }), _cache[18] || (_cache[18] = _createElementVNode(\"span\", null, \"系统维护\", -1))]), _createElementVNode(\"div\", _hoisted_42, [_createElementVNode(\"div\", _hoisted_43, [_createVNode(_component_el_tooltip, {\n content: \"重新扫描所有文件并更新索引数据,适用于数据不一致时的修复\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n type: \"primary\",\n loading: $data.rebuilding,\n onClick: $options.rebuildIndex,\n class: \"action-btn rebuild-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sync-alt\"\n }), _createTextVNode(\" \" + _toDisplayString($data.rebuilding ? '重建中...' : '重建索引'), 1)]),\n _: 1\n }, 8, [\"loading\", \"onClick\"])]),\n _: 1\n }), _createVNode(_component_el_tooltip, {\n content: \"备份所有文件元数据和系统设置到JSON文件\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n type: \"success\",\n loading: $data.backing,\n onClick: $options.backupData,\n class: \"action-btn backup-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"download\"\n }), _createTextVNode(\" \" + _toDisplayString($data.backing ? '备份中...' : '备份数据'), 1)]),\n _: 1\n }, 8, [\"loading\", \"onClick\"])]),\n _: 1\n }), _createVNode(_component_el_tooltip, {\n content: \"从备份文件恢复数据,将覆盖现有的文件元数据和系统设置\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_44, [_createElementVNode(\"input\", {\n type: \"file\",\n ref: \"fileInput\",\n accept: \".json\",\n onChange: _cache[2] || (_cache[2] = (...args) => $options.handleFileSelect && $options.handleFileSelect(...args)),\n style: {\n \"display\": \"none\"\n }\n }, null, 544), _createVNode(_component_el_button, {\n type: \"warning\",\n loading: $data.restoring,\n onClick: $options.selectRestoreFile,\n class: \"action-btn restore-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"upload\"\n }), _createTextVNode(\" \" + _toDisplayString($data.restoring ? '恢复中...' : '恢复数据'), 1)]),\n _: 1\n }, 8, [\"loading\", \"onClick\"])])]),\n _: 1\n })])])])]), $data.indexInfo.newestFile || $data.indexInfo.oldestFile ? (_openBlock(), _createElementBlock(\"div\", _hoisted_45, [$data.indexInfo.newestFile ? (_openBlock(), _createElementBlock(\"div\", _hoisted_46, [_createElementVNode(\"div\", _hoisted_47, [$options.isImageFile($data.indexInfo.newestFile) && !$data.loadErrors['newest'] ? (_openBlock(), _createBlock(_component_el_image, {\n key: 0,\n src: '/file/' + $data.indexInfo.newestFile.id + '?from=admin',\n fit: \"cover\",\n class: \"card-bg-media\",\n onError: _cache[3] || (_cache[3] = $event => $options.handleImageError('newest'))\n }, null, 8, [\"src\"])) : $options.isVideoFile($data.indexInfo.newestFile) && !$data.loadErrors['newest'] ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: '/file/' + $data.indexInfo.newestFile.id + '?from=admin',\n class: \"card-bg-media\",\n muted: \"\",\n loop: \"\",\n autoplay: \"\",\n onError: _cache[4] || (_cache[4] = $event => $options.handleImageError('newest'))\n }, null, 40, _hoisted_48)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_49, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\",\n class: \"fallback-icon\"\n })]))]), _createElementVNode(\"div\", _hoisted_50, [_createElementVNode(\"div\", _hoisted_51, [_createElementVNode(\"div\", _hoisted_52, [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-up\"\n }), _cache[19] || (_cache[19] = _createElementVNode(\"span\", null, \"最近上传\", -1))])]), _createElementVNode(\"div\", _hoisted_53, [_createElementVNode(\"div\", _hoisted_54, [_createElementVNode(\"div\", _hoisted_55, _toDisplayString($data.indexInfo.newestFile.metadata?.FileName || $data.indexInfo.newestFile.id), 1), _createElementVNode(\"div\", _hoisted_56, _toDisplayString($options.formatTime($data.indexInfo.newestFile.metadata?.TimeStamp)), 1)])])])])) : _createCommentVNode(\"\", true), $data.indexInfo.oldestFile ? (_openBlock(), _createElementBlock(\"div\", _hoisted_57, [_createElementVNode(\"div\", _hoisted_58, [$options.isImageFile($data.indexInfo.oldestFile) && !$data.loadErrors['oldest'] ? (_openBlock(), _createBlock(_component_el_image, {\n key: 0,\n src: '/file/' + $data.indexInfo.oldestFile.id + '?from=admin',\n fit: \"cover\",\n class: \"card-bg-media\",\n onError: _cache[5] || (_cache[5] = $event => $options.handleImageError('oldest'))\n }, null, 8, [\"src\"])) : $options.isVideoFile($data.indexInfo.oldestFile) && !$data.loadErrors['oldest'] ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: '/file/' + $data.indexInfo.oldestFile.id + '?from=admin',\n class: \"card-bg-media\",\n muted: \"\",\n loop: \"\",\n autoplay: \"\",\n onError: _cache[6] || (_cache[6] = $event => $options.handleImageError('oldest'))\n }, null, 40, _hoisted_59)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_60, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\",\n class: \"fallback-icon\"\n })]))]), _createElementVNode(\"div\", _hoisted_61, [_createElementVNode(\"div\", _hoisted_62, [_createElementVNode(\"div\", _hoisted_63, [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-down\"\n }), _cache[20] || (_cache[20] = _createElementVNode(\"span\", null, \"最早上传\", -1))])]), _createElementVNode(\"div\", _hoisted_64, [_createElementVNode(\"div\", _hoisted_65, [_createElementVNode(\"div\", _hoisted_66, _toDisplayString($data.indexInfo.oldestFile.metadata?.FileName || $data.indexInfo.oldestFile.id), 1), _createElementVNode(\"div\", _hoisted_67, _toDisplayString($options.formatTime($data.indexInfo.oldestFile.metadata?.TimeStamp)), 1)])])])])) : _createCommentVNode(\"\", true)])) : _createCommentVNode(\"\", true)])), [[_directive_loading, $data.loading]]);\n}","/*!\n * @kurkle/color v0.3.4\n * https://github.com/kurkle/color#readme\n * (c) 2024 Jukka Kurkela\n * Released under the MIT License\n */\nfunction round(v) {\n return v + 0.5 | 0;\n}\nconst lim = (v, l, h) => Math.max(Math.min(v, h), l);\nfunction p2b(v) {\n return lim(round(v * 2.55), 0, 255);\n}\nfunction b2p(v) {\n return lim(round(v / 2.55), 0, 100);\n}\nfunction n2b(v) {\n return lim(round(v * 255), 0, 255);\n}\nfunction b2n(v) {\n return lim(round(v / 2.55) / 100, 0, 1);\n}\nfunction n2p(v) {\n return lim(round(v * 100), 0, 100);\n}\n\nconst map$1 = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 10, B: 11, C: 12, D: 13, E: 14, F: 15, a: 10, b: 11, c: 12, d: 13, e: 14, f: 15};\nconst hex = [...'0123456789ABCDEF'];\nconst h1 = b => hex[b & 0xF];\nconst h2 = b => hex[(b & 0xF0) >> 4] + hex[b & 0xF];\nconst eq = b => ((b & 0xF0) >> 4) === (b & 0xF);\nconst isShort = v => eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a);\nfunction hexParse(str) {\n var len = str.length;\n var ret;\n if (str[0] === '#') {\n if (len === 4 || len === 5) {\n ret = {\n r: 255 & map$1[str[1]] * 17,\n g: 255 & map$1[str[2]] * 17,\n b: 255 & map$1[str[3]] * 17,\n a: len === 5 ? map$1[str[4]] * 17 : 255\n };\n } else if (len === 7 || len === 9) {\n ret = {\n r: map$1[str[1]] << 4 | map$1[str[2]],\n g: map$1[str[3]] << 4 | map$1[str[4]],\n b: map$1[str[5]] << 4 | map$1[str[6]],\n a: len === 9 ? (map$1[str[7]] << 4 | map$1[str[8]]) : 255\n };\n }\n }\n return ret;\n}\nconst alpha = (a, f) => a < 255 ? f(a) : '';\nfunction hexString(v) {\n var f = isShort(v) ? h1 : h2;\n return v\n ? '#' + f(v.r) + f(v.g) + f(v.b) + alpha(v.a, f)\n : undefined;\n}\n\nconst HUE_RE = /^(hsla?|hwb|hsv)\\(\\s*([-+.e\\d]+)(?:deg)?[\\s,]+([-+.e\\d]+)%[\\s,]+([-+.e\\d]+)%(?:[\\s,]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction hsl2rgbn(h, s, l) {\n const a = s * Math.min(l, 1 - l);\n const f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return [f(0), f(8), f(4)];\n}\nfunction hsv2rgbn(h, s, v) {\n const f = (n, k = (n + h / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);\n return [f(5), f(3), f(1)];\n}\nfunction hwb2rgbn(h, w, b) {\n const rgb = hsl2rgbn(h, 1, 0.5);\n let i;\n if (w + b > 1) {\n i = 1 / (w + b);\n w *= i;\n b *= i;\n }\n for (i = 0; i < 3; i++) {\n rgb[i] *= 1 - w - b;\n rgb[i] += w;\n }\n return rgb;\n}\nfunction hueValue(r, g, b, d, max) {\n if (r === max) {\n return ((g - b) / d) + (g < b ? 6 : 0);\n }\n if (g === max) {\n return (b - r) / d + 2;\n }\n return (r - g) / d + 4;\n}\nfunction rgb2hsl(v) {\n const range = 255;\n const r = v.r / range;\n const g = v.g / range;\n const b = v.b / range;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n let h, s, d;\n if (max !== min) {\n d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n h = hueValue(r, g, b, d, max);\n h = h * 60 + 0.5;\n }\n return [h | 0, s || 0, l];\n}\nfunction calln(f, a, b, c) {\n return (\n Array.isArray(a)\n ? f(a[0], a[1], a[2])\n : f(a, b, c)\n ).map(n2b);\n}\nfunction hsl2rgb(h, s, l) {\n return calln(hsl2rgbn, h, s, l);\n}\nfunction hwb2rgb(h, w, b) {\n return calln(hwb2rgbn, h, w, b);\n}\nfunction hsv2rgb(h, s, v) {\n return calln(hsv2rgbn, h, s, v);\n}\nfunction hue(h) {\n return (h % 360 + 360) % 360;\n}\nfunction hueParse(str) {\n const m = HUE_RE.exec(str);\n let a = 255;\n let v;\n if (!m) {\n return;\n }\n if (m[5] !== v) {\n a = m[6] ? p2b(+m[5]) : n2b(+m[5]);\n }\n const h = hue(+m[2]);\n const p1 = +m[3] / 100;\n const p2 = +m[4] / 100;\n if (m[1] === 'hwb') {\n v = hwb2rgb(h, p1, p2);\n } else if (m[1] === 'hsv') {\n v = hsv2rgb(h, p1, p2);\n } else {\n v = hsl2rgb(h, p1, p2);\n }\n return {\n r: v[0],\n g: v[1],\n b: v[2],\n a: a\n };\n}\nfunction rotate(v, deg) {\n var h = rgb2hsl(v);\n h[0] = hue(h[0] + deg);\n h = hsl2rgb(h);\n v.r = h[0];\n v.g = h[1];\n v.b = h[2];\n}\nfunction hslString(v) {\n if (!v) {\n return;\n }\n const a = rgb2hsl(v);\n const h = a[0];\n const s = n2p(a[1]);\n const l = n2p(a[2]);\n return v.a < 255\n ? `hsla(${h}, ${s}%, ${l}%, ${b2n(v.a)})`\n : `hsl(${h}, ${s}%, ${l}%)`;\n}\n\nconst map = {\n\tx: 'dark',\n\tZ: 'light',\n\tY: 're',\n\tX: 'blu',\n\tW: 'gr',\n\tV: 'medium',\n\tU: 'slate',\n\tA: 'ee',\n\tT: 'ol',\n\tS: 'or',\n\tB: 'ra',\n\tC: 'lateg',\n\tD: 'ights',\n\tR: 'in',\n\tQ: 'turquois',\n\tE: 'hi',\n\tP: 'ro',\n\tO: 'al',\n\tN: 'le',\n\tM: 'de',\n\tL: 'yello',\n\tF: 'en',\n\tK: 'ch',\n\tG: 'arks',\n\tH: 'ea',\n\tI: 'ightg',\n\tJ: 'wh'\n};\nconst names$1 = {\n\tOiceXe: 'f0f8ff',\n\tantiquewEte: 'faebd7',\n\taqua: 'ffff',\n\taquamarRe: '7fffd4',\n\tazuY: 'f0ffff',\n\tbeige: 'f5f5dc',\n\tbisque: 'ffe4c4',\n\tblack: '0',\n\tblanKedOmond: 'ffebcd',\n\tXe: 'ff',\n\tXeviTet: '8a2be2',\n\tbPwn: 'a52a2a',\n\tburlywood: 'deb887',\n\tcaMtXe: '5f9ea0',\n\tKartYuse: '7fff00',\n\tKocTate: 'd2691e',\n\tcSO: 'ff7f50',\n\tcSnflowerXe: '6495ed',\n\tcSnsilk: 'fff8dc',\n\tcrimson: 'dc143c',\n\tcyan: 'ffff',\n\txXe: '8b',\n\txcyan: '8b8b',\n\txgTMnPd: 'b8860b',\n\txWay: 'a9a9a9',\n\txgYF: '6400',\n\txgYy: 'a9a9a9',\n\txkhaki: 'bdb76b',\n\txmagFta: '8b008b',\n\txTivegYF: '556b2f',\n\txSange: 'ff8c00',\n\txScEd: '9932cc',\n\txYd: '8b0000',\n\txsOmon: 'e9967a',\n\txsHgYF: '8fbc8f',\n\txUXe: '483d8b',\n\txUWay: '2f4f4f',\n\txUgYy: '2f4f4f',\n\txQe: 'ced1',\n\txviTet: '9400d3',\n\tdAppRk: 'ff1493',\n\tdApskyXe: 'bfff',\n\tdimWay: '696969',\n\tdimgYy: '696969',\n\tdodgerXe: '1e90ff',\n\tfiYbrick: 'b22222',\n\tflSOwEte: 'fffaf0',\n\tfoYstWAn: '228b22',\n\tfuKsia: 'ff00ff',\n\tgaRsbSo: 'dcdcdc',\n\tghostwEte: 'f8f8ff',\n\tgTd: 'ffd700',\n\tgTMnPd: 'daa520',\n\tWay: '808080',\n\tgYF: '8000',\n\tgYFLw: 'adff2f',\n\tgYy: '808080',\n\thoneyMw: 'f0fff0',\n\thotpRk: 'ff69b4',\n\tRdianYd: 'cd5c5c',\n\tRdigo: '4b0082',\n\tivSy: 'fffff0',\n\tkhaki: 'f0e68c',\n\tlavFMr: 'e6e6fa',\n\tlavFMrXsh: 'fff0f5',\n\tlawngYF: '7cfc00',\n\tNmoncEffon: 'fffacd',\n\tZXe: 'add8e6',\n\tZcSO: 'f08080',\n\tZcyan: 'e0ffff',\n\tZgTMnPdLw: 'fafad2',\n\tZWay: 'd3d3d3',\n\tZgYF: '90ee90',\n\tZgYy: 'd3d3d3',\n\tZpRk: 'ffb6c1',\n\tZsOmon: 'ffa07a',\n\tZsHgYF: '20b2aa',\n\tZskyXe: '87cefa',\n\tZUWay: '778899',\n\tZUgYy: '778899',\n\tZstAlXe: 'b0c4de',\n\tZLw: 'ffffe0',\n\tlime: 'ff00',\n\tlimegYF: '32cd32',\n\tlRF: 'faf0e6',\n\tmagFta: 'ff00ff',\n\tmaPon: '800000',\n\tVaquamarRe: '66cdaa',\n\tVXe: 'cd',\n\tVScEd: 'ba55d3',\n\tVpurpN: '9370db',\n\tVsHgYF: '3cb371',\n\tVUXe: '7b68ee',\n\tVsprRggYF: 'fa9a',\n\tVQe: '48d1cc',\n\tVviTetYd: 'c71585',\n\tmidnightXe: '191970',\n\tmRtcYam: 'f5fffa',\n\tmistyPse: 'ffe4e1',\n\tmoccasR: 'ffe4b5',\n\tnavajowEte: 'ffdead',\n\tnavy: '80',\n\tTdlace: 'fdf5e6',\n\tTive: '808000',\n\tTivedBb: '6b8e23',\n\tSange: 'ffa500',\n\tSangeYd: 'ff4500',\n\tScEd: 'da70d6',\n\tpOegTMnPd: 'eee8aa',\n\tpOegYF: '98fb98',\n\tpOeQe: 'afeeee',\n\tpOeviTetYd: 'db7093',\n\tpapayawEp: 'ffefd5',\n\tpHKpuff: 'ffdab9',\n\tperu: 'cd853f',\n\tpRk: 'ffc0cb',\n\tplum: 'dda0dd',\n\tpowMrXe: 'b0e0e6',\n\tpurpN: '800080',\n\tYbeccapurpN: '663399',\n\tYd: 'ff0000',\n\tPsybrown: 'bc8f8f',\n\tPyOXe: '4169e1',\n\tsaddNbPwn: '8b4513',\n\tsOmon: 'fa8072',\n\tsandybPwn: 'f4a460',\n\tsHgYF: '2e8b57',\n\tsHshell: 'fff5ee',\n\tsiFna: 'a0522d',\n\tsilver: 'c0c0c0',\n\tskyXe: '87ceeb',\n\tUXe: '6a5acd',\n\tUWay: '708090',\n\tUgYy: '708090',\n\tsnow: 'fffafa',\n\tsprRggYF: 'ff7f',\n\tstAlXe: '4682b4',\n\ttan: 'd2b48c',\n\tteO: '8080',\n\ttEstN: 'd8bfd8',\n\ttomato: 'ff6347',\n\tQe: '40e0d0',\n\tviTet: 'ee82ee',\n\tJHt: 'f5deb3',\n\twEte: 'ffffff',\n\twEtesmoke: 'f5f5f5',\n\tLw: 'ffff00',\n\tLwgYF: '9acd32'\n};\nfunction unpack() {\n const unpacked = {};\n const keys = Object.keys(names$1);\n const tkeys = Object.keys(map);\n let i, j, k, ok, nk;\n for (i = 0; i < keys.length; i++) {\n ok = nk = keys[i];\n for (j = 0; j < tkeys.length; j++) {\n k = tkeys[j];\n nk = nk.replace(k, map[k]);\n }\n k = parseInt(names$1[ok], 16);\n unpacked[nk] = [k >> 16 & 0xFF, k >> 8 & 0xFF, k & 0xFF];\n }\n return unpacked;\n}\n\nlet names;\nfunction nameParse(str) {\n if (!names) {\n names = unpack();\n names.transparent = [0, 0, 0, 0];\n }\n const a = names[str.toLowerCase()];\n return a && {\n r: a[0],\n g: a[1],\n b: a[2],\n a: a.length === 4 ? a[3] : 255\n };\n}\n\nconst RGB_RE = /^rgba?\\(\\s*([-+.\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?(?:[\\s,/]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction rgbParse(str) {\n const m = RGB_RE.exec(str);\n let a = 255;\n let r, g, b;\n if (!m) {\n return;\n }\n if (m[7] !== r) {\n const v = +m[7];\n a = m[8] ? p2b(v) : lim(v * 255, 0, 255);\n }\n r = +m[1];\n g = +m[3];\n b = +m[5];\n r = 255 & (m[2] ? p2b(r) : lim(r, 0, 255));\n g = 255 & (m[4] ? p2b(g) : lim(g, 0, 255));\n b = 255 & (m[6] ? p2b(b) : lim(b, 0, 255));\n return {\n r: r,\n g: g,\n b: b,\n a: a\n };\n}\nfunction rgbString(v) {\n return v && (\n v.a < 255\n ? `rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})`\n : `rgb(${v.r}, ${v.g}, ${v.b})`\n );\n}\n\nconst to = v => v <= 0.0031308 ? v * 12.92 : Math.pow(v, 1.0 / 2.4) * 1.055 - 0.055;\nconst from = v => v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\nfunction interpolate(rgb1, rgb2, t) {\n const r = from(b2n(rgb1.r));\n const g = from(b2n(rgb1.g));\n const b = from(b2n(rgb1.b));\n return {\n r: n2b(to(r + t * (from(b2n(rgb2.r)) - r))),\n g: n2b(to(g + t * (from(b2n(rgb2.g)) - g))),\n b: n2b(to(b + t * (from(b2n(rgb2.b)) - b))),\n a: rgb1.a + t * (rgb2.a - rgb1.a)\n };\n}\n\nfunction modHSL(v, i, ratio) {\n if (v) {\n let tmp = rgb2hsl(v);\n tmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1));\n tmp = hsl2rgb(tmp);\n v.r = tmp[0];\n v.g = tmp[1];\n v.b = tmp[2];\n }\n}\nfunction clone(v, proto) {\n return v ? Object.assign(proto || {}, v) : v;\n}\nfunction fromObject(input) {\n var v = {r: 0, g: 0, b: 0, a: 255};\n if (Array.isArray(input)) {\n if (input.length >= 3) {\n v = {r: input[0], g: input[1], b: input[2], a: 255};\n if (input.length > 3) {\n v.a = n2b(input[3]);\n }\n }\n } else {\n v = clone(input, {r: 0, g: 0, b: 0, a: 1});\n v.a = n2b(v.a);\n }\n return v;\n}\nfunction functionParse(str) {\n if (str.charAt(0) === 'r') {\n return rgbParse(str);\n }\n return hueParse(str);\n}\nclass Color {\n constructor(input) {\n if (input instanceof Color) {\n return input;\n }\n const type = typeof input;\n let v;\n if (type === 'object') {\n v = fromObject(input);\n } else if (type === 'string') {\n v = hexParse(input) || nameParse(input) || functionParse(input);\n }\n this._rgb = v;\n this._valid = !!v;\n }\n get valid() {\n return this._valid;\n }\n get rgb() {\n var v = clone(this._rgb);\n if (v) {\n v.a = b2n(v.a);\n }\n return v;\n }\n set rgb(obj) {\n this._rgb = fromObject(obj);\n }\n rgbString() {\n return this._valid ? rgbString(this._rgb) : undefined;\n }\n hexString() {\n return this._valid ? hexString(this._rgb) : undefined;\n }\n hslString() {\n return this._valid ? hslString(this._rgb) : undefined;\n }\n mix(color, weight) {\n if (color) {\n const c1 = this.rgb;\n const c2 = color.rgb;\n let w2;\n const p = weight === w2 ? 0.5 : weight;\n const w = 2 * p - 1;\n const a = c1.a - c2.a;\n const w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n w2 = 1 - w1;\n c1.r = 0xFF & w1 * c1.r + w2 * c2.r + 0.5;\n c1.g = 0xFF & w1 * c1.g + w2 * c2.g + 0.5;\n c1.b = 0xFF & w1 * c1.b + w2 * c2.b + 0.5;\n c1.a = p * c1.a + (1 - p) * c2.a;\n this.rgb = c1;\n }\n return this;\n }\n interpolate(color, t) {\n if (color) {\n this._rgb = interpolate(this._rgb, color._rgb, t);\n }\n return this;\n }\n clone() {\n return new Color(this.rgb);\n }\n alpha(a) {\n this._rgb.a = n2b(a);\n return this;\n }\n clearer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 - ratio;\n return this;\n }\n greyscale() {\n const rgb = this._rgb;\n const val = round(rgb.r * 0.3 + rgb.g * 0.59 + rgb.b * 0.11);\n rgb.r = rgb.g = rgb.b = val;\n return this;\n }\n opaquer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 + ratio;\n return this;\n }\n negate() {\n const v = this._rgb;\n v.r = 255 - v.r;\n v.g = 255 - v.g;\n v.b = 255 - v.b;\n return this;\n }\n lighten(ratio) {\n modHSL(this._rgb, 2, ratio);\n return this;\n }\n darken(ratio) {\n modHSL(this._rgb, 2, -ratio);\n return this;\n }\n saturate(ratio) {\n modHSL(this._rgb, 1, ratio);\n return this;\n }\n desaturate(ratio) {\n modHSL(this._rgb, 1, -ratio);\n return this;\n }\n rotate(deg) {\n rotate(this._rgb, deg);\n return this;\n }\n}\n\nfunction index_esm(input) {\n return new Color(input);\n}\n\nexport { Color, b2n, b2p, index_esm as default, hexParse, hexString, hsl2rgb, hslString, hsv2rgb, hueParse, hwb2rgb, lim, n2b, n2p, nameParse, p2b, rgb2hsl, rgbParse, rgbString, rotate, round };\n","/**\n * @namespace Chart.helpers\n */\n\nimport type {AnyObject} from '../types/basic.js';\nimport type {ActiveDataPoint, ChartEvent} from '../types/index.js';\n\n/**\n * An empty function that can be used, for example, for optional callback.\n */\nexport function noop() {\n /* noop */\n}\n\n/**\n * Returns a unique id, sequentially generated from a global variable.\n */\nexport const uid = (() => {\n let id = 0;\n return () => id++;\n})();\n\n/**\n * Returns true if `value` is neither null nor undefined, else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */\nexport function isNullOrUndef(value: unknown): value is null | undefined {\n return value === null || value === undefined;\n}\n\n/**\n * Returns true if `value` is an array (including typed arrays), else returns false.\n * @param value - The value to test.\n * @function\n */\nexport function isArray(value: unknown): value is T[] {\n if (Array.isArray && Array.isArray(value)) {\n return true;\n }\n const type = Object.prototype.toString.call(value);\n if (type.slice(0, 7) === '[object' && type.slice(-6) === 'Array]') {\n return true;\n }\n return false;\n}\n\n/**\n * Returns true if `value` is an object (excluding null), else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */\nexport function isObject(value: unknown): value is AnyObject {\n return value !== null && Object.prototype.toString.call(value) === '[object Object]';\n}\n\n/**\n * Returns true if `value` is a finite number, else returns false\n * @param value - The value to test.\n */\nfunction isNumberFinite(value: unknown): value is number {\n return (typeof value === 'number' || value instanceof Number) && isFinite(+value);\n}\nexport {\n isNumberFinite as isFinite,\n};\n\n/**\n * Returns `value` if finite, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is not finite.\n */\nexport function finiteOrDefault(value: unknown, defaultValue: number) {\n return isNumberFinite(value) ? value : defaultValue;\n}\n\n/**\n * Returns `value` if defined, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is undefined.\n */\nexport function valueOrDefault(value: T | undefined, defaultValue: T) {\n return typeof value === 'undefined' ? defaultValue : value;\n}\n\nexport const toPercentage = (value: number | string, dimension: number) =>\n typeof value === 'string' && value.endsWith('%') ?\n parseFloat(value) / 100\n : +value / dimension;\n\nexport const toDimension = (value: number | string, dimension: number) =>\n typeof value === 'string' && value.endsWith('%') ?\n parseFloat(value) / 100 * dimension\n : +value;\n\n/**\n * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the\n * value returned by `fn`. If `fn` is not a function, this method returns undefined.\n * @param fn - The function to call.\n * @param args - The arguments with which `fn` should be called.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n */\nexport function callback R, TA, R>(\n fn: T | undefined,\n args: unknown[],\n thisArg?: TA\n): R | undefined {\n if (fn && typeof fn.call === 'function') {\n return fn.apply(thisArg, args);\n }\n}\n\n/**\n * Note(SB) for performance sake, this method should only be used when loopable type\n * is unknown or in none intensive code (not called often and small loopable). Else\n * it's preferable to use a regular for() loop and save extra function calls.\n * @param loopable - The object or array to be iterated.\n * @param fn - The function to call for each item.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n * @param [reverse] - If true, iterates backward on the loopable.\n */\nexport function each(\n loopable: Record,\n fn: (this: TA, v: T, i: string) => void,\n thisArg?: TA,\n reverse?: boolean\n): void;\nexport function each(\n loopable: T[],\n fn: (this: TA, v: T, i: number) => void,\n thisArg?: TA,\n reverse?: boolean\n): void;\nexport function each(\n loopable: T[] | Record,\n fn: (this: TA, v: T, i: any) => void,\n thisArg?: TA,\n reverse?: boolean\n) {\n let i: number, len: number, keys: string[];\n if (isArray(loopable)) {\n len = loopable.length;\n if (reverse) {\n for (i = len - 1; i >= 0; i--) {\n fn.call(thisArg, loopable[i], i);\n }\n } else {\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[i], i);\n }\n }\n } else if (isObject(loopable)) {\n keys = Object.keys(loopable);\n len = keys.length;\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[keys[i]], keys[i]);\n }\n }\n}\n\n/**\n * Returns true if the `a0` and `a1` arrays have the same content, else returns false.\n * @param a0 - The array to compare\n * @param a1 - The array to compare\n * @private\n */\nexport function _elementsEqual(a0: ActiveDataPoint[], a1: ActiveDataPoint[]) {\n let i: number, ilen: number, v0: ActiveDataPoint, v1: ActiveDataPoint;\n\n if (!a0 || !a1 || a0.length !== a1.length) {\n return false;\n }\n\n for (i = 0, ilen = a0.length; i < ilen; ++i) {\n v0 = a0[i];\n v1 = a1[i];\n\n if (v0.datasetIndex !== v1.datasetIndex || v0.index !== v1.index) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Returns a deep copy of `source` without keeping references on objects and arrays.\n * @param source - The value to clone.\n */\nexport function clone(source: T): T {\n if (isArray(source)) {\n return source.map(clone) as unknown as T;\n }\n\n if (isObject(source)) {\n const target = Object.create(null);\n const keys = Object.keys(source);\n const klen = keys.length;\n let k = 0;\n\n for (; k < klen; ++k) {\n target[keys[k]] = clone(source[keys[k]]);\n }\n\n return target;\n }\n\n return source;\n}\n\nfunction isValidKey(key: string) {\n return ['__proto__', 'prototype', 'constructor'].indexOf(key) === -1;\n}\n\n/**\n * The default merger when Chart.helpers.merge is called without merger option.\n * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback.\n * @private\n */\nexport function _merger(key: string, target: AnyObject, source: AnyObject, options: AnyObject) {\n if (!isValidKey(key)) {\n return;\n }\n\n const tval = target[key];\n const sval = source[key];\n\n if (isObject(tval) && isObject(sval)) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n merge(tval, sval, options);\n } else {\n target[key] = clone(sval);\n }\n}\n\nexport interface MergeOptions {\n merger?: (key: string, target: AnyObject, source: AnyObject, options?: AnyObject) => void;\n}\n\n/**\n * Recursively deep copies `source` properties into `target` with the given `options`.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param target - The target object in which all sources are merged into.\n * @param source - Object(s) to merge into `target`.\n * @param [options] - Merging options:\n * @param [options.merger] - The merge method (key, target, source, options)\n * @returns The `target` object.\n */\nexport function merge(target: T, source: [], options?: MergeOptions): T;\nexport function merge(target: T, source: S1, options?: MergeOptions): T & S1;\nexport function merge(target: T, source: [S1], options?: MergeOptions): T & S1;\nexport function merge(target: T, source: [S1, S2], options?: MergeOptions): T & S1 & S2;\nexport function merge(target: T, source: [S1, S2, S3], options?: MergeOptions): T & S1 & S2 & S3;\nexport function merge(\n target: T,\n source: [S1, S2, S3, S4],\n options?: MergeOptions\n): T & S1 & S2 & S3 & S4;\nexport function merge(target: T, source: AnyObject[], options?: MergeOptions): AnyObject;\nexport function merge(target: T, source: AnyObject[], options?: MergeOptions): AnyObject {\n const sources = isArray(source) ? source : [source];\n const ilen = sources.length;\n\n if (!isObject(target)) {\n return target as AnyObject;\n }\n\n options = options || {};\n const merger = options.merger || _merger;\n let current: AnyObject;\n\n for (let i = 0; i < ilen; ++i) {\n current = sources[i];\n if (!isObject(current)) {\n continue;\n }\n\n const keys = Object.keys(current);\n for (let k = 0, klen = keys.length; k < klen; ++k) {\n merger(keys[k], target, current, options as AnyObject);\n }\n }\n\n return target;\n}\n\n/**\n * Recursively deep copies `source` properties into `target` *only* if not defined in target.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param target - The target object in which all sources are merged into.\n * @param source - Object(s) to merge into `target`.\n * @returns The `target` object.\n */\nexport function mergeIf(target: T, source: []): T;\nexport function mergeIf(target: T, source: S1): T & S1;\nexport function mergeIf(target: T, source: [S1]): T & S1;\nexport function mergeIf(target: T, source: [S1, S2]): T & S1 & S2;\nexport function mergeIf(target: T, source: [S1, S2, S3]): T & S1 & S2 & S3;\nexport function mergeIf(target: T, source: [S1, S2, S3, S4]): T & S1 & S2 & S3 & S4;\nexport function mergeIf(target: T, source: AnyObject[]): AnyObject;\nexport function mergeIf(target: T, source: AnyObject[]): AnyObject {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n return merge(target, source, {merger: _mergerIf});\n}\n\n/**\n * Merges source[key] in target[key] only if target[key] is undefined.\n * @private\n */\nexport function _mergerIf(key: string, target: AnyObject, source: AnyObject) {\n if (!isValidKey(key)) {\n return;\n }\n\n const tval = target[key];\n const sval = source[key];\n\n if (isObject(tval) && isObject(sval)) {\n mergeIf(tval, sval);\n } else if (!Object.prototype.hasOwnProperty.call(target, key)) {\n target[key] = clone(sval);\n }\n}\n\n/**\n * @private\n */\nexport function _deprecated(scope: string, value: unknown, previous: string, current: string) {\n if (value !== undefined) {\n console.warn(scope + ': \"' + previous +\n '\" is deprecated. Please use \"' + current + '\" instead');\n }\n}\n\n// resolveObjectKey resolver cache\nconst keyResolvers = {\n // Chart.helpers.core resolveObjectKey should resolve empty key to root object\n '': v => v,\n // default resolvers\n x: o => o.x,\n y: o => o.y\n};\n\n/**\n * @private\n */\nexport function _splitKey(key: string) {\n const parts = key.split('.');\n const keys: string[] = [];\n let tmp = '';\n for (const part of parts) {\n tmp += part;\n if (tmp.endsWith('\\\\')) {\n tmp = tmp.slice(0, -1) + '.';\n } else {\n keys.push(tmp);\n tmp = '';\n }\n }\n return keys;\n}\n\nfunction _getKeyResolver(key: string) {\n const keys = _splitKey(key);\n return obj => {\n for (const k of keys) {\n if (k === '') {\n // For backward compatibility:\n // Chart.helpers.core resolveObjectKey should break at empty key\n break;\n }\n obj = obj && obj[k];\n }\n return obj;\n };\n}\n\nexport function resolveObjectKey(obj: AnyObject, key: string): any {\n const resolver = keyResolvers[key] || (keyResolvers[key] = _getKeyResolver(key));\n return resolver(obj);\n}\n\n/**\n * @private\n */\nexport function _capitalize(str: string) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n\nexport const defined = (value: unknown) => typeof value !== 'undefined';\n\nexport const isFunction = (value: unknown): value is (...args: any[]) => any => typeof value === 'function';\n\n// Adapted from https://stackoverflow.com/questions/31128855/comparing-ecma6-sets-for-equality#31129384\nexport const setsEqual = (a: Set, b: Set) => {\n if (a.size !== b.size) {\n return false;\n }\n\n for (const item of a) {\n if (!b.has(item)) {\n return false;\n }\n }\n\n return true;\n};\n\n/**\n * @param e - The event\n * @private\n */\nexport function _isClickEvent(e: ChartEvent) {\n return e.type === 'mouseup' || e.type === 'click' || e.type === 'contextmenu';\n}\n","import type {Point} from '../types/geometric.js';\nimport {isFinite as isFiniteNumber} from './helpers.core.js';\n\n/**\n * @alias Chart.helpers.math\n * @namespace\n */\n\nexport const PI = Math.PI;\nexport const TAU = 2 * PI;\nexport const PITAU = TAU + PI;\nexport const INFINITY = Number.POSITIVE_INFINITY;\nexport const RAD_PER_DEG = PI / 180;\nexport const HALF_PI = PI / 2;\nexport const QUARTER_PI = PI / 4;\nexport const TWO_THIRDS_PI = PI * 2 / 3;\n\nexport const log10 = Math.log10;\nexport const sign = Math.sign;\n\nexport function almostEquals(x: number, y: number, epsilon: number) {\n return Math.abs(x - y) < epsilon;\n}\n\n/**\n * Implementation of the nice number algorithm used in determining where axis labels will go\n */\nexport function niceNum(range: number) {\n const roundedRange = Math.round(range);\n range = almostEquals(range, roundedRange, range / 1000) ? roundedRange : range;\n const niceRange = Math.pow(10, Math.floor(log10(range)));\n const fraction = range / niceRange;\n const niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10;\n return niceFraction * niceRange;\n}\n\n/**\n * Returns an array of factors sorted from 1 to sqrt(value)\n * @private\n */\nexport function _factorize(value: number) {\n const result: number[] = [];\n const sqrt = Math.sqrt(value);\n let i: number;\n\n for (i = 1; i < sqrt; i++) {\n if (value % i === 0) {\n result.push(i);\n result.push(value / i);\n }\n }\n if (sqrt === (sqrt | 0)) { // if value is a square number\n result.push(sqrt);\n }\n\n result.sort((a, b) => a - b).pop();\n return result;\n}\n\n/**\n * Verifies that attempting to coerce n to string or number won't throw a TypeError.\n */\nfunction isNonPrimitive(n: unknown) {\n return typeof n === 'symbol' || (typeof n === 'object' && n !== null && !(Symbol.toPrimitive in n || 'toString' in n || 'valueOf' in n));\n}\n\nexport function isNumber(n: unknown): n is number {\n return !isNonPrimitive(n) && !isNaN(parseFloat(n as string)) && isFinite(n as number);\n}\n\nexport function almostWhole(x: number, epsilon: number) {\n const rounded = Math.round(x);\n return ((rounded - epsilon) <= x) && ((rounded + epsilon) >= x);\n}\n\n/**\n * @private\n */\nexport function _setMinAndMaxByKey(\n array: Record[],\n target: { min: number, max: number },\n property: string\n) {\n let i: number, ilen: number, value: number;\n\n for (i = 0, ilen = array.length; i < ilen; i++) {\n value = array[i][property];\n if (!isNaN(value)) {\n target.min = Math.min(target.min, value);\n target.max = Math.max(target.max, value);\n }\n }\n}\n\nexport function toRadians(degrees: number) {\n return degrees * (PI / 180);\n}\n\nexport function toDegrees(radians: number) {\n return radians * (180 / PI);\n}\n\n/**\n * Returns the number of decimal places\n * i.e. the number of digits after the decimal point, of the value of this Number.\n * @param x - A number.\n * @returns The number of decimal places.\n * @private\n */\nexport function _decimalPlaces(x: number) {\n if (!isFiniteNumber(x)) {\n return;\n }\n let e = 1;\n let p = 0;\n while (Math.round(x * e) / e !== x) {\n e *= 10;\n p++;\n }\n return p;\n}\n\n// Gets the angle from vertical upright to the point about a centre.\nexport function getAngleFromPoint(\n centrePoint: Point,\n anglePoint: Point\n) {\n const distanceFromXCenter = anglePoint.x - centrePoint.x;\n const distanceFromYCenter = anglePoint.y - centrePoint.y;\n const radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n\n let angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n\n if (angle < (-0.5 * PI)) {\n angle += TAU; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n }\n\n return {\n angle,\n distance: radialDistanceFromCenter\n };\n}\n\nexport function distanceBetweenPoints(pt1: Point, pt2: Point) {\n return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n}\n\n/**\n * Shortest distance between angles, in either direction.\n * @private\n */\nexport function _angleDiff(a: number, b: number) {\n return (a - b + PITAU) % TAU - PI;\n}\n\n/**\n * Normalize angle to be between 0 and 2*PI\n * @private\n */\nexport function _normalizeAngle(a: number) {\n return (a % TAU + TAU) % TAU;\n}\n\n/**\n * @private\n */\nexport function _angleBetween(angle: number, start: number, end: number, sameAngleIsFullCircle?: boolean) {\n const a = _normalizeAngle(angle);\n const s = _normalizeAngle(start);\n const e = _normalizeAngle(end);\n const angleToStart = _normalizeAngle(s - a);\n const angleToEnd = _normalizeAngle(e - a);\n const startToAngle = _normalizeAngle(a - s);\n const endToAngle = _normalizeAngle(a - e);\n return a === s || a === e || (sameAngleIsFullCircle && s === e)\n || (angleToStart > angleToEnd && startToAngle < endToAngle);\n}\n\n/**\n * Limit `value` between `min` and `max`\n * @param value\n * @param min\n * @param max\n * @private\n */\nexport function _limitValue(value: number, min: number, max: number) {\n return Math.max(min, Math.min(max, value));\n}\n\n/**\n * @param {number} value\n * @private\n */\nexport function _int16Range(value: number) {\n return _limitValue(value, -32768, 32767);\n}\n\n/**\n * @param value\n * @param start\n * @param end\n * @param [epsilon]\n * @private\n */\nexport function _isBetween(value: number, start: number, end: number, epsilon = 1e-6) {\n return value >= Math.min(start, end) - epsilon && value <= Math.max(start, end) + epsilon;\n}\n","import {_capitalize} from './helpers.core.js';\n\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param value - value to find\n * @param cmp\n * @private\n */\nexport function _lookup(\n table: number[],\n value: number,\n cmp?: (value: number) => boolean\n): {lo: number, hi: number};\nexport function _lookup(\n table: T[],\n value: number,\n cmp: (value: number) => boolean\n): {lo: number, hi: number};\nexport function _lookup(\n table: unknown[],\n value: number,\n cmp?: (value: number) => boolean\n) {\n cmp = cmp || ((index) => table[index] < value);\n let hi = table.length - 1;\n let lo = 0;\n let mid: number;\n\n while (hi - lo > 1) {\n mid = (lo + hi) >> 1;\n if (cmp(mid)) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n\n return {lo, hi};\n}\n\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @param last - lookup last index\n * @private\n */\nexport const _lookupByKey = (\n table: Record[],\n key: string,\n value: number,\n last?: boolean\n) =>\n _lookup(table, value, last\n ? index => {\n const ti = table[index][key];\n return ti < value || ti === value && table[index + 1][key] === value;\n }\n : index => table[index][key] < value);\n\n/**\n * Reverse binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @private\n */\nexport const _rlookupByKey = (\n table: Record[],\n key: string,\n value: number\n) =>\n _lookup(table, value, index => table[index][key] >= value);\n\n/**\n * Return subset of `values` between `min` and `max` inclusive.\n * Values are assumed to be in sorted order.\n * @param values - sorted array of values\n * @param min - min value\n * @param max - max value\n */\nexport function _filterBetween(values: number[], min: number, max: number) {\n let start = 0;\n let end = values.length;\n\n while (start < end && values[start] < min) {\n start++;\n }\n while (end > start && values[end - 1] > max) {\n end--;\n }\n\n return start > 0 || end < values.length\n ? values.slice(start, end)\n : values;\n}\n\nconst arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'] as const;\n\nexport interface ArrayListener {\n _onDataPush?(...item: T[]): void;\n _onDataPop?(): void;\n _onDataShift?(): void;\n _onDataSplice?(index: number, deleteCount: number, ...items: T[]): void;\n _onDataUnshift?(...item: T[]): void;\n}\n\n/**\n * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice',\n * 'unshift') and notify the listener AFTER the array has been altered. Listeners are\n * called on the '_onData*' callbacks (e.g. _onDataPush, etc.) with same arguments.\n */\nexport function listenArrayEvents(array: T[], listener: ArrayListener): void;\nexport function listenArrayEvents(array, listener) {\n if (array._chartjs) {\n array._chartjs.listeners.push(listener);\n return;\n }\n\n Object.defineProperty(array, '_chartjs', {\n configurable: true,\n enumerable: false,\n value: {\n listeners: [listener]\n }\n });\n\n arrayEvents.forEach((key) => {\n const method = '_onData' + _capitalize(key);\n const base = array[key];\n\n Object.defineProperty(array, key, {\n configurable: true,\n enumerable: false,\n value(...args) {\n const res = base.apply(this, args);\n\n array._chartjs.listeners.forEach((object) => {\n if (typeof object[method] === 'function') {\n object[method](...args);\n }\n });\n\n return res;\n }\n });\n });\n}\n\n\n/**\n * Removes the given array event listener and cleanup extra attached properties (such as\n * the _chartjs stub and overridden methods) if array doesn't have any more listeners.\n */\nexport function unlistenArrayEvents(array: T[], listener: ArrayListener): void;\nexport function unlistenArrayEvents(array, listener) {\n const stub = array._chartjs;\n if (!stub) {\n return;\n }\n\n const listeners = stub.listeners;\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n\n if (listeners.length > 0) {\n return;\n }\n\n arrayEvents.forEach((key) => {\n delete array[key];\n });\n\n delete array._chartjs;\n}\n\n/**\n * @param items\n */\nexport function _arrayUnique(items: T[]) {\n const set = new Set(items);\n\n if (set.size === items.length) {\n return items;\n }\n\n return Array.from(set);\n}\n","import type {ChartMeta, PointElement} from '../types/index.js';\n\nimport {_limitValue} from './helpers.math.js';\nimport {_lookupByKey} from './helpers.collection.js';\nimport {isNullOrUndef} from './helpers.core.js';\n\nexport function fontString(pixelSize: number, fontStyle: string, fontFamily: string) {\n return fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n}\n\n/**\n* Request animation polyfill\n*/\nexport const requestAnimFrame = (function() {\n if (typeof window === 'undefined') {\n return function(callback) {\n return callback();\n };\n }\n return window.requestAnimationFrame;\n}());\n\n/**\n * Throttles calling `fn` once per animation frame\n * Latest arguments are used on the actual call\n */\nexport function throttled>(\n fn: (...args: TArgs) => void,\n thisArg: any,\n) {\n let argsToUse = [] as TArgs;\n let ticking = false;\n\n return function(...args: TArgs) {\n // Save the args for use later\n argsToUse = args;\n if (!ticking) {\n ticking = true;\n requestAnimFrame.call(window, () => {\n ticking = false;\n fn.apply(thisArg, argsToUse);\n });\n }\n };\n}\n\n/**\n * Debounces calling `fn` for `delay` ms\n */\nexport function debounce>(fn: (...args: TArgs) => void, delay: number) {\n let timeout;\n return function(...args: TArgs) {\n if (delay) {\n clearTimeout(timeout);\n timeout = setTimeout(fn, delay, args);\n } else {\n fn.apply(this, args);\n }\n return delay;\n };\n}\n\n/**\n * Converts 'start' to 'left', 'end' to 'right' and others to 'center'\n * @private\n */\nexport const _toLeftRightCenter = (align: 'start' | 'end' | 'center') => align === 'start' ? 'left' : align === 'end' ? 'right' : 'center';\n\n/**\n * Returns `start`, `end` or `(start + end) / 2` depending on `align`. Defaults to `center`\n * @private\n */\nexport const _alignStartEnd = (align: 'start' | 'end' | 'center', start: number, end: number) => align === 'start' ? start : align === 'end' ? end : (start + end) / 2;\n\n/**\n * Returns `left`, `right` or `(left + right) / 2` depending on `align`. Defaults to `left`\n * @private\n */\nexport const _textX = (align: 'left' | 'right' | 'center', left: number, right: number, rtl: boolean) => {\n const check = rtl ? 'left' : 'right';\n return align === check ? right : align === 'center' ? (left + right) / 2 : left;\n};\n\n/**\n * Return start and count of visible points.\n * @private\n */\nexport function _getStartAndCountOfVisiblePoints(meta: ChartMeta<'line' | 'scatter'>, points: PointElement[], animationsDisabled: boolean) {\n const pointCount = points.length;\n\n let start = 0;\n let count = pointCount;\n\n if (meta._sorted) {\n const {iScale, vScale, _parsed} = meta;\n const spanGaps = meta.dataset ? meta.dataset.options ? meta.dataset.options.spanGaps : null : null;\n const axis = iScale.axis;\n const {min, max, minDefined, maxDefined} = iScale.getUserBounds();\n\n if (minDefined) {\n start = Math.min(\n // @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, axis, min).lo,\n // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? pointCount : _lookupByKey(points, axis, iScale.getPixelForValue(min)).lo);\n if (spanGaps) {\n const distanceToDefinedLo = (_parsed\n .slice(0, start + 1)\n .reverse()\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n start -= Math.max(0, distanceToDefinedLo);\n }\n start = _limitValue(start, 0, pointCount - 1);\n }\n if (maxDefined) {\n let end = Math.max(\n // @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, iScale.axis, max, true).hi + 1,\n // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? 0 : _lookupByKey(points, axis, iScale.getPixelForValue(max), true).hi + 1);\n if (spanGaps) {\n const distanceToDefinedHi = (_parsed\n .slice(end - 1)\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n end += Math.max(0, distanceToDefinedHi);\n }\n count = _limitValue(end, start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n }\n\n return {start, count};\n}\n\n/**\n * Checks if the scale ranges have changed.\n * @param {object} meta - dataset meta.\n * @returns {boolean}\n * @private\n */\nexport function _scaleRangesChanged(meta) {\n const {xScale, yScale, _scaleRanges} = meta;\n const newRanges = {\n xmin: xScale.min,\n xmax: xScale.max,\n ymin: yScale.min,\n ymax: yScale.max\n };\n if (!_scaleRanges) {\n meta._scaleRanges = newRanges;\n return true;\n }\n const changed = _scaleRanges.xmin !== xScale.min\n\t\t|| _scaleRanges.xmax !== xScale.max\n\t\t|| _scaleRanges.ymin !== yScale.min\n\t\t|| _scaleRanges.ymax !== yScale.max;\n\n Object.assign(_scaleRanges, newRanges);\n return changed;\n}\n","import {PI, TAU, HALF_PI} from './helpers.math.js';\n\nconst atEdge = (t: number) => t === 0 || t === 1;\nconst elasticIn = (t: number, s: number, p: number) => -(Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * TAU / p));\nconst elasticOut = (t: number, s: number, p: number) => Math.pow(2, -10 * t) * Math.sin((t - s) * TAU / p) + 1;\n\n/**\n * Easing functions adapted from Robert Penner's easing equations.\n * @namespace Chart.helpers.easing.effects\n * @see http://www.robertpenner.com/easing/\n */\nconst effects = {\n linear: (t: number) => t,\n\n easeInQuad: (t: number) => t * t,\n\n easeOutQuad: (t: number) => -t * (t - 2),\n\n easeInOutQuad: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t\n : -0.5 * ((--t) * (t - 2) - 1),\n\n easeInCubic: (t: number) => t * t * t,\n\n easeOutCubic: (t: number) => (t -= 1) * t * t + 1,\n\n easeInOutCubic: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t\n : 0.5 * ((t -= 2) * t * t + 2),\n\n easeInQuart: (t: number) => t * t * t * t,\n\n easeOutQuart: (t: number) => -((t -= 1) * t * t * t - 1),\n\n easeInOutQuart: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t * t\n : -0.5 * ((t -= 2) * t * t * t - 2),\n\n easeInQuint: (t: number) => t * t * t * t * t,\n\n easeOutQuint: (t: number) => (t -= 1) * t * t * t * t + 1,\n\n easeInOutQuint: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t * t * t\n : 0.5 * ((t -= 2) * t * t * t * t + 2),\n\n easeInSine: (t: number) => -Math.cos(t * HALF_PI) + 1,\n\n easeOutSine: (t: number) => Math.sin(t * HALF_PI),\n\n easeInOutSine: (t: number) => -0.5 * (Math.cos(PI * t) - 1),\n\n easeInExpo: (t: number) => (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)),\n\n easeOutExpo: (t: number) => (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1,\n\n easeInOutExpo: (t: number) => atEdge(t) ? t : t < 0.5\n ? 0.5 * Math.pow(2, 10 * (t * 2 - 1))\n : 0.5 * (-Math.pow(2, -10 * (t * 2 - 1)) + 2),\n\n easeInCirc: (t: number) => (t >= 1) ? t : -(Math.sqrt(1 - t * t) - 1),\n\n easeOutCirc: (t: number) => Math.sqrt(1 - (t -= 1) * t),\n\n easeInOutCirc: (t: number) => ((t /= 0.5) < 1)\n ? -0.5 * (Math.sqrt(1 - t * t) - 1)\n : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1),\n\n easeInElastic: (t: number) => atEdge(t) ? t : elasticIn(t, 0.075, 0.3),\n\n easeOutElastic: (t: number) => atEdge(t) ? t : elasticOut(t, 0.075, 0.3),\n\n easeInOutElastic(t: number) {\n const s = 0.1125;\n const p = 0.45;\n return atEdge(t) ? t :\n t < 0.5\n ? 0.5 * elasticIn(t * 2, s, p)\n : 0.5 + 0.5 * elasticOut(t * 2 - 1, s, p);\n },\n\n easeInBack(t: number) {\n const s = 1.70158;\n return t * t * ((s + 1) * t - s);\n },\n\n easeOutBack(t: number) {\n const s = 1.70158;\n return (t -= 1) * t * ((s + 1) * t + s) + 1;\n },\n\n easeInOutBack(t: number) {\n let s = 1.70158;\n if ((t /= 0.5) < 1) {\n return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s));\n }\n return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);\n },\n\n easeInBounce: (t: number) => 1 - effects.easeOutBounce(1 - t),\n\n easeOutBounce(t: number) {\n const m = 7.5625;\n const d = 2.75;\n if (t < (1 / d)) {\n return m * t * t;\n }\n if (t < (2 / d)) {\n return m * (t -= (1.5 / d)) * t + 0.75;\n }\n if (t < (2.5 / d)) {\n return m * (t -= (2.25 / d)) * t + 0.9375;\n }\n return m * (t -= (2.625 / d)) * t + 0.984375;\n },\n\n easeInOutBounce: (t: number) => (t < 0.5)\n ? effects.easeInBounce(t * 2) * 0.5\n : effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5,\n} as const;\n\nexport type EasingFunction = keyof typeof effects\n\nexport default effects;\n","import {Color} from '@kurkle/color';\n\nexport function isPatternOrGradient(value: unknown): value is CanvasPattern | CanvasGradient {\n if (value && typeof value === 'object') {\n const type = value.toString();\n return type === '[object CanvasPattern]' || type === '[object CanvasGradient]';\n }\n\n return false;\n}\n\nexport function color(value: CanvasGradient): CanvasGradient;\nexport function color(value: CanvasPattern): CanvasPattern;\nexport function color(\n value:\n | string\n | { r: number; g: number; b: number; a: number }\n | [number, number, number]\n | [number, number, number, number]\n): Color;\nexport function color(value) {\n return isPatternOrGradient(value) ? value : new Color(value);\n}\n\nexport function getHoverColor(value: CanvasGradient): CanvasGradient;\nexport function getHoverColor(value: CanvasPattern): CanvasPattern;\nexport function getHoverColor(value: string): string;\nexport function getHoverColor(value) {\n return isPatternOrGradient(value)\n ? value\n : new Color(value).saturate(0.5).darken(0.1).hexString();\n}\n","const numbers = ['x', 'y', 'borderWidth', 'radius', 'tension'];\nconst colors = ['color', 'borderColor', 'backgroundColor'];\n\nexport function applyAnimationsDefaults(defaults) {\n defaults.set('animation', {\n delay: undefined,\n duration: 1000,\n easing: 'easeOutQuart',\n fn: undefined,\n from: undefined,\n loop: undefined,\n to: undefined,\n type: undefined,\n });\n\n defaults.describe('animation', {\n _fallback: false,\n _indexable: false,\n _scriptable: (name) => name !== 'onProgress' && name !== 'onComplete' && name !== 'fn',\n });\n\n defaults.set('animations', {\n colors: {\n type: 'color',\n properties: colors\n },\n numbers: {\n type: 'number',\n properties: numbers\n },\n });\n\n defaults.describe('animations', {\n _fallback: 'animation',\n });\n\n defaults.set('transitions', {\n active: {\n animation: {\n duration: 400\n }\n },\n resize: {\n animation: {\n duration: 0\n }\n },\n show: {\n animations: {\n colors: {\n from: 'transparent'\n },\n visible: {\n type: 'boolean',\n duration: 0 // show immediately\n },\n }\n },\n hide: {\n animations: {\n colors: {\n to: 'transparent'\n },\n visible: {\n type: 'boolean',\n easing: 'linear',\n fn: v => v | 0 // for keeping the dataset visible all the way through the animation\n },\n }\n }\n });\n}\n","export function applyLayoutsDefaults(defaults) {\n defaults.set('layout', {\n autoPadding: true,\n padding: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n }\n });\n}\n","\nconst intlCache = new Map();\n\nfunction getNumberFormat(locale: string, options?: Intl.NumberFormatOptions) {\n options = options || {};\n const cacheKey = locale + JSON.stringify(options);\n let formatter = intlCache.get(cacheKey);\n if (!formatter) {\n formatter = new Intl.NumberFormat(locale, options);\n intlCache.set(cacheKey, formatter);\n }\n return formatter;\n}\n\nexport function formatNumber(num: number, locale: string, options?: Intl.NumberFormatOptions) {\n return getNumberFormat(locale, options).format(num);\n}\n","import {isArray} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {log10} from '../helpers/helpers.math.js';\n\n/**\n * Namespace to hold formatters for different types of ticks\n * @namespace Chart.Ticks.formatters\n */\nconst formatters = {\n /**\n * Formatter for value labels\n * @method Chart.Ticks.formatters.values\n * @param value the value to display\n * @return {string|string[]} the label to display\n */\n values(value) {\n return isArray(value) ? /** @type {string[]} */ (value) : '' + value;\n },\n\n /**\n * Formatter for numeric ticks\n * @method Chart.Ticks.formatters.numeric\n * @param tickValue {number} the value to be formatted\n * @param index {number} the position of the tickValue parameter in the ticks array\n * @param ticks {object[]} the list of ticks being converted\n * @return {string} string representation of the tickValue parameter\n */\n numeric(tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0'; // never show decimal places for 0\n }\n\n const locale = this.chart.options.locale;\n let notation;\n let delta = tickValue; // This is used when there are less than 2 ticks as the tick interval.\n\n if (ticks.length > 1) {\n // all ticks are small or there huge numbers; use scientific notation\n const maxTick = Math.max(Math.abs(ticks[0].value), Math.abs(ticks[ticks.length - 1].value));\n if (maxTick < 1e-4 || maxTick > 1e+15) {\n notation = 'scientific';\n }\n\n delta = calculateDelta(tickValue, ticks);\n }\n\n const logDelta = log10(Math.abs(delta));\n\n // When datasets have values approaching Number.MAX_VALUE, the tick calculations might result in\n // infinity and eventually NaN. Passing NaN for minimumFractionDigits or maximumFractionDigits\n // will make the number formatter throw. So instead we check for isNaN and use a fallback value.\n //\n // toFixed has a max of 20 decimal places\n const numDecimal = isNaN(logDelta) ? 1 : Math.max(Math.min(-1 * Math.floor(logDelta), 20), 0);\n\n const options = {notation, minimumFractionDigits: numDecimal, maximumFractionDigits: numDecimal};\n Object.assign(options, this.options.ticks.format);\n\n return formatNumber(tickValue, locale, options);\n },\n\n\n /**\n * Formatter for logarithmic ticks\n * @method Chart.Ticks.formatters.logarithmic\n * @param tickValue {number} the value to be formatted\n * @param index {number} the position of the tickValue parameter in the ticks array\n * @param ticks {object[]} the list of ticks being converted\n * @return {string} string representation of the tickValue parameter\n */\n logarithmic(tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0';\n }\n const remain = ticks[index].significand || (tickValue / (Math.pow(10, Math.floor(log10(tickValue)))));\n if ([1, 2, 3, 5, 10, 15].includes(remain) || index > 0.8 * ticks.length) {\n return formatters.numeric.call(this, tickValue, index, ticks);\n }\n return '';\n }\n\n};\n\n\nfunction calculateDelta(tickValue, ticks) {\n // Figure out how many digits to show\n // The space between the first two ticks might be smaller than normal spacing\n let delta = ticks.length > 3 ? ticks[2].value - ticks[1].value : ticks[1].value - ticks[0].value;\n\n // If we have a number like 2.5 as the delta, figure out how many decimal places we need\n if (Math.abs(delta) >= 1 && tickValue !== Math.floor(tickValue)) {\n // not an integer\n delta = tickValue - Math.floor(tickValue);\n }\n return delta;\n}\n\n/**\n * Namespace to hold static tick generation functions\n * @namespace Chart.Ticks\n */\nexport default {formatters};\n","import Ticks from './core.ticks.js';\n\nexport function applyScaleDefaults(defaults) {\n defaults.set('scale', {\n display: true,\n offset: false,\n reverse: false,\n beginAtZero: false,\n\n /**\n * Scale boundary strategy (bypassed by min/max time options)\n * - `data`: make sure data are fully visible, ticks outside are removed\n * - `ticks`: make sure ticks are fully visible, data outside are truncated\n * @see https://github.com/chartjs/Chart.js/pull/4556\n * @since 3.0.0\n */\n bounds: 'ticks',\n\n clip: true,\n\n /**\n * Addition grace added to max and reduced from min data value.\n * @since 3.0.0\n */\n grace: 0,\n\n // grid line settings\n grid: {\n display: true,\n lineWidth: 1,\n drawOnChartArea: true,\n drawTicks: true,\n tickLength: 8,\n tickWidth: (_ctx, options) => options.lineWidth,\n tickColor: (_ctx, options) => options.color,\n offset: false,\n },\n\n border: {\n display: true,\n dash: [],\n dashOffset: 0.0,\n width: 1\n },\n\n // scale title\n title: {\n // display property\n display: false,\n\n // actual label\n text: '',\n\n // top/bottom padding\n padding: {\n top: 4,\n bottom: 4\n }\n },\n\n // label settings\n ticks: {\n minRotation: 0,\n maxRotation: 50,\n mirror: false,\n textStrokeWidth: 0,\n textStrokeColor: '',\n padding: 3,\n display: true,\n autoSkip: true,\n autoSkipPadding: 3,\n labelOffset: 0,\n // We pass through arrays to be rendered as multiline labels, we convert Others to strings here.\n callback: Ticks.formatters.values,\n minor: {},\n major: {},\n align: 'center',\n crossAlign: 'near',\n\n showLabelBackdrop: false,\n backdropColor: 'rgba(255, 255, 255, 0.75)',\n backdropPadding: 2,\n }\n });\n\n defaults.route('scale.ticks', 'color', '', 'color');\n defaults.route('scale.grid', 'color', '', 'borderColor');\n defaults.route('scale.border', 'color', '', 'borderColor');\n defaults.route('scale.title', 'color', '', 'color');\n\n defaults.describe('scale', {\n _fallback: false,\n _scriptable: (name) => !name.startsWith('before') && !name.startsWith('after') && name !== 'callback' && name !== 'parser',\n _indexable: (name) => name !== 'borderDash' && name !== 'tickBorderDash' && name !== 'dash',\n });\n\n defaults.describe('scales', {\n _fallback: 'scale',\n });\n\n defaults.describe('scale.ticks', {\n _scriptable: (name) => name !== 'backdropPadding' && name !== 'callback',\n _indexable: (name) => name !== 'backdropPadding',\n });\n}\n","import {getHoverColor} from '../helpers/helpers.color.js';\nimport {isObject, merge, valueOrDefault} from '../helpers/helpers.core.js';\nimport {applyAnimationsDefaults} from './core.animations.defaults.js';\nimport {applyLayoutsDefaults} from './core.layouts.defaults.js';\nimport {applyScaleDefaults} from './core.scale.defaults.js';\n\nexport const overrides = Object.create(null);\nexport const descriptors = Object.create(null);\n\n/**\n * @param {object} node\n * @param {string} key\n * @return {object}\n */\nfunction getScope(node, key) {\n if (!key) {\n return node;\n }\n const keys = key.split('.');\n for (let i = 0, n = keys.length; i < n; ++i) {\n const k = keys[i];\n node = node[k] || (node[k] = Object.create(null));\n }\n return node;\n}\n\nfunction set(root, scope, values) {\n if (typeof scope === 'string') {\n return merge(getScope(root, scope), values);\n }\n return merge(getScope(root, ''), scope);\n}\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is exported for typedoc\n */\nexport class Defaults {\n constructor(_descriptors, _appliers) {\n this.animation = undefined;\n this.backgroundColor = 'rgba(0,0,0,0.1)';\n this.borderColor = 'rgba(0,0,0,0.1)';\n this.color = '#666';\n this.datasets = {};\n this.devicePixelRatio = (context) => context.chart.platform.getDevicePixelRatio();\n this.elements = {};\n this.events = [\n 'mousemove',\n 'mouseout',\n 'click',\n 'touchstart',\n 'touchmove'\n ];\n this.font = {\n family: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n size: 12,\n style: 'normal',\n lineHeight: 1.2,\n weight: null\n };\n this.hover = {};\n this.hoverBackgroundColor = (ctx, options) => getHoverColor(options.backgroundColor);\n this.hoverBorderColor = (ctx, options) => getHoverColor(options.borderColor);\n this.hoverColor = (ctx, options) => getHoverColor(options.color);\n this.indexAxis = 'x';\n this.interaction = {\n mode: 'nearest',\n intersect: true,\n includeInvisible: false\n };\n this.maintainAspectRatio = true;\n this.onHover = null;\n this.onClick = null;\n this.parsing = true;\n this.plugins = {};\n this.responsive = true;\n this.scale = undefined;\n this.scales = {};\n this.showLine = true;\n this.drawActiveElementsOnTop = true;\n\n this.describe(_descriptors);\n this.apply(_appliers);\n }\n\n /**\n\t * @param {string|object} scope\n\t * @param {object} [values]\n\t */\n set(scope, values) {\n return set(this, scope, values);\n }\n\n /**\n\t * @param {string} scope\n\t */\n get(scope) {\n return getScope(this, scope);\n }\n\n /**\n\t * @param {string|object} scope\n\t * @param {object} [values]\n\t */\n describe(scope, values) {\n return set(descriptors, scope, values);\n }\n\n override(scope, values) {\n return set(overrides, scope, values);\n }\n\n /**\n\t * Routes the named defaults to fallback to another scope/name.\n\t * This routing is useful when those target values, like defaults.color, are changed runtime.\n\t * If the values would be copied, the runtime change would not take effect. By routing, the\n\t * fallback is evaluated at each access, so its always up to date.\n\t *\n\t * Example:\n\t *\n\t * \tdefaults.route('elements.arc', 'backgroundColor', '', 'color')\n\t * - reads the backgroundColor from defaults.color when undefined locally\n\t *\n\t * @param {string} scope Scope this route applies to.\n\t * @param {string} name Property name that should be routed to different namespace when not defined here.\n\t * @param {string} targetScope The namespace where those properties should be routed to.\n\t * Empty string ('') is the root of defaults.\n\t * @param {string} targetName The target name in the target scope the property should be routed to.\n\t */\n route(scope, name, targetScope, targetName) {\n const scopeObject = getScope(this, scope);\n const targetScopeObject = getScope(this, targetScope);\n const privateName = '_' + name;\n\n Object.defineProperties(scopeObject, {\n // A private property is defined to hold the actual value, when this property is set in its scope (set in the setter)\n [privateName]: {\n value: scopeObject[name],\n writable: true\n },\n // The actual property is defined as getter/setter so we can do the routing when value is not locally set.\n [name]: {\n enumerable: true,\n get() {\n const local = this[privateName];\n const target = targetScopeObject[targetName];\n if (isObject(local)) {\n return Object.assign({}, target, local);\n }\n return valueOrDefault(local, target);\n },\n set(value) {\n this[privateName] = value;\n }\n }\n });\n }\n\n apply(appliers) {\n appliers.forEach((apply) => apply(this));\n }\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Defaults({\n _scriptable: (name) => !name.startsWith('on'),\n _indexable: (name) => name !== 'events',\n hover: {\n _fallback: 'interaction'\n },\n interaction: {\n _scriptable: false,\n _indexable: false,\n }\n}, [applyAnimationsDefaults, applyLayoutsDefaults, applyScaleDefaults]);\n","import type {\n Chart,\n Point,\n FontSpec,\n CanvasFontSpec,\n PointStyle,\n RenderTextOpts,\n BackdropOptions\n} from '../types/index.js';\nimport type {\n TRBL,\n SplinePoint,\n RoundedRect,\n TRBLCorners\n} from '../types/geometric.js';\nimport {isArray, isNullOrUndef} from './helpers.core.js';\nimport {PI, TAU, HALF_PI, QUARTER_PI, TWO_THIRDS_PI, RAD_PER_DEG} from './helpers.math.js';\n\n/**\n * Converts the given font object into a CSS font string.\n * @param font - A font object.\n * @return The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font\n * @private\n */\nexport function toFontString(font: FontSpec) {\n if (!font || isNullOrUndef(font.size) || isNullOrUndef(font.family)) {\n return null;\n }\n\n return (font.style ? font.style + ' ' : '')\n\t\t+ (font.weight ? font.weight + ' ' : '')\n\t\t+ font.size + 'px '\n\t\t+ font.family;\n}\n\n/**\n * @private\n */\nexport function _measureText(\n ctx: CanvasRenderingContext2D,\n data: Record,\n gc: string[],\n longest: number,\n string: string\n) {\n let textWidth = data[string];\n if (!textWidth) {\n textWidth = data[string] = ctx.measureText(string).width;\n gc.push(string);\n }\n if (textWidth > longest) {\n longest = textWidth;\n }\n return longest;\n}\n\ntype Thing = string | undefined | null\ntype Things = (Thing | Thing[])[]\n\n/**\n * @private\n */\n// eslint-disable-next-line complexity\nexport function _longestText(\n ctx: CanvasRenderingContext2D,\n font: string,\n arrayOfThings: Things,\n cache?: {data?: Record, garbageCollect?: string[], font?: string}\n) {\n cache = cache || {};\n let data = cache.data = cache.data || {};\n let gc = cache.garbageCollect = cache.garbageCollect || [];\n\n if (cache.font !== font) {\n data = cache.data = {};\n gc = cache.garbageCollect = [];\n cache.font = font;\n }\n\n ctx.save();\n\n ctx.font = font;\n let longest = 0;\n const ilen = arrayOfThings.length;\n let i: number, j: number, jlen: number, thing: Thing | Thing[], nestedThing: Thing | Thing[];\n for (i = 0; i < ilen; i++) {\n thing = arrayOfThings[i];\n\n // Undefined strings and arrays should not be measured\n if (thing !== undefined && thing !== null && !isArray(thing)) {\n longest = _measureText(ctx, data, gc, longest, thing);\n } else if (isArray(thing)) {\n // if it is an array lets measure each element\n // to do maybe simplify this function a bit so we can do this more recursively?\n for (j = 0, jlen = thing.length; j < jlen; j++) {\n nestedThing = thing[j];\n // Undefined strings and arrays should not be measured\n if (nestedThing !== undefined && nestedThing !== null && !isArray(nestedThing)) {\n longest = _measureText(ctx, data, gc, longest, nestedThing);\n }\n }\n }\n }\n\n ctx.restore();\n\n const gcLen = gc.length / 2;\n if (gcLen > arrayOfThings.length) {\n for (i = 0; i < gcLen; i++) {\n delete data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n return longest;\n}\n\n/**\n * Returns the aligned pixel value to avoid anti-aliasing blur\n * @param chart - The chart instance.\n * @param pixel - A pixel value.\n * @param width - The width of the element.\n * @returns The aligned pixel value.\n * @private\n */\nexport function _alignPixel(chart: Chart, pixel: number, width: number) {\n const devicePixelRatio = chart.currentDevicePixelRatio;\n const halfWidth = width !== 0 ? Math.max(width / 2, 0.5) : 0;\n return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth;\n}\n\n/**\n * Clears the entire canvas.\n */\nexport function clearCanvas(canvas?: HTMLCanvasElement, ctx?: CanvasRenderingContext2D) {\n if (!ctx && !canvas) {\n return;\n }\n\n ctx = ctx || canvas.getContext('2d');\n\n ctx.save();\n // canvas.width and canvas.height do not consider the canvas transform,\n // while clearRect does\n ctx.resetTransform();\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.restore();\n}\n\nexport interface DrawPointOptions {\n pointStyle: PointStyle;\n rotation?: number;\n radius: number;\n borderWidth: number;\n}\n\nexport function drawPoint(\n ctx: CanvasRenderingContext2D,\n options: DrawPointOptions,\n x: number,\n y: number\n) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n drawPointLegend(ctx, options, x, y, null);\n}\n\n// eslint-disable-next-line complexity\nexport function drawPointLegend(\n ctx: CanvasRenderingContext2D,\n options: DrawPointOptions,\n x: number,\n y: number,\n w: number\n) {\n let type: string, xOffset: number, yOffset: number, size: number, cornerRadius: number, width: number, xOffsetW: number, yOffsetW: number;\n const style = options.pointStyle;\n const rotation = options.rotation;\n const radius = options.radius;\n let rad = (rotation || 0) * RAD_PER_DEG;\n\n if (style && typeof style === 'object') {\n type = style.toString();\n if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate(rad);\n ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);\n ctx.restore();\n return;\n }\n }\n\n if (isNaN(radius) || radius <= 0) {\n return;\n }\n\n ctx.beginPath();\n\n switch (style) {\n // Default includes circle\n default:\n if (w) {\n ctx.ellipse(x, y, w / 2, radius, 0, 0, TAU);\n } else {\n ctx.arc(x, y, radius, 0, TAU);\n }\n ctx.closePath();\n break;\n case 'triangle':\n width = w ? w / 2 : radius;\n ctx.moveTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n ctx.closePath();\n break;\n case 'rectRounded':\n // NOTE: the rounded rect implementation changed to use `arc` instead of\n // `quadraticCurveTo` since it generates better results when rect is\n // almost a circle. 0.516 (instead of 0.5) produces results with visually\n // closer proportion to the previous impl and it is inscribed in the\n // circle with `radius`. For more details, see the following PRs:\n // https://github.com/chartjs/Chart.js/issues/5597\n // https://github.com/chartjs/Chart.js/issues/5858\n cornerRadius = radius * 0.516;\n size = radius - cornerRadius;\n xOffset = Math.cos(rad + QUARTER_PI) * size;\n xOffsetW = Math.cos(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n yOffset = Math.sin(rad + QUARTER_PI) * size;\n yOffsetW = Math.sin(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n ctx.arc(x - xOffsetW, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\n ctx.arc(x + yOffsetW, y - xOffset, cornerRadius, rad - HALF_PI, rad);\n ctx.arc(x + xOffsetW, y + yOffset, cornerRadius, rad, rad + HALF_PI);\n ctx.arc(x - yOffsetW, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);\n ctx.closePath();\n break;\n case 'rect':\n if (!rotation) {\n size = Math.SQRT1_2 * radius;\n width = w ? w / 2 : size;\n ctx.rect(x - width, y - size, 2 * width, 2 * size);\n break;\n }\n rad += QUARTER_PI;\n /* falls through */\n case 'rectRot':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n ctx.closePath();\n break;\n case 'crossRot':\n rad += QUARTER_PI;\n /* falls through */\n case 'cross':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'star':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n rad += QUARTER_PI;\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'line':\n xOffset = w ? w / 2 : Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n break;\n case 'dash':\n ctx.moveTo(x, y);\n ctx.lineTo(x + Math.cos(rad) * (w ? w / 2 : radius), y + Math.sin(rad) * radius);\n break;\n case false:\n ctx.closePath();\n break;\n }\n\n ctx.fill();\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n}\n\n/**\n * Returns true if the point is inside the rectangle\n * @param point - The point to test\n * @param area - The rectangle\n * @param margin - allowed margin\n * @private\n */\nexport function _isPointInArea(\n point: Point,\n area: TRBL,\n margin?: number\n) {\n margin = margin || 0.5; // margin - default is to match rounded decimals\n\n return !area || (point && point.x > area.left - margin && point.x < area.right + margin &&\n\t\tpoint.y > area.top - margin && point.y < area.bottom + margin);\n}\n\nexport function clipArea(ctx: CanvasRenderingContext2D, area: TRBL) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n ctx.clip();\n}\n\nexport function unclipArea(ctx: CanvasRenderingContext2D) {\n ctx.restore();\n}\n\n/**\n * @private\n */\nexport function _steppedLineTo(\n ctx: CanvasRenderingContext2D,\n previous: Point,\n target: Point,\n flip?: boolean,\n mode?: string\n) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n if (mode === 'middle') {\n const midpoint = (previous.x + target.x) / 2.0;\n ctx.lineTo(midpoint, previous.y);\n ctx.lineTo(midpoint, target.y);\n } else if (mode === 'after' !== !!flip) {\n ctx.lineTo(previous.x, target.y);\n } else {\n ctx.lineTo(target.x, previous.y);\n }\n ctx.lineTo(target.x, target.y);\n}\n\n/**\n * @private\n */\nexport function _bezierCurveTo(\n ctx: CanvasRenderingContext2D,\n previous: SplinePoint,\n target: SplinePoint,\n flip?: boolean\n) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n ctx.bezierCurveTo(\n flip ? previous.cp1x : previous.cp2x,\n flip ? previous.cp1y : previous.cp2y,\n flip ? target.cp2x : target.cp1x,\n flip ? target.cp2y : target.cp1y,\n target.x,\n target.y);\n}\n\nfunction setRenderOpts(ctx: CanvasRenderingContext2D, opts: RenderTextOpts) {\n if (opts.translation) {\n ctx.translate(opts.translation[0], opts.translation[1]);\n }\n\n if (!isNullOrUndef(opts.rotation)) {\n ctx.rotate(opts.rotation);\n }\n\n if (opts.color) {\n ctx.fillStyle = opts.color;\n }\n\n if (opts.textAlign) {\n ctx.textAlign = opts.textAlign;\n }\n\n if (opts.textBaseline) {\n ctx.textBaseline = opts.textBaseline;\n }\n}\n\nfunction decorateText(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n line: string,\n opts: RenderTextOpts\n) {\n if (opts.strikethrough || opts.underline) {\n /**\n * Now that IE11 support has been dropped, we can use more\n * of the TextMetrics object. The actual bounding boxes\n * are unflagged in Chrome, Firefox, Edge, and Safari so they\n * can be safely used.\n * See https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics#Browser_compatibility\n */\n const metrics = ctx.measureText(line);\n const left = x - metrics.actualBoundingBoxLeft;\n const right = x + metrics.actualBoundingBoxRight;\n const top = y - metrics.actualBoundingBoxAscent;\n const bottom = y + metrics.actualBoundingBoxDescent;\n const yDecoration = opts.strikethrough ? (top + bottom) / 2 : bottom;\n\n ctx.strokeStyle = ctx.fillStyle;\n ctx.beginPath();\n ctx.lineWidth = opts.decorationWidth || 2;\n ctx.moveTo(left, yDecoration);\n ctx.lineTo(right, yDecoration);\n ctx.stroke();\n }\n}\n\nfunction drawBackdrop(ctx: CanvasRenderingContext2D, opts: BackdropOptions) {\n const oldColor = ctx.fillStyle;\n\n ctx.fillStyle = opts.color as string;\n ctx.fillRect(opts.left, opts.top, opts.width, opts.height);\n ctx.fillStyle = oldColor;\n}\n\n/**\n * Render text onto the canvas\n */\nexport function renderText(\n ctx: CanvasRenderingContext2D,\n text: string | string[],\n x: number,\n y: number,\n font: CanvasFontSpec,\n opts: RenderTextOpts = {}\n) {\n const lines = isArray(text) ? text : [text];\n const stroke = opts.strokeWidth > 0 && opts.strokeColor !== '';\n let i: number, line: string;\n\n ctx.save();\n ctx.font = font.string;\n setRenderOpts(ctx, opts);\n\n for (i = 0; i < lines.length; ++i) {\n line = lines[i];\n\n if (opts.backdrop) {\n drawBackdrop(ctx, opts.backdrop);\n }\n\n if (stroke) {\n if (opts.strokeColor) {\n ctx.strokeStyle = opts.strokeColor;\n }\n\n if (!isNullOrUndef(opts.strokeWidth)) {\n ctx.lineWidth = opts.strokeWidth;\n }\n\n ctx.strokeText(line, x, y, opts.maxWidth);\n }\n\n ctx.fillText(line, x, y, opts.maxWidth);\n decorateText(ctx, x, y, line, opts);\n\n y += Number(font.lineHeight);\n }\n\n ctx.restore();\n}\n\n/**\n * Add a path of a rectangle with rounded corners to the current sub-path\n * @param ctx - Context\n * @param rect - Bounding rect\n */\nexport function addRoundedRectPath(\n ctx: CanvasRenderingContext2D,\n rect: RoundedRect & { radius: TRBLCorners }\n) {\n const {x, y, w, h, radius} = rect;\n\n // top left arc\n ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, 1.5 * PI, PI, true);\n\n // line from top left to bottom left\n ctx.lineTo(x, y + h - radius.bottomLeft);\n\n // bottom left arc\n ctx.arc(x + radius.bottomLeft, y + h - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true);\n\n // line from bottom left to bottom right\n ctx.lineTo(x + w - radius.bottomRight, y + h);\n\n // bottom right arc\n ctx.arc(x + w - radius.bottomRight, y + h - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true);\n\n // line from bottom right to top right\n ctx.lineTo(x + w, y + radius.topRight);\n\n // top right arc\n ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true);\n\n // line from top right to top left\n ctx.lineTo(x + radius.topLeft, y);\n}\n","import defaults from '../core/core.defaults.js';\nimport {isArray, isObject, toDimension, valueOrDefault} from './helpers.core.js';\nimport {toFontString} from './helpers.canvas.js';\nimport type {ChartArea, FontSpec, Point} from '../types/index.js';\nimport type {TRBL, TRBLCorners} from '../types/geometric.js';\n\nconst LINE_HEIGHT = /^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/;\nconst FONT_STYLE = /^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;\n\n/**\n * @alias Chart.helpers.options\n * @namespace\n */\n/**\n * Converts the given line height `value` in pixels for a specific font `size`.\n * @param value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').\n * @param size - The font size (in pixels) used to resolve relative `value`.\n * @returns The effective line height in pixels (size * 1.2 if value is invalid).\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\n * @since 2.7.0\n */\nexport function toLineHeight(value: number | string, size: number): number {\n const matches = ('' + value).match(LINE_HEIGHT);\n if (!matches || matches[1] === 'normal') {\n return size * 1.2;\n }\n\n value = +matches[2];\n\n switch (matches[3]) {\n case 'px':\n return value;\n case '%':\n value /= 100;\n break;\n default:\n break;\n }\n\n return size * value;\n}\n\nconst numberOrZero = (v: unknown) => +v || 0;\n\n/**\n * @param value\n * @param props\n */\nexport function _readValueToProps(value: number | Record, props: K[]): Record;\nexport function _readValueToProps(value: number | Record, props: Record): Record;\nexport function _readValueToProps(value: number | Record, props: string[] | Record) {\n const ret = {};\n const objProps = isObject(props);\n const keys = objProps ? Object.keys(props) : props;\n const read = isObject(value)\n ? objProps\n ? prop => valueOrDefault(value[prop], value[props[prop]])\n : prop => value[prop]\n : () => value;\n\n for (const prop of keys) {\n ret[prop] = numberOrZero(read(prop));\n }\n return ret;\n}\n\n/**\n * Converts the given value into a TRBL object.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left)\n * @since 3.0.0\n */\nexport function toTRBL(value: number | TRBL | Point) {\n return _readValueToProps(value, {top: 'y', right: 'x', bottom: 'y', left: 'x'});\n}\n\n/**\n * Converts the given value into a TRBL corners object (similar with css border-radius).\n * @param value - If a number, set the value to all TRBL corner components,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * @returns The TRBL corner values (topLeft, topRight, bottomLeft, bottomRight)\n * @since 3.0.0\n */\nexport function toTRBLCorners(value: number | TRBLCorners) {\n return _readValueToProps(value, ['topLeft', 'topRight', 'bottomLeft', 'bottomRight']);\n}\n\n/**\n * Converts the given value into a padding object with pre-computed width/height.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left, width, height)\n * @since 2.7.0\n */\nexport function toPadding(value?: number | TRBL): ChartArea {\n const obj = toTRBL(value) as ChartArea;\n\n obj.width = obj.left + obj.right;\n obj.height = obj.top + obj.bottom;\n\n return obj;\n}\n\n/**\n * Parses font options and returns the font object.\n * @param options - A object that contains font options to be parsed.\n * @param fallback - A object that contains fallback font options.\n * @return The font object.\n * @private\n */\n\nexport function toFont(options: Partial, fallback?: Partial) {\n options = options || {};\n fallback = fallback || defaults.font as FontSpec;\n\n let size = valueOrDefault(options.size, fallback.size);\n\n if (typeof size === 'string') {\n size = parseInt(size, 10);\n }\n let style = valueOrDefault(options.style, fallback.style);\n if (style && !('' + style).match(FONT_STYLE)) {\n console.warn('Invalid font style specified: \"' + style + '\"');\n style = undefined;\n }\n\n const font = {\n family: valueOrDefault(options.family, fallback.family),\n lineHeight: toLineHeight(valueOrDefault(options.lineHeight, fallback.lineHeight), size),\n size,\n style,\n weight: valueOrDefault(options.weight, fallback.weight),\n string: ''\n };\n\n font.string = toFontString(font);\n return font;\n}\n\n/**\n * Evaluates the given `inputs` sequentially and returns the first defined value.\n * @param inputs - An array of values, falling back to the last value.\n * @param context - If defined and the current value is a function, the value\n * is called with `context` as first argument and the result becomes the new input.\n * @param index - If defined and the current value is an array, the value\n * at `index` become the new input.\n * @param info - object to return information about resolution in\n * @param info.cacheable - Will be set to `false` if option is not cacheable.\n * @since 2.7.0\n */\nexport function resolve(inputs: Array, context?: object, index?: number, info?: { cacheable: boolean }) {\n let cacheable = true;\n let i: number, ilen: number, value: unknown;\n\n for (i = 0, ilen = inputs.length; i < ilen; ++i) {\n value = inputs[i];\n if (value === undefined) {\n continue;\n }\n if (context !== undefined && typeof value === 'function') {\n value = value(context);\n cacheable = false;\n }\n if (index !== undefined && isArray(value)) {\n value = value[index % value.length];\n cacheable = false;\n }\n if (value !== undefined) {\n if (info && !cacheable) {\n info.cacheable = false;\n }\n return value;\n }\n }\n}\n\n/**\n * @param minmax\n * @param grace\n * @param beginAtZero\n * @private\n */\nexport function _addGrace(minmax: { min: number; max: number; }, grace: number | string, beginAtZero: boolean) {\n const {min, max} = minmax;\n const change = toDimension(grace, (max - min) / 2);\n const keepZero = (value: number, add: number) => beginAtZero && value === 0 ? 0 : value + add;\n return {\n min: keepZero(min, -Math.abs(change)),\n max: keepZero(max, change)\n };\n}\n\n/**\n * Create a context inheriting parentContext\n * @param parentContext\n * @param context\n * @returns\n */\nexport function createContext(parentContext: null, context: T): T;\nexport function createContext(parentContext: P, context: T): P & T;\nexport function createContext(parentContext: object, context: object) {\n return Object.assign(Object.create(parentContext), context);\n}\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport type {AnyObject} from '../types/basic.js';\nimport type {ChartMeta} from '../types/index.js';\nimport type {\n ResolverObjectKey,\n ResolverCache,\n ResolverProxy,\n DescriptorDefaults,\n Descriptor,\n ContextCache,\n ContextProxy\n} from './helpers.config.types.js';\nimport {isArray, isFunction, isObject, resolveObjectKey, _capitalize} from './helpers.core.js';\n\nexport * from './helpers.config.types.js';\n\n/**\n * Creates a Proxy for resolving raw values for options.\n * @param scopes - The option scopes to look for values, in resolution order\n * @param prefixes - The prefixes for values, in resolution order.\n * @param rootScopes - The root option scopes\n * @param fallback - Parent scopes fallback\n * @param getTarget - callback for getting the target for changed values\n * @returns Proxy\n * @private\n */\nexport function _createResolver<\n T extends AnyObject[] = AnyObject[],\n R extends AnyObject[] = T\n>(\n scopes: T,\n prefixes = [''],\n rootScopes?: R,\n fallback?: ResolverObjectKey,\n getTarget = () => scopes[0]\n) {\n const finalRootScopes = rootScopes || scopes;\n if (typeof fallback === 'undefined') {\n fallback = _resolve('_fallback', scopes);\n }\n const cache: ResolverCache = {\n [Symbol.toStringTag]: 'Object',\n _cacheable: true,\n _scopes: scopes,\n _rootScopes: finalRootScopes,\n _fallback: fallback,\n _getTarget: getTarget,\n override: (scope: AnyObject) => _createResolver([scope, ...scopes], prefixes, finalRootScopes, fallback),\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */\n deleteProperty(target, prop: string) {\n delete target[prop]; // remove from cache\n delete target._keys; // remove cached keys\n delete scopes[0][prop]; // remove from top level scope\n return true;\n },\n\n /**\n * A trap for getting property values.\n */\n get(target, prop: string) {\n return _cached(target, prop,\n () => _resolveWithPrefixes(prop, prefixes, scopes, target));\n },\n\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */\n getOwnPropertyDescriptor(target, prop) {\n return Reflect.getOwnPropertyDescriptor(target._scopes[0], prop);\n },\n\n /**\n * A trap for Object.getPrototypeOf.\n */\n getPrototypeOf() {\n return Reflect.getPrototypeOf(scopes[0]);\n },\n\n /**\n * A trap for the in operator.\n */\n has(target, prop: string) {\n return getKeysFromAllScopes(target).includes(prop);\n },\n\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */\n ownKeys(target) {\n return getKeysFromAllScopes(target);\n },\n\n /**\n * A trap for setting property values.\n */\n set(target, prop: string, value) {\n const storage = target._storage || (target._storage = getTarget());\n target[prop] = storage[prop] = value; // set to top level scope + cache\n delete target._keys; // remove cached keys\n return true;\n }\n }) as ResolverProxy;\n}\n\n/**\n * Returns an Proxy for resolving option values with context.\n * @param proxy - The Proxy returned by `_createResolver`\n * @param context - Context object for scriptable/indexable options\n * @param subProxy - The proxy provided for scriptable options\n * @param descriptorDefaults - Defaults for descriptors\n * @private\n */\nexport function _attachContext<\n T extends AnyObject[] = AnyObject[],\n R extends AnyObject[] = T\n>(\n proxy: ResolverProxy,\n context: AnyObject,\n subProxy?: ResolverProxy,\n descriptorDefaults?: DescriptorDefaults\n) {\n const cache: ContextCache = {\n _cacheable: false,\n _proxy: proxy,\n _context: context,\n _subProxy: subProxy,\n _stack: new Set(),\n _descriptors: _descriptors(proxy, descriptorDefaults),\n setContext: (ctx: AnyObject) => _attachContext(proxy, ctx, subProxy, descriptorDefaults),\n override: (scope: AnyObject) => _attachContext(proxy.override(scope), context, subProxy, descriptorDefaults)\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */\n deleteProperty(target, prop) {\n delete target[prop]; // remove from cache\n delete proxy[prop]; // remove from proxy\n return true;\n },\n\n /**\n * A trap for getting property values.\n */\n get(target, prop: string, receiver) {\n return _cached(target, prop,\n () => _resolveWithContext(target, prop, receiver));\n },\n\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */\n getOwnPropertyDescriptor(target, prop) {\n return target._descriptors.allKeys\n ? Reflect.has(proxy, prop) ? {enumerable: true, configurable: true} : undefined\n : Reflect.getOwnPropertyDescriptor(proxy, prop);\n },\n\n /**\n * A trap for Object.getPrototypeOf.\n */\n getPrototypeOf() {\n return Reflect.getPrototypeOf(proxy);\n },\n\n /**\n * A trap for the in operator.\n */\n has(target, prop) {\n return Reflect.has(proxy, prop);\n },\n\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */\n ownKeys() {\n return Reflect.ownKeys(proxy);\n },\n\n /**\n * A trap for setting property values.\n */\n set(target, prop, value) {\n proxy[prop] = value; // set to proxy\n delete target[prop]; // remove from cache\n return true;\n }\n }) as ContextProxy;\n}\n\n/**\n * @private\n */\nexport function _descriptors(\n proxy: ResolverCache,\n defaults: DescriptorDefaults = {scriptable: true, indexable: true}\n): Descriptor {\n const {_scriptable = defaults.scriptable, _indexable = defaults.indexable, _allKeys = defaults.allKeys} = proxy;\n return {\n allKeys: _allKeys,\n scriptable: _scriptable,\n indexable: _indexable,\n isScriptable: isFunction(_scriptable) ? _scriptable : () => _scriptable,\n isIndexable: isFunction(_indexable) ? _indexable : () => _indexable\n };\n}\n\nconst readKey = (prefix: string, name: string) => prefix ? prefix + _capitalize(name) : name;\nconst needsSubResolver = (prop: string, value: unknown) => isObject(value) && prop !== 'adapters' &&\n (Object.getPrototypeOf(value) === null || value.constructor === Object);\n\nfunction _cached(\n target: AnyObject,\n prop: string,\n resolve: () => unknown\n) {\n if (Object.prototype.hasOwnProperty.call(target, prop) || prop === 'constructor') {\n return target[prop];\n }\n\n const value = resolve();\n // cache the resolved value\n target[prop] = value;\n return value;\n}\n\nfunction _resolveWithContext(\n target: ContextCache,\n prop: string,\n receiver: AnyObject\n) {\n const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n let value = _proxy[prop]; // resolve from proxy\n\n // resolve with context\n if (isFunction(value) && descriptors.isScriptable(prop)) {\n value = _resolveScriptable(prop, value, target, receiver);\n }\n if (isArray(value) && value.length) {\n value = _resolveArray(prop, value, target, descriptors.isIndexable);\n }\n if (needsSubResolver(prop, value)) {\n // if the resolved value is an object, create a sub resolver for it\n value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors);\n }\n return value;\n}\n\nfunction _resolveScriptable(\n prop: string,\n getValue: (ctx: AnyObject, sub: AnyObject) => unknown,\n target: ContextCache,\n receiver: AnyObject\n) {\n const {_proxy, _context, _subProxy, _stack} = target;\n if (_stack.has(prop)) {\n throw new Error('Recursion detected: ' + Array.from(_stack).join('->') + '->' + prop);\n }\n _stack.add(prop);\n let value = getValue(_context, _subProxy || receiver);\n _stack.delete(prop);\n if (needsSubResolver(prop, value)) {\n // When scriptable option returns an object, create a resolver on that.\n value = createSubResolver(_proxy._scopes, _proxy, prop, value);\n }\n return value;\n}\n\nfunction _resolveArray(\n prop: string,\n value: unknown[],\n target: ContextCache,\n isIndexable: (key: string) => boolean\n) {\n const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n\n if (typeof _context.index !== 'undefined' && isIndexable(prop)) {\n return value[_context.index % value.length];\n } else if (isObject(value[0])) {\n // Array of objects, return array or resolvers\n const arr = value;\n const scopes = _proxy._scopes.filter(s => s !== arr);\n value = [];\n for (const item of arr) {\n const resolver = createSubResolver(scopes, _proxy, prop, item);\n value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop], descriptors));\n }\n }\n return value;\n}\n\nfunction resolveFallback(\n fallback: ResolverObjectKey | ((prop: ResolverObjectKey, value: unknown) => ResolverObjectKey),\n prop: ResolverObjectKey,\n value: unknown\n) {\n return isFunction(fallback) ? fallback(prop, value) : fallback;\n}\n\nconst getScope = (key: ResolverObjectKey, parent: AnyObject) => key === true ? parent\n : typeof key === 'string' ? resolveObjectKey(parent, key) : undefined;\n\nfunction addScopes(\n set: Set,\n parentScopes: AnyObject[],\n key: ResolverObjectKey,\n parentFallback: ResolverObjectKey,\n value: unknown\n) {\n for (const parent of parentScopes) {\n const scope = getScope(key, parent);\n if (scope) {\n set.add(scope);\n const fallback = resolveFallback(scope._fallback, key, value);\n if (typeof fallback !== 'undefined' && fallback !== key && fallback !== parentFallback) {\n // When we reach the descriptor that defines a new _fallback, return that.\n // The fallback will resume to that new scope.\n return fallback;\n }\n } else if (scope === false && typeof parentFallback !== 'undefined' && key !== parentFallback) {\n // Fallback to `false` results to `false`, when falling back to different key.\n // For example `interaction` from `hover` or `plugins.tooltip` and `animation` from `animations`\n return null;\n }\n }\n return false;\n}\n\nfunction createSubResolver(\n parentScopes: AnyObject[],\n resolver: ResolverCache,\n prop: ResolverObjectKey,\n value: unknown\n) {\n const rootScopes = resolver._rootScopes;\n const fallback = resolveFallback(resolver._fallback, prop, value);\n const allScopes = [...parentScopes, ...rootScopes];\n const set = new Set();\n set.add(value);\n let key = addScopesFromKey(set, allScopes, prop, fallback || prop, value);\n if (key === null) {\n return false;\n }\n if (typeof fallback !== 'undefined' && fallback !== prop) {\n key = addScopesFromKey(set, allScopes, fallback, key, value);\n if (key === null) {\n return false;\n }\n }\n return _createResolver(Array.from(set), [''], rootScopes, fallback,\n () => subGetTarget(resolver, prop as string, value));\n}\n\nfunction addScopesFromKey(\n set: Set,\n allScopes: AnyObject[],\n key: ResolverObjectKey,\n fallback: ResolverObjectKey,\n item: unknown\n) {\n while (key) {\n key = addScopes(set, allScopes, key, fallback, item);\n }\n return key;\n}\n\nfunction subGetTarget(\n resolver: ResolverCache,\n prop: string,\n value: unknown\n) {\n const parent = resolver._getTarget();\n if (!(prop in parent)) {\n parent[prop] = {};\n }\n const target = parent[prop];\n if (isArray(target) && isObject(value)) {\n // For array of objects, the object is used to store updated values\n return value;\n }\n return target || {};\n}\n\nfunction _resolveWithPrefixes(\n prop: string,\n prefixes: string[],\n scopes: AnyObject[],\n proxy: ResolverProxy\n) {\n let value: unknown;\n for (const prefix of prefixes) {\n value = _resolve(readKey(prefix, prop), scopes);\n if (typeof value !== 'undefined') {\n return needsSubResolver(prop, value)\n ? createSubResolver(scopes, proxy, prop, value)\n : value;\n }\n }\n}\n\nfunction _resolve(key: string, scopes: AnyObject[]) {\n for (const scope of scopes) {\n if (!scope) {\n continue;\n }\n const value = scope[key];\n if (typeof value !== 'undefined') {\n return value;\n }\n }\n}\n\nfunction getKeysFromAllScopes(target: ResolverCache) {\n let keys = target._keys;\n if (!keys) {\n keys = target._keys = resolveKeysFromAllScopes(target._scopes);\n }\n return keys;\n}\n\nfunction resolveKeysFromAllScopes(scopes: AnyObject[]) {\n const set = new Set();\n for (const scope of scopes) {\n for (const key of Object.keys(scope).filter(k => !k.startsWith('_'))) {\n set.add(key);\n }\n }\n return Array.from(set);\n}\n\nexport function _parseObjectDataRadialScale(\n meta: ChartMeta<'line' | 'scatter'>,\n data: AnyObject[],\n start: number,\n count: number\n) {\n const {iScale} = meta;\n const {key = 'r'} = this._parsing;\n const parsed = new Array<{r: unknown}>(count);\n let i: number, ilen: number, index: number, item: AnyObject;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n r: iScale.parse(resolveObjectKey(item, key), index)\n };\n }\n return parsed;\n}\n","import {almostEquals, distanceBetweenPoints, sign} from './helpers.math.js';\nimport {_isPointInArea} from './helpers.canvas.js';\nimport type {ChartArea} from '../types/index.js';\nimport type {SplinePoint} from '../types/geometric.js';\n\nconst EPSILON = Number.EPSILON || 1e-14;\n\ntype OptionalSplinePoint = SplinePoint | false\nconst getPoint = (points: SplinePoint[], i: number): OptionalSplinePoint => i < points.length && !points[i].skip && points[i];\nconst getValueAxis = (indexAxis: 'x' | 'y') => indexAxis === 'x' ? 'y' : 'x';\n\nexport function splineCurve(\n firstPoint: SplinePoint,\n middlePoint: SplinePoint,\n afterPoint: SplinePoint,\n t: number\n): {\n previous: SplinePoint\n next: SplinePoint\n } {\n // Props to Rob Spencer at scaled innovation for his post on splining between points\n // http://scaledinnovation.com/analytics/splines/aboutSplines.html\n\n // This function must also respect \"skipped\" points\n\n const previous = firstPoint.skip ? middlePoint : firstPoint;\n const current = middlePoint;\n const next = afterPoint.skip ? middlePoint : afterPoint;\n const d01 = distanceBetweenPoints(current, previous);\n const d12 = distanceBetweenPoints(next, current);\n\n let s01 = d01 / (d01 + d12);\n let s12 = d12 / (d01 + d12);\n\n // If all points are the same, s01 & s02 will be inf\n s01 = isNaN(s01) ? 0 : s01;\n s12 = isNaN(s12) ? 0 : s12;\n\n const fa = t * s01; // scaling factor for triangle Ta\n const fb = t * s12;\n\n return {\n previous: {\n x: current.x - fa * (next.x - previous.x),\n y: current.y - fa * (next.y - previous.y)\n },\n next: {\n x: current.x + fb * (next.x - previous.x),\n y: current.y + fb * (next.y - previous.y)\n }\n };\n}\n\n/**\n * Adjust tangents to ensure monotonic properties\n */\nfunction monotoneAdjust(points: SplinePoint[], deltaK: number[], mK: number[]) {\n const pointsLen = points.length;\n\n let alphaK: number, betaK: number, tauK: number, squaredMagnitude: number, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n for (let i = 0; i < pointsLen - 1; ++i) {\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent || !pointAfter) {\n continue;\n }\n\n if (almostEquals(deltaK[i], 0, EPSILON)) {\n mK[i] = mK[i + 1] = 0;\n continue;\n }\n\n alphaK = mK[i] / deltaK[i];\n betaK = mK[i + 1] / deltaK[i];\n squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n if (squaredMagnitude <= 9) {\n continue;\n }\n\n tauK = 3 / Math.sqrt(squaredMagnitude);\n mK[i] = alphaK * tauK * deltaK[i];\n mK[i + 1] = betaK * tauK * deltaK[i];\n }\n}\n\nfunction monotoneCompute(points: SplinePoint[], mK: number[], indexAxis: 'x' | 'y' = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n let delta: number, pointBefore: OptionalSplinePoint, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n\n for (let i = 0; i < pointsLen; ++i) {\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n\n const iPixel = pointCurrent[indexAxis];\n const vPixel = pointCurrent[valueAxis];\n if (pointBefore) {\n delta = (iPixel - pointBefore[indexAxis]) / 3;\n pointCurrent[`cp1${indexAxis}`] = iPixel - delta;\n pointCurrent[`cp1${valueAxis}`] = vPixel - delta * mK[i];\n }\n if (pointAfter) {\n delta = (pointAfter[indexAxis] - iPixel) / 3;\n pointCurrent[`cp2${indexAxis}`] = iPixel + delta;\n pointCurrent[`cp2${valueAxis}`] = vPixel + delta * mK[i];\n }\n }\n}\n\n/**\n * This function calculates Bézier control points in a similar way than |splineCurve|,\n * but preserves monotonicity of the provided data and ensures no local extremums are added\n * between the dataset discrete points due to the interpolation.\n * See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n */\nexport function splineCurveMonotone(points: SplinePoint[], indexAxis: 'x' | 'y' = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n const deltaK: number[] = Array(pointsLen).fill(0);\n const mK: number[] = Array(pointsLen);\n\n // Calculate slopes (deltaK) and initialize tangents (mK)\n let i, pointBefore: OptionalSplinePoint, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n\n for (i = 0; i < pointsLen; ++i) {\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n\n if (pointAfter) {\n const slopeDelta = pointAfter[indexAxis] - pointCurrent[indexAxis];\n\n // In the case of two points that appear at the same x pixel, slopeDeltaX is 0\n deltaK[i] = slopeDelta !== 0 ? (pointAfter[valueAxis] - pointCurrent[valueAxis]) / slopeDelta : 0;\n }\n mK[i] = !pointBefore ? deltaK[i]\n : !pointAfter ? deltaK[i - 1]\n : (sign(deltaK[i - 1]) !== sign(deltaK[i])) ? 0\n : (deltaK[i - 1] + deltaK[i]) / 2;\n }\n\n monotoneAdjust(points, deltaK, mK);\n\n monotoneCompute(points, mK, indexAxis);\n}\n\nfunction capControlPoint(pt: number, min: number, max: number) {\n return Math.max(Math.min(pt, max), min);\n}\n\nfunction capBezierPoints(points: SplinePoint[], area: ChartArea) {\n let i, ilen, point, inArea, inAreaPrev;\n let inAreaNext = _isPointInArea(points[0], area);\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n inAreaPrev = inArea;\n inArea = inAreaNext;\n inAreaNext = i < ilen - 1 && _isPointInArea(points[i + 1], area);\n if (!inArea) {\n continue;\n }\n point = points[i];\n if (inAreaPrev) {\n point.cp1x = capControlPoint(point.cp1x, area.left, area.right);\n point.cp1y = capControlPoint(point.cp1y, area.top, area.bottom);\n }\n if (inAreaNext) {\n point.cp2x = capControlPoint(point.cp2x, area.left, area.right);\n point.cp2y = capControlPoint(point.cp2y, area.top, area.bottom);\n }\n }\n}\n\n/**\n * @private\n */\nexport function _updateBezierControlPoints(\n points: SplinePoint[],\n options,\n area: ChartArea,\n loop: boolean,\n indexAxis: 'x' | 'y'\n) {\n let i: number, ilen: number, point: SplinePoint, controlPoints: ReturnType;\n\n // Only consider points that are drawn in case the spanGaps option is used\n if (options.spanGaps) {\n points = points.filter((pt) => !pt.skip);\n }\n\n if (options.cubicInterpolationMode === 'monotone') {\n splineCurveMonotone(points, indexAxis);\n } else {\n let prev = loop ? points[points.length - 1] : points[0];\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n point = points[i];\n controlPoints = splineCurve(\n prev,\n point,\n points[Math.min(i + 1, ilen - (loop ? 0 : 1)) % ilen],\n options.tension\n );\n point.cp1x = controlPoints.previous.x;\n point.cp1y = controlPoints.previous.y;\n point.cp2x = controlPoints.next.x;\n point.cp2y = controlPoints.next.y;\n prev = point;\n }\n }\n\n if (options.capBezierPoints) {\n capBezierPoints(points, area);\n }\n}\n","import type {ChartArea, Scale} from '../types/index.js';\nimport type PrivateChart from '../core/core.controller.js';\nimport type {Chart, ChartEvent} from '../types.js';\nimport {INFINITY} from './helpers.math.js';\n\n/**\n * @private\n */\nexport function _isDomSupported(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\n/**\n * @private\n */\nexport function _getParentNode(domNode: HTMLCanvasElement): HTMLCanvasElement {\n let parent = domNode.parentNode;\n if (parent && parent.toString() === '[object ShadowRoot]') {\n parent = (parent as ShadowRoot).host;\n }\n return parent as HTMLCanvasElement;\n}\n\n/**\n * convert max-width/max-height values that may be percentages into a number\n * @private\n */\n\nfunction parseMaxStyle(styleValue: string | number, node: HTMLElement, parentProperty: string) {\n let valueInPixels: number;\n if (typeof styleValue === 'string') {\n valueInPixels = parseInt(styleValue, 10);\n\n if (styleValue.indexOf('%') !== -1) {\n // percentage * size in dimension\n valueInPixels = (valueInPixels / 100) * node.parentNode[parentProperty];\n }\n } else {\n valueInPixels = styleValue;\n }\n\n return valueInPixels;\n}\n\nconst getComputedStyle = (element: HTMLElement): CSSStyleDeclaration =>\n element.ownerDocument.defaultView.getComputedStyle(element, null);\n\nexport function getStyle(el: HTMLElement, property: string): string {\n return getComputedStyle(el).getPropertyValue(property);\n}\n\nconst positions = ['top', 'right', 'bottom', 'left'];\nfunction getPositionedStyle(styles: CSSStyleDeclaration, style: string, suffix?: string): ChartArea {\n const result = {} as ChartArea;\n suffix = suffix ? '-' + suffix : '';\n for (let i = 0; i < 4; i++) {\n const pos = positions[i];\n result[pos] = parseFloat(styles[style + '-' + pos + suffix]) || 0;\n }\n result.width = result.left + result.right;\n result.height = result.top + result.bottom;\n return result;\n}\n\nconst useOffsetPos = (x: number, y: number, target: HTMLElement | EventTarget) =>\n (x > 0 || y > 0) && (!target || !(target as HTMLElement).shadowRoot);\n\n/**\n * @param e\n * @param canvas\n * @returns Canvas position\n */\nfunction getCanvasPosition(\n e: Event | TouchEvent | MouseEvent,\n canvas: HTMLCanvasElement\n): {\n x: number;\n y: number;\n box: boolean;\n } {\n const touches = (e as TouchEvent).touches;\n const source = (touches && touches.length ? touches[0] : e) as MouseEvent;\n const {offsetX, offsetY} = source as MouseEvent;\n let box = false;\n let x, y;\n if (useOffsetPos(offsetX, offsetY, e.target)) {\n x = offsetX;\n y = offsetY;\n } else {\n const rect = canvas.getBoundingClientRect();\n x = source.clientX - rect.left;\n y = source.clientY - rect.top;\n box = true;\n }\n return {x, y, box};\n}\n\n/**\n * Gets an event's x, y coordinates, relative to the chart area\n * @param event\n * @param chart\n * @returns x and y coordinates of the event\n */\n\nexport function getRelativePosition(\n event: Event | ChartEvent | TouchEvent | MouseEvent,\n chart: Chart | PrivateChart\n): { x: number; y: number } {\n if ('native' in event) {\n return event;\n }\n\n const {canvas, currentDevicePixelRatio} = chart;\n const style = getComputedStyle(canvas);\n const borderBox = style.boxSizing === 'border-box';\n const paddings = getPositionedStyle(style, 'padding');\n const borders = getPositionedStyle(style, 'border', 'width');\n const {x, y, box} = getCanvasPosition(event, canvas);\n const xOffset = paddings.left + (box && borders.left);\n const yOffset = paddings.top + (box && borders.top);\n\n let {width, height} = chart;\n if (borderBox) {\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n return {\n x: Math.round((x - xOffset) / width * canvas.width / currentDevicePixelRatio),\n y: Math.round((y - yOffset) / height * canvas.height / currentDevicePixelRatio)\n };\n}\n\nfunction getContainerSize(canvas: HTMLCanvasElement, width: number, height: number): Partial {\n let maxWidth: number, maxHeight: number;\n\n if (width === undefined || height === undefined) {\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n width = canvas.clientWidth;\n height = canvas.clientHeight;\n } else {\n const rect = container.getBoundingClientRect(); // this is the border box of the container\n const containerStyle = getComputedStyle(container);\n const containerBorder = getPositionedStyle(containerStyle, 'border', 'width');\n const containerPadding = getPositionedStyle(containerStyle, 'padding');\n width = rect.width - containerPadding.width - containerBorder.width;\n height = rect.height - containerPadding.height - containerBorder.height;\n maxWidth = parseMaxStyle(containerStyle.maxWidth, container, 'clientWidth');\n maxHeight = parseMaxStyle(containerStyle.maxHeight, container, 'clientHeight');\n }\n }\n return {\n width,\n height,\n maxWidth: maxWidth || INFINITY,\n maxHeight: maxHeight || INFINITY\n };\n}\n\nconst round1 = (v: number) => Math.round(v * 10) / 10;\n\n// eslint-disable-next-line complexity\nexport function getMaximumSize(\n canvas: HTMLCanvasElement,\n bbWidth?: number,\n bbHeight?: number,\n aspectRatio?: number\n): { width: number; height: number } {\n const style = getComputedStyle(canvas);\n const margins = getPositionedStyle(style, 'margin');\n const maxWidth = parseMaxStyle(style.maxWidth, canvas, 'clientWidth') || INFINITY;\n const maxHeight = parseMaxStyle(style.maxHeight, canvas, 'clientHeight') || INFINITY;\n const containerSize = getContainerSize(canvas, bbWidth, bbHeight);\n let {width, height} = containerSize;\n\n if (style.boxSizing === 'content-box') {\n const borders = getPositionedStyle(style, 'border', 'width');\n const paddings = getPositionedStyle(style, 'padding');\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n width = Math.max(0, width - margins.width);\n height = Math.max(0, aspectRatio ? width / aspectRatio : height - margins.height);\n width = round1(Math.min(width, maxWidth, containerSize.maxWidth));\n height = round1(Math.min(height, maxHeight, containerSize.maxHeight));\n if (width && !height) {\n // https://github.com/chartjs/Chart.js/issues/4659\n // If the canvas has width, but no height, default to aspectRatio of 2 (canvas default)\n height = round1(width / 2);\n }\n\n const maintainHeight = bbWidth !== undefined || bbHeight !== undefined;\n\n if (maintainHeight && aspectRatio && containerSize.height && height > containerSize.height) {\n height = containerSize.height;\n width = round1(Math.floor(height * aspectRatio));\n }\n\n return {width, height};\n}\n\n/**\n * @param chart\n * @param forceRatio\n * @param forceStyle\n * @returns True if the canvas context size or transformation has changed.\n */\nexport function retinaScale(\n chart: Chart | PrivateChart,\n forceRatio: number,\n forceStyle?: boolean\n): boolean | void {\n const pixelRatio = forceRatio || 1;\n const deviceHeight = round1(chart.height * pixelRatio);\n const deviceWidth = round1(chart.width * pixelRatio);\n\n (chart as PrivateChart).height = round1(chart.height);\n (chart as PrivateChart).width = round1(chart.width);\n\n const canvas = chart.canvas;\n\n // If no style has been set on the canvas, the render size is used as display size,\n // making the chart visually bigger, so let's enforce it to the \"correct\" values.\n // See https://github.com/chartjs/Chart.js/issues/3575\n if (canvas.style && (forceStyle || (!canvas.style.height && !canvas.style.width))) {\n canvas.style.height = `${chart.height}px`;\n canvas.style.width = `${chart.width}px`;\n }\n\n if (chart.currentDevicePixelRatio !== pixelRatio\n || canvas.height !== deviceHeight\n || canvas.width !== deviceWidth) {\n (chart as PrivateChart).currentDevicePixelRatio = pixelRatio;\n canvas.height = deviceHeight;\n canvas.width = deviceWidth;\n chart.ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n return true;\n }\n return false;\n}\n\n/**\n * Detects support for options object argument in addEventListener.\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\n * @private\n */\nexport const supportsEventListenerOptions = (function() {\n let passiveSupported = false;\n try {\n const options = {\n get passive() { // This function will be called when the browser attempts to access the passive property.\n passiveSupported = true;\n return false;\n }\n } as EventListenerOptions;\n\n if (_isDomSupported()) {\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n }\n } catch (e) {\n // continue regardless of error\n }\n return passiveSupported;\n}());\n\n/**\n * The \"used\" size is the final value of a dimension property after all calculations have\n * been performed. This method uses the computed style of `element` but returns undefined\n * if the computed style is not expressed in pixels. That can happen in some cases where\n * `element` has a size relative to its parent and this last one is not yet displayed,\n * for example because of `display: none` on a parent node.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\n * @returns Size in pixels or undefined if unknown.\n */\n\nexport function readUsedSize(\n element: HTMLElement,\n property: 'width' | 'height'\n): number | undefined {\n const value = getStyle(element, property);\n const matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n return matches ? +matches[1] : undefined;\n}\n","import type {Point, SplinePoint} from '../types/geometric.js';\n\n/**\n * @private\n */\nexport function _pointInLine(p1: Point, p2: Point, t: number, mode?) { // eslint-disable-line @typescript-eslint/no-unused-vars\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: p1.y + t * (p2.y - p1.y)\n };\n}\n\n/**\n * @private\n */\nexport function _steppedInterpolation(\n p1: Point,\n p2: Point,\n t: number, mode: 'middle' | 'after' | unknown\n) {\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: mode === 'middle' ? t < 0.5 ? p1.y : p2.y\n : mode === 'after' ? t < 1 ? p1.y : p2.y\n : t > 0 ? p2.y : p1.y\n };\n}\n\n/**\n * @private\n */\nexport function _bezierInterpolation(p1: SplinePoint, p2: SplinePoint, t: number, mode?) { // eslint-disable-line @typescript-eslint/no-unused-vars\n const cp1 = {x: p1.cp2x, y: p1.cp2y};\n const cp2 = {x: p2.cp1x, y: p2.cp1y};\n const a = _pointInLine(p1, cp1, t);\n const b = _pointInLine(cp1, cp2, t);\n const c = _pointInLine(cp2, p2, t);\n const d = _pointInLine(a, b, t);\n const e = _pointInLine(b, c, t);\n return _pointInLine(d, e, t);\n}\n","export interface RTLAdapter {\n x(x: number): number;\n setWidth(w: number): void;\n textAlign(align: 'center' | 'left' | 'right'): 'center' | 'left' | 'right';\n xPlus(x: number, value: number): number;\n leftForLtr(x: number, itemWidth: number): number;\n}\n\nconst getRightToLeftAdapter = function(rectX: number, width: number): RTLAdapter {\n return {\n x(x) {\n return rectX + rectX + width - x;\n },\n setWidth(w) {\n width = w;\n },\n textAlign(align) {\n if (align === 'center') {\n return align;\n }\n return align === 'right' ? 'left' : 'right';\n },\n xPlus(x, value) {\n return x - value;\n },\n leftForLtr(x, itemWidth) {\n return x - itemWidth;\n },\n };\n};\n\nconst getLeftToRightAdapter = function(): RTLAdapter {\n return {\n x(x) {\n return x;\n },\n setWidth(w) { // eslint-disable-line no-unused-vars\n },\n textAlign(align) {\n return align;\n },\n xPlus(x, value) {\n return x + value;\n },\n leftForLtr(x, _itemWidth) { // eslint-disable-line @typescript-eslint/no-unused-vars\n return x;\n },\n };\n};\n\nexport function getRtlAdapter(rtl: boolean, rectX: number, width: number) {\n return rtl ? getRightToLeftAdapter(rectX, width) : getLeftToRightAdapter();\n}\n\nexport function overrideTextDirection(ctx: CanvasRenderingContext2D, direction: 'ltr' | 'rtl') {\n let style: CSSStyleDeclaration, original: [string, string];\n if (direction === 'ltr' || direction === 'rtl') {\n style = ctx.canvas.style;\n original = [\n style.getPropertyValue('direction'),\n style.getPropertyPriority('direction'),\n ];\n\n style.setProperty('direction', direction, 'important');\n (ctx as { prevTextDirection?: [string, string] }).prevTextDirection = original;\n }\n}\n\nexport function restoreTextDirection(ctx: CanvasRenderingContext2D, original?: [string, string]) {\n if (original !== undefined) {\n delete (ctx as { prevTextDirection?: [string, string] }).prevTextDirection;\n ctx.canvas.style.setProperty('direction', original[0], original[1]);\n }\n}\n","import {_angleBetween, _angleDiff, _isBetween, _normalizeAngle} from './helpers.math.js';\nimport {createContext} from './helpers.options.js';\nimport {isPatternOrGradient} from './helpers.color.js';\n\n/**\n * @typedef { import('../elements/element.line.js').default } LineElement\n * @typedef { import('../elements/element.point.js').default } PointElement\n * @typedef {{start: number, end: number, loop: boolean, style?: any}} Segment\n */\n\nfunction propertyFn(property) {\n if (property === 'angle') {\n return {\n between: _angleBetween,\n compare: _angleDiff,\n normalize: _normalizeAngle,\n };\n }\n return {\n between: _isBetween,\n compare: (a, b) => a - b,\n normalize: x => x\n };\n}\n\nfunction normalizeSegment({start, end, count, loop, style}) {\n return {\n start: start % count,\n end: end % count,\n loop: loop && (end - start + 1) % count === 0,\n style\n };\n}\n\nfunction getSegment(segment, points, bounds) {\n const {property, start: startBound, end: endBound} = bounds;\n const {between, normalize} = propertyFn(property);\n const count = points.length;\n // eslint-disable-next-line prefer-const\n let {start, end, loop} = segment;\n let i, ilen;\n\n if (loop) {\n start += count;\n end += count;\n for (i = 0, ilen = count; i < ilen; ++i) {\n if (!between(normalize(points[start % count][property]), startBound, endBound)) {\n break;\n }\n start--;\n end--;\n }\n start %= count;\n end %= count;\n }\n\n if (end < start) {\n end += count;\n }\n return {start, end, loop, style: segment.style};\n}\n\n/**\n * Returns the sub-segment(s) of a line segment that fall in the given bounds\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} [segment.style] - segment style\n * @param {PointElement[]} points - the points that this segment refers to\n * @param {object} [bounds]\n * @param {string} bounds.property - the property of a `PointElement` we are bounding. `x`, `y` or `angle`.\n * @param {number} bounds.start - start value of the property\n * @param {number} bounds.end - end value of the property\n * @private\n **/\nexport function _boundSegment(segment, points, bounds) {\n if (!bounds) {\n return [segment];\n }\n\n const {property, start: startBound, end: endBound} = bounds;\n const count = points.length;\n const {compare, between, normalize} = propertyFn(property);\n const {start, end, loop, style} = getSegment(segment, points, bounds);\n\n const result = [];\n let inside = false;\n let subStart = null;\n let value, point, prevValue;\n\n const startIsBefore = () => between(startBound, prevValue, value) && compare(startBound, prevValue) !== 0;\n const endIsBefore = () => compare(endBound, value) === 0 || between(endBound, prevValue, value);\n const shouldStart = () => inside || startIsBefore();\n const shouldStop = () => !inside || endIsBefore();\n\n for (let i = start, prev = start; i <= end; ++i) {\n point = points[i % count];\n\n if (point.skip) {\n continue;\n }\n\n value = normalize(point[property]);\n\n if (value === prevValue) {\n continue;\n }\n\n inside = between(value, startBound, endBound);\n\n if (subStart === null && shouldStart()) {\n subStart = compare(value, startBound) === 0 ? i : prev;\n }\n\n if (subStart !== null && shouldStop()) {\n result.push(normalizeSegment({start: subStart, end: i, loop, count, style}));\n subStart = null;\n }\n prev = i;\n prevValue = value;\n }\n\n if (subStart !== null) {\n result.push(normalizeSegment({start: subStart, end, loop, count, style}));\n }\n\n return result;\n}\n\n\n/**\n * Returns the segments of the line that are inside given bounds\n * @param {LineElement} line\n * @param {object} [bounds]\n * @param {string} bounds.property - the property we are bounding with. `x`, `y` or `angle`.\n * @param {number} bounds.start - start value of the `property`\n * @param {number} bounds.end - end value of the `property`\n * @private\n */\nexport function _boundSegments(line, bounds) {\n const result = [];\n const segments = line.segments;\n\n for (let i = 0; i < segments.length; i++) {\n const sub = _boundSegment(segments[i], line.points, bounds);\n if (sub.length) {\n result.push(...sub);\n }\n }\n return result;\n}\n\n/**\n * Find start and end index of a line.\n */\nfunction findStartAndEnd(points, count, loop, spanGaps) {\n let start = 0;\n let end = count - 1;\n\n if (loop && !spanGaps) {\n // loop and not spanning gaps, first find a gap to start from\n while (start < count && !points[start].skip) {\n start++;\n }\n }\n\n // find first non skipped point (after the first gap possibly)\n while (start < count && points[start].skip) {\n start++;\n }\n\n // if we looped to count, start needs to be 0\n start %= count;\n\n if (loop) {\n // loop will go past count, if start > 0\n end += start;\n }\n\n while (end > start && points[end % count].skip) {\n end--;\n }\n\n // end could be more than count, normalize\n end %= count;\n\n return {start, end};\n}\n\n/**\n * Compute solid segments from Points, when spanGaps === false\n * @param {PointElement[]} points - the points\n * @param {number} start - start index\n * @param {number} max - max index (can go past count on a loop)\n * @param {boolean} loop - boolean indicating that this would be a loop if no gaps are found\n */\nfunction solidSegments(points, start, max, loop) {\n const count = points.length;\n const result = [];\n let last = start;\n let prev = points[start];\n let end;\n\n for (end = start + 1; end <= max; ++end) {\n const cur = points[end % count];\n if (cur.skip || cur.stop) {\n if (!prev.skip) {\n loop = false;\n result.push({start: start % count, end: (end - 1) % count, loop});\n // @ts-ignore\n start = last = cur.stop ? end : null;\n }\n } else {\n last = end;\n if (prev.skip) {\n start = end;\n }\n }\n prev = cur;\n }\n\n if (last !== null) {\n result.push({start: start % count, end: last % count, loop});\n }\n\n return result;\n}\n\n/**\n * Compute the continuous segments that define the whole line\n * There can be skipped points within a segment, if spanGaps is true.\n * @param {LineElement} line\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n * @private\n */\nexport function _computeSegments(line, segmentOptions) {\n const points = line.points;\n const spanGaps = line.options.spanGaps;\n const count = points.length;\n\n if (!count) {\n return [];\n }\n\n const loop = !!line._loop;\n const {start, end} = findStartAndEnd(points, count, loop, spanGaps);\n\n if (spanGaps === true) {\n return splitByStyles(line, [{start, end, loop}], points, segmentOptions);\n }\n\n const max = end < start ? end + count : end;\n const completeLoop = !!line._fullLoop && start === 0 && end === count - 1;\n return splitByStyles(line, solidSegments(points, start, max, completeLoop), points, segmentOptions);\n}\n\n/**\n * @param {Segment[]} segments\n * @param {PointElement[]} points\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n */\nfunction splitByStyles(line, segments, points, segmentOptions) {\n if (!segmentOptions || !segmentOptions.setContext || !points) {\n return segments;\n }\n return doSplitByStyles(line, segments, points, segmentOptions);\n}\n\n/**\n * @param {LineElement} line\n * @param {Segment[]} segments\n * @param {PointElement[]} points\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n */\nfunction doSplitByStyles(line, segments, points, segmentOptions) {\n const chartContext = line._chart.getContext();\n const baseStyle = readStyle(line.options);\n const {_datasetIndex: datasetIndex, options: {spanGaps}} = line;\n const count = points.length;\n const result = [];\n let prevStyle = baseStyle;\n let start = segments[0].start;\n let i = start;\n\n function addStyle(s, e, l, st) {\n const dir = spanGaps ? -1 : 1;\n if (s === e) {\n return;\n }\n // Style can not start/end on a skipped point, adjust indices accordingly\n s += count;\n while (points[s % count].skip) {\n s -= dir;\n }\n while (points[e % count].skip) {\n e += dir;\n }\n if (s % count !== e % count) {\n result.push({start: s % count, end: e % count, loop: l, style: st});\n prevStyle = st;\n start = e % count;\n }\n }\n\n for (const segment of segments) {\n start = spanGaps ? start : segment.start;\n let prev = points[start % count];\n let style;\n for (i = start + 1; i <= segment.end; i++) {\n const pt = points[i % count];\n style = readStyle(segmentOptions.setContext(createContext(chartContext, {\n type: 'segment',\n p0: prev,\n p1: pt,\n p0DataIndex: (i - 1) % count,\n p1DataIndex: i % count,\n datasetIndex\n })));\n if (styleChanged(style, prevStyle)) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n prev = pt;\n prevStyle = style;\n }\n if (start < i - 1) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n }\n\n return result;\n}\n\nfunction readStyle(options) {\n return {\n backgroundColor: options.backgroundColor,\n borderCapStyle: options.borderCapStyle,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderJoinStyle: options.borderJoinStyle,\n borderWidth: options.borderWidth,\n borderColor: options.borderColor\n };\n}\n\nfunction styleChanged(style, prevStyle) {\n if (!prevStyle) {\n return false;\n }\n const cache = [];\n const replacer = function(key, value) {\n if (!isPatternOrGradient(value)) {\n return value;\n }\n if (!cache.includes(value)) {\n cache.push(value);\n }\n return cache.indexOf(value);\n };\n return JSON.stringify(style, replacer) !== JSON.stringify(prevStyle, replacer);\n}\n","import type {Chart, ChartArea, ChartMeta, Scale, TRBL} from '../types/index.js';\n\nfunction getSizeForArea(scale: Scale, chartArea: ChartArea, field: keyof ChartArea) {\n return scale.options.clip ? scale[field] : chartArea[field];\n}\n\nfunction getDatasetArea(meta: ChartMeta, chartArea: ChartArea): TRBL {\n const {xScale, yScale} = meta;\n if (xScale && yScale) {\n return {\n left: getSizeForArea(xScale, chartArea, 'left'),\n right: getSizeForArea(xScale, chartArea, 'right'),\n top: getSizeForArea(yScale, chartArea, 'top'),\n bottom: getSizeForArea(yScale, chartArea, 'bottom')\n };\n }\n return chartArea;\n}\n\nexport function getDatasetClipArea(chart: Chart, meta: ChartMeta): TRBL | false {\n const clip = meta._clip;\n if (clip.disabled) {\n return false;\n }\n const area = getDatasetArea(meta, chart.chartArea);\n\n return {\n left: clip.left === false ? 0 : area.left - (clip.left === true ? 0 : clip.left),\n right: clip.right === false ? chart.width : area.right + (clip.right === true ? 0 : clip.right),\n top: clip.top === false ? 0 : area.top - (clip.top === true ? 0 : clip.top),\n bottom: clip.bottom === false ? chart.height : area.bottom + (clip.bottom === true ? 0 : clip.bottom)\n };\n}\n","import {requestAnimFrame} from '../helpers/helpers.extras.js';\n\n/**\n * @typedef { import('./core.animation.js').default } Animation\n * @typedef { import('./core.controller.js').default } Chart\n */\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is export for typedoc\n */\nexport class Animator {\n constructor() {\n this._request = null;\n this._charts = new Map();\n this._running = false;\n this._lastDate = undefined;\n }\n\n /**\n\t * @private\n\t */\n _notify(chart, anims, date, type) {\n const callbacks = anims.listeners[type];\n const numSteps = anims.duration;\n\n callbacks.forEach(fn => fn({\n chart,\n initial: anims.initial,\n numSteps,\n currentStep: Math.min(date - anims.start, numSteps)\n }));\n }\n\n /**\n\t * @private\n\t */\n _refresh() {\n if (this._request) {\n return;\n }\n this._running = true;\n\n this._request = requestAnimFrame.call(window, () => {\n this._update();\n this._request = null;\n\n if (this._running) {\n this._refresh();\n }\n });\n }\n\n /**\n\t * @private\n\t */\n _update(date = Date.now()) {\n let remaining = 0;\n\n this._charts.forEach((anims, chart) => {\n if (!anims.running || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n let draw = false;\n let item;\n\n for (; i >= 0; --i) {\n item = items[i];\n\n if (item._active) {\n if (item._total > anims.duration) {\n // if the animation has been updated and its duration prolonged,\n // update to total duration of current animations run (for progress event)\n anims.duration = item._total;\n }\n item.tick(date);\n draw = true;\n } else {\n // Remove the item by replacing it with last item and removing the last\n // A lot faster than splice.\n items[i] = items[items.length - 1];\n items.pop();\n }\n }\n\n if (draw) {\n chart.draw();\n this._notify(chart, anims, date, 'progress');\n }\n\n if (!items.length) {\n anims.running = false;\n this._notify(chart, anims, date, 'complete');\n anims.initial = false;\n }\n\n remaining += items.length;\n });\n\n this._lastDate = date;\n\n if (remaining === 0) {\n this._running = false;\n }\n }\n\n /**\n\t * @private\n\t */\n _getAnims(chart) {\n const charts = this._charts;\n let anims = charts.get(chart);\n if (!anims) {\n anims = {\n running: false,\n initial: true,\n items: [],\n listeners: {\n complete: [],\n progress: []\n }\n };\n charts.set(chart, anims);\n }\n return anims;\n }\n\n /**\n\t * @param {Chart} chart\n\t * @param {string} event - event name\n\t * @param {Function} cb - callback\n\t */\n listen(chart, event, cb) {\n this._getAnims(chart).listeners[event].push(cb);\n }\n\n /**\n\t * Add animations\n\t * @param {Chart} chart\n\t * @param {Animation[]} items - animations\n\t */\n add(chart, items) {\n if (!items || !items.length) {\n return;\n }\n this._getAnims(chart).items.push(...items);\n }\n\n /**\n\t * Counts number of active animations for the chart\n\t * @param {Chart} chart\n\t */\n has(chart) {\n return this._getAnims(chart).items.length > 0;\n }\n\n /**\n\t * Start animating (all charts)\n\t * @param {Chart} chart\n\t */\n start(chart) {\n const anims = this._charts.get(chart);\n if (!anims) {\n return;\n }\n anims.running = true;\n anims.start = Date.now();\n anims.duration = anims.items.reduce((acc, cur) => Math.max(acc, cur._duration), 0);\n this._refresh();\n }\n\n running(chart) {\n if (!this._running) {\n return false;\n }\n const anims = this._charts.get(chart);\n if (!anims || !anims.running || !anims.items.length) {\n return false;\n }\n return true;\n }\n\n /**\n\t * Stop all animations for the chart\n\t * @param {Chart} chart\n\t */\n stop(chart) {\n const anims = this._charts.get(chart);\n if (!anims || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n\n for (; i >= 0; --i) {\n items[i].cancel();\n }\n anims.items = [];\n this._notify(chart, anims, Date.now(), 'complete');\n }\n\n /**\n\t * Remove chart from Animator\n\t * @param {Chart} chart\n\t */\n remove(chart) {\n return this._charts.delete(chart);\n }\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Animator();\n","import effects from '../helpers/helpers.easing.js';\nimport {resolve} from '../helpers/helpers.options.js';\nimport {color as helpersColor} from '../helpers/helpers.color.js';\n\nconst transparent = 'transparent';\nconst interpolators = {\n boolean(from, to, factor) {\n return factor > 0.5 ? to : from;\n },\n /**\n * @param {string} from\n * @param {string} to\n * @param {number} factor\n */\n color(from, to, factor) {\n const c0 = helpersColor(from || transparent);\n const c1 = c0.valid && helpersColor(to || transparent);\n return c1 && c1.valid\n ? c1.mix(c0, factor).hexString()\n : to;\n },\n number(from, to, factor) {\n return from + (to - from) * factor;\n }\n};\n\nexport default class Animation {\n constructor(cfg, target, prop, to) {\n const currentValue = target[prop];\n\n to = resolve([cfg.to, to, currentValue, cfg.from]);\n const from = resolve([cfg.from, currentValue, to]);\n\n this._active = true;\n this._fn = cfg.fn || interpolators[cfg.type || typeof from];\n this._easing = effects[cfg.easing] || effects.linear;\n this._start = Math.floor(Date.now() + (cfg.delay || 0));\n this._duration = this._total = Math.floor(cfg.duration);\n this._loop = !!cfg.loop;\n this._target = target;\n this._prop = prop;\n this._from = from;\n this._to = to;\n this._promises = undefined;\n }\n\n active() {\n return this._active;\n }\n\n update(cfg, to, date) {\n if (this._active) {\n this._notify(false);\n\n const currentValue = this._target[this._prop];\n const elapsed = date - this._start;\n const remain = this._duration - elapsed;\n this._start = date;\n this._duration = Math.floor(Math.max(remain, cfg.duration));\n this._total += elapsed;\n this._loop = !!cfg.loop;\n this._to = resolve([cfg.to, to, currentValue, cfg.from]);\n this._from = resolve([cfg.from, currentValue, to]);\n }\n }\n\n cancel() {\n if (this._active) {\n // update current evaluated value, for smoother animations\n this.tick(Date.now());\n this._active = false;\n this._notify(false);\n }\n }\n\n tick(date) {\n const elapsed = date - this._start;\n const duration = this._duration;\n const prop = this._prop;\n const from = this._from;\n const loop = this._loop;\n const to = this._to;\n let factor;\n\n this._active = from !== to && (loop || (elapsed < duration));\n\n if (!this._active) {\n this._target[prop] = to;\n this._notify(true);\n return;\n }\n\n if (elapsed < 0) {\n this._target[prop] = from;\n return;\n }\n\n factor = (elapsed / duration) % 2;\n factor = loop && factor > 1 ? 2 - factor : factor;\n factor = this._easing(Math.min(1, Math.max(0, factor)));\n\n this._target[prop] = this._fn(from, to, factor);\n }\n\n wait() {\n const promises = this._promises || (this._promises = []);\n return new Promise((res, rej) => {\n promises.push({res, rej});\n });\n }\n\n _notify(resolved) {\n const method = resolved ? 'res' : 'rej';\n const promises = this._promises || [];\n for (let i = 0; i < promises.length; i++) {\n promises[i][method]();\n }\n }\n}\n","import animator from './core.animator.js';\nimport Animation from './core.animation.js';\nimport defaults from './core.defaults.js';\nimport {isArray, isObject} from '../helpers/helpers.core.js';\n\nexport default class Animations {\n constructor(chart, config) {\n this._chart = chart;\n this._properties = new Map();\n this.configure(config);\n }\n\n configure(config) {\n if (!isObject(config)) {\n return;\n }\n\n const animationOptions = Object.keys(defaults.animation);\n const animatedProps = this._properties;\n\n Object.getOwnPropertyNames(config).forEach(key => {\n const cfg = config[key];\n if (!isObject(cfg)) {\n return;\n }\n const resolved = {};\n for (const option of animationOptions) {\n resolved[option] = cfg[option];\n }\n\n (isArray(cfg.properties) && cfg.properties || [key]).forEach((prop) => {\n if (prop === key || !animatedProps.has(prop)) {\n animatedProps.set(prop, resolved);\n }\n });\n });\n }\n\n /**\n\t * Utility to handle animation of `options`.\n\t * @private\n\t */\n _animateOptions(target, values) {\n const newOptions = values.options;\n const options = resolveTargetOptions(target, newOptions);\n if (!options) {\n return [];\n }\n\n const animations = this._createAnimations(options, newOptions);\n if (newOptions.$shared) {\n // Going to shared options:\n // After all animations are done, assign the shared options object to the element\n // So any new updates to the shared options are observed\n awaitAll(target.options.$animations, newOptions).then(() => {\n target.options = newOptions;\n }, () => {\n // rejected, noop\n });\n }\n\n return animations;\n }\n\n /**\n\t * @private\n\t */\n _createAnimations(target, values) {\n const animatedProps = this._properties;\n const animations = [];\n const running = target.$animations || (target.$animations = {});\n const props = Object.keys(values);\n const date = Date.now();\n let i;\n\n for (i = props.length - 1; i >= 0; --i) {\n const prop = props[i];\n if (prop.charAt(0) === '$') {\n continue;\n }\n\n if (prop === 'options') {\n animations.push(...this._animateOptions(target, values));\n continue;\n }\n const value = values[prop];\n let animation = running[prop];\n const cfg = animatedProps.get(prop);\n\n if (animation) {\n if (cfg && animation.active()) {\n // There is an existing active animation, let's update that\n animation.update(cfg, value, date);\n continue;\n } else {\n animation.cancel();\n }\n }\n if (!cfg || !cfg.duration) {\n // not animated, set directly to new value\n target[prop] = value;\n continue;\n }\n\n running[prop] = animation = new Animation(cfg, target, prop, value);\n animations.push(animation);\n }\n return animations;\n }\n\n\n /**\n\t * Update `target` properties to new values, using configured animations\n\t * @param {object} target - object to update\n\t * @param {object} values - new target properties\n\t * @returns {boolean|undefined} - `true` if animations were started\n\t **/\n update(target, values) {\n if (this._properties.size === 0) {\n // Nothing is animated, just apply the new values.\n Object.assign(target, values);\n return;\n }\n\n const animations = this._createAnimations(target, values);\n\n if (animations.length) {\n animator.add(this._chart, animations);\n return true;\n }\n }\n}\n\nfunction awaitAll(animations, properties) {\n const running = [];\n const keys = Object.keys(properties);\n for (let i = 0; i < keys.length; i++) {\n const anim = animations[keys[i]];\n if (anim && anim.active()) {\n running.push(anim.wait());\n }\n }\n // @ts-ignore\n return Promise.all(running);\n}\n\nfunction resolveTargetOptions(target, newOptions) {\n if (!newOptions) {\n return;\n }\n let options = target.options;\n if (!options) {\n target.options = newOptions;\n return;\n }\n if (options.$shared) {\n // Going from shared options to distinct one:\n // Create new options object containing the old shared values and start updating that.\n target.options = options = Object.assign({}, options, {$shared: false, $animations: {}});\n }\n return options;\n}\n","import Animations from './core.animations.js';\nimport defaults from './core.defaults.js';\nimport {isArray, isFinite, isObject, valueOrDefault, resolveObjectKey, defined} from '../helpers/helpers.core.js';\nimport {listenArrayEvents, unlistenArrayEvents} from '../helpers/helpers.collection.js';\nimport {createContext, sign} from '../helpers/index.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('./core.scale.js').default } Scale\n */\n\nfunction scaleClip(scale, allowedOverflow) {\n const opts = scale && scale.options || {};\n const reverse = opts.reverse;\n const min = opts.min === undefined ? allowedOverflow : 0;\n const max = opts.max === undefined ? allowedOverflow : 0;\n return {\n start: reverse ? max : min,\n end: reverse ? min : max\n };\n}\n\nfunction defaultClip(xScale, yScale, allowedOverflow) {\n if (allowedOverflow === false) {\n return false;\n }\n const x = scaleClip(xScale, allowedOverflow);\n const y = scaleClip(yScale, allowedOverflow);\n\n return {\n top: y.end,\n right: x.end,\n bottom: y.start,\n left: x.start\n };\n}\n\nfunction toClip(value) {\n let t, r, b, l;\n\n if (isObject(value)) {\n t = value.top;\n r = value.right;\n b = value.bottom;\n l = value.left;\n } else {\n t = r = b = l = value;\n }\n\n return {\n top: t,\n right: r,\n bottom: b,\n left: l,\n disabled: value === false\n };\n}\n\nfunction getSortedDatasetIndices(chart, filterVisible) {\n const keys = [];\n const metasets = chart._getSortedDatasetMetas(filterVisible);\n let i, ilen;\n\n for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n keys.push(metasets[i].index);\n }\n return keys;\n}\n\nfunction applyStack(stack, value, dsIndex, options = {}) {\n const keys = stack.keys;\n const singleMode = options.mode === 'single';\n let i, ilen, datasetIndex, otherValue;\n\n if (value === null) {\n return;\n }\n\n let found = false;\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n datasetIndex = +keys[i];\n if (datasetIndex === dsIndex) {\n found = true;\n if (options.all) {\n continue;\n }\n break;\n }\n otherValue = stack.values[datasetIndex];\n if (isFinite(otherValue) && (singleMode || (value === 0 || sign(value) === sign(otherValue)))) {\n value += otherValue;\n }\n }\n\n if (!found && !options.all) {\n return 0;\n }\n\n return value;\n}\n\nfunction convertObjectDataToArray(data, meta) {\n const {iScale, vScale} = meta;\n const iAxisKey = iScale.axis === 'x' ? 'x' : 'y';\n const vAxisKey = vScale.axis === 'x' ? 'x' : 'y';\n const keys = Object.keys(data);\n const adata = new Array(keys.length);\n let i, ilen, key;\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n key = keys[i];\n adata[i] = {\n [iAxisKey]: key,\n [vAxisKey]: data[key]\n };\n }\n return adata;\n}\n\nfunction isStacked(scale, meta) {\n const stacked = scale && scale.options.stacked;\n return stacked || (stacked === undefined && meta.stack !== undefined);\n}\n\nfunction getStackKey(indexScale, valueScale, meta) {\n return `${indexScale.id}.${valueScale.id}.${meta.stack || meta.type}`;\n}\n\nfunction getUserBounds(scale) {\n const {min, max, minDefined, maxDefined} = scale.getUserBounds();\n return {\n min: minDefined ? min : Number.NEGATIVE_INFINITY,\n max: maxDefined ? max : Number.POSITIVE_INFINITY\n };\n}\n\nfunction getOrCreateStack(stacks, stackKey, indexValue) {\n const subStack = stacks[stackKey] || (stacks[stackKey] = {});\n return subStack[indexValue] || (subStack[indexValue] = {});\n}\n\nfunction getLastIndexInStack(stack, vScale, positive, type) {\n for (const meta of vScale.getMatchingVisibleMetas(type).reverse()) {\n const value = stack[meta.index];\n if ((positive && value > 0) || (!positive && value < 0)) {\n return meta.index;\n }\n }\n\n return null;\n}\n\nfunction updateStacks(controller, parsed) {\n const {chart, _cachedMeta: meta} = controller;\n const stacks = chart._stacks || (chart._stacks = {}); // map structure is {stackKey: {datasetIndex: value}}\n const {iScale, vScale, index: datasetIndex} = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const key = getStackKey(iScale, vScale, meta);\n const ilen = parsed.length;\n let stack;\n\n for (let i = 0; i < ilen; ++i) {\n const item = parsed[i];\n const {[iAxis]: index, [vAxis]: value} = item;\n const itemStacks = item._stacks || (item._stacks = {});\n stack = itemStacks[vAxis] = getOrCreateStack(stacks, key, index);\n stack[datasetIndex] = value;\n\n stack._top = getLastIndexInStack(stack, vScale, true, meta.type);\n stack._bottom = getLastIndexInStack(stack, vScale, false, meta.type);\n\n const visualValues = stack._visualValues || (stack._visualValues = {});\n visualValues[datasetIndex] = value;\n }\n}\n\nfunction getFirstScaleId(chart, axis) {\n const scales = chart.scales;\n return Object.keys(scales).filter(key => scales[key].axis === axis).shift();\n}\n\nfunction createDatasetContext(parent, index) {\n return createContext(parent,\n {\n active: false,\n dataset: undefined,\n datasetIndex: index,\n index,\n mode: 'default',\n type: 'dataset'\n }\n );\n}\n\nfunction createDataContext(parent, index, element) {\n return createContext(parent, {\n active: false,\n dataIndex: index,\n parsed: undefined,\n raw: undefined,\n element,\n index,\n mode: 'default',\n type: 'data'\n });\n}\n\nfunction clearStacks(meta, items) {\n // Not using meta.index here, because it might be already updated if the dataset changed location\n const datasetIndex = meta.controller.index;\n const axis = meta.vScale && meta.vScale.axis;\n if (!axis) {\n return;\n }\n\n items = items || meta._parsed;\n for (const parsed of items) {\n const stacks = parsed._stacks;\n if (!stacks || stacks[axis] === undefined || stacks[axis][datasetIndex] === undefined) {\n return;\n }\n delete stacks[axis][datasetIndex];\n if (stacks[axis]._visualValues !== undefined && stacks[axis]._visualValues[datasetIndex] !== undefined) {\n delete stacks[axis]._visualValues[datasetIndex];\n }\n }\n}\n\nconst isDirectUpdateMode = (mode) => mode === 'reset' || mode === 'none';\nconst cloneIfNotShared = (cached, shared) => shared ? cached : Object.assign({}, cached);\nconst createStack = (canStack, meta, chart) => canStack && !meta.hidden && meta._stacked\n && {keys: getSortedDatasetIndices(chart, true), values: null};\n\nexport default class DatasetController {\n\n /**\n * @type {any}\n */\n static defaults = {};\n\n /**\n * Element type used to generate a meta dataset (e.g. Chart.element.LineElement).\n */\n static datasetElementType = null;\n\n /**\n * Element type used to generate a meta data (e.g. Chart.element.PointElement).\n */\n static dataElementType = null;\n\n /**\n\t * @param {Chart} chart\n\t * @param {number} datasetIndex\n\t */\n constructor(chart, datasetIndex) {\n this.chart = chart;\n this._ctx = chart.ctx;\n this.index = datasetIndex;\n this._cachedDataOpts = {};\n this._cachedMeta = this.getMeta();\n this._type = this._cachedMeta.type;\n this.options = undefined;\n /** @type {boolean | object} */\n this._parsing = false;\n this._data = undefined;\n this._objectData = undefined;\n this._sharedOptions = undefined;\n this._drawStart = undefined;\n this._drawCount = undefined;\n this.enableOptionSharing = false;\n this.supportsDecimation = false;\n this.$context = undefined;\n this._syncList = [];\n this.datasetElementType = new.target.datasetElementType;\n this.dataElementType = new.target.dataElementType;\n\n this.initialize();\n }\n\n initialize() {\n const meta = this._cachedMeta;\n this.configure();\n this.linkScales();\n meta._stacked = isStacked(meta.vScale, meta);\n this.addElements();\n\n if (this.options.fill && !this.chart.isPluginEnabled('filler')) {\n console.warn(\"Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options\");\n }\n }\n\n updateIndex(datasetIndex) {\n if (this.index !== datasetIndex) {\n clearStacks(this._cachedMeta);\n }\n this.index = datasetIndex;\n }\n\n linkScales() {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n\n const chooseId = (axis, x, y, r) => axis === 'x' ? x : axis === 'r' ? r : y;\n\n const xid = meta.xAxisID = valueOrDefault(dataset.xAxisID, getFirstScaleId(chart, 'x'));\n const yid = meta.yAxisID = valueOrDefault(dataset.yAxisID, getFirstScaleId(chart, 'y'));\n const rid = meta.rAxisID = valueOrDefault(dataset.rAxisID, getFirstScaleId(chart, 'r'));\n const indexAxis = meta.indexAxis;\n const iid = meta.iAxisID = chooseId(indexAxis, xid, yid, rid);\n const vid = meta.vAxisID = chooseId(indexAxis, yid, xid, rid);\n meta.xScale = this.getScaleForId(xid);\n meta.yScale = this.getScaleForId(yid);\n meta.rScale = this.getScaleForId(rid);\n meta.iScale = this.getScaleForId(iid);\n meta.vScale = this.getScaleForId(vid);\n }\n\n getDataset() {\n return this.chart.data.datasets[this.index];\n }\n\n getMeta() {\n return this.chart.getDatasetMeta(this.index);\n }\n\n /**\n\t * @param {string} scaleID\n\t * @return {Scale}\n\t */\n getScaleForId(scaleID) {\n return this.chart.scales[scaleID];\n }\n\n /**\n\t * @private\n\t */\n _getOtherScale(scale) {\n const meta = this._cachedMeta;\n return scale === meta.iScale\n ? meta.vScale\n : meta.iScale;\n }\n\n reset() {\n this._update('reset');\n }\n\n /**\n\t * @private\n\t */\n _destroy() {\n const meta = this._cachedMeta;\n if (this._data) {\n unlistenArrayEvents(this._data, this);\n }\n if (meta._stacked) {\n clearStacks(meta);\n }\n }\n\n /**\n\t * @private\n\t */\n _dataCheck() {\n const dataset = this.getDataset();\n const data = dataset.data || (dataset.data = []);\n const _data = this._data;\n\n // In order to correctly handle data addition/deletion animation (and thus simulate\n // real-time charts), we need to monitor these data modifications and synchronize\n // the internal metadata accordingly.\n\n if (isObject(data)) {\n const meta = this._cachedMeta;\n this._data = convertObjectDataToArray(data, meta);\n } else if (_data !== data) {\n if (_data) {\n // This case happens when the user replaced the data array instance.\n unlistenArrayEvents(_data, this);\n // Discard old parsed data and stacks\n const meta = this._cachedMeta;\n clearStacks(meta);\n meta._parsed = [];\n }\n if (data && Object.isExtensible(data)) {\n listenArrayEvents(data, this);\n }\n this._syncList = [];\n this._data = data;\n }\n }\n\n addElements() {\n const meta = this._cachedMeta;\n\n this._dataCheck();\n\n if (this.datasetElementType) {\n meta.dataset = new this.datasetElementType();\n }\n }\n\n buildOrUpdateElements(resetNewElements) {\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n let stackChanged = false;\n\n this._dataCheck();\n\n // make sure cached _stacked status is current\n const oldStacked = meta._stacked;\n meta._stacked = isStacked(meta.vScale, meta);\n\n // detect change in stack option\n if (meta.stack !== dataset.stack) {\n stackChanged = true;\n // remove values from old stack\n clearStacks(meta);\n meta.stack = dataset.stack;\n }\n\n // Re-sync meta data in case the user replaced the data array or if we missed\n // any updates and so make sure that we handle number of datapoints changing.\n this._resyncElements(resetNewElements);\n\n // if stack changed, update stack values for the whole dataset\n if (stackChanged || oldStacked !== meta._stacked) {\n updateStacks(this, meta._parsed);\n meta._stacked = isStacked(meta.vScale, meta);\n }\n }\n\n /**\n\t * Merges user-supplied and default dataset-level options\n\t * @private\n\t */\n configure() {\n const config = this.chart.config;\n const scopeKeys = config.datasetScopeKeys(this._type);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys, true);\n this.options = config.createResolver(scopes, this.getContext());\n this._parsing = this.options.parsing;\n this._cachedDataOpts = {};\n }\n\n /**\n\t * @param {number} start\n\t * @param {number} count\n\t */\n parse(start, count) {\n const {_cachedMeta: meta, _data: data} = this;\n const {iScale, _stacked} = meta;\n const iAxis = iScale.axis;\n\n let sorted = start === 0 && count === data.length ? true : meta._sorted;\n let prev = start > 0 && meta._parsed[start - 1];\n let i, cur, parsed;\n\n if (this._parsing === false) {\n meta._parsed = data;\n meta._sorted = true;\n parsed = data;\n } else {\n if (isArray(data[start])) {\n parsed = this.parseArrayData(meta, data, start, count);\n } else if (isObject(data[start])) {\n parsed = this.parseObjectData(meta, data, start, count);\n } else {\n parsed = this.parsePrimitiveData(meta, data, start, count);\n }\n\n const isNotInOrderComparedToPrev = () => cur[iAxis] === null || (prev && cur[iAxis] < prev[iAxis]);\n for (i = 0; i < count; ++i) {\n meta._parsed[i + start] = cur = parsed[i];\n if (sorted) {\n if (isNotInOrderComparedToPrev()) {\n sorted = false;\n }\n prev = cur;\n }\n }\n meta._sorted = sorted;\n }\n\n if (_stacked) {\n updateStacks(this, parsed);\n }\n }\n\n /**\n\t * Parse array of primitive values\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [1,3,4]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id.\n\t * Example: {xScale0: 0, yScale0: 1}\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n const {iScale, vScale} = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = new Array(count);\n let i, ilen, index;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n parsed[i] = {\n [iAxis]: singleScale || iScale.parse(labels[index], index),\n [vAxis]: vScale.parse(data[index], index)\n };\n }\n return parsed;\n }\n\n /**\n\t * Parse array of arrays\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [[1,2],[3,4]]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id.\n\t * Example: {x: 0, y: 1}\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const parsed = new Array(count);\n let i, ilen, index, item;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(item[0], index),\n y: yScale.parse(item[1], index)\n };\n }\n return parsed;\n }\n\n /**\n\t * Parse array of objects\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [{x:1, y:5}, {x:2, y:10}]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id. _custom is optional\n\t * Example: {xScale0: 0, yScale0: 1, _custom: {r: 10, foo: 'bar'}}\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n const parsed = new Array(count);\n let i, ilen, index, item;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(resolveObjectKey(item, xAxisKey), index),\n y: yScale.parse(resolveObjectKey(item, yAxisKey), index)\n };\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n getParsed(index) {\n return this._cachedMeta._parsed[index];\n }\n\n /**\n\t * @protected\n\t */\n getDataElement(index) {\n return this._cachedMeta.data[index];\n }\n\n /**\n\t * @protected\n\t */\n applyStack(scale, parsed, mode) {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const value = parsed[scale.axis];\n const stack = {\n keys: getSortedDatasetIndices(chart, true),\n values: parsed._stacks[scale.axis]._visualValues\n };\n return applyStack(stack, value, meta.index, {mode});\n }\n\n /**\n\t * @protected\n\t */\n updateRangeFromParsed(range, scale, parsed, stack) {\n const parsedValue = parsed[scale.axis];\n let value = parsedValue === null ? NaN : parsedValue;\n const values = stack && parsed._stacks[scale.axis];\n if (stack && values) {\n stack.values = values;\n value = applyStack(stack, parsedValue, this._cachedMeta.index);\n }\n range.min = Math.min(range.min, value);\n range.max = Math.max(range.max, value);\n }\n\n /**\n\t * @protected\n\t */\n getMinMax(scale, canStack) {\n const meta = this._cachedMeta;\n const _parsed = meta._parsed;\n const sorted = meta._sorted && scale === meta.iScale;\n const ilen = _parsed.length;\n const otherScale = this._getOtherScale(scale);\n const stack = createStack(canStack, meta, this.chart);\n const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n const {min: otherMin, max: otherMax} = getUserBounds(otherScale);\n let i, parsed;\n\n function _skip() {\n parsed = _parsed[i];\n const otherValue = parsed[otherScale.axis];\n return !isFinite(parsed[scale.axis]) || otherMin > otherValue || otherMax < otherValue;\n }\n\n for (i = 0; i < ilen; ++i) {\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n if (sorted) {\n // if the data is sorted, we don't need to check further from this end of array\n break;\n }\n }\n if (sorted) {\n // in the sorted case, find first non-skipped value from other end of array\n for (i = ilen - 1; i >= 0; --i) {\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n break;\n }\n }\n return range;\n }\n\n getAllParsedValues(scale) {\n const parsed = this._cachedMeta._parsed;\n const values = [];\n let i, ilen, value;\n\n for (i = 0, ilen = parsed.length; i < ilen; ++i) {\n value = parsed[i][scale.axis];\n if (isFinite(value)) {\n values.push(value);\n }\n }\n return values;\n }\n\n /**\n\t * @return {number|boolean}\n\t * @protected\n\t */\n getMaxOverflow() {\n return false;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const parsed = this.getParsed(index);\n return {\n label: iScale ? '' + iScale.getLabelForValue(parsed[iScale.axis]) : '',\n value: vScale ? '' + vScale.getLabelForValue(parsed[vScale.axis]) : ''\n };\n }\n\n /**\n\t * @private\n\t */\n _update(mode) {\n const meta = this._cachedMeta;\n this.update(mode || 'default');\n meta._clip = toClip(valueOrDefault(this.options.clip, defaultClip(meta.xScale, meta.yScale, this.getMaxOverflow())));\n }\n\n /**\n\t * @param {string} mode\n\t */\n update(mode) {} // eslint-disable-line no-unused-vars\n\n draw() {\n const ctx = this._ctx;\n const chart = this.chart;\n const meta = this._cachedMeta;\n const elements = meta.data || [];\n const area = chart.chartArea;\n const active = [];\n const start = this._drawStart || 0;\n const count = this._drawCount || (elements.length - start);\n const drawActiveElementsOnTop = this.options.drawActiveElementsOnTop;\n let i;\n\n if (meta.dataset) {\n meta.dataset.draw(ctx, area, start, count);\n }\n\n for (i = start; i < start + count; ++i) {\n const element = elements[i];\n if (element.hidden) {\n continue;\n }\n if (element.active && drawActiveElementsOnTop) {\n active.push(element);\n } else {\n element.draw(ctx, area);\n }\n }\n\n for (i = 0; i < active.length; ++i) {\n active[i].draw(ctx, area);\n }\n }\n\n /**\n\t * Returns a set of predefined style properties that should be used to represent the dataset\n\t * or the data if the index is specified\n\t * @param {number} index - data index\n\t * @param {boolean} [active] - true if hover\n\t * @return {object} style object\n\t */\n getStyle(index, active) {\n const mode = active ? 'active' : 'default';\n return index === undefined && this._cachedMeta.dataset\n ? this.resolveDatasetElementOptions(mode)\n : this.resolveDataElementOptions(index || 0, mode);\n }\n\n /**\n\t * @protected\n\t */\n getContext(index, active, mode) {\n const dataset = this.getDataset();\n let context;\n if (index >= 0 && index < this._cachedMeta.data.length) {\n const element = this._cachedMeta.data[index];\n context = element.$context ||\n (element.$context = createDataContext(this.getContext(), index, element));\n context.parsed = this.getParsed(index);\n context.raw = dataset.data[index];\n context.index = context.dataIndex = index;\n } else {\n context = this.$context ||\n (this.$context = createDatasetContext(this.chart.getContext(), this.index));\n context.dataset = dataset;\n context.index = context.datasetIndex = this.index;\n }\n\n context.active = !!active;\n context.mode = mode;\n return context;\n }\n\n /**\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDatasetElementOptions(mode) {\n return this._resolveElementOptions(this.datasetElementType.id, mode);\n }\n\n /**\n\t * @param {number} index\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDataElementOptions(index, mode) {\n return this._resolveElementOptions(this.dataElementType.id, mode, index);\n }\n\n /**\n\t * @private\n\t */\n _resolveElementOptions(elementType, mode = 'default', index) {\n const active = mode === 'active';\n const cache = this._cachedDataOpts;\n const cacheKey = elementType + '-' + mode;\n const cached = cache[cacheKey];\n const sharing = this.enableOptionSharing && defined(index);\n if (cached) {\n return cloneIfNotShared(cached, sharing);\n }\n const config = this.chart.config;\n const scopeKeys = config.datasetElementScopeKeys(this._type, elementType);\n const prefixes = active ? [`${elementType}Hover`, 'hover', elementType, ''] : [elementType, ''];\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n const names = Object.keys(defaults.elements[elementType]);\n // context is provided as a function, and is called only if needed,\n // so we don't create a context for each element if not needed.\n const context = () => this.getContext(index, active, mode);\n const values = config.resolveNamedOptions(scopes, names, context, prefixes);\n\n if (values.$shared) {\n // `$shared` indicates this set of options can be shared between multiple elements.\n // Sharing is used to reduce number of properties to change during animation.\n values.$shared = sharing;\n\n // We cache options by `mode`, which can be 'active' for example. This enables us\n // to have the 'active' element options and 'default' options to switch between\n // when interacting.\n cache[cacheKey] = Object.freeze(cloneIfNotShared(values, sharing));\n }\n\n return values;\n }\n\n\n /**\n\t * @private\n\t */\n _resolveAnimations(index, transition, active) {\n const chart = this.chart;\n const cache = this._cachedDataOpts;\n const cacheKey = `animation-${transition}`;\n const cached = cache[cacheKey];\n if (cached) {\n return cached;\n }\n let options;\n if (chart.options.animation !== false) {\n const config = this.chart.config;\n const scopeKeys = config.datasetAnimationScopeKeys(this._type, transition);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n options = config.createResolver(scopes, this.getContext(index, active, transition));\n }\n const animations = new Animations(chart, options && options.animations);\n if (options && options._cacheable) {\n cache[cacheKey] = Object.freeze(animations);\n }\n return animations;\n }\n\n /**\n\t * Utility for getting the options object shared between elements\n\t * @protected\n\t */\n getSharedOptions(options) {\n if (!options.$shared) {\n return;\n }\n return this._sharedOptions || (this._sharedOptions = Object.assign({}, options));\n }\n\n /**\n\t * Utility for determining if `options` should be included in the updated properties\n\t * @protected\n\t */\n includeOptions(mode, sharedOptions) {\n return !sharedOptions || isDirectUpdateMode(mode) || this.chart._animationsDisabled;\n }\n\n /**\n * @todo v4, rename to getSharedOptions and remove excess functions\n */\n _getSharedOptions(start, mode) {\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const previouslySharedOptions = this._sharedOptions;\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions) || (sharedOptions !== previouslySharedOptions);\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n return {sharedOptions, includeOptions};\n }\n\n /**\n\t * Utility for updating an element with new properties, using animations when appropriate.\n\t * @protected\n\t */\n updateElement(element, index, properties, mode) {\n if (isDirectUpdateMode(mode)) {\n Object.assign(element, properties);\n } else {\n this._resolveAnimations(index, mode).update(element, properties);\n }\n }\n\n /**\n\t * Utility to animate the shared options, that are potentially affecting multiple elements.\n\t * @protected\n\t */\n updateSharedOptions(sharedOptions, mode, newOptions) {\n if (sharedOptions && !isDirectUpdateMode(mode)) {\n this._resolveAnimations(undefined, mode).update(sharedOptions, newOptions);\n }\n }\n\n /**\n\t * @private\n\t */\n _setStyle(element, index, mode, active) {\n element.active = active;\n const options = this.getStyle(index, active);\n this._resolveAnimations(index, mode, active).update(element, {\n // When going from active to inactive, we need to update to the shared options.\n // This way the once hovered element will end up with the same original shared options instance, after animation.\n options: (!active && this.getSharedOptions(options)) || options\n });\n }\n\n removeHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', false);\n }\n\n setHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', true);\n }\n\n /**\n\t * @private\n\t */\n _removeDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n\n if (element) {\n this._setStyle(element, undefined, 'active', false);\n }\n }\n\n /**\n\t * @private\n\t */\n _setDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n\n if (element) {\n this._setStyle(element, undefined, 'active', true);\n }\n }\n\n /**\n\t * @private\n\t */\n _resyncElements(resetNewElements) {\n const data = this._data;\n const elements = this._cachedMeta.data;\n\n // Apply changes detected through array listeners\n for (const [method, arg1, arg2] of this._syncList) {\n this[method](arg1, arg2);\n }\n this._syncList = [];\n\n const numMeta = elements.length;\n const numData = data.length;\n const count = Math.min(numData, numMeta);\n\n if (count) {\n // TODO: It is not optimal to always parse the old data\n // This is done because we are not detecting direct assignments:\n // chart.data.datasets[0].data[5] = 10;\n // chart.data.datasets[0].data[5].y = 10;\n this.parse(0, count);\n }\n\n if (numData > numMeta) {\n this._insertElements(numMeta, numData - numMeta, resetNewElements);\n } else if (numData < numMeta) {\n this._removeElements(numData, numMeta - numData);\n }\n }\n\n /**\n\t * @private\n\t */\n _insertElements(start, count, resetNewElements = true) {\n const meta = this._cachedMeta;\n const data = meta.data;\n const end = start + count;\n let i;\n\n const move = (arr) => {\n arr.length += count;\n for (i = arr.length - 1; i >= end; i--) {\n arr[i] = arr[i - count];\n }\n };\n move(data);\n\n for (i = start; i < end; ++i) {\n data[i] = new this.dataElementType();\n }\n\n if (this._parsing) {\n move(meta._parsed);\n }\n this.parse(start, count);\n\n if (resetNewElements) {\n this.updateElements(data, start, count, 'reset');\n }\n }\n\n updateElements(element, start, count, mode) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * @private\n\t */\n _removeElements(start, count) {\n const meta = this._cachedMeta;\n if (this._parsing) {\n const removed = meta._parsed.splice(start, count);\n if (meta._stacked) {\n clearStacks(meta, removed);\n }\n }\n meta.data.splice(start, count);\n }\n\n /**\n\t * @private\n */\n _sync(args) {\n if (this._parsing) {\n this._syncList.push(args);\n } else {\n const [method, arg1, arg2] = args;\n this[method](arg1, arg2);\n }\n this.chart._dataChanges.push([this.index, ...args]);\n }\n\n _onDataPush() {\n const count = arguments.length;\n this._sync(['_insertElements', this.getDataset().data.length - count, count]);\n }\n\n _onDataPop() {\n this._sync(['_removeElements', this._cachedMeta.data.length - 1, 1]);\n }\n\n _onDataShift() {\n this._sync(['_removeElements', 0, 1]);\n }\n\n _onDataSplice(start, count) {\n if (count) {\n this._sync(['_removeElements', start, count]);\n }\n const newCount = arguments.length - 2;\n if (newCount) {\n this._sync(['_insertElements', start, newCount]);\n }\n }\n\n _onDataUnshift() {\n this._sync(['_insertElements', 0, arguments.length]);\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {\n _arrayUnique, isArray, isNullOrUndef,\n valueOrDefault, resolveObjectKey, sign, defined\n} from '../helpers/index.js';\n\nfunction getAllScaleValues(scale, type) {\n if (!scale._cache.$bar) {\n const visibleMetas = scale.getMatchingVisibleMetas(type);\n let values = [];\n\n for (let i = 0, ilen = visibleMetas.length; i < ilen; i++) {\n values = values.concat(visibleMetas[i].controller.getAllParsedValues(scale));\n }\n scale._cache.$bar = _arrayUnique(values.sort((a, b) => a - b));\n }\n return scale._cache.$bar;\n}\n\n/**\n * Computes the \"optimal\" sample size to maintain bars equally sized while preventing overlap.\n * @private\n */\nfunction computeMinSampleSize(meta) {\n const scale = meta.iScale;\n const values = getAllScaleValues(scale, meta.type);\n let min = scale._length;\n let i, ilen, curr, prev;\n const updateMinAndPrev = () => {\n if (curr === 32767 || curr === -32768) {\n // Ignore truncated pixels\n return;\n }\n if (defined(prev)) {\n // curr - prev === 0 is ignored\n min = Math.min(min, Math.abs(curr - prev) || min);\n }\n prev = curr;\n };\n\n for (i = 0, ilen = values.length; i < ilen; ++i) {\n curr = scale.getPixelForValue(values[i]);\n updateMinAndPrev();\n }\n\n prev = undefined;\n for (i = 0, ilen = scale.ticks.length; i < ilen; ++i) {\n curr = scale.getPixelForTick(i);\n updateMinAndPrev();\n }\n\n return min;\n}\n\n/**\n * Computes an \"ideal\" category based on the absolute bar thickness or, if undefined or null,\n * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This\n * mode currently always generates bars equally sized (until we introduce scriptable options?).\n * @private\n */\nfunction computeFitCategoryTraits(index, ruler, options, stackCount) {\n const thickness = options.barThickness;\n let size, ratio;\n\n if (isNullOrUndef(thickness)) {\n size = ruler.min * options.categoryPercentage;\n ratio = options.barPercentage;\n } else {\n // When bar thickness is enforced, category and bar percentages are ignored.\n // Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%')\n // and deprecate barPercentage since this value is ignored when thickness is absolute.\n size = thickness * stackCount;\n ratio = 1;\n }\n\n return {\n chunk: size / stackCount,\n ratio,\n start: ruler.pixels[index] - (size / 2)\n };\n}\n\n/**\n * Computes an \"optimal\" category that globally arranges bars side by side (no gap when\n * percentage options are 1), based on the previous and following categories. This mode\n * generates bars with different widths when data are not evenly spaced.\n * @private\n */\nfunction computeFlexCategoryTraits(index, ruler, options, stackCount) {\n const pixels = ruler.pixels;\n const curr = pixels[index];\n let prev = index > 0 ? pixels[index - 1] : null;\n let next = index < pixels.length - 1 ? pixels[index + 1] : null;\n const percent = options.categoryPercentage;\n\n if (prev === null) {\n // first data: its size is double based on the next point or,\n // if it's also the last data, we use the scale size.\n prev = curr - (next === null ? ruler.end - ruler.start : next - curr);\n }\n\n if (next === null) {\n // last data: its size is also double based on the previous point.\n next = curr + curr - prev;\n }\n\n const start = curr - (curr - Math.min(prev, next)) / 2 * percent;\n const size = Math.abs(next - prev) / 2 * percent;\n\n return {\n chunk: size / stackCount,\n ratio: options.barPercentage,\n start\n };\n}\n\nfunction parseFloatBar(entry, item, vScale, i) {\n const startValue = vScale.parse(entry[0], i);\n const endValue = vScale.parse(entry[1], i);\n const min = Math.min(startValue, endValue);\n const max = Math.max(startValue, endValue);\n let barStart = min;\n let barEnd = max;\n\n if (Math.abs(min) > Math.abs(max)) {\n barStart = max;\n barEnd = min;\n }\n\n // Store `barEnd` (furthest away from origin) as parsed value,\n // to make stacking straight forward\n item[vScale.axis] = barEnd;\n\n item._custom = {\n barStart,\n barEnd,\n start: startValue,\n end: endValue,\n min,\n max\n };\n}\n\nfunction parseValue(entry, item, vScale, i) {\n if (isArray(entry)) {\n parseFloatBar(entry, item, vScale, i);\n } else {\n item[vScale.axis] = vScale.parse(entry, i);\n }\n return item;\n}\n\nfunction parseArrayOrPrimitive(meta, data, start, count) {\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = [];\n let i, ilen, item, entry;\n\n for (i = start, ilen = start + count; i < ilen; ++i) {\n entry = data[i];\n item = {};\n item[iScale.axis] = singleScale || iScale.parse(labels[i], i);\n parsed.push(parseValue(entry, item, vScale, i));\n }\n return parsed;\n}\n\nfunction isFloatBar(custom) {\n return custom && custom.barStart !== undefined && custom.barEnd !== undefined;\n}\n\nfunction barSign(size, vScale, actualBase) {\n if (size !== 0) {\n return sign(size);\n }\n return (vScale.isHorizontal() ? 1 : -1) * (vScale.min >= actualBase ? 1 : -1);\n}\n\nfunction borderProps(properties) {\n let reverse, start, end, top, bottom;\n if (properties.horizontal) {\n reverse = properties.base > properties.x;\n start = 'left';\n end = 'right';\n } else {\n reverse = properties.base < properties.y;\n start = 'bottom';\n end = 'top';\n }\n if (reverse) {\n top = 'end';\n bottom = 'start';\n } else {\n top = 'start';\n bottom = 'end';\n }\n return {start, end, reverse, top, bottom};\n}\n\nfunction setBorderSkipped(properties, options, stack, index) {\n let edge = options.borderSkipped;\n const res = {};\n\n if (!edge) {\n properties.borderSkipped = res;\n return;\n }\n\n if (edge === true) {\n properties.borderSkipped = {top: true, right: true, bottom: true, left: true};\n return;\n }\n\n const {start, end, reverse, top, bottom} = borderProps(properties);\n\n if (edge === 'middle' && stack) {\n properties.enableBorderRadius = true;\n if ((stack._top || 0) === index) {\n edge = top;\n } else if ((stack._bottom || 0) === index) {\n edge = bottom;\n } else {\n res[parseEdge(bottom, start, end, reverse)] = true;\n edge = top;\n }\n }\n\n res[parseEdge(edge, start, end, reverse)] = true;\n properties.borderSkipped = res;\n}\n\nfunction parseEdge(edge, a, b, reverse) {\n if (reverse) {\n edge = swap(edge, a, b);\n edge = startEnd(edge, b, a);\n } else {\n edge = startEnd(edge, a, b);\n }\n return edge;\n}\n\nfunction swap(orig, v1, v2) {\n return orig === v1 ? v2 : orig === v2 ? v1 : orig;\n}\n\nfunction startEnd(v, start, end) {\n return v === 'start' ? start : v === 'end' ? end : v;\n}\n\nfunction setInflateAmount(properties, {inflateAmount}, ratio) {\n properties.inflateAmount = inflateAmount === 'auto'\n ? ratio === 1 ? 0.33 : 0\n : inflateAmount;\n}\n\nexport default class BarController extends DatasetController {\n\n static id = 'bar';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'bar',\n\n categoryPercentage: 0.8,\n barPercentage: 0.9,\n grouped: true,\n\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'base', 'width', 'height']\n }\n }\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n _index_: {\n type: 'category',\n offset: true,\n grid: {\n offset: true\n }\n },\n _value_: {\n type: 'linear',\n beginAtZero: true,\n }\n }\n };\n\n\n /**\n\t * Overriding primitive data parsing since we support mixed primitive/array\n\t * data for float bars\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n\n /**\n\t * Overriding array data parsing since we support mixed primitive/array\n\t * data for float bars\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n\n /**\n\t * Overriding object data parsing since we support mixed primitive/array\n\t * value-scale data for float bars\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const {iScale, vScale} = meta;\n const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n const iAxisKey = iScale.axis === 'x' ? xAxisKey : yAxisKey;\n const vAxisKey = vScale.axis === 'x' ? xAxisKey : yAxisKey;\n const parsed = [];\n let i, ilen, item, obj;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n obj = data[i];\n item = {};\n item[iScale.axis] = iScale.parse(resolveObjectKey(obj, iAxisKey), i);\n parsed.push(parseValue(resolveObjectKey(obj, vAxisKey), item, vScale, i));\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n updateRangeFromParsed(range, scale, parsed, stack) {\n super.updateRangeFromParsed(range, scale, parsed, stack);\n const custom = parsed._custom;\n if (custom && scale === this._cachedMeta.vScale) {\n // float bar: only one end of the bar is considered by `super`\n range.min = Math.min(range.min, custom.min);\n range.max = Math.max(range.max, custom.max);\n }\n }\n\n /**\n\t * @return {number|boolean}\n\t * @protected\n\t */\n getMaxOverflow() {\n return 0;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const {iScale, vScale} = meta;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const value = isFloatBar(custom)\n ? '[' + custom.start + ', ' + custom.end + ']'\n : '' + vScale.getLabelForValue(parsed[vScale.axis]);\n\n return {\n label: '' + iScale.getLabelForValue(parsed[iScale.axis]),\n value\n };\n }\n\n initialize() {\n this.enableOptionSharing = true;\n\n super.initialize();\n\n const meta = this._cachedMeta;\n meta.stack = this.getDataset().stack;\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n this.updateElements(meta.data, 0, meta.data.length, mode);\n }\n\n updateElements(bars, start, count, mode) {\n const reset = mode === 'reset';\n const {index, _cachedMeta: {vScale}} = this;\n const base = vScale.getBasePixel();\n const horizontal = vScale.isHorizontal();\n const ruler = this._getRuler();\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n\n for (let i = start; i < start + count; i++) {\n const parsed = this.getParsed(i);\n const vpixels = reset || isNullOrUndef(parsed[vScale.axis]) ? {base, head: base} : this._calculateBarValuePixels(i);\n const ipixels = this._calculateBarIndexPixels(i, ruler);\n const stack = (parsed._stacks || {})[vScale.axis];\n\n const properties = {\n horizontal,\n base: vpixels.base,\n enableBorderRadius: !stack || isFloatBar(parsed._custom) || (index === stack._top || index === stack._bottom),\n x: horizontal ? vpixels.head : ipixels.center,\n y: horizontal ? ipixels.center : vpixels.head,\n height: horizontal ? ipixels.size : Math.abs(vpixels.size),\n width: horizontal ? Math.abs(vpixels.size) : ipixels.size\n };\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, bars[i].active ? 'active' : mode);\n }\n const options = properties.options || bars[i].options;\n setBorderSkipped(properties, options, stack, index);\n setInflateAmount(properties, options, ruler.ratio);\n this.updateElement(bars[i], i, properties, mode);\n }\n }\n\n /**\n\t * Returns the stacks based on groups and bar visibility.\n\t * @param {number} [last] - The dataset index\n\t * @param {number} [dataIndex] - The data index of the ruler\n\t * @returns {string[]} The list of stack IDs\n\t * @private\n\t */\n _getStacks(last, dataIndex) {\n const {iScale} = this._cachedMeta;\n const metasets = iScale.getMatchingVisibleMetas(this._type)\n .filter(meta => meta.controller.options.grouped);\n const stacked = iScale.options.stacked;\n const stacks = [];\n const currentParsed = this._cachedMeta.controller.getParsed(dataIndex);\n const iScaleValue = currentParsed && currentParsed[iScale.axis];\n\n const skipNull = (meta) => {\n const parsed = meta._parsed.find(item => item[iScale.axis] === iScaleValue);\n const val = parsed && parsed[meta.vScale.axis];\n\n if (isNullOrUndef(val) || isNaN(val)) {\n return true;\n }\n };\n\n for (const meta of metasets) {\n if (dataIndex !== undefined && skipNull(meta)) {\n continue;\n }\n\n // stacked | meta.stack\n // | found | not found | undefined\n // false | x | x | x\n // true | | x |\n // undefined | | x | x\n if (stacked === false || stacks.indexOf(meta.stack) === -1 ||\n\t\t\t\t(stacked === undefined && meta.stack === undefined)) {\n stacks.push(meta.stack);\n }\n if (meta.index === last) {\n break;\n }\n }\n\n // No stacks? that means there is no visible data. Let's still initialize an `undefined`\n // stack where possible invisible bars will be located.\n // https://github.com/chartjs/Chart.js/issues/6368\n if (!stacks.length) {\n stacks.push(undefined);\n }\n\n return stacks;\n }\n\n /**\n\t * Returns the effective number of stacks based on groups and bar visibility.\n\t * @private\n\t */\n _getStackCount(index) {\n return this._getStacks(undefined, index).length;\n }\n\n _getAxisCount() {\n return this._getAxis().length;\n }\n\n getFirstScaleIdForIndexAxis() {\n const scales = this.chart.scales;\n const indexScaleId = this.chart.options.indexAxis;\n return Object.keys(scales).filter(key => scales[key].axis === indexScaleId).shift();\n }\n\n _getAxis() {\n const axis = {};\n const firstScaleAxisId = this.getFirstScaleIdForIndexAxis();\n for (const dataset of this.chart.data.datasets) {\n axis[valueOrDefault(\n this.chart.options.indexAxis === 'x' ? dataset.xAxisID : dataset.yAxisID, firstScaleAxisId\n )] = true;\n }\n return Object.keys(axis);\n }\n\n /**\n\t * Returns the stack index for the given dataset based on groups and bar visibility.\n\t * @param {number} [datasetIndex] - The dataset index\n\t * @param {string} [name] - The stack name to find\n * @param {number} [dataIndex]\n\t * @returns {number} The stack index\n\t * @private\n\t */\n _getStackIndex(datasetIndex, name, dataIndex) {\n const stacks = this._getStacks(datasetIndex, dataIndex);\n const index = (name !== undefined)\n ? stacks.indexOf(name)\n : -1; // indexOf returns -1 if element is not present\n\n return (index === -1)\n ? stacks.length - 1\n : index;\n }\n\n /**\n\t * @private\n\t */\n _getRuler() {\n const opts = this.options;\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const pixels = [];\n let i, ilen;\n\n for (i = 0, ilen = meta.data.length; i < ilen; ++i) {\n pixels.push(iScale.getPixelForValue(this.getParsed(i)[iScale.axis], i));\n }\n\n const barThickness = opts.barThickness;\n const min = barThickness || computeMinSampleSize(meta);\n\n return {\n min,\n pixels,\n start: iScale._startPixel,\n end: iScale._endPixel,\n stackCount: this._getStackCount(),\n scale: iScale,\n grouped: opts.grouped,\n // bar thickness ratio used for non-grouped bars\n ratio: barThickness ? 1 : opts.categoryPercentage * opts.barPercentage\n };\n }\n\n /**\n\t * Note: pixel values are not clamped to the scale area.\n\t * @private\n\t */\n _calculateBarValuePixels(index) {\n const {_cachedMeta: {vScale, _stacked, index: datasetIndex}, options: {base: baseValue, minBarLength}} = this;\n const actualBase = baseValue || 0;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const floating = isFloatBar(custom);\n let value = parsed[vScale.axis];\n let start = 0;\n let length = _stacked ? this.applyStack(vScale, parsed, _stacked) : value;\n let head, size;\n\n if (length !== value) {\n start = length - value;\n length = value;\n }\n\n if (floating) {\n value = custom.barStart;\n length = custom.barEnd - custom.barStart;\n // bars crossing origin are not stacked\n if (value !== 0 && sign(value) !== sign(custom.barEnd)) {\n start = 0;\n }\n start += value;\n }\n\n const startValue = !isNullOrUndef(baseValue) && !floating ? baseValue : start;\n let base = vScale.getPixelForValue(startValue);\n\n if (this.chart.getDataVisibility(index)) {\n head = vScale.getPixelForValue(start + length);\n } else {\n // When not visible, no height\n head = base;\n }\n\n size = head - base;\n\n if (Math.abs(size) < minBarLength) {\n size = barSign(size, vScale, actualBase) * minBarLength;\n if (value === actualBase) {\n base -= size / 2;\n }\n const startPixel = vScale.getPixelForDecimal(0);\n const endPixel = vScale.getPixelForDecimal(1);\n const min = Math.min(startPixel, endPixel);\n const max = Math.max(startPixel, endPixel);\n base = Math.max(Math.min(base, max), min);\n head = base + size;\n\n if (_stacked && !floating) {\n // visual data coordinates after applying minBarLength\n parsed._stacks[vScale.axis]._visualValues[datasetIndex] = vScale.getValueForPixel(head) - vScale.getValueForPixel(base);\n }\n }\n\n if (base === vScale.getPixelForValue(actualBase)) {\n const halfGrid = sign(size) * vScale.getLineWidthForValue(actualBase) / 2;\n base += halfGrid;\n size -= halfGrid;\n }\n\n return {\n size,\n base,\n head,\n center: head + size / 2\n };\n }\n\n /**\n\t * @private\n\t */\n _calculateBarIndexPixels(index, ruler) {\n const scale = ruler.scale;\n const options = this.options;\n const skipNull = options.skipNull;\n const maxBarThickness = valueOrDefault(options.maxBarThickness, Infinity);\n let center, size;\n const axisCount = this._getAxisCount();\n if (ruler.grouped) {\n const stackCount = skipNull ? this._getStackCount(index) : ruler.stackCount;\n const range = options.barThickness === 'flex'\n ? computeFlexCategoryTraits(index, ruler, options, stackCount * axisCount)\n : computeFitCategoryTraits(index, ruler, options, stackCount * axisCount);\n const axisID = this.chart.options.indexAxis === 'x' ? this.getDataset().xAxisID : this.getDataset().yAxisID;\n const axisNumber = this._getAxis().indexOf(valueOrDefault(axisID, this.getFirstScaleIdForIndexAxis()));\n const stackIndex = this._getStackIndex(this.index, this._cachedMeta.stack, skipNull ? index : undefined) + axisNumber;\n center = range.start + (range.chunk * stackIndex) + (range.chunk / 2);\n size = Math.min(maxBarThickness, range.chunk * range.ratio);\n } else {\n // For non-grouped bar charts, exact pixel values are used\n center = scale.getPixelForValue(this.getParsed(index)[scale.axis], index);\n size = Math.min(maxBarThickness, ruler.min * ruler.ratio);\n }\n\n\n return {\n base: center - size / 2,\n head: center + size / 2,\n center,\n size\n };\n }\n\n draw() {\n const meta = this._cachedMeta;\n const vScale = meta.vScale;\n const rects = meta.data;\n const ilen = rects.length;\n let i = 0;\n\n for (; i < ilen; ++i) {\n if (this.getParsed(i)[vScale.axis] !== null && !rects[i].hidden) {\n rects[i].draw(this._ctx);\n }\n }\n }\n\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {valueOrDefault} from '../helpers/helpers.core.js';\n\nexport default class BubbleController extends DatasetController {\n\n static id = 'bubble';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'borderWidth', 'radius']\n }\n }\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n\n initialize() {\n this.enableOptionSharing = true;\n super.initialize();\n }\n\n /**\n\t * Parse array of primitive values\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n const parsed = super.parsePrimitiveData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n parsed[i]._custom = this.resolveDataElementOptions(i + start).radius;\n }\n return parsed;\n }\n\n /**\n\t * Parse array of arrays\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n const parsed = super.parseArrayData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item[2], this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n\n /**\n\t * Parse array of objects\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const parsed = super.parseObjectData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item && item.r && +item.r, this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const data = this._cachedMeta.data;\n\n let max = 0;\n for (let i = data.length - 1; i >= 0; --i) {\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const {xScale, yScale} = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n const r = parsed._custom;\n\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + (r ? ', ' + r : '') + ')'\n };\n }\n\n update(mode) {\n const points = this._cachedMeta.data;\n\n // Update Points\n this.updateElements(points, 0, points.length, mode);\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale} = this._cachedMeta;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const parsed = !reset && this.getParsed(i);\n const properties = {};\n const iPixel = properties[iAxis] = reset ? iScale.getPixelForDecimal(0.5) : iScale.getPixelForValue(parsed[iAxis]);\n const vPixel = properties[vAxis] = reset ? vScale.getBasePixel() : vScale.getPixelForValue(parsed[vAxis]);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel);\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n\n if (reset) {\n properties.options.radius = 0;\n }\n }\n\n this.updateElement(point, i, properties, mode);\n }\n }\n\n /**\n\t * @param {number} index\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDataElementOptions(index, mode) {\n const parsed = this.getParsed(index);\n let values = super.resolveDataElementOptions(index, mode);\n\n // In case values were cached (and thus frozen), we need to clone the values\n if (values.$shared) {\n values = Object.assign({}, values, {$shared: false});\n }\n\n // Custom radius resolution\n const radius = values.radius;\n if (mode !== 'active') {\n values.radius = 0;\n }\n values.radius += valueOrDefault(parsed && parsed._custom, radius);\n\n return values;\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isObject, resolveObjectKey, toPercentage, toDimension, valueOrDefault} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {toRadians, PI, TAU, HALF_PI, _angleBetween} from '../helpers/helpers.math.js';\n\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\nfunction getRatioAndOffset(rotation, circumference, cutout) {\n let ratioX = 1;\n let ratioY = 1;\n let offsetX = 0;\n let offsetY = 0;\n // If the chart's circumference isn't a full circle, calculate size as a ratio of the width/height of the arc\n if (circumference < TAU) {\n const startAngle = rotation;\n const endAngle = startAngle + circumference;\n const startX = Math.cos(startAngle);\n const startY = Math.sin(startAngle);\n const endX = Math.cos(endAngle);\n const endY = Math.sin(endAngle);\n const calcMax = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? 1 : Math.max(a, a * cutout, b, b * cutout);\n const calcMin = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? -1 : Math.min(a, a * cutout, b, b * cutout);\n const maxX = calcMax(0, startX, endX);\n const maxY = calcMax(HALF_PI, startY, endY);\n const minX = calcMin(PI, startX, endX);\n const minY = calcMin(PI + HALF_PI, startY, endY);\n ratioX = (maxX - minX) / 2;\n ratioY = (maxY - minY) / 2;\n offsetX = -(maxX + minX) / 2;\n offsetY = -(maxY + minY) / 2;\n }\n return {ratioX, ratioY, offsetX, offsetY};\n}\n\nexport default class DoughnutController extends DatasetController {\n\n static id = 'doughnut';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'arc',\n animation: {\n // Boolean - Whether we animate the rotation of the Doughnut\n animateRotate: true,\n // Boolean - Whether we animate scaling the Doughnut from the centre\n animateScale: false\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['circumference', 'endAngle', 'innerRadius', 'outerRadius', 'startAngle', 'x', 'y', 'offset', 'borderWidth', 'spacing']\n },\n },\n // The percentage of the chart that we cut out of the middle.\n cutout: '50%',\n\n // The rotation of the chart, where the first data arc begins.\n rotation: 0,\n\n // The total circumference of the chart.\n circumference: 360,\n\n // The outer radius of the chart\n radius: '100%',\n\n // Spacing between arcs\n spacing: 0,\n\n indexAxis: 'r',\n };\n\n static descriptors = {\n _scriptable: (name) => name !== 'spacing',\n _indexable: (name) => name !== 'spacing' && !name.startsWith('borderDash') && !name.startsWith('hoverBorderDash'),\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n // Need to override these to give a nice default\n plugins: {\n legend: {\n labels: {\n generateLabels(chart) {\n const data = chart.data;\n const {labels: {pointStyle, textAlign, color, useBorderRadius, borderRadius}} = chart.legend.options;\n if (data.labels.length && data.datasets.length) {\n return data.labels.map((label, i) => {\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n\n return {\n text: label,\n fillStyle: style.backgroundColor,\n fontColor: color,\n hidden: !chart.getDataVisibility(i),\n lineDash: style.borderDash,\n lineDashOffset: style.borderDashOffset,\n lineJoin: style.borderJoinStyle,\n lineWidth: style.borderWidth,\n strokeStyle: style.borderColor,\n textAlign: textAlign,\n pointStyle: pointStyle,\n borderRadius: useBorderRadius && (borderRadius || style.borderRadius),\n // Extra data used for toggling the correct item\n index: i\n };\n });\n }\n return [];\n }\n },\n\n onClick(e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n }\n };\n\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n\n this.enableOptionSharing = true;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.offsetX = undefined;\n this.offsetY = undefined;\n }\n\n linkScales() {}\n\n /**\n\t * Override data parsing, since we are not using scales\n\t */\n parse(start, count) {\n const data = this.getDataset().data;\n const meta = this._cachedMeta;\n\n if (this._parsing === false) {\n meta._parsed = data;\n } else {\n let getter = (i) => +data[i];\n\n if (isObject(data[start])) {\n const {key = 'value'} = this._parsing;\n getter = (i) => +resolveObjectKey(data[i], key);\n }\n\n let i, ilen;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n meta._parsed[i] = getter(i);\n }\n }\n }\n\n /**\n\t * @private\n\t */\n _getRotation() {\n return toRadians(this.options.rotation - 90);\n }\n\n /**\n\t * @private\n\t */\n _getCircumference() {\n return toRadians(this.options.circumference);\n }\n\n /**\n\t * Get the maximal rotation & circumference extents\n\t * across all visible datasets.\n\t */\n _getRotationExtents() {\n let min = TAU;\n let max = -TAU;\n\n for (let i = 0; i < this.chart.data.datasets.length; ++i) {\n if (this.chart.isDatasetVisible(i) && this.chart.getDatasetMeta(i).type === this._type) {\n const controller = this.chart.getDatasetMeta(i).controller;\n const rotation = controller._getRotation();\n const circumference = controller._getCircumference();\n\n min = Math.min(min, rotation);\n max = Math.max(max, rotation + circumference);\n }\n }\n\n return {\n rotation: min,\n circumference: max - min,\n };\n }\n\n /**\n\t * @param {string} mode\n\t */\n update(mode) {\n const chart = this.chart;\n const {chartArea} = chart;\n const meta = this._cachedMeta;\n const arcs = meta.data;\n const spacing = this.getMaxBorderWidth() + this.getMaxOffset(arcs) + this.options.spacing;\n const maxSize = Math.max((Math.min(chartArea.width, chartArea.height) - spacing) / 2, 0);\n const cutout = Math.min(toPercentage(this.options.cutout, maxSize), 1);\n const chartWeight = this._getRingWeight(this.index);\n\n // Compute the maximal rotation & circumference limits.\n // If we only consider our dataset, this can cause problems when two datasets\n // are both less than a circle with different rotations (starting angles)\n const {circumference, rotation} = this._getRotationExtents();\n const {ratioX, ratioY, offsetX, offsetY} = getRatioAndOffset(rotation, circumference, cutout);\n const maxWidth = (chartArea.width - spacing) / ratioX;\n const maxHeight = (chartArea.height - spacing) / ratioY;\n const maxRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0);\n const outerRadius = toDimension(this.options.radius, maxRadius);\n const innerRadius = Math.max(outerRadius * cutout, 0);\n const radiusLength = (outerRadius - innerRadius) / this._getVisibleDatasetWeightTotal();\n this.offsetX = offsetX * outerRadius;\n this.offsetY = offsetY * outerRadius;\n\n meta.total = this.calculateTotal();\n\n this.outerRadius = outerRadius - radiusLength * this._getRingWeightOffset(this.index);\n this.innerRadius = Math.max(this.outerRadius - radiusLength * chartWeight, 0);\n\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n\n /**\n * @private\n */\n _circumference(i, reset) {\n const opts = this.options;\n const meta = this._cachedMeta;\n const circumference = this._getCircumference();\n if ((reset && opts.animation.animateRotate) || !this.chart.getDataVisibility(i) || meta._parsed[i] === null || meta.data[i].hidden) {\n return 0;\n }\n return this.calculateCircumference(meta._parsed[i] * circumference / TAU);\n }\n\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const centerX = (chartArea.left + chartArea.right) / 2;\n const centerY = (chartArea.top + chartArea.bottom) / 2;\n const animateScale = reset && animationOpts.animateScale;\n const innerRadius = animateScale ? 0 : this.innerRadius;\n const outerRadius = animateScale ? 0 : this.outerRadius;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n let startAngle = this._getRotation();\n let i;\n\n for (i = 0; i < start; ++i) {\n startAngle += this._circumference(i, reset);\n }\n\n for (i = start; i < start + count; ++i) {\n const circumference = this._circumference(i, reset);\n const arc = arcs[i];\n const properties = {\n x: centerX + this.offsetX,\n y: centerY + this.offsetY,\n startAngle,\n endAngle: startAngle + circumference,\n circumference,\n outerRadius,\n innerRadius\n };\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, arc.active ? 'active' : mode);\n }\n startAngle += circumference;\n\n this.updateElement(arc, i, properties, mode);\n }\n }\n\n calculateTotal() {\n const meta = this._cachedMeta;\n const metaData = meta.data;\n let total = 0;\n let i;\n\n for (i = 0; i < metaData.length; i++) {\n const value = meta._parsed[i];\n if (value !== null && !isNaN(value) && this.chart.getDataVisibility(i) && !metaData[i].hidden) {\n total += Math.abs(value);\n }\n }\n\n return total;\n }\n\n calculateCircumference(value) {\n const total = this._cachedMeta.total;\n if (total > 0 && !isNaN(value)) {\n return TAU * (Math.abs(value) / total);\n }\n return 0;\n }\n\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index], chart.options.locale);\n\n return {\n label: labels[index] || '',\n value,\n };\n }\n\n getMaxBorderWidth(arcs) {\n let max = 0;\n const chart = this.chart;\n let i, ilen, meta, controller, options;\n\n if (!arcs) {\n // Find the outmost visible dataset\n for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) {\n if (chart.isDatasetVisible(i)) {\n meta = chart.getDatasetMeta(i);\n arcs = meta.data;\n controller = meta.controller;\n break;\n }\n }\n }\n\n if (!arcs) {\n return 0;\n }\n\n for (i = 0, ilen = arcs.length; i < ilen; ++i) {\n options = controller.resolveDataElementOptions(i);\n if (options.borderAlign !== 'inner') {\n max = Math.max(max, options.borderWidth || 0, options.hoverBorderWidth || 0);\n }\n }\n return max;\n }\n\n getMaxOffset(arcs) {\n let max = 0;\n\n for (let i = 0, ilen = arcs.length; i < ilen; ++i) {\n const options = this.resolveDataElementOptions(i);\n max = Math.max(max, options.offset || 0, options.hoverOffset || 0);\n }\n return max;\n }\n\n /**\n\t * Get radius length offset of the dataset in relation to the visible datasets weights. This allows determining the inner and outer radius correctly\n\t * @private\n\t */\n _getRingWeightOffset(datasetIndex) {\n let ringWeightOffset = 0;\n\n for (let i = 0; i < datasetIndex; ++i) {\n if (this.chart.isDatasetVisible(i)) {\n ringWeightOffset += this._getRingWeight(i);\n }\n }\n\n return ringWeightOffset;\n }\n\n /**\n\t * @private\n\t */\n _getRingWeight(datasetIndex) {\n return Math.max(valueOrDefault(this.chart.data.datasets[datasetIndex].weight, 1), 0);\n }\n\n /**\n\t * Returns the sum of all visible data set weights.\n\t * @private\n\t */\n _getVisibleDatasetWeightTotal() {\n return this._getRingWeightOffset(this.chart.data.datasets.length) || 1;\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isNullOrUndef} from '../helpers/index.js';\nimport {isNumber} from '../helpers/helpers.math.js';\nimport {_getStartAndCountOfVisiblePoints, _scaleRangesChanged} from '../helpers/helpers.extras.js';\n\nexport default class LineController extends DatasetController {\n\n static id = 'line';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n\n showLine: true,\n spanGaps: false,\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n _index_: {\n type: 'category',\n },\n _value_: {\n type: 'linear',\n },\n }\n };\n\n initialize() {\n this.enableOptionSharing = true;\n this.supportsDecimation = true;\n super.initialize();\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const {dataset: line, data: points = [], _dataset} = meta;\n // @ts-ignore\n const animationsDisabled = this.chart._animationsDisabled;\n let {start, count} = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n\n this._drawStart = start;\n this._drawCount = count;\n\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n\n // Update Line\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n\n // Update Points\n this.updateElements(points, start, count, mode);\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale, _stacked, _dataset} = this._cachedMeta;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const {spanGaps, segment} = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n const end = start + count;\n const pointsCount = points.length;\n let prevParsed = start > 0 && this.getParsed(start - 1);\n\n for (let i = 0; i < pointsCount; ++i) {\n const point = points[i];\n const properties = directUpdate ? point : {};\n\n if (i < start || i >= end) {\n properties.skip = true;\n continue;\n }\n\n const parsed = this.getParsed(i);\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && (Math.abs(parsed[iAxis] - prevParsed[iAxis])) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n\n prevParsed = parsed;\n }\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n const data = meta.data || [];\n if (!data.length) {\n return border;\n }\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n\n draw() {\n const meta = this._cachedMeta;\n meta.dataset.updateControlPoints(this.chart.chartArea, meta.iScale.axis);\n super.draw();\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {toRadians, PI, formatNumber, _parseObjectDataRadialScale} from '../helpers/index.js';\n\nexport default class PolarAreaController extends DatasetController {\n\n static id = 'polarArea';\n\n /**\n * @type {any}\n */\n static defaults = {\n dataElementType: 'arc',\n animation: {\n animateRotate: true,\n animateScale: true\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'startAngle', 'endAngle', 'innerRadius', 'outerRadius']\n },\n },\n indexAxis: 'r',\n startAngle: 0,\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n plugins: {\n legend: {\n labels: {\n generateLabels(chart) {\n const data = chart.data;\n if (data.labels.length && data.datasets.length) {\n const {labels: {pointStyle, color}} = chart.legend.options;\n\n return data.labels.map((label, i) => {\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n fontColor: color,\n lineWidth: style.borderWidth,\n pointStyle: pointStyle,\n hidden: !chart.getDataVisibility(i),\n\n // Extra data used for toggling the correct item\n index: i\n };\n });\n }\n return [];\n }\n },\n\n onClick(e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n },\n\n scales: {\n r: {\n type: 'radialLinear',\n angleLines: {\n display: false\n },\n beginAtZero: true,\n grid: {\n circular: true\n },\n pointLabels: {\n display: false\n },\n startAngle: 0\n }\n }\n };\n\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n }\n\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index].r, chart.options.locale);\n\n return {\n label: labels[index] || '',\n value,\n };\n }\n\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n\n update(mode) {\n const arcs = this._cachedMeta.data;\n\n this._updateRadius();\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n\n /**\n * @protected\n */\n getMinMax() {\n const meta = this._cachedMeta;\n const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n\n meta.data.forEach((element, index) => {\n const parsed = this.getParsed(index).r;\n\n if (!isNaN(parsed) && this.chart.getDataVisibility(index)) {\n if (parsed < range.min) {\n range.min = parsed;\n }\n\n if (parsed > range.max) {\n range.max = parsed;\n }\n }\n });\n\n return range;\n }\n\n /**\n\t * @private\n\t */\n _updateRadius() {\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n\n const outerRadius = Math.max(minSize / 2, 0);\n const innerRadius = Math.max(opts.cutoutPercentage ? (outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);\n const radiusLength = (outerRadius - innerRadius) / chart.getVisibleDatasetCount();\n\n this.outerRadius = outerRadius - (radiusLength * this.index);\n this.innerRadius = this.outerRadius - radiusLength;\n }\n\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const scale = this._cachedMeta.rScale;\n const centerX = scale.xCenter;\n const centerY = scale.yCenter;\n const datasetStartAngle = scale.getIndexAngle(0) - 0.5 * PI;\n let angle = datasetStartAngle;\n let i;\n\n const defaultAngle = 360 / this.countVisibleElements();\n\n for (i = 0; i < start; ++i) {\n angle += this._computeAngle(i, mode, defaultAngle);\n }\n for (i = start; i < start + count; i++) {\n const arc = arcs[i];\n let startAngle = angle;\n let endAngle = angle + this._computeAngle(i, mode, defaultAngle);\n let outerRadius = chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(this.getParsed(i).r) : 0;\n angle = endAngle;\n\n if (reset) {\n if (animationOpts.animateScale) {\n outerRadius = 0;\n }\n if (animationOpts.animateRotate) {\n startAngle = endAngle = datasetStartAngle;\n }\n }\n\n const properties = {\n x: centerX,\n y: centerY,\n innerRadius: 0,\n outerRadius,\n startAngle,\n endAngle,\n options: this.resolveDataElementOptions(i, arc.active ? 'active' : mode)\n };\n\n this.updateElement(arc, i, properties, mode);\n }\n }\n\n countVisibleElements() {\n const meta = this._cachedMeta;\n let count = 0;\n\n meta.data.forEach((element, index) => {\n if (!isNaN(this.getParsed(index).r) && this.chart.getDataVisibility(index)) {\n count++;\n }\n });\n\n return count;\n }\n\n /**\n\t * @private\n\t */\n _computeAngle(index, mode, defaultAngle) {\n return this.chart.getDataVisibility(index)\n ? toRadians(this.resolveDataElementOptions(index, mode).angle || defaultAngle)\n : 0;\n }\n}\n","import DoughnutController from './controller.doughnut.js';\n\n// Pie charts are Doughnut chart with different defaults\nexport default class PieController extends DoughnutController {\n\n static id = 'pie';\n\n /**\n * @type {any}\n */\n static defaults = {\n // The percentage of the chart that we cut out of the middle.\n cutout: 0,\n\n // The rotation of the chart, where the first data arc begins.\n rotation: 0,\n\n // The total circumference of the chart.\n circumference: 360,\n\n // The outer radius of the chart\n radius: '100%'\n };\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {_parseObjectDataRadialScale} from '../helpers/index.js';\n\nexport default class RadarController extends DatasetController {\n\n static id = 'radar';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n indexAxis: 'r',\n showLine: true,\n elements: {\n line: {\n fill: 'start'\n }\n },\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n scales: {\n r: {\n type: 'radialLinear',\n }\n }\n };\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const vScale = this._cachedMeta.vScale;\n const parsed = this.getParsed(index);\n\n return {\n label: vScale.getLabels()[index],\n value: '' + vScale.getLabelForValue(parsed[vScale.axis])\n };\n }\n\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const line = meta.dataset;\n const points = meta.data || [];\n const labels = meta.iScale.getLabels();\n\n // Update Line\n line.points = points;\n // In resize mode only point locations change, so no need to set the points or options.\n if (mode !== 'resize') {\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n\n const properties = {\n _loop: true,\n _fullLoop: labels.length === points.length,\n options\n };\n\n this.updateElement(line, undefined, properties, mode);\n }\n\n // Update Points\n this.updateElements(points, 0, points.length, mode);\n }\n\n updateElements(points, start, count, mode) {\n const scale = this._cachedMeta.rScale;\n const reset = mode === 'reset';\n\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const options = this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n const pointPosition = scale.getPointPositionForValue(i, this.getParsed(i).r);\n\n const x = reset ? scale.xCenter : pointPosition.x;\n const y = reset ? scale.yCenter : pointPosition.y;\n\n const properties = {\n x,\n y,\n angle: pointPosition.angle,\n skip: isNaN(x) || isNaN(y),\n options\n };\n\n this.updateElement(point, i, properties, mode);\n }\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isNullOrUndef} from '../helpers/index.js';\nimport {isNumber} from '../helpers/helpers.math.js';\nimport {_getStartAndCountOfVisiblePoints, _scaleRangesChanged} from '../helpers/helpers.extras.js';\n\nexport default class ScatterController extends DatasetController {\n\n static id = 'scatter';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n showLine: false,\n fill: false\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n\n interaction: {\n mode: 'point'\n },\n\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const {xScale, yScale} = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + ')'\n };\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const {data: points = []} = meta;\n // @ts-ignore\n const animationsDisabled = this.chart._animationsDisabled;\n let {start, count} = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n\n this._drawStart = start;\n this._drawCount = count;\n\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n\n if (this.options.showLine) {\n\n // https://github.com/chartjs/Chart.js/issues/11333\n if (!this.datasetElementType) {\n this.addElements();\n }\n const {dataset: line, _dataset} = meta;\n\n // Update Line\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n\n const options = this.resolveDatasetElementOptions(mode);\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n } else if (this.datasetElementType) {\n // https://github.com/chartjs/Chart.js/issues/11333\n delete meta.dataset;\n this.datasetElementType = false;\n }\n\n // Update Points\n this.updateElements(points, start, count, mode);\n }\n\n addElements() {\n const {showLine} = this.options;\n\n if (!this.datasetElementType && showLine) {\n this.datasetElementType = this.chart.registry.getElement('line');\n }\n\n super.addElements();\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale, _stacked, _dataset} = this._cachedMeta;\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const {spanGaps, segment} = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n let prevParsed = start > 0 && this.getParsed(start - 1);\n\n for (let i = start; i < start + count; ++i) {\n const point = points[i];\n const parsed = this.getParsed(i);\n const properties = directUpdate ? point : {};\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && (Math.abs(parsed[iAxis] - prevParsed[iAxis])) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n\n prevParsed = parsed;\n }\n\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const data = meta.data || [];\n\n if (!this.options.showLine) {\n let max = 0;\n for (let i = data.length - 1; i >= 0; --i) {\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n\n if (!data.length) {\n return border;\n }\n\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n}\n","/**\n * @namespace Chart._adapters\n * @since 2.8.0\n * @private\n */\n\nimport type {AnyObject} from '../types/basic.js';\nimport type {ChartOptions} from '../types/index.js';\n\nexport type TimeUnit = 'millisecond' | 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'year';\n\nexport interface DateAdapter {\n readonly options: T;\n /**\n * Will called with chart options after adapter creation.\n */\n init(this: DateAdapter, chartOptions: ChartOptions): void;\n /**\n * Returns a map of time formats for the supported formatting units defined\n * in Unit as well as 'datetime' representing a detailed date/time string.\n */\n formats(this: DateAdapter): Record;\n /**\n * Parses the given `value` and return the associated timestamp.\n * @param value - the value to parse (usually comes from the data)\n * @param [format] - the expected data format\n */\n parse(this: DateAdapter, value: unknown, format?: string): number | null;\n /**\n * Returns the formatted date in the specified `format` for a given `timestamp`.\n * @param timestamp - the timestamp to format\n * @param format - the date/time token\n */\n format(this: DateAdapter, timestamp: number, format: string): string;\n /**\n * Adds the specified `amount` of `unit` to the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param amount - the amount to add\n * @param unit - the unit as string\n */\n add(this: DateAdapter, timestamp: number, amount: number, unit: TimeUnit): number;\n /**\n * Returns the number of `unit` between the given timestamps.\n * @param a - the input timestamp (reference)\n * @param b - the timestamp to subtract\n * @param unit - the unit as string\n */\n diff(this: DateAdapter, a: number, b: number, unit: TimeUnit): number;\n /**\n * Returns start of `unit` for the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param unit - the unit as string\n * @param [weekday] - the ISO day of the week with 1 being Monday\n * and 7 being Sunday (only needed if param *unit* is `isoWeek`).\n */\n startOf(this: DateAdapter, timestamp: number, unit: TimeUnit | 'isoWeek', weekday?: number | boolean): number;\n /**\n * Returns end of `unit` for the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param unit - the unit as string\n */\n endOf(this: DateAdapter, timestamp: number, unit: TimeUnit): number;\n}\n\nfunction abstract(): T {\n throw new Error('This method is not implemented: Check that a complete date adapter is provided.');\n}\n\n/**\n * Date adapter (current used by the time scale)\n * @namespace Chart._adapters._date\n * @memberof Chart._adapters\n * @private\n */\nclass DateAdapterBase implements DateAdapter {\n\n /**\n * Override default date adapter methods.\n * Accepts type parameter to define options type.\n * @example\n * Chart._adapters._date.override<{myAdapterOption: string}>({\n * init() {\n * console.log(this.options.myAdapterOption);\n * }\n * })\n */\n static override(\n members: Partial, 'options'>>\n ) {\n Object.assign(DateAdapterBase.prototype, members);\n }\n\n readonly options: AnyObject;\n\n constructor(options?: AnyObject) {\n this.options = options || {};\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n init() {}\n\n formats(): Record {\n return abstract();\n }\n\n parse(): number | null {\n return abstract();\n }\n\n format(): string {\n return abstract();\n }\n\n add(): number {\n return abstract();\n }\n\n diff(): number {\n return abstract();\n }\n\n startOf(): number {\n return abstract();\n }\n\n endOf(): number {\n return abstract();\n }\n}\n\nexport default {\n _date: DateAdapterBase as {\n new (options?: AnyObject): DateAdapter;\n override(\n members: Partial, 'options'>>\n ): void;\n }\n};\n","import {_lookupByKey, _rlookupByKey} from '../helpers/helpers.collection.js';\nimport {getRelativePosition} from '../helpers/helpers.dom.js';\nimport {_angleBetween, getAngleFromPoint} from '../helpers/helpers.math.js';\nimport {_isPointInArea, isNullOrUndef} from '../helpers/index.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef {{axis?: string, intersect?: boolean, includeInvisible?: boolean}} InteractionOptions\n * @typedef {{datasetIndex: number, index: number, element: import('./core.element.js').default}} InteractionItem\n * @typedef { import('../types/index.js').Point } Point\n */\n\n/**\n * Helper function to do binary search when possible\n * @param {object} metaset - the dataset meta\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {number} value - the value to find\n * @param {boolean} [intersect] - should the element intersect\n * @returns {{lo:number, hi:number}} indices to search data array between\n */\nfunction binarySearch(metaset, axis, value, intersect) {\n const {controller, data, _sorted} = metaset;\n const iScale = controller._cachedMeta.iScale;\n const spanGaps = metaset.dataset ? metaset.dataset.options ? metaset.dataset.options.spanGaps : null : null;\n\n if (iScale && axis === iScale.axis && axis !== 'r' && _sorted && data.length) {\n const lookupMethod = iScale._reversePixels ? _rlookupByKey : _lookupByKey;\n if (!intersect) {\n const result = lookupMethod(data, axis, value);\n if (spanGaps) {\n const {vScale} = controller._cachedMeta;\n const {_parsed} = metaset;\n\n const distanceToDefinedLo = (_parsed\n .slice(0, result.lo + 1)\n .reverse()\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n result.lo -= Math.max(0, distanceToDefinedLo);\n\n const distanceToDefinedHi = (_parsed\n .slice(result.hi)\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n result.hi += Math.max(0, distanceToDefinedHi);\n }\n return result;\n } else if (controller._sharedOptions) {\n // _sharedOptions indicates that each element has equal options -> equal proportions\n // So we can do a ranged binary search based on the range of first element and\n // be confident to get the full range of indices that can intersect with the value.\n const el = data[0];\n const range = typeof el.getRange === 'function' && el.getRange(axis);\n if (range) {\n const start = lookupMethod(data, axis, value - range);\n const end = lookupMethod(data, axis, value + range);\n return {lo: start.lo, hi: end.hi};\n }\n }\n }\n // Default to all elements, when binary search can not be used.\n return {lo: 0, hi: data.length - 1};\n}\n\n/**\n * Helper function to select candidate elements for interaction\n * @param {Chart} chart - the chart\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {function} handler - the callback to execute for each visible item\n * @param {boolean} [intersect] - consider intersecting items\n */\nfunction evaluateInteractionItems(chart, axis, position, handler, intersect) {\n const metasets = chart.getSortedVisibleDatasetMetas();\n const value = position[axis];\n for (let i = 0, ilen = metasets.length; i < ilen; ++i) {\n const {index, data} = metasets[i];\n const {lo, hi} = binarySearch(metasets[i], axis, value, intersect);\n for (let j = lo; j <= hi; ++j) {\n const element = data[j];\n if (!element.skip) {\n handler(element, index, j);\n }\n }\n }\n}\n\n/**\n * Get a distance metric function for two points based on the\n * axis mode setting\n * @param {string} axis - the axis mode. x|y|xy|r\n */\nfunction getDistanceMetricForAxis(axis) {\n const useX = axis.indexOf('x') !== -1;\n const useY = axis.indexOf('y') !== -1;\n\n return function(pt1, pt2) {\n const deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n const deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n };\n}\n\n/**\n * Helper function to get the items that intersect the event position\n * @param {Chart} chart - the chart\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) {\n const items = [];\n\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return items;\n }\n\n const evaluationFunc = function(element, datasetIndex, index) {\n if (!includeInvisible && !_isPointInArea(element, chart.chartArea, 0)) {\n return;\n }\n if (element.inRange(position.x, position.y, useFinalPosition)) {\n items.push({element, datasetIndex, index});\n }\n };\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc, true);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position for a radial chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestRadialItems(chart, position, axis, useFinalPosition) {\n let items = [];\n\n function evaluationFunc(element, datasetIndex, index) {\n const {startAngle, endAngle} = element.getProps(['startAngle', 'endAngle'], useFinalPosition);\n const {angle} = getAngleFromPoint(element, {x: position.x, y: position.y});\n\n if (_angleBetween(angle, startAngle, endAngle)) {\n items.push({element, datasetIndex, index});\n }\n }\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position for a cartesian chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n let items = [];\n const distanceMetric = getDistanceMetricForAxis(axis);\n let minDistance = Number.POSITIVE_INFINITY;\n\n function evaluationFunc(element, datasetIndex, index) {\n const inRange = element.inRange(position.x, position.y, useFinalPosition);\n if (intersect && !inRange) {\n return;\n }\n\n const center = element.getCenterPoint(useFinalPosition);\n const pointInArea = !!includeInvisible || chart.isPointInArea(center);\n if (!pointInArea && !inRange) {\n return;\n }\n\n const distance = distanceMetric(position, center);\n if (distance < minDistance) {\n items = [{element, datasetIndex, index}];\n minDistance = distance;\n } else if (distance === minDistance) {\n // Can have multiple items at the same distance in which case we sort by size\n items.push({element, datasetIndex, index});\n }\n }\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position considering all visible items in the chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return [];\n }\n\n return axis === 'r' && !intersect\n ? getNearestRadialItems(chart, position, axis, useFinalPosition)\n : getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible);\n}\n\n/**\n * Helper function to get the items matching along the given X or Y axis\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axis to match\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @return {InteractionItem[]} the nearest items\n */\nfunction getAxisItems(chart, position, axis, intersect, useFinalPosition) {\n const items = [];\n const rangeMethod = axis === 'x' ? 'inXRange' : 'inYRange';\n let intersectsItem = false;\n\n evaluateInteractionItems(chart, axis, position, (element, datasetIndex, index) => {\n if (element[rangeMethod] && element[rangeMethod](position[axis], useFinalPosition)) {\n items.push({element, datasetIndex, index});\n intersectsItem = intersectsItem || element.inRange(position.x, position.y, useFinalPosition);\n }\n });\n\n // If we want to trigger on an intersect and we don't have any items\n // that intersect the position, return nothing\n if (intersect && !intersectsItem) {\n return [];\n }\n return items;\n}\n\n/**\n * Contains interaction related functions\n * @namespace Chart.Interaction\n */\nexport default {\n // Part of the public API to facilitate developers creating their own modes\n evaluateInteractionItems,\n\n // Helper function for different modes\n modes: {\n /**\n\t\t * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item\n\t\t * @function Chart.Interaction.modes.index\n\t\t * @since v2.4.0\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n index(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n // Default axis for index mode is 'x' to match old behaviour\n const axis = options.axis || 'x';\n const includeInvisible = options.includeInvisible || false;\n const items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible)\n : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n const elements = [];\n\n if (!items.length) {\n return [];\n }\n\n chart.getSortedVisibleDatasetMetas().forEach((meta) => {\n const index = items[0].index;\n const element = meta.data[index];\n\n // don't count items that are skipped (null data)\n if (element && !element.skip) {\n elements.push({element, datasetIndex: meta.index, index});\n }\n });\n\n return elements;\n },\n\n /**\n\t\t * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect is false, we find the nearest item and return the items in that dataset\n\t\t * @function Chart.Interaction.modes.dataset\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n dataset(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n let items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) :\n getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n\n if (items.length > 0) {\n const datasetIndex = items[0].datasetIndex;\n const data = chart.getDatasetMeta(datasetIndex).data;\n items = [];\n for (let i = 0; i < data.length; ++i) {\n items.push({element: data[i], datasetIndex, index: i});\n }\n }\n\n return items;\n },\n\n /**\n\t\t * Point mode returns all elements that hit test based on the event position\n\t\t * of the event\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n point(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible);\n },\n\n /**\n\t\t * nearest mode returns the element closest to the point\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n nearest(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getNearestItems(chart, position, axis, options.intersect, useFinalPosition, includeInvisible);\n },\n\n /**\n\t\t * x mode returns the elements that hit-test at the current x coordinate\n\t\t * @function Chart.Interaction.modes.x\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n x(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'x', options.intersect, useFinalPosition);\n },\n\n /**\n\t\t * y mode returns the elements that hit-test at the current y coordinate\n\t\t * @function Chart.Interaction.modes.y\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n y(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'y', options.intersect, useFinalPosition);\n }\n }\n};\n","import {defined, each, isObject} from '../helpers/helpers.core.js';\nimport {toPadding} from '../helpers/helpers.options.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n */\n\nconst STATIC_POSITIONS = ['left', 'top', 'right', 'bottom'];\n\nfunction filterByPosition(array, position) {\n return array.filter(v => v.pos === position);\n}\n\nfunction filterDynamicPositionByAxis(array, axis) {\n return array.filter(v => STATIC_POSITIONS.indexOf(v.pos) === -1 && v.box.axis === axis);\n}\n\nfunction sortByWeight(array, reverse) {\n return array.sort((a, b) => {\n const v0 = reverse ? b : a;\n const v1 = reverse ? a : b;\n return v0.weight === v1.weight ?\n v0.index - v1.index :\n v0.weight - v1.weight;\n });\n}\n\nfunction wrapBoxes(boxes) {\n const layoutBoxes = [];\n let i, ilen, box, pos, stack, stackWeight;\n\n for (i = 0, ilen = (boxes || []).length; i < ilen; ++i) {\n box = boxes[i];\n ({position: pos, options: {stack, stackWeight = 1}} = box);\n layoutBoxes.push({\n index: i,\n box,\n pos,\n horizontal: box.isHorizontal(),\n weight: box.weight,\n stack: stack && (pos + stack),\n stackWeight\n });\n }\n return layoutBoxes;\n}\n\nfunction buildStacks(layouts) {\n const stacks = {};\n for (const wrap of layouts) {\n const {stack, pos, stackWeight} = wrap;\n if (!stack || !STATIC_POSITIONS.includes(pos)) {\n continue;\n }\n const _stack = stacks[stack] || (stacks[stack] = {count: 0, placed: 0, weight: 0, size: 0});\n _stack.count++;\n _stack.weight += stackWeight;\n }\n return stacks;\n}\n\n/**\n * store dimensions used instead of available chartArea in fitBoxes\n **/\nfunction setLayoutDims(layouts, params) {\n const stacks = buildStacks(layouts);\n const {vBoxMaxWidth, hBoxMaxHeight} = params;\n let i, ilen, layout;\n for (i = 0, ilen = layouts.length; i < ilen; ++i) {\n layout = layouts[i];\n const {fullSize} = layout.box;\n const stack = stacks[layout.stack];\n const factor = stack && layout.stackWeight / stack.weight;\n if (layout.horizontal) {\n layout.width = factor ? factor * vBoxMaxWidth : fullSize && params.availableWidth;\n layout.height = hBoxMaxHeight;\n } else {\n layout.width = vBoxMaxWidth;\n layout.height = factor ? factor * hBoxMaxHeight : fullSize && params.availableHeight;\n }\n }\n return stacks;\n}\n\nfunction buildLayoutBoxes(boxes) {\n const layoutBoxes = wrapBoxes(boxes);\n const fullSize = sortByWeight(layoutBoxes.filter(wrap => wrap.box.fullSize), true);\n const left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true);\n const right = sortByWeight(filterByPosition(layoutBoxes, 'right'));\n const top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true);\n const bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom'));\n const centerHorizontal = filterDynamicPositionByAxis(layoutBoxes, 'x');\n const centerVertical = filterDynamicPositionByAxis(layoutBoxes, 'y');\n\n return {\n fullSize,\n leftAndTop: left.concat(top),\n rightAndBottom: right.concat(centerVertical).concat(bottom).concat(centerHorizontal),\n chartArea: filterByPosition(layoutBoxes, 'chartArea'),\n vertical: left.concat(right).concat(centerVertical),\n horizontal: top.concat(bottom).concat(centerHorizontal)\n };\n}\n\nfunction getCombinedMax(maxPadding, chartArea, a, b) {\n return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);\n}\n\nfunction updateMaxPadding(maxPadding, boxPadding) {\n maxPadding.top = Math.max(maxPadding.top, boxPadding.top);\n maxPadding.left = Math.max(maxPadding.left, boxPadding.left);\n maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom);\n maxPadding.right = Math.max(maxPadding.right, boxPadding.right);\n}\n\nfunction updateDims(chartArea, params, layout, stacks) {\n const {pos, box} = layout;\n const maxPadding = chartArea.maxPadding;\n\n // dynamically placed boxes size is not considered\n if (!isObject(pos)) {\n if (layout.size) {\n // this layout was already counted for, lets first reduce old size\n chartArea[pos] -= layout.size;\n }\n const stack = stacks[layout.stack] || {size: 0, count: 1};\n stack.size = Math.max(stack.size, layout.horizontal ? box.height : box.width);\n layout.size = stack.size / stack.count;\n chartArea[pos] += layout.size;\n }\n\n if (box.getPadding) {\n updateMaxPadding(maxPadding, box.getPadding());\n }\n\n const newWidth = Math.max(0, params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right'));\n const newHeight = Math.max(0, params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom'));\n const widthChanged = newWidth !== chartArea.w;\n const heightChanged = newHeight !== chartArea.h;\n chartArea.w = newWidth;\n chartArea.h = newHeight;\n\n // return booleans on the changes per direction\n return layout.horizontal\n ? {same: widthChanged, other: heightChanged}\n : {same: heightChanged, other: widthChanged};\n}\n\nfunction handleMaxPadding(chartArea) {\n const maxPadding = chartArea.maxPadding;\n\n function updatePos(pos) {\n const change = Math.max(maxPadding[pos] - chartArea[pos], 0);\n chartArea[pos] += change;\n return change;\n }\n chartArea.y += updatePos('top');\n chartArea.x += updatePos('left');\n updatePos('right');\n updatePos('bottom');\n}\n\nfunction getMargins(horizontal, chartArea) {\n const maxPadding = chartArea.maxPadding;\n\n function marginForPositions(positions) {\n const margin = {left: 0, top: 0, right: 0, bottom: 0};\n positions.forEach((pos) => {\n margin[pos] = Math.max(chartArea[pos], maxPadding[pos]);\n });\n return margin;\n }\n\n return horizontal\n ? marginForPositions(['left', 'right'])\n : marginForPositions(['top', 'bottom']);\n}\n\nfunction fitBoxes(boxes, chartArea, params, stacks) {\n const refitBoxes = [];\n let i, ilen, layout, box, refit, changed;\n\n for (i = 0, ilen = boxes.length, refit = 0; i < ilen; ++i) {\n layout = boxes[i];\n box = layout.box;\n\n box.update(\n layout.width || chartArea.w,\n layout.height || chartArea.h,\n getMargins(layout.horizontal, chartArea)\n );\n const {same, other} = updateDims(chartArea, params, layout, stacks);\n\n // Dimensions changed and there were non full width boxes before this\n // -> we have to refit those\n refit |= same && refitBoxes.length;\n\n // Chart area changed in the opposite direction\n changed = changed || other;\n\n if (!box.fullSize) { // fullSize boxes don't need to be re-fitted in any case\n refitBoxes.push(layout);\n }\n }\n\n return refit && fitBoxes(refitBoxes, chartArea, params, stacks) || changed;\n}\n\nfunction setBoxDims(box, left, top, width, height) {\n box.top = top;\n box.left = left;\n box.right = left + width;\n box.bottom = top + height;\n box.width = width;\n box.height = height;\n}\n\nfunction placeBoxes(boxes, chartArea, params, stacks) {\n const userPadding = params.padding;\n let {x, y} = chartArea;\n\n for (const layout of boxes) {\n const box = layout.box;\n const stack = stacks[layout.stack] || {count: 1, placed: 0, weight: 1};\n const weight = (layout.stackWeight / stack.weight) || 1;\n if (layout.horizontal) {\n const width = chartArea.w * weight;\n const height = stack.size || box.height;\n if (defined(stack.start)) {\n y = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, userPadding.left, y, params.outerWidth - userPadding.right - userPadding.left, height);\n } else {\n setBoxDims(box, chartArea.left + stack.placed, y, width, height);\n }\n stack.start = y;\n stack.placed += width;\n y = box.bottom;\n } else {\n const height = chartArea.h * weight;\n const width = stack.size || box.width;\n if (defined(stack.start)) {\n x = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, x, userPadding.top, width, params.outerHeight - userPadding.bottom - userPadding.top);\n } else {\n setBoxDims(box, x, chartArea.top + stack.placed, width, height);\n }\n stack.start = x;\n stack.placed += height;\n x = box.right;\n }\n }\n\n chartArea.x = x;\n chartArea.y = y;\n}\n\n/**\n * @interface LayoutItem\n * @typedef {object} LayoutItem\n * @prop {string} position - The position of the item in the chart layout. Possible values are\n * 'left', 'top', 'right', 'bottom', and 'chartArea'\n * @prop {number} weight - The weight used to sort the item. Higher weights are further away from the chart area\n * @prop {boolean} fullSize - if true, and the item is horizontal, then push vertical boxes down\n * @prop {function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom)\n * @prop {function} update - Takes two parameters: width and height. Returns size of item\n * @prop {function} draw - Draws the element\n * @prop {function} [getPadding] - Returns an object with padding on the edges\n * @prop {number} width - Width of item. Must be valid after update()\n * @prop {number} height - Height of item. Must be valid after update()\n * @prop {number} left - Left edge of the item. Set by layout system and cannot be used in update\n * @prop {number} top - Top edge of the item. Set by layout system and cannot be used in update\n * @prop {number} right - Right edge of the item. Set by layout system and cannot be used in update\n * @prop {number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update\n */\n\n// The layout service is very self explanatory. It's responsible for the layout within a chart.\n// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need\n// It is this service's responsibility of carrying out that layout.\nexport default {\n\n /**\n\t * Register a box to a chart.\n\t * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title.\n\t * @param {Chart} chart - the chart to use\n\t * @param {LayoutItem} item - the item to add to be laid out\n\t */\n addBox(chart, item) {\n if (!chart.boxes) {\n chart.boxes = [];\n }\n\n // initialize item with default values\n item.fullSize = item.fullSize || false;\n item.position = item.position || 'top';\n item.weight = item.weight || 0;\n // @ts-ignore\n item._layers = item._layers || function() {\n return [{\n z: 0,\n draw(chartArea) {\n item.draw(chartArea);\n }\n }];\n };\n\n chart.boxes.push(item);\n },\n\n /**\n\t * Remove a layoutItem from a chart\n\t * @param {Chart} chart - the chart to remove the box from\n\t * @param {LayoutItem} layoutItem - the item to remove from the layout\n\t */\n removeBox(chart, layoutItem) {\n const index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n if (index !== -1) {\n chart.boxes.splice(index, 1);\n }\n },\n\n /**\n\t * Sets (or updates) options on the given `item`.\n\t * @param {Chart} chart - the chart in which the item lives (or will be added to)\n\t * @param {LayoutItem} item - the item to configure with the given options\n\t * @param {object} options - the new item options.\n\t */\n configure(chart, item, options) {\n item.fullSize = options.fullSize;\n item.position = options.position;\n item.weight = options.weight;\n },\n\n /**\n\t * Fits boxes of the given chart into the given size by having each box measure itself\n\t * then running a fitting algorithm\n\t * @param {Chart} chart - the chart\n\t * @param {number} width - the width to fit into\n\t * @param {number} height - the height to fit into\n * @param {number} minPadding - minimum padding required for each side of chart area\n\t */\n update(chart, width, height, minPadding) {\n if (!chart) {\n return;\n }\n\n const padding = toPadding(chart.options.layout.padding);\n const availableWidth = Math.max(width - padding.width, 0);\n const availableHeight = Math.max(height - padding.height, 0);\n const boxes = buildLayoutBoxes(chart.boxes);\n const verticalBoxes = boxes.vertical;\n const horizontalBoxes = boxes.horizontal;\n\n // Before any changes are made, notify boxes that an update is about to being\n // This is used to clear any cached data (e.g. scale limits)\n each(chart.boxes, box => {\n if (typeof box.beforeLayout === 'function') {\n box.beforeLayout();\n }\n });\n\n // Essentially we now have any number of boxes on each of the 4 sides.\n // Our canvas looks like the following.\n // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and\n // B1 is the bottom axis\n // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays\n // These locations are single-box locations only, when trying to register a chartArea location that is already taken,\n // an error will be thrown.\n //\n // |----------------------------------------------------|\n // | T1 (Full Width) |\n // |----------------------------------------------------|\n // | | | T2 | |\n // | |----|-------------------------------------|----|\n // | | | C1 | | C2 | |\n // | | |----| |----| |\n // | | | | |\n // | L1 | L2 | ChartArea (C0) | R1 |\n // | | | | |\n // | | |----| |----| |\n // | | | C3 | | C4 | |\n // | |----|-------------------------------------|----|\n // | | | B1 | |\n // |----------------------------------------------------|\n // | B2 (Full Width) |\n // |----------------------------------------------------|\n //\n\n const visibleVerticalBoxCount = verticalBoxes.reduce((total, wrap) =>\n wrap.box.options && wrap.box.options.display === false ? total : total + 1, 0) || 1;\n\n const params = Object.freeze({\n outerWidth: width,\n outerHeight: height,\n padding,\n availableWidth,\n availableHeight,\n vBoxMaxWidth: availableWidth / 2 / visibleVerticalBoxCount,\n hBoxMaxHeight: availableHeight / 2\n });\n const maxPadding = Object.assign({}, padding);\n updateMaxPadding(maxPadding, toPadding(minPadding));\n const chartArea = Object.assign({\n maxPadding,\n w: availableWidth,\n h: availableHeight,\n x: padding.left,\n y: padding.top\n }, padding);\n\n const stacks = setLayoutDims(verticalBoxes.concat(horizontalBoxes), params);\n\n // First fit the fullSize boxes, to reduce probability of re-fitting.\n fitBoxes(boxes.fullSize, chartArea, params, stacks);\n\n // Then fit vertical boxes\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n\n // Then fit horizontal boxes\n if (fitBoxes(horizontalBoxes, chartArea, params, stacks)) {\n // if the area changed, re-fit vertical boxes\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n }\n\n handleMaxPadding(chartArea);\n\n // Finally place the boxes to correct coordinates\n placeBoxes(boxes.leftAndTop, chartArea, params, stacks);\n\n // Move to opposite side of chart\n chartArea.x += chartArea.w;\n chartArea.y += chartArea.h;\n\n placeBoxes(boxes.rightAndBottom, chartArea, params, stacks);\n\n chart.chartArea = {\n left: chartArea.left,\n top: chartArea.top,\n right: chartArea.left + chartArea.w,\n bottom: chartArea.top + chartArea.h,\n height: chartArea.h,\n width: chartArea.w,\n };\n\n // Finally update boxes in chartArea (radial scale for example)\n each(boxes.chartArea, (layout) => {\n const box = layout.box;\n Object.assign(box, chart.chartArea);\n box.update(chartArea.w, chartArea.h, {left: 0, top: 0, right: 0, bottom: 0});\n });\n }\n};\n","\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\n/**\n * Abstract class that allows abstracting platform dependencies away from the chart.\n */\nexport default class BasePlatform {\n /**\n\t * Called at chart construction time, returns a context2d instance implementing\n\t * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}.\n\t * @param {HTMLCanvasElement} canvas - The canvas from which to acquire context (platform specific)\n\t * @param {number} [aspectRatio] - The chart options\n\t */\n acquireContext(canvas, aspectRatio) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Called at chart destruction time, releases any resources associated to the context\n\t * previously returned by the acquireContext() method.\n\t * @param {CanvasRenderingContext2D} context - The context2d instance\n\t * @returns {boolean} true if the method succeeded, else false\n\t */\n releaseContext(context) { // eslint-disable-line no-unused-vars\n return false;\n }\n\n /**\n\t * Registers the specified listener on the given chart.\n\t * @param {Chart} chart - Chart from which to listen for event\n\t * @param {string} type - The ({@link ChartEvent}) type to listen for\n\t * @param {function} listener - Receives a notification (an object that implements\n\t * the {@link ChartEvent} interface) when an event of the specified type occurs.\n\t */\n addEventListener(chart, type, listener) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Removes the specified listener previously registered with addEventListener.\n\t * @param {Chart} chart - Chart from which to remove the listener\n\t * @param {string} type - The ({@link ChartEvent}) type to remove\n\t * @param {function} listener - The listener function to remove from the event target.\n\t */\n removeEventListener(chart, type, listener) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * @returns {number} the current devicePixelRatio of the device this platform is connected to.\n\t */\n getDevicePixelRatio() {\n return 1;\n }\n\n /**\n\t * Returns the maximum size in pixels of given canvas element.\n\t * @param {HTMLCanvasElement} element\n\t * @param {number} [width] - content width of parent element\n\t * @param {number} [height] - content height of parent element\n\t * @param {number} [aspectRatio] - aspect ratio to maintain\n\t */\n getMaximumSize(element, width, height, aspectRatio) {\n width = Math.max(0, width || element.width);\n height = height || element.height;\n return {\n width,\n height: Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height)\n };\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @returns {boolean} true if the canvas is attached to the platform, false if not.\n\t */\n isAttached(canvas) { // eslint-disable-line no-unused-vars\n return true;\n }\n\n /**\n * Updates config with platform specific requirements\n * @param {import('../core/core.config.js').default} config\n */\n updateConfig(config) { // eslint-disable-line no-unused-vars\n // no-op\n }\n}\n","/**\n * Platform fallback implementation (minimal).\n * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939\n */\n\nimport BasePlatform from './platform.base.js';\n\n/**\n * Platform class for charts without access to the DOM or to many element properties\n * This platform is used by default for any chart passed an OffscreenCanvas.\n * @extends BasePlatform\n */\nexport default class BasicPlatform extends BasePlatform {\n acquireContext(item) {\n // To prevent canvas fingerprinting, some add-ons undefine the getContext\n // method, for example: https://github.com/kkapsner/CanvasBlocker\n // https://github.com/chartjs/Chart.js/issues/2807\n return item && item.getContext && item.getContext('2d') || null;\n }\n updateConfig(config) {\n config.options.animation = false;\n }\n}\n","/**\n * Chart.Platform implementation for targeting a web browser\n */\n\nimport BasePlatform from './platform.base.js';\nimport {_getParentNode, getRelativePosition, supportsEventListenerOptions, readUsedSize, getMaximumSize} from '../helpers/helpers.dom.js';\nimport {throttled} from '../helpers/helpers.extras.js';\nimport {isNullOrUndef} from '../helpers/helpers.core.js';\n\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\nconst EXPANDO_KEY = '$chartjs';\n\n/**\n * DOM event types -> Chart.js event types.\n * Note: only events with different types are mapped.\n * @see https://developer.mozilla.org/en-US/docs/Web/Events\n */\nconst EVENT_TYPES = {\n touchstart: 'mousedown',\n touchmove: 'mousemove',\n touchend: 'mouseup',\n pointerenter: 'mouseenter',\n pointerdown: 'mousedown',\n pointermove: 'mousemove',\n pointerup: 'mouseup',\n pointerleave: 'mouseout',\n pointerout: 'mouseout'\n};\n\nconst isNullOrEmpty = value => value === null || value === '';\n/**\n * Initializes the canvas style and render size without modifying the canvas display size,\n * since responsiveness is handled by the controller.resize() method. The config is used\n * to determine the aspect ratio to apply in case no explicit height has been specified.\n * @param {HTMLCanvasElement} canvas\n * @param {number} [aspectRatio]\n */\nfunction initCanvas(canvas, aspectRatio) {\n const style = canvas.style;\n\n // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it\n // returns null or '' if no explicit value has been set to the canvas attribute.\n const renderHeight = canvas.getAttribute('height');\n const renderWidth = canvas.getAttribute('width');\n\n // Chart.js modifies some canvas values that we want to restore on destroy\n canvas[EXPANDO_KEY] = {\n initial: {\n height: renderHeight,\n width: renderWidth,\n style: {\n display: style.display,\n height: style.height,\n width: style.width\n }\n }\n };\n\n // Force canvas to display as block to avoid extra space caused by inline\n // elements, which would interfere with the responsive resize process.\n // https://github.com/chartjs/Chart.js/issues/2538\n style.display = style.display || 'block';\n // Include possible borders in the size\n style.boxSizing = style.boxSizing || 'border-box';\n\n if (isNullOrEmpty(renderWidth)) {\n const displayWidth = readUsedSize(canvas, 'width');\n if (displayWidth !== undefined) {\n canvas.width = displayWidth;\n }\n }\n\n if (isNullOrEmpty(renderHeight)) {\n if (canvas.style.height === '') {\n // If no explicit render height and style height, let's apply the aspect ratio,\n // which one can be specified by the user but also by charts as default option\n // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2.\n canvas.height = canvas.width / (aspectRatio || 2);\n } else {\n const displayHeight = readUsedSize(canvas, 'height');\n if (displayHeight !== undefined) {\n canvas.height = displayHeight;\n }\n }\n }\n\n return canvas;\n}\n\n// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events.\n// https://github.com/chartjs/Chart.js/issues/4287\nconst eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false;\n\nfunction addListener(node, type, listener) {\n if (node) {\n node.addEventListener(type, listener, eventListenerOptions);\n }\n}\n\nfunction removeListener(chart, type, listener) {\n if (chart && chart.canvas) {\n chart.canvas.removeEventListener(type, listener, eventListenerOptions);\n }\n}\n\nfunction fromNativeEvent(event, chart) {\n const type = EVENT_TYPES[event.type] || event.type;\n const {x, y} = getRelativePosition(event, chart);\n return {\n type,\n chart,\n native: event,\n x: x !== undefined ? x : null,\n y: y !== undefined ? y : null,\n };\n}\n\nfunction nodeListContains(nodeList, canvas) {\n for (const node of nodeList) {\n if (node === canvas || node.contains(canvas)) {\n return true;\n }\n }\n}\n\nfunction createAttachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver(entries => {\n let trigger = false;\n for (const entry of entries) {\n trigger = trigger || nodeListContains(entry.addedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.removedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {childList: true, subtree: true});\n return observer;\n}\n\nfunction createDetachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver(entries => {\n let trigger = false;\n for (const entry of entries) {\n trigger = trigger || nodeListContains(entry.removedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.addedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {childList: true, subtree: true});\n return observer;\n}\n\nconst drpListeningCharts = new Map();\nlet oldDevicePixelRatio = 0;\n\nfunction onWindowResize() {\n const dpr = window.devicePixelRatio;\n if (dpr === oldDevicePixelRatio) {\n return;\n }\n oldDevicePixelRatio = dpr;\n drpListeningCharts.forEach((resize, chart) => {\n if (chart.currentDevicePixelRatio !== dpr) {\n resize();\n }\n });\n}\n\nfunction listenDevicePixelRatioChanges(chart, resize) {\n if (!drpListeningCharts.size) {\n window.addEventListener('resize', onWindowResize);\n }\n drpListeningCharts.set(chart, resize);\n}\n\nfunction unlistenDevicePixelRatioChanges(chart) {\n drpListeningCharts.delete(chart);\n if (!drpListeningCharts.size) {\n window.removeEventListener('resize', onWindowResize);\n }\n}\n\nfunction createResizeObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n return;\n }\n const resize = throttled((width, height) => {\n const w = container.clientWidth;\n listener(width, height);\n if (w < container.clientWidth) {\n // If the container size shrank during chart resize, let's assume\n // scrollbar appeared. So we resize again with the scrollbar visible -\n // effectively making chart smaller and the scrollbar hidden again.\n // Because we are inside `throttled`, and currently `ticking`, scroll\n // events are ignored during this whole 2 resize process.\n // If we assumed wrong and something else happened, we are resizing\n // twice in a frame (potential performance issue)\n listener();\n }\n }, window);\n\n // @ts-ignore until https://github.com/microsoft/TypeScript/issues/37861 implemented\n const observer = new ResizeObserver(entries => {\n const entry = entries[0];\n const width = entry.contentRect.width;\n const height = entry.contentRect.height;\n // When its container's display is set to 'none' the callback will be called with a\n // size of (0, 0), which will cause the chart to lose its original height, so skip\n // resizing in such case.\n if (width === 0 && height === 0) {\n return;\n }\n resize(width, height);\n });\n observer.observe(container);\n listenDevicePixelRatioChanges(chart, resize);\n\n return observer;\n}\n\nfunction releaseObserver(chart, type, observer) {\n if (observer) {\n observer.disconnect();\n }\n if (type === 'resize') {\n unlistenDevicePixelRatioChanges(chart);\n }\n}\n\nfunction createProxyAndListen(chart, type, listener) {\n const canvas = chart.canvas;\n const proxy = throttled((event) => {\n // This case can occur if the chart is destroyed while waiting\n // for the throttled function to occur. We prevent crashes by checking\n // for a destroyed chart\n if (chart.ctx !== null) {\n listener(fromNativeEvent(event, chart));\n }\n }, chart);\n\n addListener(canvas, type, proxy);\n\n return proxy;\n}\n\n/**\n * Platform class for charts that can access the DOM and global window/document properties\n * @extends BasePlatform\n */\nexport default class DomPlatform extends BasePlatform {\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @param {number} [aspectRatio]\n\t * @return {CanvasRenderingContext2D|null}\n\t */\n acquireContext(canvas, aspectRatio) {\n // To prevent canvas fingerprinting, some add-ons undefine the getContext\n // method, for example: https://github.com/kkapsner/CanvasBlocker\n // https://github.com/chartjs/Chart.js/issues/2807\n const context = canvas && canvas.getContext && canvas.getContext('2d');\n\n // `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the canvas is\n // inside an iframe or when running in a protected environment. We could guess the\n // types from their toString() value but let's keep things flexible and assume it's\n // a sufficient condition if the canvas has a context2D which has canvas as `canvas`.\n // https://github.com/chartjs/Chart.js/issues/3887\n // https://github.com/chartjs/Chart.js/issues/4102\n // https://github.com/chartjs/Chart.js/issues/4152\n if (context && context.canvas === canvas) {\n // Load platform resources on first chart creation, to make it possible to\n // import the library before setting platform options.\n initCanvas(canvas, aspectRatio);\n return context;\n }\n\n return null;\n }\n\n /**\n\t * @param {CanvasRenderingContext2D} context\n\t */\n releaseContext(context) {\n const canvas = context.canvas;\n if (!canvas[EXPANDO_KEY]) {\n return false;\n }\n\n const initial = canvas[EXPANDO_KEY].initial;\n ['height', 'width'].forEach((prop) => {\n const value = initial[prop];\n if (isNullOrUndef(value)) {\n canvas.removeAttribute(prop);\n } else {\n canvas.setAttribute(prop, value);\n }\n });\n\n const style = initial.style || {};\n Object.keys(style).forEach((key) => {\n canvas.style[key] = style[key];\n });\n\n // The canvas render size might have been changed (and thus the state stack discarded),\n // we can't use save() and restore() to restore the initial state. So make sure that at\n // least the canvas context is reset to the default state by setting the canvas width.\n // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html\n // eslint-disable-next-line no-self-assign\n canvas.width = canvas.width;\n\n delete canvas[EXPANDO_KEY];\n return true;\n }\n\n /**\n\t *\n\t * @param {Chart} chart\n\t * @param {string} type\n\t * @param {function} listener\n\t */\n addEventListener(chart, type, listener) {\n // Can have only one listener per type, so make sure previous is removed\n this.removeEventListener(chart, type);\n\n const proxies = chart.$proxies || (chart.$proxies = {});\n const handlers = {\n attach: createAttachObserver,\n detach: createDetachObserver,\n resize: createResizeObserver\n };\n const handler = handlers[type] || createProxyAndListen;\n proxies[type] = handler(chart, type, listener);\n }\n\n\n /**\n\t * @param {Chart} chart\n\t * @param {string} type\n\t */\n removeEventListener(chart, type) {\n const proxies = chart.$proxies || (chart.$proxies = {});\n const proxy = proxies[type];\n\n if (!proxy) {\n return;\n }\n\n const handlers = {\n attach: releaseObserver,\n detach: releaseObserver,\n resize: releaseObserver\n };\n const handler = handlers[type] || removeListener;\n handler(chart, type, proxy);\n proxies[type] = undefined;\n }\n\n getDevicePixelRatio() {\n return window.devicePixelRatio;\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @param {number} [width] - content width of parent element\n\t * @param {number} [height] - content height of parent element\n\t * @param {number} [aspectRatio] - aspect ratio to maintain\n\t */\n getMaximumSize(canvas, width, height, aspectRatio) {\n return getMaximumSize(canvas, width, height, aspectRatio);\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t */\n isAttached(canvas) {\n const container = canvas && _getParentNode(canvas);\n return !!(container && container.isConnected);\n }\n}\n","import {_isDomSupported} from '../helpers/index.js';\nimport BasePlatform from './platform.base.js';\nimport BasicPlatform from './platform.basic.js';\nimport DomPlatform from './platform.dom.js';\n\nexport function _detectPlatform(canvas) {\n if (!_isDomSupported() || (typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas)) {\n return BasicPlatform;\n }\n return DomPlatform;\n}\n\nexport {BasePlatform, BasicPlatform, DomPlatform};\n","import type {AnyObject} from '../types/basic.js';\nimport type {Point} from '../types/geometric.js';\nimport type {Animation} from '../types/animation.js';\nimport {isNumber} from '../helpers/helpers.math.js';\n\nexport default class Element {\n\n static defaults = {};\n static defaultRoutes = undefined;\n\n x: number;\n y: number;\n active = false;\n options: O;\n $animations: Record;\n\n tooltipPosition(useFinalPosition: boolean): Point {\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return {x, y} as Point;\n }\n\n hasValue() {\n return isNumber(this.x) && isNumber(this.y);\n }\n\n /**\n * Gets the current or final value of each prop. Can return extra properties (whole object).\n * @param props - properties to get\n * @param [final] - get the final value (animation target)\n */\n getProps

(props: P, final?: boolean): Pick;\n getProps

(props: P[], final?: boolean): Partial>;\n getProps(props: string[], final?: boolean): Partial> {\n const anims = this.$animations;\n if (!final || !anims) {\n // let's not create an object, if not needed\n return this as Record;\n }\n const ret: Record = {};\n props.forEach((prop) => {\n ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : this[prop as string];\n });\n return ret;\n }\n}\n","import {isNullOrUndef, valueOrDefault} from '../helpers/helpers.core.js';\nimport {_factorize} from '../helpers/helpers.math.js';\n\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef {{value:number | string, label?:string, major?:boolean, $context?:any}} Tick\n */\n\n/**\n * Returns a subset of ticks to be plotted to avoid overlapping labels.\n * @param {import('./core.scale.js').default} scale\n * @param {Tick[]} ticks\n * @return {Tick[]}\n * @private\n */\nexport function autoSkip(scale, ticks) {\n const tickOpts = scale.options.ticks;\n const determinedMaxTicks = determineMaxTicks(scale);\n const ticksLimit = Math.min(tickOpts.maxTicksLimit || determinedMaxTicks, determinedMaxTicks);\n const majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : [];\n const numMajorIndices = majorIndices.length;\n const first = majorIndices[0];\n const last = majorIndices[numMajorIndices - 1];\n const newTicks = [];\n\n // If there are too many major ticks to display them all\n if (numMajorIndices > ticksLimit) {\n skipMajors(ticks, newTicks, majorIndices, numMajorIndices / ticksLimit);\n return newTicks;\n }\n\n const spacing = calculateSpacing(majorIndices, ticks, ticksLimit);\n\n if (numMajorIndices > 0) {\n let i, ilen;\n const avgMajorSpacing = numMajorIndices > 1 ? Math.round((last - first) / (numMajorIndices - 1)) : null;\n skip(ticks, newTicks, spacing, isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first);\n for (i = 0, ilen = numMajorIndices - 1; i < ilen; i++) {\n skip(ticks, newTicks, spacing, majorIndices[i], majorIndices[i + 1]);\n }\n skip(ticks, newTicks, spacing, last, isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing);\n return newTicks;\n }\n skip(ticks, newTicks, spacing);\n return newTicks;\n}\n\nfunction determineMaxTicks(scale) {\n const offset = scale.options.offset;\n const tickLength = scale._tickSize();\n const maxScale = scale._length / tickLength + (offset ? 0 : 1);\n const maxChart = scale._maxLength / tickLength;\n return Math.floor(Math.min(maxScale, maxChart));\n}\n\n/**\n * @param {number[]} majorIndices\n * @param {Tick[]} ticks\n * @param {number} ticksLimit\n */\nfunction calculateSpacing(majorIndices, ticks, ticksLimit) {\n const evenMajorSpacing = getEvenSpacing(majorIndices);\n const spacing = ticks.length / ticksLimit;\n\n // If the major ticks are evenly spaced apart, place the minor ticks\n // so that they divide the major ticks into even chunks\n if (!evenMajorSpacing) {\n return Math.max(spacing, 1);\n }\n\n const factors = _factorize(evenMajorSpacing);\n for (let i = 0, ilen = factors.length - 1; i < ilen; i++) {\n const factor = factors[i];\n if (factor > spacing) {\n return factor;\n }\n }\n return Math.max(spacing, 1);\n}\n\n/**\n * @param {Tick[]} ticks\n */\nfunction getMajorIndices(ticks) {\n const result = [];\n let i, ilen;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n if (ticks[i].major) {\n result.push(i);\n }\n }\n return result;\n}\n\n/**\n * @param {Tick[]} ticks\n * @param {Tick[]} newTicks\n * @param {number[]} majorIndices\n * @param {number} spacing\n */\nfunction skipMajors(ticks, newTicks, majorIndices, spacing) {\n let count = 0;\n let next = majorIndices[0];\n let i;\n\n spacing = Math.ceil(spacing);\n for (i = 0; i < ticks.length; i++) {\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = majorIndices[count * spacing];\n }\n }\n}\n\n/**\n * @param {Tick[]} ticks\n * @param {Tick[]} newTicks\n * @param {number} spacing\n * @param {number} [majorStart]\n * @param {number} [majorEnd]\n */\nfunction skip(ticks, newTicks, spacing, majorStart, majorEnd) {\n const start = valueOrDefault(majorStart, 0);\n const end = Math.min(valueOrDefault(majorEnd, ticks.length), ticks.length);\n let count = 0;\n let length, i, next;\n\n spacing = Math.ceil(spacing);\n if (majorEnd) {\n length = majorEnd - majorStart;\n spacing = length / Math.floor(length / spacing);\n }\n\n next = start;\n\n while (next < 0) {\n count++;\n next = Math.round(start + count * spacing);\n }\n\n for (i = Math.max(start, 0); i < end; i++) {\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = Math.round(start + count * spacing);\n }\n }\n}\n\n\n/**\n * @param {number[]} arr\n */\nfunction getEvenSpacing(arr) {\n const len = arr.length;\n let i, diff;\n\n if (len < 2) {\n return false;\n }\n\n for (diff = arr[0], i = 1; i < len; ++i) {\n if (arr[i] - arr[i - 1] !== diff) {\n return false;\n }\n }\n return diff;\n}\n","import Element from './core.element.js';\nimport {_alignPixel, _measureText, renderText, clipArea, unclipArea} from '../helpers/helpers.canvas.js';\nimport {callback as call, each, finiteOrDefault, isArray, isFinite, isNullOrUndef, isObject, valueOrDefault} from '../helpers/helpers.core.js';\nimport {toDegrees, toRadians, _int16Range, _limitValue, HALF_PI} from '../helpers/helpers.math.js';\nimport {_alignStartEnd, _toLeftRightCenter} from '../helpers/helpers.extras.js';\nimport {createContext, toFont, toPadding, _addGrace} from '../helpers/helpers.options.js';\nimport {autoSkip} from './core.scale.autoskip.js';\n\nconst reverseAlign = (align) => align === 'left' ? 'right' : align === 'right' ? 'left' : align;\nconst offsetFromEdge = (scale, edge, offset) => edge === 'top' || edge === 'left' ? scale[edge] + offset : scale[edge] - offset;\nconst getTicksLimit = (ticksLength, maxTicksLimit) => Math.min(maxTicksLimit || ticksLength, ticksLength);\n\n/**\n * @typedef { import('../types/index.js').Chart } Chart\n * @typedef {{value:number | string, label?:string, major?:boolean, $context?:any}} Tick\n */\n\n/**\n * Returns a new array containing numItems from arr\n * @param {any[]} arr\n * @param {number} numItems\n */\nfunction sample(arr, numItems) {\n const result = [];\n const increment = arr.length / numItems;\n const len = arr.length;\n let i = 0;\n\n for (; i < len; i += increment) {\n result.push(arr[Math.floor(i)]);\n }\n return result;\n}\n\n/**\n * @param {Scale} scale\n * @param {number} index\n * @param {boolean} offsetGridLines\n */\nfunction getPixelForGridLine(scale, index, offsetGridLines) {\n const length = scale.ticks.length;\n const validIndex = Math.min(index, length - 1);\n const start = scale._startPixel;\n const end = scale._endPixel;\n const epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error.\n let lineValue = scale.getPixelForTick(validIndex);\n let offset;\n\n if (offsetGridLines) {\n if (length === 1) {\n offset = Math.max(lineValue - start, end - lineValue);\n } else if (index === 0) {\n offset = (scale.getPixelForTick(1) - lineValue) / 2;\n } else {\n offset = (lineValue - scale.getPixelForTick(validIndex - 1)) / 2;\n }\n lineValue += validIndex < index ? offset : -offset;\n\n // Return undefined if the pixel is out of the range\n if (lineValue < start - epsilon || lineValue > end + epsilon) {\n return;\n }\n }\n return lineValue;\n}\n\n/**\n * @param {object} caches\n * @param {number} length\n */\nfunction garbageCollect(caches, length) {\n each(caches, (cache) => {\n const gc = cache.gc;\n const gcLen = gc.length / 2;\n let i;\n if (gcLen > length) {\n for (i = 0; i < gcLen; ++i) {\n delete cache.data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n });\n}\n\n/**\n * @param {object} options\n */\nfunction getTickMarkLength(options) {\n return options.drawTicks ? options.tickLength : 0;\n}\n\n/**\n * @param {object} options\n */\nfunction getTitleHeight(options, fallback) {\n if (!options.display) {\n return 0;\n }\n\n const font = toFont(options.font, fallback);\n const padding = toPadding(options.padding);\n const lines = isArray(options.text) ? options.text.length : 1;\n\n return (lines * font.lineHeight) + padding.height;\n}\n\nfunction createScaleContext(parent, scale) {\n return createContext(parent, {\n scale,\n type: 'scale'\n });\n}\n\nfunction createTickContext(parent, index, tick) {\n return createContext(parent, {\n tick,\n index,\n type: 'tick'\n });\n}\n\nfunction titleAlign(align, position, reverse) {\n /** @type {CanvasTextAlign} */\n let ret = _toLeftRightCenter(align);\n if ((reverse && position !== 'right') || (!reverse && position === 'right')) {\n ret = reverseAlign(ret);\n }\n return ret;\n}\n\nfunction titleArgs(scale, offset, position, align) {\n const {top, left, bottom, right, chart} = scale;\n const {chartArea, scales} = chart;\n let rotation = 0;\n let maxWidth, titleX, titleY;\n const height = bottom - top;\n const width = right - left;\n\n if (scale.isHorizontal()) {\n titleX = _alignStartEnd(align, left, right);\n\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleY = scales[positionAxisID].getPixelForValue(value) + height - offset;\n } else if (position === 'center') {\n titleY = (chartArea.bottom + chartArea.top) / 2 + height - offset;\n } else {\n titleY = offsetFromEdge(scale, position, offset);\n }\n maxWidth = right - left;\n } else {\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleX = scales[positionAxisID].getPixelForValue(value) - width + offset;\n } else if (position === 'center') {\n titleX = (chartArea.left + chartArea.right) / 2 - width + offset;\n } else {\n titleX = offsetFromEdge(scale, position, offset);\n }\n titleY = _alignStartEnd(align, bottom, top);\n rotation = position === 'left' ? -HALF_PI : HALF_PI;\n }\n return {titleX, titleY, maxWidth, rotation};\n}\n\nexport default class Scale extends Element {\n\n // eslint-disable-next-line max-statements\n constructor(cfg) {\n super();\n\n /** @type {string} */\n this.id = cfg.id;\n /** @type {string} */\n this.type = cfg.type;\n /** @type {any} */\n this.options = undefined;\n /** @type {CanvasRenderingContext2D} */\n this.ctx = cfg.ctx;\n /** @type {Chart} */\n this.chart = cfg.chart;\n\n // implements box\n /** @type {number} */\n this.top = undefined;\n /** @type {number} */\n this.bottom = undefined;\n /** @type {number} */\n this.left = undefined;\n /** @type {number} */\n this.right = undefined;\n /** @type {number} */\n this.width = undefined;\n /** @type {number} */\n this.height = undefined;\n this._margins = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n };\n /** @type {number} */\n this.maxWidth = undefined;\n /** @type {number} */\n this.maxHeight = undefined;\n /** @type {number} */\n this.paddingTop = undefined;\n /** @type {number} */\n this.paddingBottom = undefined;\n /** @type {number} */\n this.paddingLeft = undefined;\n /** @type {number} */\n this.paddingRight = undefined;\n\n // scale-specific properties\n /** @type {string=} */\n this.axis = undefined;\n /** @type {number=} */\n this.labelRotation = undefined;\n this.min = undefined;\n this.max = undefined;\n this._range = undefined;\n /** @type {Tick[]} */\n this.ticks = [];\n /** @type {object[]|null} */\n this._gridLineItems = null;\n /** @type {object[]|null} */\n this._labelItems = null;\n /** @type {object|null} */\n this._labelSizes = null;\n this._length = 0;\n this._maxLength = 0;\n this._longestTextCache = {};\n /** @type {number} */\n this._startPixel = undefined;\n /** @type {number} */\n this._endPixel = undefined;\n this._reversePixels = false;\n this._userMax = undefined;\n this._userMin = undefined;\n this._suggestedMax = undefined;\n this._suggestedMin = undefined;\n this._ticksLength = 0;\n this._borderValue = 0;\n this._cache = {};\n this._dataLimitsCached = false;\n this.$context = undefined;\n }\n\n /**\n\t * @param {any} options\n\t * @since 3.0\n\t */\n init(options) {\n this.options = options.setContext(this.getContext());\n\n this.axis = options.axis;\n\n // parse min/max value, so we can properly determine min/max for other scales\n this._userMin = this.parse(options.min);\n this._userMax = this.parse(options.max);\n this._suggestedMin = this.parse(options.suggestedMin);\n this._suggestedMax = this.parse(options.suggestedMax);\n }\n\n /**\n\t * Parse a supported input value to internal representation.\n\t * @param {*} raw\n\t * @param {number} [index]\n\t * @since 3.0\n\t */\n parse(raw, index) { // eslint-disable-line no-unused-vars\n return raw;\n }\n\n /**\n\t * @return {{min: number, max: number, minDefined: boolean, maxDefined: boolean}}\n\t * @protected\n\t * @since 3.0\n\t */\n getUserBounds() {\n let {_userMin, _userMax, _suggestedMin, _suggestedMax} = this;\n _userMin = finiteOrDefault(_userMin, Number.POSITIVE_INFINITY);\n _userMax = finiteOrDefault(_userMax, Number.NEGATIVE_INFINITY);\n _suggestedMin = finiteOrDefault(_suggestedMin, Number.POSITIVE_INFINITY);\n _suggestedMax = finiteOrDefault(_suggestedMax, Number.NEGATIVE_INFINITY);\n return {\n min: finiteOrDefault(_userMin, _suggestedMin),\n max: finiteOrDefault(_userMax, _suggestedMax),\n minDefined: isFinite(_userMin),\n maxDefined: isFinite(_userMax)\n };\n }\n\n /**\n\t * @param {boolean} canStack\n\t * @return {{min: number, max: number}}\n\t * @protected\n\t * @since 3.0\n\t */\n getMinMax(canStack) {\n let {min, max, minDefined, maxDefined} = this.getUserBounds();\n let range;\n\n if (minDefined && maxDefined) {\n return {min, max};\n }\n\n const metas = this.getMatchingVisibleMetas();\n for (let i = 0, ilen = metas.length; i < ilen; ++i) {\n range = metas[i].controller.getMinMax(this, canStack);\n if (!minDefined) {\n min = Math.min(min, range.min);\n }\n if (!maxDefined) {\n max = Math.max(max, range.max);\n }\n }\n\n // Make sure min <= max when only min or max is defined by user and the data is outside that range\n min = maxDefined && min > max ? max : min;\n max = minDefined && min > max ? min : max;\n\n return {\n min: finiteOrDefault(min, finiteOrDefault(max, min)),\n max: finiteOrDefault(max, finiteOrDefault(min, max))\n };\n }\n\n /**\n\t * Get the padding needed for the scale\n\t * @return {{top: number, left: number, bottom: number, right: number}} the necessary padding\n\t * @private\n\t */\n getPadding() {\n return {\n left: this.paddingLeft || 0,\n top: this.paddingTop || 0,\n right: this.paddingRight || 0,\n bottom: this.paddingBottom || 0\n };\n }\n\n /**\n\t * Returns the scale tick objects\n\t * @return {Tick[]}\n\t * @since 2.7\n\t */\n getTicks() {\n return this.ticks;\n }\n\n /**\n\t * @return {string[]}\n\t */\n getLabels() {\n const data = this.chart.data;\n return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];\n }\n\n /**\n * @return {import('../types.js').LabelItem[]}\n */\n getLabelItems(chartArea = this.chart.chartArea) {\n const items = this._labelItems || (this._labelItems = this._computeLabelItems(chartArea));\n return items;\n }\n\n // When a new layout is created, reset the data limits cache\n beforeLayout() {\n this._cache = {};\n this._dataLimitsCached = false;\n }\n\n // These methods are ordered by lifecycle. Utilities then follow.\n // Any function defined here is inherited by all scale types.\n // Any function can be extended by the scale type\n\n beforeUpdate() {\n call(this.options.beforeUpdate, [this]);\n }\n\n /**\n\t * @param {number} maxWidth - the max width in pixels\n\t * @param {number} maxHeight - the max height in pixels\n\t * @param {{top: number, left: number, bottom: number, right: number}} margins - the space between the edge of the other scales and edge of the chart\n\t * This space comes from two sources:\n\t * - padding - space that's required to show the labels at the edges of the scale\n\t * - thickness of scales or legends in another orientation\n\t */\n update(maxWidth, maxHeight, margins) {\n const {beginAtZero, grace, ticks: tickOpts} = this.options;\n const sampleSize = tickOpts.sampleSize;\n\n // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n this.beforeUpdate();\n\n // Absorb the master measurements\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins = Object.assign({\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n }, margins);\n\n this.ticks = null;\n this._labelSizes = null;\n this._gridLineItems = null;\n this._labelItems = null;\n\n // Dimensions\n this.beforeSetDimensions();\n this.setDimensions();\n this.afterSetDimensions();\n\n this._maxLength = this.isHorizontal()\n ? this.width + margins.left + margins.right\n : this.height + margins.top + margins.bottom;\n\n // Data min/max\n if (!this._dataLimitsCached) {\n this.beforeDataLimits();\n this.determineDataLimits();\n this.afterDataLimits();\n this._range = _addGrace(this, grace, beginAtZero);\n this._dataLimitsCached = true;\n }\n\n this.beforeBuildTicks();\n\n this.ticks = this.buildTicks() || [];\n\n // Allow modification of ticks in callback.\n this.afterBuildTicks();\n\n // Compute tick rotation and fit using a sampled subset of labels\n // We generally don't need to compute the size of every single label for determining scale size\n const samplingEnabled = sampleSize < this.ticks.length;\n this._convertTicksToLabels(samplingEnabled ? sample(this.ticks, sampleSize) : this.ticks);\n\n // configure is called twice, once here, once from core.controller.updateLayout.\n // Here we haven't been positioned yet, but dimensions are correct.\n // Variables set in configure are needed for calculateLabelRotation, and\n // it's ok that coordinates are not correct there, only dimensions matter.\n this.configure();\n\n // Tick Rotation\n this.beforeCalculateLabelRotation();\n this.calculateLabelRotation(); // Preconditions: number of ticks and sizes of largest labels must be calculated beforehand\n this.afterCalculateLabelRotation();\n\n // Auto-skip\n if (tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto')) {\n this.ticks = autoSkip(this, this.ticks);\n this._labelSizes = null;\n this.afterAutoSkip();\n }\n\n if (samplingEnabled) {\n // Generate labels using all non-skipped ticks\n this._convertTicksToLabels(this.ticks);\n }\n\n this.beforeFit();\n this.fit(); // Preconditions: label rotation and label sizes must be calculated beforehand\n this.afterFit();\n\n // IMPORTANT: after this point, we consider that `this.ticks` will NEVER change!\n\n this.afterUpdate();\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n let reversePixels = this.options.reverse;\n let startPixel, endPixel;\n\n if (this.isHorizontal()) {\n startPixel = this.left;\n endPixel = this.right;\n } else {\n startPixel = this.top;\n endPixel = this.bottom;\n // by default vertical scales are from bottom to top, so pixels are reversed\n reversePixels = !reversePixels;\n }\n this._startPixel = startPixel;\n this._endPixel = endPixel;\n this._reversePixels = reversePixels;\n this._length = endPixel - startPixel;\n this._alignToPixels = this.options.alignToPixels;\n }\n\n afterUpdate() {\n call(this.options.afterUpdate, [this]);\n }\n\n //\n\n beforeSetDimensions() {\n call(this.options.beforeSetDimensions, [this]);\n }\n setDimensions() {\n // Set the unconstrained dimension before label rotation\n if (this.isHorizontal()) {\n // Reset position before calculating rotation\n this.width = this.maxWidth;\n this.left = 0;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n\n // Reset position before calculating rotation\n this.top = 0;\n this.bottom = this.height;\n }\n\n // Reset padding\n this.paddingLeft = 0;\n this.paddingTop = 0;\n this.paddingRight = 0;\n this.paddingBottom = 0;\n }\n afterSetDimensions() {\n call(this.options.afterSetDimensions, [this]);\n }\n\n _callHooks(name) {\n this.chart.notifyPlugins(name, this.getContext());\n call(this.options[name], [this]);\n }\n\n // Data limits\n beforeDataLimits() {\n this._callHooks('beforeDataLimits');\n }\n determineDataLimits() {}\n afterDataLimits() {\n this._callHooks('afterDataLimits');\n }\n\n //\n beforeBuildTicks() {\n this._callHooks('beforeBuildTicks');\n }\n /**\n\t * @return {object[]} the ticks\n\t */\n buildTicks() {\n return [];\n }\n afterBuildTicks() {\n this._callHooks('afterBuildTicks');\n }\n\n beforeTickToLabelConversion() {\n call(this.options.beforeTickToLabelConversion, [this]);\n }\n /**\n\t * Convert ticks to label strings\n\t * @param {Tick[]} ticks\n\t */\n generateTickLabels(ticks) {\n const tickOpts = this.options.ticks;\n let i, ilen, tick;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n tick = ticks[i];\n tick.label = call(tickOpts.callback, [tick.value, i, ticks], this);\n }\n }\n afterTickToLabelConversion() {\n call(this.options.afterTickToLabelConversion, [this]);\n }\n\n //\n\n beforeCalculateLabelRotation() {\n call(this.options.beforeCalculateLabelRotation, [this]);\n }\n calculateLabelRotation() {\n const options = this.options;\n const tickOpts = options.ticks;\n const numTicks = getTicksLimit(this.ticks.length, options.ticks.maxTicksLimit);\n const minRotation = tickOpts.minRotation || 0;\n const maxRotation = tickOpts.maxRotation;\n let labelRotation = minRotation;\n let tickWidth, maxHeight, maxLabelDiagonal;\n\n if (!this._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !this.isHorizontal()) {\n this.labelRotation = minRotation;\n return;\n }\n\n const labelSizes = this._getLabelSizes();\n const maxLabelWidth = labelSizes.widest.width;\n const maxLabelHeight = labelSizes.highest.height;\n\n // Estimate the width of each grid based on the canvas width, the maximum\n // label width and the number of tick intervals\n const maxWidth = _limitValue(this.chart.width - maxLabelWidth, 0, this.maxWidth);\n tickWidth = options.offset ? this.maxWidth / numTicks : maxWidth / (numTicks - 1);\n\n // Allow 3 pixels x2 padding either side for label readability\n if (maxLabelWidth + 6 > tickWidth) {\n tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));\n maxHeight = this.maxHeight - getTickMarkLength(options.grid)\n\t\t\t\t- tickOpts.padding - getTitleHeight(options.title, this.chart.options.font);\n maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight);\n labelRotation = toDegrees(Math.min(\n Math.asin(_limitValue((labelSizes.highest.height + 6) / tickWidth, -1, 1)),\n Math.asin(_limitValue(maxHeight / maxLabelDiagonal, -1, 1)) - Math.asin(_limitValue(maxLabelHeight / maxLabelDiagonal, -1, 1))\n ));\n labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation));\n }\n\n this.labelRotation = labelRotation;\n }\n afterCalculateLabelRotation() {\n call(this.options.afterCalculateLabelRotation, [this]);\n }\n afterAutoSkip() {}\n\n //\n\n beforeFit() {\n call(this.options.beforeFit, [this]);\n }\n fit() {\n // Reset\n const minSize = {\n width: 0,\n height: 0\n };\n\n const {chart, options: {ticks: tickOpts, title: titleOpts, grid: gridOpts}} = this;\n const display = this._isVisible();\n const isHorizontal = this.isHorizontal();\n\n if (display) {\n const titleHeight = getTitleHeight(titleOpts, chart.options.font);\n if (isHorizontal) {\n minSize.width = this.maxWidth;\n minSize.height = getTickMarkLength(gridOpts) + titleHeight;\n } else {\n minSize.height = this.maxHeight; // fill all the height\n minSize.width = getTickMarkLength(gridOpts) + titleHeight;\n }\n\n // Don't bother fitting the ticks if we are not showing the labels\n if (tickOpts.display && this.ticks.length) {\n const {first, last, widest, highest} = this._getLabelSizes();\n const tickPadding = tickOpts.padding * 2;\n const angleRadians = toRadians(this.labelRotation);\n const cos = Math.cos(angleRadians);\n const sin = Math.sin(angleRadians);\n\n if (isHorizontal) {\n // A horizontal axis is more constrained by the height.\n const labelHeight = tickOpts.mirror ? 0 : sin * widest.width + cos * highest.height;\n minSize.height = Math.min(this.maxHeight, minSize.height + labelHeight + tickPadding);\n } else {\n // A vertical axis is more constrained by the width. Labels are the\n // dominant factor here, so get that length first and account for padding\n const labelWidth = tickOpts.mirror ? 0 : cos * widest.width + sin * highest.height;\n\n minSize.width = Math.min(this.maxWidth, minSize.width + labelWidth + tickPadding);\n }\n this._calculatePadding(first, last, sin, cos);\n }\n }\n\n this._handleMargins();\n\n if (isHorizontal) {\n this.width = this._length = chart.width - this._margins.left - this._margins.right;\n this.height = minSize.height;\n } else {\n this.width = minSize.width;\n this.height = this._length = chart.height - this._margins.top - this._margins.bottom;\n }\n }\n\n _calculatePadding(first, last, sin, cos) {\n const {ticks: {align, padding}, position} = this.options;\n const isRotated = this.labelRotation !== 0;\n const labelsBelowTicks = position !== 'top' && this.axis === 'x';\n\n if (this.isHorizontal()) {\n const offsetLeft = this.getPixelForTick(0) - this.left;\n const offsetRight = this.right - this.getPixelForTick(this.ticks.length - 1);\n let paddingLeft = 0;\n let paddingRight = 0;\n\n // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned\n // which means that the right padding is dominated by the font height\n if (isRotated) {\n if (labelsBelowTicks) {\n paddingLeft = cos * first.width;\n paddingRight = sin * last.height;\n } else {\n paddingLeft = sin * first.height;\n paddingRight = cos * last.width;\n }\n } else if (align === 'start') {\n paddingRight = last.width;\n } else if (align === 'end') {\n paddingLeft = first.width;\n } else if (align !== 'inner') {\n paddingLeft = first.width / 2;\n paddingRight = last.width / 2;\n }\n\n // Adjust padding taking into account changes in offsets\n this.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * this.width / (this.width - offsetLeft), 0);\n this.paddingRight = Math.max((paddingRight - offsetRight + padding) * this.width / (this.width - offsetRight), 0);\n } else {\n let paddingTop = last.height / 2;\n let paddingBottom = first.height / 2;\n\n if (align === 'start') {\n paddingTop = 0;\n paddingBottom = first.height;\n } else if (align === 'end') {\n paddingTop = last.height;\n paddingBottom = 0;\n }\n\n this.paddingTop = paddingTop + padding;\n this.paddingBottom = paddingBottom + padding;\n }\n }\n\n /**\n\t * Handle margins and padding interactions\n\t * @private\n\t */\n _handleMargins() {\n if (this._margins) {\n this._margins.left = Math.max(this.paddingLeft, this._margins.left);\n this._margins.top = Math.max(this.paddingTop, this._margins.top);\n this._margins.right = Math.max(this.paddingRight, this._margins.right);\n this._margins.bottom = Math.max(this.paddingBottom, this._margins.bottom);\n }\n }\n\n afterFit() {\n call(this.options.afterFit, [this]);\n }\n\n // Shared Methods\n /**\n\t * @return {boolean}\n\t */\n isHorizontal() {\n const {axis, position} = this.options;\n return position === 'top' || position === 'bottom' || axis === 'x';\n }\n /**\n\t * @return {boolean}\n\t */\n isFullSize() {\n return this.options.fullSize;\n }\n\n /**\n\t * @param {Tick[]} ticks\n\t * @private\n\t */\n _convertTicksToLabels(ticks) {\n this.beforeTickToLabelConversion();\n\n this.generateTickLabels(ticks);\n\n // Ticks should be skipped when callback returns null or undef, so lets remove those.\n let i, ilen;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n if (isNullOrUndef(ticks[i].label)) {\n ticks.splice(i, 1);\n ilen--;\n i--;\n }\n }\n\n this.afterTickToLabelConversion();\n }\n\n /**\n\t * @return {{ first: object, last: object, widest: object, highest: object, widths: Array, heights: array }}\n\t * @private\n\t */\n _getLabelSizes() {\n let labelSizes = this._labelSizes;\n\n if (!labelSizes) {\n const sampleSize = this.options.ticks.sampleSize;\n let ticks = this.ticks;\n if (sampleSize < ticks.length) {\n ticks = sample(ticks, sampleSize);\n }\n\n this._labelSizes = labelSizes = this._computeLabelSizes(ticks, ticks.length, this.options.ticks.maxTicksLimit);\n }\n\n return labelSizes;\n }\n\n /**\n\t * Returns {width, height, offset} objects for the first, last, widest, highest tick\n\t * labels where offset indicates the anchor point offset from the top in pixels.\n\t * @return {{ first: object, last: object, widest: object, highest: object, widths: Array, heights: array }}\n\t * @private\n\t */\n _computeLabelSizes(ticks, length, maxTicksLimit) {\n const {ctx, _longestTextCache: caches} = this;\n const widths = [];\n const heights = [];\n const increment = Math.floor(length / getTicksLimit(length, maxTicksLimit));\n let widestLabelSize = 0;\n let highestLabelSize = 0;\n let i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel;\n\n for (i = 0; i < length; i += increment) {\n label = ticks[i].label;\n tickFont = this._resolveTickFontOptions(i);\n ctx.font = fontString = tickFont.string;\n cache = caches[fontString] = caches[fontString] || {data: {}, gc: []};\n lineHeight = tickFont.lineHeight;\n width = height = 0;\n // Undefined labels and arrays should not be measured\n if (!isNullOrUndef(label) && !isArray(label)) {\n width = _measureText(ctx, cache.data, cache.gc, width, label);\n height = lineHeight;\n } else if (isArray(label)) {\n // if it is an array let's measure each element\n for (j = 0, jlen = label.length; j < jlen; ++j) {\n nestedLabel = /** @type {string} */ (label[j]);\n // Undefined labels and arrays should not be measured\n if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) {\n width = _measureText(ctx, cache.data, cache.gc, width, nestedLabel);\n height += lineHeight;\n }\n }\n }\n widths.push(width);\n heights.push(height);\n widestLabelSize = Math.max(width, widestLabelSize);\n highestLabelSize = Math.max(height, highestLabelSize);\n }\n garbageCollect(caches, length);\n\n const widest = widths.indexOf(widestLabelSize);\n const highest = heights.indexOf(highestLabelSize);\n\n const valueAt = (idx) => ({width: widths[idx] || 0, height: heights[idx] || 0});\n\n return {\n first: valueAt(0),\n last: valueAt(length - 1),\n widest: valueAt(widest),\n highest: valueAt(highest),\n widths,\n heights,\n };\n }\n\n /**\n\t * Used to get the label to display in the tooltip for the given value\n\t * @param {*} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n return value;\n }\n\n /**\n\t * Returns the location of the given data point. Value can either be an index or a numerical value\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {*} value\n\t * @param {number} [index]\n\t * @return {number}\n\t */\n getPixelForValue(value, index) { // eslint-disable-line no-unused-vars\n return NaN;\n }\n\n /**\n\t * Used to get the data value from a given pixel. This is the inverse of getPixelForValue\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} pixel\n\t * @return {*}\n\t */\n getValueForPixel(pixel) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Returns the location of the tick at the given index\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} index\n\t * @return {number}\n\t */\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n\n /**\n\t * Utility for getting the pixel location of a percentage of scale\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} decimal\n\t * @return {number}\n\t */\n getPixelForDecimal(decimal) {\n if (this._reversePixels) {\n decimal = 1 - decimal;\n }\n\n const pixel = this._startPixel + decimal * this._length;\n return _int16Range(this._alignToPixels ? _alignPixel(this.chart, pixel, 0) : pixel);\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getDecimalForPixel(pixel) {\n const decimal = (pixel - this._startPixel) / this._length;\n return this._reversePixels ? 1 - decimal : decimal;\n }\n\n /**\n\t * Returns the pixel for the minimum chart value\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @return {number}\n\t */\n getBasePixel() {\n return this.getPixelForValue(this.getBaseValue());\n }\n\n /**\n\t * @return {number}\n\t */\n getBaseValue() {\n const {min, max} = this;\n\n return min < 0 && max < 0 ? max :\n min > 0 && max > 0 ? min :\n 0;\n }\n\n /**\n\t * @protected\n\t */\n getContext(index) {\n const ticks = this.ticks || [];\n\n if (index >= 0 && index < ticks.length) {\n const tick = ticks[index];\n return tick.$context ||\n\t\t\t\t(tick.$context = createTickContext(this.getContext(), index, tick));\n }\n return this.$context ||\n\t\t\t(this.$context = createScaleContext(this.chart.getContext(), this));\n }\n\n /**\n\t * @return {number}\n\t * @private\n\t */\n _tickSize() {\n const optionTicks = this.options.ticks;\n\n // Calculate space needed by label in axis direction.\n const rot = toRadians(this.labelRotation);\n const cos = Math.abs(Math.cos(rot));\n const sin = Math.abs(Math.sin(rot));\n\n const labelSizes = this._getLabelSizes();\n const padding = optionTicks.autoSkipPadding || 0;\n const w = labelSizes ? labelSizes.widest.width + padding : 0;\n const h = labelSizes ? labelSizes.highest.height + padding : 0;\n\n // Calculate space needed for 1 tick in axis direction.\n return this.isHorizontal()\n ? h * cos > w * sin ? w / cos : h / sin\n : h * sin < w * cos ? h / cos : w / sin;\n }\n\n /**\n\t * @return {boolean}\n\t * @private\n\t */\n _isVisible() {\n const display = this.options.display;\n\n if (display !== 'auto') {\n return !!display;\n }\n\n return this.getMatchingVisibleMetas().length > 0;\n }\n\n /**\n\t * @private\n\t */\n _computeGridLineItems(chartArea) {\n const axis = this.axis;\n const chart = this.chart;\n const options = this.options;\n const {grid, position, border} = options;\n const offset = grid.offset;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const ticksLength = ticks.length + (offset ? 1 : 0);\n const tl = getTickMarkLength(grid);\n const items = [];\n\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = borderOpts.display ? borderOpts.width : 0;\n const axisHalfWidth = axisWidth / 2;\n const alignBorderValue = function(pixel) {\n return _alignPixel(chart, pixel, axisWidth);\n };\n let borderValue, i, lineValue, alignedLineValue;\n let tx1, ty1, tx2, ty2, x1, y1, x2, y2;\n\n if (position === 'top') {\n borderValue = alignBorderValue(this.bottom);\n ty1 = this.bottom - tl;\n ty2 = borderValue - axisHalfWidth;\n y1 = alignBorderValue(chartArea.top) + axisHalfWidth;\n y2 = chartArea.bottom;\n } else if (position === 'bottom') {\n borderValue = alignBorderValue(this.top);\n y1 = chartArea.top;\n y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;\n ty1 = borderValue + axisHalfWidth;\n ty2 = this.top + tl;\n } else if (position === 'left') {\n borderValue = alignBorderValue(this.right);\n tx1 = this.right - tl;\n tx2 = borderValue - axisHalfWidth;\n x1 = alignBorderValue(chartArea.left) + axisHalfWidth;\n x2 = chartArea.right;\n } else if (position === 'right') {\n borderValue = alignBorderValue(this.left);\n x1 = chartArea.left;\n x2 = alignBorderValue(chartArea.right) - axisHalfWidth;\n tx1 = borderValue + axisHalfWidth;\n tx2 = this.left + tl;\n } else if (axis === 'x') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.top + chartArea.bottom) / 2 + 0.5);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n\n y1 = chartArea.top;\n y2 = chartArea.bottom;\n ty1 = borderValue + axisHalfWidth;\n ty2 = ty1 + tl;\n } else if (axis === 'y') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.left + chartArea.right) / 2);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n\n tx1 = borderValue - axisHalfWidth;\n tx2 = tx1 - tl;\n x1 = chartArea.left;\n x2 = chartArea.right;\n }\n\n const limit = valueOrDefault(options.ticks.maxTicksLimit, ticksLength);\n const step = Math.max(1, Math.ceil(ticksLength / limit));\n for (i = 0; i < ticksLength; i += step) {\n const context = this.getContext(i);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n\n const lineWidth = optsAtIndex.lineWidth;\n const lineColor = optsAtIndex.color;\n const borderDash = optsAtIndexBorder.dash || [];\n const borderDashOffset = optsAtIndexBorder.dashOffset;\n\n const tickWidth = optsAtIndex.tickWidth;\n const tickColor = optsAtIndex.tickColor;\n const tickBorderDash = optsAtIndex.tickBorderDash || [];\n const tickBorderDashOffset = optsAtIndex.tickBorderDashOffset;\n\n lineValue = getPixelForGridLine(this, i, offset);\n\n // Skip if the pixel is out of the range\n if (lineValue === undefined) {\n continue;\n }\n\n alignedLineValue = _alignPixel(chart, lineValue, lineWidth);\n\n if (isHorizontal) {\n tx1 = tx2 = x1 = x2 = alignedLineValue;\n } else {\n ty1 = ty2 = y1 = y2 = alignedLineValue;\n }\n\n items.push({\n tx1,\n ty1,\n tx2,\n ty2,\n x1,\n y1,\n x2,\n y2,\n width: lineWidth,\n color: lineColor,\n borderDash,\n borderDashOffset,\n tickWidth,\n tickColor,\n tickBorderDash,\n tickBorderDashOffset,\n });\n }\n\n this._ticksLength = ticksLength;\n this._borderValue = borderValue;\n\n return items;\n }\n\n /**\n\t * @private\n\t */\n _computeLabelItems(chartArea) {\n const axis = this.axis;\n const options = this.options;\n const {position, ticks: optionTicks} = options;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const {align, crossAlign, padding, mirror} = optionTicks;\n const tl = getTickMarkLength(options.grid);\n const tickAndPadding = tl + padding;\n const hTickAndPadding = mirror ? -padding : tickAndPadding;\n const rotation = -toRadians(this.labelRotation);\n const items = [];\n let i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;\n let textBaseline = 'middle';\n\n if (position === 'top') {\n y = this.bottom - hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'bottom') {\n y = this.top + hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'left') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (position === 'right') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (axis === 'x') {\n if (position === 'center') {\n y = ((chartArea.top + chartArea.bottom) / 2) + tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n y = this.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding;\n }\n textAlign = this._getXAxisLabelAlignment();\n } else if (axis === 'y') {\n if (position === 'center') {\n x = ((chartArea.left + chartArea.right) / 2) - tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n x = this.chart.scales[positionAxisID].getPixelForValue(value);\n }\n textAlign = this._getYAxisLabelAlignment(tl).textAlign;\n }\n\n if (axis === 'y') {\n if (align === 'start') {\n textBaseline = 'top';\n } else if (align === 'end') {\n textBaseline = 'bottom';\n }\n }\n\n const labelSizes = this._getLabelSizes();\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n tick = ticks[i];\n label = tick.label;\n\n const optsAtIndex = optionTicks.setContext(this.getContext(i));\n pixel = this.getPixelForTick(i) + optionTicks.labelOffset;\n font = this._resolveTickFontOptions(i);\n lineHeight = font.lineHeight;\n lineCount = isArray(label) ? label.length : 1;\n const halfCount = lineCount / 2;\n const color = optsAtIndex.color;\n const strokeColor = optsAtIndex.textStrokeColor;\n const strokeWidth = optsAtIndex.textStrokeWidth;\n let tickTextAlign = textAlign;\n\n if (isHorizontal) {\n x = pixel;\n\n if (textAlign === 'inner') {\n if (i === ilen - 1) {\n tickTextAlign = !this.options.reverse ? 'right' : 'left';\n } else if (i === 0) {\n tickTextAlign = !this.options.reverse ? 'left' : 'right';\n } else {\n tickTextAlign = 'center';\n }\n }\n\n if (position === 'top') {\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = -lineCount * lineHeight + lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = -labelSizes.highest.height / 2 - halfCount * lineHeight + lineHeight;\n } else {\n textOffset = -labelSizes.highest.height + lineHeight / 2;\n }\n } else {\n // eslint-disable-next-line no-lonely-if\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = labelSizes.highest.height / 2 - halfCount * lineHeight;\n } else {\n textOffset = labelSizes.highest.height - lineCount * lineHeight;\n }\n }\n if (mirror) {\n textOffset *= -1;\n }\n if (rotation !== 0 && !optsAtIndex.showLabelBackdrop) {\n x += (lineHeight / 2) * Math.sin(rotation);\n }\n } else {\n y = pixel;\n textOffset = (1 - lineCount) * lineHeight / 2;\n }\n\n let backdrop;\n\n if (optsAtIndex.showLabelBackdrop) {\n const labelPadding = toPadding(optsAtIndex.backdropPadding);\n const height = labelSizes.heights[i];\n const width = labelSizes.widths[i];\n\n let top = textOffset - labelPadding.top;\n let left = 0 - labelPadding.left;\n\n switch (textBaseline) {\n case 'middle':\n top -= height / 2;\n break;\n case 'bottom':\n top -= height;\n break;\n default:\n break;\n }\n\n switch (textAlign) {\n case 'center':\n left -= width / 2;\n break;\n case 'right':\n left -= width;\n break;\n case 'inner':\n if (i === ilen - 1) {\n left -= width;\n } else if (i > 0) {\n left -= width / 2;\n }\n break;\n default:\n break;\n }\n\n backdrop = {\n left,\n top,\n width: width + labelPadding.width,\n height: height + labelPadding.height,\n\n color: optsAtIndex.backdropColor,\n };\n }\n\n items.push({\n label,\n font,\n textOffset,\n options: {\n rotation,\n color,\n strokeColor,\n strokeWidth,\n textAlign: tickTextAlign,\n textBaseline,\n translation: [x, y],\n backdrop,\n }\n });\n }\n\n return items;\n }\n\n _getXAxisLabelAlignment() {\n const {position, ticks} = this.options;\n const rotation = -toRadians(this.labelRotation);\n\n if (rotation) {\n return position === 'top' ? 'left' : 'right';\n }\n\n let align = 'center';\n\n if (ticks.align === 'start') {\n align = 'left';\n } else if (ticks.align === 'end') {\n align = 'right';\n } else if (ticks.align === 'inner') {\n align = 'inner';\n }\n\n return align;\n }\n\n _getYAxisLabelAlignment(tl) {\n const {position, ticks: {crossAlign, mirror, padding}} = this.options;\n const labelSizes = this._getLabelSizes();\n const tickAndPadding = tl + padding;\n const widest = labelSizes.widest.width;\n\n let textAlign;\n let x;\n\n if (position === 'left') {\n if (mirror) {\n x = this.right + padding;\n\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += (widest / 2);\n } else {\n textAlign = 'right';\n x += widest;\n }\n } else {\n x = this.right - tickAndPadding;\n\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= (widest / 2);\n } else {\n textAlign = 'left';\n x = this.left;\n }\n }\n } else if (position === 'right') {\n if (mirror) {\n x = this.left + padding;\n\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= (widest / 2);\n } else {\n textAlign = 'left';\n x -= widest;\n }\n } else {\n x = this.left + tickAndPadding;\n\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += widest / 2;\n } else {\n textAlign = 'right';\n x = this.right;\n }\n }\n } else {\n textAlign = 'right';\n }\n\n return {textAlign, x};\n }\n\n /**\n\t * @private\n\t */\n _computeLabelArea() {\n if (this.options.ticks.mirror) {\n return;\n }\n\n const chart = this.chart;\n const position = this.options.position;\n\n if (position === 'left' || position === 'right') {\n return {top: 0, left: this.left, bottom: chart.height, right: this.right};\n } if (position === 'top' || position === 'bottom') {\n return {top: this.top, left: 0, bottom: this.bottom, right: chart.width};\n }\n }\n\n /**\n * @protected\n */\n drawBackground() {\n const {ctx, options: {backgroundColor}, left, top, width, height} = this;\n if (backgroundColor) {\n ctx.save();\n ctx.fillStyle = backgroundColor;\n ctx.fillRect(left, top, width, height);\n ctx.restore();\n }\n }\n\n getLineWidthForValue(value) {\n const grid = this.options.grid;\n if (!this._isVisible() || !grid.display) {\n return 0;\n }\n const ticks = this.ticks;\n const index = ticks.findIndex(t => t.value === value);\n if (index >= 0) {\n const opts = grid.setContext(this.getContext(index));\n return opts.lineWidth;\n }\n return 0;\n }\n\n /**\n\t * @protected\n\t */\n drawGrid(chartArea) {\n const grid = this.options.grid;\n const ctx = this.ctx;\n const items = this._gridLineItems || (this._gridLineItems = this._computeGridLineItems(chartArea));\n let i, ilen;\n\n const drawLine = (p1, p2, style) => {\n if (!style.width || !style.color) {\n return;\n }\n ctx.save();\n ctx.lineWidth = style.width;\n ctx.strokeStyle = style.color;\n ctx.setLineDash(style.borderDash || []);\n ctx.lineDashOffset = style.borderDashOffset;\n\n ctx.beginPath();\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n ctx.stroke();\n ctx.restore();\n };\n\n if (grid.display) {\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n const item = items[i];\n\n if (grid.drawOnChartArea) {\n drawLine(\n {x: item.x1, y: item.y1},\n {x: item.x2, y: item.y2},\n item\n );\n }\n\n if (grid.drawTicks) {\n drawLine(\n {x: item.tx1, y: item.ty1},\n {x: item.tx2, y: item.ty2},\n {\n color: item.tickColor,\n width: item.tickWidth,\n borderDash: item.tickBorderDash,\n borderDashOffset: item.tickBorderDashOffset\n }\n );\n }\n }\n }\n }\n\n /**\n\t * @protected\n\t */\n drawBorder() {\n const {chart, ctx, options: {border, grid}} = this;\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = border.display ? borderOpts.width : 0;\n if (!axisWidth) {\n return;\n }\n const lastLineWidth = grid.setContext(this.getContext(0)).lineWidth;\n const borderValue = this._borderValue;\n let x1, x2, y1, y2;\n\n if (this.isHorizontal()) {\n x1 = _alignPixel(chart, this.left, axisWidth) - axisWidth / 2;\n x2 = _alignPixel(chart, this.right, lastLineWidth) + lastLineWidth / 2;\n y1 = y2 = borderValue;\n } else {\n y1 = _alignPixel(chart, this.top, axisWidth) - axisWidth / 2;\n y2 = _alignPixel(chart, this.bottom, lastLineWidth) + lastLineWidth / 2;\n x1 = x2 = borderValue;\n }\n ctx.save();\n ctx.lineWidth = borderOpts.width;\n ctx.strokeStyle = borderOpts.color;\n\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n\n ctx.restore();\n }\n\n /**\n\t * @protected\n\t */\n drawLabels(chartArea) {\n const optionTicks = this.options.ticks;\n\n if (!optionTicks.display) {\n return;\n }\n\n const ctx = this.ctx;\n\n const area = this._computeLabelArea();\n if (area) {\n clipArea(ctx, area);\n }\n\n const items = this.getLabelItems(chartArea);\n for (const item of items) {\n const renderTextOptions = item.options;\n const tickFont = item.font;\n const label = item.label;\n const y = item.textOffset;\n renderText(ctx, label, 0, y, tickFont, renderTextOptions);\n }\n\n if (area) {\n unclipArea(ctx);\n }\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {\n const {ctx, options: {position, title, reverse}} = this;\n\n if (!title.display) {\n return;\n }\n\n const font = toFont(title.font);\n const padding = toPadding(title.padding);\n const align = title.align;\n let offset = font.lineHeight / 2;\n\n if (position === 'bottom' || position === 'center' || isObject(position)) {\n offset += padding.bottom;\n if (isArray(title.text)) {\n offset += font.lineHeight * (title.text.length - 1);\n }\n } else {\n offset += padding.top;\n }\n\n const {titleX, titleY, maxWidth, rotation} = titleArgs(this, offset, position, align);\n\n renderText(ctx, title.text, 0, 0, font, {\n color: title.color,\n maxWidth,\n rotation,\n textAlign: titleAlign(align, position, reverse),\n textBaseline: 'middle',\n translation: [titleX, titleY],\n });\n }\n\n draw(chartArea) {\n if (!this._isVisible()) {\n return;\n }\n\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawBorder();\n this.drawTitle();\n this.drawLabels(chartArea);\n }\n\n /**\n\t * @return {object[]}\n\t * @private\n\t */\n _layers() {\n const opts = this.options;\n const tz = opts.ticks && opts.ticks.z || 0;\n const gz = valueOrDefault(opts.grid && opts.grid.z, -1);\n const bz = valueOrDefault(opts.border && opts.border.z, 0);\n\n if (!this._isVisible() || this.draw !== Scale.prototype.draw) {\n // backward compatibility: draw has been overridden by custom scale\n return [{\n z: tz,\n draw: (chartArea) => {\n this.draw(chartArea);\n }\n }];\n }\n\n return [{\n z: gz,\n draw: (chartArea) => {\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawTitle();\n }\n }, {\n z: bz,\n draw: () => {\n this.drawBorder();\n }\n }, {\n z: tz,\n draw: (chartArea) => {\n this.drawLabels(chartArea);\n }\n }];\n }\n\n /**\n\t * Returns visible dataset metas that are attached to this scale\n\t * @param {string} [type] - if specified, also filter by dataset type\n\t * @return {object[]}\n\t */\n getMatchingVisibleMetas(type) {\n const metas = this.chart.getSortedVisibleDatasetMetas();\n const axisID = this.axis + 'AxisID';\n const result = [];\n let i, ilen;\n\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n const meta = metas[i];\n if (meta[axisID] === this.id && (!type || meta.type === type)) {\n result.push(meta);\n }\n }\n return result;\n }\n\n /**\n\t * @param {number} index\n\t * @return {object}\n\t * @protected\n \t */\n _resolveTickFontOptions(index) {\n const opts = this.options.ticks.setContext(this.getContext(index));\n return toFont(opts.font);\n }\n\n /**\n * @protected\n */\n _maxDigits() {\n const fontSize = this._resolveTickFontOptions(0).lineHeight;\n return (this.isHorizontal() ? this.width : this.height) / fontSize;\n }\n}\n","import {merge} from '../helpers/index.js';\nimport defaults, {overrides} from './core.defaults.js';\n\n/**\n * @typedef {{id: string, defaults: any, overrides?: any, defaultRoutes: any}} IChartComponent\n */\n\nexport default class TypedRegistry {\n constructor(type, scope, override) {\n this.type = type;\n this.scope = scope;\n this.override = override;\n this.items = Object.create(null);\n }\n\n isForType(type) {\n return Object.prototype.isPrototypeOf.call(this.type.prototype, type.prototype);\n }\n\n /**\n\t * @param {IChartComponent} item\n\t * @returns {string} The scope where items defaults were registered to.\n\t */\n register(item) {\n const proto = Object.getPrototypeOf(item);\n let parentScope;\n\n if (isIChartComponent(proto)) {\n // Make sure the parent is registered and note the scope where its defaults are.\n parentScope = this.register(proto);\n }\n\n const items = this.items;\n const id = item.id;\n const scope = this.scope + '.' + id;\n\n if (!id) {\n throw new Error('class does not have id: ' + item);\n }\n\n if (id in items) {\n // already registered\n return scope;\n }\n\n items[id] = item;\n registerDefaults(item, scope, parentScope);\n if (this.override) {\n defaults.override(item.id, item.overrides);\n }\n\n return scope;\n }\n\n /**\n\t * @param {string} id\n\t * @returns {object?}\n\t */\n get(id) {\n return this.items[id];\n }\n\n /**\n\t * @param {IChartComponent} item\n\t */\n unregister(item) {\n const items = this.items;\n const id = item.id;\n const scope = this.scope;\n\n if (id in items) {\n delete items[id];\n }\n\n if (scope && id in defaults[scope]) {\n delete defaults[scope][id];\n if (this.override) {\n delete overrides[id];\n }\n }\n }\n}\n\nfunction registerDefaults(item, scope, parentScope) {\n // Inherit the parent's defaults and keep existing defaults\n const itemDefaults = merge(Object.create(null), [\n parentScope ? defaults.get(parentScope) : {},\n defaults.get(scope),\n item.defaults\n ]);\n\n defaults.set(scope, itemDefaults);\n\n if (item.defaultRoutes) {\n routeDefaults(scope, item.defaultRoutes);\n }\n\n if (item.descriptors) {\n defaults.describe(scope, item.descriptors);\n }\n}\n\nfunction routeDefaults(scope, routes) {\n Object.keys(routes).forEach(property => {\n const propertyParts = property.split('.');\n const sourceName = propertyParts.pop();\n const sourceScope = [scope].concat(propertyParts).join('.');\n const parts = routes[property].split('.');\n const targetName = parts.pop();\n const targetScope = parts.join('.');\n defaults.route(sourceScope, sourceName, targetScope, targetName);\n });\n}\n\nfunction isIChartComponent(proto) {\n return 'id' in proto && 'defaults' in proto;\n}\n","import DatasetController from './core.datasetController.js';\nimport Element from './core.element.js';\nimport Scale from './core.scale.js';\nimport TypedRegistry from './core.typedRegistry.js';\nimport {each, callback as call, _capitalize} from '../helpers/helpers.core.js';\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is exported for typedoc\n */\nexport class Registry {\n constructor() {\n this.controllers = new TypedRegistry(DatasetController, 'datasets', true);\n this.elements = new TypedRegistry(Element, 'elements');\n this.plugins = new TypedRegistry(Object, 'plugins');\n this.scales = new TypedRegistry(Scale, 'scales');\n // Order is important, Scale has Element in prototype chain,\n // so Scales must be before Elements. Plugins are a fallback, so not listed here.\n this._typedRegistries = [this.controllers, this.scales, this.elements];\n }\n\n /**\n\t * @param {...any} args\n\t */\n add(...args) {\n this._each('register', args);\n }\n\n remove(...args) {\n this._each('unregister', args);\n }\n\n /**\n\t * @param {...typeof DatasetController} args\n\t */\n addControllers(...args) {\n this._each('register', args, this.controllers);\n }\n\n /**\n\t * @param {...typeof Element} args\n\t */\n addElements(...args) {\n this._each('register', args, this.elements);\n }\n\n /**\n\t * @param {...any} args\n\t */\n addPlugins(...args) {\n this._each('register', args, this.plugins);\n }\n\n /**\n\t * @param {...typeof Scale} args\n\t */\n addScales(...args) {\n this._each('register', args, this.scales);\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof DatasetController}\n\t */\n getController(id) {\n return this._get(id, this.controllers, 'controller');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof Element}\n\t */\n getElement(id) {\n return this._get(id, this.elements, 'element');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {object}\n\t */\n getPlugin(id) {\n return this._get(id, this.plugins, 'plugin');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof Scale}\n\t */\n getScale(id) {\n return this._get(id, this.scales, 'scale');\n }\n\n /**\n\t * @param {...typeof DatasetController} args\n\t */\n removeControllers(...args) {\n this._each('unregister', args, this.controllers);\n }\n\n /**\n\t * @param {...typeof Element} args\n\t */\n removeElements(...args) {\n this._each('unregister', args, this.elements);\n }\n\n /**\n\t * @param {...any} args\n\t */\n removePlugins(...args) {\n this._each('unregister', args, this.plugins);\n }\n\n /**\n\t * @param {...typeof Scale} args\n\t */\n removeScales(...args) {\n this._each('unregister', args, this.scales);\n }\n\n /**\n\t * @private\n\t */\n _each(method, args, typedRegistry) {\n [...args].forEach(arg => {\n const reg = typedRegistry || this._getRegistryForType(arg);\n if (typedRegistry || reg.isForType(arg) || (reg === this.plugins && arg.id)) {\n this._exec(method, reg, arg);\n } else {\n // Handle loopable args\n // Use case:\n // import * as plugins from './plugins.js';\n // Chart.register(plugins);\n each(arg, item => {\n // If there are mixed types in the loopable, make sure those are\n // registered in correct registry\n // Use case: (treemap exporting controller, elements etc)\n // import * as treemap from 'chartjs-chart-treemap.js';\n // Chart.register(treemap);\n\n const itemReg = typedRegistry || this._getRegistryForType(item);\n this._exec(method, itemReg, item);\n });\n }\n });\n }\n\n /**\n\t * @private\n\t */\n _exec(method, registry, component) {\n const camelMethod = _capitalize(method);\n call(component['before' + camelMethod], [], component); // beforeRegister / beforeUnregister\n registry[method](component);\n call(component['after' + camelMethod], [], component); // afterRegister / afterUnregister\n }\n\n /**\n\t * @private\n\t */\n _getRegistryForType(type) {\n for (let i = 0; i < this._typedRegistries.length; i++) {\n const reg = this._typedRegistries[i];\n if (reg.isForType(type)) {\n return reg;\n }\n }\n // plugins is the fallback registry\n return this.plugins;\n }\n\n /**\n\t * @private\n\t */\n _get(id, typedRegistry, type) {\n const item = typedRegistry.get(id);\n if (item === undefined) {\n throw new Error('\"' + id + '\" is not a registered ' + type + '.');\n }\n return item;\n }\n\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Registry();\n","import registry from './core.registry.js';\nimport {callback as callCallback, isNullOrUndef, valueOrDefault} from '../helpers/helpers.core.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../plugins/plugin.tooltip.js').default } Tooltip\n */\n\n/**\n * @callback filterCallback\n * @param {{plugin: object, options: object}} value\n * @param {number} [index]\n * @param {array} [array]\n * @param {object} [thisArg]\n * @return {boolean}\n */\n\n\nexport default class PluginService {\n constructor() {\n this._init = undefined;\n }\n\n /**\n\t * Calls enabled plugins for `chart` on the specified hook and with the given args.\n\t * This method immediately returns as soon as a plugin explicitly returns false. The\n\t * returned value can be used, for instance, to interrupt the current action.\n\t * @param {Chart} chart - The chart instance for which plugins should be called.\n\t * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n\t * @param {object} [args] - Extra arguments to apply to the hook call.\n * @param {filterCallback} [filter] - Filtering function for limiting which plugins are notified\n\t * @returns {boolean} false if any of the plugins return false, else returns true.\n\t */\n notify(chart, hook, args, filter) {\n if (hook === 'beforeInit') {\n this._init = this._createDescriptors(chart, true);\n this._notify(this._init, chart, 'install');\n }\n\n if (this._init === undefined) { // Do not trigger events before install\n return;\n }\n\n const descriptors = filter ? this._descriptors(chart).filter(filter) : this._descriptors(chart);\n const result = this._notify(descriptors, chart, hook, args);\n\n if (hook === 'afterDestroy') {\n this._notify(descriptors, chart, 'stop');\n this._notify(this._init, chart, 'uninstall');\n this._init = undefined; // Do not trigger events after uninstall\n }\n return result;\n }\n\n /**\n\t * @private\n\t */\n _notify(descriptors, chart, hook, args) {\n args = args || {};\n for (const descriptor of descriptors) {\n const plugin = descriptor.plugin;\n const method = plugin[hook];\n const params = [chart, args, descriptor.options];\n if (callCallback(method, params, plugin) === false && args.cancelable) {\n return false;\n }\n }\n\n return true;\n }\n\n invalidate() {\n // When plugins are registered, there is the possibility of a double\n // invalidate situation. In this case, we only want to invalidate once.\n // If we invalidate multiple times, the `_oldCache` is lost and all of the\n // plugins are restarted without being correctly stopped.\n // See https://github.com/chartjs/Chart.js/issues/8147\n if (!isNullOrUndef(this._cache)) {\n this._oldCache = this._cache;\n this._cache = undefined;\n }\n }\n\n /**\n\t * @param {Chart} chart\n\t * @private\n\t */\n _descriptors(chart) {\n if (this._cache) {\n return this._cache;\n }\n\n const descriptors = this._cache = this._createDescriptors(chart);\n\n this._notifyStateChanges(chart);\n\n return descriptors;\n }\n\n _createDescriptors(chart, all) {\n const config = chart && chart.config;\n const options = valueOrDefault(config.options && config.options.plugins, {});\n const plugins = allPlugins(config);\n // options === false => all plugins are disabled\n return options === false && !all ? [] : createDescriptors(chart, plugins, options, all);\n }\n\n /**\n\t * @param {Chart} chart\n\t * @private\n\t */\n _notifyStateChanges(chart) {\n const previousDescriptors = this._oldCache || [];\n const descriptors = this._cache;\n const diff = (a, b) => a.filter(x => !b.some(y => x.plugin.id === y.plugin.id));\n this._notify(diff(previousDescriptors, descriptors), chart, 'stop');\n this._notify(diff(descriptors, previousDescriptors), chart, 'start');\n }\n}\n\n/**\n * @param {import('./core.config.js').default} config\n */\nfunction allPlugins(config) {\n const localIds = {};\n const plugins = [];\n const keys = Object.keys(registry.plugins.items);\n for (let i = 0; i < keys.length; i++) {\n plugins.push(registry.getPlugin(keys[i]));\n }\n\n const local = config.plugins || [];\n for (let i = 0; i < local.length; i++) {\n const plugin = local[i];\n\n if (plugins.indexOf(plugin) === -1) {\n plugins.push(plugin);\n localIds[plugin.id] = true;\n }\n }\n\n return {plugins, localIds};\n}\n\nfunction getOpts(options, all) {\n if (!all && options === false) {\n return null;\n }\n if (options === true) {\n return {};\n }\n return options;\n}\n\nfunction createDescriptors(chart, {plugins, localIds}, options, all) {\n const result = [];\n const context = chart.getContext();\n\n for (const plugin of plugins) {\n const id = plugin.id;\n const opts = getOpts(options[id], all);\n if (opts === null) {\n continue;\n }\n result.push({\n plugin,\n options: pluginOpts(chart.config, {plugin, local: localIds[id]}, opts, context)\n });\n }\n\n return result;\n}\n\nfunction pluginOpts(config, {plugin, local}, opts, context) {\n const keys = config.pluginScopeKeys(plugin);\n const scopes = config.getOptionScopes(opts, keys);\n if (local && plugin.defaults) {\n // make sure plugin defaults are in scopes for local (not registered) plugins\n scopes.push(plugin.defaults);\n }\n return config.createResolver(scopes, context, [''], {\n // These are just defaults that plugins can override\n scriptable: false,\n indexable: false,\n allKeys: true\n });\n}\n","import defaults, {overrides, descriptors} from './core.defaults.js';\nimport {mergeIf, resolveObjectKey, isArray, isFunction, valueOrDefault, isObject} from '../helpers/helpers.core.js';\nimport {_attachContext, _createResolver, _descriptors} from '../helpers/helpers.config.js';\n\nexport function getIndexAxis(type, options) {\n const datasetDefaults = defaults.datasets[type] || {};\n const datasetOptions = (options.datasets || {})[type] || {};\n return datasetOptions.indexAxis || options.indexAxis || datasetDefaults.indexAxis || 'x';\n}\n\nfunction getAxisFromDefaultScaleID(id, indexAxis) {\n let axis = id;\n if (id === '_index_') {\n axis = indexAxis;\n } else if (id === '_value_') {\n axis = indexAxis === 'x' ? 'y' : 'x';\n }\n return axis;\n}\n\nfunction getDefaultScaleIDFromAxis(axis, indexAxis) {\n return axis === indexAxis ? '_index_' : '_value_';\n}\n\nfunction idMatchesAxis(id) {\n if (id === 'x' || id === 'y' || id === 'r') {\n return id;\n }\n}\n\nfunction axisFromPosition(position) {\n if (position === 'top' || position === 'bottom') {\n return 'x';\n }\n if (position === 'left' || position === 'right') {\n return 'y';\n }\n}\n\nexport function determineAxis(id, ...scaleOptions) {\n if (idMatchesAxis(id)) {\n return id;\n }\n for (const opts of scaleOptions) {\n const axis = opts.axis\n || axisFromPosition(opts.position)\n || id.length > 1 && idMatchesAxis(id[0].toLowerCase());\n if (axis) {\n return axis;\n }\n }\n throw new Error(`Cannot determine type of '${id}' axis. Please provide 'axis' or 'position' option.`);\n}\n\nfunction getAxisFromDataset(id, axis, dataset) {\n if (dataset[axis + 'AxisID'] === id) {\n return {axis};\n }\n}\n\nfunction retrieveAxisFromDatasets(id, config) {\n if (config.data && config.data.datasets) {\n const boundDs = config.data.datasets.filter((d) => d.xAxisID === id || d.yAxisID === id);\n if (boundDs.length) {\n return getAxisFromDataset(id, 'x', boundDs[0]) || getAxisFromDataset(id, 'y', boundDs[0]);\n }\n }\n return {};\n}\n\nfunction mergeScaleConfig(config, options) {\n const chartDefaults = overrides[config.type] || {scales: {}};\n const configScales = options.scales || {};\n const chartIndexAxis = getIndexAxis(config.type, options);\n const scales = Object.create(null);\n\n // First figure out first scale id's per axis.\n Object.keys(configScales).forEach(id => {\n const scaleConf = configScales[id];\n if (!isObject(scaleConf)) {\n return console.error(`Invalid scale configuration for scale: ${id}`);\n }\n if (scaleConf._proxy) {\n return console.warn(`Ignoring resolver passed as options for scale: ${id}`);\n }\n const axis = determineAxis(id, scaleConf, retrieveAxisFromDatasets(id, config), defaults.scales[scaleConf.type]);\n const defaultId = getDefaultScaleIDFromAxis(axis, chartIndexAxis);\n const defaultScaleOptions = chartDefaults.scales || {};\n scales[id] = mergeIf(Object.create(null), [{axis}, scaleConf, defaultScaleOptions[axis], defaultScaleOptions[defaultId]]);\n });\n\n // Then merge dataset defaults to scale configs\n config.data.datasets.forEach(dataset => {\n const type = dataset.type || config.type;\n const indexAxis = dataset.indexAxis || getIndexAxis(type, options);\n const datasetDefaults = overrides[type] || {};\n const defaultScaleOptions = datasetDefaults.scales || {};\n Object.keys(defaultScaleOptions).forEach(defaultID => {\n const axis = getAxisFromDefaultScaleID(defaultID, indexAxis);\n const id = dataset[axis + 'AxisID'] || axis;\n scales[id] = scales[id] || Object.create(null);\n mergeIf(scales[id], [{axis}, configScales[id], defaultScaleOptions[defaultID]]);\n });\n });\n\n // apply scale defaults, if not overridden by dataset defaults\n Object.keys(scales).forEach(key => {\n const scale = scales[key];\n mergeIf(scale, [defaults.scales[scale.type], defaults.scale]);\n });\n\n return scales;\n}\n\nfunction initOptions(config) {\n const options = config.options || (config.options = {});\n\n options.plugins = valueOrDefault(options.plugins, {});\n options.scales = mergeScaleConfig(config, options);\n}\n\nfunction initData(data) {\n data = data || {};\n data.datasets = data.datasets || [];\n data.labels = data.labels || [];\n return data;\n}\n\nfunction initConfig(config) {\n config = config || {};\n config.data = initData(config.data);\n\n initOptions(config);\n\n return config;\n}\n\nconst keyCache = new Map();\nconst keysCached = new Set();\n\nfunction cachedKeys(cacheKey, generate) {\n let keys = keyCache.get(cacheKey);\n if (!keys) {\n keys = generate();\n keyCache.set(cacheKey, keys);\n keysCached.add(keys);\n }\n return keys;\n}\n\nconst addIfFound = (set, obj, key) => {\n const opts = resolveObjectKey(obj, key);\n if (opts !== undefined) {\n set.add(opts);\n }\n};\n\nexport default class Config {\n constructor(config) {\n this._config = initConfig(config);\n this._scopeCache = new Map();\n this._resolverCache = new Map();\n }\n\n get platform() {\n return this._config.platform;\n }\n\n get type() {\n return this._config.type;\n }\n\n set type(type) {\n this._config.type = type;\n }\n\n get data() {\n return this._config.data;\n }\n\n set data(data) {\n this._config.data = initData(data);\n }\n\n get options() {\n return this._config.options;\n }\n\n set options(options) {\n this._config.options = options;\n }\n\n get plugins() {\n return this._config.plugins;\n }\n\n update() {\n const config = this._config;\n this.clearCache();\n initOptions(config);\n }\n\n clearCache() {\n this._scopeCache.clear();\n this._resolverCache.clear();\n }\n\n /**\n * Returns the option scope keys for resolving dataset options.\n * These keys do not include the dataset itself, because it is not under options.\n * @param {string} datasetType\n * @return {string[][]}\n */\n datasetScopeKeys(datasetType) {\n return cachedKeys(datasetType,\n () => [[\n `datasets.${datasetType}`,\n ''\n ]]);\n }\n\n /**\n * Returns the option scope keys for resolving dataset animation options.\n * These keys do not include the dataset itself, because it is not under options.\n * @param {string} datasetType\n * @param {string} transition\n * @return {string[][]}\n */\n datasetAnimationScopeKeys(datasetType, transition) {\n return cachedKeys(`${datasetType}.transition.${transition}`,\n () => [\n [\n `datasets.${datasetType}.transitions.${transition}`,\n `transitions.${transition}`,\n ],\n // The following are used for looking up the `animations` and `animation` keys\n [\n `datasets.${datasetType}`,\n ''\n ]\n ]);\n }\n\n /**\n * Returns the options scope keys for resolving element options that belong\n * to an dataset. These keys do not include the dataset itself, because it\n * is not under options.\n * @param {string} datasetType\n * @param {string} elementType\n * @return {string[][]}\n */\n datasetElementScopeKeys(datasetType, elementType) {\n return cachedKeys(`${datasetType}-${elementType}`,\n () => [[\n `datasets.${datasetType}.elements.${elementType}`,\n `datasets.${datasetType}`,\n `elements.${elementType}`,\n ''\n ]]);\n }\n\n /**\n * Returns the options scope keys for resolving plugin options.\n * @param {{id: string, additionalOptionScopes?: string[]}} plugin\n * @return {string[][]}\n */\n pluginScopeKeys(plugin) {\n const id = plugin.id;\n const type = this.type;\n return cachedKeys(`${type}-plugin-${id}`,\n () => [[\n `plugins.${id}`,\n ...plugin.additionalOptionScopes || [],\n ]]);\n }\n\n /**\n * @private\n */\n _cachedScopes(mainScope, resetCache) {\n const _scopeCache = this._scopeCache;\n let cache = _scopeCache.get(mainScope);\n if (!cache || resetCache) {\n cache = new Map();\n _scopeCache.set(mainScope, cache);\n }\n return cache;\n }\n\n /**\n * Resolves the objects from options and defaults for option value resolution.\n * @param {object} mainScope - The main scope object for options\n * @param {string[][]} keyLists - The arrays of keys in resolution order\n * @param {boolean} [resetCache] - reset the cache for this mainScope\n */\n getOptionScopes(mainScope, keyLists, resetCache) {\n const {options, type} = this;\n const cache = this._cachedScopes(mainScope, resetCache);\n const cached = cache.get(keyLists);\n if (cached) {\n return cached;\n }\n\n const scopes = new Set();\n\n keyLists.forEach(keys => {\n if (mainScope) {\n scopes.add(mainScope);\n keys.forEach(key => addIfFound(scopes, mainScope, key));\n }\n keys.forEach(key => addIfFound(scopes, options, key));\n keys.forEach(key => addIfFound(scopes, overrides[type] || {}, key));\n keys.forEach(key => addIfFound(scopes, defaults, key));\n keys.forEach(key => addIfFound(scopes, descriptors, key));\n });\n\n const array = Array.from(scopes);\n if (array.length === 0) {\n array.push(Object.create(null));\n }\n if (keysCached.has(keyLists)) {\n cache.set(keyLists, array);\n }\n return array;\n }\n\n /**\n * Returns the option scopes for resolving chart options\n * @return {object[]}\n */\n chartOptionScopes() {\n const {options, type} = this;\n\n return [\n options,\n overrides[type] || {},\n defaults.datasets[type] || {}, // https://github.com/chartjs/Chart.js/issues/8531\n {type},\n defaults,\n descriptors\n ];\n }\n\n /**\n * @param {object[]} scopes\n * @param {string[]} names\n * @param {function|object} context\n * @param {string[]} [prefixes]\n * @return {object}\n */\n resolveNamedOptions(scopes, names, context, prefixes = ['']) {\n const result = {$shared: true};\n const {resolver, subPrefixes} = getResolver(this._resolverCache, scopes, prefixes);\n let options = resolver;\n if (needContext(resolver, names)) {\n result.$shared = false;\n context = isFunction(context) ? context() : context;\n // subResolver is passed to scriptable options. It should not resolve to hover options.\n const subResolver = this.createResolver(scopes, context, subPrefixes);\n options = _attachContext(resolver, context, subResolver);\n }\n\n for (const prop of names) {\n result[prop] = options[prop];\n }\n return result;\n }\n\n /**\n * @param {object[]} scopes\n * @param {object} [context]\n * @param {string[]} [prefixes]\n * @param {{scriptable: boolean, indexable: boolean, allKeys?: boolean}} [descriptorDefaults]\n */\n createResolver(scopes, context, prefixes = [''], descriptorDefaults) {\n const {resolver} = getResolver(this._resolverCache, scopes, prefixes);\n return isObject(context)\n ? _attachContext(resolver, context, undefined, descriptorDefaults)\n : resolver;\n }\n}\n\nfunction getResolver(resolverCache, scopes, prefixes) {\n let cache = resolverCache.get(scopes);\n if (!cache) {\n cache = new Map();\n resolverCache.set(scopes, cache);\n }\n const cacheKey = prefixes.join();\n let cached = cache.get(cacheKey);\n if (!cached) {\n const resolver = _createResolver(scopes, prefixes);\n cached = {\n resolver,\n subPrefixes: prefixes.filter(p => !p.toLowerCase().includes('hover'))\n };\n cache.set(cacheKey, cached);\n }\n return cached;\n}\n\nconst hasFunction = value => isObject(value)\n && Object.getOwnPropertyNames(value).some((key) => isFunction(value[key]));\n\nfunction needContext(proxy, names) {\n const {isScriptable, isIndexable} = _descriptors(proxy);\n\n for (const prop of names) {\n const scriptable = isScriptable(prop);\n const indexable = isIndexable(prop);\n const value = (indexable || scriptable) && proxy[prop];\n if ((scriptable && (isFunction(value) || hasFunction(value)))\n || (indexable && isArray(value))) {\n return true;\n }\n }\n return false;\n}\n","import animator from './core.animator.js';\nimport defaults, {overrides} from './core.defaults.js';\nimport Interaction from './core.interaction.js';\nimport layouts from './core.layouts.js';\nimport {_detectPlatform} from '../platform/index.js';\nimport PluginService from './core.plugins.js';\nimport registry from './core.registry.js';\nimport Config, {determineAxis, getIndexAxis} from './core.config.js';\nimport {each, callback as callCallback, uid, valueOrDefault, _elementsEqual, isNullOrUndef, setsEqual, defined, isFunction, _isClickEvent} from '../helpers/helpers.core.js';\nimport {clearCanvas, clipArea, createContext, unclipArea, _isPointInArea, _isDomSupported, retinaScale, getDatasetClipArea} from '../helpers/index.js';\n// @ts-ignore\nimport {version} from '../../package.json';\nimport {debounce} from '../helpers/helpers.extras.js';\n\n/**\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../types/index.js').Point } Point\n */\n\nconst KNOWN_POSITIONS = ['top', 'bottom', 'left', 'right', 'chartArea'];\nfunction positionIsHorizontal(position, axis) {\n return position === 'top' || position === 'bottom' || (KNOWN_POSITIONS.indexOf(position) === -1 && axis === 'x');\n}\n\nfunction compare2Level(l1, l2) {\n return function(a, b) {\n return a[l1] === b[l1]\n ? a[l2] - b[l2]\n : a[l1] - b[l1];\n };\n}\n\nfunction onAnimationsComplete(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n\n chart.notifyPlugins('afterRender');\n callCallback(animationOptions && animationOptions.onComplete, [context], chart);\n}\n\nfunction onAnimationProgress(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n callCallback(animationOptions && animationOptions.onProgress, [context], chart);\n}\n\n/**\n * Chart.js can take a string id of a canvas element, a 2d context, or a canvas element itself.\n * Attempt to unwrap the item passed into the chart constructor so that it is a canvas element (if possible).\n */\nfunction getCanvas(item) {\n if (_isDomSupported() && typeof item === 'string') {\n item = document.getElementById(item);\n } else if (item && item.length) {\n // Support for array based queries (such as jQuery)\n item = item[0];\n }\n\n if (item && item.canvas) {\n // Support for any object associated to a canvas (including a context2d)\n item = item.canvas;\n }\n return item;\n}\n\nconst instances = {};\nconst getChart = (key) => {\n const canvas = getCanvas(key);\n return Object.values(instances).filter((c) => c.canvas === canvas).pop();\n};\n\nfunction moveNumericKeys(obj, start, move) {\n const keys = Object.keys(obj);\n for (const key of keys) {\n const intKey = +key;\n if (intKey >= start) {\n const value = obj[key];\n delete obj[key];\n if (move > 0 || intKey > start) {\n obj[intKey + move] = value;\n }\n }\n }\n}\n\n/**\n * @param {ChartEvent} e\n * @param {ChartEvent|null} lastEvent\n * @param {boolean} inChartArea\n * @param {boolean} isClick\n * @returns {ChartEvent|null}\n */\nfunction determineLastEvent(e, lastEvent, inChartArea, isClick) {\n if (!inChartArea || e.type === 'mouseout') {\n return null;\n }\n if (isClick) {\n return lastEvent;\n }\n return e;\n}\n\nclass Chart {\n\n static defaults = defaults;\n static instances = instances;\n static overrides = overrides;\n static registry = registry;\n static version = version;\n static getChart = getChart;\n\n static register(...items) {\n registry.add(...items);\n invalidatePlugins();\n }\n\n static unregister(...items) {\n registry.remove(...items);\n invalidatePlugins();\n }\n\n // eslint-disable-next-line max-statements\n constructor(item, userConfig) {\n const config = this.config = new Config(userConfig);\n const initialCanvas = getCanvas(item);\n const existingChart = getChart(initialCanvas);\n if (existingChart) {\n throw new Error(\n 'Canvas is already in use. Chart with ID \\'' + existingChart.id + '\\'' +\n\t\t\t\t' must be destroyed before the canvas with ID \\'' + existingChart.canvas.id + '\\' can be reused.'\n );\n }\n\n const options = config.createResolver(config.chartOptionScopes(), this.getContext());\n\n this.platform = new (config.platform || _detectPlatform(initialCanvas))();\n this.platform.updateConfig(config);\n\n const context = this.platform.acquireContext(initialCanvas, options.aspectRatio);\n const canvas = context && context.canvas;\n const height = canvas && canvas.height;\n const width = canvas && canvas.width;\n\n this.id = uid();\n this.ctx = context;\n this.canvas = canvas;\n this.width = width;\n this.height = height;\n this._options = options;\n // Store the previously used aspect ratio to determine if a resize\n // is needed during updates. Do this after _options is set since\n // aspectRatio uses a getter\n this._aspectRatio = this.aspectRatio;\n this._layers = [];\n this._metasets = [];\n this._stacks = undefined;\n this.boxes = [];\n this.currentDevicePixelRatio = undefined;\n this.chartArea = undefined;\n this._active = [];\n this._lastEvent = undefined;\n this._listeners = {};\n /** @type {?{attach?: function, detach?: function, resize?: function}} */\n this._responsiveListeners = undefined;\n this._sortedMetasets = [];\n this.scales = {};\n this._plugins = new PluginService();\n this.$proxies = {};\n this._hiddenIndices = {};\n this.attached = false;\n this._animationsDisabled = undefined;\n this.$context = undefined;\n this._doResize = debounce(mode => this.update(mode), options.resizeDelay || 0);\n this._dataChanges = [];\n\n // Add the chart instance to the global namespace\n instances[this.id] = this;\n\n if (!context || !canvas) {\n // The given item is not a compatible context2d element, let's return before finalizing\n // the chart initialization but after setting basic chart / controller properties that\n // can help to figure out that the chart is not valid (e.g chart.canvas !== null);\n // https://github.com/chartjs/Chart.js/issues/2807\n console.error(\"Failed to create chart: can't acquire context from the given item\");\n return;\n }\n\n animator.listen(this, 'complete', onAnimationsComplete);\n animator.listen(this, 'progress', onAnimationProgress);\n\n this._initialize();\n if (this.attached) {\n this.update();\n }\n }\n\n get aspectRatio() {\n const {options: {aspectRatio, maintainAspectRatio}, width, height, _aspectRatio} = this;\n if (!isNullOrUndef(aspectRatio)) {\n // If aspectRatio is defined in options, use that.\n return aspectRatio;\n }\n\n if (maintainAspectRatio && _aspectRatio) {\n // If maintainAspectRatio is truthly and we had previously determined _aspectRatio, use that\n return _aspectRatio;\n }\n\n // Calculate\n return height ? width / height : null;\n }\n\n get data() {\n return this.config.data;\n }\n\n set data(data) {\n this.config.data = data;\n }\n\n get options() {\n return this._options;\n }\n\n set options(options) {\n this.config.options = options;\n }\n\n get registry() {\n return registry;\n }\n\n /**\n\t * @private\n\t */\n _initialize() {\n // Before init plugin notification\n this.notifyPlugins('beforeInit');\n\n if (this.options.responsive) {\n this.resize();\n } else {\n retinaScale(this, this.options.devicePixelRatio);\n }\n\n this.bindEvents();\n\n // After init plugin notification\n this.notifyPlugins('afterInit');\n\n return this;\n }\n\n clear() {\n clearCanvas(this.canvas, this.ctx);\n return this;\n }\n\n stop() {\n animator.stop(this);\n return this;\n }\n\n /**\n\t * Resize the chart to its container or to explicit dimensions.\n\t * @param {number} [width]\n\t * @param {number} [height]\n\t */\n resize(width, height) {\n if (!animator.running(this)) {\n this._resize(width, height);\n } else {\n this._resizeBeforeDraw = {width, height};\n }\n }\n\n _resize(width, height) {\n const options = this.options;\n const canvas = this.canvas;\n const aspectRatio = options.maintainAspectRatio && this.aspectRatio;\n const newSize = this.platform.getMaximumSize(canvas, width, height, aspectRatio);\n const newRatio = options.devicePixelRatio || this.platform.getDevicePixelRatio();\n const mode = this.width ? 'resize' : 'attach';\n\n this.width = newSize.width;\n this.height = newSize.height;\n this._aspectRatio = this.aspectRatio;\n if (!retinaScale(this, newRatio, true)) {\n return;\n }\n\n this.notifyPlugins('resize', {size: newSize});\n\n callCallback(options.onResize, [this, newSize], this);\n\n if (this.attached) {\n if (this._doResize(mode)) {\n // The resize update is delayed, only draw without updating.\n this.render();\n }\n }\n }\n\n ensureScalesHaveIDs() {\n const options = this.options;\n const scalesOptions = options.scales || {};\n\n each(scalesOptions, (axisOptions, axisID) => {\n axisOptions.id = axisID;\n });\n }\n\n /**\n\t * Builds a map of scale ID to scale object for future lookup.\n\t */\n buildOrUpdateScales() {\n const options = this.options;\n const scaleOpts = options.scales;\n const scales = this.scales;\n const updated = Object.keys(scales).reduce((obj, id) => {\n obj[id] = false;\n return obj;\n }, {});\n let items = [];\n\n if (scaleOpts) {\n items = items.concat(\n Object.keys(scaleOpts).map((id) => {\n const scaleOptions = scaleOpts[id];\n const axis = determineAxis(id, scaleOptions);\n const isRadial = axis === 'r';\n const isHorizontal = axis === 'x';\n return {\n options: scaleOptions,\n dposition: isRadial ? 'chartArea' : isHorizontal ? 'bottom' : 'left',\n dtype: isRadial ? 'radialLinear' : isHorizontal ? 'category' : 'linear'\n };\n })\n );\n }\n\n each(items, (item) => {\n const scaleOptions = item.options;\n const id = scaleOptions.id;\n const axis = determineAxis(id, scaleOptions);\n const scaleType = valueOrDefault(scaleOptions.type, item.dtype);\n\n if (scaleOptions.position === undefined || positionIsHorizontal(scaleOptions.position, axis) !== positionIsHorizontal(item.dposition)) {\n scaleOptions.position = item.dposition;\n }\n\n updated[id] = true;\n let scale = null;\n if (id in scales && scales[id].type === scaleType) {\n scale = scales[id];\n } else {\n const scaleClass = registry.getScale(scaleType);\n scale = new scaleClass({\n id,\n type: scaleType,\n ctx: this.ctx,\n chart: this\n });\n scales[scale.id] = scale;\n }\n\n scale.init(scaleOptions, options);\n });\n // clear up discarded scales\n each(updated, (hasUpdated, id) => {\n if (!hasUpdated) {\n delete scales[id];\n }\n });\n\n each(scales, (scale) => {\n layouts.configure(this, scale, scale.options);\n layouts.addBox(this, scale);\n });\n }\n\n /**\n\t * @private\n\t */\n _updateMetasets() {\n const metasets = this._metasets;\n const numData = this.data.datasets.length;\n const numMeta = metasets.length;\n\n metasets.sort((a, b) => a.index - b.index);\n if (numMeta > numData) {\n for (let i = numData; i < numMeta; ++i) {\n this._destroyDatasetMeta(i);\n }\n metasets.splice(numData, numMeta - numData);\n }\n this._sortedMetasets = metasets.slice(0).sort(compare2Level('order', 'index'));\n }\n\n /**\n\t * @private\n\t */\n _removeUnreferencedMetasets() {\n const {_metasets: metasets, data: {datasets}} = this;\n if (metasets.length > datasets.length) {\n delete this._stacks;\n }\n metasets.forEach((meta, index) => {\n if (datasets.filter(x => x === meta._dataset).length === 0) {\n this._destroyDatasetMeta(index);\n }\n });\n }\n\n buildOrUpdateControllers() {\n const newControllers = [];\n const datasets = this.data.datasets;\n let i, ilen;\n\n this._removeUnreferencedMetasets();\n\n for (i = 0, ilen = datasets.length; i < ilen; i++) {\n const dataset = datasets[i];\n let meta = this.getDatasetMeta(i);\n const type = dataset.type || this.config.type;\n\n if (meta.type && meta.type !== type) {\n this._destroyDatasetMeta(i);\n meta = this.getDatasetMeta(i);\n }\n meta.type = type;\n meta.indexAxis = dataset.indexAxis || getIndexAxis(type, this.options);\n meta.order = dataset.order || 0;\n meta.index = i;\n meta.label = '' + dataset.label;\n meta.visible = this.isDatasetVisible(i);\n\n if (meta.controller) {\n meta.controller.updateIndex(i);\n meta.controller.linkScales();\n } else {\n const ControllerClass = registry.getController(type);\n const {datasetElementType, dataElementType} = defaults.datasets[type];\n Object.assign(ControllerClass, {\n dataElementType: registry.getElement(dataElementType),\n datasetElementType: datasetElementType && registry.getElement(datasetElementType)\n });\n meta.controller = new ControllerClass(this, i);\n newControllers.push(meta.controller);\n }\n }\n\n this._updateMetasets();\n return newControllers;\n }\n\n /**\n\t * Reset the elements of all datasets\n\t * @private\n\t */\n _resetElements() {\n each(this.data.datasets, (dataset, datasetIndex) => {\n this.getDatasetMeta(datasetIndex).controller.reset();\n }, this);\n }\n\n /**\n\t* Resets the chart back to its state before the initial animation\n\t*/\n reset() {\n this._resetElements();\n this.notifyPlugins('reset');\n }\n\n update(mode) {\n const config = this.config;\n\n config.update();\n const options = this._options = config.createResolver(config.chartOptionScopes(), this.getContext());\n const animsDisabled = this._animationsDisabled = !options.animation;\n\n this._updateScales();\n this._checkEventBindings();\n this._updateHiddenIndices();\n\n // plugins options references might have change, let's invalidate the cache\n // https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167\n this._plugins.invalidate();\n\n if (this.notifyPlugins('beforeUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n\n // Make sure dataset controllers are updated and new controllers are reset\n const newControllers = this.buildOrUpdateControllers();\n\n this.notifyPlugins('beforeElementsUpdate');\n\n // Make sure all dataset controllers have correct meta data counts\n let minPadding = 0;\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; i++) {\n const {controller} = this.getDatasetMeta(i);\n const reset = !animsDisabled && newControllers.indexOf(controller) === -1;\n // New controllers will be reset after the layout pass, so we only want to modify\n // elements added to new datasets\n controller.buildOrUpdateElements(reset);\n minPadding = Math.max(+controller.getMaxOverflow(), minPadding);\n }\n minPadding = this._minPadding = options.layout.autoPadding ? minPadding : 0;\n this._updateLayout(minPadding);\n\n // Only reset the controllers if we have animations\n if (!animsDisabled) {\n // Can only reset the new controllers after the scales have been updated\n // Reset is done to get the starting point for the initial animation\n each(newControllers, (controller) => {\n controller.reset();\n });\n }\n\n this._updateDatasets(mode);\n\n // Do this before render so that any plugins that need final scale updates can use it\n this.notifyPlugins('afterUpdate', {mode});\n\n this._layers.sort(compare2Level('z', '_idx'));\n\n // Replay last event from before update, or set hover styles on active elements\n const {_active, _lastEvent} = this;\n if (_lastEvent) {\n this._eventHandler(_lastEvent, true);\n } else if (_active.length) {\n this._updateHoverStyles(_active, _active, true);\n }\n\n this.render();\n }\n\n /**\n * @private\n */\n _updateScales() {\n each(this.scales, (scale) => {\n layouts.removeBox(this, scale);\n });\n\n this.ensureScalesHaveIDs();\n this.buildOrUpdateScales();\n }\n\n /**\n * @private\n */\n _checkEventBindings() {\n const options = this.options;\n const existingEvents = new Set(Object.keys(this._listeners));\n const newEvents = new Set(options.events);\n\n if (!setsEqual(existingEvents, newEvents) || !!this._responsiveListeners !== options.responsive) {\n // The configured events have changed. Rebind.\n this.unbindEvents();\n this.bindEvents();\n }\n }\n\n /**\n * @private\n */\n _updateHiddenIndices() {\n const {_hiddenIndices} = this;\n const changes = this._getUniformDataChanges() || [];\n for (const {method, start, count} of changes) {\n const move = method === '_removeElements' ? -count : count;\n moveNumericKeys(_hiddenIndices, start, move);\n }\n }\n\n /**\n * @private\n */\n _getUniformDataChanges() {\n const _dataChanges = this._dataChanges;\n if (!_dataChanges || !_dataChanges.length) {\n return;\n }\n\n this._dataChanges = [];\n const datasetCount = this.data.datasets.length;\n const makeSet = (idx) => new Set(\n _dataChanges\n .filter(c => c[0] === idx)\n .map((c, i) => i + ',' + c.splice(1).join(','))\n );\n\n const changeSet = makeSet(0);\n for (let i = 1; i < datasetCount; i++) {\n if (!setsEqual(changeSet, makeSet(i))) {\n return;\n }\n }\n return Array.from(changeSet)\n .map(c => c.split(','))\n .map(a => ({method: a[1], start: +a[2], count: +a[3]}));\n }\n\n /**\n\t * Updates the chart layout unless a plugin returns `false` to the `beforeLayout`\n\t * hook, in which case, plugins will not be called on `afterLayout`.\n\t * @private\n\t */\n _updateLayout(minPadding) {\n if (this.notifyPlugins('beforeLayout', {cancelable: true}) === false) {\n return;\n }\n\n layouts.update(this, this.width, this.height, minPadding);\n\n const area = this.chartArea;\n const noArea = area.width <= 0 || area.height <= 0;\n\n this._layers = [];\n each(this.boxes, (box) => {\n if (noArea && box.position === 'chartArea') {\n // Skip drawing and configuring chartArea boxes when chartArea is zero or negative\n return;\n }\n\n // configure is called twice, once in core.scale.update and once here.\n // Here the boxes are fully updated and at their final positions.\n if (box.configure) {\n box.configure();\n }\n this._layers.push(...box._layers());\n }, this);\n\n this._layers.forEach((item, index) => {\n item._idx = index;\n });\n\n this.notifyPlugins('afterLayout');\n }\n\n /**\n\t * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate`\n\t * hook, in which case, plugins will not be called on `afterDatasetsUpdate`.\n\t * @private\n\t */\n _updateDatasets(mode) {\n if (this.notifyPlugins('beforeDatasetsUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this.getDatasetMeta(i).controller.configure();\n }\n\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this._updateDataset(i, isFunction(mode) ? mode({datasetIndex: i}) : mode);\n }\n\n this.notifyPlugins('afterDatasetsUpdate', {mode});\n }\n\n /**\n\t * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate`\n\t * hook, in which case, plugins will not be called on `afterDatasetUpdate`.\n\t * @private\n\t */\n _updateDataset(index, mode) {\n const meta = this.getDatasetMeta(index);\n const args = {meta, index, mode, cancelable: true};\n\n if (this.notifyPlugins('beforeDatasetUpdate', args) === false) {\n return;\n }\n\n meta.controller._update(mode);\n\n args.cancelable = false;\n this.notifyPlugins('afterDatasetUpdate', args);\n }\n\n render() {\n if (this.notifyPlugins('beforeRender', {cancelable: true}) === false) {\n return;\n }\n\n if (animator.has(this)) {\n if (this.attached && !animator.running(this)) {\n animator.start(this);\n }\n } else {\n this.draw();\n onAnimationsComplete({chart: this});\n }\n }\n\n draw() {\n let i;\n if (this._resizeBeforeDraw) {\n const {width, height} = this._resizeBeforeDraw;\n // Unset pending resize request now to avoid possible recursion within _resize\n this._resizeBeforeDraw = null;\n this._resize(width, height);\n }\n this.clear();\n\n if (this.width <= 0 || this.height <= 0) {\n return;\n }\n\n if (this.notifyPlugins('beforeDraw', {cancelable: true}) === false) {\n return;\n }\n\n // Because of plugin hooks (before/afterDatasetsDraw), datasets can't\n // currently be part of layers. Instead, we draw\n // layers <= 0 before(default, backward compat), and the rest after\n const layers = this._layers;\n for (i = 0; i < layers.length && layers[i].z <= 0; ++i) {\n layers[i].draw(this.chartArea);\n }\n\n this._drawDatasets();\n\n // Rest of layers\n for (; i < layers.length; ++i) {\n layers[i].draw(this.chartArea);\n }\n\n this.notifyPlugins('afterDraw');\n }\n\n /**\n\t * @private\n\t */\n _getSortedDatasetMetas(filterVisible) {\n const metasets = this._sortedMetasets;\n const result = [];\n let i, ilen;\n\n for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n const meta = metasets[i];\n if (!filterVisible || meta.visible) {\n result.push(meta);\n }\n }\n\n return result;\n }\n\n /**\n\t * Gets the visible dataset metas in drawing order\n\t * @return {object[]}\n\t */\n getSortedVisibleDatasetMetas() {\n return this._getSortedDatasetMetas(true);\n }\n\n /**\n\t * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw`\n\t * hook, in which case, plugins will not be called on `afterDatasetsDraw`.\n\t * @private\n\t */\n _drawDatasets() {\n if (this.notifyPlugins('beforeDatasetsDraw', {cancelable: true}) === false) {\n return;\n }\n\n const metasets = this.getSortedVisibleDatasetMetas();\n for (let i = metasets.length - 1; i >= 0; --i) {\n this._drawDataset(metasets[i]);\n }\n\n this.notifyPlugins('afterDatasetsDraw');\n }\n\n /**\n\t * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw`\n\t * hook, in which case, plugins will not be called on `afterDatasetDraw`.\n\t * @private\n\t */\n _drawDataset(meta) {\n const ctx = this.ctx;\n const args = {\n meta,\n index: meta.index,\n cancelable: true\n };\n // @ts-expect-error\n const clip = getDatasetClipArea(this, meta);\n\n if (this.notifyPlugins('beforeDatasetDraw', args) === false) {\n return;\n }\n\n if (clip) {\n clipArea(ctx, clip);\n }\n\n meta.controller.draw();\n\n if (clip) {\n unclipArea(ctx);\n }\n\n args.cancelable = false;\n this.notifyPlugins('afterDatasetDraw', args);\n }\n\n /**\n * Checks whether the given point is in the chart area.\n * @param {Point} point - in relative coordinates (see, e.g., getRelativePosition)\n * @returns {boolean}\n */\n isPointInArea(point) {\n return _isPointInArea(point, this.chartArea, this._minPadding);\n }\n\n getElementsAtEventForMode(e, mode, options, useFinalPosition) {\n const method = Interaction.modes[mode];\n if (typeof method === 'function') {\n return method(this, e, options, useFinalPosition);\n }\n\n return [];\n }\n\n getDatasetMeta(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n const metasets = this._metasets;\n let meta = metasets.filter(x => x && x._dataset === dataset).pop();\n\n if (!meta) {\n meta = {\n type: null,\n data: [],\n dataset: null,\n controller: null,\n hidden: null,\t\t\t// See isDatasetVisible() comment\n xAxisID: null,\n yAxisID: null,\n order: dataset && dataset.order || 0,\n index: datasetIndex,\n _dataset: dataset,\n _parsed: [],\n _sorted: false\n };\n metasets.push(meta);\n }\n\n return meta;\n }\n\n getContext() {\n return this.$context || (this.$context = createContext(null, {chart: this, type: 'chart'}));\n }\n\n getVisibleDatasetCount() {\n return this.getSortedVisibleDatasetMetas().length;\n }\n\n isDatasetVisible(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n if (!dataset) {\n return false;\n }\n\n const meta = this.getDatasetMeta(datasetIndex);\n\n // meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false,\n // the dataset.hidden value is ignored, else if null, the dataset hidden state is returned.\n return typeof meta.hidden === 'boolean' ? !meta.hidden : !dataset.hidden;\n }\n\n setDatasetVisibility(datasetIndex, visible) {\n const meta = this.getDatasetMeta(datasetIndex);\n meta.hidden = !visible;\n }\n\n toggleDataVisibility(index) {\n this._hiddenIndices[index] = !this._hiddenIndices[index];\n }\n\n getDataVisibility(index) {\n return !this._hiddenIndices[index];\n }\n\n /**\n\t * @private\n\t */\n _updateVisibility(datasetIndex, dataIndex, visible) {\n const mode = visible ? 'show' : 'hide';\n const meta = this.getDatasetMeta(datasetIndex);\n const anims = meta.controller._resolveAnimations(undefined, mode);\n\n if (defined(dataIndex)) {\n meta.data[dataIndex].hidden = !visible;\n this.update();\n } else {\n this.setDatasetVisibility(datasetIndex, visible);\n // Animate visible state, so hide animation can be seen. This could be handled better if update / updateDataset returned a Promise.\n anims.update(meta, {visible});\n this.update((ctx) => ctx.datasetIndex === datasetIndex ? mode : undefined);\n }\n }\n\n hide(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, false);\n }\n\n show(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, true);\n }\n\n /**\n\t * @private\n\t */\n _destroyDatasetMeta(datasetIndex) {\n const meta = this._metasets[datasetIndex];\n if (meta && meta.controller) {\n meta.controller._destroy();\n }\n delete this._metasets[datasetIndex];\n }\n\n _stop() {\n let i, ilen;\n this.stop();\n animator.remove(this);\n\n for (i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this._destroyDatasetMeta(i);\n }\n }\n\n destroy() {\n this.notifyPlugins('beforeDestroy');\n const {canvas, ctx} = this;\n\n this._stop();\n this.config.clearCache();\n\n if (canvas) {\n this.unbindEvents();\n clearCanvas(canvas, ctx);\n this.platform.releaseContext(ctx);\n this.canvas = null;\n this.ctx = null;\n }\n\n delete instances[this.id];\n\n this.notifyPlugins('afterDestroy');\n }\n\n toBase64Image(...args) {\n return this.canvas.toDataURL(...args);\n }\n\n /**\n\t * @private\n\t */\n bindEvents() {\n this.bindUserEvents();\n if (this.options.responsive) {\n this.bindResponsiveEvents();\n } else {\n this.attached = true;\n }\n }\n\n /**\n * @private\n */\n bindUserEvents() {\n const listeners = this._listeners;\n const platform = this.platform;\n\n const _add = (type, listener) => {\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n\n const listener = (e, x, y) => {\n e.offsetX = x;\n e.offsetY = y;\n this._eventHandler(e);\n };\n\n each(this.options.events, (type) => _add(type, listener));\n }\n\n /**\n * @private\n */\n bindResponsiveEvents() {\n if (!this._responsiveListeners) {\n this._responsiveListeners = {};\n }\n const listeners = this._responsiveListeners;\n const platform = this.platform;\n\n const _add = (type, listener) => {\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n const _remove = (type, listener) => {\n if (listeners[type]) {\n platform.removeEventListener(this, type, listener);\n delete listeners[type];\n }\n };\n\n const listener = (width, height) => {\n if (this.canvas) {\n this.resize(width, height);\n }\n };\n\n let detached; // eslint-disable-line prefer-const\n const attached = () => {\n _remove('attach', attached);\n\n this.attached = true;\n this.resize();\n\n _add('resize', listener);\n _add('detach', detached);\n };\n\n detached = () => {\n this.attached = false;\n\n _remove('resize', listener);\n\n // Stop animating and remove metasets, so when re-attached, the animations start from beginning.\n this._stop();\n this._resize(0, 0);\n\n _add('attach', attached);\n };\n\n if (platform.isAttached(this.canvas)) {\n attached();\n } else {\n detached();\n }\n }\n\n /**\n\t * @private\n\t */\n unbindEvents() {\n each(this._listeners, (listener, type) => {\n this.platform.removeEventListener(this, type, listener);\n });\n this._listeners = {};\n\n each(this._responsiveListeners, (listener, type) => {\n this.platform.removeEventListener(this, type, listener);\n });\n this._responsiveListeners = undefined;\n }\n\n updateHoverStyle(items, mode, enabled) {\n const prefix = enabled ? 'set' : 'remove';\n let meta, item, i, ilen;\n\n if (mode === 'dataset') {\n meta = this.getDatasetMeta(items[0].datasetIndex);\n meta.controller['_' + prefix + 'DatasetHoverStyle']();\n }\n\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n item = items[i];\n const controller = item && this.getDatasetMeta(item.datasetIndex).controller;\n if (controller) {\n controller[prefix + 'HoverStyle'](item.element, item.datasetIndex, item.index);\n }\n }\n }\n\n /**\n\t * Get active (hovered) elements\n\t * @returns array\n\t */\n getActiveElements() {\n return this._active || [];\n }\n\n /**\n\t * Set active (hovered) elements\n\t * @param {array} activeElements New active data points\n\t */\n setActiveElements(activeElements) {\n const lastActive = this._active || [];\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = this.getDatasetMeta(datasetIndex);\n if (!meta) {\n throw new Error('No dataset found at index ' + datasetIndex);\n }\n\n return {\n datasetIndex,\n element: meta.data[index],\n index,\n };\n });\n const changed = !_elementsEqual(active, lastActive);\n\n if (changed) {\n this._active = active;\n // Make sure we don't use the previous mouse event to override the active elements in update.\n this._lastEvent = null;\n this._updateHoverStyles(active, lastActive);\n }\n }\n\n /**\n\t * Calls enabled plugins on the specified hook and with the given args.\n\t * This method immediately returns as soon as a plugin explicitly returns false. The\n\t * returned value can be used, for instance, to interrupt the current action.\n\t * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n\t * @param {Object} [args] - Extra arguments to apply to the hook call.\n * @param {import('./core.plugins.js').filterCallback} [filter] - Filtering function for limiting which plugins are notified\n\t * @returns {boolean} false if any of the plugins return false, else returns true.\n\t */\n notifyPlugins(hook, args, filter) {\n return this._plugins.notify(this, hook, args, filter);\n }\n\n /**\n * Check if a plugin with the specific ID is registered and enabled\n * @param {string} pluginId - The ID of the plugin of which to check if it is enabled\n * @returns {boolean}\n */\n isPluginEnabled(pluginId) {\n return this._plugins._cache.filter(p => p.plugin.id === pluginId).length === 1;\n }\n\n /**\n\t * @private\n\t */\n _updateHoverStyles(active, lastActive, replay) {\n const hoverOptions = this.options.hover;\n const diff = (a, b) => a.filter(x => !b.some(y => x.datasetIndex === y.datasetIndex && x.index === y.index));\n const deactivated = diff(lastActive, active);\n const activated = replay ? active : diff(active, lastActive);\n\n if (deactivated.length) {\n this.updateHoverStyle(deactivated, hoverOptions.mode, false);\n }\n\n if (activated.length && hoverOptions.mode) {\n this.updateHoverStyle(activated, hoverOptions.mode, true);\n }\n }\n\n /**\n\t * @private\n\t */\n _eventHandler(e, replay) {\n const args = {\n event: e,\n replay,\n cancelable: true,\n inChartArea: this.isPointInArea(e)\n };\n const eventFilter = (plugin) => (plugin.options.events || this.options.events).includes(e.native.type);\n\n if (this.notifyPlugins('beforeEvent', args, eventFilter) === false) {\n return;\n }\n\n const changed = this._handleEvent(e, replay, args.inChartArea);\n\n args.cancelable = false;\n this.notifyPlugins('afterEvent', args, eventFilter);\n\n if (changed || args.changed) {\n this.render();\n }\n\n return this;\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e the event to handle\n\t * @param {boolean} [replay] - true if the event was replayed by `update`\n * @param {boolean} [inChartArea] - true if the event is inside chartArea\n\t * @return {boolean} true if the chart needs to re-render\n\t * @private\n\t */\n _handleEvent(e, replay, inChartArea) {\n const {_active: lastActive = [], options} = this;\n\n // If the event is replayed from `update`, we should evaluate with the final positions.\n //\n // The `replay`:\n // It's the last event (excluding click) that has occurred before `update`.\n // So mouse has not moved. It's also over the chart, because there is a `replay`.\n //\n // The why:\n // If animations are active, the elements haven't moved yet compared to state before update.\n // But if they will, we are activating the elements that would be active, if this check\n // was done after the animations have completed. => \"final positions\".\n // If there is no animations, the \"final\" and \"current\" positions are equal.\n // This is done so we do not have to evaluate the active elements each animation frame\n // - it would be expensive.\n const useFinalPosition = replay;\n const active = this._getActiveElements(e, lastActive, inChartArea, useFinalPosition);\n const isClick = _isClickEvent(e);\n const lastEvent = determineLastEvent(e, this._lastEvent, inChartArea, isClick);\n\n if (inChartArea) {\n // Set _lastEvent to null while we are processing the event handlers.\n // This prevents recursion if the handler calls chart.update()\n this._lastEvent = null;\n\n // Invoke onHover hook\n callCallback(options.onHover, [e, active, this], this);\n\n if (isClick) {\n callCallback(options.onClick, [e, active, this], this);\n }\n }\n\n const changed = !_elementsEqual(active, lastActive);\n if (changed || replay) {\n this._active = active;\n this._updateHoverStyles(active, lastActive, replay);\n }\n\n this._lastEvent = lastEvent;\n\n return changed;\n }\n\n /**\n * @param {ChartEvent} e - The event\n * @param {import('../types/index.js').ActiveElement[]} lastActive - Previously active elements\n * @param {boolean} inChartArea - Is the event inside chartArea\n * @param {boolean} useFinalPosition - Should the evaluation be done with current or final (after animation) element positions\n * @returns {import('../types/index.js').ActiveElement[]} - The active elements\n * @pravate\n */\n _getActiveElements(e, lastActive, inChartArea, useFinalPosition) {\n if (e.type === 'mouseout') {\n return [];\n }\n\n if (!inChartArea) {\n // Let user control the active elements outside chartArea. Eg. using Legend.\n return lastActive;\n }\n\n const hoverOptions = this.options.hover;\n return this.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition);\n }\n}\n\n// @ts-ignore\nfunction invalidatePlugins() {\n return each(Chart.instances, (chart) => chart._plugins.invalidate());\n}\n\nexport default Chart;\n","import Element from '../core/core.element.js';\nimport {_angleBetween, getAngleFromPoint, TAU, HALF_PI, valueOrDefault} from '../helpers/index.js';\nimport {PI, _angleDiff, _normalizeAngle, _isBetween, _limitValue} from '../helpers/helpers.math.js';\nimport {_readValueToProps} from '../helpers/helpers.options.js';\nimport type {ArcOptions, Point} from '../types/index.js';\n\nfunction clipSelf(ctx: CanvasRenderingContext2D, element: ArcElement, endAngle: number) {\n const {startAngle, x, y, outerRadius, innerRadius, options} = element;\n const {borderWidth, borderJoinStyle} = options;\n const outerAngleClip = Math.min(borderWidth / outerRadius, _normalizeAngle(startAngle - endAngle));\n ctx.beginPath();\n ctx.arc(x, y, outerRadius - borderWidth / 2, startAngle + outerAngleClip / 2, endAngle - outerAngleClip / 2);\n\n if (innerRadius > 0) {\n const innerAngleClip = Math.min(borderWidth / innerRadius, _normalizeAngle(startAngle - endAngle));\n ctx.arc(x, y, innerRadius + borderWidth / 2, endAngle - innerAngleClip / 2, startAngle + innerAngleClip / 2, true);\n } else {\n const clipWidth = Math.min(borderWidth / 2, outerRadius * _normalizeAngle(startAngle - endAngle));\n\n if (borderJoinStyle === 'round') {\n ctx.arc(x, y, clipWidth, endAngle - PI / 2, startAngle + PI / 2, true);\n } else if (borderJoinStyle === 'bevel') {\n const r = 2 * clipWidth * clipWidth;\n const endX = -r * Math.cos(endAngle + PI / 2) + x;\n const endY = -r * Math.sin(endAngle + PI / 2) + y;\n const startX = r * Math.cos(startAngle + PI / 2) + x;\n const startY = r * Math.sin(startAngle + PI / 2) + y;\n ctx.lineTo(endX, endY);\n ctx.lineTo(startX, startY);\n }\n }\n ctx.closePath();\n\n ctx.moveTo(0, 0);\n ctx.rect(0, 0, ctx.canvas.width, ctx.canvas.height);\n\n ctx.clip('evenodd');\n}\n\n\nfunction clipArc(ctx: CanvasRenderingContext2D, element: ArcElement, endAngle: number) {\n const {startAngle, pixelMargin, x, y, outerRadius, innerRadius} = element;\n let angleMargin = pixelMargin / outerRadius;\n\n // Draw an inner border by clipping the arc and drawing a double-width border\n // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders\n ctx.beginPath();\n ctx.arc(x, y, outerRadius, startAngle - angleMargin, endAngle + angleMargin);\n if (innerRadius > pixelMargin) {\n angleMargin = pixelMargin / innerRadius;\n ctx.arc(x, y, innerRadius, endAngle + angleMargin, startAngle - angleMargin, true);\n } else {\n ctx.arc(x, y, pixelMargin, endAngle + HALF_PI, startAngle - HALF_PI);\n }\n ctx.closePath();\n ctx.clip();\n}\n\nfunction toRadiusCorners(value) {\n return _readValueToProps(value, ['outerStart', 'outerEnd', 'innerStart', 'innerEnd']);\n}\n\n/**\n * Parse border radius from the provided options\n */\nfunction parseBorderRadius(arc: ArcElement, innerRadius: number, outerRadius: number, angleDelta: number) {\n const o = toRadiusCorners(arc.options.borderRadius);\n const halfThickness = (outerRadius - innerRadius) / 2;\n const innerLimit = Math.min(halfThickness, angleDelta * innerRadius / 2);\n\n // Outer limits are complicated. We want to compute the available angular distance at\n // a radius of outerRadius - borderRadius because for small angular distances, this term limits.\n // We compute at r = outerRadius - borderRadius because this circle defines the center of the border corners.\n //\n // If the borderRadius is large, that value can become negative.\n // This causes the outer borders to lose their radius entirely, which is rather unexpected. To solve that, if borderRadius > outerRadius\n // we know that the thickness term will dominate and compute the limits at that point\n const computeOuterLimit = (val) => {\n const outerArcLimit = (outerRadius - Math.min(halfThickness, val)) * angleDelta / 2;\n return _limitValue(val, 0, Math.min(halfThickness, outerArcLimit));\n };\n\n return {\n outerStart: computeOuterLimit(o.outerStart),\n outerEnd: computeOuterLimit(o.outerEnd),\n innerStart: _limitValue(o.innerStart, 0, innerLimit),\n innerEnd: _limitValue(o.innerEnd, 0, innerLimit),\n };\n}\n\n/**\n * Convert (r, 𝜃) to (x, y)\n */\nfunction rThetaToXY(r: number, theta: number, x: number, y: number) {\n return {\n x: x + r * Math.cos(theta),\n y: y + r * Math.sin(theta),\n };\n}\n\n\n/**\n * Path the arc, respecting border radius by separating into left and right halves.\n *\n * Start End\n *\n * 1--->a--->2 Outer\n * / \\\n * 8 3\n * | |\n * | |\n * 7 4\n * \\ /\n * 6<---b<---5 Inner\n */\nfunction pathArc(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n end: number,\n circular: boolean,\n) {\n const {x, y, startAngle: start, pixelMargin, innerRadius: innerR} = element;\n\n const outerRadius = Math.max(element.outerRadius + spacing + offset - pixelMargin, 0);\n const innerRadius = innerR > 0 ? innerR + spacing + offset + pixelMargin : 0;\n\n let spacingOffset = 0;\n const alpha = end - start;\n\n if (spacing) {\n // When spacing is present, it is the same for all items\n // So we adjust the start and end angle of the arc such that\n // the distance is the same as it would be without the spacing\n const noSpacingInnerRadius = innerR > 0 ? innerR - spacing : 0;\n const noSpacingOuterRadius = outerRadius > 0 ? outerRadius - spacing : 0;\n const avNogSpacingRadius = (noSpacingInnerRadius + noSpacingOuterRadius) / 2;\n const adjustedAngle = avNogSpacingRadius !== 0 ? (alpha * avNogSpacingRadius) / (avNogSpacingRadius + spacing) : alpha;\n spacingOffset = (alpha - adjustedAngle) / 2;\n }\n\n const beta = Math.max(0.001, alpha * outerRadius - offset / PI) / outerRadius;\n const angleOffset = (alpha - beta) / 2;\n const startAngle = start + angleOffset + spacingOffset;\n const endAngle = end - angleOffset - spacingOffset;\n const {outerStart, outerEnd, innerStart, innerEnd} = parseBorderRadius(element, innerRadius, outerRadius, endAngle - startAngle);\n\n const outerStartAdjustedRadius = outerRadius - outerStart;\n const outerEndAdjustedRadius = outerRadius - outerEnd;\n const outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius;\n const outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius;\n\n const innerStartAdjustedRadius = innerRadius + innerStart;\n const innerEndAdjustedRadius = innerRadius + innerEnd;\n const innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius;\n const innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius;\n\n ctx.beginPath();\n\n if (circular) {\n // The first arc segments from point 1 to point a to point 2\n const outerMidAdjustedAngle = (outerStartAdjustedAngle + outerEndAdjustedAngle) / 2;\n ctx.arc(x, y, outerRadius, outerStartAdjustedAngle, outerMidAdjustedAngle);\n ctx.arc(x, y, outerRadius, outerMidAdjustedAngle, outerEndAdjustedAngle);\n\n // The corner segment from point 2 to point 3\n if (outerEnd > 0) {\n const pCenter = rThetaToXY(outerEndAdjustedRadius, outerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerEnd, outerEndAdjustedAngle, endAngle + HALF_PI);\n }\n\n // The line from point 3 to point 4\n const p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y);\n ctx.lineTo(p4.x, p4.y);\n\n // The corner segment from point 4 to point 5\n if (innerEnd > 0) {\n const pCenter = rThetaToXY(innerEndAdjustedRadius, innerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerEnd, endAngle + HALF_PI, innerEndAdjustedAngle + Math.PI);\n }\n\n // The inner arc from point 5 to point b to point 6\n const innerMidAdjustedAngle = ((endAngle - (innerEnd / innerRadius)) + (startAngle + (innerStart / innerRadius))) / 2;\n ctx.arc(x, y, innerRadius, endAngle - (innerEnd / innerRadius), innerMidAdjustedAngle, true);\n ctx.arc(x, y, innerRadius, innerMidAdjustedAngle, startAngle + (innerStart / innerRadius), true);\n\n // The corner segment from point 6 to point 7\n if (innerStart > 0) {\n const pCenter = rThetaToXY(innerStartAdjustedRadius, innerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerStart, innerStartAdjustedAngle + Math.PI, startAngle - HALF_PI);\n }\n\n // The line from point 7 to point 8\n const p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y);\n ctx.lineTo(p8.x, p8.y);\n\n // The corner segment from point 8 to point 1\n if (outerStart > 0) {\n const pCenter = rThetaToXY(outerStartAdjustedRadius, outerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerStart, startAngle - HALF_PI, outerStartAdjustedAngle);\n }\n } else {\n ctx.moveTo(x, y);\n\n const outerStartX = Math.cos(outerStartAdjustedAngle) * outerRadius + x;\n const outerStartY = Math.sin(outerStartAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerStartX, outerStartY);\n\n const outerEndX = Math.cos(outerEndAdjustedAngle) * outerRadius + x;\n const outerEndY = Math.sin(outerEndAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerEndX, outerEndY);\n }\n\n ctx.closePath();\n}\n\nfunction drawArc(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n circular: boolean,\n) {\n const {fullCircles, startAngle, circumference} = element;\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for (let i = 0; i < fullCircles; ++i) {\n ctx.fill();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.fill();\n return endAngle;\n}\n\nfunction drawBorder(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n circular: boolean,\n) {\n const {fullCircles, startAngle, circumference, options} = element;\n const {borderWidth, borderJoinStyle, borderDash, borderDashOffset, borderRadius} = options;\n const inner = options.borderAlign === 'inner';\n\n if (!borderWidth) {\n return;\n }\n\n ctx.setLineDash(borderDash || []);\n ctx.lineDashOffset = borderDashOffset;\n\n if (inner) {\n ctx.lineWidth = borderWidth * 2;\n ctx.lineJoin = borderJoinStyle || 'round';\n } else {\n ctx.lineWidth = borderWidth;\n ctx.lineJoin = borderJoinStyle || 'bevel';\n }\n\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for (let i = 0; i < fullCircles; ++i) {\n ctx.stroke();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n\n if (inner) {\n clipArc(ctx, element, endAngle);\n }\n\n if (options.selfJoin && endAngle - startAngle >= PI && borderRadius === 0 && borderJoinStyle !== 'miter') {\n clipSelf(ctx, element, endAngle);\n }\n\n if (!fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.stroke();\n }\n}\n\nexport interface ArcProps extends Point {\n startAngle: number;\n endAngle: number;\n innerRadius: number;\n outerRadius: number;\n circumference: number;\n}\n\nexport default class ArcElement extends Element {\n\n static id = 'arc';\n\n static defaults = {\n borderAlign: 'center',\n borderColor: '#fff',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: undefined,\n borderRadius: 0,\n borderWidth: 2,\n offset: 0,\n spacing: 0,\n angle: undefined,\n circular: true,\n selfJoin: false,\n };\n\n static defaultRoutes = {\n backgroundColor: 'backgroundColor'\n };\n\n static descriptors = {\n _scriptable: true,\n _indexable: (name) => name !== 'borderDash'\n };\n\n circumference: number;\n endAngle: number;\n fullCircles: number;\n innerRadius: number;\n outerRadius: number;\n pixelMargin: number;\n startAngle: number;\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.circumference = undefined;\n this.startAngle = undefined;\n this.endAngle = undefined;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.pixelMargin = 0;\n this.fullCircles = 0;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n inRange(chartX: number, chartY: number, useFinalPosition: boolean) {\n const point = this.getProps(['x', 'y'], useFinalPosition);\n const {angle, distance} = getAngleFromPoint(point, {x: chartX, y: chartY});\n const {startAngle, endAngle, innerRadius, outerRadius, circumference} = this.getProps([\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius',\n 'circumference'\n ], useFinalPosition);\n const rAdjust = (this.options.spacing + this.options.borderWidth) / 2;\n const _circumference = valueOrDefault(circumference, endAngle - startAngle);\n const nonZeroBetween = _angleBetween(angle, startAngle, endAngle) && startAngle !== endAngle;\n const betweenAngles = _circumference >= TAU || nonZeroBetween;\n const withinRadius = _isBetween(distance, innerRadius + rAdjust, outerRadius + rAdjust);\n\n return (betweenAngles && withinRadius);\n }\n\n getCenterPoint(useFinalPosition: boolean) {\n const {x, y, startAngle, endAngle, innerRadius, outerRadius} = this.getProps([\n 'x',\n 'y',\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius'\n ], useFinalPosition);\n const {offset, spacing} = this.options;\n const halfAngle = (startAngle + endAngle) / 2;\n const halfRadius = (innerRadius + outerRadius + spacing + offset) / 2;\n return {\n x: x + Math.cos(halfAngle) * halfRadius,\n y: y + Math.sin(halfAngle) * halfRadius\n };\n }\n\n tooltipPosition(useFinalPosition: boolean) {\n return this.getCenterPoint(useFinalPosition);\n }\n\n draw(ctx: CanvasRenderingContext2D) {\n const {options, circumference} = this;\n const offset = (options.offset || 0) / 4;\n const spacing = (options.spacing || 0) / 2;\n const circular = options.circular;\n this.pixelMargin = (options.borderAlign === 'inner') ? 0.33 : 0;\n this.fullCircles = circumference > TAU ? Math.floor(circumference / TAU) : 0;\n\n if (circumference === 0 || this.innerRadius < 0 || this.outerRadius < 0) {\n return;\n }\n\n ctx.save();\n\n const halfAngle = (this.startAngle + this.endAngle) / 2;\n ctx.translate(Math.cos(halfAngle) * offset, Math.sin(halfAngle) * offset);\n const fix = 1 - Math.sin(Math.min(PI, circumference || 0));\n const radiusOffset = offset * fix;\n\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n\n drawArc(ctx, this, radiusOffset, spacing, circular);\n drawBorder(ctx, this, radiusOffset, spacing, circular);\n\n ctx.restore();\n }\n}\n","import Element from '../core/core.element.js';\nimport {_bezierInterpolation, _pointInLine, _steppedInterpolation} from '../helpers/helpers.interpolation.js';\nimport {_computeSegments, _boundSegments} from '../helpers/helpers.segment.js';\nimport {_steppedLineTo, _bezierCurveTo} from '../helpers/helpers.canvas.js';\nimport {_updateBezierControlPoints} from '../helpers/helpers.curve.js';\nimport {valueOrDefault} from '../helpers/index.js';\n\n/**\n * @typedef { import('./element.point.js').default } PointElement\n */\n\nfunction setStyle(ctx, options, style = options) {\n ctx.lineCap = valueOrDefault(style.borderCapStyle, options.borderCapStyle);\n ctx.setLineDash(valueOrDefault(style.borderDash, options.borderDash));\n ctx.lineDashOffset = valueOrDefault(style.borderDashOffset, options.borderDashOffset);\n ctx.lineJoin = valueOrDefault(style.borderJoinStyle, options.borderJoinStyle);\n ctx.lineWidth = valueOrDefault(style.borderWidth, options.borderWidth);\n ctx.strokeStyle = valueOrDefault(style.borderColor, options.borderColor);\n}\n\nfunction lineTo(ctx, previous, target) {\n ctx.lineTo(target.x, target.y);\n}\n\n/**\n * @returns {any}\n */\nfunction getLineMethod(options) {\n if (options.stepped) {\n return _steppedLineTo;\n }\n\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierCurveTo;\n }\n\n return lineTo;\n}\n\nfunction pathVars(points, segment, params = {}) {\n const count = points.length;\n const {start: paramsStart = 0, end: paramsEnd = count - 1} = params;\n const {start: segmentStart, end: segmentEnd} = segment;\n const start = Math.max(paramsStart, segmentStart);\n const end = Math.min(paramsEnd, segmentEnd);\n const outside = paramsStart < segmentStart && paramsEnd < segmentStart || paramsStart > segmentEnd && paramsEnd > segmentEnd;\n\n return {\n count,\n start,\n loop: segment.loop,\n ilen: end < start && !outside ? count + end - start : end - start\n };\n}\n\n/**\n * Create path from points, grouping by truncated x-coordinate\n * Points need to be in order by x-coordinate for this to work efficiently\n * @param {CanvasRenderingContext2D|Path2D} ctx - Context\n * @param {LineElement} line\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} params\n * @param {boolean} params.move - move to starting point (vs line to it)\n * @param {boolean} params.reverse - path the segment from end to start\n * @param {number} params.start - limit segment to points starting from `start` index\n * @param {number} params.end - limit segment to points ending at `start` + `count` index\n */\nfunction pathSegment(ctx, line, segment, params) {\n const {points, options} = line;\n const {count, start, loop, ilen} = pathVars(points, segment, params);\n const lineMethod = getLineMethod(options);\n // eslint-disable-next-line prefer-const\n let {move = true, reverse} = params || {};\n let i, point, prev;\n\n for (i = 0; i <= ilen; ++i) {\n point = points[(start + (reverse ? ilen - i : i)) % count];\n\n if (point.skip) {\n // If there is a skipped point inside a segment, spanGaps must be true\n continue;\n } else if (move) {\n ctx.moveTo(point.x, point.y);\n move = false;\n } else {\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n\n prev = point;\n }\n\n if (loop) {\n point = points[(start + (reverse ? ilen : 0)) % count];\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n\n return !!loop;\n}\n\n/**\n * Create path from points, grouping by truncated x-coordinate\n * Points need to be in order by x-coordinate for this to work efficiently\n * @param {CanvasRenderingContext2D|Path2D} ctx - Context\n * @param {LineElement} line\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} params\n * @param {boolean} params.move - move to starting point (vs line to it)\n * @param {boolean} params.reverse - path the segment from end to start\n * @param {number} params.start - limit segment to points starting from `start` index\n * @param {number} params.end - limit segment to points ending at `start` + `count` index\n */\nfunction fastPathSegment(ctx, line, segment, params) {\n const points = line.points;\n const {count, start, ilen} = pathVars(points, segment, params);\n const {move = true, reverse} = params || {};\n let avgX = 0;\n let countX = 0;\n let i, point, prevX, minY, maxY, lastY;\n\n const pointIndex = (index) => (start + (reverse ? ilen - index : index)) % count;\n const drawX = () => {\n if (minY !== maxY) {\n // Draw line to maxY and minY, using the average x-coordinate\n ctx.lineTo(avgX, maxY);\n ctx.lineTo(avgX, minY);\n // Line to y-value of last point in group. So the line continues\n // from correct position. Not using move, to have solid path.\n ctx.lineTo(avgX, lastY);\n }\n };\n\n if (move) {\n point = points[pointIndex(0)];\n ctx.moveTo(point.x, point.y);\n }\n\n for (i = 0; i <= ilen; ++i) {\n point = points[pointIndex(i)];\n\n if (point.skip) {\n // If there is a skipped point inside a segment, spanGaps must be true\n continue;\n }\n\n const x = point.x;\n const y = point.y;\n const truncX = x | 0; // truncated x-coordinate\n\n if (truncX === prevX) {\n // Determine `minY` / `maxY` and `avgX` while we stay within same x-position\n if (y < minY) {\n minY = y;\n } else if (y > maxY) {\n maxY = y;\n }\n // For first point in group, countX is `0`, so average will be `x` / 1.\n avgX = (countX * avgX + x) / ++countX;\n } else {\n drawX();\n // Draw line to next x-position, using the first (or only)\n // y-value in that group\n ctx.lineTo(x, y);\n\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n }\n // Keep track of the last y-value in group\n lastY = y;\n }\n drawX();\n}\n\n/**\n * @param {LineElement} line - the line\n * @returns {function}\n * @private\n */\nfunction _getSegmentMethod(line) {\n const opts = line.options;\n const borderDash = opts.borderDash && opts.borderDash.length;\n const useFastPath = !line._decimated && !line._loop && !opts.tension && opts.cubicInterpolationMode !== 'monotone' && !opts.stepped && !borderDash;\n return useFastPath ? fastPathSegment : pathSegment;\n}\n\n/**\n * @private\n */\nfunction _getInterpolationMethod(options) {\n if (options.stepped) {\n return _steppedInterpolation;\n }\n\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierInterpolation;\n }\n\n return _pointInLine;\n}\n\nfunction strokePathWithCache(ctx, line, start, count) {\n let path = line._path;\n if (!path) {\n path = line._path = new Path2D();\n if (line.path(path, start, count)) {\n path.closePath();\n }\n }\n setStyle(ctx, line.options);\n ctx.stroke(path);\n}\n\nfunction strokePathDirect(ctx, line, start, count) {\n const {segments, options} = line;\n const segmentMethod = _getSegmentMethod(line);\n\n for (const segment of segments) {\n setStyle(ctx, options, segment.style);\n ctx.beginPath();\n if (segmentMethod(ctx, line, segment, {start, end: start + count - 1})) {\n ctx.closePath();\n }\n ctx.stroke();\n }\n}\n\nconst usePath2D = typeof Path2D === 'function';\n\nfunction draw(ctx, line, start, count) {\n if (usePath2D && !line.options.segment) {\n strokePathWithCache(ctx, line, start, count);\n } else {\n strokePathDirect(ctx, line, start, count);\n }\n}\n\nexport default class LineElement extends Element {\n\n static id = 'line';\n\n /**\n * @type {any}\n */\n static defaults = {\n borderCapStyle: 'butt',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderWidth: 3,\n capBezierPoints: true,\n cubicInterpolationMode: 'default',\n fill: false,\n spanGaps: false,\n stepped: false,\n tension: 0,\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n\n static descriptors = {\n _scriptable: true,\n _indexable: (name) => name !== 'borderDash' && name !== 'fill',\n };\n\n\n constructor(cfg) {\n super();\n\n this.animated = true;\n this.options = undefined;\n this._chart = undefined;\n this._loop = undefined;\n this._fullLoop = undefined;\n this._path = undefined;\n this._points = undefined;\n this._segments = undefined;\n this._decimated = false;\n this._pointsUpdated = false;\n this._datasetIndex = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n updateControlPoints(chartArea, indexAxis) {\n const options = this.options;\n if ((options.tension || options.cubicInterpolationMode === 'monotone') && !options.stepped && !this._pointsUpdated) {\n const loop = options.spanGaps ? this._loop : this._fullLoop;\n _updateBezierControlPoints(this._points, options, chartArea, loop, indexAxis);\n this._pointsUpdated = true;\n }\n }\n\n set points(points) {\n this._points = points;\n delete this._segments;\n delete this._path;\n this._pointsUpdated = false;\n }\n\n get points() {\n return this._points;\n }\n\n get segments() {\n return this._segments || (this._segments = _computeSegments(this, this.options.segment));\n }\n\n /**\n\t * First non-skipped point on this line\n\t * @returns {PointElement|undefined}\n\t */\n first() {\n const segments = this.segments;\n const points = this.points;\n return segments.length && points[segments[0].start];\n }\n\n /**\n\t * Last non-skipped point on this line\n\t * @returns {PointElement|undefined}\n\t */\n last() {\n const segments = this.segments;\n const points = this.points;\n const count = segments.length;\n return count && points[segments[count - 1].end];\n }\n\n /**\n\t * Interpolate a point in this line at the same value on `property` as\n\t * the reference `point` provided\n\t * @param {PointElement} point - the reference point\n\t * @param {string} property - the property to match on\n\t * @returns {PointElement|undefined}\n\t */\n interpolate(point, property) {\n const options = this.options;\n const value = point[property];\n const points = this.points;\n const segments = _boundSegments(this, {property, start: value, end: value});\n\n if (!segments.length) {\n return;\n }\n\n const result = [];\n const _interpolate = _getInterpolationMethod(options);\n let i, ilen;\n for (i = 0, ilen = segments.length; i < ilen; ++i) {\n const {start, end} = segments[i];\n const p1 = points[start];\n const p2 = points[end];\n if (p1 === p2) {\n result.push(p1);\n continue;\n }\n const t = Math.abs((value - p1[property]) / (p2[property] - p1[property]));\n const interpolated = _interpolate(p1, p2, t, options.stepped);\n interpolated[property] = point[property];\n result.push(interpolated);\n }\n return result.length === 1 ? result[0] : result;\n }\n\n /**\n\t * Append a segment of this line to current path.\n\t * @param {CanvasRenderingContext2D} ctx\n\t * @param {object} segment\n\t * @param {number} segment.start - start index of the segment, referring the points array\n \t * @param {number} segment.end - end index of the segment, referring the points array\n \t * @param {boolean} segment.loop - indicates that the segment is a loop\n\t * @param {object} params\n\t * @param {boolean} params.move - move to starting point (vs line to it)\n\t * @param {boolean} params.reverse - path the segment from end to start\n\t * @param {number} params.start - limit segment to points starting from `start` index\n\t * @param {number} params.end - limit segment to points ending at `start` + `count` index\n\t * @returns {undefined|boolean} - true if the segment is a full loop (path should be closed)\n\t */\n pathSegment(ctx, segment, params) {\n const segmentMethod = _getSegmentMethod(this);\n return segmentMethod(ctx, this, segment, params);\n }\n\n /**\n\t * Append all segments of this line to current path.\n\t * @param {CanvasRenderingContext2D|Path2D} ctx\n\t * @param {number} [start]\n\t * @param {number} [count]\n\t * @returns {undefined|boolean} - true if line is a full loop (path should be closed)\n\t */\n path(ctx, start, count) {\n const segments = this.segments;\n const segmentMethod = _getSegmentMethod(this);\n let loop = this._loop;\n\n start = start || 0;\n count = count || (this.points.length - start);\n\n for (const segment of segments) {\n loop &= segmentMethod(ctx, this, segment, {start, end: start + count - 1});\n }\n return !!loop;\n }\n\n /**\n\t * Draw\n\t * @param {CanvasRenderingContext2D} ctx\n\t * @param {object} chartArea\n\t * @param {number} [start]\n\t * @param {number} [count]\n\t */\n draw(ctx, chartArea, start, count) {\n const options = this.options || {};\n const points = this.points || [];\n\n if (points.length && options.borderWidth) {\n ctx.save();\n\n draw(ctx, this, start, count);\n\n ctx.restore();\n }\n\n if (this.animated) {\n // When line is animated, the control points and path are not cached.\n this._pointsUpdated = false;\n this._path = undefined;\n }\n }\n}\n","import Element from '../core/core.element.js';\nimport {drawPoint, _isPointInArea} from '../helpers/helpers.canvas.js';\nimport type {\n CartesianParsedData,\n ChartArea,\n Point,\n PointHoverOptions,\n PointOptions,\n} from '../types/index.js';\n\nfunction inRange(el: PointElement, pos: number, axis: 'x' | 'y', useFinalPosition?: boolean) {\n const options = el.options;\n const {[axis]: value} = el.getProps([axis], useFinalPosition);\n\n return (Math.abs(pos - value) < options.radius + options.hitRadius);\n}\n\nexport type PointProps = Point\n\nexport default class PointElement extends Element {\n\n static id = 'point';\n\n parsed: CartesianParsedData;\n skip?: boolean;\n stop?: boolean;\n\n /**\n * @type {any}\n */\n static defaults = {\n borderWidth: 1,\n hitRadius: 1,\n hoverBorderWidth: 1,\n hoverRadius: 4,\n pointStyle: 'circle',\n radius: 3,\n rotation: 0\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.parsed = undefined;\n this.skip = undefined;\n this.stop = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n inRange(mouseX: number, mouseY: number, useFinalPosition?: boolean) {\n const options = this.options;\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return ((Math.pow(mouseX - x, 2) + Math.pow(mouseY - y, 2)) < Math.pow(options.hitRadius + options.radius, 2));\n }\n\n inXRange(mouseX: number, useFinalPosition?: boolean) {\n return inRange(this, mouseX, 'x', useFinalPosition);\n }\n\n inYRange(mouseY: number, useFinalPosition?: boolean) {\n return inRange(this, mouseY, 'y', useFinalPosition);\n }\n\n getCenterPoint(useFinalPosition?: boolean) {\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return {x, y};\n }\n\n size(options?: Partial) {\n options = options || this.options || {};\n let radius = options.radius || 0;\n radius = Math.max(radius, radius && options.hoverRadius || 0);\n const borderWidth = radius && options.borderWidth || 0;\n return (radius + borderWidth) * 2;\n }\n\n draw(ctx: CanvasRenderingContext2D, area: ChartArea) {\n const options = this.options;\n\n if (this.skip || options.radius < 0.1 || !_isPointInArea(this, area, this.size(options) / 2)) {\n return;\n }\n\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n ctx.fillStyle = options.backgroundColor;\n drawPoint(ctx, options, this.x, this.y);\n }\n\n getRange() {\n const options = this.options || {};\n // @ts-expect-error Fallbacks should never be hit in practice\n return options.radius + options.hitRadius;\n }\n}\n","import Element from '../core/core.element.js';\nimport {isObject, _isBetween, _limitValue} from '../helpers/index.js';\nimport {addRoundedRectPath} from '../helpers/helpers.canvas.js';\nimport {toTRBL, toTRBLCorners} from '../helpers/helpers.options.js';\n\n/** @typedef {{ x: number, y: number, base: number, horizontal: boolean, width: number, height: number }} BarProps */\n\n/**\n * Helper function to get the bounds of the bar regardless of the orientation\n * @param {BarElement} bar the bar\n * @param {boolean} [useFinalPosition]\n * @return {object} bounds of the bar\n * @private\n */\nfunction getBarBounds(bar, useFinalPosition) {\n const {x, y, base, width, height} = /** @type {BarProps} */ (bar.getProps(['x', 'y', 'base', 'width', 'height'], useFinalPosition));\n\n let left, right, top, bottom, half;\n\n if (bar.horizontal) {\n half = height / 2;\n left = Math.min(x, base);\n right = Math.max(x, base);\n top = y - half;\n bottom = y + half;\n } else {\n half = width / 2;\n left = x - half;\n right = x + half;\n top = Math.min(y, base);\n bottom = Math.max(y, base);\n }\n\n return {left, top, right, bottom};\n}\n\nfunction skipOrLimit(skip, value, min, max) {\n return skip ? 0 : _limitValue(value, min, max);\n}\n\nfunction parseBorderWidth(bar, maxW, maxH) {\n const value = bar.options.borderWidth;\n const skip = bar.borderSkipped;\n const o = toTRBL(value);\n\n return {\n t: skipOrLimit(skip.top, o.top, 0, maxH),\n r: skipOrLimit(skip.right, o.right, 0, maxW),\n b: skipOrLimit(skip.bottom, o.bottom, 0, maxH),\n l: skipOrLimit(skip.left, o.left, 0, maxW)\n };\n}\n\nfunction parseBorderRadius(bar, maxW, maxH) {\n const {enableBorderRadius} = bar.getProps(['enableBorderRadius']);\n const value = bar.options.borderRadius;\n const o = toTRBLCorners(value);\n const maxR = Math.min(maxW, maxH);\n const skip = bar.borderSkipped;\n\n // If the value is an object, assume the user knows what they are doing\n // and apply as directed.\n const enableBorder = enableBorderRadius || isObject(value);\n\n return {\n topLeft: skipOrLimit(!enableBorder || skip.top || skip.left, o.topLeft, 0, maxR),\n topRight: skipOrLimit(!enableBorder || skip.top || skip.right, o.topRight, 0, maxR),\n bottomLeft: skipOrLimit(!enableBorder || skip.bottom || skip.left, o.bottomLeft, 0, maxR),\n bottomRight: skipOrLimit(!enableBorder || skip.bottom || skip.right, o.bottomRight, 0, maxR)\n };\n}\n\nfunction boundingRects(bar) {\n const bounds = getBarBounds(bar);\n const width = bounds.right - bounds.left;\n const height = bounds.bottom - bounds.top;\n const border = parseBorderWidth(bar, width / 2, height / 2);\n const radius = parseBorderRadius(bar, width / 2, height / 2);\n\n return {\n outer: {\n x: bounds.left,\n y: bounds.top,\n w: width,\n h: height,\n radius\n },\n inner: {\n x: bounds.left + border.l,\n y: bounds.top + border.t,\n w: width - border.l - border.r,\n h: height - border.t - border.b,\n radius: {\n topLeft: Math.max(0, radius.topLeft - Math.max(border.t, border.l)),\n topRight: Math.max(0, radius.topRight - Math.max(border.t, border.r)),\n bottomLeft: Math.max(0, radius.bottomLeft - Math.max(border.b, border.l)),\n bottomRight: Math.max(0, radius.bottomRight - Math.max(border.b, border.r)),\n }\n }\n };\n}\n\nfunction inRange(bar, x, y, useFinalPosition) {\n const skipX = x === null;\n const skipY = y === null;\n const skipBoth = skipX && skipY;\n const bounds = bar && !skipBoth && getBarBounds(bar, useFinalPosition);\n\n return bounds\n\t\t&& (skipX || _isBetween(x, bounds.left, bounds.right))\n\t\t&& (skipY || _isBetween(y, bounds.top, bounds.bottom));\n}\n\nfunction hasRadius(radius) {\n return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight;\n}\n\n/**\n * Add a path of a rectangle to the current sub-path\n * @param {CanvasRenderingContext2D} ctx Context\n * @param {*} rect Bounding rect\n */\nfunction addNormalRectPath(ctx, rect) {\n ctx.rect(rect.x, rect.y, rect.w, rect.h);\n}\n\nfunction inflateRect(rect, amount, refRect = {}) {\n const x = rect.x !== refRect.x ? -amount : 0;\n const y = rect.y !== refRect.y ? -amount : 0;\n const w = (rect.x + rect.w !== refRect.x + refRect.w ? amount : 0) - x;\n const h = (rect.y + rect.h !== refRect.y + refRect.h ? amount : 0) - y;\n return {\n x: rect.x + x,\n y: rect.y + y,\n w: rect.w + w,\n h: rect.h + h,\n radius: rect.radius\n };\n}\n\nexport default class BarElement extends Element {\n\n static id = 'bar';\n\n /**\n * @type {any}\n */\n static defaults = {\n borderSkipped: 'start',\n borderWidth: 0,\n borderRadius: 0,\n inflateAmount: 'auto',\n pointStyle: undefined\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.horizontal = undefined;\n this.base = undefined;\n this.width = undefined;\n this.height = undefined;\n this.inflateAmount = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n draw(ctx) {\n const {inflateAmount, options: {borderColor, backgroundColor}} = this;\n const {inner, outer} = boundingRects(this);\n const addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath;\n\n ctx.save();\n\n if (outer.w !== inner.w || outer.h !== inner.h) {\n ctx.beginPath();\n addRectPath(ctx, inflateRect(outer, inflateAmount, inner));\n ctx.clip();\n addRectPath(ctx, inflateRect(inner, -inflateAmount, outer));\n ctx.fillStyle = borderColor;\n ctx.fill('evenodd');\n }\n\n ctx.beginPath();\n addRectPath(ctx, inflateRect(inner, inflateAmount));\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n\n ctx.restore();\n }\n\n inRange(mouseX, mouseY, useFinalPosition) {\n return inRange(this, mouseX, mouseY, useFinalPosition);\n }\n\n inXRange(mouseX, useFinalPosition) {\n return inRange(this, mouseX, null, useFinalPosition);\n }\n\n inYRange(mouseY, useFinalPosition) {\n return inRange(this, null, mouseY, useFinalPosition);\n }\n\n getCenterPoint(useFinalPosition) {\n const {x, y, base, horizontal} = /** @type {BarProps} */ (this.getProps(['x', 'y', 'base', 'horizontal'], useFinalPosition));\n return {\n x: horizontal ? (x + base) / 2 : x,\n y: horizontal ? y : (y + base) / 2\n };\n }\n\n getRange(axis) {\n return axis === 'x' ? this.width / 2 : this.height / 2;\n }\n}\n","import defaults from '../core/core.defaults.js';\nimport Element from '../core/core.element.js';\nimport layouts from '../core/core.layouts.js';\nimport {addRoundedRectPath, drawPointLegend, renderText} from '../helpers/helpers.canvas.js';\nimport {\n _isBetween,\n callback as call,\n clipArea,\n getRtlAdapter,\n overrideTextDirection,\n restoreTextDirection,\n toFont,\n toPadding,\n unclipArea,\n valueOrDefault,\n} from '../helpers/index.js';\nimport {_alignStartEnd, _textX, _toLeftRightCenter} from '../helpers/helpers.extras.js';\nimport {toTRBLCorners} from '../helpers/helpers.options.js';\n\n/**\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n */\n\nconst getBoxSize = (labelOpts, fontSize) => {\n let {boxHeight = fontSize, boxWidth = fontSize} = labelOpts;\n\n if (labelOpts.usePointStyle) {\n boxHeight = Math.min(boxHeight, fontSize);\n boxWidth = labelOpts.pointStyleWidth || Math.min(boxWidth, fontSize);\n }\n\n return {\n boxWidth,\n boxHeight,\n itemHeight: Math.max(fontSize, boxHeight)\n };\n};\n\nconst itemsEqual = (a, b) => a !== null && b !== null && a.datasetIndex === b.datasetIndex && a.index === b.index;\n\nexport class Legend extends Element {\n\n /**\n\t * @param {{ ctx: any; options: any; chart: any; }} config\n\t */\n constructor(config) {\n super();\n\n this._added = false;\n\n // Contains hit boxes for each dataset (in dataset order)\n this.legendHitBoxes = [];\n\n /**\n \t\t * @private\n \t\t */\n this._hoveredItem = null;\n\n // Are we in doughnut mode which has a different data type\n this.doughnutMode = false;\n\n this.chart = config.chart;\n this.options = config.options;\n this.ctx = config.ctx;\n this.legendItems = undefined;\n this.columnSizes = undefined;\n this.lineWidths = undefined;\n this.maxHeight = undefined;\n this.maxWidth = undefined;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.height = undefined;\n this.width = undefined;\n this._margins = undefined;\n this.position = undefined;\n this.weight = undefined;\n this.fullSize = undefined;\n }\n\n update(maxWidth, maxHeight, margins) {\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins;\n\n this.setDimensions();\n this.buildLabels();\n this.fit();\n }\n\n setDimensions() {\n if (this.isHorizontal()) {\n this.width = this.maxWidth;\n this.left = this._margins.left;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n this.top = this._margins.top;\n this.bottom = this.height;\n }\n }\n\n buildLabels() {\n const labelOpts = this.options.labels || {};\n let legendItems = call(labelOpts.generateLabels, [this.chart], this) || [];\n\n if (labelOpts.filter) {\n legendItems = legendItems.filter((item) => labelOpts.filter(item, this.chart.data));\n }\n\n if (labelOpts.sort) {\n legendItems = legendItems.sort((a, b) => labelOpts.sort(a, b, this.chart.data));\n }\n\n if (this.options.reverse) {\n legendItems.reverse();\n }\n\n this.legendItems = legendItems;\n }\n\n fit() {\n const {options, ctx} = this;\n\n // The legend may not be displayed for a variety of reasons including\n // the fact that the defaults got set to `false`.\n // When the legend is not displayed, there are no guarantees that the options\n // are correctly formatted so we need to bail out as early as possible.\n if (!options.display) {\n this.width = this.height = 0;\n return;\n }\n\n const labelOpts = options.labels;\n const labelFont = toFont(labelOpts.font);\n const fontSize = labelFont.size;\n const titleHeight = this._computeTitleHeight();\n const {boxWidth, itemHeight} = getBoxSize(labelOpts, fontSize);\n\n let width, height;\n\n ctx.font = labelFont.string;\n\n if (this.isHorizontal()) {\n width = this.maxWidth; // fill all the width\n height = this._fitRows(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n } else {\n height = this.maxHeight; // fill all the height\n width = this._fitCols(titleHeight, labelFont, boxWidth, itemHeight) + 10;\n }\n\n this.width = Math.min(width, options.maxWidth || this.maxWidth);\n this.height = Math.min(height, options.maxHeight || this.maxHeight);\n }\n\n /**\n\t * @private\n\t */\n _fitRows(titleHeight, fontSize, boxWidth, itemHeight) {\n const {ctx, maxWidth, options: {labels: {padding}}} = this;\n const hitboxes = this.legendHitBoxes = [];\n // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one\n const lineWidths = this.lineWidths = [0];\n const lineHeight = itemHeight + padding;\n let totalHeight = titleHeight;\n\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n\n let row = -1;\n let top = -lineHeight;\n this.legendItems.forEach((legendItem, i) => {\n const itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n\n if (i === 0 || lineWidths[lineWidths.length - 1] + itemWidth + 2 * padding > maxWidth) {\n totalHeight += lineHeight;\n lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0;\n top += lineHeight;\n row++;\n }\n\n hitboxes[i] = {left: 0, top, row, width: itemWidth, height: itemHeight};\n\n lineWidths[lineWidths.length - 1] += itemWidth + padding;\n });\n\n return totalHeight;\n }\n\n _fitCols(titleHeight, labelFont, boxWidth, _itemHeight) {\n const {ctx, maxHeight, options: {labels: {padding}}} = this;\n const hitboxes = this.legendHitBoxes = [];\n const columnSizes = this.columnSizes = [];\n const heightLimit = maxHeight - titleHeight;\n\n let totalWidth = padding;\n let currentColWidth = 0;\n let currentColHeight = 0;\n\n let left = 0;\n let col = 0;\n\n this.legendItems.forEach((legendItem, i) => {\n const {itemWidth, itemHeight} = calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight);\n\n // If too tall, go to new column\n if (i > 0 && currentColHeight + itemHeight + 2 * padding > heightLimit) {\n totalWidth += currentColWidth + padding;\n columnSizes.push({width: currentColWidth, height: currentColHeight}); // previous column size\n left += currentColWidth + padding;\n col++;\n currentColWidth = currentColHeight = 0;\n }\n\n // Store the hitbox width and height here. Final position will be updated in `draw`\n hitboxes[i] = {left, top: currentColHeight, col, width: itemWidth, height: itemHeight};\n\n // Get max width\n currentColWidth = Math.max(currentColWidth, itemWidth);\n currentColHeight += itemHeight + padding;\n });\n\n totalWidth += currentColWidth;\n columnSizes.push({width: currentColWidth, height: currentColHeight}); // previous column size\n\n return totalWidth;\n }\n\n adjustHitBoxes() {\n if (!this.options.display) {\n return;\n }\n const titleHeight = this._computeTitleHeight();\n const {legendHitBoxes: hitboxes, options: {align, labels: {padding}, rtl}} = this;\n const rtlHelper = getRtlAdapter(rtl, this.left, this.width);\n if (this.isHorizontal()) {\n let row = 0;\n let left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n for (const hitbox of hitboxes) {\n if (row !== hitbox.row) {\n row = hitbox.row;\n left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n }\n hitbox.top += this.top + titleHeight + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(left), hitbox.width);\n left += hitbox.width + padding;\n }\n } else {\n let col = 0;\n let top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n for (const hitbox of hitboxes) {\n if (hitbox.col !== col) {\n col = hitbox.col;\n top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n }\n hitbox.top = top;\n hitbox.left += this.left + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(hitbox.left), hitbox.width);\n top += hitbox.height + padding;\n }\n }\n }\n\n isHorizontal() {\n return this.options.position === 'top' || this.options.position === 'bottom';\n }\n\n draw() {\n if (this.options.display) {\n const ctx = this.ctx;\n clipArea(ctx, this);\n\n this._draw();\n\n unclipArea(ctx);\n }\n }\n\n /**\n\t * @private\n\t */\n _draw() {\n const {options: opts, columnSizes, lineWidths, ctx} = this;\n const {align, labels: labelOpts} = opts;\n const defaultColor = defaults.color;\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const labelFont = toFont(labelOpts.font);\n const {padding} = labelOpts;\n const fontSize = labelFont.size;\n const halfFontSize = fontSize / 2;\n let cursor;\n\n this.drawTitle();\n\n // Canvas setup\n ctx.textAlign = rtlHelper.textAlign('left');\n ctx.textBaseline = 'middle';\n ctx.lineWidth = 0.5;\n ctx.font = labelFont.string;\n\n const {boxWidth, boxHeight, itemHeight} = getBoxSize(labelOpts, fontSize);\n\n // current position\n const drawLegendBox = function(x, y, legendItem) {\n if (isNaN(boxWidth) || boxWidth <= 0 || isNaN(boxHeight) || boxHeight < 0) {\n return;\n }\n\n // Set the ctx for the box\n ctx.save();\n\n const lineWidth = valueOrDefault(legendItem.lineWidth, 1);\n ctx.fillStyle = valueOrDefault(legendItem.fillStyle, defaultColor);\n ctx.lineCap = valueOrDefault(legendItem.lineCap, 'butt');\n ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, 0);\n ctx.lineJoin = valueOrDefault(legendItem.lineJoin, 'miter');\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, defaultColor);\n\n ctx.setLineDash(valueOrDefault(legendItem.lineDash, []));\n\n if (labelOpts.usePointStyle) {\n // Recalculate x and y for drawPoint() because its expecting\n // x and y to be center of figure (instead of top left)\n const drawOptions = {\n radius: boxHeight * Math.SQRT2 / 2,\n pointStyle: legendItem.pointStyle,\n rotation: legendItem.rotation,\n borderWidth: lineWidth\n };\n const centerX = rtlHelper.xPlus(x, boxWidth / 2);\n const centerY = y + halfFontSize;\n\n // Draw pointStyle as legend symbol\n drawPointLegend(ctx, drawOptions, centerX, centerY, labelOpts.pointStyleWidth && boxWidth);\n } else {\n // Draw box as legend symbol\n // Adjust position when boxHeight < fontSize (want it centered)\n const yBoxTop = y + Math.max((fontSize - boxHeight) / 2, 0);\n const xBoxLeft = rtlHelper.leftForLtr(x, boxWidth);\n const borderRadius = toTRBLCorners(legendItem.borderRadius);\n\n ctx.beginPath();\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n addRoundedRectPath(ctx, {\n x: xBoxLeft,\n y: yBoxTop,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius,\n });\n } else {\n ctx.rect(xBoxLeft, yBoxTop, boxWidth, boxHeight);\n }\n\n ctx.fill();\n if (lineWidth !== 0) {\n ctx.stroke();\n }\n }\n\n ctx.restore();\n };\n\n const fillText = function(x, y, legendItem) {\n renderText(ctx, legendItem.text, x, y + (itemHeight / 2), labelFont, {\n strikethrough: legendItem.hidden,\n textAlign: rtlHelper.textAlign(legendItem.textAlign)\n });\n };\n\n // Horizontal\n const isHorizontal = this.isHorizontal();\n const titleHeight = this._computeTitleHeight();\n if (isHorizontal) {\n cursor = {\n x: _alignStartEnd(align, this.left + padding, this.right - lineWidths[0]),\n y: this.top + padding + titleHeight,\n line: 0\n };\n } else {\n cursor = {\n x: this.left + padding,\n y: _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[0].height),\n line: 0\n };\n }\n\n overrideTextDirection(this.ctx, opts.textDirection);\n\n const lineHeight = itemHeight + padding;\n this.legendItems.forEach((legendItem, i) => {\n ctx.strokeStyle = legendItem.fontColor; // for strikethrough effect\n ctx.fillStyle = legendItem.fontColor; // render in correct colour\n\n const textWidth = ctx.measureText(legendItem.text).width;\n const textAlign = rtlHelper.textAlign(legendItem.textAlign || (legendItem.textAlign = labelOpts.textAlign));\n const width = boxWidth + halfFontSize + textWidth;\n let x = cursor.x;\n let y = cursor.y;\n\n rtlHelper.setWidth(this.width);\n\n if (isHorizontal) {\n if (i > 0 && x + width + padding > this.right) {\n y = cursor.y += lineHeight;\n cursor.line++;\n x = cursor.x = _alignStartEnd(align, this.left + padding, this.right - lineWidths[cursor.line]);\n }\n } else if (i > 0 && y + lineHeight > this.bottom) {\n x = cursor.x = x + columnSizes[cursor.line].width + padding;\n cursor.line++;\n y = cursor.y = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[cursor.line].height);\n }\n\n const realX = rtlHelper.x(x);\n\n drawLegendBox(realX, y, legendItem);\n\n x = _textX(textAlign, x + boxWidth + halfFontSize, isHorizontal ? x + width : this.right, opts.rtl);\n\n // Fill the actual label\n fillText(rtlHelper.x(x), y, legendItem);\n\n if (isHorizontal) {\n cursor.x += width + padding;\n } else if (typeof legendItem.text !== 'string') {\n const fontLineHeight = labelFont.lineHeight;\n cursor.y += calculateLegendItemHeight(legendItem, fontLineHeight) + padding;\n } else {\n cursor.y += lineHeight;\n }\n });\n\n restoreTextDirection(this.ctx, opts.textDirection);\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {\n const opts = this.options;\n const titleOpts = opts.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n\n if (!titleOpts.display) {\n return;\n }\n\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const ctx = this.ctx;\n const position = titleOpts.position;\n const halfFontSize = titleFont.size / 2;\n const topPaddingPlusHalfFontSize = titlePadding.top + halfFontSize;\n let y;\n\n // These defaults are used when the legend is vertical.\n // When horizontal, they are computed below.\n let left = this.left;\n let maxWidth = this.width;\n\n if (this.isHorizontal()) {\n // Move left / right so that the title is above the legend lines\n maxWidth = Math.max(...this.lineWidths);\n y = this.top + topPaddingPlusHalfFontSize;\n left = _alignStartEnd(opts.align, left, this.right - maxWidth);\n } else {\n // Move down so that the title is above the legend stack in every alignment\n const maxHeight = this.columnSizes.reduce((acc, size) => Math.max(acc, size.height), 0);\n y = topPaddingPlusHalfFontSize + _alignStartEnd(opts.align, this.top, this.bottom - maxHeight - opts.labels.padding - this._computeTitleHeight());\n }\n\n // Now that we know the left edge of the inner legend box, compute the correct\n // X coordinate from the title alignment\n const x = _alignStartEnd(position, left, left + maxWidth);\n\n // Canvas setup\n ctx.textAlign = rtlHelper.textAlign(_toLeftRightCenter(position));\n ctx.textBaseline = 'middle';\n ctx.strokeStyle = titleOpts.color;\n ctx.fillStyle = titleOpts.color;\n ctx.font = titleFont.string;\n\n renderText(ctx, titleOpts.text, x, y, titleFont);\n }\n\n /**\n\t * @private\n\t */\n _computeTitleHeight() {\n const titleOpts = this.options.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n return titleOpts.display ? titleFont.lineHeight + titlePadding.height : 0;\n }\n\n /**\n\t * @private\n\t */\n _getLegendItemAt(x, y) {\n let i, hitBox, lh;\n\n if (_isBetween(x, this.left, this.right)\n && _isBetween(y, this.top, this.bottom)) {\n // See if we are touching one of the dataset boxes\n lh = this.legendHitBoxes;\n for (i = 0; i < lh.length; ++i) {\n hitBox = lh[i];\n\n if (_isBetween(x, hitBox.left, hitBox.left + hitBox.width)\n && _isBetween(y, hitBox.top, hitBox.top + hitBox.height)) {\n // Touching an element\n return this.legendItems[i];\n }\n }\n }\n\n return null;\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e - The event to handle\n\t */\n handleEvent(e) {\n const opts = this.options;\n if (!isListened(e.type, opts)) {\n return;\n }\n\n // Chart event already has relative position in it\n const hoveredItem = this._getLegendItemAt(e.x, e.y);\n\n if (e.type === 'mousemove' || e.type === 'mouseout') {\n const previous = this._hoveredItem;\n const sameItem = itemsEqual(previous, hoveredItem);\n if (previous && !sameItem) {\n call(opts.onLeave, [e, previous, this], this);\n }\n\n this._hoveredItem = hoveredItem;\n\n if (hoveredItem && !sameItem) {\n call(opts.onHover, [e, hoveredItem, this], this);\n }\n } else if (hoveredItem) {\n call(opts.onClick, [e, hoveredItem, this], this);\n }\n }\n}\n\nfunction calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight) {\n const itemWidth = calculateItemWidth(legendItem, boxWidth, labelFont, ctx);\n const itemHeight = calculateItemHeight(_itemHeight, legendItem, labelFont.lineHeight);\n return {itemWidth, itemHeight};\n}\n\nfunction calculateItemWidth(legendItem, boxWidth, labelFont, ctx) {\n let legendItemText = legendItem.text;\n if (legendItemText && typeof legendItemText !== 'string') {\n legendItemText = legendItemText.reduce((a, b) => a.length > b.length ? a : b);\n }\n return boxWidth + (labelFont.size / 2) + ctx.measureText(legendItemText).width;\n}\n\nfunction calculateItemHeight(_itemHeight, legendItem, fontLineHeight) {\n let itemHeight = _itemHeight;\n if (typeof legendItem.text !== 'string') {\n itemHeight = calculateLegendItemHeight(legendItem, fontLineHeight);\n }\n return itemHeight;\n}\n\nfunction calculateLegendItemHeight(legendItem, fontLineHeight) {\n const labelHeight = legendItem.text ? legendItem.text.length : 0;\n return fontLineHeight * labelHeight;\n}\n\nfunction isListened(type, opts) {\n if ((type === 'mousemove' || type === 'mouseout') && (opts.onHover || opts.onLeave)) {\n return true;\n }\n if (opts.onClick && (type === 'click' || type === 'mouseup')) {\n return true;\n }\n return false;\n}\n\nexport default {\n id: 'legend',\n\n /**\n\t * For tests\n\t * @private\n\t */\n _element: Legend,\n\n start(chart, _args, options) {\n const legend = chart.legend = new Legend({ctx: chart.ctx, options, chart});\n layouts.configure(chart, legend, options);\n layouts.addBox(chart, legend);\n },\n\n stop(chart) {\n layouts.removeBox(chart, chart.legend);\n delete chart.legend;\n },\n\n // During the beforeUpdate step, the layout configuration needs to run\n // This ensures that if the legend position changes (via an option update)\n // the layout system respects the change. See https://github.com/chartjs/Chart.js/issues/7527\n beforeUpdate(chart, _args, options) {\n const legend = chart.legend;\n layouts.configure(chart, legend, options);\n legend.options = options;\n },\n\n // The labels need to be built after datasets are updated to ensure that colors\n // and other styling are correct. See https://github.com/chartjs/Chart.js/issues/6968\n afterUpdate(chart) {\n const legend = chart.legend;\n legend.buildLabels();\n legend.adjustHitBoxes();\n },\n\n\n afterEvent(chart, args) {\n if (!args.replay) {\n chart.legend.handleEvent(args.event);\n }\n },\n\n defaults: {\n display: true,\n position: 'top',\n align: 'center',\n fullSize: true,\n reverse: false,\n weight: 1000,\n\n // a callback that will handle\n onClick(e, legendItem, legend) {\n const index = legendItem.datasetIndex;\n const ci = legend.chart;\n if (ci.isDatasetVisible(index)) {\n ci.hide(index);\n legendItem.hidden = true;\n } else {\n ci.show(index);\n legendItem.hidden = false;\n }\n },\n\n onHover: null,\n onLeave: null,\n\n labels: {\n color: (ctx) => ctx.chart.options.color,\n boxWidth: 40,\n padding: 10,\n // Generates labels shown in the legend\n // Valid properties to return:\n // text : text to display\n // fillStyle : fill of coloured box\n // strokeStyle: stroke of coloured box\n // hidden : if this legend item refers to a hidden item\n // lineCap : cap style for line\n // lineDash\n // lineDashOffset :\n // lineJoin :\n // lineWidth :\n generateLabels(chart) {\n const datasets = chart.data.datasets;\n const {labels: {usePointStyle, pointStyle, textAlign, color, useBorderRadius, borderRadius}} = chart.legend.options;\n\n return chart._getSortedDatasetMetas().map((meta) => {\n const style = meta.controller.getStyle(usePointStyle ? 0 : undefined);\n const borderWidth = toPadding(style.borderWidth);\n\n return {\n text: datasets[meta.index].label,\n fillStyle: style.backgroundColor,\n fontColor: color,\n hidden: !meta.visible,\n lineCap: style.borderCapStyle,\n lineDash: style.borderDash,\n lineDashOffset: style.borderDashOffset,\n lineJoin: style.borderJoinStyle,\n lineWidth: (borderWidth.width + borderWidth.height) / 4,\n strokeStyle: style.borderColor,\n pointStyle: pointStyle || style.pointStyle,\n rotation: style.rotation,\n textAlign: textAlign || style.textAlign,\n borderRadius: useBorderRadius && (borderRadius || style.borderRadius),\n\n // Below is extra data used for toggling the datasets\n datasetIndex: meta.index\n };\n }, this);\n }\n },\n\n title: {\n color: (ctx) => ctx.chart.options.color,\n display: false,\n position: 'center',\n text: '',\n }\n },\n\n descriptors: {\n _scriptable: (name) => !name.startsWith('on'),\n labels: {\n _scriptable: (name) => !['generateLabels', 'filter', 'sort'].includes(name),\n }\n },\n};\n","import {Title} from './plugin.title.js';\nimport layouts from '../core/core.layouts.js';\n\nconst map = new WeakMap();\n\nexport default {\n id: 'subtitle',\n\n start(chart, _args, options) {\n const title = new Title({\n ctx: chart.ctx,\n options,\n chart\n });\n\n layouts.configure(chart, title, options);\n layouts.addBox(chart, title);\n map.set(chart, title);\n },\n\n stop(chart) {\n layouts.removeBox(chart, map.get(chart));\n map.delete(chart);\n },\n\n beforeUpdate(chart, _args, options) {\n const title = map.get(chart);\n layouts.configure(chart, title, options);\n title.options = options;\n },\n\n defaults: {\n align: 'center',\n display: false,\n font: {\n weight: 'normal',\n },\n fullSize: true,\n padding: 0,\n position: 'top',\n text: '',\n weight: 1500 // by default greater than legend (1000) and smaller than title (2000)\n },\n\n defaultRoutes: {\n color: 'color'\n },\n\n descriptors: {\n _scriptable: true,\n _indexable: false,\n },\n};\n","import Animations from '../core/core.animations.js';\nimport Element from '../core/core.element.js';\nimport {addRoundedRectPath} from '../helpers/helpers.canvas.js';\nimport {each, noop, isNullOrUndef, isArray, _elementsEqual, isObject} from '../helpers/helpers.core.js';\nimport {toFont, toPadding, toTRBLCorners} from '../helpers/helpers.options.js';\nimport {getRtlAdapter, overrideTextDirection, restoreTextDirection} from '../helpers/helpers.rtl.js';\nimport {distanceBetweenPoints, _limitValue} from '../helpers/helpers.math.js';\nimport {createContext, drawPoint} from '../helpers/index.js';\n\n/**\n * @typedef { import('../platform/platform.base.js').Chart } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../types/index.js').ActiveElement } ActiveElement\n * @typedef { import('../core/core.interaction.js').InteractionItem } InteractionItem\n */\n\nconst positioners = {\n /**\n\t * Average mode places the tooltip at the average position of the elements shown\n\t */\n average(items) {\n if (!items.length) {\n return false;\n }\n\n let i, len;\n let xSet = new Set();\n let y = 0;\n let count = 0;\n\n for (i = 0, len = items.length; i < len; ++i) {\n const el = items[i].element;\n if (el && el.hasValue()) {\n const pos = el.tooltipPosition();\n xSet.add(pos.x);\n y += pos.y;\n ++count;\n }\n }\n\n // No visible items where found, return false so we don't have to divide by 0 which reduces in NaN\n if (count === 0 || xSet.size === 0) {\n return false;\n }\n\n const xAverage = [...xSet].reduce((a, b) => a + b) / xSet.size;\n\n return {\n x: xAverage,\n y: y / count\n };\n },\n\n /**\n\t * Gets the tooltip position nearest of the item nearest to the event position\n\t */\n nearest(items, eventPosition) {\n if (!items.length) {\n return false;\n }\n\n let x = eventPosition.x;\n let y = eventPosition.y;\n let minDistance = Number.POSITIVE_INFINITY;\n let i, len, nearestElement;\n\n for (i = 0, len = items.length; i < len; ++i) {\n const el = items[i].element;\n if (el && el.hasValue()) {\n const center = el.getCenterPoint();\n const d = distanceBetweenPoints(eventPosition, center);\n\n if (d < minDistance) {\n minDistance = d;\n nearestElement = el;\n }\n }\n }\n\n if (nearestElement) {\n const tp = nearestElement.tooltipPosition();\n x = tp.x;\n y = tp.y;\n }\n\n return {\n x,\n y\n };\n }\n};\n\n// Helper to push or concat based on if the 2nd parameter is an array or not\nfunction pushOrConcat(base, toPush) {\n if (toPush) {\n if (isArray(toPush)) {\n // base = base.concat(toPush);\n Array.prototype.push.apply(base, toPush);\n } else {\n base.push(toPush);\n }\n }\n\n return base;\n}\n\n/**\n * Returns array of strings split by newline\n * @param {*} str - The value to split by newline.\n * @returns {string|string[]} value if newline present - Returned from String split() method\n * @function\n */\nfunction splitNewlines(str) {\n if ((typeof str === 'string' || str instanceof String) && str.indexOf('\\n') > -1) {\n return str.split('\\n');\n }\n return str;\n}\n\n\n/**\n * Private helper to create a tooltip item model\n * @param {Chart} chart\n * @param {ActiveElement} item - {element, index, datasetIndex} to create the tooltip item for\n * @return new tooltip item\n */\nfunction createTooltipItem(chart, item) {\n const {element, datasetIndex, index} = item;\n const controller = chart.getDatasetMeta(datasetIndex).controller;\n const {label, value} = controller.getLabelAndValue(index);\n\n return {\n chart,\n label,\n parsed: controller.getParsed(index),\n raw: chart.data.datasets[datasetIndex].data[index],\n formattedValue: value,\n dataset: controller.getDataset(),\n dataIndex: index,\n datasetIndex,\n element\n };\n}\n\n/**\n * Get the size of the tooltip\n */\nfunction getTooltipSize(tooltip, options) {\n const ctx = tooltip.chart.ctx;\n const {body, footer, title} = tooltip;\n const {boxWidth, boxHeight} = options;\n const bodyFont = toFont(options.bodyFont);\n const titleFont = toFont(options.titleFont);\n const footerFont = toFont(options.footerFont);\n const titleLineCount = title.length;\n const footerLineCount = footer.length;\n const bodyLineItemCount = body.length;\n\n const padding = toPadding(options.padding);\n let height = padding.height;\n let width = 0;\n\n // Count of all lines in the body\n let combinedBodyLength = body.reduce((count, bodyItem) => count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length, 0);\n combinedBodyLength += tooltip.beforeBody.length + tooltip.afterBody.length;\n\n if (titleLineCount) {\n height += titleLineCount * titleFont.lineHeight\n\t\t\t+ (titleLineCount - 1) * options.titleSpacing\n\t\t\t+ options.titleMarginBottom;\n }\n if (combinedBodyLength) {\n // Body lines may include some extra height depending on boxHeight\n const bodyLineHeight = options.displayColors ? Math.max(boxHeight, bodyFont.lineHeight) : bodyFont.lineHeight;\n height += bodyLineItemCount * bodyLineHeight\n\t\t\t+ (combinedBodyLength - bodyLineItemCount) * bodyFont.lineHeight\n\t\t\t+ (combinedBodyLength - 1) * options.bodySpacing;\n }\n if (footerLineCount) {\n height += options.footerMarginTop\n\t\t\t+ footerLineCount * footerFont.lineHeight\n\t\t\t+ (footerLineCount - 1) * options.footerSpacing;\n }\n\n // Title width\n let widthPadding = 0;\n const maxLineWidth = function(line) {\n width = Math.max(width, ctx.measureText(line).width + widthPadding);\n };\n\n ctx.save();\n\n ctx.font = titleFont.string;\n each(tooltip.title, maxLineWidth);\n\n // Body width\n ctx.font = bodyFont.string;\n each(tooltip.beforeBody.concat(tooltip.afterBody), maxLineWidth);\n\n // Body lines may include some extra width due to the color box\n widthPadding = options.displayColors ? (boxWidth + 2 + options.boxPadding) : 0;\n each(body, (bodyItem) => {\n each(bodyItem.before, maxLineWidth);\n each(bodyItem.lines, maxLineWidth);\n each(bodyItem.after, maxLineWidth);\n });\n\n // Reset back to 0\n widthPadding = 0;\n\n // Footer width\n ctx.font = footerFont.string;\n each(tooltip.footer, maxLineWidth);\n\n ctx.restore();\n\n // Add padding\n width += padding.width;\n\n return {width, height};\n}\n\nfunction determineYAlign(chart, size) {\n const {y, height} = size;\n\n if (y < height / 2) {\n return 'top';\n } else if (y > (chart.height - height / 2)) {\n return 'bottom';\n }\n return 'center';\n}\n\nfunction doesNotFitWithAlign(xAlign, chart, options, size) {\n const {x, width} = size;\n const caret = options.caretSize + options.caretPadding;\n if (xAlign === 'left' && x + width + caret > chart.width) {\n return true;\n }\n\n if (xAlign === 'right' && x - width - caret < 0) {\n return true;\n }\n}\n\nfunction determineXAlign(chart, options, size, yAlign) {\n const {x, width} = size;\n const {width: chartWidth, chartArea: {left, right}} = chart;\n let xAlign = 'center';\n\n if (yAlign === 'center') {\n xAlign = x <= (left + right) / 2 ? 'left' : 'right';\n } else if (x <= width / 2) {\n xAlign = 'left';\n } else if (x >= chartWidth - width / 2) {\n xAlign = 'right';\n }\n\n if (doesNotFitWithAlign(xAlign, chart, options, size)) {\n xAlign = 'center';\n }\n\n return xAlign;\n}\n\n/**\n * Helper to get the alignment of a tooltip given the size\n */\nfunction determineAlignment(chart, options, size) {\n const yAlign = size.yAlign || options.yAlign || determineYAlign(chart, size);\n\n return {\n xAlign: size.xAlign || options.xAlign || determineXAlign(chart, options, size, yAlign),\n yAlign\n };\n}\n\nfunction alignX(size, xAlign) {\n let {x, width} = size;\n if (xAlign === 'right') {\n x -= width;\n } else if (xAlign === 'center') {\n x -= (width / 2);\n }\n return x;\n}\n\nfunction alignY(size, yAlign, paddingAndSize) {\n // eslint-disable-next-line prefer-const\n let {y, height} = size;\n if (yAlign === 'top') {\n y += paddingAndSize;\n } else if (yAlign === 'bottom') {\n y -= height + paddingAndSize;\n } else {\n y -= (height / 2);\n }\n return y;\n}\n\n/**\n * Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment\n */\nfunction getBackgroundPoint(options, size, alignment, chart) {\n const {caretSize, caretPadding, cornerRadius} = options;\n const {xAlign, yAlign} = alignment;\n const paddingAndSize = caretSize + caretPadding;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\n\n let x = alignX(size, xAlign);\n const y = alignY(size, yAlign, paddingAndSize);\n\n if (yAlign === 'center') {\n if (xAlign === 'left') {\n x += paddingAndSize;\n } else if (xAlign === 'right') {\n x -= paddingAndSize;\n }\n } else if (xAlign === 'left') {\n x -= Math.max(topLeft, bottomLeft) + caretSize;\n } else if (xAlign === 'right') {\n x += Math.max(topRight, bottomRight) + caretSize;\n }\n\n return {\n x: _limitValue(x, 0, chart.width - size.width),\n y: _limitValue(y, 0, chart.height - size.height)\n };\n}\n\nfunction getAlignedX(tooltip, align, options) {\n const padding = toPadding(options.padding);\n\n return align === 'center'\n ? tooltip.x + tooltip.width / 2\n : align === 'right'\n ? tooltip.x + tooltip.width - padding.right\n : tooltip.x + padding.left;\n}\n\n/**\n * Helper to build before and after body lines\n */\nfunction getBeforeAfterBodyLines(callback) {\n return pushOrConcat([], splitNewlines(callback));\n}\n\nfunction createTooltipContext(parent, tooltip, tooltipItems) {\n return createContext(parent, {\n tooltip,\n tooltipItems,\n type: 'tooltip'\n });\n}\n\nfunction overrideCallbacks(callbacks, context) {\n const override = context && context.dataset && context.dataset.tooltip && context.dataset.tooltip.callbacks;\n return override ? callbacks.override(override) : callbacks;\n}\n\nconst defaultCallbacks = {\n // Args are: (tooltipItems, data)\n beforeTitle: noop,\n title(tooltipItems) {\n if (tooltipItems.length > 0) {\n const item = tooltipItems[0];\n const labels = item.chart.data.labels;\n const labelCount = labels ? labels.length : 0;\n\n if (this && this.options && this.options.mode === 'dataset') {\n return item.dataset.label || '';\n } else if (item.label) {\n return item.label;\n } else if (labelCount > 0 && item.dataIndex < labelCount) {\n return labels[item.dataIndex];\n }\n }\n\n return '';\n },\n afterTitle: noop,\n\n // Args are: (tooltipItems, data)\n beforeBody: noop,\n\n // Args are: (tooltipItem, data)\n beforeLabel: noop,\n label(tooltipItem) {\n if (this && this.options && this.options.mode === 'dataset') {\n return tooltipItem.label + ': ' + tooltipItem.formattedValue || tooltipItem.formattedValue;\n }\n\n let label = tooltipItem.dataset.label || '';\n\n if (label) {\n label += ': ';\n }\n const value = tooltipItem.formattedValue;\n if (!isNullOrUndef(value)) {\n label += value;\n }\n return label;\n },\n labelColor(tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n borderColor: options.borderColor,\n backgroundColor: options.backgroundColor,\n borderWidth: options.borderWidth,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderRadius: 0,\n };\n },\n labelTextColor() {\n return this.options.bodyColor;\n },\n labelPointStyle(tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n pointStyle: options.pointStyle,\n rotation: options.rotation,\n };\n },\n afterLabel: noop,\n\n // Args are: (tooltipItems, data)\n afterBody: noop,\n\n // Args are: (tooltipItems, data)\n beforeFooter: noop,\n footer: noop,\n afterFooter: noop\n};\n\n/**\n * Invoke callback from object with context and arguments.\n * If callback returns `undefined`, then will be invoked default callback.\n * @param {Record} callbacks\n * @param {keyof typeof defaultCallbacks} name\n * @param {*} ctx\n * @param {*} arg\n * @returns {any}\n */\nfunction invokeCallbackWithFallback(callbacks, name, ctx, arg) {\n const result = callbacks[name].call(ctx, arg);\n\n if (typeof result === 'undefined') {\n return defaultCallbacks[name].call(ctx, arg);\n }\n\n return result;\n}\n\nexport class Tooltip extends Element {\n\n /**\n * @namespace Chart.Tooltip.positioners\n */\n static positioners = positioners;\n\n constructor(config) {\n super();\n\n this.opacity = 0;\n this._active = [];\n this._eventPosition = undefined;\n this._size = undefined;\n this._cachedAnimations = undefined;\n this._tooltipItems = [];\n this.$animations = undefined;\n this.$context = undefined;\n this.chart = config.chart;\n this.options = config.options;\n this.dataPoints = undefined;\n this.title = undefined;\n this.beforeBody = undefined;\n this.body = undefined;\n this.afterBody = undefined;\n this.footer = undefined;\n this.xAlign = undefined;\n this.yAlign = undefined;\n this.x = undefined;\n this.y = undefined;\n this.height = undefined;\n this.width = undefined;\n this.caretX = undefined;\n this.caretY = undefined;\n // TODO: V4, make this private, rename to `_labelStyles`, and combine with `labelPointStyles`\n // and `labelTextColors` to create a single variable\n this.labelColors = undefined;\n this.labelPointStyles = undefined;\n this.labelTextColors = undefined;\n }\n\n initialize(options) {\n this.options = options;\n this._cachedAnimations = undefined;\n this.$context = undefined;\n }\n\n /**\n\t * @private\n\t */\n _resolveAnimations() {\n const cached = this._cachedAnimations;\n\n if (cached) {\n return cached;\n }\n\n const chart = this.chart;\n const options = this.options.setContext(this.getContext());\n const opts = options.enabled && chart.options.animation && options.animations;\n const animations = new Animations(this.chart, opts);\n if (opts._cacheable) {\n this._cachedAnimations = Object.freeze(animations);\n }\n\n return animations;\n }\n\n /**\n\t * @protected\n\t */\n getContext() {\n return this.$context ||\n\t\t\t(this.$context = createTooltipContext(this.chart.getContext(), this, this._tooltipItems));\n }\n\n getTitle(context, options) {\n const {callbacks} = options;\n\n const beforeTitle = invokeCallbackWithFallback(callbacks, 'beforeTitle', this, context);\n const title = invokeCallbackWithFallback(callbacks, 'title', this, context);\n const afterTitle = invokeCallbackWithFallback(callbacks, 'afterTitle', this, context);\n\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeTitle));\n lines = pushOrConcat(lines, splitNewlines(title));\n lines = pushOrConcat(lines, splitNewlines(afterTitle));\n\n return lines;\n }\n\n getBeforeBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(\n invokeCallbackWithFallback(options.callbacks, 'beforeBody', this, tooltipItems)\n );\n }\n\n getBody(tooltipItems, options) {\n const {callbacks} = options;\n const bodyItems = [];\n\n each(tooltipItems, (context) => {\n const bodyItem = {\n before: [],\n lines: [],\n after: []\n };\n const scoped = overrideCallbacks(callbacks, context);\n pushOrConcat(bodyItem.before, splitNewlines(invokeCallbackWithFallback(scoped, 'beforeLabel', this, context)));\n pushOrConcat(bodyItem.lines, invokeCallbackWithFallback(scoped, 'label', this, context));\n pushOrConcat(bodyItem.after, splitNewlines(invokeCallbackWithFallback(scoped, 'afterLabel', this, context)));\n\n bodyItems.push(bodyItem);\n });\n\n return bodyItems;\n }\n\n getAfterBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(\n invokeCallbackWithFallback(options.callbacks, 'afterBody', this, tooltipItems)\n );\n }\n\n // Get the footer and beforeFooter and afterFooter lines\n getFooter(tooltipItems, options) {\n const {callbacks} = options;\n\n const beforeFooter = invokeCallbackWithFallback(callbacks, 'beforeFooter', this, tooltipItems);\n const footer = invokeCallbackWithFallback(callbacks, 'footer', this, tooltipItems);\n const afterFooter = invokeCallbackWithFallback(callbacks, 'afterFooter', this, tooltipItems);\n\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeFooter));\n lines = pushOrConcat(lines, splitNewlines(footer));\n lines = pushOrConcat(lines, splitNewlines(afterFooter));\n\n return lines;\n }\n\n /**\n\t * @private\n\t */\n _createItems(options) {\n const active = this._active;\n const data = this.chart.data;\n const labelColors = [];\n const labelPointStyles = [];\n const labelTextColors = [];\n let tooltipItems = [];\n let i, len;\n\n for (i = 0, len = active.length; i < len; ++i) {\n tooltipItems.push(createTooltipItem(this.chart, active[i]));\n }\n\n // If the user provided a filter function, use it to modify the tooltip items\n if (options.filter) {\n tooltipItems = tooltipItems.filter((element, index, array) => options.filter(element, index, array, data));\n }\n\n // If the user provided a sorting function, use it to modify the tooltip items\n if (options.itemSort) {\n tooltipItems = tooltipItems.sort((a, b) => options.itemSort(a, b, data));\n }\n\n // Determine colors for boxes\n each(tooltipItems, (context) => {\n const scoped = overrideCallbacks(options.callbacks, context);\n labelColors.push(invokeCallbackWithFallback(scoped, 'labelColor', this, context));\n labelPointStyles.push(invokeCallbackWithFallback(scoped, 'labelPointStyle', this, context));\n labelTextColors.push(invokeCallbackWithFallback(scoped, 'labelTextColor', this, context));\n });\n\n this.labelColors = labelColors;\n this.labelPointStyles = labelPointStyles;\n this.labelTextColors = labelTextColors;\n this.dataPoints = tooltipItems;\n return tooltipItems;\n }\n\n update(changed, replay) {\n const options = this.options.setContext(this.getContext());\n const active = this._active;\n let properties;\n let tooltipItems = [];\n\n if (!active.length) {\n if (this.opacity !== 0) {\n properties = {\n opacity: 0\n };\n }\n } else {\n const position = positioners[options.position].call(this, active, this._eventPosition);\n tooltipItems = this._createItems(options);\n\n this.title = this.getTitle(tooltipItems, options);\n this.beforeBody = this.getBeforeBody(tooltipItems, options);\n this.body = this.getBody(tooltipItems, options);\n this.afterBody = this.getAfterBody(tooltipItems, options);\n this.footer = this.getFooter(tooltipItems, options);\n\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, size);\n const alignment = determineAlignment(this.chart, options, positionAndSize);\n const backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, this.chart);\n\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n\n properties = {\n opacity: 1,\n x: backgroundPoint.x,\n y: backgroundPoint.y,\n width: size.width,\n height: size.height,\n caretX: position.x,\n caretY: position.y\n };\n }\n\n this._tooltipItems = tooltipItems;\n this.$context = undefined;\n\n if (properties) {\n this._resolveAnimations().update(this, properties);\n }\n\n if (changed && options.external) {\n options.external.call(this, {chart: this.chart, tooltip: this, replay});\n }\n }\n\n drawCaret(tooltipPoint, ctx, size, options) {\n const caretPosition = this.getCaretPosition(tooltipPoint, size, options);\n\n ctx.lineTo(caretPosition.x1, caretPosition.y1);\n ctx.lineTo(caretPosition.x2, caretPosition.y2);\n ctx.lineTo(caretPosition.x3, caretPosition.y3);\n }\n\n getCaretPosition(tooltipPoint, size, options) {\n const {xAlign, yAlign} = this;\n const {caretSize, cornerRadius} = options;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\n const {x: ptX, y: ptY} = tooltipPoint;\n const {width, height} = size;\n let x1, x2, x3, y1, y2, y3;\n\n if (yAlign === 'center') {\n y2 = ptY + (height / 2);\n\n if (xAlign === 'left') {\n x1 = ptX;\n x2 = x1 - caretSize;\n\n // Left draws bottom -> top, this y1 is on the bottom\n y1 = y2 + caretSize;\n y3 = y2 - caretSize;\n } else {\n x1 = ptX + width;\n x2 = x1 + caretSize;\n\n // Right draws top -> bottom, thus y1 is on the top\n y1 = y2 - caretSize;\n y3 = y2 + caretSize;\n }\n\n x3 = x1;\n } else {\n if (xAlign === 'left') {\n x2 = ptX + Math.max(topLeft, bottomLeft) + (caretSize);\n } else if (xAlign === 'right') {\n x2 = ptX + width - Math.max(topRight, bottomRight) - caretSize;\n } else {\n x2 = this.caretX;\n }\n\n if (yAlign === 'top') {\n y1 = ptY;\n y2 = y1 - caretSize;\n\n // Top draws left -> right, thus x1 is on the left\n x1 = x2 - caretSize;\n x3 = x2 + caretSize;\n } else {\n y1 = ptY + height;\n y2 = y1 + caretSize;\n\n // Bottom draws right -> left, thus x1 is on the right\n x1 = x2 + caretSize;\n x3 = x2 - caretSize;\n }\n y3 = y1;\n }\n return {x1, x2, x3, y1, y2, y3};\n }\n\n drawTitle(pt, ctx, options) {\n const title = this.title;\n const length = title.length;\n let titleFont, titleSpacing, i;\n\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n pt.x = getAlignedX(this, options.titleAlign, options);\n\n ctx.textAlign = rtlHelper.textAlign(options.titleAlign);\n ctx.textBaseline = 'middle';\n\n titleFont = toFont(options.titleFont);\n titleSpacing = options.titleSpacing;\n\n ctx.fillStyle = options.titleColor;\n ctx.font = titleFont.string;\n\n for (i = 0; i < length; ++i) {\n ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFont.lineHeight / 2);\n pt.y += titleFont.lineHeight + titleSpacing; // Line Height and spacing\n\n if (i + 1 === length) {\n pt.y += options.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing\n }\n }\n }\n }\n\n /**\n\t * @private\n\t */\n _drawColorBox(ctx, pt, i, rtlHelper, options) {\n const labelColor = this.labelColors[i];\n const labelPointStyle = this.labelPointStyles[i];\n const {boxHeight, boxWidth} = options;\n const bodyFont = toFont(options.bodyFont);\n const colorX = getAlignedX(this, 'left', options);\n const rtlColorX = rtlHelper.x(colorX);\n const yOffSet = boxHeight < bodyFont.lineHeight ? (bodyFont.lineHeight - boxHeight) / 2 : 0;\n const colorY = pt.y + yOffSet;\n\n if (options.usePointStyle) {\n const drawOptions = {\n radius: Math.min(boxWidth, boxHeight) / 2, // fit the circle in the box\n pointStyle: labelPointStyle.pointStyle,\n rotation: labelPointStyle.rotation,\n borderWidth: 1\n };\n // Recalculate x and y for drawPoint() because its expecting\n // x and y to be center of figure (instead of top left)\n const centerX = rtlHelper.leftForLtr(rtlColorX, boxWidth) + boxWidth / 2;\n const centerY = colorY + boxHeight / 2;\n\n // Fill the point with white so that colours merge nicely if the opacity is < 1\n ctx.strokeStyle = options.multiKeyBackground;\n ctx.fillStyle = options.multiKeyBackground;\n drawPoint(ctx, drawOptions, centerX, centerY);\n\n // Draw the point\n ctx.strokeStyle = labelColor.borderColor;\n ctx.fillStyle = labelColor.backgroundColor;\n drawPoint(ctx, drawOptions, centerX, centerY);\n } else {\n // Border\n ctx.lineWidth = isObject(labelColor.borderWidth) ? Math.max(...Object.values(labelColor.borderWidth)) : (labelColor.borderWidth || 1); // TODO, v4 remove fallback\n ctx.strokeStyle = labelColor.borderColor;\n ctx.setLineDash(labelColor.borderDash || []);\n ctx.lineDashOffset = labelColor.borderDashOffset || 0;\n\n // Fill a white rect so that colours merge nicely if the opacity is < 1\n const outerX = rtlHelper.leftForLtr(rtlColorX, boxWidth);\n const innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - 2);\n const borderRadius = toTRBLCorners(labelColor.borderRadius);\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n ctx.beginPath();\n ctx.fillStyle = options.multiKeyBackground;\n addRoundedRectPath(ctx, {\n x: outerX,\n y: colorY,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius,\n });\n ctx.fill();\n ctx.stroke();\n\n // Inner square\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: innerX,\n y: colorY + 1,\n w: boxWidth - 2,\n h: boxHeight - 2,\n radius: borderRadius,\n });\n ctx.fill();\n } else {\n // Normal rect\n ctx.fillStyle = options.multiKeyBackground;\n ctx.fillRect(outerX, colorY, boxWidth, boxHeight);\n ctx.strokeRect(outerX, colorY, boxWidth, boxHeight);\n // Inner square\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.fillRect(innerX, colorY + 1, boxWidth - 2, boxHeight - 2);\n }\n }\n\n // restore fillStyle\n ctx.fillStyle = this.labelTextColors[i];\n }\n\n drawBody(pt, ctx, options) {\n const {body} = this;\n const {bodySpacing, bodyAlign, displayColors, boxHeight, boxWidth, boxPadding} = options;\n const bodyFont = toFont(options.bodyFont);\n let bodyLineHeight = bodyFont.lineHeight;\n let xLinePadding = 0;\n\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n const fillLineOfText = function(line) {\n ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyLineHeight / 2);\n pt.y += bodyLineHeight + bodySpacing;\n };\n\n const bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);\n let bodyItem, textColor, lines, i, j, ilen, jlen;\n\n ctx.textAlign = bodyAlign;\n ctx.textBaseline = 'middle';\n ctx.font = bodyFont.string;\n\n pt.x = getAlignedX(this, bodyAlignForCalculation, options);\n\n // Before body lines\n ctx.fillStyle = options.bodyColor;\n each(this.beforeBody, fillLineOfText);\n\n xLinePadding = displayColors && bodyAlignForCalculation !== 'right'\n ? bodyAlign === 'center' ? (boxWidth / 2 + boxPadding) : (boxWidth + 2 + boxPadding)\n : 0;\n\n // Draw body lines now\n for (i = 0, ilen = body.length; i < ilen; ++i) {\n bodyItem = body[i];\n textColor = this.labelTextColors[i];\n\n ctx.fillStyle = textColor;\n each(bodyItem.before, fillLineOfText);\n\n lines = bodyItem.lines;\n // Draw Legend-like boxes if needed\n if (displayColors && lines.length) {\n this._drawColorBox(ctx, pt, i, rtlHelper, options);\n bodyLineHeight = Math.max(bodyFont.lineHeight, boxHeight);\n }\n\n for (j = 0, jlen = lines.length; j < jlen; ++j) {\n fillLineOfText(lines[j]);\n // Reset for any lines that don't include colorbox\n bodyLineHeight = bodyFont.lineHeight;\n }\n\n each(bodyItem.after, fillLineOfText);\n }\n\n // Reset back to 0 for after body\n xLinePadding = 0;\n bodyLineHeight = bodyFont.lineHeight;\n\n // After body lines\n each(this.afterBody, fillLineOfText);\n pt.y -= bodySpacing; // Remove last body spacing\n }\n\n drawFooter(pt, ctx, options) {\n const footer = this.footer;\n const length = footer.length;\n let footerFont, i;\n\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n pt.x = getAlignedX(this, options.footerAlign, options);\n pt.y += options.footerMarginTop;\n\n ctx.textAlign = rtlHelper.textAlign(options.footerAlign);\n ctx.textBaseline = 'middle';\n\n footerFont = toFont(options.footerFont);\n\n ctx.fillStyle = options.footerColor;\n ctx.font = footerFont.string;\n\n for (i = 0; i < length; ++i) {\n ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFont.lineHeight / 2);\n pt.y += footerFont.lineHeight + options.footerSpacing;\n }\n }\n }\n\n drawBackground(pt, ctx, tooltipSize, options) {\n const {xAlign, yAlign} = this;\n const {x, y} = pt;\n const {width, height} = tooltipSize;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(options.cornerRadius);\n\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n\n ctx.beginPath();\n ctx.moveTo(x + topLeft, y);\n if (yAlign === 'top') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width - topRight, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + topRight);\n if (yAlign === 'center' && xAlign === 'right') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width, y + height - bottomRight);\n ctx.quadraticCurveTo(x + width, y + height, x + width - bottomRight, y + height);\n if (yAlign === 'bottom') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + bottomLeft, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - bottomLeft);\n if (yAlign === 'center' && xAlign === 'left') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x, y + topLeft);\n ctx.quadraticCurveTo(x, y, x + topLeft, y);\n ctx.closePath();\n\n ctx.fill();\n\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n }\n\n /**\n\t * Update x/y animation targets when _active elements are animating too\n\t * @private\n\t */\n _updateAnimationTarget(options) {\n const chart = this.chart;\n const anims = this.$animations;\n const animX = anims && anims.x;\n const animY = anims && anims.y;\n if (animX || animY) {\n const position = positioners[options.position].call(this, this._active, this._eventPosition);\n if (!position) {\n return;\n }\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, this._size);\n const alignment = determineAlignment(chart, options, positionAndSize);\n const point = getBackgroundPoint(options, positionAndSize, alignment, chart);\n if (animX._to !== point.x || animY._to !== point.y) {\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n this.width = size.width;\n this.height = size.height;\n this.caretX = position.x;\n this.caretY = position.y;\n this._resolveAnimations().update(this, point);\n }\n }\n }\n\n /**\n * Determine if the tooltip will draw anything\n * @returns {boolean} True if the tooltip will render\n */\n _willRender() {\n return !!this.opacity;\n }\n\n draw(ctx) {\n const options = this.options.setContext(this.getContext());\n let opacity = this.opacity;\n\n if (!opacity) {\n return;\n }\n\n this._updateAnimationTarget(options);\n\n const tooltipSize = {\n width: this.width,\n height: this.height\n };\n const pt = {\n x: this.x,\n y: this.y\n };\n\n // IE11/Edge does not like very small opacities, so snap to 0\n opacity = Math.abs(opacity) < 1e-3 ? 0 : opacity;\n\n const padding = toPadding(options.padding);\n\n // Truthy/falsey value for empty tooltip\n const hasTooltipContent = this.title.length || this.beforeBody.length || this.body.length || this.afterBody.length || this.footer.length;\n\n if (options.enabled && hasTooltipContent) {\n ctx.save();\n ctx.globalAlpha = opacity;\n\n // Draw Background\n this.drawBackground(pt, ctx, tooltipSize, options);\n\n overrideTextDirection(ctx, options.textDirection);\n\n pt.y += padding.top;\n\n // Titles\n this.drawTitle(pt, ctx, options);\n\n // Body\n this.drawBody(pt, ctx, options);\n\n // Footer\n this.drawFooter(pt, ctx, options);\n\n restoreTextDirection(ctx, options.textDirection);\n\n ctx.restore();\n }\n }\n\n /**\n\t * Get active elements in the tooltip\n\t * @returns {Array} Array of elements that are active in the tooltip\n\t */\n getActiveElements() {\n return this._active || [];\n }\n\n /**\n\t * Set active elements in the tooltip\n\t * @param {array} activeElements Array of active datasetIndex/index pairs.\n\t * @param {object} eventPosition Synthetic event position used in positioning\n\t */\n setActiveElements(activeElements, eventPosition) {\n const lastActive = this._active;\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = this.chart.getDatasetMeta(datasetIndex);\n\n if (!meta) {\n throw new Error('Cannot find a dataset at index ' + datasetIndex);\n }\n\n return {\n datasetIndex,\n element: meta.data[index],\n index,\n };\n });\n const changed = !_elementsEqual(lastActive, active);\n const positionChanged = this._positionChanged(active, eventPosition);\n\n if (changed || positionChanged) {\n this._active = active;\n this._eventPosition = eventPosition;\n this._ignoreReplayEvents = true;\n this.update(true);\n }\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e - The event to handle\n\t * @param {boolean} [replay] - This is a replayed event (from update)\n\t * @param {boolean} [inChartArea] - The event is inside chartArea\n\t * @returns {boolean} true if the tooltip changed\n\t */\n handleEvent(e, replay, inChartArea = true) {\n if (replay && this._ignoreReplayEvents) {\n return false;\n }\n this._ignoreReplayEvents = false;\n\n const options = this.options;\n const lastActive = this._active || [];\n const active = this._getActiveElements(e, lastActive, replay, inChartArea);\n\n // When there are multiple items shown, but the tooltip position is nearest mode\n // an update may need to be made because our position may have changed even though\n // the items are the same as before.\n const positionChanged = this._positionChanged(active, e);\n\n // Remember Last Actives\n const changed = replay || !_elementsEqual(active, lastActive) || positionChanged;\n\n // Only handle target event on tooltip change\n if (changed) {\n this._active = active;\n\n if (options.enabled || options.external) {\n this._eventPosition = {\n x: e.x,\n y: e.y\n };\n\n this.update(true, replay);\n }\n }\n\n return changed;\n }\n\n /**\n\t * Helper for determining the active elements for event\n\t * @param {ChartEvent} e - The event to handle\n\t * @param {InteractionItem[]} lastActive - Previously active elements\n\t * @param {boolean} [replay] - This is a replayed event (from update)\n\t * @param {boolean} [inChartArea] - The event is inside chartArea\n\t * @returns {InteractionItem[]} - Active elements\n\t * @private\n\t */\n _getActiveElements(e, lastActive, replay, inChartArea) {\n const options = this.options;\n\n if (e.type === 'mouseout') {\n return [];\n }\n\n if (!inChartArea) {\n // Let user control the active elements outside chartArea. Eg. using Legend.\n // But make sure that active elements are still valid.\n return lastActive.filter(i =>\n this.chart.data.datasets[i.datasetIndex] &&\n this.chart.getDatasetMeta(i.datasetIndex).controller.getParsed(i.index) !== undefined\n );\n }\n\n // Find Active Elements for tooltips\n const active = this.chart.getElementsAtEventForMode(e, options.mode, options, replay);\n\n if (options.reverse) {\n active.reverse();\n }\n\n return active;\n }\n\n /**\n\t * Determine if the active elements + event combination changes the\n\t * tooltip position\n\t * @param {array} active - Active elements\n\t * @param {ChartEvent} e - Event that triggered the position change\n\t * @returns {boolean} True if the position has changed\n\t */\n _positionChanged(active, e) {\n const {caretX, caretY, options} = this;\n const position = positioners[options.position].call(this, active, e);\n return position !== false && (caretX !== position.x || caretY !== position.y);\n }\n}\n\nexport default {\n id: 'tooltip',\n _element: Tooltip,\n positioners,\n\n afterInit(chart, _args, options) {\n if (options) {\n chart.tooltip = new Tooltip({chart, options});\n }\n },\n\n beforeUpdate(chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n\n reset(chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n\n afterDraw(chart) {\n const tooltip = chart.tooltip;\n\n if (tooltip && tooltip._willRender()) {\n const args = {\n tooltip\n };\n\n if (chart.notifyPlugins('beforeTooltipDraw', {...args, cancelable: true}) === false) {\n return;\n }\n\n tooltip.draw(chart.ctx);\n\n chart.notifyPlugins('afterTooltipDraw', args);\n }\n },\n\n afterEvent(chart, args) {\n if (chart.tooltip) {\n // If the event is replayed from `update`, we should evaluate with the final positions.\n const useFinalPosition = args.replay;\n if (chart.tooltip.handleEvent(args.event, useFinalPosition, args.inChartArea)) {\n // notify chart about the change, so it will render\n args.changed = true;\n }\n }\n },\n\n defaults: {\n enabled: true,\n external: null,\n position: 'average',\n backgroundColor: 'rgba(0,0,0,0.8)',\n titleColor: '#fff',\n titleFont: {\n weight: 'bold',\n },\n titleSpacing: 2,\n titleMarginBottom: 6,\n titleAlign: 'left',\n bodyColor: '#fff',\n bodySpacing: 2,\n bodyFont: {\n },\n bodyAlign: 'left',\n footerColor: '#fff',\n footerSpacing: 2,\n footerMarginTop: 6,\n footerFont: {\n weight: 'bold',\n },\n footerAlign: 'left',\n padding: 6,\n caretPadding: 2,\n caretSize: 5,\n cornerRadius: 6,\n boxHeight: (ctx, opts) => opts.bodyFont.size,\n boxWidth: (ctx, opts) => opts.bodyFont.size,\n multiKeyBackground: '#fff',\n displayColors: true,\n boxPadding: 0,\n borderColor: 'rgba(0,0,0,0)',\n borderWidth: 0,\n animation: {\n duration: 400,\n easing: 'easeOutQuart',\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'width', 'height', 'caretX', 'caretY'],\n },\n opacity: {\n easing: 'linear',\n duration: 200\n }\n },\n callbacks: defaultCallbacks\n },\n\n defaultRoutes: {\n bodyFont: 'font',\n footerFont: 'font',\n titleFont: 'font'\n },\n\n descriptors: {\n _scriptable: (name) => name !== 'filter' && name !== 'itemSort' && name !== 'external',\n _indexable: false,\n callbacks: {\n _scriptable: false,\n _indexable: false,\n },\n animation: {\n _fallback: false\n },\n animations: {\n _fallback: 'animation'\n }\n },\n\n // Resolve additionally from `interaction` options and defaults.\n additionalOptionScopes: ['interaction']\n};\n","import Scale from '../core/core.scale.js';\nimport {isNullOrUndef, valueOrDefault, _limitValue} from '../helpers/index.js';\n\nconst addIfString = (labels, raw, index, addedLabels) => {\n if (typeof raw === 'string') {\n index = labels.push(raw) - 1;\n addedLabels.unshift({index, label: raw});\n } else if (isNaN(raw)) {\n index = null;\n }\n return index;\n};\n\nfunction findOrAddLabel(labels, raw, index, addedLabels) {\n const first = labels.indexOf(raw);\n if (first === -1) {\n return addIfString(labels, raw, index, addedLabels);\n }\n const last = labels.lastIndexOf(raw);\n return first !== last ? index : first;\n}\n\nconst validIndex = (index, max) => index === null ? null : _limitValue(Math.round(index), 0, max);\n\nfunction _getLabelForValue(value) {\n const labels = this.getLabels();\n\n if (value >= 0 && value < labels.length) {\n return labels[value];\n }\n return value;\n}\n\nexport default class CategoryScale extends Scale {\n\n static id = 'category';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: _getLabelForValue\n }\n };\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this._startValue = undefined;\n this._valueRange = 0;\n this._addedLabels = [];\n }\n\n init(scaleOptions) {\n const added = this._addedLabels;\n if (added.length) {\n const labels = this.getLabels();\n for (const {index, label} of added) {\n if (labels[index] === label) {\n labels.splice(index, 1);\n }\n }\n this._addedLabels = [];\n }\n super.init(scaleOptions);\n }\n\n parse(raw, index) {\n if (isNullOrUndef(raw)) {\n return null;\n }\n const labels = this.getLabels();\n index = isFinite(index) && labels[index] === raw ? index\n : findOrAddLabel(labels, raw, valueOrDefault(index, raw), this._addedLabels);\n return validIndex(index, labels.length - 1);\n }\n\n determineDataLimits() {\n const {minDefined, maxDefined} = this.getUserBounds();\n let {min, max} = this.getMinMax(true);\n\n if (this.options.bounds === 'ticks') {\n if (!minDefined) {\n min = 0;\n }\n if (!maxDefined) {\n max = this.getLabels().length - 1;\n }\n }\n\n this.min = min;\n this.max = max;\n }\n\n buildTicks() {\n const min = this.min;\n const max = this.max;\n const offset = this.options.offset;\n const ticks = [];\n let labels = this.getLabels();\n\n // If we are viewing some subset of labels, slice the original array\n labels = (min === 0 && max === labels.length - 1) ? labels : labels.slice(min, max + 1);\n\n this._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1);\n this._startValue = this.min - (offset ? 0.5 : 0);\n\n for (let value = min; value <= max; value++) {\n ticks.push({value});\n }\n return ticks;\n }\n\n getLabelForValue(value) {\n return _getLabelForValue.call(this, value);\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n super.configure();\n\n if (!this.isHorizontal()) {\n // For backward compatibility, vertical category scale reverse is inverted.\n this._reversePixels = !this._reversePixels;\n }\n }\n\n // Used to get data value locations. Value can either be an index or a numerical value\n getPixelForValue(value) {\n if (typeof value !== 'number') {\n value = this.parse(value);\n }\n\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n\n // Must override base implementation because it calls getPixelForValue\n // and category scale can have duplicate values\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n\n getValueForPixel(pixel) {\n return Math.round(this._startValue + this.getDecimalForPixel(pixel) * this._valueRange);\n }\n\n getBasePixel() {\n return this.bottom;\n }\n}\n","import {isNullOrUndef} from '../helpers/helpers.core.js';\nimport {almostEquals, almostWhole, niceNum, _decimalPlaces, _setMinAndMaxByKey, sign, toRadians} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\n\n/**\n * Generate a set of linear ticks for an axis\n * 1. If generationOptions.min, generationOptions.max, and generationOptions.step are defined:\n * if (max - min) / step is an integer, ticks are generated as [min, min + step, ..., max]\n * Note that the generationOptions.maxCount setting is respected in this scenario\n *\n * 2. If generationOptions.min, generationOptions.max, and generationOptions.count is defined\n * spacing = (max - min) / count\n * Ticks are generated as [min, min + spacing, ..., max]\n *\n * 3. If generationOptions.count is defined\n * spacing = (niceMax - niceMin) / count\n *\n * 4. Compute optimal spacing of ticks using niceNum algorithm\n *\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {object[]} array of tick objects\n */\nfunction generateTicks(generationOptions, dataRange) {\n const ticks = [];\n // To get a \"nice\" value for the tick spacing, we will use the appropriately named\n // \"nice number\" algorithm. See https://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks\n // for details.\n\n const MIN_SPACING = 1e-14;\n const {bounds, step, min, max, precision, count, maxTicks, maxDigits, includeBounds} = generationOptions;\n const unit = step || 1;\n const maxSpaces = maxTicks - 1;\n const {min: rmin, max: rmax} = dataRange;\n const minDefined = !isNullOrUndef(min);\n const maxDefined = !isNullOrUndef(max);\n const countDefined = !isNullOrUndef(count);\n const minSpacing = (rmax - rmin) / (maxDigits + 1);\n let spacing = niceNum((rmax - rmin) / maxSpaces / unit) * unit;\n let factor, niceMin, niceMax, numSpaces;\n\n // Beyond MIN_SPACING floating point numbers being to lose precision\n // such that we can't do the math necessary to generate ticks\n if (spacing < MIN_SPACING && !minDefined && !maxDefined) {\n return [{value: rmin}, {value: rmax}];\n }\n\n numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);\n if (numSpaces > maxSpaces) {\n // If the calculated num of spaces exceeds maxNumSpaces, recalculate it\n spacing = niceNum(numSpaces * spacing / maxSpaces / unit) * unit;\n }\n\n if (!isNullOrUndef(precision)) {\n // If the user specified a precision, round to that number of decimal places\n factor = Math.pow(10, precision);\n spacing = Math.ceil(spacing * factor) / factor;\n }\n\n if (bounds === 'ticks') {\n niceMin = Math.floor(rmin / spacing) * spacing;\n niceMax = Math.ceil(rmax / spacing) * spacing;\n } else {\n niceMin = rmin;\n niceMax = rmax;\n }\n\n if (minDefined && maxDefined && step && almostWhole((max - min) / step, spacing / 1000)) {\n // Case 1: If min, max and stepSize are set and they make an evenly spaced scale use it.\n // spacing = step;\n // numSpaces = (max - min) / spacing;\n // Note that we round here to handle the case where almostWhole translated an FP error\n numSpaces = Math.round(Math.min((max - min) / spacing, maxTicks));\n spacing = (max - min) / numSpaces;\n niceMin = min;\n niceMax = max;\n } else if (countDefined) {\n // Cases 2 & 3, we have a count specified. Handle optional user defined edges to the range.\n // Sometimes these are no-ops, but it makes the code a lot clearer\n // and when a user defined range is specified, we want the correct ticks\n niceMin = minDefined ? min : niceMin;\n niceMax = maxDefined ? max : niceMax;\n numSpaces = count - 1;\n spacing = (niceMax - niceMin) / numSpaces;\n } else {\n // Case 4\n numSpaces = (niceMax - niceMin) / spacing;\n\n // If very close to our rounded value, use it.\n if (almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n numSpaces = Math.round(numSpaces);\n } else {\n numSpaces = Math.ceil(numSpaces);\n }\n }\n\n // The spacing will have changed in cases 1, 2, and 3 so the factor cannot be computed\n // until this point\n const decimalPlaces = Math.max(\n _decimalPlaces(spacing),\n _decimalPlaces(niceMin)\n );\n factor = Math.pow(10, isNullOrUndef(precision) ? decimalPlaces : precision);\n niceMin = Math.round(niceMin * factor) / factor;\n niceMax = Math.round(niceMax * factor) / factor;\n\n let j = 0;\n if (minDefined) {\n if (includeBounds && niceMin !== min) {\n ticks.push({value: min});\n\n if (niceMin < min) {\n j++; // Skip niceMin\n }\n // If the next nice tick is close to min, skip it\n if (almostEquals(Math.round((niceMin + j * spacing) * factor) / factor, min, relativeLabelSize(min, minSpacing, generationOptions))) {\n j++;\n }\n } else if (niceMin < min) {\n j++;\n }\n }\n\n for (; j < numSpaces; ++j) {\n const tickValue = Math.round((niceMin + j * spacing) * factor) / factor;\n if (maxDefined && tickValue > max) {\n break;\n }\n ticks.push({value: tickValue});\n }\n\n if (maxDefined && includeBounds && niceMax !== max) {\n // If the previous tick is too close to max, replace it with max, else add max\n if (ticks.length && almostEquals(ticks[ticks.length - 1].value, max, relativeLabelSize(max, minSpacing, generationOptions))) {\n ticks[ticks.length - 1].value = max;\n } else {\n ticks.push({value: max});\n }\n } else if (!maxDefined || niceMax === max) {\n ticks.push({value: niceMax});\n }\n\n return ticks;\n}\n\nfunction relativeLabelSize(value, minSpacing, {horizontal, minRotation}) {\n const rad = toRadians(minRotation);\n const ratio = (horizontal ? Math.sin(rad) : Math.cos(rad)) || 0.001;\n const length = 0.75 * minSpacing * ('' + value).length;\n return Math.min(minSpacing / ratio, length);\n}\n\nexport default class LinearScaleBase extends Scale {\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.start = undefined;\n /** @type {number} */\n this.end = undefined;\n /** @type {number} */\n this._startValue = undefined;\n /** @type {number} */\n this._endValue = undefined;\n this._valueRange = 0;\n }\n\n parse(raw, index) { // eslint-disable-line no-unused-vars\n if (isNullOrUndef(raw)) {\n return null;\n }\n if ((typeof raw === 'number' || raw instanceof Number) && !isFinite(+raw)) {\n return null;\n }\n\n return +raw;\n }\n\n handleTickRangeOptions() {\n const {beginAtZero} = this.options;\n const {minDefined, maxDefined} = this.getUserBounds();\n let {min, max} = this;\n\n const setMin = v => (min = minDefined ? min : v);\n const setMax = v => (max = maxDefined ? max : v);\n\n if (beginAtZero) {\n const minSign = sign(min);\n const maxSign = sign(max);\n\n if (minSign < 0 && maxSign < 0) {\n setMax(0);\n } else if (minSign > 0 && maxSign > 0) {\n setMin(0);\n }\n }\n\n if (min === max) {\n let offset = max === 0 ? 1 : Math.abs(max * 0.05);\n\n setMax(max + offset);\n\n if (!beginAtZero) {\n setMin(min - offset);\n }\n }\n this.min = min;\n this.max = max;\n }\n\n getTickLimit() {\n const tickOpts = this.options.ticks;\n // eslint-disable-next-line prefer-const\n let {maxTicksLimit, stepSize} = tickOpts;\n let maxTicks;\n\n if (stepSize) {\n maxTicks = Math.ceil(this.max / stepSize) - Math.floor(this.min / stepSize) + 1;\n if (maxTicks > 1000) {\n console.warn(`scales.${this.id}.ticks.stepSize: ${stepSize} would result generating up to ${maxTicks} ticks. Limiting to 1000.`);\n maxTicks = 1000;\n }\n } else {\n maxTicks = this.computeTickLimit();\n maxTicksLimit = maxTicksLimit || 11;\n }\n\n if (maxTicksLimit) {\n maxTicks = Math.min(maxTicksLimit, maxTicks);\n }\n\n return maxTicks;\n }\n\n /**\n\t * @protected\n\t */\n computeTickLimit() {\n return Number.POSITIVE_INFINITY;\n }\n\n buildTicks() {\n const opts = this.options;\n const tickOpts = opts.ticks;\n\n // Figure out what the max number of ticks we can support it is based on the size of\n // the axis area. For now, we say that the minimum tick spacing in pixels must be 40\n // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n // the graph. Make sure we always have at least 2 ticks\n let maxTicks = this.getTickLimit();\n maxTicks = Math.max(2, maxTicks);\n\n const numericGeneratorOptions = {\n maxTicks,\n bounds: opts.bounds,\n min: opts.min,\n max: opts.max,\n precision: tickOpts.precision,\n step: tickOpts.stepSize,\n count: tickOpts.count,\n maxDigits: this._maxDigits(),\n horizontal: this.isHorizontal(),\n minRotation: tickOpts.minRotation || 0,\n includeBounds: tickOpts.includeBounds !== false\n };\n const dataRange = this._range || this;\n const ticks = generateTicks(numericGeneratorOptions, dataRange);\n\n // At this point, we need to update our max and min given the tick values,\n // since we probably have expanded the range of the scale\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n\n if (opts.reverse) {\n ticks.reverse();\n\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n\n return ticks;\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n const ticks = this.ticks;\n let start = this.min;\n let end = this.max;\n\n super.configure();\n\n if (this.options.offset && ticks.length) {\n const offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;\n start -= offset;\n end += offset;\n }\n this._startValue = start;\n this._endValue = end;\n this._valueRange = end - start;\n }\n\n getLabelForValue(value) {\n return formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n}\n","import {isFinite} from '../helpers/helpers.core.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\nimport {toRadians} from '../helpers/index.js';\n\nexport default class LinearScale extends LinearScaleBase {\n\n static id = 'linear';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: Ticks.formatters.numeric\n }\n };\n\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(true);\n\n this.min = isFinite(min) ? min : 0;\n this.max = isFinite(max) ? max : 1;\n\n // Common base implementation to handle min, max, beginAtZero\n this.handleTickRangeOptions();\n }\n\n /**\n\t * Returns the maximum number of ticks based on the scale dimension\n\t * @protected\n \t */\n computeTickLimit() {\n const horizontal = this.isHorizontal();\n const length = horizontal ? this.width : this.height;\n const minRotation = toRadians(this.options.ticks.minRotation);\n const ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 0.001;\n const tickFont = this._resolveTickFontOptions(0);\n return Math.ceil(length / Math.min(40, tickFont.lineHeight / ratio));\n }\n\n // Utils\n getPixelForValue(value) {\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n\n getValueForPixel(pixel) {\n return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;\n }\n}\n","import {finiteOrDefault, isFinite} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {_setMinAndMaxByKey, log10} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\n\nconst log10Floor = v => Math.floor(log10(v));\nconst changeExponent = (v, m) => Math.pow(10, log10Floor(v) + m);\n\nfunction isMajor(tickVal) {\n const remain = tickVal / (Math.pow(10, log10Floor(tickVal)));\n return remain === 1;\n}\n\nfunction steps(min, max, rangeExp) {\n const rangeStep = Math.pow(10, rangeExp);\n const start = Math.floor(min / rangeStep);\n const end = Math.ceil(max / rangeStep);\n return end - start;\n}\n\nfunction startExp(min, max) {\n const range = max - min;\n let rangeExp = log10Floor(range);\n while (steps(min, max, rangeExp) > 10) {\n rangeExp++;\n }\n while (steps(min, max, rangeExp) < 10) {\n rangeExp--;\n }\n return Math.min(rangeExp, log10Floor(min));\n}\n\n\n/**\n * Generate a set of logarithmic ticks\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {object[]} array of tick objects\n */\nfunction generateTicks(generationOptions, {min, max}) {\n min = finiteOrDefault(generationOptions.min, min);\n const ticks = [];\n const minExp = log10Floor(min);\n let exp = startExp(min, max);\n let precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\n const stepSize = Math.pow(10, exp);\n const base = minExp > exp ? Math.pow(10, minExp) : 0;\n const start = Math.round((min - base) * precision) / precision;\n const offset = Math.floor((min - base) / stepSize / 10) * stepSize * 10;\n let significand = Math.floor((start - offset) / Math.pow(10, exp));\n let value = finiteOrDefault(generationOptions.min, Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision);\n while (value < max) {\n ticks.push({value, major: isMajor(value), significand});\n if (significand >= 10) {\n significand = significand < 15 ? 15 : 20;\n } else {\n significand++;\n }\n if (significand >= 20) {\n exp++;\n significand = 2;\n precision = exp >= 0 ? 1 : precision;\n }\n value = Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision;\n }\n const lastTick = finiteOrDefault(generationOptions.max, value);\n ticks.push({value: lastTick, major: isMajor(lastTick), significand});\n\n return ticks;\n}\n\nexport default class LogarithmicScale extends Scale {\n\n static id = 'logarithmic';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: Ticks.formatters.logarithmic,\n major: {\n enabled: true\n }\n }\n };\n\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.start = undefined;\n /** @type {number} */\n this.end = undefined;\n /** @type {number} */\n this._startValue = undefined;\n this._valueRange = 0;\n }\n\n parse(raw, index) {\n const value = LinearScaleBase.prototype.parse.apply(this, [raw, index]);\n if (value === 0) {\n this._zero = true;\n return undefined;\n }\n return isFinite(value) && value > 0 ? value : null;\n }\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(true);\n\n this.min = isFinite(min) ? Math.max(0, min) : null;\n this.max = isFinite(max) ? Math.max(0, max) : null;\n\n if (this.options.beginAtZero) {\n this._zero = true;\n }\n\n // if data has `0` in it or `beginAtZero` is true, min (non zero) value is at bottom\n // of scale, and it does not equal suggestedMin, lower the min bound by one exp.\n if (this._zero && this.min !== this._suggestedMin && !isFinite(this._userMin)) {\n this.min = min === changeExponent(this.min, 0) ? changeExponent(this.min, -1) : changeExponent(this.min, 0);\n }\n\n this.handleTickRangeOptions();\n }\n\n handleTickRangeOptions() {\n const {minDefined, maxDefined} = this.getUserBounds();\n let min = this.min;\n let max = this.max;\n\n const setMin = v => (min = minDefined ? min : v);\n const setMax = v => (max = maxDefined ? max : v);\n\n if (min === max) {\n if (min <= 0) { // includes null\n setMin(1);\n setMax(10);\n } else {\n setMin(changeExponent(min, -1));\n setMax(changeExponent(max, +1));\n }\n }\n if (min <= 0) {\n setMin(changeExponent(max, -1));\n }\n if (max <= 0) {\n\n setMax(changeExponent(min, +1));\n }\n\n this.min = min;\n this.max = max;\n }\n\n buildTicks() {\n const opts = this.options;\n\n const generationOptions = {\n min: this._userMin,\n max: this._userMax\n };\n const ticks = generateTicks(generationOptions, this);\n\n // At this point, we need to update our max and min given the tick values,\n // since we probably have expanded the range of the scale\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n\n if (opts.reverse) {\n ticks.reverse();\n\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n\n return ticks;\n }\n\n /**\n\t * @param {number} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n return value === undefined\n ? '0'\n : formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n const start = this.min;\n\n super.configure();\n\n this._startValue = log10(start);\n this._valueRange = log10(this.max) - log10(start);\n }\n\n getPixelForValue(value) {\n if (value === undefined || value === 0) {\n value = this.min;\n }\n if (value === null || isNaN(value)) {\n return NaN;\n }\n return this.getPixelForDecimal(value === this.min\n ? 0\n : (log10(value) - this._startValue) / this._valueRange);\n }\n\n getValueForPixel(pixel) {\n const decimal = this.getDecimalForPixel(pixel);\n return Math.pow(10, this._startValue + decimal * this._valueRange);\n }\n}\n","import defaults from '../core/core.defaults.js';\nimport {_longestText, addRoundedRectPath, renderText, _isPointInArea} from '../helpers/helpers.canvas.js';\nimport {HALF_PI, TAU, toDegrees, toRadians, _normalizeAngle, PI} from '../helpers/helpers.math.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\nimport {valueOrDefault, isArray, isFinite, callback as callCallback, isNullOrUndef} from '../helpers/helpers.core.js';\nimport {createContext, toFont, toPadding, toTRBLCorners} from '../helpers/helpers.options.js';\n\nfunction getTickBackdropHeight(opts) {\n const tickOpts = opts.ticks;\n\n if (tickOpts.display && opts.display) {\n const padding = toPadding(tickOpts.backdropPadding);\n return valueOrDefault(tickOpts.font && tickOpts.font.size, defaults.font.size) + padding.height;\n }\n return 0;\n}\n\nfunction measureLabelSize(ctx, font, label) {\n label = isArray(label) ? label : [label];\n return {\n w: _longestText(ctx, font.string, label),\n h: label.length * font.lineHeight\n };\n}\n\nfunction determineLimits(angle, pos, size, min, max) {\n if (angle === min || angle === max) {\n return {\n start: pos - (size / 2),\n end: pos + (size / 2)\n };\n } else if (angle < min || angle > max) {\n return {\n start: pos - size,\n end: pos\n };\n }\n\n return {\n start: pos,\n end: pos + size\n };\n}\n\n/**\n * Helper function to fit a radial linear scale with point labels\n */\nfunction fitWithPointLabels(scale) {\n\n // Right, this is really confusing and there is a lot of maths going on here\n // The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9\n //\n // Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif\n //\n // Solution:\n //\n // We assume the radius of the polygon is half the size of the canvas at first\n // at each index we check if the text overlaps.\n //\n // Where it does, we store that angle and that index.\n //\n // After finding the largest index and angle we calculate how much we need to remove\n // from the shape radius to move the point inwards by that x.\n //\n // We average the left and right distances to get the maximum shape radius that can fit in the box\n // along with labels.\n //\n // Once we have that, we can find the centre point for the chart, by taking the x text protrusion\n // on each side, removing that from the size, halving it and adding the left x protrusion width.\n //\n // This will mean we have a shape fitted to the canvas, as large as it can be with the labels\n // and position it in the most space efficient manner\n //\n // https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif\n\n // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width.\n // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points\n const orig = {\n l: scale.left + scale._padding.left,\n r: scale.right - scale._padding.right,\n t: scale.top + scale._padding.top,\n b: scale.bottom - scale._padding.bottom\n };\n const limits = Object.assign({}, orig);\n const labelSizes = [];\n const padding = [];\n const valueCount = scale._pointLabels.length;\n const pointLabelOpts = scale.options.pointLabels;\n const additionalAngle = pointLabelOpts.centerPointLabels ? PI / valueCount : 0;\n\n for (let i = 0; i < valueCount; i++) {\n const opts = pointLabelOpts.setContext(scale.getPointLabelContext(i));\n padding[i] = opts.padding;\n const pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i], additionalAngle);\n const plFont = toFont(opts.font);\n const textSize = measureLabelSize(scale.ctx, plFont, scale._pointLabels[i]);\n labelSizes[i] = textSize;\n\n const angleRadians = _normalizeAngle(scale.getIndexAngle(i) + additionalAngle);\n const angle = Math.round(toDegrees(angleRadians));\n const hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n const vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n updateLimits(limits, orig, angleRadians, hLimits, vLimits);\n }\n\n scale.setCenterPoint(\n orig.l - limits.l,\n limits.r - orig.r,\n orig.t - limits.t,\n limits.b - orig.b\n );\n\n // Now that text size is determined, compute the full positions\n scale._pointLabelItems = buildPointLabelItems(scale, labelSizes, padding);\n}\n\nfunction updateLimits(limits, orig, angle, hLimits, vLimits) {\n const sin = Math.abs(Math.sin(angle));\n const cos = Math.abs(Math.cos(angle));\n let x = 0;\n let y = 0;\n if (hLimits.start < orig.l) {\n x = (orig.l - hLimits.start) / sin;\n limits.l = Math.min(limits.l, orig.l - x);\n } else if (hLimits.end > orig.r) {\n x = (hLimits.end - orig.r) / sin;\n limits.r = Math.max(limits.r, orig.r + x);\n }\n if (vLimits.start < orig.t) {\n y = (orig.t - vLimits.start) / cos;\n limits.t = Math.min(limits.t, orig.t - y);\n } else if (vLimits.end > orig.b) {\n y = (vLimits.end - orig.b) / cos;\n limits.b = Math.max(limits.b, orig.b + y);\n }\n}\n\nfunction createPointLabelItem(scale, index, itemOpts) {\n const outerDistance = scale.drawingArea;\n const {extra, additionalAngle, padding, size} = itemOpts;\n const pointLabelPosition = scale.getPointPosition(index, outerDistance + extra + padding, additionalAngle);\n const angle = Math.round(toDegrees(_normalizeAngle(pointLabelPosition.angle + HALF_PI)));\n const y = yForAngle(pointLabelPosition.y, size.h, angle);\n const textAlign = getTextAlignForAngle(angle);\n const left = leftForTextAlign(pointLabelPosition.x, size.w, textAlign);\n return {\n // if to draw or overlapped\n visible: true,\n\n // Text position\n x: pointLabelPosition.x,\n y,\n\n // Text rendering data\n textAlign,\n\n // Bounding box\n left,\n top: y,\n right: left + size.w,\n bottom: y + size.h\n };\n}\n\nfunction isNotOverlapped(item, area) {\n if (!area) {\n return true;\n }\n const {left, top, right, bottom} = item;\n const apexesInArea = _isPointInArea({x: left, y: top}, area) || _isPointInArea({x: left, y: bottom}, area) ||\n _isPointInArea({x: right, y: top}, area) || _isPointInArea({x: right, y: bottom}, area);\n return !apexesInArea;\n}\n\nfunction buildPointLabelItems(scale, labelSizes, padding) {\n const items = [];\n const valueCount = scale._pointLabels.length;\n const opts = scale.options;\n const {centerPointLabels, display} = opts.pointLabels;\n const itemOpts = {\n extra: getTickBackdropHeight(opts) / 2,\n additionalAngle: centerPointLabels ? PI / valueCount : 0\n };\n let area;\n\n for (let i = 0; i < valueCount; i++) {\n itemOpts.padding = padding[i];\n itemOpts.size = labelSizes[i];\n\n const item = createPointLabelItem(scale, i, itemOpts);\n items.push(item);\n if (display === 'auto') {\n item.visible = isNotOverlapped(item, area);\n if (item.visible) {\n area = item;\n }\n }\n }\n return items;\n}\n\nfunction getTextAlignForAngle(angle) {\n if (angle === 0 || angle === 180) {\n return 'center';\n } else if (angle < 180) {\n return 'left';\n }\n\n return 'right';\n}\n\nfunction leftForTextAlign(x, w, align) {\n if (align === 'right') {\n x -= w;\n } else if (align === 'center') {\n x -= (w / 2);\n }\n return x;\n}\n\nfunction yForAngle(y, h, angle) {\n if (angle === 90 || angle === 270) {\n y -= (h / 2);\n } else if (angle > 270 || angle < 90) {\n y -= h;\n }\n return y;\n}\n\nfunction drawPointLabelBox(ctx, opts, item) {\n const {left, top, right, bottom} = item;\n const {backdropColor} = opts;\n\n if (!isNullOrUndef(backdropColor)) {\n const borderRadius = toTRBLCorners(opts.borderRadius);\n const padding = toPadding(opts.backdropPadding);\n ctx.fillStyle = backdropColor;\n\n const backdropLeft = left - padding.left;\n const backdropTop = top - padding.top;\n const backdropWidth = right - left + padding.width;\n const backdropHeight = bottom - top + padding.height;\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: backdropLeft,\n y: backdropTop,\n w: backdropWidth,\n h: backdropHeight,\n radius: borderRadius,\n });\n ctx.fill();\n } else {\n ctx.fillRect(backdropLeft, backdropTop, backdropWidth, backdropHeight);\n }\n }\n}\n\nfunction drawPointLabels(scale, labelCount) {\n const {ctx, options: {pointLabels}} = scale;\n\n for (let i = labelCount - 1; i >= 0; i--) {\n const item = scale._pointLabelItems[i];\n if (!item.visible) {\n // overlapping\n continue;\n }\n const optsAtIndex = pointLabels.setContext(scale.getPointLabelContext(i));\n drawPointLabelBox(ctx, optsAtIndex, item);\n const plFont = toFont(optsAtIndex.font);\n const {x, y, textAlign} = item;\n\n renderText(\n ctx,\n scale._pointLabels[i],\n x,\n y + (plFont.lineHeight / 2),\n plFont,\n {\n color: optsAtIndex.color,\n textAlign: textAlign,\n textBaseline: 'middle'\n }\n );\n }\n}\n\nfunction pathRadiusLine(scale, radius, circular, labelCount) {\n const {ctx} = scale;\n if (circular) {\n // Draw circular arcs between the points\n ctx.arc(scale.xCenter, scale.yCenter, radius, 0, TAU);\n } else {\n // Draw straight lines connecting each index\n let pointPosition = scale.getPointPosition(0, radius);\n ctx.moveTo(pointPosition.x, pointPosition.y);\n\n for (let i = 1; i < labelCount; i++) {\n pointPosition = scale.getPointPosition(i, radius);\n ctx.lineTo(pointPosition.x, pointPosition.y);\n }\n }\n}\n\nfunction drawRadiusLine(scale, gridLineOpts, radius, labelCount, borderOpts) {\n const ctx = scale.ctx;\n const circular = gridLineOpts.circular;\n\n const {color, lineWidth} = gridLineOpts;\n\n if ((!circular && !labelCount) || !color || !lineWidth || radius < 0) {\n return;\n }\n\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth = lineWidth;\n ctx.setLineDash(borderOpts.dash || []);\n ctx.lineDashOffset = borderOpts.dashOffset;\n\n ctx.beginPath();\n pathRadiusLine(scale, radius, circular, labelCount);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n}\n\nfunction createPointLabelContext(parent, index, label) {\n return createContext(parent, {\n label,\n index,\n type: 'pointLabel'\n });\n}\n\nexport default class RadialLinearScale extends LinearScaleBase {\n\n static id = 'radialLinear';\n\n /**\n * @type {any}\n */\n static defaults = {\n display: true,\n\n // Boolean - Whether to animate scaling the chart from the centre\n animate: true,\n position: 'chartArea',\n\n angleLines: {\n display: true,\n lineWidth: 1,\n borderDash: [],\n borderDashOffset: 0.0\n },\n\n grid: {\n circular: false\n },\n\n startAngle: 0,\n\n // label settings\n ticks: {\n // Boolean - Show a backdrop to the scale label\n showLabelBackdrop: true,\n\n callback: Ticks.formatters.numeric\n },\n\n pointLabels: {\n backdropColor: undefined,\n\n // Number - The backdrop padding above & below the label in pixels\n backdropPadding: 2,\n\n // Boolean - if true, show point labels\n display: true,\n\n // Number - Point label font size in pixels\n font: {\n size: 10\n },\n\n // Function - Used to convert point labels\n callback(label) {\n return label;\n },\n\n // Number - Additionl padding between scale and pointLabel\n padding: 5,\n\n // Boolean - if true, center point labels to slices in polar chart\n centerPointLabels: false\n }\n };\n\n static defaultRoutes = {\n 'angleLines.color': 'borderColor',\n 'pointLabels.color': 'color',\n 'ticks.color': 'color'\n };\n\n static descriptors = {\n angleLines: {\n _fallback: 'grid'\n }\n };\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.xCenter = undefined;\n /** @type {number} */\n this.yCenter = undefined;\n /** @type {number} */\n this.drawingArea = undefined;\n /** @type {string[]} */\n this._pointLabels = [];\n this._pointLabelItems = [];\n }\n\n setDimensions() {\n // Set the unconstrained dimension before label rotation\n const padding = this._padding = toPadding(getTickBackdropHeight(this.options) / 2);\n const w = this.width = this.maxWidth - padding.width;\n const h = this.height = this.maxHeight - padding.height;\n this.xCenter = Math.floor(this.left + w / 2 + padding.left);\n this.yCenter = Math.floor(this.top + h / 2 + padding.top);\n this.drawingArea = Math.floor(Math.min(w, h) / 2);\n }\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(false);\n\n this.min = isFinite(min) && !isNaN(min) ? min : 0;\n this.max = isFinite(max) && !isNaN(max) ? max : 0;\n\n // Common base implementation to handle min, max, beginAtZero\n this.handleTickRangeOptions();\n }\n\n /**\n\t * Returns the maximum number of ticks based on the scale dimension\n\t * @protected\n\t */\n computeTickLimit() {\n return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));\n }\n\n generateTickLabels(ticks) {\n LinearScaleBase.prototype.generateTickLabels.call(this, ticks);\n\n // Point labels\n this._pointLabels = this.getLabels()\n .map((value, index) => {\n const label = callCallback(this.options.pointLabels.callback, [value, index], this);\n return label || label === 0 ? label : '';\n })\n .filter((v, i) => this.chart.getDataVisibility(i));\n }\n\n fit() {\n const opts = this.options;\n\n if (opts.display && opts.pointLabels.display) {\n fitWithPointLabels(this);\n } else {\n this.setCenterPoint(0, 0, 0, 0);\n }\n }\n\n setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) {\n this.xCenter += Math.floor((leftMovement - rightMovement) / 2);\n this.yCenter += Math.floor((topMovement - bottomMovement) / 2);\n this.drawingArea -= Math.min(this.drawingArea / 2, Math.max(leftMovement, rightMovement, topMovement, bottomMovement));\n }\n\n getIndexAngle(index) {\n const angleMultiplier = TAU / (this._pointLabels.length || 1);\n const startAngle = this.options.startAngle || 0;\n\n return _normalizeAngle(index * angleMultiplier + toRadians(startAngle));\n }\n\n getDistanceFromCenterForValue(value) {\n if (isNullOrUndef(value)) {\n return NaN;\n }\n\n // Take into account half font size + the yPadding of the top value\n const scalingFactor = this.drawingArea / (this.max - this.min);\n if (this.options.reverse) {\n return (this.max - value) * scalingFactor;\n }\n return (value - this.min) * scalingFactor;\n }\n\n getValueForDistanceFromCenter(distance) {\n if (isNullOrUndef(distance)) {\n return NaN;\n }\n\n const scaledDistance = distance / (this.drawingArea / (this.max - this.min));\n return this.options.reverse ? this.max - scaledDistance : this.min + scaledDistance;\n }\n\n getPointLabelContext(index) {\n const pointLabels = this._pointLabels || [];\n\n if (index >= 0 && index < pointLabels.length) {\n const pointLabel = pointLabels[index];\n return createPointLabelContext(this.getContext(), index, pointLabel);\n }\n }\n\n getPointPosition(index, distanceFromCenter, additionalAngle = 0) {\n const angle = this.getIndexAngle(index) - HALF_PI + additionalAngle;\n return {\n x: Math.cos(angle) * distanceFromCenter + this.xCenter,\n y: Math.sin(angle) * distanceFromCenter + this.yCenter,\n angle\n };\n }\n\n getPointPositionForValue(index, value) {\n return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n }\n\n getBasePosition(index) {\n return this.getPointPositionForValue(index || 0, this.getBaseValue());\n }\n\n getPointLabelPosition(index) {\n const {left, top, right, bottom} = this._pointLabelItems[index];\n return {\n left,\n top,\n right,\n bottom,\n };\n }\n\n /**\n\t * @protected\n\t */\n drawBackground() {\n const {backgroundColor, grid: {circular}} = this.options;\n if (backgroundColor) {\n const ctx = this.ctx;\n ctx.save();\n ctx.beginPath();\n pathRadiusLine(this, this.getDistanceFromCenterForValue(this._endValue), circular, this._pointLabels.length);\n ctx.closePath();\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n ctx.restore();\n }\n }\n\n /**\n\t * @protected\n\t */\n drawGrid() {\n const ctx = this.ctx;\n const opts = this.options;\n const {angleLines, grid, border} = opts;\n const labelCount = this._pointLabels.length;\n\n let i, offset, position;\n\n if (opts.pointLabels.display) {\n drawPointLabels(this, labelCount);\n }\n\n if (grid.display) {\n this.ticks.forEach((tick, index) => {\n if (index !== 0 || (index === 0 && this.min < 0)) {\n offset = this.getDistanceFromCenterForValue(tick.value);\n const context = this.getContext(index);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n\n drawRadiusLine(this, optsAtIndex, offset, labelCount, optsAtIndexBorder);\n }\n });\n }\n\n if (angleLines.display) {\n ctx.save();\n\n for (i = labelCount - 1; i >= 0; i--) {\n const optsAtIndex = angleLines.setContext(this.getPointLabelContext(i));\n const {color, lineWidth} = optsAtIndex;\n\n if (!lineWidth || !color) {\n continue;\n }\n\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = color;\n\n ctx.setLineDash(optsAtIndex.borderDash);\n ctx.lineDashOffset = optsAtIndex.borderDashOffset;\n\n offset = this.getDistanceFromCenterForValue(opts.reverse ? this.min : this.max);\n position = this.getPointPosition(i, offset);\n ctx.beginPath();\n ctx.moveTo(this.xCenter, this.yCenter);\n ctx.lineTo(position.x, position.y);\n ctx.stroke();\n }\n\n ctx.restore();\n }\n }\n\n /**\n\t * @protected\n\t */\n drawBorder() {}\n\n /**\n\t * @protected\n\t */\n drawLabels() {\n const ctx = this.ctx;\n const opts = this.options;\n const tickOpts = opts.ticks;\n\n if (!tickOpts.display) {\n return;\n }\n\n const startAngle = this.getIndexAngle(0);\n let offset, width;\n\n ctx.save();\n ctx.translate(this.xCenter, this.yCenter);\n ctx.rotate(startAngle);\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n\n this.ticks.forEach((tick, index) => {\n if ((index === 0 && this.min >= 0) && !opts.reverse) {\n return;\n }\n\n const optsAtIndex = tickOpts.setContext(this.getContext(index));\n const tickFont = toFont(optsAtIndex.font);\n offset = this.getDistanceFromCenterForValue(this.ticks[index].value);\n\n if (optsAtIndex.showLabelBackdrop) {\n ctx.font = tickFont.string;\n width = ctx.measureText(tick.label).width;\n ctx.fillStyle = optsAtIndex.backdropColor;\n\n const padding = toPadding(optsAtIndex.backdropPadding);\n ctx.fillRect(\n -width / 2 - padding.left,\n -offset - tickFont.size / 2 - padding.top,\n width + padding.width,\n tickFont.size + padding.height\n );\n }\n\n renderText(ctx, tick.label, 0, -offset, tickFont, {\n color: optsAtIndex.color,\n strokeColor: optsAtIndex.textStrokeColor,\n strokeWidth: optsAtIndex.textStrokeWidth,\n });\n });\n\n ctx.restore();\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {}\n}\n","import adapters from '../core/core.adapters.js';\nimport {callback as call, isFinite, isNullOrUndef, mergeIf, valueOrDefault} from '../helpers/helpers.core.js';\nimport {toRadians, isNumber, _limitValue} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport {_arrayUnique, _filterBetween, _lookup} from '../helpers/helpers.collection.js';\n\n/**\n * @typedef { import('../core/core.adapters.js').TimeUnit } Unit\n * @typedef {{common: boolean, size: number, steps?: number}} Interval\n * @typedef { import('../core/core.adapters.js').DateAdapter } DateAdapter\n */\n\n/**\n * @type {Object}\n */\nconst INTERVALS = {\n millisecond: {common: true, size: 1, steps: 1000},\n second: {common: true, size: 1000, steps: 60},\n minute: {common: true, size: 60000, steps: 60},\n hour: {common: true, size: 3600000, steps: 24},\n day: {common: true, size: 86400000, steps: 30},\n week: {common: false, size: 604800000, steps: 4},\n month: {common: true, size: 2.628e9, steps: 12},\n quarter: {common: false, size: 7.884e9, steps: 4},\n year: {common: true, size: 3.154e10}\n};\n\n/**\n * @type {Unit[]}\n */\nconst UNITS = /** @type Unit[] */ /* #__PURE__ */ (Object.keys(INTERVALS));\n\n/**\n * @param {number} a\n * @param {number} b\n */\nfunction sorter(a, b) {\n return a - b;\n}\n\n/**\n * @param {TimeScale} scale\n * @param {*} input\n * @return {number}\n */\nfunction parse(scale, input) {\n if (isNullOrUndef(input)) {\n return null;\n }\n\n const adapter = scale._adapter;\n const {parser, round, isoWeekday} = scale._parseOpts;\n let value = input;\n\n if (typeof parser === 'function') {\n value = parser(value);\n }\n\n // Only parse if it's not a timestamp already\n if (!isFinite(value)) {\n value = typeof parser === 'string'\n ? adapter.parse(value, parser)\n : adapter.parse(value);\n }\n\n if (value === null) {\n return null;\n }\n\n if (round) {\n value = round === 'week' && (isNumber(isoWeekday) || isoWeekday === true)\n ? adapter.startOf(value, 'isoWeek', isoWeekday)\n : adapter.startOf(value, round);\n }\n\n return +value;\n}\n\n/**\n * Figures out what unit results in an appropriate number of auto-generated ticks\n * @param {Unit} minUnit\n * @param {number} min\n * @param {number} max\n * @param {number} capacity\n * @return {object}\n */\nfunction determineUnitForAutoTicks(minUnit, min, max, capacity) {\n const ilen = UNITS.length;\n\n for (let i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {\n const interval = INTERVALS[UNITS[i]];\n const factor = interval.steps ? interval.steps : Number.MAX_SAFE_INTEGER;\n\n if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n return UNITS[i];\n }\n }\n\n return UNITS[ilen - 1];\n}\n\n/**\n * Figures out what unit to format a set of ticks with\n * @param {TimeScale} scale\n * @param {number} numTicks\n * @param {Unit} minUnit\n * @param {number} min\n * @param {number} max\n * @return {Unit}\n */\nfunction determineUnitForFormatting(scale, numTicks, minUnit, min, max) {\n for (let i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--) {\n const unit = UNITS[i];\n if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) {\n return unit;\n }\n }\n\n return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n}\n\n/**\n * @param {Unit} unit\n * @return {object}\n */\nfunction determineMajorUnit(unit) {\n for (let i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) {\n if (INTERVALS[UNITS[i]].common) {\n return UNITS[i];\n }\n }\n}\n\n/**\n * @param {object} ticks\n * @param {number} time\n * @param {number[]} [timestamps] - if defined, snap to these timestamps\n */\nfunction addTick(ticks, time, timestamps) {\n if (!timestamps) {\n ticks[time] = true;\n } else if (timestamps.length) {\n const {lo, hi} = _lookup(timestamps, time);\n const timestamp = timestamps[lo] >= time ? timestamps[lo] : timestamps[hi];\n ticks[timestamp] = true;\n }\n}\n\n/**\n * @param {TimeScale} scale\n * @param {object[]} ticks\n * @param {object} map\n * @param {Unit} majorUnit\n * @return {object[]}\n */\nfunction setMajorTicks(scale, ticks, map, majorUnit) {\n const adapter = scale._adapter;\n const first = +adapter.startOf(ticks[0].value, majorUnit);\n const last = ticks[ticks.length - 1].value;\n let major, index;\n\n for (major = first; major <= last; major = +adapter.add(major, 1, majorUnit)) {\n index = map[major];\n if (index >= 0) {\n ticks[index].major = true;\n }\n }\n return ticks;\n}\n\n/**\n * @param {TimeScale} scale\n * @param {number[]} values\n * @param {Unit|undefined} [majorUnit]\n * @return {object[]}\n */\nfunction ticksFromTimestamps(scale, values, majorUnit) {\n const ticks = [];\n /** @type {Object} */\n const map = {};\n const ilen = values.length;\n let i, value;\n\n for (i = 0; i < ilen; ++i) {\n value = values[i];\n map[value] = i;\n\n ticks.push({\n value,\n major: false\n });\n }\n\n // We set the major ticks separately from the above loop because calling startOf for every tick\n // is expensive when there is a large number of ticks\n return (ilen === 0 || !majorUnit) ? ticks : setMajorTicks(scale, ticks, map, majorUnit);\n}\n\nexport default class TimeScale extends Scale {\n\n static id = 'time';\n\n /**\n * @type {any}\n */\n static defaults = {\n /**\n * Scale boundary strategy (bypassed by min/max time options)\n * - `data`: make sure data are fully visible, ticks outside are removed\n * - `ticks`: make sure ticks are fully visible, data outside are truncated\n * @see https://github.com/chartjs/Chart.js/pull/4556\n * @since 2.7.0\n */\n bounds: 'data',\n\n adapters: {},\n time: {\n parser: false, // false == a pattern string from or a custom callback that converts its argument to a timestamp\n unit: false, // false == automatic or override with week, month, year, etc.\n round: false, // none, or override with week, month, year, etc.\n isoWeekday: false, // override week start day\n minUnit: 'millisecond',\n displayFormats: {}\n },\n ticks: {\n /**\n * Ticks generation input values:\n * - 'auto': generates \"optimal\" ticks based on scale size and time options.\n * - 'data': generates ticks from data (including labels from data {t|x|y} objects).\n * - 'labels': generates ticks from user given `data.labels` values ONLY.\n * @see https://github.com/chartjs/Chart.js/pull/4507\n * @since 2.7.0\n */\n source: 'auto',\n\n callback: false,\n\n major: {\n enabled: false\n }\n }\n };\n\n /**\n\t * @param {object} props\n\t */\n constructor(props) {\n super(props);\n\n /** @type {{data: number[], labels: number[], all: number[]}} */\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n\n /** @type {Unit} */\n this._unit = 'day';\n /** @type {Unit=} */\n this._majorUnit = undefined;\n this._offsets = {};\n this._normalized = false;\n this._parseOpts = undefined;\n }\n\n init(scaleOpts, opts = {}) {\n const time = scaleOpts.time || (scaleOpts.time = {});\n /** @type {DateAdapter} */\n const adapter = this._adapter = new adapters._date(scaleOpts.adapters.date);\n\n adapter.init(opts);\n\n // Backward compatibility: before introducing adapter, `displayFormats` was\n // supposed to contain *all* unit/string pairs but this can't be resolved\n // when loading the scale (adapters are loaded afterward), so let's populate\n // missing formats on update\n mergeIf(time.displayFormats, adapter.formats());\n\n this._parseOpts = {\n parser: time.parser,\n round: time.round,\n isoWeekday: time.isoWeekday\n };\n\n super.init(scaleOpts);\n\n this._normalized = opts.normalized;\n }\n\n /**\n\t * @param {*} raw\n\t * @param {number?} [index]\n\t * @return {number}\n\t */\n parse(raw, index) { // eslint-disable-line no-unused-vars\n if (raw === undefined) {\n return null;\n }\n return parse(this, raw);\n }\n\n beforeLayout() {\n super.beforeLayout();\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n }\n\n determineDataLimits() {\n const options = this.options;\n const adapter = this._adapter;\n const unit = options.time.unit || 'day';\n // eslint-disable-next-line prefer-const\n let {min, max, minDefined, maxDefined} = this.getUserBounds();\n\n /**\n\t\t * @param {object} bounds\n\t\t */\n function _applyBounds(bounds) {\n if (!minDefined && !isNaN(bounds.min)) {\n min = Math.min(min, bounds.min);\n }\n if (!maxDefined && !isNaN(bounds.max)) {\n max = Math.max(max, bounds.max);\n }\n }\n\n // If we have user provided `min` and `max` labels / data bounds can be ignored\n if (!minDefined || !maxDefined) {\n // Labels are always considered, when user did not force bounds\n _applyBounds(this._getLabelBounds());\n\n // If `bounds` is `'ticks'` and `ticks.source` is `'labels'`,\n // data bounds are ignored (and don't need to be determined)\n if (options.bounds !== 'ticks' || options.ticks.source !== 'labels') {\n _applyBounds(this.getMinMax(false));\n }\n }\n\n min = isFinite(min) && !isNaN(min) ? min : +adapter.startOf(Date.now(), unit);\n max = isFinite(max) && !isNaN(max) ? max : +adapter.endOf(Date.now(), unit) + 1;\n\n // Make sure that max is strictly higher than min (required by the timeseries lookup table)\n this.min = Math.min(min, max - 1);\n this.max = Math.max(min + 1, max);\n }\n\n /**\n\t * @private\n\t */\n _getLabelBounds() {\n const arr = this.getLabelTimestamps();\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n\n if (arr.length) {\n min = arr[0];\n max = arr[arr.length - 1];\n }\n return {min, max};\n }\n\n /**\n\t * @return {object[]}\n\t */\n buildTicks() {\n const options = this.options;\n const timeOpts = options.time;\n const tickOpts = options.ticks;\n const timestamps = tickOpts.source === 'labels' ? this.getLabelTimestamps() : this._generate();\n\n if (options.bounds === 'ticks' && timestamps.length) {\n this.min = this._userMin || timestamps[0];\n this.max = this._userMax || timestamps[timestamps.length - 1];\n }\n\n const min = this.min;\n const max = this.max;\n\n const ticks = _filterBetween(timestamps, min, max);\n\n // PRIVATE\n // determineUnitForFormatting relies on the number of ticks so we don't use it when\n // autoSkip is enabled because we don't yet know what the final number of ticks will be\n this._unit = timeOpts.unit || (tickOpts.autoSkip\n ? determineUnitForAutoTicks(timeOpts.minUnit, this.min, this.max, this._getLabelCapacity(min))\n : determineUnitForFormatting(this, ticks.length, timeOpts.minUnit, this.min, this.max));\n this._majorUnit = !tickOpts.major.enabled || this._unit === 'year' ? undefined\n : determineMajorUnit(this._unit);\n this.initOffsets(timestamps);\n\n if (options.reverse) {\n ticks.reverse();\n }\n\n return ticksFromTimestamps(this, ticks, this._majorUnit);\n }\n\n afterAutoSkip() {\n // Offsets for bar charts need to be handled with the auto skipped\n // ticks. Once ticks have been skipped, we re-compute the offsets.\n if (this.options.offsetAfterAutoskip) {\n this.initOffsets(this.ticks.map(tick => +tick.value));\n }\n }\n\n /**\n\t * Returns the start and end offsets from edges in the form of {start, end}\n\t * where each value is a relative width to the scale and ranges between 0 and 1.\n\t * They add extra margins on the both sides by scaling down the original scale.\n\t * Offsets are added when the `offset` option is true.\n\t * @param {number[]} timestamps\n\t * @protected\n\t */\n initOffsets(timestamps = []) {\n let start = 0;\n let end = 0;\n let first, last;\n\n if (this.options.offset && timestamps.length) {\n first = this.getDecimalForValue(timestamps[0]);\n if (timestamps.length === 1) {\n start = 1 - first;\n } else {\n start = (this.getDecimalForValue(timestamps[1]) - first) / 2;\n }\n last = this.getDecimalForValue(timestamps[timestamps.length - 1]);\n if (timestamps.length === 1) {\n end = last;\n } else {\n end = (last - this.getDecimalForValue(timestamps[timestamps.length - 2])) / 2;\n }\n }\n const limit = timestamps.length < 3 ? 0.5 : 0.25;\n start = _limitValue(start, 0, limit);\n end = _limitValue(end, 0, limit);\n\n this._offsets = {start, end, factor: 1 / (start + 1 + end)};\n }\n\n /**\n\t * Generates a maximum of `capacity` timestamps between min and max, rounded to the\n\t * `minor` unit using the given scale time `options`.\n\t * Important: this method can return ticks outside the min and max range, it's the\n\t * responsibility of the calling code to clamp values if needed.\n\t * @protected\n\t */\n _generate() {\n const adapter = this._adapter;\n const min = this.min;\n const max = this.max;\n const options = this.options;\n const timeOpts = options.time;\n // @ts-ignore\n const minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, this._getLabelCapacity(min));\n const stepSize = valueOrDefault(options.ticks.stepSize, 1);\n const weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n const hasWeekday = isNumber(weekday) || weekday === true;\n const ticks = {};\n let first = min;\n let time, count;\n\n // For 'week' unit, handle the first day of week option\n if (hasWeekday) {\n first = +adapter.startOf(first, 'isoWeek', weekday);\n }\n\n // Align first ticks on unit\n first = +adapter.startOf(first, hasWeekday ? 'day' : minor);\n\n // Prevent browser from freezing in case user options request millions of milliseconds\n if (adapter.diff(max, min, minor) > 100000 * stepSize) {\n throw new Error(min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor);\n }\n\n const timestamps = options.ticks.source === 'data' && this.getDataTimestamps();\n for (time = first, count = 0; time < max; time = +adapter.add(time, stepSize, minor), count++) {\n addTick(ticks, time, timestamps);\n }\n\n if (time === max || options.bounds === 'ticks' || count === 1) {\n addTick(ticks, time, timestamps);\n }\n\n // @ts-ignore\n return Object.keys(ticks).sort(sorter).map(x => +x);\n }\n\n /**\n\t * @param {number} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n const adapter = this._adapter;\n const timeOpts = this.options.time;\n\n if (timeOpts.tooltipFormat) {\n return adapter.format(value, timeOpts.tooltipFormat);\n }\n return adapter.format(value, timeOpts.displayFormats.datetime);\n }\n\n /**\n\t * @param {number} value\n\t * @param {string|undefined} format\n\t * @return {string}\n\t */\n format(value, format) {\n const options = this.options;\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const fmt = format || formats[unit];\n return this._adapter.format(value, fmt);\n }\n\n /**\n\t * Function to format an individual tick mark\n\t * @param {number} time\n\t * @param {number} index\n\t * @param {object[]} ticks\n\t * @param {string|undefined} [format]\n\t * @return {string}\n\t * @private\n\t */\n _tickFormatFunction(time, index, ticks, format) {\n const options = this.options;\n const formatter = options.ticks.callback;\n\n if (formatter) {\n return call(formatter, [time, index, ticks], this);\n }\n\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const majorUnit = this._majorUnit;\n const minorFormat = unit && formats[unit];\n const majorFormat = majorUnit && formats[majorUnit];\n const tick = ticks[index];\n const major = majorUnit && majorFormat && tick && tick.major;\n\n return this._adapter.format(time, format || (major ? majorFormat : minorFormat));\n }\n\n /**\n\t * @param {object[]} ticks\n\t */\n generateTickLabels(ticks) {\n let i, ilen, tick;\n\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n tick = ticks[i];\n tick.label = this._tickFormatFunction(tick.value, i, ticks);\n }\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getDecimalForValue(value) {\n return value === null ? NaN : (value - this.min) / (this.max - this.min);\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getPixelForValue(value) {\n const offsets = this._offsets;\n const pos = this.getDecimalForValue(value);\n return this.getPixelForDecimal((offsets.start + pos) * offsets.factor);\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const pos = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return this.min + pos * (this.max - this.min);\n }\n\n /**\n\t * @param {string} label\n\t * @return {{w:number, h:number}}\n\t * @private\n\t */\n _getLabelSize(label) {\n const ticksOpts = this.options.ticks;\n const tickLabelWidth = this.ctx.measureText(label).width;\n const angle = toRadians(this.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);\n const cosRotation = Math.cos(angle);\n const sinRotation = Math.sin(angle);\n const tickFontSize = this._resolveTickFontOptions(0).size;\n\n return {\n w: (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation),\n h: (tickLabelWidth * sinRotation) + (tickFontSize * cosRotation)\n };\n }\n\n /**\n\t * @param {number} exampleTime\n\t * @return {number}\n\t * @private\n\t */\n _getLabelCapacity(exampleTime) {\n const timeOpts = this.options.time;\n const displayFormats = timeOpts.displayFormats;\n\n // pick the longest format (milliseconds) for guesstimation\n const format = displayFormats[timeOpts.unit] || displayFormats.millisecond;\n const exampleLabel = this._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(this, [exampleTime], this._majorUnit), format);\n const size = this._getLabelSize(exampleLabel);\n // subtract 1 - if offset then there's one less label than tick\n // if not offset then one half label padding is added to each end leaving room for one less label\n const capacity = Math.floor(this.isHorizontal() ? this.width / size.w : this.height / size.h) - 1;\n return capacity > 0 ? capacity : 1;\n }\n\n /**\n\t * @protected\n\t */\n getDataTimestamps() {\n let timestamps = this._cache.data || [];\n let i, ilen;\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const metas = this.getMatchingVisibleMetas();\n\n if (this._normalized && metas.length) {\n return (this._cache.data = metas[0].controller.getAllParsedValues(this));\n }\n\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(this));\n }\n\n return (this._cache.data = this.normalize(timestamps));\n }\n\n /**\n\t * @protected\n\t */\n getLabelTimestamps() {\n const timestamps = this._cache.labels || [];\n let i, ilen;\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const labels = this.getLabels();\n for (i = 0, ilen = labels.length; i < ilen; ++i) {\n timestamps.push(parse(this, labels[i]));\n }\n\n return (this._cache.labels = this._normalized ? timestamps : this.normalize(timestamps));\n }\n\n /**\n\t * @param {number[]} values\n\t * @protected\n\t */\n normalize(values) {\n // It seems to be somewhat faster to do sorting first\n return _arrayUnique(values.sort(sorter));\n }\n}\n","import TimeScale from './scale.time.js';\nimport {_lookupByKey} from '../helpers/helpers.collection.js';\n\n/**\n * Linearly interpolates the given source `val` using the table. If value is out of bounds, values\n * at edges are used for the interpolation.\n * @param {object} table\n * @param {number} val\n * @param {boolean} [reverse] lookup time based on position instead of vice versa\n * @return {object}\n */\nfunction interpolate(table, val, reverse) {\n let lo = 0;\n let hi = table.length - 1;\n let prevSource, nextSource, prevTarget, nextTarget;\n if (reverse) {\n if (val >= table[lo].pos && val <= table[hi].pos) {\n ({lo, hi} = _lookupByKey(table, 'pos', val));\n }\n ({pos: prevSource, time: prevTarget} = table[lo]);\n ({pos: nextSource, time: nextTarget} = table[hi]);\n } else {\n if (val >= table[lo].time && val <= table[hi].time) {\n ({lo, hi} = _lookupByKey(table, 'time', val));\n }\n ({time: prevSource, pos: prevTarget} = table[lo]);\n ({time: nextSource, pos: nextTarget} = table[hi]);\n }\n\n const span = nextSource - prevSource;\n return span ? prevTarget + (nextTarget - prevTarget) * (val - prevSource) / span : prevTarget;\n}\n\nclass TimeSeriesScale extends TimeScale {\n\n static id = 'timeseries';\n\n /**\n * @type {any}\n */\n static defaults = TimeScale.defaults;\n\n /**\n\t * @param {object} props\n\t */\n constructor(props) {\n super(props);\n\n /** @type {object[]} */\n this._table = [];\n /** @type {number} */\n this._minPos = undefined;\n /** @type {number} */\n this._tableRange = undefined;\n }\n\n /**\n\t * @protected\n\t */\n initOffsets() {\n const timestamps = this._getTimestampsForTable();\n const table = this._table = this.buildLookupTable(timestamps);\n this._minPos = interpolate(table, this.min);\n this._tableRange = interpolate(table, this.max) - this._minPos;\n super.initOffsets(timestamps);\n }\n\n /**\n\t * Returns an array of {time, pos} objects used to interpolate a specific `time` or position\n\t * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is\n\t * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other\n\t * extremity (left + width or top + height). Note that it would be more optimized to directly\n\t * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need\n\t * to create the lookup table. The table ALWAYS contains at least two items: min and max.\n\t * @param {number[]} timestamps\n\t * @return {object[]}\n\t * @protected\n\t */\n buildLookupTable(timestamps) {\n const {min, max} = this;\n const items = [];\n const table = [];\n let i, ilen, prev, curr, next;\n\n for (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n curr = timestamps[i];\n if (curr >= min && curr <= max) {\n items.push(curr);\n }\n }\n\n if (items.length < 2) {\n // In case there is less that 2 timestamps between min and max, the scale is defined by min and max\n return [\n {time: min, pos: 0},\n {time: max, pos: 1}\n ];\n }\n\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n next = items[i + 1];\n prev = items[i - 1];\n curr = items[i];\n\n // only add points that breaks the scale linearity\n if (Math.round((next + prev) / 2) !== curr) {\n table.push({time: curr, pos: i / (ilen - 1)});\n }\n }\n return table;\n }\n\n /**\n * Generates all timestamps defined in the data.\n * Important: this method can return ticks outside the min and max range, it's the\n * responsibility of the calling code to clamp values if needed.\n * @protected\n */\n _generate() {\n const min = this.min;\n const max = this.max;\n let timestamps = super.getDataTimestamps();\n if (!timestamps.includes(min) || !timestamps.length) {\n timestamps.splice(0, 0, min);\n }\n if (!timestamps.includes(max) || timestamps.length === 1) {\n timestamps.push(max);\n }\n return timestamps.sort((a, b) => a - b);\n }\n\n /**\n\t * Returns all timestamps\n\t * @return {number[]}\n\t * @private\n\t */\n _getTimestampsForTable() {\n let timestamps = this._cache.all || [];\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const data = this.getDataTimestamps();\n const label = this.getLabelTimestamps();\n if (data.length && label.length) {\n // If combining labels and data (data might not contain all labels),\n // we need to recheck uniqueness and sort\n timestamps = this.normalize(data.concat(label));\n } else {\n timestamps = data.length ? data : label;\n }\n timestamps = this._cache.all = timestamps;\n\n return timestamps;\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getDecimalForValue(value) {\n return (interpolate(this._table, value) - this._minPos) / this._tableRange;\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const decimal = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return interpolate(this._table, decimal * this._tableRange + this._minPos, true);\n }\n}\n\nexport default TimeSeriesScale;\n","import type { PropType } from 'vue'\nimport type {\n ChartType,\n ChartData,\n ChartOptions,\n Plugin,\n UpdateMode\n} from 'chart.js'\n\nexport const CommonProps = {\n data: {\n type: Object as PropType,\n required: true\n },\n options: {\n type: Object as PropType,\n default: () => ({})\n },\n plugins: {\n type: Array as PropType,\n default: () => []\n },\n datasetIdKey: {\n type: String,\n default: 'label'\n },\n updateMode: {\n type: String as PropType,\n default: undefined\n }\n} as const\n\nexport const A11yProps = {\n ariaLabel: {\n type: String\n },\n ariaDescribedby: {\n type: String\n }\n} as const\n\nexport const Props = {\n type: {\n type: String as PropType,\n required: true\n },\n destroyDelay: {\n type: Number,\n default: 0 // No delay by default\n },\n ...CommonProps,\n ...A11yProps\n} as const\n","import { isProxy, toRaw, version } from 'vue'\nimport type {\n Chart,\n ChartType,\n ChartData,\n ChartDataset,\n ChartOptions,\n DefaultDataPoint\n} from 'chart.js'\n\nexport const compatProps =\n version[0] === '2'\n ? (internals: I, props: T) =>\n Object.assign(internals, { attrs: props }) as unknown as I & T\n : (internals: I, props: T) =>\n Object.assign(internals, props)\n\nexport function toRawIfProxy(obj: T) {\n return isProxy(obj) ? toRaw(obj) : obj\n}\n\nexport function cloneProxy(obj: T, src = obj) {\n return isProxy(src) ? new Proxy(obj, {}) : obj\n}\n\nexport function setOptions<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(chart: Chart, nextOptions: ChartOptions) {\n const options = chart.options\n\n if (options && nextOptions) {\n Object.assign(options, nextOptions)\n }\n}\n\nexport function setLabels<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(\n currentData: ChartData,\n nextLabels: TLabel[] | undefined\n) {\n currentData.labels = nextLabels\n}\n\nexport function setDatasets<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(\n currentData: ChartData,\n nextDatasets: ChartDataset[],\n datasetIdKey: string\n) {\n const addedDatasets: ChartDataset[] = []\n\n currentData.datasets = nextDatasets.map(\n (nextDataset: Record) => {\n // given the new set, find it's current match\n const currentDataset = currentData.datasets.find(\n (dataset: Record) =>\n dataset[datasetIdKey] === nextDataset[datasetIdKey]\n )\n\n // There is no original to update, so simply add new one\n if (\n !currentDataset ||\n !nextDataset.data ||\n addedDatasets.includes(currentDataset)\n ) {\n return { ...nextDataset } as ChartDataset\n }\n\n addedDatasets.push(currentDataset)\n\n Object.assign(currentDataset, nextDataset)\n\n return currentDataset\n }\n )\n}\n\nexport function cloneData<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(data: ChartData, datasetIdKey: string) {\n const nextData: ChartData = {\n labels: [],\n datasets: []\n }\n\n setLabels(nextData, data.labels)\n setDatasets(nextData, data.datasets, datasetIdKey)\n\n return nextData\n}\n\n/**\n * Get dataset from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getDatasetAtEvent(chart: Chart, event: MouseEvent) {\n return chart.getElementsAtEventForMode(\n event,\n 'dataset',\n { intersect: true },\n false\n )\n}\n\n/**\n * Get single dataset element from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getElementAtEvent(chart: Chart, event: MouseEvent) {\n return chart.getElementsAtEventForMode(\n event,\n 'nearest',\n { intersect: true },\n false\n )\n}\n\n/**\n * Get all dataset elements from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getElementsAtEvent(chart: Chart, event: MouseEvent) {\n return chart.getElementsAtEventForMode(\n event,\n 'index',\n { intersect: true },\n false\n )\n}\n","import { Chart as ChartJS } from 'chart.js'\nimport {\n defineComponent,\n h,\n nextTick,\n onUnmounted,\n onMounted,\n ref,\n shallowRef,\n toRaw,\n watch\n} from 'vue'\n\nimport type { ChartComponent } from './types.js'\nimport { Props } from './props.js'\nimport {\n cloneData,\n setLabels,\n setDatasets,\n setOptions,\n toRawIfProxy,\n cloneProxy\n} from './utils.js'\n\nexport const Chart = defineComponent({\n props: Props,\n setup(props, { expose, slots }) {\n const canvasRef = ref(null)\n const chartRef = shallowRef(null)\n\n expose({ chart: chartRef })\n\n const renderChart = () => {\n if (!canvasRef.value) return\n\n const { type, data, options, plugins, datasetIdKey } = props\n const clonedData = cloneData(data, datasetIdKey)\n const proxiedData = cloneProxy(clonedData, data)\n\n chartRef.value = new ChartJS(canvasRef.value, {\n type,\n data: proxiedData,\n options: { ...options },\n plugins\n })\n }\n\n const destroyChart = () => {\n const chart = toRaw(chartRef.value)\n\n if (chart) {\n if (props.destroyDelay > 0) {\n setTimeout(() => {\n chart.destroy()\n chartRef.value = null\n }, props.destroyDelay)\n } else {\n chart.destroy()\n chartRef.value = null\n }\n }\n }\n\n const update = (chart: ChartJS) => {\n chart.update(props.updateMode)\n }\n\n onMounted(renderChart)\n\n onUnmounted(destroyChart)\n\n watch(\n [() => props.options, () => props.data],\n (\n [nextOptionsProxy, nextDataProxy],\n [prevOptionsProxy, prevDataProxy]\n ) => {\n const chart = toRaw(chartRef.value)\n\n if (!chart) {\n return\n }\n\n let shouldUpdate = false\n\n if (nextOptionsProxy) {\n const nextOptions = toRawIfProxy(nextOptionsProxy)\n const prevOptions = toRawIfProxy(prevOptionsProxy)\n\n if (nextOptions && nextOptions !== prevOptions) {\n setOptions(chart, nextOptions)\n shouldUpdate = true\n }\n }\n\n if (nextDataProxy) {\n const nextLabels = toRawIfProxy(nextDataProxy.labels)\n const prevLabels = toRawIfProxy(prevDataProxy.labels)\n const nextDatasets = toRawIfProxy(nextDataProxy.datasets)\n const prevDatasets = toRawIfProxy(prevDataProxy.datasets)\n\n if (nextLabels !== prevLabels) {\n setLabels(chart.config.data, nextLabels)\n shouldUpdate = true\n }\n\n if (nextDatasets && nextDatasets !== prevDatasets) {\n setDatasets(chart.config.data, nextDatasets, props.datasetIdKey)\n shouldUpdate = true\n }\n }\n\n if (shouldUpdate) {\n nextTick(() => {\n update(chart)\n })\n }\n },\n { deep: true }\n )\n\n return () => {\n return h(\n 'canvas',\n {\n role: 'img',\n 'aria-label': props.ariaLabel,\n 'aria-describedby': props.ariaDescribedby,\n ref: canvasRef\n },\n [h('p', {}, [slots.default ? slots.default() : ''])]\n )\n }\n }\n}) as ChartComponent\n","import { defineComponent, shallowRef, h } from 'vue'\nimport type { ChartType, ChartComponentLike, DefaultDataPoint } from 'chart.js'\nimport {\n Chart as ChartJS,\n BarController,\n BubbleController,\n DoughnutController,\n LineController,\n PieController,\n PolarAreaController,\n RadarController,\n ScatterController\n} from 'chart.js'\nimport type { DistributiveArray } from 'chart.js/dist/types/utils'\nimport type { TypedChartComponent, ChartComponentRef } from './types.js'\nimport { CommonProps } from './props.js'\nimport { Chart } from './chart.js'\nimport { compatProps } from './utils.js'\n\nexport function createTypedChart<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(\n type: TType,\n registerables: ChartComponentLike\n): TypedChartComponent {\n ChartJS.register(registerables)\n\n return defineComponent({\n props: CommonProps,\n setup(props, { expose }) {\n const ref = shallowRef(null)\n const reforwardRef = (chartRef: ChartComponentRef) => {\n ref.value = chartRef?.chart\n }\n\n expose({ chart: ref })\n\n return () => {\n return h(\n Chart,\n compatProps(\n {\n ref: reforwardRef as any\n },\n {\n type,\n ...props\n }\n )\n )\n }\n }\n }) as any\n}\n\nexport interface ExtendedDataPoint {\n [key: string]: string | number | null | ExtendedDataPoint\n}\n\nexport const Bar = /* #__PURE__ */ createTypedChart<\n 'bar',\n DefaultDataPoint<'bar'> | DistributiveArray\n>('bar', BarController)\n\nexport const Doughnut = /* #__PURE__ */ createTypedChart(\n 'doughnut',\n DoughnutController\n)\n\nexport const Line = /* #__PURE__ */ createTypedChart('line', LineController)\n\nexport const Pie = /* #__PURE__ */ createTypedChart('pie', PieController)\n\nexport const PolarArea = /* #__PURE__ */ createTypedChart(\n 'polarArea',\n PolarAreaController\n)\n\nexport const Radar = /* #__PURE__ */ createTypedChart('radar', RadarController)\n\nexport const Bubble = /* #__PURE__ */ createTypedChart(\n 'bubble',\n BubbleController\n)\n\nexport const Scatter = /* #__PURE__ */ createTypedChart(\n 'scatter',\n ScatterController\n)\n","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport \"core-js/modules/es.iterator.reduce.js\";\nimport \"core-js/modules/web.url-search-params.delete.js\";\nimport \"core-js/modules/web.url-search-params.has.js\";\nimport \"core-js/modules/web.url-search-params.size.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport packageInfo from '../../package.json';\nimport { Doughnut } from 'vue-chartjs';\nimport { Chart as ChartJS, ArcElement, Tooltip, Legend } from 'chart.js';\nChartJS.register(ArcElement, Tooltip, Legend);\nexport default {\n name: 'SysCogStatus',\n components: {\n Doughnut\n },\n data() {\n return {\n loading: false,\n rebuilding: false,\n backing: false,\n restoring: false,\n indexInfo: {},\n version: packageInfo.version,\n // 从package.json获取版本号\n loadErrors: {\n newest: false,\n oldest: false\n },\n // 渠道图表颜色\n channelColors: ['#8B5CF6', '#EC4899', '#06B6D4', '#10B981', '#F59E0B', '#EF4444', '#6366F1', '#84CC16'],\n // 状态图表颜色\n typeColors: ['#10B981', '#3B82F6', '#F59E0B', '#EF4444', '#8B5CF6', '#EC4899', '#06B6D4', '#84CC16']\n };\n },\n computed: {\n // 渠道分布图表数据\n channelChartData() {\n const stats = this.indexInfo.channelStats || {};\n return {\n labels: Object.keys(stats),\n datasets: [{\n data: Object.values(stats),\n backgroundColor: this.channelColors.slice(0, Object.keys(stats).length),\n borderWidth: 0\n }]\n };\n },\n // 文件状态图表数据\n typeChartData() {\n const stats = this.indexInfo.typeStats || {};\n return {\n labels: Object.keys(stats).map(k => k || '未知类型'),\n datasets: [{\n data: Object.values(stats),\n backgroundColor: this.typeColors.slice(0, Object.keys(stats).length),\n borderWidth: 0\n }]\n };\n },\n // 图表配置\n chartOptions() {\n return {\n responsive: true,\n maintainAspectRatio: true,\n cutout: '65%',\n plugins: {\n legend: {\n display: false\n },\n tooltip: {\n backgroundColor: 'rgba(0, 0, 0, 0.8)',\n titleColor: '#fff',\n bodyColor: '#fff',\n padding: 12,\n cornerRadius: 8,\n displayColors: true,\n callbacks: {\n label: context => {\n const value = context.raw;\n const total = context.dataset.data.reduce((a, b) => a + b, 0);\n const percentage = (value / total * 100).toFixed(1);\n return ` ${value.toLocaleString()} (${percentage}%)`;\n }\n }\n }\n },\n animation: {\n animateRotate: true,\n animateScale: true\n }\n };\n }\n },\n mounted() {\n this.fetchIndexInfo();\n },\n methods: {\n // 获取渠道图表颜色\n getChartColor(index) {\n return this.channelColors[index % this.channelColors.length];\n },\n // 获取状态图表颜色\n getTypeChartColor(index) {\n return this.typeColors[index % this.typeColors.length];\n },\n // 获取索引信息\n async fetchIndexInfo() {\n this.loading = true;\n try {\n const response = await fetchWithAuth('/api/manage/list?action=info', {\n method: 'GET'\n });\n if (response.ok) {\n const data = await response.json();\n this.indexInfo = data;\n } else {\n throw new Error('API请求失败');\n }\n } catch (error) {\n console.error('获取索引信息失败:', error);\n this.$message.error('获取索引信息失败');\n } finally {\n this.loading = false;\n }\n },\n // 重建索引\n async rebuildIndex() {\n this.rebuilding = true;\n try {\n const response = await fetchWithAuth('/api/manage/list?action=rebuild', {\n method: 'GET'\n });\n if (response.ok) {\n this.$message.success('索引重建已启动,请稍后刷新查看最新状态');\n // 延迟刷新数据\n setTimeout(() => {\n this.fetchIndexInfo();\n }, 3000);\n } else {\n throw new Error('API请求失败');\n }\n } catch (error) {\n console.error('重建索引失败:', error);\n this.$message.error('重建索引失败');\n } finally {\n this.rebuilding = false;\n }\n },\n // 备份数据\n async backupData() {\n this.backing = true;\n try {\n const response = await fetchWithAuth('/api/manage/sysConfig/backup?action=backup', {\n method: 'GET'\n });\n if (response.ok) {\n // 创建下载链接\n const blob = await response.blob();\n const url = window.URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `imgbed_backup_${new Date().toISOString().split('T')[0]}.json`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n window.URL.revokeObjectURL(url);\n this.$message.success('备份文件已下载');\n } else {\n const errorData = await response.json();\n throw new Error(errorData.error || 'API请求失败');\n }\n } catch (error) {\n console.error('备份数据失败:', error);\n this.$message.error('备份数据失败: ' + error.message);\n } finally {\n this.backing = false;\n }\n },\n // 选择恢复文件\n selectRestoreFile() {\n if (this.restoring) return;\n this.$refs.fileInput.click();\n },\n // 处理文件选择\n async handleFileSelect(event) {\n const file = event.target.files[0];\n if (!file) return;\n if (!file.name.endsWith('.json')) {\n this.$message.error('请选择JSON格式的备份文件');\n return;\n }\n\n // 确认恢复操作\n try {\n await this.$confirm('恢复操作将覆盖现有的文件元数据和系统设置,此操作不可逆。确定要继续吗?', '确认恢复', {\n confirmButtonText: '确定恢复',\n cancelButtonText: '取消',\n type: 'warning'\n });\n await this.restoreData(file);\n } catch (error) {\n if (error !== 'cancel') {\n console.error('确认恢复失败:', error);\n }\n }\n\n // 清除文件选择\n event.target.value = '';\n },\n // 恢复数据\n async restoreData(file) {\n this.restoring = true;\n try {\n const response = await fetchWithAuth('/api/manage/sysConfig/backup?action=restore', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: await file.text()\n });\n if (response.ok) {\n const result = await response.json();\n this.$message.success(`恢复完成!已恢复 ${result.stats.restoredFiles} 个文件和 ${result.stats.restoredSettings} 个设置项`);\n // 刷新索引信息\n setTimeout(() => {\n this.fetchIndexInfo();\n }, 1000);\n } else {\n const errorData = await response.json();\n throw new Error(errorData.error || 'API请求失败');\n }\n } catch (error) {\n console.error('恢复数据失败:', error);\n this.$message.error('恢复数据失败: ' + error.message);\n } finally {\n this.restoring = false;\n }\n },\n // 格式化时间\n formatTime(timestamp) {\n if (!timestamp) return '未知';\n const date = new Date(timestamp);\n return date.toLocaleString('zh-CN', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit'\n });\n },\n // 计算百分比\n getPercentage(value, total) {\n if (!total || total === 0) return 0;\n return Math.round(value / total * 100);\n },\n // 计算时间差\n getTimeAgo(timestamp) {\n if (!timestamp) return '';\n const now = Date.now();\n const diff = now - timestamp;\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\n const days = Math.floor(diff / 86400000);\n if (days > 0) return `${days}天前`;\n if (hours > 0) return `${hours}小时前`;\n if (minutes > 0) return `${minutes}分钟前`;\n return '刚刚';\n },\n // 图片加载失败处理\n handleImageError(type) {\n this.loadErrors[type] = true;\n },\n // 检查是否应该显示预览图\n isValidPreview(type, file) {\n if (this.loadErrors[type]) return false;\n if (!file?.metadata?.FileType) return false;\n return file.metadata.FileType.includes('image') || file.metadata.FileType.includes('video');\n },\n // 打开发布页面\n openReleases() {\n window.open('https://github.com/MarSeventh/CloudFlare-ImgBed/releases', '_blank');\n },\n // 判断是否为图片文件\n isImageFile(file) {\n if (!file) return false;\n // 优先通过 FileType 判断\n if (file.metadata?.FileType?.includes('image')) return true;\n // 通过文件名后缀判断\n const fileName = file.metadata?.FileName || file.id || '';\n const extension = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();\n const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg', 'ico', 'tiff', 'tif', 'avif', 'heic', 'heif'];\n return imageExtensions.includes(extension);\n },\n // 判断是否为视频文件\n isVideoFile(file) {\n if (!file) return false;\n // 优先通过 FileType 判断\n if (file.metadata?.FileType?.includes('video')) return true;\n // 通过文件名后缀判断\n const fileName = file.metadata?.FileName || file.id || '';\n const extension = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();\n const videoExtensions = ['mp4', 'webm', 'ogg', 'avi', 'mov', 'flv', 'wmv', 'mkv', 'm4v', '3gp', 'mpeg', 'mpg'];\n return videoExtensions.includes(extension);\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogStatus.vue?vue&type=template&id=54756a6a&scoped=true\"\nimport script from \"./SysCogStatus.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogStatus.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogStatus.vue?vue&type=style&index=0&id=54756a6a&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-54756a6a\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createTextVNode as _createTextVNode, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, createBlock as _createBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"upload-settings\"\n};\nconst _hoisted_2 = {\n class: \"upload-channel\"\n};\nconst _hoisted_3 = {\n class: \"first-title\"\n};\nconst _hoisted_4 = {\n class: \"channel-settings\"\n};\nconst _hoisted_5 = {\n class: \"second-title\"\n};\nconst _hoisted_6 = {\n key: 0\n};\nconst _hoisted_7 = {\n key: 1\n};\nconst _hoisted_8 = {\n class: \"quota-status\"\n};\nconst _hoisted_9 = {\n key: 2\n};\nconst _hoisted_10 = {\n class: \"quota-status\"\n};\nconst _hoisted_11 = {\n key: 3\n};\nconst _hoisted_12 = {\n class: \"discord-limit-tip\"\n};\nconst _hoisted_13 = {\n class: \"discord-rate-limit-tip\"\n};\nconst _hoisted_14 = {\n key: 4\n};\nconst _hoisted_15 = {\n class: \"huggingface-tip\"\n};\nconst _hoisted_16 = {\n class: \"actions\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_radio = _resolveComponent(\"el-radio\");\n const _component_el_radio_group = _resolveComponent(\"el-radio-group\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_input_number = _resolveComponent(\"el-input-number\");\n const _component_el_progress = _resolveComponent(\"el-progress\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h3\", _hoisted_3, [_cache[5] || (_cache[5] = _createTextVNode(\"上传渠道 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"设置每类上传渠道的详细配置
点击“保存设置”会同时保存对每类配置的修改\",\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]), _createVNode(_component_el_radio_group, {\n modelValue: $data.activeChannel,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.activeChannel = $event)\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.channels, channel => {\n return _openBlock(), _createBlock(_component_el_radio, {\n key: channel.value,\n label: channel.value\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(channel.label), 1)]),\n _: 2\n }, 1032, [\"label\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\"])]), _createElementVNode(\"div\", _hoisted_4, [_createElementVNode(\"h4\", _hoisted_5, [_createTextVNode(_toDisplayString($options.activeChannelLabel) + \" 设置 \", 1), $data.activeChannel === 'telegram' ? (_openBlock(), _createBlock(_component_el_tooltip, {\n key: 0,\n content: \"为保证兼容性,v2版本前设置的 Telegram 相关环境变量请保留\",\n placement: \"right\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })) : _createCommentVNode(\"\", true)]), $data.activeChannel === 'telegram' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_6, [_createVNode(_component_el_form, {\n model: $data.telegramSettings,\n \"label-position\": \"top\",\n class: \"channel-form\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"负载均衡\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.telegramSettings.loadBalance.enabled,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $data.telegramSettings.loadBalance.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.telegramSettings.channels, (channel, index) => {\n return _openBlock(), _createBlock(_component_el_form, {\n key: index,\n model: channel,\n \"label-position\": \"top\",\n rules: $data.tgRules,\n ref_for: true,\n ref: \"tgChannelForm\",\n class: \"channel-form\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"渠道名\",\n prop: \"name\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.name,\n \"onUpdate:modelValue\": $event => channel.name = $event,\n disabled: channel.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"启用渠道\",\n prop: \"enabled\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: channel.enabled,\n \"onUpdate:modelValue\": $event => channel.enabled = $event\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"Bot Token\",\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.botToken,\n \"onUpdate:modelValue\": $event => channel.botToken = $event,\n disabled: channel.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"Chat ID\",\n prop: \"chatId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.chatId,\n \"onUpdate:modelValue\": $event => channel.chatId = $event,\n disabled: channel.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, null, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n type: \"danger\",\n onClick: $event => $options.deleteChannel(index),\n size: \"small\",\n disabled: channel.fixed\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"])]),\n _: 2\n }, 1024)]),\n _: 2\n }, 1032, [\"model\", \"rules\"]);\n }), 128))])) : _createCommentVNode(\"\", true), $data.activeChannel === 'cfr2' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.cfr2Settings.channels, (channel, index) => {\n return _openBlock(), _createBlock(_component_el_form, {\n model: channel,\n \"label-position\": \"top\",\n class: \"channel-form\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"渠道名\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.name,\n \"onUpdate:modelValue\": $event => channel.name = $event,\n disabled: channel.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"启用渠道\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: channel.enabled,\n \"onUpdate:modelValue\": $event => channel.enabled = $event\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_cache[6] || (_cache[6] = _createTextVNode(\" 公开访问链接 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"若启用图像审查,请设置该项\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.publicUrl,\n \"onUpdate:modelValue\": $event => channel.publicUrl = $event\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_cache[7] || (_cache[7] = _createTextVNode(\" 容量限制 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"启用后,当存储容量达到阈值时,该渠道将自动停止接收新文件,上传会自动切换到其他可用渠道\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: channel.quota.enabled,\n \"onUpdate:modelValue\": $event => channel.quota.enabled = $event,\n onChange: val => $options.onQuotaEnabledChange(val, channel)\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"onChange\"])]),\n _: 2\n }, 1024), channel.quota.enabled ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: \"容量上限 (GB)\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: channel.quota.limitGB,\n \"onUpdate:modelValue\": $event => channel.quota.limitGB = $event,\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024)) : _createCommentVNode(\"\", true), channel.quota.enabled ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 1\n }, {\n label: _withCtx(() => [_cache[8] || (_cache[8] = _createTextVNode(\" 阈值 (%) \", -1)), _createVNode(_component_el_tooltip, {\n content: \"当已用容量达到此百分比时停止写入,默认95%\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: channel.quota.threshold,\n \"onUpdate:modelValue\": $event => channel.quota.threshold = $event,\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024)) : _createCommentVNode(\"\", true), channel.quota.enabled && channel.name ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 2\n }, {\n label: _withCtx(() => [_cache[9] || (_cache[9] = _createTextVNode(\" 当前用量 \", -1)), _createVNode(_component_el_button, {\n link: \"\",\n type: \"primary\",\n onClick: $options.refreshQuota,\n loading: $data.quotaLoading,\n style: {\n \"margin-left\": \"8px\"\n }\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sync-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"loading\"])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_8, [_createVNode(_component_el_progress, {\n percentage: $options.getQuotaPercentage(channel),\n status: $options.getQuotaStatus(channel),\n \"stroke-width\": 20,\n \"text-inside\": true,\n format: () => $options.getQuotaText(channel)\n }, null, 8, [\"percentage\", \"status\", \"format\"]), _createElementVNode(\"div\", {\n class: _normalizeClass([\"quota-info\", {\n 'quota-warning': $options.isQuotaExceeded(channel)\n }])\n }, _toDisplayString($options.getQuotaStatusText(channel)), 3)])]),\n _: 2\n }, 1024)) : _createCommentVNode(\"\", true)]),\n _: 2\n }, 1032, [\"model\"]);\n }), 256))])) : _createCommentVNode(\"\", true), $data.activeChannel === 's3' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_9, [_createVNode(_component_el_form, {\n model: $data.s3Settings,\n \"label-position\": \"top\",\n class: \"channel-form\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"负载均衡\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.s3Settings.loadBalance.enabled,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.s3Settings.loadBalance.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.s3Settings.channels, (channel, index) => {\n return _openBlock(), _createBlock(_component_el_form, {\n model: channel,\n \"label-position\": \"top\",\n rules: $data.s3Rules,\n ref_for: true,\n ref: \"s3ChannelForm\",\n class: \"channel-form\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"渠道名\",\n prop: \"name\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.name,\n \"onUpdate:modelValue\": $event => channel.name = $event,\n disabled: channel.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"启用渠道\",\n prop: \"enabled\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: channel.enabled,\n \"onUpdate:modelValue\": $event => channel.enabled = $event\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n prop: \"endpoint\"\n }, {\n label: _withCtx(() => [_cache[10] || (_cache[10] = _createTextVNode(\" Endpoint \", -1)), _createVNode(_component_el_tooltip, {\n content: \"服务提供商 Endpoint,例如 https://s3.us-east-005.backblazeb2.com\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.endpoint,\n \"onUpdate:modelValue\": $event => channel.endpoint = $event,\n disabled: channel.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"路径风格\",\n prop: \"pathStyle\"\n }, {\n label: _withCtx(() => [_cache[11] || (_cache[11] = _createTextVNode(\" 路径风格 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"S3 路径风格/虚拟主机风格,使用 OpenList 作为 S3 提供者时需打开此开关
路径风格:https://s3.example.com/下方存储桶名称/文件路径
虚拟主机风格:https://下方存储桶名称.s3.example.com/文件路径\",\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: channel.pathStyle,\n \"onUpdate:modelValue\": $event => channel.pathStyle = $event,\n disabled: channel.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"存储桶名称\",\n prop: \"bucketName\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.bucketName,\n \"onUpdate:modelValue\": $event => channel.bucketName = $event,\n disabled: channel.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"存储桶区域\",\n prop: \"region\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.region,\n \"onUpdate:modelValue\": $event => channel.region = $event,\n placeholder: \"默认填写 auto 即可\",\n disabled: channel.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"访问密钥 ID\",\n prop: \"accessKeyId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.accessKeyId,\n \"onUpdate:modelValue\": $event => channel.accessKeyId = $event,\n disabled: channel.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"机密访问密钥\",\n prop: \"secretAccessKey\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.secretAccessKey,\n \"onUpdate:modelValue\": $event => channel.secretAccessKey = $event,\n disabled: channel.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_cache[12] || (_cache[12] = _createTextVNode(\" 容量限制 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"启用后,当存储容量达到阈值时,该渠道将自动停止接收新文件,上传会自动切换到其他可用渠道\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: channel.quota.enabled,\n \"onUpdate:modelValue\": $event => channel.quota.enabled = $event,\n onChange: val => $options.onQuotaEnabledChange(val, channel)\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"onChange\"])]),\n _: 2\n }, 1024), channel.quota.enabled ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: \"容量上限 (GB)\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: channel.quota.limitGB,\n \"onUpdate:modelValue\": $event => channel.quota.limitGB = $event,\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024)) : _createCommentVNode(\"\", true), channel.quota.enabled ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 1\n }, {\n label: _withCtx(() => [_cache[13] || (_cache[13] = _createTextVNode(\" 阈值 (%) \", -1)), _createVNode(_component_el_tooltip, {\n content: \"当已用容量达到此百分比时停止写入,默认95%\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: channel.quota.threshold,\n \"onUpdate:modelValue\": $event => channel.quota.threshold = $event,\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024)) : _createCommentVNode(\"\", true), channel.quota.enabled && channel.name ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 2\n }, {\n label: _withCtx(() => [_cache[14] || (_cache[14] = _createTextVNode(\" 当前用量 \", -1)), _createVNode(_component_el_button, {\n link: \"\",\n type: \"primary\",\n onClick: $options.refreshQuota,\n loading: $data.quotaLoading,\n style: {\n \"margin-left\": \"8px\"\n }\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sync-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"loading\"])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_10, [_createVNode(_component_el_progress, {\n percentage: $options.getQuotaPercentage(channel),\n status: $options.getQuotaStatus(channel),\n \"stroke-width\": 20,\n \"text-inside\": true,\n format: () => $options.getQuotaText(channel)\n }, null, 8, [\"percentage\", \"status\", \"format\"]), _createElementVNode(\"div\", {\n class: _normalizeClass([\"quota-info\", {\n 'quota-warning': $options.isQuotaExceeded(channel)\n }])\n }, _toDisplayString($options.getQuotaStatusText(channel)), 3)])]),\n _: 2\n }, 1024)) : _createCommentVNode(\"\", true), _createVNode(_component_el_form_item, null, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n type: \"danger\",\n onClick: $event => $options.deleteChannel(index),\n size: \"small\",\n disabled: channel.fixed\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"])]),\n _: 2\n }, 1024)]),\n _: 2\n }, 1032, [\"model\", \"rules\"]);\n }), 256))])) : _createCommentVNode(\"\", true), $data.activeChannel === 'discord' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_11, [_createVNode(_component_el_form, {\n model: $data.discordSettings,\n \"label-position\": \"top\",\n class: \"channel-form\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"负载均衡\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.discordSettings.loadBalance.enabled,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.discordSettings.loadBalance.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.discordSettings.channels, (channel, index) => {\n return _openBlock(), _createBlock(_component_el_form, {\n key: index,\n model: channel,\n \"label-position\": \"top\",\n rules: $data.discordRules,\n ref_for: true,\n ref: \"discordChannelForm\",\n class: \"channel-form\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"渠道名\",\n prop: \"name\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.name,\n \"onUpdate:modelValue\": $event => channel.name = $event,\n disabled: channel.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"启用渠道\",\n prop: \"enabled\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: channel.enabled,\n \"onUpdate:modelValue\": $event => channel.enabled = $event\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"Bot Token\",\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.botToken,\n \"onUpdate:modelValue\": $event => channel.botToken = $event,\n disabled: channel.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"Channel ID\",\n prop: \"channelId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.channelId,\n \"onUpdate:modelValue\": $event => channel.channelId = $event,\n disabled: channel.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_cache[15] || (_cache[15] = _createTextVNode(\" 代理域名 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"可选,用于国内访问 Discord CDN,填写代理域名(不含 https://)\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.proxyUrl,\n \"onUpdate:modelValue\": $event => channel.proxyUrl = $event,\n placeholder: \"例如: your-proxy.example.com\"\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_cache[16] || (_cache[16] = _createTextVNode(\" Nitro 会员 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"开启后单文件限制提升至 25MB,关闭则为 10MB\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: channel.isNitro,\n \"onUpdate:modelValue\": $event => channel.isNitro = $event\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, null, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_12, [_createVNode(_component_font_awesome_icon, {\n icon: \"info-circle\",\n style: {\n \"margin-right\": \"5px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(channel.isNitro ? 'Nitro 会员单文件限制 25MB' : 'Discord 免费用户单文件限制 10MB'), 1)])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, null, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_13, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n style: {\n \"margin-right\": \"5px\"\n }\n }), _cache[17] || (_cache[17] = _createTextVNode(\" Discord 有接口频率限制,不建议将其用作大规模并发场景 \", -1))])]),\n _: 1\n }), _createVNode(_component_el_form_item, null, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n type: \"danger\",\n onClick: $event => $options.deleteChannel(index),\n size: \"small\",\n disabled: channel.fixed\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"])]),\n _: 2\n }, 1024)]),\n _: 2\n }, 1032, [\"model\", \"rules\"]);\n }), 128))])) : _createCommentVNode(\"\", true), $data.activeChannel === 'huggingface' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_14, [_createVNode(_component_el_form, {\n model: $data.huggingfaceSettings,\n \"label-position\": \"top\",\n class: \"channel-form\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"负载均衡\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.huggingfaceSettings.loadBalance.enabled,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.huggingfaceSettings.loadBalance.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.huggingfaceSettings.channels, (channel, index) => {\n return _openBlock(), _createBlock(_component_el_form, {\n key: index,\n model: channel,\n \"label-position\": \"top\",\n rules: $data.huggingfaceRules,\n ref_for: true,\n ref: \"huggingfaceChannelForm\",\n class: \"channel-form\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"渠道名\",\n prop: \"name\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.name,\n \"onUpdate:modelValue\": $event => channel.name = $event,\n disabled: channel.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"启用渠道\",\n prop: \"enabled\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: channel.enabled,\n \"onUpdate:modelValue\": $event => channel.enabled = $event\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n prop: \"repo\"\n }, {\n label: _withCtx(() => [_cache[18] || (_cache[18] = _createTextVNode(\" 仓库名 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"格式:用户名/仓库名,例如 username/my-images\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.repo,\n \"onUpdate:modelValue\": $event => channel.repo = $event,\n disabled: channel.fixed,\n placeholder: \"username/repo-name\"\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"Access Token\",\n prop: \"token\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.token,\n \"onUpdate:modelValue\": $event => channel.token = $event,\n disabled: channel.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_cache[19] || (_cache[19] = _createTextVNode(\" 私有仓库 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"开启后仓库将设为私有,访问时需要通过服务器代理\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: channel.isPrivate,\n \"onUpdate:modelValue\": $event => channel.isPrivate = $event\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, null, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_15, [_createVNode(_component_font_awesome_icon, {\n icon: \"info-circle\",\n style: {\n \"margin-right\": \"5px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(channel.isPrivate ? '私有仓库限制 100GB,访问时服务器会代理请求' : '公开仓库无容量限制,文件可直接访问'), 1)])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, null, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n type: \"danger\",\n onClick: $event => $options.deleteChannel(index),\n size: \"small\",\n disabled: channel.fixed\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"])]),\n _: 2\n }, 1024)]),\n _: 2\n }, 1032, [\"model\", \"rules\"]);\n }), 128))])) : _createCommentVNode(\"\", true)]), _createElementVNode(\"div\", _hoisted_16, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.addChannel\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\"\n })]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.saveSettings\n }, {\n default: _withCtx(() => [...(_cache[20] || (_cache[20] = [_createTextVNode(\"保存设置\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])])])), [[_directive_loading, $data.loading]]);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.every.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nimport \"core-js/modules/es.iterator.find.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nexport default {\n data() {\n return {\n // 一级设置:上传渠道\n channels: [{\n value: 'telegram',\n label: 'Telegram'\n }, {\n value: 'cfr2',\n label: 'CloudFlare R2'\n }, {\n value: 's3',\n label: 'S3'\n }, {\n value: 'discord',\n label: 'Discord'\n }, {\n value: 'huggingface',\n label: 'HuggingFace'\n }],\n activeChannel: 'telegram',\n // 当前选中的上传渠道\n\n // 二级设置:Telegram 配置\n telegramSettings: {\n loadBalance: {},\n channels: []\n },\n tgRules: {\n name: [{\n required: true,\n message: '请输入渠道名',\n trigger: 'blur'\n }, {\n validator: (rule, value, callback) => {\n const names = this.telegramSettings.channels.map(item => item.name);\n if (names.filter(name => name === value).length > 1) {\n callback(new Error('渠道名不能重复'));\n } else if (value === 'Telegram_env') {\n // 判断该渠道保存位置是否为环境变量\n const savePath = this.telegramSettings.channels.find(item => item.name === value).savePath;\n if (savePath !== 'environment variable') {\n callback(new Error('渠道名不能为保留值'));\n } else {\n callback();\n }\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }],\n botToken: [{\n required: true,\n message: '请输入 Bot Token',\n trigger: 'blur'\n }],\n chatId: [{\n required: true,\n message: '请输入 Chat ID',\n trigger: 'blur'\n }]\n },\n // 二级设置:CFR2 配置\n cfr2Settings: {\n channels: []\n },\n // 二级设置:S3 配置\n s3Settings: {\n loadBalance: {},\n channels: []\n },\n // 二级设置:Discord 配置\n discordSettings: {\n loadBalance: {},\n channels: []\n },\n // 二级设置:HuggingFace 配置\n huggingfaceSettings: {\n loadBalance: {},\n channels: []\n },\n huggingfaceRules: {\n name: [{\n required: true,\n message: '请输入渠道名',\n trigger: 'blur'\n }, {\n validator: (rule, value, callback) => {\n const names = this.huggingfaceSettings.channels.map(item => item.name);\n if (names.filter(name => name === value).length > 1) {\n callback(new Error('渠道名不能重复'));\n } else if (value === 'HuggingFace_env') {\n const savePath = this.huggingfaceSettings.channels.find(item => item.name === value).savePath;\n if (savePath !== 'environment variable') {\n callback(new Error('渠道名不能为保留值'));\n } else {\n callback();\n }\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }],\n token: [{\n required: true,\n message: '请输入 Access Token',\n trigger: 'blur'\n }],\n repo: [{\n required: true,\n message: '请输入仓库名',\n trigger: 'blur'\n }]\n },\n discordRules: {\n name: [{\n required: true,\n message: '请输入渠道名',\n trigger: 'blur'\n }, {\n validator: (rule, value, callback) => {\n const names = this.discordSettings.channels.map(item => item.name);\n if (names.filter(name => name === value).length > 1) {\n callback(new Error('渠道名不能重复'));\n } else if (value === 'Discord_env') {\n const savePath = this.discordSettings.channels.find(item => item.name === value).savePath;\n if (savePath !== 'environment variable') {\n callback(new Error('渠道名不能为保留值'));\n } else {\n callback();\n }\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }],\n botToken: [{\n required: true,\n message: '请输入 Bot Token',\n trigger: 'blur'\n }],\n channelId: [{\n required: true,\n message: '请输入 Channel ID',\n trigger: 'blur'\n }]\n },\n // 容量统计数据\n quotaStats: {},\n quotaLoading: false,\n s3Rules: {\n name: [{\n required: true,\n message: '请输入渠道名',\n trigger: 'blur'\n }, {\n validator: (rule, value, callback) => {\n const names = this.s3Settings.channels.map(item => item.name);\n if (names.filter(name => name === value).length > 1) {\n callback(new Error('渠道名不能重复'));\n } else if (value === 'S3_env') {\n // 判断该渠道保存位置是否为环境变量\n const savePath = this.s3Settings.channels.find(item => item.name === value).savePath;\n if (savePath !== 'environment variable') {\n callback(new Error('渠道名不能为保留值'));\n } else {\n callback();\n }\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }],\n endpoint: [{\n required: true,\n message: '请输入 Endpoint',\n trigger: 'blur'\n }],\n bucketName: [{\n required: true,\n message: '请输入存储桶名称',\n trigger: 'blur'\n }],\n region: [{\n required: true,\n message: '请输入存储桶区域',\n trigger: 'blur'\n }],\n accessKeyId: [{\n required: true,\n message: '请输入访问密钥 ID',\n trigger: 'blur'\n }],\n secretAccessKey: [{\n required: true,\n message: '请输入机密访问密钥',\n trigger: 'blur'\n }]\n },\n // 加载状态\n loading: false\n };\n },\n computed: {\n // 当前选中渠道的标签\n activeChannelLabel() {\n const channel = this.channels.find(item => item.value === this.activeChannel);\n return channel ? channel.label : '';\n }\n },\n methods: {\n addChannel() {\n switch (this.activeChannel) {\n case 'telegram':\n this.telegramSettings.channels.push({\n id: this.telegramSettings.channels.length + 1,\n name: '',\n type: 'telegram',\n savePath: 'database',\n botToken: '',\n chatId: '',\n enabled: true,\n fixed: false\n });\n break;\n case 'cfr2':\n // this.cfr2Settings.channels.push({\n // id: this.cfr2Settings.channels.length + 1,\n // name: '',\n // type: 'cfr2',\n // savePath: 'database',\n // enabled: true,\n // fixed: false\n // });\n this.$message.error('R2渠道请通过绑定 R2 存储桶或通过 S3 渠道添加');\n break;\n case 's3':\n this.s3Settings.channels.push({\n id: this.s3Settings.channels.length + 1,\n name: '',\n type: 's3',\n savePath: 'database',\n accessKeyId: '',\n secretAccessKey: '',\n region: '',\n bucketName: '',\n endpoint: '',\n pathStyle: false,\n enabled: true,\n fixed: false,\n quota: {\n enabled: false,\n limitGB: 10,\n threshold: 95\n }\n });\n break;\n case 'discord':\n this.discordSettings.channels.push({\n id: this.discordSettings.channels.length + 1,\n name: '',\n type: 'discord',\n savePath: 'database',\n botToken: '',\n channelId: '',\n proxyUrl: '',\n isNitro: false,\n enabled: true,\n fixed: false\n });\n break;\n case 'huggingface':\n this.huggingfaceSettings.channels.push({\n id: this.huggingfaceSettings.channels.length + 1,\n name: '',\n type: 'huggingface',\n savePath: 'database',\n token: '',\n repo: '',\n isPrivate: false,\n enabled: true,\n fixed: false\n });\n break;\n }\n },\n deleteChannel(index) {\n switch (this.activeChannel) {\n case 'telegram':\n // 调整 id\n this.telegramSettings.channels.forEach((item, i) => {\n if (i > index) {\n item.id -= 1;\n }\n });\n this.telegramSettings.channels.splice(index, 1);\n break;\n case 'cfr2':\n // 调整 id\n this.cfr2Settings.channels.forEach((item, i) => {\n if (i > index) {\n item.id -= 1;\n }\n });\n this.cfr2Settings.channels.splice(index, 1);\n break;\n case 's3':\n // 调整 id\n this.s3Settings.channels.forEach((item, i) => {\n if (i > index) {\n item.id -= 1;\n }\n });\n this.s3Settings.channels.splice(index, 1);\n break;\n case 'discord':\n // 调整 id\n this.discordSettings.channels.forEach((item, i) => {\n if (i > index) {\n item.id -= 1;\n }\n });\n this.discordSettings.channels.splice(index, 1);\n break;\n case 'huggingface':\n // 调整 id\n this.huggingfaceSettings.channels.forEach((item, i) => {\n if (i > index) {\n item.id -= 1;\n }\n });\n this.huggingfaceSettings.channels.splice(index, 1);\n break;\n }\n },\n saveSettings() {\n // 所有表单的 Promise 数组\n let validationPromises = [];\n\n // Telegram\n if (this.$refs.tgChannelForm) {\n this.$refs.tgChannelForm.forEach(form => {\n validationPromises.push(new Promise(resolve => {\n form.validate(valid => resolve(valid));\n }));\n });\n }\n\n // S3\n if (this.$refs.s3ChannelForm) {\n this.$refs.s3ChannelForm.forEach(form => {\n validationPromises.push(new Promise(resolve => {\n form.validate(valid => resolve(valid));\n }));\n });\n }\n\n // Discord\n if (this.$refs.discordChannelForm) {\n this.$refs.discordChannelForm.forEach(form => {\n validationPromises.push(new Promise(resolve => {\n form.validate(valid => resolve(valid));\n }));\n });\n }\n\n // HuggingFace\n if (this.$refs.huggingfaceChannelForm) {\n this.$refs.huggingfaceChannelForm.forEach(form => {\n validationPromises.push(new Promise(resolve => {\n form.validate(valid => resolve(valid));\n }));\n });\n }\n\n // 等待所有验证完成\n Promise.all(validationPromises).then(results => {\n const isValid = results.every(valid => valid);\n if (!isValid) {\n return;\n }\n\n // 保存设置\n const settings = {\n telegram: this.telegramSettings,\n cfr2: this.cfr2Settings,\n s3: this.s3Settings,\n discord: this.discordSettings,\n huggingface: this.huggingfaceSettings\n };\n fetchWithAuth('/api/manage/sysConfig/upload', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(settings)\n }).then(() => {\n this.$message.success('设置已保存');\n });\n });\n },\n // 获取容量统计(重新计算)\n async refreshQuota() {\n this.quotaLoading = true;\n try {\n // 使用 POST 请求重新统计容量(会触发索引重建)\n const response = await fetchWithAuth('/api/manage/quota', {\n method: 'POST'\n });\n const data = await response.json();\n if (data.success) {\n this.quotaStats = data.channelStats || {};\n } else {\n // 如果重新统计失败,尝试获取已有数据\n const getResponse = await fetchWithAuth('/api/manage/quota');\n const getData = await getResponse.json();\n if (getData.success) {\n this.quotaStats = getData.quotaStats || {};\n }\n }\n } catch (error) {\n console.error('Failed to refresh quota stats:', error);\n } finally {\n this.quotaLoading = false;\n }\n },\n // 获取容量统计(仅读取,不重建索引)\n async loadQuotaStats() {\n try {\n const response = await fetchWithAuth('/api/manage/quota');\n const data = await response.json();\n if (data.success) {\n this.quotaStats = data.quotaStats || {};\n }\n } catch (error) {\n console.error('Failed to load quota stats:', error);\n }\n },\n // 获取渠道已用容量 (GB)\n getChannelUsedGB(channel) {\n const stats = this.quotaStats[channel.name];\n if (!stats) return 0;\n return (stats.usedMB || 0) / 1024;\n },\n // 获取容量百分比\n getQuotaPercentage(channel) {\n const usedGB = this.getChannelUsedGB(channel);\n const limitGB = channel.quota?.limitGB || 10;\n const percentage = usedGB / limitGB * 100;\n return Math.min(100, Math.round(percentage * 10) / 10);\n },\n // 获取进度条状态\n getQuotaStatus(channel) {\n const percentage = this.getQuotaPercentage(channel);\n const threshold = channel.quota?.threshold || 95;\n if (percentage >= threshold) return 'exception';\n if (percentage >= 80) return 'warning';\n return 'success';\n },\n // 获取容量文本\n getQuotaText(channel) {\n const usedGB = this.getChannelUsedGB(channel);\n const limitGB = channel.quota?.limitGB || 10;\n return `${usedGB.toFixed(2)} / ${limitGB} GB`;\n },\n // 判断是否超过阈值\n isQuotaExceeded(channel) {\n const percentage = this.getQuotaPercentage(channel);\n const threshold = channel.quota?.threshold || 95;\n return percentage >= threshold;\n },\n // 获取状态文本\n getQuotaStatusText(channel) {\n const percentage = this.getQuotaPercentage(channel);\n const threshold = channel.quota?.threshold || 95;\n if (percentage >= threshold) {\n return `⚠️ 已达到容量阈值 (${threshold}%),渠道写入已暂停`;\n }\n if (percentage >= 80) {\n return `⚡ 容量使用较高,接近阈值`;\n }\n return `✓ 容量正常`;\n },\n // 容量限制开关变化时\n async onQuotaEnabledChange(enabled, channel) {\n if (enabled && channel.name) {\n // 首次启用时,检查是否有该渠道的统计数据\n const stats = this.quotaStats[channel.name];\n if (!stats) {\n // 没有统计数据,提示用户需要重新统计\n this.$confirm('首次启用容量限制需要统计现有文件容量,这可能需要一些时间。是否立即统计?', '初始化容量统计', {\n confirmButtonText: '立即统计',\n cancelButtonText: '稍后手动统计',\n type: 'info'\n }).then(async () => {\n await this.recalculateQuota();\n }).catch(() => {\n this.$message.info('您可以稍后点击刷新按钮手动统计');\n });\n }\n }\n },\n // 重新统计容量\n async recalculateQuota() {\n this.quotaLoading = true;\n try {\n this.$message.info('正在统计容量,请稍候...');\n const response = await fetchWithAuth('/api/manage/quota', {\n method: 'POST'\n });\n const data = await response.json();\n if (data.success) {\n this.quotaStats = data.channelStats || {};\n this.$message.success('容量统计完成');\n } else {\n this.$message.error('统计失败: ' + (data.error || '未知错误'));\n }\n } catch (error) {\n console.error('Failed to recalculate quota:', error);\n this.$message.error('统计失败');\n } finally {\n this.quotaLoading = false;\n }\n }\n },\n mounted() {\n this.loading = true;\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/upload').then(response => response.json()).then(data => {\n this.telegramSettings = data.telegram;\n // 确保 R2 渠道有 quota 默认值\n if (data.cfr2 && data.cfr2.channels) {\n data.cfr2.channels = data.cfr2.channels.map(channel => ({\n ...channel,\n quota: channel.quota || {\n enabled: false,\n limitGB: 10,\n threshold: 95\n }\n }));\n }\n this.cfr2Settings = data.cfr2;\n // 确保 S3 渠道有 quota 默认值\n if (data.s3 && data.s3.channels) {\n data.s3.channels = data.s3.channels.map(channel => ({\n ...channel,\n quota: channel.quota || {\n enabled: false,\n limitGB: 10,\n threshold: 95\n }\n }));\n }\n this.s3Settings = data.s3;\n // 确保 Discord 渠道有默认值\n if (data.discord && data.discord.channels) {\n data.discord.channels = data.discord.channels.map(channel => ({\n ...channel,\n proxyUrl: channel.proxyUrl || ''\n }));\n }\n this.discordSettings = data.discord || {\n loadBalance: {},\n channels: []\n };\n // 确保 HuggingFace 渠道有默认值\n if (data.huggingface && data.huggingface.channels) {\n data.huggingface.channels = data.huggingface.channels.map(channel => ({\n ...channel,\n isPrivate: channel.isPrivate || false\n }));\n }\n this.huggingfaceSettings = data.huggingface || {\n loadBalance: {},\n channels: []\n };\n // 加载容量统计(仅读取,不重建索引)\n this.loadQuotaStats();\n }).finally(() => {\n this.loading = false;\n });\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogUpload.vue?vue&type=template&id=70372bf9&scoped=true\"\nimport script from \"./SysCogUpload.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogUpload.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogUpload.vue?vue&type=style&index=0&id=70372bf9&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-70372bf9\"]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, Transition as _Transition, createTextVNode as _createTextVNode, toDisplayString as _toDisplayString, renderList as _renderList, Fragment as _Fragment, createElementBlock as _createElementBlock, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"security-settings\"\n};\nconst _hoisted_2 = {\n class: \"first-settings\"\n};\nconst _hoisted_3 = {\n class: \"second-title token-title\"\n};\nconst _hoisted_4 = {\n class: \"token-actions\"\n};\nconst _hoisted_5 = {\n class: \"token-table-container\"\n};\nconst _hoisted_6 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_7 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_8 = {\n class: \"token-display\"\n};\nconst _hoisted_9 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_10 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_11 = {\n class: \"table-cell-content action-buttons\"\n};\nconst _hoisted_12 = {\n class: \"first-settings\"\n};\nconst _hoisted_13 = {\n class: \"second-title\"\n};\nconst _hoisted_14 = {\n class: \"first-settings\"\n};\nconst _hoisted_15 = {\n class: \"actions\"\n};\nconst _hoisted_16 = {\n class: \"dialog-footer\"\n};\nconst _hoisted_17 = {\n class: \"dialog-footer\"\n};\nconst _hoisted_18 = {\n class: \"token-result\"\n};\nconst _hoisted_19 = {\n style: {\n \"margin-bottom\": \"15px\",\n \"color\": \"#e6a23c\"\n }\n};\nconst _hoisted_20 = {\n class: \"dialog-footer\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_table_column = _resolveComponent(\"el-table-column\");\n const _component_el_tag = _resolveComponent(\"el-tag\");\n const _component_el_table = _resolveComponent(\"el-table\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_el_checkbox = _resolveComponent(\"el-checkbox\");\n const _component_el_checkbox_group = _resolveComponent(\"el-checkbox-group\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_cache[26] || (_cache[26] = _createElementVNode(\"h3\", {\n class: \"first-title\"\n }, \"认证管理\", -1)), _cache[27] || (_cache[27] = _createElementVNode(\"h4\", {\n class: \"second-title\"\n }, \"用户端认证\", -1)), _createVNode(_component_el_form, {\n model: $data.authSettings.user,\n rules: $data.userPassRules,\n ref: \"userPassForm\",\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"上传密码\",\n prop: \"authCode\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.user.authCode,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.authSettings.user.authCode = $event),\n type: \"password\",\n \"show-password\": \"\",\n onInput: $options.handleUserPassInput,\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"onInput\"])]),\n _: 1\n }), _createVNode(_Transition, {\n name: \"fade-slide\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [$data.showUserPassConfirm ? (_openBlock(), _createBlock(_component_el_form_item, {\n label: \"确认密码\",\n prop: \"confirmNewUserPassword\",\n key: \"user-confirm\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.user.confirmNewUserPassword,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $data.authSettings.user.confirmNewUserPassword = $event),\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })) : _createCommentVNode(\"\", true)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\", \"rules\"]), _cache[28] || (_cache[28] = _createElementVNode(\"h4\", {\n class: \"second-title\"\n }, \"管理端认证\", -1)), _createVNode(_component_el_form, {\n model: $data.authSettings.admin,\n rules: $data.adminPassRules,\n ref: \"adminPassForm\",\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"用户名\",\n prop: \"adminUsername\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.admin.adminUsername,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.authSettings.admin.adminUsername = $event),\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"密码\",\n prop: \"adminPassword\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.admin.adminPassword,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.authSettings.admin.adminPassword = $event),\n type: \"password\",\n \"show-password\": \"\",\n onInput: $options.handleAdminPassInput,\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"onInput\"])]),\n _: 1\n }), _createVNode(_Transition, {\n name: \"fade-slide\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [$data.showAdminPassConfirm ? (_openBlock(), _createBlock(_component_el_form_item, {\n label: \"确认密码\",\n prop: \"confirmNewAdminPassword\",\n key: \"admin-confirm\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.admin.confirmNewAdminPassword,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.authSettings.admin.confirmNewAdminPassword = $event),\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })) : _createCommentVNode(\"\", true)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\", \"rules\"]), _createElementVNode(\"h4\", _hoisted_3, [_cache[23] || (_cache[23] = _createTextVNode(\"API Token 管理 \", -1)), _createElementVNode(\"a\", _hoisted_4, [_createVNode(_component_el_button, {\n type: \"primary\",\n size: \"small\",\n onClick: _cache[5] || (_cache[5] = $event => $data.showCreateTokenDialog = true),\n circle: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\"\n })]),\n _: 1\n })])]), _createElementVNode(\"div\", _hoisted_5, [_withDirectives((_openBlock(), _createBlock(_component_el_table, {\n data: $data.apiTokens,\n class: \"token-table\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_table_column, {\n prop: \"name\",\n label: \"名称\",\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_6, _toDisplayString(scope.row.name), 1)]),\n _: 1\n }), _createVNode(_component_el_table_column, {\n prop: \"token\",\n label: \"Token\",\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_7, [_createElementVNode(\"span\", _hoisted_8, _toDisplayString(scope.row.token), 1)])]),\n _: 1\n }), _createVNode(_component_el_table_column, {\n prop: \"permissions\",\n label: \"权限\",\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_9, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(scope.row.permissions, perm => {\n return _openBlock(), _createBlock(_component_el_tag, {\n key: perm,\n size: \"small\",\n class: \"permission-tag\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.getPermissionText(perm)), 1)]),\n _: 2\n }, 1024);\n }), 128))])]),\n _: 1\n }), _createVNode(_component_el_table_column, {\n prop: \"createdAt\",\n label: \"创建时间\",\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_10, _toDisplayString($options.formatDate(scope.row.createdAt)), 1)]),\n _: 1\n }), _createVNode(_component_el_table_column, {\n label: \"操作\",\n fixed: \"right\",\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_11, [_createVNode(_component_el_button, {\n class: \"action-button\",\n size: \"small\",\n onClick: $event => $options.editToken(scope.row)\n }, {\n default: _withCtx(() => [...(_cache[24] || (_cache[24] = [_createTextVNode(\"编辑\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n class: \"action-button\",\n size: \"small\",\n type: \"danger\",\n onClick: $event => $options.deleteToken(scope.row.id)\n }, {\n default: _withCtx(() => [...(_cache[25] || (_cache[25] = [_createTextVNode(\"删除\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"data\"])), [[_directive_loading, $data.tokenLoading]])])]), _createElementVNode(\"div\", _hoisted_12, [_cache[30] || (_cache[30] = _createElementVNode(\"h3\", {\n class: \"first-title\"\n }, \"上传管理\", -1)), _createElementVNode(\"h4\", _hoisted_13, [_cache[29] || (_cache[29] = _createTextVNode(\"图像审查 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"仅对非分块上传文件生效,支持 nsfwjs 和 moderatecontent.com 渠道\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]), _createVNode(_component_el_form, {\n model: $data.uploadSettings.moderate,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"开启审查\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.uploadSettings.moderate.enabled,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.uploadSettings.moderate.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"审查渠道\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.uploadSettings.moderate.channel,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => $data.uploadSettings.moderate.channel = $event),\n placeholder: \"请选择审查渠道\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_option, {\n label: \"moderatecontent.com\",\n value: \"moderatecontent.com\"\n }), _createVNode(_component_el_option, {\n label: \"nsfwjs\",\n value: \"nsfwjs\"\n })]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n }), $data.uploadSettings.moderate.channel === 'moderatecontent.com' ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: \"API Key\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.uploadSettings.moderate.moderateContentApiKey,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $data.uploadSettings.moderate.moderateContentApiKey = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })) : _createCommentVNode(\"\", true), $data.uploadSettings.moderate.channel === 'nsfwjs' ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 1,\n label: \"API 路径\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.uploadSettings.moderate.nsfwApiPath,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => $data.uploadSettings.moderate.nsfwApiPath = $event),\n placeholder: \"https://nsfwjs.your.domain\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\"])]), _createElementVNode(\"div\", _hoisted_14, [_cache[33] || (_cache[33] = _createElementVNode(\"h3\", {\n class: \"first-title\"\n }, \"访问管理\", -1)), _cache[34] || (_cache[34] = _createElementVNode(\"h4\", {\n class: \"second-title\"\n }, \"域名过滤\", -1)), _createVNode(_component_el_form, {\n model: $data.accessSettings,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_cache[31] || (_cache[31] = _createTextVNode(\" 放行域名 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"1.针对访问域名设置权限
2.留空默认全部放行,多个域名请用英文逗号分隔\",\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.accessSettings.allowedDomains,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => $data.accessSettings.allowedDomains = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _cache[35] || (_cache[35] = _createElementVNode(\"h4\", {\n class: \"second-title\"\n }, \"白名单模式\", -1)), _createVNode(_component_el_form, {\n model: $data.accessSettings,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_cache[32] || (_cache[32] = _createTextVNode(\" 是否开启 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"1.针对文件设置权限
2.开启后,仅被加入白名单的文件可被访问\",\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.accessSettings.whiteListMode,\n \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => $data.accessSettings.whiteListMode = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"])]), _createElementVNode(\"div\", _hoisted_15, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.saveSettings\n }, {\n default: _withCtx(() => [...(_cache[36] || (_cache[36] = [_createTextVNode(\"保存设置\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])]), _createVNode(_component_el_dialog, {\n modelValue: $data.showCreateTokenDialog,\n \"onUpdate:modelValue\": _cache[15] || (_cache[15] = $event => $data.showCreateTokenDialog = $event),\n title: \"创建新 API Token\",\n width: $options.dialogWidth\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_16, [_createVNode(_component_el_button, {\n onClick: _cache[14] || (_cache[14] = $event => $data.showCreateTokenDialog = false)\n }, {\n default: _withCtx(() => [...(_cache[40] || (_cache[40] = [_createTextVNode(\"取消\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.createToken\n }, {\n default: _withCtx(() => [...(_cache[41] || (_cache[41] = [_createTextVNode(\"创建\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.newToken,\n rules: $data.tokenRules,\n ref: \"tokenForm\",\n \"label-width\": \"100px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"Token 名称\",\n prop: \"name\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newToken.name,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $data.newToken.name = $event),\n placeholder: \"请输入Token名称\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"权限\",\n prop: \"permissions\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox_group, {\n modelValue: $data.newToken.permissions,\n \"onUpdate:modelValue\": _cache[13] || (_cache[13] = $event => $data.newToken.permissions = $event)\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox, {\n label: \"upload\"\n }, {\n default: _withCtx(() => [...(_cache[37] || (_cache[37] = [_createTextVNode(\"上传\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"delete\"\n }, {\n default: _withCtx(() => [...(_cache[38] || (_cache[38] = [_createTextVNode(\"删除\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"list\"\n }, {\n default: _withCtx(() => [...(_cache[39] || (_cache[39] = [_createTextVNode(\"列出\", -1)]))]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"width\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showEditTokenDialog,\n \"onUpdate:modelValue\": _cache[19] || (_cache[19] = $event => $data.showEditTokenDialog = $event),\n title: \"编辑 API Token\",\n width: $options.dialogWidth\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_17, [_createVNode(_component_el_button, {\n onClick: _cache[18] || (_cache[18] = $event => $data.showEditTokenDialog = false)\n }, {\n default: _withCtx(() => [...(_cache[45] || (_cache[45] = [_createTextVNode(\"取消\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.updateToken\n }, {\n default: _withCtx(() => [...(_cache[46] || (_cache[46] = [_createTextVNode(\"更新\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.editingToken,\n rules: $data.tokenRules,\n ref: \"editTokenForm\",\n \"label-width\": \"100px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"Token 名称\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editingToken.name,\n \"onUpdate:modelValue\": _cache[16] || (_cache[16] = $event => $data.editingToken.name = $event),\n disabled: \"\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"权限\",\n prop: \"permissions\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox_group, {\n modelValue: $data.editingToken.permissions,\n \"onUpdate:modelValue\": _cache[17] || (_cache[17] = $event => $data.editingToken.permissions = $event)\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox, {\n label: \"upload\"\n }, {\n default: _withCtx(() => [...(_cache[42] || (_cache[42] = [_createTextVNode(\"上传\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"delete\"\n }, {\n default: _withCtx(() => [...(_cache[43] || (_cache[43] = [_createTextVNode(\"删除\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"list\"\n }, {\n default: _withCtx(() => [...(_cache[44] || (_cache[44] = [_createTextVNode(\"列出\", -1)]))]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"width\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showTokenResultDialog,\n \"onUpdate:modelValue\": _cache[22] || (_cache[22] = $event => $data.showTokenResultDialog = $event),\n title: \"Token 创建成功\",\n width: $options.dialogWidth\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_20, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[21] || (_cache[21] = $event => $data.showTokenResultDialog = false)\n }, {\n default: _withCtx(() => [...(_cache[49] || (_cache[49] = [_createTextVNode(\"我已保存\", -1)]))]),\n _: 1\n })])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_18, [_createElementVNode(\"p\", _hoisted_19, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n style: {\n \"margin-right\": \"5px\"\n }\n }), _cache[47] || (_cache[47] = _createTextVNode(\" 请妥善保存以下Token,关闭此窗口后将无法再次查看完整Token! \", -1))]), _createVNode(_component_el_form, {\n \"label-width\": \"100px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"Token 名称\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"span\", null, _toDisplayString($data.createdToken.name), 1)]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"完整Token\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.createdToken.token,\n \"onUpdate:modelValue\": _cache[20] || (_cache[20] = $event => $data.createdToken.token = $event),\n readonly: \"\"\n }, {\n append: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: $options.copyToken\n }, {\n default: _withCtx(() => [...(_cache[48] || (_cache[48] = [_createTextVNode(\"复制\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n })])]),\n _: 1\n }, 8, [\"modelValue\", \"width\"])])), [[_directive_loading, $data.loading]]);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.every.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nexport default {\n data() {\n return {\n authSettings: {\n user: {},\n admin: {}\n },\n uploadSettings: {\n moderate: {}\n },\n accessSettings: {},\n apiTokens: [],\n // API Token列表\n // 加载状态\n loading: false,\n tokenLoading: false,\n // 修改密码相关\n oriUserPassword: '',\n // 原上传密码\n oriAdminPassword: '',\n // 原管理端密码\n\n showUserPassConfirm: false,\n // 显示用户密码确认框\n showAdminPassConfirm: false,\n // 显示管理密码确认框\n\n // Token对话框相关\n showCreateTokenDialog: false,\n showEditTokenDialog: false,\n showTokenResultDialog: false,\n newToken: {\n name: '',\n owner: '',\n permissions: []\n },\n editingToken: {\n id: '',\n name: '',\n owner: '',\n permissions: []\n },\n createdToken: {\n name: '',\n token: ''\n },\n userPassRules: {\n authCode: [{\n validator: (rule, value, callback) => {\n // URL保留字符列表\n const urlReservedChars = ['%', '&', '?', '#', '/'];\n const hasReservedChar = urlReservedChars.some(char => value && value.includes(char));\n if (hasReservedChar) {\n callback(new Error('密码不能包含部分URL保留字符: % & ? # /'));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }],\n confirmNewUserPassword: [{\n message: '请再次输入上传密码',\n trigger: 'blur'\n }, {\n validator: (rule, value, callback) => {\n if (value && value !== this.authSettings.user.authCode) {\n callback(new Error('两次输入密码不一致'));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n },\n adminPassRules: {\n confirmNewAdminPassword: [{\n message: '请再次输入管理密码',\n trigger: 'blur'\n }, {\n validator: (rule, value, callback) => {\n if (value && value !== this.authSettings.admin.adminPassword) {\n callback(new Error('两次输入密码不一致'));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n },\n tokenRules: {\n name: [{\n required: true,\n message: '请输入Token名称',\n trigger: 'blur'\n }],\n permissions: [{\n required: true,\n message: '请选择权限',\n trigger: 'change'\n }]\n }\n };\n },\n computed: {\n dialogWidth() {\n return window.innerWidth > 768 ? '50%' : '90%';\n }\n },\n methods: {\n handleUserPassInput() {\n if (this.authSettings.user.authCode !== this.oriUserPassword) {\n this.showUserPassConfirm = true;\n } else {\n this.showUserPassConfirm = false;\n }\n },\n handleAdminPassInput() {\n if (this.authSettings.admin.adminPassword !== this.oriAdminPassword) {\n this.showAdminPassConfirm = true;\n } else {\n this.showAdminPassConfirm = false;\n }\n },\n // Token相关方法\n getPermissionText(permission) {\n const permissionMap = {\n 'upload': '上传',\n 'delete': '删除',\n 'list': '列出'\n };\n return permissionMap[permission] || permission;\n },\n formatDate(dateString) {\n return new Date(dateString).toLocaleString('zh-CN');\n },\n async loadApiTokens() {\n this.tokenLoading = true;\n try {\n const response = await fetchWithAuth('/api/manage/apiTokens');\n const data = await response.json();\n this.apiTokens = data.tokens || [];\n } catch (error) {\n this.$message.error('获取Token列表失败');\n } finally {\n this.tokenLoading = false;\n }\n },\n createToken() {\n this.$refs.tokenForm.validate(async valid => {\n if (!valid) return;\n try {\n this.newToken.owner = 'admin'; // 默认所有Token归属管理员\n const response = await fetchWithAuth('/api/manage/apiTokens', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(this.newToken)\n });\n const data = await response.json();\n if (response.ok) {\n this.createdToken = {\n name: data.name,\n token: data.token\n };\n this.showCreateTokenDialog = false;\n this.showTokenResultDialog = true;\n this.newToken = {\n name: '',\n owner: '',\n permissions: []\n };\n await this.loadApiTokens();\n this.$message.success('Token创建成功');\n } else {\n this.$message.error(data.error || 'Token创建失败');\n }\n } catch (error) {\n this.$message.error('Token创建失败');\n }\n });\n },\n editToken(token) {\n this.editingToken = {\n id: token.id,\n name: token.name,\n owner: token.owner,\n permissions: [...token.permissions]\n };\n this.showEditTokenDialog = true;\n },\n updateToken() {\n this.$refs.editTokenForm.validate(async valid => {\n if (!valid) return;\n try {\n const response = await fetchWithAuth('/api/manage/apiTokens', {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n tokenId: this.editingToken.id,\n permissions: this.editingToken.permissions\n })\n });\n const data = await response.json();\n if (response.ok) {\n this.showEditTokenDialog = false;\n await this.loadApiTokens();\n this.$message.success('Token权限更新成功');\n } else {\n this.$message.error(data.error || 'Token更新失败');\n }\n } catch (error) {\n this.$message.error('Token更新失败');\n }\n });\n },\n async deleteToken(tokenId) {\n try {\n await this.$confirm('此操作将永久删除该Token,是否继续?', '提示', {\n confirmButtonText: '确定',\n cancelButtonText: '取消',\n type: 'warning'\n });\n const response = await fetchWithAuth(`/api/manage/apiTokens?id=${tokenId}`, {\n method: 'DELETE'\n });\n const data = await response.json();\n if (response.ok) {\n await this.loadApiTokens();\n this.$message.success('Token删除成功');\n } else {\n this.$message.error(data.error || 'Token删除失败');\n }\n } catch (error) {\n if (error !== 'cancel') {\n this.$message.error('Token删除失败');\n }\n }\n },\n async copyToken() {\n try {\n await navigator.clipboard.writeText(this.createdToken.token);\n this.$message.success('Token已复制到剪贴板');\n } catch (error) {\n this.$message.error('复制失败,请手动复制');\n }\n },\n saveSettings() {\n // 所有表单的Promise数组\n let validationPromises = [];\n\n // 验证用户密码表单\n validationPromises.push(new Promise(resolve => {\n this.$refs.userPassForm.validate(valid => {\n resolve(valid);\n });\n }));\n\n // 验证管理密码表单\n validationPromises.push(new Promise(resolve => {\n this.$refs.adminPassForm.validate(valid => {\n resolve(valid);\n });\n }));\n\n // 等待所有验证完成\n Promise.all(validationPromises).then(results => {\n const isValid = results.every(valid => valid);\n if (!isValid) {\n return;\n }\n const settings = {\n auth: this.authSettings,\n upload: this.uploadSettings,\n access: this.accessSettings\n };\n // 不保存确认密码相关字段\n delete settings.auth.user.confirmNewUserPassword;\n delete settings.auth.admin.confirmNewAdminPassword;\n fetchWithAuth('/api/manage/sysConfig/security', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(settings)\n }).then(() => {\n this.$message.success('设置已保存');\n // 更新原密码\n this.oriUserPassword = this.authSettings.user.authCode;\n this.oriAdminPassword = this.authSettings.admin.adminPassword;\n this.showUserPassConfirm = false;\n this.showAdminPassConfirm = false;\n });\n });\n }\n },\n mounted() {\n this.loading = true;\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/security').then(response => response.json()).then(data => {\n this.authSettings = data.auth;\n this.uploadSettings = data.upload;\n this.accessSettings = data.access;\n\n // 保存原密码\n this.oriUserPassword = this.authSettings.user.authCode;\n this.oriAdminPassword = this.authSettings.admin.adminPassword;\n this.authSettings.user.confirmNewUserPassword = '';\n this.authSettings.admin.confirmNewAdminPassword = '';\n\n // 加载API Token列表\n this.loadApiTokens();\n }).finally(() => {\n this.loading = false;\n });\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogSecurity.vue?vue&type=template&id=3b7344a0&scoped=true\"\nimport script from \"./SysCogSecurity.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogSecurity.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogSecurity.vue?vue&type=style&index=0&id=3b7344a0&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-3b7344a0\"]])\n\nexport default __exports__","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createTextVNode as _createTextVNode, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"page-settings\"\n};\nconst _hoisted_2 = {\n class: \"first-title\"\n};\nconst _hoisted_3 = {\n class: \"actions\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.groupedSettings, (categoryGroup, categoryName) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: categoryName,\n class: \"first-settings\"\n }, [_createElementVNode(\"h3\", _hoisted_2, _toDisplayString(categoryName), 1), _createVNode(_component_el_form, {\n model: $data.settings,\n \"label-width\": \"150px\"\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(categoryGroup, (setting, index) => {\n return _openBlock(), _createBlock(_component_el_form_item, {\n key: setting.id\n }, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(setting.label) + \" \", 1), setting.tooltip ? (_openBlock(), _createBlock(_component_el_tooltip, {\n key: 0,\n content: setting.tooltip,\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])) : _createCommentVNode(\"\", true)]),\n default: _withCtx(() => [setting.type === 'select' ? (_openBlock(), _createBlock(_component_el_select, {\n key: 0,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: setting.fixed,\n placeholder: setting.placeholder,\n style: {\n \"width\": \"100%\"\n }\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(setting.options, option => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: option.value,\n label: option.label,\n value: option.value\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 2\n }, 1032, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\", \"placeholder\"])) : setting.type === 'boolean' ? (_openBlock(), _createBlock(_component_el_switch, {\n key: 1,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: setting.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])) : (_openBlock(), _createBlock(_component_el_input, {\n key: 2,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: setting.fixed,\n placeholder: setting.placeholder\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\", \"placeholder\"]))]),\n _: 2\n }, 1024);\n }), 128))]),\n _: 2\n }, 1032, [\"model\"])]);\n }), 128)), _createElementVNode(\"div\", _hoisted_3, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.saveSettings\n }, {\n default: _withCtx(() => [...(_cache[0] || (_cache[0] = [_createTextVNode(\"保存设置\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])])])), [[_directive_loading, $data.loading]]);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nexport default {\n data() {\n return {\n settings: {\n config: []\n },\n // 加载状态\n loading: false\n };\n },\n computed: {\n // 根据category将配置项分组\n groupedSettings() {\n const grouped = {};\n if (this.settings.config) {\n this.settings.config.forEach(setting => {\n const category = setting.category || '其他设置';\n if (!grouped[category]) {\n grouped[category] = [];\n }\n grouped[category].push(setting);\n });\n }\n return grouped;\n }\n },\n methods: {\n saveSettings() {\n fetchWithAuth('/api/manage/sysConfig/page', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(this.settings)\n }).then(() => this.$message.success('设置已保存'));\n }\n },\n mounted() {\n this.loading = true;\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/page').then(response => response.json()).then(data => {\n this.settings = data;\n // 处理布尔类型的值初始化\n if (this.settings.config) {\n this.settings.config.forEach(setting => {\n if (setting.type === 'boolean') {\n // 将字符串转换为布尔值\n if (typeof setting.value === 'string') {\n setting.value = setting.value === 'true';\n } else if (setting.value === undefined || setting.value === null) {\n // 如果没有值,使用默认值\n setting.value = setting.default || false;\n }\n }\n });\n }\n }).finally(() => {\n this.loading = false;\n });\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogPage.vue?vue&type=template&id=7b059a1c&scoped=true\"\nimport script from \"./SysCogPage.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogPage.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogPage.vue?vue&type=style&index=0&id=7b059a1c&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-7b059a1c\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createTextVNode as _createTextVNode, createElementVNode as _createElementVNode, resolveDirective as _resolveDirective, openBlock as _openBlock, createElementBlock as _createElementBlock, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"others-settings\"\n};\nconst _hoisted_2 = {\n class: \"first-settings\"\n};\nconst _hoisted_3 = {\n class: \"first-title\"\n};\nconst _hoisted_4 = {\n class: \"first-title\"\n};\nconst _hoisted_5 = {\n class: \"first-title\"\n};\nconst _hoisted_6 = {\n class: \"first-title\"\n};\nconst _hoisted_7 = {\n class: \"first-title\"\n};\nconst _hoisted_8 = {\n class: \"actions\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h3\", _hoisted_3, [_cache[11] || (_cache[11] = _createTextVNode(\"远端遥测 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"便于问题查找和定位,建议开启\",\n placement: \"right\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]), _createVNode(_component_el_form, {\n model: $data.settings.telemetry,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"启用\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.telemetry.enabled,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.settings.telemetry.enabled = $event),\n disabled: $data.settings.telemetry.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_4, [_cache[12] || (_cache[12] = _createTextVNode(\"随机图像API \", -1)), _createVNode(_component_el_tooltip, {\n content: \"API具体用法请查阅文档\",\n placement: \"right\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]), _createVNode(_component_el_form, {\n model: $data.settings.randomImageAPI,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"启用\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.randomImageAPI.enabled,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $data.settings.randomImageAPI.enabled = $event),\n disabled: $data.settings.randomImageAPI.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n prop: \"randomImageAPI.allowedDir\"\n }, {\n label: _withCtx(() => [_cache[13] || (_cache[13] = _createElementVNode(\"span\", null, \"目录\", -1)), _createVNode(_component_el_tooltip, {\n content: \"1. 开放随机图权限的目录,默认为根目录,多个目录用逗号分隔
2. 目录均采用绝对路径,例如/img/cover,表示该目录及其所有子目录的文件可被随机图API访问\",\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.randomImageAPI.allowedDir,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.settings.randomImageAPI.allowedDir = $event),\n disabled: $data.settings.randomImageAPI.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_5, [_cache[14] || (_cache[14] = _createTextVNode(\"访客图库 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"启用后,访客可通过 /browse 路径浏览指定目录的图片(只读,无法删除/移动)\",\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]), _createVNode(_component_el_form, {\n model: $data.settings.publicBrowse,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"启用\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.publicBrowse.enabled,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.settings.publicBrowse.enabled = $event),\n disabled: $data.settings.publicBrowse.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n prop: \"publicBrowse.allowedDir\"\n }, {\n label: _withCtx(() => [_cache[16] || (_cache[16] = _createElementVNode(\"span\", null, \"开放目录\", -1)), _createVNode(_component_el_tooltip, {\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n content: _withCtx(() => [...(_cache[15] || (_cache[15] = [_createElementVNode(\"div\", {\n style: {\n \"max-width\": \"320px\",\n \"line-height\": \"1.6\"\n }\n }, [_createElementVNode(\"p\", {\n style: {\n \"margin\": \"0 0 8px 0\"\n }\n }, [_createElementVNode(\"b\", null, \"允许公开浏览的目录,多个目录用逗号分隔\")]), _createElementVNode(\"p\", {\n style: {\n \"margin\": \"0 0 8px 0\"\n }\n }, \"示例:wallpaper,photos,album\"), _createElementVNode(\"p\", {\n style: {\n \"margin\": \"0 0 8px 0\",\n \"color\": \"#909399\"\n }\n }, \"支持子目录:2026/lucky,2026/rich\"), _createElementVNode(\"p\", {\n style: {\n \"margin\": \"0\",\n \"color\": \"#67c23a\"\n }\n }, \"访问链接:https://你的域名/browse/2026/lucky\")], -1)]))]),\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.publicBrowse.allowedDir,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.settings.publicBrowse.allowedDir = $event),\n disabled: $data.settings.publicBrowse.fixed,\n placeholder: \"wallpaper,photos,album\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_6, [_cache[17] || (_cache[17] = _createTextVNode(\"CloudFlare API Token \", -1)), _createVNode(_component_el_tooltip, {\n content: \"设置后可以使后端拉黑、删除等操作不受CDN缓存限制
建议设置,设置方式请查阅文档\",\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]), _createVNode(_component_el_form, {\n model: $data.settings.cloudflareApiToken,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"区域ID\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.cloudflareApiToken.CF_ZONE_ID,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => $data.settings.cloudflareApiToken.CF_ZONE_ID = $event),\n disabled: $data.settings.cloudflareApiToken.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"账户邮箱\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.cloudflareApiToken.CF_EMAIL,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.settings.cloudflareApiToken.CF_EMAIL = $event),\n disabled: $data.settings.cloudflareApiToken.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"API Key\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.cloudflareApiToken.CF_API_KEY,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => $data.settings.cloudflareApiToken.CF_API_KEY = $event),\n disabled: $data.settings.cloudflareApiToken.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_7, [_cache[18] || (_cache[18] = _createTextVNode(\"WebDAV \", -1)), _createVNode(_component_el_tooltip, {\n content: \"启用后,可以通过WebDAV协议访问和管理图片\",\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]), _createVNode(_component_el_form, {\n model: $data.settings.webDAV,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"启用\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.webDAV.enabled,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $data.settings.webDAV.enabled = $event),\n disabled: $data.settings.webDAV.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"用户名\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.webDAV.username,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => $data.settings.webDAV.username = $event),\n disabled: $data.settings.webDAV.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"密码\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.webDAV.password,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => $data.settings.webDAV.password = $event),\n disabled: $data.settings.webDAV.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"])]), _createElementVNode(\"div\", _hoisted_8, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.saveSettings\n }, {\n default: _withCtx(() => [...(_cache[19] || (_cache[19] = [_createTextVNode(\"保存设置\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])])])), [[_directive_loading, $data.loading]]);\n}","import \"core-js/modules/es.json.stringify.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nexport default {\n data() {\n return {\n settings: {\n telemetry: {},\n randomImageAPI: {},\n cloudflareApiToken: {},\n webDAV: {},\n publicBrowse: {}\n },\n // 加载状态\n loading: false\n };\n },\n computed: {},\n methods: {\n saveSettings() {\n fetchWithAuth('/api/manage/sysConfig/others', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(this.settings)\n }).then(() => this.$message.success('设置已保存'));\n }\n },\n mounted() {\n this.loading = true;\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/others').then(response => response.json()).then(data => {\n this.settings = data;\n }).finally(() => {\n this.loading = false;\n });\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogOthers.vue?vue&type=template&id=4d2a1bec&scoped=true\"\nimport script from \"./SysCogOthers.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogOthers.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogOthers.vue?vue&type=style&index=0&id=4d2a1bec&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-4d2a1bec\"]])\n\nexport default __exports__","import \"core-js/modules/es.array.push.js\";\nimport DashboardTabs from '@/components/DashboardTabs.vue';\nimport SysConfigTabs from '@/components/SysConfigTabs.vue';\nimport SysCogStatus from '@/components/SysCogStatus.vue';\nimport SysCogUpload from '@/components/SysCogUpload.vue';\nimport SysCogSecurity from '@/components/SysCogSecurity.vue';\nimport SysCogPage from '@/components/SysCogPage.vue';\nimport SysCogOthers from '@/components/SysCogOthers.vue';\nexport default {\n name: 'SystemConfig',\n data() {\n return {\n activeIndex: 'status',\n isSidebarCollapse: false\n };\n },\n watch: {\n // 监听锚点变化\n '$route.hash': {\n immediate: true,\n handler(newHash) {\n this.activeIndex = newHash.replace('#', '');\n window.scrollTo(0, 0); // 滚动到页面顶部\n }\n },\n activeIndex(newIndex) {\n // 更新锚点\n const hash = `#${newIndex}`;\n this.$router.push({\n hash\n });\n }\n },\n components: {\n DashboardTabs,\n SysConfigTabs,\n SysCogStatus,\n SysCogUpload,\n SysCogSecurity,\n SysCogPage,\n SysCogOthers\n },\n computed: {\n disableTooltip() {\n return window.innerWidth < 768;\n },\n // 根据锚点动态返回对应的组件\n currentComponent() {\n const hash = this.$route.hash.replace('#', '');\n switch (hash) {\n case 'status':\n return SysCogStatus;\n case 'upload':\n return SysCogUpload;\n case 'security':\n return SysCogSecurity;\n case 'page':\n return SysCogPage;\n case 'others':\n return SysCogOthers;\n default:\n return SysCogStatus;\n }\n }\n },\n methods: {\n handleLogout() {\n this.$store.commit('setCredentials', null);\n this.$router.push('/adminLogin');\n },\n // 设置默认锚点\n setDefaultHash() {\n const defaultHash = '#status'; // 默认锚点\n window.location.hash = defaultHash;\n this.activeIndex = defaultHash.replace('#', '');\n }\n },\n mounted() {\n // 如果 URL 中没有锚点,则设置默认锚点\n if (!window.location.hash) {\n this.setDefaultHash();\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SystemConfig.vue?vue&type=template&id=c5d2c9c2&scoped=true\"\nimport script from \"./SystemConfig.vue?vue&type=script&lang=js\"\nexport * from \"./SystemConfig.vue?vue&type=script&lang=js\"\n\nimport \"./SystemConfig.vue?vue&type=style&index=0&id=c5d2c9c2&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-c5d2c9c2\"]])\n\nexport default __exports__"],"names":["_typeof","o","Symbol","iterator","constructor","prototype","toPrimitive","t","r","e","i","call","TypeError","String","Number","toPropertyKey","_defineProperty","Object","defineProperty","value","enumerable","configurable","writable","_hoisted_1","class","_hoisted_2","_hoisted_3","render","_ctx","_cache","$props","$setup","$data","$options","_component_font_awesome_icon","isCollapse","menuItems","item","key","index","activeIndex","onClick","$event","handleSelect","icon","title","args","toggleCollapse","name","props","type","default","Boolean","data","methods","this","$emit","checkMobile","isMobile","window","innerWidth","mounted","addEventListener","beforeDestroy","removeEventListener","__exports__","_component_DashboardTabs","_component_el_tooltip","_component_el_header","_component_SysConfigTabs","activeTab","disabled","disableTooltip","content","placement","handleLogout","_","isSidebarCollapse","currentComponent","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","_hoisted_45","_hoisted_46","_hoisted_47","_hoisted_48","_hoisted_49","_hoisted_50","_hoisted_51","_hoisted_52","_hoisted_53","_hoisted_54","_hoisted_55","_hoisted_56","_hoisted_57","_hoisted_58","_hoisted_59","_hoisted_60","_hoisted_61","_hoisted_62","_hoisted_63","_hoisted_64","_hoisted_65","_hoisted_66","_hoisted_67","_component_Doughnut","_component_el_button","_component_el_image","_directive_loading","fetchIndexInfo","indexInfo","totalFiles","toLocaleString","formatTime","lastUpdated","getTimeAgo","openReleases","version","keys","channelStats","length","channelChartData","options","chartOptions","count","channel","style","background","getChartColor","getPercentage","typeStats","typeChartData","getTypeChartColor","loading","rebuilding","rebuildIndex","backing","backupData","ref","accept","onChange","handleFileSelect","restoring","selectRestoreFile","newestFile","oldestFile","isImageFile","loadErrors","src","id","fit","onError","handleImageError","isVideoFile","muted","loop","autoplay","metadata","FileName","TimeStamp","round","v","lim","l","h","Math","max","min","p2b","n2b","b2n","n2p","map$1","A","B","C","D","E","F","a","b","c","d","f","hex","h1","h2","eq","isShort","g","hexParse","str","ret","len","alpha","hexString","undefined","HUE_RE","hsl2rgbn","s","n","k","hsv2rgbn","hwb2rgbn","w","rgb","hueValue","rgb2hsl","range","calln","Array","isArray","map","hsl2rgb","hwb2rgb","hsv2rgb","hue","hueParse","m","exec","p1","p2","rotate","deg","hslString","x","Z","Y","X","W","V","U","T","S","R","Q","P","O","N","M","L","K","G","H","I","J","names$1","OiceXe","antiquewEte","aqua","aquamarRe","azuY","beige","bisque","black","blanKedOmond","Xe","XeviTet","bPwn","burlywood","caMtXe","KartYuse","KocTate","cSO","cSnflowerXe","cSnsilk","crimson","cyan","xXe","xcyan","xgTMnPd","xWay","xgYF","xgYy","xkhaki","xmagFta","xTivegYF","xSange","xScEd","xYd","xsOmon","xsHgYF","xUXe","xUWay","xUgYy","xQe","xviTet","dAppRk","dApskyXe","dimWay","dimgYy","dodgerXe","fiYbrick","flSOwEte","foYstWAn","fuKsia","gaRsbSo","ghostwEte","gTd","gTMnPd","Way","gYF","gYFLw","gYy","honeyMw","hotpRk","RdianYd","Rdigo","ivSy","khaki","lavFMr","lavFMrXsh","lawngYF","NmoncEffon","ZXe","ZcSO","Zcyan","ZgTMnPdLw","ZWay","ZgYF","ZgYy","ZpRk","ZsOmon","ZsHgYF","ZskyXe","ZUWay","ZUgYy","ZstAlXe","ZLw","lime","limegYF","lRF","magFta","maPon","VaquamarRe","VXe","VScEd","VpurpN","VsHgYF","VUXe","VsprRggYF","VQe","VviTetYd","midnightXe","mRtcYam","mistyPse","moccasR","navajowEte","navy","Tdlace","Tive","TivedBb","Sange","SangeYd","ScEd","pOegTMnPd","pOegYF","pOeQe","pOeviTetYd","papayawEp","pHKpuff","peru","pRk","plum","powMrXe","purpN","YbeccapurpN","Yd","Psybrown","PyOXe","saddNbPwn","sOmon","sandybPwn","sHgYF","sHshell","siFna","silver","skyXe","UXe","UWay","UgYy","snow","sprRggYF","stAlXe","tan","teO","tEstN","tomato","Qe","viTet","JHt","wEte","wEtesmoke","Lw","LwgYF","unpack","unpacked","tkeys","j","ok","nk","replace","parseInt","names","nameParse","transparent","toLowerCase","RGB_RE","rgbParse","rgbString","to","pow","from","interpolate","rgb1","rgb2","modHSL","ratio","tmp","clone","proto","assign","fromObject","input","functionParse","charAt","Color","_rgb","_valid","valid","obj","mix","color","weight","c1","c2","w2","p","w1","clearer","greyscale","val","opaquer","negate","lighten","darken","saturate","desaturate","noop","uid","isNullOrUndef","toString","slice","isObject","isNumberFinite","isFinite","finiteOrDefault","defaultValue","valueOrDefault","toPercentage","dimension","endsWith","parseFloat","toDimension","callback","fn","thisArg","apply","each","loopable","reverse","_elementsEqual","a0","a1","ilen","v0","v1","datasetIndex","source","target","create","klen","isValidKey","indexOf","_merger","tval","sval","merge","sources","merger","current","mergeIf","_mergerIf","hasOwnProperty","keyResolvers","y","_splitKey","parts","split","part","push","_getKeyResolver","resolveObjectKey","resolver","_capitalize","toUpperCase","defined","isFunction","setsEqual","size","has","_isClickEvent","PI","TAU","PITAU","INFINITY","POSITIVE_INFINITY","RAD_PER_DEG","HALF_PI","QUARTER_PI","TWO_THIRDS_PI","log10","sign","almostEquals","epsilon","abs","niceNum","roundedRange","niceRange","floor","fraction","niceFraction","_factorize","result","sqrt","sort","pop","isNonPrimitive","isNumber","isNaN","almostWhole","rounded","_setMinAndMaxByKey","array","property","toRadians","degrees","toDegrees","radians","_decimalPlaces","getAngleFromPoint","centrePoint","anglePoint","distanceFromXCenter","distanceFromYCenter","radialDistanceFromCenter","angle","atan2","distance","distanceBetweenPoints","pt1","pt2","_angleDiff","_normalizeAngle","_angleBetween","start","end","sameAngleIsFullCircle","angleToStart","angleToEnd","startToAngle","endToAngle","_limitValue","_int16Range","_isBetween","_lookup","table","cmp","mid","hi","lo","_lookupByKey","last","ti","_rlookupByKey","_filterBetween","values","arrayEvents","listenArrayEvents","listener","_chartjs","listeners","forEach","method","base","res","object","unlistenArrayEvents","stub","splice","_arrayUnique","items","set","Set","requestAnimFrame","requestAnimationFrame","throttled","argsToUse","ticking","debounce","delay","timeout","clearTimeout","setTimeout","_toLeftRightCenter","align","_alignStartEnd","_textX","left","right","rtl","check","_getStartAndCountOfVisiblePoints","meta","points","animationsDisabled","pointCount","_sorted","iScale","vScale","_parsed","spanGaps","dataset","axis","minDefined","maxDefined","getUserBounds","getPixelForValue","distanceToDefinedLo","findIndex","point","distanceToDefinedHi","_scaleRangesChanged","xScale","yScale","_scaleRanges","newRanges","xmin","xmax","ymin","ymax","changed","atEdge","elasticIn","sin","elasticOut","effects","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","cos","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","easeOutElastic","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeInBounce","easeOutBounce","easeInOutBounce","isPatternOrGradient","getHoverColor","numbers","colors","applyAnimationsDefaults","defaults","duration","easing","describe","_fallback","_indexable","_scriptable","properties","active","animation","resize","show","animations","visible","hide","applyLayoutsDefaults","autoPadding","padding","top","bottom","intlCache","Map","getNumberFormat","locale","cacheKey","JSON","stringify","formatter","get","Intl","NumberFormat","formatNumber","num","format","formatters","numeric","tickValue","ticks","chart","notation","delta","maxTick","calculateDelta","logDelta","numDecimal","minimumFractionDigits","maximumFractionDigits","logarithmic","remain","significand","includes","Ticks","applyScaleDefaults","display","offset","beginAtZero","bounds","clip","grace","grid","lineWidth","drawOnChartArea","drawTicks","tickLength","tickWidth","tickColor","border","dash","dashOffset","width","text","minRotation","maxRotation","mirror","textStrokeWidth","textStrokeColor","autoSkip","autoSkipPadding","labelOffset","minor","major","crossAlign","showLabelBackdrop","backdropColor","backdropPadding","route","startsWith","overrides","descriptors","getScope$1","node","root","scope","Defaults","_descriptors","_appliers","backgroundColor","borderColor","datasets","devicePixelRatio","context","platform","getDevicePixelRatio","elements","events","font","family","lineHeight","hover","hoverBackgroundColor","ctx","hoverBorderColor","hoverColor","indexAxis","interaction","mode","intersect","includeInvisible","maintainAspectRatio","onHover","parsing","plugins","responsive","scale","scales","showLine","drawActiveElementsOnTop","override","targetScope","targetName","scopeObject","targetScopeObject","privateName","defineProperties","local","appliers","toFontString","_measureText","gc","longest","string","textWidth","measureText","_longestText","arrayOfThings","cache","garbageCollect","save","jlen","thing","nestedThing","restore","gcLen","_alignPixel","pixel","currentDevicePixelRatio","halfWidth","clearCanvas","canvas","getContext","resetTransform","clearRect","height","drawPoint","drawPointLegend","xOffset","yOffset","cornerRadius","xOffsetW","yOffsetW","pointStyle","rotation","radius","rad","translate","drawImage","beginPath","ellipse","arc","closePath","moveTo","lineTo","SQRT1_2","rect","fill","borderWidth","stroke","_isPointInArea","area","margin","clipArea","unclipArea","_steppedLineTo","previous","flip","midpoint","_bezierCurveTo","bezierCurveTo","cp1x","cp2x","cp1y","cp2y","setRenderOpts","opts","translation","fillStyle","textAlign","textBaseline","decorateText","line","strikethrough","underline","metrics","actualBoundingBoxLeft","actualBoundingBoxRight","actualBoundingBoxAscent","actualBoundingBoxDescent","yDecoration","strokeStyle","decorationWidth","drawBackdrop","oldColor","fillRect","renderText","lines","strokeWidth","strokeColor","backdrop","strokeText","maxWidth","fillText","addRoundedRectPath","topLeft","bottomLeft","bottomRight","topRight","LINE_HEIGHT","FONT_STYLE","toLineHeight","matches","match","numberOrZero","_readValueToProps","objProps","read","prop","toTRBL","toTRBLCorners","toPadding","toFont","fallback","console","warn","resolve","inputs","info","cacheable","_addGrace","minmax","change","keepZero","add","createContext","parentContext","_createResolver","scopes","prefixes","rootScopes","getTarget","finalRootScopes","_resolve","toStringTag","_cacheable","_scopes","_rootScopes","_getTarget","Proxy","deleteProperty","_keys","_cached","_resolveWithPrefixes","getOwnPropertyDescriptor","Reflect","getPrototypeOf","getKeysFromAllScopes","ownKeys","storage","_storage","_attachContext","proxy","subProxy","descriptorDefaults","_proxy","_context","_subProxy","_stack","setContext","receiver","_resolveWithContext","allKeys","scriptable","indexable","_allKeys","isScriptable","isIndexable","readKey","prefix","needsSubResolver","_resolveScriptable","_resolveArray","getValue","Error","join","delete","createSubResolver","arr","filter","resolveFallback","getScope","parent","addScopes","parentScopes","parentFallback","allScopes","addScopesFromKey","subGetTarget","resolveKeysFromAllScopes","_parseObjectDataRadialScale","_parsing","parsed","parse","EPSILON","getPoint","skip","getValueAxis","splineCurve","firstPoint","middlePoint","afterPoint","next","d01","d12","s01","s12","fa","fb","monotoneAdjust","deltaK","mK","pointsLen","alphaK","betaK","tauK","squaredMagnitude","pointCurrent","pointAfter","monotoneCompute","valueAxis","pointBefore","iPixel","vPixel","splineCurveMonotone","slopeDelta","capControlPoint","pt","capBezierPoints","inArea","inAreaPrev","inAreaNext","_updateBezierControlPoints","controlPoints","cubicInterpolationMode","prev","tension","_isDomSupported","document","_getParentNode","domNode","parentNode","host","parseMaxStyle","styleValue","parentProperty","valueInPixels","getComputedStyle","element","ownerDocument","defaultView","getStyle","el","getPropertyValue","positions","getPositionedStyle","styles","suffix","pos","useOffsetPos","shadowRoot","getCanvasPosition","touches","offsetX","offsetY","box","getBoundingClientRect","clientX","clientY","getRelativePosition","event","borderBox","boxSizing","paddings","borders","getContainerSize","maxHeight","container","containerStyle","containerBorder","containerPadding","clientWidth","clientHeight","round1","getMaximumSize","bbWidth","bbHeight","aspectRatio","margins","containerSize","maintainHeight","retinaScale","forceRatio","forceStyle","pixelRatio","deviceHeight","deviceWidth","setTransform","supportsEventListenerOptions","passiveSupported","passive","readUsedSize","_pointInLine","_steppedInterpolation","_bezierInterpolation","cp1","cp2","getRightToLeftAdapter","rectX","setWidth","xPlus","leftForLtr","itemWidth","getLeftToRightAdapter","_itemWidth","getRtlAdapter","overrideTextDirection","direction","original","getPropertyPriority","setProperty","prevTextDirection","restoreTextDirection","propertyFn","between","compare","normalize","normalizeSegment","getSegment","segment","startBound","endBound","_boundSegment","prevValue","inside","subStart","startIsBefore","endIsBefore","shouldStart","shouldStop","_boundSegments","segments","sub","findStartAndEnd","solidSegments","cur","stop","_computeSegments","segmentOptions","_loop","splitByStyles","completeLoop","_fullLoop","doSplitByStyles","chartContext","_chart","baseStyle","readStyle","_datasetIndex","prevStyle","addStyle","st","dir","p0","p0DataIndex","p1DataIndex","styleChanged","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","replacer","getSizeForArea","chartArea","field","getDatasetArea","getDatasetClipArea","_clip","Animator","_request","_charts","_running","_lastDate","_notify","anims","date","callbacks","numSteps","initial","currentStep","_refresh","_update","Date","now","remaining","running","draw","_active","_total","tick","_getAnims","charts","complete","progress","listen","cb","reduce","acc","_duration","cancel","remove","animator","interpolators","boolean","factor","c0","number","Animation","cfg","currentValue","_fn","_easing","_start","_target","_prop","_from","_to","_promises","update","elapsed","wait","promises","Promise","rej","resolved","Animations","config","_properties","configure","animationOptions","animatedProps","getOwnPropertyNames","option","_animateOptions","newOptions","resolveTargetOptions","_createAnimations","$shared","awaitAll","$animations","then","anim","all","scaleClip","allowedOverflow","defaultClip","toClip","getSortedDatasetIndices","filterVisible","metasets","_getSortedDatasetMetas","applyStack","stack","dsIndex","singleMode","otherValue","found","convertObjectDataToArray","iAxisKey","vAxisKey","adata","isStacked","stacked","getStackKey","indexScale","valueScale","NEGATIVE_INFINITY","getOrCreateStack","stacks","stackKey","indexValue","subStack","getLastIndexInStack","positive","getMatchingVisibleMetas","updateStacks","controller","_cachedMeta","_stacks","iAxis","vAxis","itemStacks","_top","_bottom","visualValues","_visualValues","getFirstScaleId","shift","createDatasetContext","createDataContext","dataIndex","raw","clearStacks","isDirectUpdateMode","cloneIfNotShared","cached","shared","createStack","canStack","hidden","_stacked","DatasetController","_cachedDataOpts","getMeta","_type","_data","_objectData","_sharedOptions","_drawStart","_drawCount","enableOptionSharing","supportsDecimation","$context","_syncList","datasetElementType","dataElementType","initialize","linkScales","addElements","isPluginEnabled","updateIndex","getDataset","chooseId","xid","xAxisID","yid","yAxisID","rid","rAxisID","iid","iAxisID","vid","vAxisID","getScaleForId","rScale","getDatasetMeta","scaleID","_getOtherScale","reset","_destroy","_dataCheck","isExtensible","buildOrUpdateElements","resetNewElements","stackChanged","oldStacked","_resyncElements","scopeKeys","datasetScopeKeys","getOptionScopes","createResolver","sorted","parseArrayData","parseObjectData","parsePrimitiveData","isNotInOrderComparedToPrev","labels","getLabels","singleScale","xAxisKey","yAxisKey","getParsed","getDataElement","updateRangeFromParsed","parsedValue","NaN","getMinMax","otherScale","otherMin","otherMax","_skip","getAllParsedValues","getMaxOverflow","getLabelAndValue","label","getLabelForValue","resolveDatasetElementOptions","resolveDataElementOptions","_resolveElementOptions","elementType","sharing","datasetElementScopeKeys","resolveNamedOptions","freeze","_resolveAnimations","transition","datasetAnimationScopeKeys","getSharedOptions","includeOptions","sharedOptions","_animationsDisabled","_getSharedOptions","firstOpts","previouslySharedOptions","updateSharedOptions","updateElement","_setStyle","removeHoverStyle","setHoverStyle","_removeDatasetHoverStyle","_setDatasetHoverStyle","arg1","arg2","numMeta","numData","_insertElements","_removeElements","move","updateElements","removed","_sync","_dataChanges","_onDataPush","arguments","_onDataPop","_onDataShift","_onDataSplice","newCount","_onDataUnshift","getAllScaleValues","$bar","visibleMetas","concat","computeMinSampleSize","curr","_length","updateMinAndPrev","getPixelForTick","computeFitCategoryTraits","ruler","stackCount","thickness","barThickness","categoryPercentage","barPercentage","chunk","pixels","computeFlexCategoryTraits","percent","parseFloatBar","entry","startValue","endValue","barStart","barEnd","_custom","parseValue","parseArrayOrPrimitive","isFloatBar","custom","barSign","actualBase","isHorizontal","borderProps","horizontal","setBorderSkipped","edge","borderSkipped","enableBorderRadius","parseEdge","swap","startEnd","orig","v2","setInflateAmount","inflateAmount","BarController","super","bars","getBasePixel","_getRuler","vpixels","head","_calculateBarValuePixels","ipixels","_calculateBarIndexPixels","center","_getStacks","grouped","currentParsed","iScaleValue","skipNull","find","_getStackCount","_getAxisCount","_getAxis","getFirstScaleIdForIndexAxis","indexScaleId","firstScaleAxisId","_getStackIndex","_startPixel","_endPixel","baseValue","minBarLength","floating","getDataVisibility","startPixel","getPixelForDecimal","endPixel","getValueForPixel","halfGrid","getLineWidthForValue","maxBarThickness","Infinity","axisCount","axisID","axisNumber","stackIndex","rects","_index_","_value_","BubbleController","getRatioAndOffset","circumference","cutout","ratioX","ratioY","startAngle","endAngle","startX","startY","endX","endY","calcMax","calcMin","maxX","maxY","minX","minY","DoughnutController","innerRadius","outerRadius","getter","_getRotation","_getCircumference","_getRotationExtents","isDatasetVisible","arcs","spacing","getMaxBorderWidth","getMaxOffset","maxSize","chartWeight","_getRingWeight","maxRadius","radiusLength","_getVisibleDatasetWeightTotal","total","calculateTotal","_getRingWeightOffset","_circumference","animateRotate","calculateCircumference","animationOpts","centerX","centerY","animateScale","metaData","borderAlign","hoverBorderWidth","hoverOffset","ringWeightOffset","legend","generateLabels","useBorderRadius","borderRadius","fontColor","lineDash","lineDashOffset","lineJoin","legendItem","toggleDataVisibility","LineController","_dataset","_decimated","animated","maxGapLength","directUpdate","pointsCount","prevParsed","nullData","lastPoint","updateControlPoints","PolarAreaController","bind","_updateRadius","minSize","cutoutPercentage","getVisibleDatasetCount","xCenter","yCenter","datasetStartAngle","getIndexAngle","defaultAngle","countVisibleElements","_computeAngle","getDistanceFromCenterForValue","angleLines","circular","pointLabels","PieController","RadarController","pointPosition","getPointPositionForValue","ScatterController","registry","getElement","abstract","DateAdapterBase","members","init","formats","diff","startOf","endOf","adapters","_date","binarySearch","metaset","lookupMethod","_reversePixels","getRange","evaluateInteractionItems","position","handler","getSortedVisibleDatasetMetas","getDistanceMetricForAxis","useX","useY","deltaX","deltaY","getIntersectItems","useFinalPosition","isPointInArea","evaluationFunc","inRange","getNearestRadialItems","getProps","getNearestCartesianItems","distanceMetric","minDistance","getCenterPoint","pointInArea","getNearestItems","getAxisItems","rangeMethod","intersectsItem","Interaction","modes","nearest","STATIC_POSITIONS","filterByPosition","filterDynamicPositionByAxis","sortByWeight","wrapBoxes","boxes","layoutBoxes","stackWeight","buildStacks","layouts","wrap","placed","setLayoutDims","params","vBoxMaxWidth","hBoxMaxHeight","layout","fullSize","availableWidth","availableHeight","buildLayoutBoxes","centerHorizontal","centerVertical","leftAndTop","rightAndBottom","vertical","getCombinedMax","maxPadding","updateMaxPadding","boxPadding","updateDims","getPadding","newWidth","outerWidth","newHeight","outerHeight","widthChanged","heightChanged","same","other","handleMaxPadding","updatePos","getMargins","marginForPositions","fitBoxes","refitBoxes","refit","setBoxDims","placeBoxes","userPadding","addBox","_layers","z","removeBox","layoutItem","minPadding","verticalBoxes","horizontalBoxes","beforeLayout","visibleVerticalBoxCount","BasePlatform","acquireContext","releaseContext","isAttached","updateConfig","BasicPlatform","EXPANDO_KEY","EVENT_TYPES","touchstart","touchmove","touchend","pointerenter","pointerdown","pointermove","pointerup","pointerleave","pointerout","isNullOrEmpty","initCanvas","renderHeight","getAttribute","renderWidth","displayWidth","displayHeight","eventListenerOptions","addListener","removeListener","fromNativeEvent","native","nodeListContains","nodeList","contains","createAttachObserver","observer","MutationObserver","entries","trigger","addedNodes","removedNodes","observe","childList","subtree","createDetachObserver","drpListeningCharts","oldDevicePixelRatio","onWindowResize","dpr","listenDevicePixelRatioChanges","unlistenDevicePixelRatioChanges","createResizeObserver","ResizeObserver","contentRect","releaseObserver","disconnect","createProxyAndListen","DomPlatform","removeAttribute","setAttribute","proxies","$proxies","handlers","attach","detach","isConnected","_detectPlatform","OffscreenCanvas","Element","tooltipPosition","hasValue","final","tickOpts","determinedMaxTicks","determineMaxTicks","ticksLimit","maxTicksLimit","majorIndices","enabled","getMajorIndices","numMajorIndices","first","newTicks","skipMajors","calculateSpacing","avgMajorSpacing","_tickSize","maxScale","maxChart","_maxLength","evenMajorSpacing","getEvenSpacing","factors","ceil","majorStart","majorEnd","reverseAlign","offsetFromEdge","getTicksLimit","ticksLength","sample","numItems","increment","getPixelForGridLine","offsetGridLines","validIndex","lineValue","caches","getTickMarkLength","getTitleHeight","createScaleContext","createTickContext","titleAlign","titleArgs","titleX","titleY","positionAxisID","Scale","_margins","paddingTop","paddingBottom","paddingLeft","paddingRight","labelRotation","_range","_gridLineItems","_labelItems","_labelSizes","_longestTextCache","_userMax","_userMin","_suggestedMax","_suggestedMin","_ticksLength","_borderValue","_dataLimitsCached","suggestedMin","suggestedMax","metas","getTicks","xLabels","yLabels","getLabelItems","_computeLabelItems","beforeUpdate","sampleSize","beforeSetDimensions","setDimensions","afterSetDimensions","beforeDataLimits","determineDataLimits","afterDataLimits","beforeBuildTicks","buildTicks","afterBuildTicks","samplingEnabled","_convertTicksToLabels","beforeCalculateLabelRotation","calculateLabelRotation","afterCalculateLabelRotation","afterAutoSkip","beforeFit","afterFit","afterUpdate","reversePixels","_alignToPixels","alignToPixels","_callHooks","notifyPlugins","beforeTickToLabelConversion","generateTickLabels","afterTickToLabelConversion","numTicks","maxLabelDiagonal","_isVisible","labelSizes","_getLabelSizes","maxLabelWidth","widest","maxLabelHeight","highest","asin","titleOpts","gridOpts","titleHeight","tickPadding","angleRadians","labelHeight","labelWidth","_calculatePadding","_handleMargins","isRotated","labelsBelowTicks","offsetLeft","offsetRight","isFullSize","_computeLabelSizes","widths","heights","tickFont","fontString","nestedLabel","widestLabelSize","highestLabelSize","_resolveTickFontOptions","valueAt","idx","decimal","getDecimalForPixel","getBaseValue","optionTicks","rot","_computeGridLineItems","tl","borderOpts","axisWidth","axisHalfWidth","alignBorderValue","borderValue","alignedLineValue","tx1","ty1","tx2","ty2","x1","y1","x2","y2","limit","step","optsAtIndex","optsAtIndexBorder","lineColor","tickBorderDash","tickBorderDashOffset","tickAndPadding","hTickAndPadding","lineCount","textOffset","_getXAxisLabelAlignment","_getYAxisLabelAlignment","halfCount","tickTextAlign","labelPadding","_computeLabelArea","drawBackground","drawGrid","drawLine","setLineDash","drawBorder","lastLineWidth","drawLabels","renderTextOptions","drawTitle","tz","gz","bz","_maxDigits","fontSize","TypedRegistry","isForType","isPrototypeOf","register","parentScope","isIChartComponent","registerDefaults","unregister","itemDefaults","defaultRoutes","routeDefaults","routes","propertyParts","sourceName","sourceScope","Registry","controllers","_typedRegistries","_each","addControllers","addPlugins","addScales","getController","_get","getPlugin","getScale","removeControllers","removeElements","removePlugins","removeScales","typedRegistry","arg","reg","_getRegistryForType","_exec","itemReg","component","camelMethod","PluginService","_init","notify","hook","_createDescriptors","descriptor","plugin","cancelable","invalidate","_oldCache","_notifyStateChanges","allPlugins","createDescriptors","previousDescriptors","some","localIds","getOpts","pluginOpts","pluginScopeKeys","getIndexAxis","datasetDefaults","datasetOptions","getAxisFromDefaultScaleID","getDefaultScaleIDFromAxis","idMatchesAxis","axisFromPosition","determineAxis","scaleOptions","getAxisFromDataset","retrieveAxisFromDatasets","boundDs","mergeScaleConfig","chartDefaults","configScales","chartIndexAxis","scaleConf","error","defaultId","defaultScaleOptions","defaultID","initOptions","initData","initConfig","keyCache","keysCached","cachedKeys","generate","addIfFound","Config","_config","_scopeCache","_resolverCache","clearCache","clear","datasetType","additionalOptionScopes","_cachedScopes","mainScope","resetCache","keyLists","chartOptionScopes","subPrefixes","getResolver","needContext","subResolver","resolverCache","hasFunction","KNOWN_POSITIONS","positionIsHorizontal","compare2Level","l1","l2","onAnimationsComplete","onComplete","onAnimationProgress","onProgress","getCanvas","getElementById","instances","getChart","moveNumericKeys","intKey","determineLastEvent","lastEvent","inChartArea","isClick","Chart","invalidatePlugins","userConfig","initialCanvas","existingChart","_options","_aspectRatio","_metasets","_lastEvent","_listeners","_responsiveListeners","_sortedMetasets","_plugins","_hiddenIndices","attached","_doResize","resizeDelay","_initialize","bindEvents","_resizeBeforeDraw","_resize","newSize","newRatio","onResize","ensureScalesHaveIDs","scalesOptions","axisOptions","buildOrUpdateScales","scaleOpts","updated","isRadial","dposition","dtype","scaleType","scaleClass","hasUpdated","_updateMetasets","_destroyDatasetMeta","_removeUnreferencedMetasets","buildOrUpdateControllers","newControllers","order","ControllerClass","_resetElements","animsDisabled","_updateScales","_checkEventBindings","_updateHiddenIndices","_minPadding","_updateLayout","_updateDatasets","_eventHandler","_updateHoverStyles","existingEvents","newEvents","unbindEvents","changes","_getUniformDataChanges","datasetCount","makeSet","changeSet","noArea","_idx","_updateDataset","layers","_drawDatasets","_drawDataset","getElementsAtEventForMode","setDatasetVisibility","_updateVisibility","_stop","destroy","toBase64Image","toDataURL","bindUserEvents","bindResponsiveEvents","_add","_remove","detached","updateHoverStyle","getActiveElements","setActiveElements","activeElements","lastActive","pluginId","replay","hoverOptions","deactivated","activated","eventFilter","_handleEvent","_getActiveElements","clipSelf","outerAngleClip","innerAngleClip","clipWidth","clipArc","pixelMargin","angleMargin","toRadiusCorners","parseBorderRadius$1","angleDelta","halfThickness","innerLimit","computeOuterLimit","outerArcLimit","outerStart","outerEnd","innerStart","innerEnd","rThetaToXY","theta","pathArc","innerR","spacingOffset","noSpacingInnerRadius","noSpacingOuterRadius","avNogSpacingRadius","adjustedAngle","beta","angleOffset","outerStartAdjustedRadius","outerEndAdjustedRadius","outerStartAdjustedAngle","outerEndAdjustedAngle","innerStartAdjustedRadius","innerEndAdjustedRadius","innerStartAdjustedAngle","innerEndAdjustedAngle","outerMidAdjustedAngle","pCenter","p4","innerMidAdjustedAngle","p8","outerStartX","outerStartY","outerEndX","outerEndY","drawArc","fullCircles","inner","selfJoin","ArcElement","chartX","chartY","rAdjust","nonZeroBetween","betweenAngles","withinRadius","halfAngle","halfRadius","fix","radiusOffset","setStyle","lineCap","getLineMethod","stepped","pathVars","paramsStart","paramsEnd","segmentStart","segmentEnd","outside","pathSegment","lineMethod","fastPathSegment","prevX","lastY","avgX","countX","pointIndex","drawX","truncX","_getSegmentMethod","useFastPath","_getInterpolationMethod","strokePathWithCache","path","_path","Path2D","strokePathDirect","segmentMethod","usePath2D","LineElement","_points","_segments","_pointsUpdated","_interpolate","interpolated","inRange$1","hitRadius","PointElement","mouseX","mouseY","inXRange","inYRange","hoverRadius","getBarBounds","bar","half","skipOrLimit","parseBorderWidth","maxW","maxH","parseBorderRadius","maxR","enableBorder","boundingRects","outer","skipX","skipY","skipBoth","hasRadius","addNormalRectPath","inflateRect","amount","refRect","BarElement","addRectPath","getBoxSize","labelOpts","boxHeight","boxWidth","usePointStyle","pointStyleWidth","itemHeight","itemsEqual","Legend","_added","legendHitBoxes","_hoveredItem","doughnutMode","legendItems","columnSizes","lineWidths","buildLabels","labelFont","_computeTitleHeight","_fitRows","_fitCols","hitboxes","totalHeight","row","_itemHeight","heightLimit","totalWidth","currentColWidth","currentColHeight","col","calculateItemSize","adjustHitBoxes","rtlHelper","hitbox","_draw","defaultColor","halfFontSize","cursor","drawLegendBox","drawOptions","SQRT2","yBoxTop","xBoxLeft","textDirection","realX","fontLineHeight","calculateLegendItemHeight","titleFont","titlePadding","topPaddingPlusHalfFontSize","_getLegendItemAt","hitBox","lh","handleEvent","isListened","hoveredItem","sameItem","onLeave","calculateItemWidth","calculateItemHeight","legendItemText","plugin_legend","_element","_args","afterEvent","ci","WeakMap","positioners","average","xSet","xAverage","eventPosition","nearestElement","tp","pushOrConcat","toPush","splitNewlines","createTooltipItem","formattedValue","getTooltipSize","tooltip","body","footer","bodyFont","footerFont","titleLineCount","footerLineCount","bodyLineItemCount","combinedBodyLength","bodyItem","before","after","beforeBody","afterBody","titleSpacing","titleMarginBottom","bodyLineHeight","displayColors","bodySpacing","footerMarginTop","footerSpacing","widthPadding","maxLineWidth","determineYAlign","doesNotFitWithAlign","xAlign","caret","caretSize","caretPadding","determineXAlign","yAlign","chartWidth","determineAlignment","alignX","alignY","paddingAndSize","getBackgroundPoint","alignment","getAlignedX","getBeforeAfterBodyLines","createTooltipContext","tooltipItems","overrideCallbacks","defaultCallbacks","beforeTitle","labelCount","afterTitle","beforeLabel","tooltipItem","labelColor","labelTextColor","bodyColor","labelPointStyle","afterLabel","beforeFooter","afterFooter","invokeCallbackWithFallback","Tooltip","opacity","_eventPosition","_size","_cachedAnimations","_tooltipItems","dataPoints","caretX","caretY","labelColors","labelPointStyles","labelTextColors","getTitle","getBeforeBody","getBody","bodyItems","scoped","getAfterBody","getFooter","_createItems","itemSort","positionAndSize","backgroundPoint","external","drawCaret","tooltipPoint","caretPosition","getCaretPosition","x3","y3","ptX","ptY","titleColor","_drawColorBox","colorX","rtlColorX","yOffSet","colorY","multiKeyBackground","outerX","innerX","strokeRect","drawBody","bodyAlign","xLinePadding","fillLineOfText","bodyAlignForCalculation","textColor","drawFooter","footerAlign","footerColor","tooltipSize","quadraticCurveTo","_updateAnimationTarget","animX","animY","_willRender","hasTooltipContent","globalAlpha","positionChanged","_positionChanged","_ignoreReplayEvents","plugin_tooltip","afterInit","afterDraw","addIfString","addedLabels","unshift","findOrAddLabel","lastIndexOf","_getLabelForValue","CategoryScale","_startValue","_valueRange","_addedLabels","added","generateTicks$1","generationOptions","dataRange","MIN_SPACING","precision","maxTicks","maxDigits","includeBounds","unit","maxSpaces","rmin","rmax","countDefined","minSpacing","niceMin","niceMax","numSpaces","decimalPlaces","relativeLabelSize","LinearScaleBase","_endValue","handleTickRangeOptions","setMin","setMax","minSign","maxSign","getTickLimit","stepSize","computeTickLimit","numericGeneratorOptions","LinearScale","log10Floor","changeExponent","isMajor","tickVal","steps","rangeExp","rangeStep","startExp","generateTicks","minExp","exp","lastTick","LogarithmicScale","_zero","getTickBackdropHeight","measureLabelSize","determineLimits","fitWithPointLabels","_padding","limits","valueCount","_pointLabels","pointLabelOpts","additionalAngle","centerPointLabels","getPointLabelContext","getPointPosition","drawingArea","plFont","textSize","hLimits","vLimits","updateLimits","setCenterPoint","_pointLabelItems","buildPointLabelItems","createPointLabelItem","itemOpts","outerDistance","extra","pointLabelPosition","yForAngle","getTextAlignForAngle","leftForTextAlign","isNotOverlapped","apexesInArea","drawPointLabelBox","backdropLeft","backdropTop","backdropWidth","backdropHeight","drawPointLabels","pathRadiusLine","drawRadiusLine","gridLineOpts","createPointLabelContext","RadialLinearScale","leftMovement","rightMovement","topMovement","bottomMovement","angleMultiplier","scalingFactor","getValueForDistanceFromCenter","scaledDistance","pointLabel","distanceFromCenter","getBasePosition","getPointLabelPosition","animate","INTERVALS","millisecond","common","second","minute","hour","day","week","month","quarter","year","UNITS","sorter","adapter","_adapter","parser","isoWeekday","_parseOpts","determineUnitForAutoTicks","minUnit","capacity","interval","MAX_SAFE_INTEGER","determineUnitForFormatting","determineMajorUnit","addTick","time","timestamps","timestamp","setMajorTicks","majorUnit","ticksFromTimestamps","TimeScale","_unit","_majorUnit","_offsets","_normalized","displayFormats","normalized","_applyBounds","_getLabelBounds","getLabelTimestamps","timeOpts","_generate","_getLabelCapacity","initOffsets","offsetAfterAutoskip","getDecimalForValue","weekday","hasWeekday","getDataTimestamps","tooltipFormat","datetime","fmt","_tickFormatFunction","minorFormat","majorFormat","offsets","_getLabelSize","ticksOpts","tickLabelWidth","cosRotation","sinRotation","tickFontSize","exampleTime","exampleLabel","prevSource","nextSource","prevTarget","nextTarget","span","TimeSeriesScale","_table","_minPos","_tableRange","_getTimestampsForTable","buildLookupTable","CommonProps","required","datasetIdKey","updateMode","A11yProps","ariaLabel","ariaDescribedby","Props","destroyDelay","compatProps","internals","attrs","toRawIfProxy","isProxy","toRaw","cloneProxy","setOptions","nextOptions","setLabels","currentData","nextLabels","setDatasets","nextDatasets","addedDatasets","nextDataset","currentDataset","cloneData","nextData","defineComponent","setup","param","expose","slots","canvasRef","chartRef","shallowRef","renderChart","clonedData","proxiedData","Chart$1","destroyChart","onMounted","onUnmounted","watch","param1","nextOptionsProxy","nextDataProxy","prevOptionsProxy","prevDataProxy","shouldUpdate","prevOptions","prevLabels","prevDatasets","nextTick","deep","role","createTypedChart","registerables","reforwardRef","Doughnut","components","newest","oldest","channelColors","typeColors","computed","stats","percentage","toFixed","response","fetchWithAuth","json","$message","success","errorData","blob","url","URL","createObjectURL","createElement","href","download","toISOString","appendChild","click","removeChild","revokeObjectURL","message","$refs","fileInput","file","files","$confirm","confirmButtonText","cancelButtonText","restoreData","headers","restoredFiles","restoredSettings","minutes","hours","days","isValidPreview","FileType","open","fileName","extension","substring","imageExtensions","videoExtensions","_component_el_radio","_component_el_radio_group","_component_el_switch","_component_el_form_item","_component_el_form","_component_el_input","_component_el_input_number","_component_el_progress","modelValue","activeChannel","channels","activeChannelLabel","model","telegramSettings","loadBalance","rules","tgRules","ref_for","fixed","botToken","autocomplete","chatId","deleteChannel","cfr2Settings","publicUrl","quota","onQuotaEnabledChange","limitGB","threshold","link","refreshQuota","quotaLoading","getQuotaPercentage","status","getQuotaStatus","getQuotaText","isQuotaExceeded","getQuotaStatusText","s3Settings","s3Rules","endpoint","pathStyle","bucketName","region","placeholder","accessKeyId","secretAccessKey","discordSettings","discordRules","channelId","proxyUrl","isNitro","huggingfaceSettings","huggingfaceRules","repo","token","isPrivate","addChannel","saveSettings","validator","rule","savePath","quotaStats","validationPromises","tgChannelForm","form","validate","s3ChannelForm","discordChannelForm","huggingfaceChannelForm","results","isValid","every","settings","telegram","cfr2","s3","discord","huggingface","getResponse","getData","loadQuotaStats","getChannelUsedGB","usedMB","usedGB","async","recalculateQuota","catch","finally","_component_el_table_column","_component_el_tag","_component_el_table","_component_el_option","_component_el_select","_component_el_checkbox","_component_el_checkbox_group","_component_el_dialog","authSettings","user","userPassRules","authCode","onInput","handleUserPassInput","showUserPassConfirm","confirmNewUserPassword","admin","adminPassRules","adminUsername","adminPassword","handleAdminPassInput","showAdminPassConfirm","confirmNewAdminPassword","showCreateTokenDialog","circle","apiTokens","permissions","perm","getPermissionText","formatDate","createdAt","editToken","deleteToken","tokenLoading","uploadSettings","moderate","moderateContentApiKey","nsfwApiPath","accessSettings","allowedDomains","whiteListMode","dialogWidth","createToken","newToken","tokenRules","showEditTokenDialog","updateToken","editingToken","showTokenResultDialog","createdToken","readonly","append","copyToken","oriUserPassword","oriAdminPassword","owner","urlReservedChars","hasReservedChar","char","permission","permissionMap","dateString","loadApiTokens","tokens","tokenForm","editTokenForm","tokenId","navigator","clipboard","writeText","userPassForm","adminPassForm","auth","upload","access","groupedSettings","categoryGroup","categoryName","setting","category","telemetry","randomImageAPI","allowedDir","publicBrowse","cloudflareApiToken","CF_ZONE_ID","CF_EMAIL","CF_API_KEY","webDAV","username","password","immediate","newHash","scrollTo","newIndex","hash","$router","DashboardTabs","SysConfigTabs","SysCogStatus","SysCogUpload","SysCogSecurity","SysCogPage","SysCogOthers","$route","$store","commit","setDefaultHash","defaultHash","location"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/js/289.8c3b6ce7.js.map.gz b/js/289.8c3b6ce7.js.map.gz new file mode 100644 index 0000000000000000000000000000000000000000..dfd9cbb8485f3059276cefbc90a1f6253e9b735a GIT binary patch literal 300980 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
ah0Vg#V#TA2}W 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�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 K`(Ua1wPo0v+oX=kq!2#RSi~G_DMi=ai$6 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 literal 0 HcmV?d00001 diff --git a/js/424.28a751ba.js.gz b/js/424.28a751ba.js.gz deleted file mode 100644 index 00370c98410d13d9b114fb9f158a37c92603fe33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83367 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 z 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 z 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 uW=K {\n return _openBlock(), _createElementBlock(\"div\", {\n key: item.index,\n class: _normalizeClass([\"menu-item\", {\n 'is-active': $props.activeIndex === item.index\n }]),\n onClick: $event => $options.handleSelect(item.index)\n }, [_createVNode(_component_font_awesome_icon, {\n icon: item.icon,\n class: \"menu-icon\"\n }, null, 8, [\"icon\"]), _createElementVNode(\"span\", _hoisted_3, _toDisplayString(item.title), 1)], 10, _hoisted_2);\n }), 128))]), _createElementVNode(\"div\", {\n class: \"toggle-button\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.toggleCollapse && $options.toggleCollapse(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: $props.isCollapse ? 'angle-double-right' : 'angle-double-left'\n }, null, 8, [\"icon\"])])], 2);\n}","export default {\n name: 'SysConfigTabs',\n props: {\n activeIndex: {\n type: String,\n default: 'status'\n },\n isCollapse: {\n type: Boolean,\n default: false\n }\n },\n data() {\n return {\n menuItems: [{\n index: 'status',\n icon: 'chart-bar',\n title: '系统状态'\n }, {\n index: 'upload',\n icon: 'cloud-upload',\n title: '上传设置'\n }, {\n index: 'security',\n icon: 'shield',\n title: '安全设置'\n }, {\n index: 'page',\n icon: 'pager',\n title: '网页设置'\n }, {\n index: 'others',\n icon: 'cog',\n title: '其他设置'\n }]\n };\n },\n methods: {\n toggleCollapse() {\n this.$emit('update:isCollapse', !this.isCollapse);\n },\n checkMobile() {\n const isMobile = window.innerWidth <= 768;\n this.$emit('update:isCollapse', isMobile);\n },\n handleSelect(index) {\n this.$emit('update:activeIndex', index);\n }\n },\n mounted() {\n this.checkMobile();\n window.addEventListener('resize', this.checkMobile);\n },\n beforeDestroy() {\n window.removeEventListener('resize', this.checkMobile);\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysConfigTabs.vue?vue&type=template&id=2bd8175a&scoped=true\"\nimport script from \"./SysConfigTabs.vue?vue&type=script&lang=js\"\nexport * from \"./SysConfigTabs.vue?vue&type=script&lang=js\"\n\nimport \"./SysConfigTabs.vue?vue&type=style&index=0&id=2bd8175a&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-2bd8175a\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createElementVNode as _createElementVNode, resolveDynamicComponent as _resolveDynamicComponent, normalizeClass as _normalizeClass, openBlock as _openBlock, createBlock as _createBlock, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"container\"\n};\nconst _hoisted_2 = {\n class: \"header-content\"\n};\nconst _hoisted_3 = {\n class: \"header-action\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_DashboardTabs = _resolveComponent(\"DashboardTabs\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_header = _resolveComponent(\"el-header\");\n const _component_SysConfigTabs = _resolveComponent(\"SysConfigTabs\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createVNode(_component_el_header, null, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_2, [_createVNode(_component_DashboardTabs, {\n activeTab: \"systemConfig\"\n }), _createElementVNode(\"div\", _hoisted_3, [_createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: \"退出登录\",\n placement: \"bottom\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sign-out-alt\",\n class: \"header-icon\",\n onClick: $options.handleLogout\n }, null, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"disabled\"])])])]),\n _: 1\n }), _createVNode(_component_SysConfigTabs, {\n activeIndex: $data.activeIndex,\n \"onUpdate:activeIndex\": _cache[0] || (_cache[0] = $event => $data.activeIndex = $event),\n isCollapse: $data.isSidebarCollapse,\n \"onUpdate:isCollapse\": _cache[1] || (_cache[1] = $event => $data.isSidebarCollapse = $event)\n }, null, 8, [\"activeIndex\", \"isCollapse\"]), (_openBlock(), _createBlock(_resolveDynamicComponent($options.currentComponent), {\n class: _normalizeClass(['main-container', {\n 'collapsed': $data.isSidebarCollapse\n }])\n }, null, 8, [\"class\"]))]);\n}","import { resolveComponent as _resolveComponent, createVNode as _createVNode, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, normalizeStyle as _normalizeStyle, createTextVNode as _createTextVNode, withCtx as _withCtx, createBlock as _createBlock, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"status-panel\"\n};\nconst _hoisted_2 = {\n class: \"overview-cards\"\n};\nconst _hoisted_3 = {\n class: \"card-icon\"\n};\nconst _hoisted_4 = {\n class: \"card-content\"\n};\nconst _hoisted_5 = {\n class: \"card-value\"\n};\nconst _hoisted_6 = {\n class: \"overview-card index-status\"\n};\nconst _hoisted_7 = {\n class: \"card-icon\"\n};\nconst _hoisted_8 = {\n class: \"card-content\"\n};\nconst _hoisted_9 = {\n class: \"card-value\"\n};\nconst _hoisted_10 = {\n class: \"card-subtitle\"\n};\nconst _hoisted_11 = {\n class: \"card-icon\"\n};\nconst _hoisted_12 = {\n class: \"card-content\"\n};\nconst _hoisted_13 = {\n class: \"card-value\"\n};\nconst _hoisted_14 = {\n class: \"charts-section\"\n};\nconst _hoisted_15 = {\n class: \"chart-card\"\n};\nconst _hoisted_16 = {\n class: \"chart-header\"\n};\nconst _hoisted_17 = {\n class: \"chart-content\"\n};\nconst _hoisted_18 = {\n key: 0,\n class: \"empty-state\"\n};\nconst _hoisted_19 = {\n key: 1,\n class: \"pie-chart-container\"\n};\nconst _hoisted_20 = {\n class: \"pie-chart-wrapper\"\n};\nconst _hoisted_21 = {\n class: \"chart-center-text\"\n};\nconst _hoisted_22 = {\n class: \"center-value\"\n};\nconst _hoisted_23 = {\n class: \"chart-legend\"\n};\nconst _hoisted_24 = {\n class: \"legend-label\"\n};\nconst _hoisted_25 = {\n class: \"legend-value\"\n};\nconst _hoisted_26 = {\n class: \"legend-percent\"\n};\nconst _hoisted_27 = {\n class: \"chart-card\"\n};\nconst _hoisted_28 = {\n class: \"chart-header\"\n};\nconst _hoisted_29 = {\n class: \"chart-content\"\n};\nconst _hoisted_30 = {\n key: 0,\n class: \"empty-state\"\n};\nconst _hoisted_31 = {\n key: 1,\n class: \"pie-chart-container\"\n};\nconst _hoisted_32 = {\n class: \"pie-chart-wrapper\"\n};\nconst _hoisted_33 = {\n class: \"chart-center-text\"\n};\nconst _hoisted_34 = {\n class: \"center-value\"\n};\nconst _hoisted_35 = {\n class: \"chart-legend\"\n};\nconst _hoisted_36 = {\n class: \"legend-label\"\n};\nconst _hoisted_37 = {\n class: \"legend-value\"\n};\nconst _hoisted_38 = {\n class: \"legend-percent\"\n};\nconst _hoisted_39 = {\n class: \"actions-section\"\n};\nconst _hoisted_40 = {\n class: \"action-card\"\n};\nconst _hoisted_41 = {\n class: \"action-header\"\n};\nconst _hoisted_42 = {\n class: \"action-content\"\n};\nconst _hoisted_43 = {\n class: \"action-buttons\"\n};\nconst _hoisted_44 = {\n class: \"restore-section\"\n};\nconst _hoisted_45 = {\n key: 0,\n class: \"file-info-section\"\n};\nconst _hoisted_46 = {\n key: 0,\n class: \"file-info-card info-card-newest\"\n};\nconst _hoisted_47 = {\n class: \"card-bg-wrapper\"\n};\nconst _hoisted_48 = [\"src\"];\nconst _hoisted_49 = {\n key: 2,\n class: \"card-bg-fallback\"\n};\nconst _hoisted_50 = {\n class: \"info-card-overlay\"\n};\nconst _hoisted_51 = {\n class: \"info-card-header\"\n};\nconst _hoisted_52 = {\n class: \"header-badge\"\n};\nconst _hoisted_53 = {\n class: \"info-card-content\"\n};\nconst _hoisted_54 = {\n class: \"info-details\"\n};\nconst _hoisted_55 = {\n class: \"file-name\"\n};\nconst _hoisted_56 = {\n class: \"file-meta\"\n};\nconst _hoisted_57 = {\n key: 1,\n class: \"file-info-card info-card-oldest\"\n};\nconst _hoisted_58 = {\n class: \"card-bg-wrapper\"\n};\nconst _hoisted_59 = [\"src\"];\nconst _hoisted_60 = {\n key: 2,\n class: \"card-bg-fallback\"\n};\nconst _hoisted_61 = {\n class: \"info-card-overlay\"\n};\nconst _hoisted_62 = {\n class: \"info-card-header\"\n};\nconst _hoisted_63 = {\n class: \"header-badge warning\"\n};\nconst _hoisted_64 = {\n class: \"info-card-content\"\n};\nconst _hoisted_65 = {\n class: \"info-details\"\n};\nconst _hoisted_66 = {\n class: \"file-name\"\n};\nconst _hoisted_67 = {\n class: \"file-meta\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_Doughnut = _resolveComponent(\"Doughnut\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_image = _resolveComponent(\"el-image\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"div\", {\n class: \"overview-card total-files\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.fetchIndexInfo && $options.fetchIndexInfo(...args))\n }, [_createElementVNode(\"div\", _hoisted_3, [_createVNode(_component_font_awesome_icon, {\n icon: \"database\"\n })]), _createElementVNode(\"div\", _hoisted_4, [_cache[7] || (_cache[7] = _createElementVNode(\"div\", {\n class: \"card-title\"\n }, \"文件总数\", -1)), _createElementVNode(\"div\", _hoisted_5, _toDisplayString($data.indexInfo.totalFiles?.toLocaleString() || '0'), 1), _cache[8] || (_cache[8] = _createElementVNode(\"div\", {\n class: \"card-subtitle\"\n }, \"点击刷新\", -1))])]), _createElementVNode(\"div\", _hoisted_6, [_createElementVNode(\"div\", _hoisted_7, [_createVNode(_component_font_awesome_icon, {\n icon: \"clock\"\n })]), _createElementVNode(\"div\", _hoisted_8, [_cache[9] || (_cache[9] = _createElementVNode(\"div\", {\n class: \"card-title\"\n }, \"索引更新时间\", -1)), _createElementVNode(\"div\", _hoisted_9, _toDisplayString($options.formatTime($data.indexInfo.lastUpdated)), 1), _createElementVNode(\"div\", _hoisted_10, _toDisplayString($options.getTimeAgo($data.indexInfo.lastUpdated)), 1)])]), _createElementVNode(\"div\", {\n class: \"overview-card system-version\",\n onClick: _cache[1] || (_cache[1] = (...args) => $options.openReleases && $options.openReleases(...args))\n }, [_createElementVNode(\"div\", _hoisted_11, [_createVNode(_component_font_awesome_icon, {\n icon: \"code-branch\"\n })]), _createElementVNode(\"div\", _hoisted_12, [_cache[10] || (_cache[10] = _createElementVNode(\"div\", {\n class: \"card-title\"\n }, \"系统版本\", -1)), _createElementVNode(\"div\", _hoisted_13, \"v\" + _toDisplayString($data.version), 1), _cache[11] || (_cache[11] = _createElementVNode(\"div\", {\n class: \"card-subtitle\"\n }, \"点击查看更新日志\", -1))])])]), _createElementVNode(\"div\", _hoisted_14, [_createElementVNode(\"div\", _hoisted_15, [_createElementVNode(\"div\", _hoisted_16, [_createVNode(_component_font_awesome_icon, {\n icon: \"share-alt\"\n }), _cache[12] || (_cache[12] = _createElementVNode(\"span\", null, \"上传渠道分布\", -1))]), _createElementVNode(\"div\", _hoisted_17, [Object.keys($data.indexInfo.channelStats || {}).length === 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_18, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\"\n }), _cache[13] || (_cache[13] = _createElementVNode(\"span\", null, \"暂无数据\", -1))])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_19, [_createElementVNode(\"div\", _hoisted_20, [_createVNode(_component_Doughnut, {\n data: $options.channelChartData,\n options: $options.chartOptions\n }, null, 8, [\"data\", \"options\"]), _createElementVNode(\"div\", _hoisted_21, [_createElementVNode(\"div\", _hoisted_22, _toDisplayString($data.indexInfo.totalFiles?.toLocaleString() || '0'), 1), _cache[14] || (_cache[14] = _createElementVNode(\"div\", {\n class: \"center-label\"\n }, \"文件总数\", -1))])]), _createElementVNode(\"div\", _hoisted_23, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.indexInfo.channelStats, (count, channel, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: channel,\n class: \"legend-item\"\n }, [_createElementVNode(\"span\", {\n class: \"legend-color\",\n style: _normalizeStyle({\n background: $options.getChartColor(index)\n })\n }, null, 4), _createElementVNode(\"span\", _hoisted_24, _toDisplayString(channel), 1), _createElementVNode(\"span\", _hoisted_25, _toDisplayString(count.toLocaleString()), 1), _createElementVNode(\"span\", _hoisted_26, _toDisplayString($options.getPercentage(count, $data.indexInfo.totalFiles)) + \"%\", 1)]);\n }), 128))])]))])]), _createElementVNode(\"div\", _hoisted_27, [_createElementVNode(\"div\", _hoisted_28, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\"\n }), _cache[15] || (_cache[15] = _createElementVNode(\"span\", null, \"文件状态分布\", -1))]), _createElementVNode(\"div\", _hoisted_29, [Object.keys($data.indexInfo.typeStats || {}).length === 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_30, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\"\n }), _cache[16] || (_cache[16] = _createElementVNode(\"span\", null, \"暂无数据\", -1))])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_31, [_createElementVNode(\"div\", _hoisted_32, [_createVNode(_component_Doughnut, {\n data: $options.typeChartData,\n options: $options.chartOptions\n }, null, 8, [\"data\", \"options\"]), _createElementVNode(\"div\", _hoisted_33, [_createElementVNode(\"div\", _hoisted_34, _toDisplayString(Object.keys($data.indexInfo.typeStats).length), 1), _cache[17] || (_cache[17] = _createElementVNode(\"div\", {\n class: \"center-label\"\n }, \"状态类型\", -1))])]), _createElementVNode(\"div\", _hoisted_35, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.indexInfo.typeStats, (count, type, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: type,\n class: \"legend-item\"\n }, [_createElementVNode(\"span\", {\n class: \"legend-color\",\n style: _normalizeStyle({\n background: $options.getTypeChartColor(index)\n })\n }, null, 4), _createElementVNode(\"span\", _hoisted_36, _toDisplayString(type || '未知类型'), 1), _createElementVNode(\"span\", _hoisted_37, _toDisplayString(count.toLocaleString()), 1), _createElementVNode(\"span\", _hoisted_38, _toDisplayString($options.getPercentage(count, $data.indexInfo.totalFiles)) + \"%\", 1)]);\n }), 128))])]))])])]), _createElementVNode(\"div\", _hoisted_39, [_createElementVNode(\"div\", _hoisted_40, [_createElementVNode(\"div\", _hoisted_41, [_createVNode(_component_font_awesome_icon, {\n icon: \"tools\"\n }), _cache[18] || (_cache[18] = _createElementVNode(\"span\", null, \"系统维护\", -1))]), _createElementVNode(\"div\", _hoisted_42, [_createElementVNode(\"div\", _hoisted_43, [_createVNode(_component_el_tooltip, {\n content: \"重新扫描所有文件并更新索引数据,适用于数据不一致时的修复\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n type: \"primary\",\n loading: $data.rebuilding,\n onClick: $options.rebuildIndex,\n class: \"action-btn rebuild-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sync-alt\"\n }), _createTextVNode(\" \" + _toDisplayString($data.rebuilding ? '重建中...' : '重建索引'), 1)]),\n _: 1\n }, 8, [\"loading\", \"onClick\"])]),\n _: 1\n }), _createVNode(_component_el_tooltip, {\n content: \"备份所有文件元数据和系统设置到JSON文件\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n type: \"success\",\n loading: $data.backing,\n onClick: $options.backupData,\n class: \"action-btn backup-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"download\"\n }), _createTextVNode(\" \" + _toDisplayString($data.backing ? '备份中...' : '备份数据'), 1)]),\n _: 1\n }, 8, [\"loading\", \"onClick\"])]),\n _: 1\n }), _createVNode(_component_el_tooltip, {\n content: \"从备份文件恢复数据,将覆盖现有的文件元数据和系统设置\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_44, [_createElementVNode(\"input\", {\n type: \"file\",\n ref: \"fileInput\",\n accept: \".json\",\n onChange: _cache[2] || (_cache[2] = (...args) => $options.handleFileSelect && $options.handleFileSelect(...args)),\n style: {\n \"display\": \"none\"\n }\n }, null, 544), _createVNode(_component_el_button, {\n type: \"warning\",\n loading: $data.restoring,\n onClick: $options.selectRestoreFile,\n class: \"action-btn restore-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"upload\"\n }), _createTextVNode(\" \" + _toDisplayString($data.restoring ? '恢复中...' : '恢复数据'), 1)]),\n _: 1\n }, 8, [\"loading\", \"onClick\"])])]),\n _: 1\n })])])])]), $data.indexInfo.newestFile || $data.indexInfo.oldestFile ? (_openBlock(), _createElementBlock(\"div\", _hoisted_45, [$data.indexInfo.newestFile ? (_openBlock(), _createElementBlock(\"div\", _hoisted_46, [_createElementVNode(\"div\", _hoisted_47, [$options.isImageFile($data.indexInfo.newestFile) && !$data.loadErrors['newest'] ? (_openBlock(), _createBlock(_component_el_image, {\n key: 0,\n src: '/file/' + $data.indexInfo.newestFile.id + '?from=admin',\n fit: \"cover\",\n class: \"card-bg-media\",\n onError: _cache[3] || (_cache[3] = $event => $options.handleImageError('newest'))\n }, null, 8, [\"src\"])) : $options.isVideoFile($data.indexInfo.newestFile) && !$data.loadErrors['newest'] ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: '/file/' + $data.indexInfo.newestFile.id + '?from=admin',\n class: \"card-bg-media\",\n muted: \"\",\n loop: \"\",\n autoplay: \"\",\n onError: _cache[4] || (_cache[4] = $event => $options.handleImageError('newest'))\n }, null, 40, _hoisted_48)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_49, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\",\n class: \"fallback-icon\"\n })]))]), _createElementVNode(\"div\", _hoisted_50, [_createElementVNode(\"div\", _hoisted_51, [_createElementVNode(\"div\", _hoisted_52, [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-up\"\n }), _cache[19] || (_cache[19] = _createElementVNode(\"span\", null, \"最近上传\", -1))])]), _createElementVNode(\"div\", _hoisted_53, [_createElementVNode(\"div\", _hoisted_54, [_createElementVNode(\"div\", _hoisted_55, _toDisplayString($data.indexInfo.newestFile.metadata?.FileName || $data.indexInfo.newestFile.id), 1), _createElementVNode(\"div\", _hoisted_56, _toDisplayString($options.formatTime($data.indexInfo.newestFile.metadata?.TimeStamp)), 1)])])])])) : _createCommentVNode(\"\", true), $data.indexInfo.oldestFile ? (_openBlock(), _createElementBlock(\"div\", _hoisted_57, [_createElementVNode(\"div\", _hoisted_58, [$options.isImageFile($data.indexInfo.oldestFile) && !$data.loadErrors['oldest'] ? (_openBlock(), _createBlock(_component_el_image, {\n key: 0,\n src: '/file/' + $data.indexInfo.oldestFile.id + '?from=admin',\n fit: \"cover\",\n class: \"card-bg-media\",\n onError: _cache[5] || (_cache[5] = $event => $options.handleImageError('oldest'))\n }, null, 8, [\"src\"])) : $options.isVideoFile($data.indexInfo.oldestFile) && !$data.loadErrors['oldest'] ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: '/file/' + $data.indexInfo.oldestFile.id + '?from=admin',\n class: \"card-bg-media\",\n muted: \"\",\n loop: \"\",\n autoplay: \"\",\n onError: _cache[6] || (_cache[6] = $event => $options.handleImageError('oldest'))\n }, null, 40, _hoisted_59)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_60, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\",\n class: \"fallback-icon\"\n })]))]), _createElementVNode(\"div\", _hoisted_61, [_createElementVNode(\"div\", _hoisted_62, [_createElementVNode(\"div\", _hoisted_63, [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-down\"\n }), _cache[20] || (_cache[20] = _createElementVNode(\"span\", null, \"最早上传\", -1))])]), _createElementVNode(\"div\", _hoisted_64, [_createElementVNode(\"div\", _hoisted_65, [_createElementVNode(\"div\", _hoisted_66, _toDisplayString($data.indexInfo.oldestFile.metadata?.FileName || $data.indexInfo.oldestFile.id), 1), _createElementVNode(\"div\", _hoisted_67, _toDisplayString($options.formatTime($data.indexInfo.oldestFile.metadata?.TimeStamp)), 1)])])])])) : _createCommentVNode(\"\", true)])) : _createCommentVNode(\"\", true)])), [[_directive_loading, $data.loading]]);\n}","/*!\n * @kurkle/color v0.3.4\n * https://github.com/kurkle/color#readme\n * (c) 2024 Jukka Kurkela\n * Released under the MIT License\n */\nfunction round(v) {\n return v + 0.5 | 0;\n}\nconst lim = (v, l, h) => Math.max(Math.min(v, h), l);\nfunction p2b(v) {\n return lim(round(v * 2.55), 0, 255);\n}\nfunction b2p(v) {\n return lim(round(v / 2.55), 0, 100);\n}\nfunction n2b(v) {\n return lim(round(v * 255), 0, 255);\n}\nfunction b2n(v) {\n return lim(round(v / 2.55) / 100, 0, 1);\n}\nfunction n2p(v) {\n return lim(round(v * 100), 0, 100);\n}\n\nconst map$1 = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 10, B: 11, C: 12, D: 13, E: 14, F: 15, a: 10, b: 11, c: 12, d: 13, e: 14, f: 15};\nconst hex = [...'0123456789ABCDEF'];\nconst h1 = b => hex[b & 0xF];\nconst h2 = b => hex[(b & 0xF0) >> 4] + hex[b & 0xF];\nconst eq = b => ((b & 0xF0) >> 4) === (b & 0xF);\nconst isShort = v => eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a);\nfunction hexParse(str) {\n var len = str.length;\n var ret;\n if (str[0] === '#') {\n if (len === 4 || len === 5) {\n ret = {\n r: 255 & map$1[str[1]] * 17,\n g: 255 & map$1[str[2]] * 17,\n b: 255 & map$1[str[3]] * 17,\n a: len === 5 ? map$1[str[4]] * 17 : 255\n };\n } else if (len === 7 || len === 9) {\n ret = {\n r: map$1[str[1]] << 4 | map$1[str[2]],\n g: map$1[str[3]] << 4 | map$1[str[4]],\n b: map$1[str[5]] << 4 | map$1[str[6]],\n a: len === 9 ? (map$1[str[7]] << 4 | map$1[str[8]]) : 255\n };\n }\n }\n return ret;\n}\nconst alpha = (a, f) => a < 255 ? f(a) : '';\nfunction hexString(v) {\n var f = isShort(v) ? h1 : h2;\n return v\n ? '#' + f(v.r) + f(v.g) + f(v.b) + alpha(v.a, f)\n : undefined;\n}\n\nconst HUE_RE = /^(hsla?|hwb|hsv)\\(\\s*([-+.e\\d]+)(?:deg)?[\\s,]+([-+.e\\d]+)%[\\s,]+([-+.e\\d]+)%(?:[\\s,]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction hsl2rgbn(h, s, l) {\n const a = s * Math.min(l, 1 - l);\n const f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return [f(0), f(8), f(4)];\n}\nfunction hsv2rgbn(h, s, v) {\n const f = (n, k = (n + h / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);\n return [f(5), f(3), f(1)];\n}\nfunction hwb2rgbn(h, w, b) {\n const rgb = hsl2rgbn(h, 1, 0.5);\n let i;\n if (w + b > 1) {\n i = 1 / (w + b);\n w *= i;\n b *= i;\n }\n for (i = 0; i < 3; i++) {\n rgb[i] *= 1 - w - b;\n rgb[i] += w;\n }\n return rgb;\n}\nfunction hueValue(r, g, b, d, max) {\n if (r === max) {\n return ((g - b) / d) + (g < b ? 6 : 0);\n }\n if (g === max) {\n return (b - r) / d + 2;\n }\n return (r - g) / d + 4;\n}\nfunction rgb2hsl(v) {\n const range = 255;\n const r = v.r / range;\n const g = v.g / range;\n const b = v.b / range;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n let h, s, d;\n if (max !== min) {\n d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n h = hueValue(r, g, b, d, max);\n h = h * 60 + 0.5;\n }\n return [h | 0, s || 0, l];\n}\nfunction calln(f, a, b, c) {\n return (\n Array.isArray(a)\n ? f(a[0], a[1], a[2])\n : f(a, b, c)\n ).map(n2b);\n}\nfunction hsl2rgb(h, s, l) {\n return calln(hsl2rgbn, h, s, l);\n}\nfunction hwb2rgb(h, w, b) {\n return calln(hwb2rgbn, h, w, b);\n}\nfunction hsv2rgb(h, s, v) {\n return calln(hsv2rgbn, h, s, v);\n}\nfunction hue(h) {\n return (h % 360 + 360) % 360;\n}\nfunction hueParse(str) {\n const m = HUE_RE.exec(str);\n let a = 255;\n let v;\n if (!m) {\n return;\n }\n if (m[5] !== v) {\n a = m[6] ? p2b(+m[5]) : n2b(+m[5]);\n }\n const h = hue(+m[2]);\n const p1 = +m[3] / 100;\n const p2 = +m[4] / 100;\n if (m[1] === 'hwb') {\n v = hwb2rgb(h, p1, p2);\n } else if (m[1] === 'hsv') {\n v = hsv2rgb(h, p1, p2);\n } else {\n v = hsl2rgb(h, p1, p2);\n }\n return {\n r: v[0],\n g: v[1],\n b: v[2],\n a: a\n };\n}\nfunction rotate(v, deg) {\n var h = rgb2hsl(v);\n h[0] = hue(h[0] + deg);\n h = hsl2rgb(h);\n v.r = h[0];\n v.g = h[1];\n v.b = h[2];\n}\nfunction hslString(v) {\n if (!v) {\n return;\n }\n const a = rgb2hsl(v);\n const h = a[0];\n const s = n2p(a[1]);\n const l = n2p(a[2]);\n return v.a < 255\n ? `hsla(${h}, ${s}%, ${l}%, ${b2n(v.a)})`\n : `hsl(${h}, ${s}%, ${l}%)`;\n}\n\nconst map = {\n\tx: 'dark',\n\tZ: 'light',\n\tY: 're',\n\tX: 'blu',\n\tW: 'gr',\n\tV: 'medium',\n\tU: 'slate',\n\tA: 'ee',\n\tT: 'ol',\n\tS: 'or',\n\tB: 'ra',\n\tC: 'lateg',\n\tD: 'ights',\n\tR: 'in',\n\tQ: 'turquois',\n\tE: 'hi',\n\tP: 'ro',\n\tO: 'al',\n\tN: 'le',\n\tM: 'de',\n\tL: 'yello',\n\tF: 'en',\n\tK: 'ch',\n\tG: 'arks',\n\tH: 'ea',\n\tI: 'ightg',\n\tJ: 'wh'\n};\nconst names$1 = {\n\tOiceXe: 'f0f8ff',\n\tantiquewEte: 'faebd7',\n\taqua: 'ffff',\n\taquamarRe: '7fffd4',\n\tazuY: 'f0ffff',\n\tbeige: 'f5f5dc',\n\tbisque: 'ffe4c4',\n\tblack: '0',\n\tblanKedOmond: 'ffebcd',\n\tXe: 'ff',\n\tXeviTet: '8a2be2',\n\tbPwn: 'a52a2a',\n\tburlywood: 'deb887',\n\tcaMtXe: '5f9ea0',\n\tKartYuse: '7fff00',\n\tKocTate: 'd2691e',\n\tcSO: 'ff7f50',\n\tcSnflowerXe: '6495ed',\n\tcSnsilk: 'fff8dc',\n\tcrimson: 'dc143c',\n\tcyan: 'ffff',\n\txXe: '8b',\n\txcyan: '8b8b',\n\txgTMnPd: 'b8860b',\n\txWay: 'a9a9a9',\n\txgYF: '6400',\n\txgYy: 'a9a9a9',\n\txkhaki: 'bdb76b',\n\txmagFta: '8b008b',\n\txTivegYF: '556b2f',\n\txSange: 'ff8c00',\n\txScEd: '9932cc',\n\txYd: '8b0000',\n\txsOmon: 'e9967a',\n\txsHgYF: '8fbc8f',\n\txUXe: '483d8b',\n\txUWay: '2f4f4f',\n\txUgYy: '2f4f4f',\n\txQe: 'ced1',\n\txviTet: '9400d3',\n\tdAppRk: 'ff1493',\n\tdApskyXe: 'bfff',\n\tdimWay: '696969',\n\tdimgYy: '696969',\n\tdodgerXe: '1e90ff',\n\tfiYbrick: 'b22222',\n\tflSOwEte: 'fffaf0',\n\tfoYstWAn: '228b22',\n\tfuKsia: 'ff00ff',\n\tgaRsbSo: 'dcdcdc',\n\tghostwEte: 'f8f8ff',\n\tgTd: 'ffd700',\n\tgTMnPd: 'daa520',\n\tWay: '808080',\n\tgYF: '8000',\n\tgYFLw: 'adff2f',\n\tgYy: '808080',\n\thoneyMw: 'f0fff0',\n\thotpRk: 'ff69b4',\n\tRdianYd: 'cd5c5c',\n\tRdigo: '4b0082',\n\tivSy: 'fffff0',\n\tkhaki: 'f0e68c',\n\tlavFMr: 'e6e6fa',\n\tlavFMrXsh: 'fff0f5',\n\tlawngYF: '7cfc00',\n\tNmoncEffon: 'fffacd',\n\tZXe: 'add8e6',\n\tZcSO: 'f08080',\n\tZcyan: 'e0ffff',\n\tZgTMnPdLw: 'fafad2',\n\tZWay: 'd3d3d3',\n\tZgYF: '90ee90',\n\tZgYy: 'd3d3d3',\n\tZpRk: 'ffb6c1',\n\tZsOmon: 'ffa07a',\n\tZsHgYF: '20b2aa',\n\tZskyXe: '87cefa',\n\tZUWay: '778899',\n\tZUgYy: '778899',\n\tZstAlXe: 'b0c4de',\n\tZLw: 'ffffe0',\n\tlime: 'ff00',\n\tlimegYF: '32cd32',\n\tlRF: 'faf0e6',\n\tmagFta: 'ff00ff',\n\tmaPon: '800000',\n\tVaquamarRe: '66cdaa',\n\tVXe: 'cd',\n\tVScEd: 'ba55d3',\n\tVpurpN: '9370db',\n\tVsHgYF: '3cb371',\n\tVUXe: '7b68ee',\n\tVsprRggYF: 'fa9a',\n\tVQe: '48d1cc',\n\tVviTetYd: 'c71585',\n\tmidnightXe: '191970',\n\tmRtcYam: 'f5fffa',\n\tmistyPse: 'ffe4e1',\n\tmoccasR: 'ffe4b5',\n\tnavajowEte: 'ffdead',\n\tnavy: '80',\n\tTdlace: 'fdf5e6',\n\tTive: '808000',\n\tTivedBb: '6b8e23',\n\tSange: 'ffa500',\n\tSangeYd: 'ff4500',\n\tScEd: 'da70d6',\n\tpOegTMnPd: 'eee8aa',\n\tpOegYF: '98fb98',\n\tpOeQe: 'afeeee',\n\tpOeviTetYd: 'db7093',\n\tpapayawEp: 'ffefd5',\n\tpHKpuff: 'ffdab9',\n\tperu: 'cd853f',\n\tpRk: 'ffc0cb',\n\tplum: 'dda0dd',\n\tpowMrXe: 'b0e0e6',\n\tpurpN: '800080',\n\tYbeccapurpN: '663399',\n\tYd: 'ff0000',\n\tPsybrown: 'bc8f8f',\n\tPyOXe: '4169e1',\n\tsaddNbPwn: '8b4513',\n\tsOmon: 'fa8072',\n\tsandybPwn: 'f4a460',\n\tsHgYF: '2e8b57',\n\tsHshell: 'fff5ee',\n\tsiFna: 'a0522d',\n\tsilver: 'c0c0c0',\n\tskyXe: '87ceeb',\n\tUXe: '6a5acd',\n\tUWay: '708090',\n\tUgYy: '708090',\n\tsnow: 'fffafa',\n\tsprRggYF: 'ff7f',\n\tstAlXe: '4682b4',\n\ttan: 'd2b48c',\n\tteO: '8080',\n\ttEstN: 'd8bfd8',\n\ttomato: 'ff6347',\n\tQe: '40e0d0',\n\tviTet: 'ee82ee',\n\tJHt: 'f5deb3',\n\twEte: 'ffffff',\n\twEtesmoke: 'f5f5f5',\n\tLw: 'ffff00',\n\tLwgYF: '9acd32'\n};\nfunction unpack() {\n const unpacked = {};\n const keys = Object.keys(names$1);\n const tkeys = Object.keys(map);\n let i, j, k, ok, nk;\n for (i = 0; i < keys.length; i++) {\n ok = nk = keys[i];\n for (j = 0; j < tkeys.length; j++) {\n k = tkeys[j];\n nk = nk.replace(k, map[k]);\n }\n k = parseInt(names$1[ok], 16);\n unpacked[nk] = [k >> 16 & 0xFF, k >> 8 & 0xFF, k & 0xFF];\n }\n return unpacked;\n}\n\nlet names;\nfunction nameParse(str) {\n if (!names) {\n names = unpack();\n names.transparent = [0, 0, 0, 0];\n }\n const a = names[str.toLowerCase()];\n return a && {\n r: a[0],\n g: a[1],\n b: a[2],\n a: a.length === 4 ? a[3] : 255\n };\n}\n\nconst RGB_RE = /^rgba?\\(\\s*([-+.\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?(?:[\\s,/]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction rgbParse(str) {\n const m = RGB_RE.exec(str);\n let a = 255;\n let r, g, b;\n if (!m) {\n return;\n }\n if (m[7] !== r) {\n const v = +m[7];\n a = m[8] ? p2b(v) : lim(v * 255, 0, 255);\n }\n r = +m[1];\n g = +m[3];\n b = +m[5];\n r = 255 & (m[2] ? p2b(r) : lim(r, 0, 255));\n g = 255 & (m[4] ? p2b(g) : lim(g, 0, 255));\n b = 255 & (m[6] ? p2b(b) : lim(b, 0, 255));\n return {\n r: r,\n g: g,\n b: b,\n a: a\n };\n}\nfunction rgbString(v) {\n return v && (\n v.a < 255\n ? `rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})`\n : `rgb(${v.r}, ${v.g}, ${v.b})`\n );\n}\n\nconst to = v => v <= 0.0031308 ? v * 12.92 : Math.pow(v, 1.0 / 2.4) * 1.055 - 0.055;\nconst from = v => v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\nfunction interpolate(rgb1, rgb2, t) {\n const r = from(b2n(rgb1.r));\n const g = from(b2n(rgb1.g));\n const b = from(b2n(rgb1.b));\n return {\n r: n2b(to(r + t * (from(b2n(rgb2.r)) - r))),\n g: n2b(to(g + t * (from(b2n(rgb2.g)) - g))),\n b: n2b(to(b + t * (from(b2n(rgb2.b)) - b))),\n a: rgb1.a + t * (rgb2.a - rgb1.a)\n };\n}\n\nfunction modHSL(v, i, ratio) {\n if (v) {\n let tmp = rgb2hsl(v);\n tmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1));\n tmp = hsl2rgb(tmp);\n v.r = tmp[0];\n v.g = tmp[1];\n v.b = tmp[2];\n }\n}\nfunction clone(v, proto) {\n return v ? Object.assign(proto || {}, v) : v;\n}\nfunction fromObject(input) {\n var v = {r: 0, g: 0, b: 0, a: 255};\n if (Array.isArray(input)) {\n if (input.length >= 3) {\n v = {r: input[0], g: input[1], b: input[2], a: 255};\n if (input.length > 3) {\n v.a = n2b(input[3]);\n }\n }\n } else {\n v = clone(input, {r: 0, g: 0, b: 0, a: 1});\n v.a = n2b(v.a);\n }\n return v;\n}\nfunction functionParse(str) {\n if (str.charAt(0) === 'r') {\n return rgbParse(str);\n }\n return hueParse(str);\n}\nclass Color {\n constructor(input) {\n if (input instanceof Color) {\n return input;\n }\n const type = typeof input;\n let v;\n if (type === 'object') {\n v = fromObject(input);\n } else if (type === 'string') {\n v = hexParse(input) || nameParse(input) || functionParse(input);\n }\n this._rgb = v;\n this._valid = !!v;\n }\n get valid() {\n return this._valid;\n }\n get rgb() {\n var v = clone(this._rgb);\n if (v) {\n v.a = b2n(v.a);\n }\n return v;\n }\n set rgb(obj) {\n this._rgb = fromObject(obj);\n }\n rgbString() {\n return this._valid ? rgbString(this._rgb) : undefined;\n }\n hexString() {\n return this._valid ? hexString(this._rgb) : undefined;\n }\n hslString() {\n return this._valid ? hslString(this._rgb) : undefined;\n }\n mix(color, weight) {\n if (color) {\n const c1 = this.rgb;\n const c2 = color.rgb;\n let w2;\n const p = weight === w2 ? 0.5 : weight;\n const w = 2 * p - 1;\n const a = c1.a - c2.a;\n const w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n w2 = 1 - w1;\n c1.r = 0xFF & w1 * c1.r + w2 * c2.r + 0.5;\n c1.g = 0xFF & w1 * c1.g + w2 * c2.g + 0.5;\n c1.b = 0xFF & w1 * c1.b + w2 * c2.b + 0.5;\n c1.a = p * c1.a + (1 - p) * c2.a;\n this.rgb = c1;\n }\n return this;\n }\n interpolate(color, t) {\n if (color) {\n this._rgb = interpolate(this._rgb, color._rgb, t);\n }\n return this;\n }\n clone() {\n return new Color(this.rgb);\n }\n alpha(a) {\n this._rgb.a = n2b(a);\n return this;\n }\n clearer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 - ratio;\n return this;\n }\n greyscale() {\n const rgb = this._rgb;\n const val = round(rgb.r * 0.3 + rgb.g * 0.59 + rgb.b * 0.11);\n rgb.r = rgb.g = rgb.b = val;\n return this;\n }\n opaquer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 + ratio;\n return this;\n }\n negate() {\n const v = this._rgb;\n v.r = 255 - v.r;\n v.g = 255 - v.g;\n v.b = 255 - v.b;\n return this;\n }\n lighten(ratio) {\n modHSL(this._rgb, 2, ratio);\n return this;\n }\n darken(ratio) {\n modHSL(this._rgb, 2, -ratio);\n return this;\n }\n saturate(ratio) {\n modHSL(this._rgb, 1, ratio);\n return this;\n }\n desaturate(ratio) {\n modHSL(this._rgb, 1, -ratio);\n return this;\n }\n rotate(deg) {\n rotate(this._rgb, deg);\n return this;\n }\n}\n\nfunction index_esm(input) {\n return new Color(input);\n}\n\nexport { Color, b2n, b2p, index_esm as default, hexParse, hexString, hsl2rgb, hslString, hsv2rgb, hueParse, hwb2rgb, lim, n2b, n2p, nameParse, p2b, rgb2hsl, rgbParse, rgbString, rotate, round };\n","/**\n * @namespace Chart.helpers\n */\n\nimport type {AnyObject} from '../types/basic.js';\nimport type {ActiveDataPoint, ChartEvent} from '../types/index.js';\n\n/**\n * An empty function that can be used, for example, for optional callback.\n */\nexport function noop() {\n /* noop */\n}\n\n/**\n * Returns a unique id, sequentially generated from a global variable.\n */\nexport const uid = (() => {\n let id = 0;\n return () => id++;\n})();\n\n/**\n * Returns true if `value` is neither null nor undefined, else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */\nexport function isNullOrUndef(value: unknown): value is null | undefined {\n return value === null || value === undefined;\n}\n\n/**\n * Returns true if `value` is an array (including typed arrays), else returns false.\n * @param value - The value to test.\n * @function\n */\nexport function isArray(value: unknown): value is T[] {\n if (Array.isArray && Array.isArray(value)) {\n return true;\n }\n const type = Object.prototype.toString.call(value);\n if (type.slice(0, 7) === '[object' && type.slice(-6) === 'Array]') {\n return true;\n }\n return false;\n}\n\n/**\n * Returns true if `value` is an object (excluding null), else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */\nexport function isObject(value: unknown): value is AnyObject {\n return value !== null && Object.prototype.toString.call(value) === '[object Object]';\n}\n\n/**\n * Returns true if `value` is a finite number, else returns false\n * @param value - The value to test.\n */\nfunction isNumberFinite(value: unknown): value is number {\n return (typeof value === 'number' || value instanceof Number) && isFinite(+value);\n}\nexport {\n isNumberFinite as isFinite,\n};\n\n/**\n * Returns `value` if finite, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is not finite.\n */\nexport function finiteOrDefault(value: unknown, defaultValue: number) {\n return isNumberFinite(value) ? value : defaultValue;\n}\n\n/**\n * Returns `value` if defined, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is undefined.\n */\nexport function valueOrDefault(value: T | undefined, defaultValue: T) {\n return typeof value === 'undefined' ? defaultValue : value;\n}\n\nexport const toPercentage = (value: number | string, dimension: number) =>\n typeof value === 'string' && value.endsWith('%') ?\n parseFloat(value) / 100\n : +value / dimension;\n\nexport const toDimension = (value: number | string, dimension: number) =>\n typeof value === 'string' && value.endsWith('%') ?\n parseFloat(value) / 100 * dimension\n : +value;\n\n/**\n * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the\n * value returned by `fn`. If `fn` is not a function, this method returns undefined.\n * @param fn - The function to call.\n * @param args - The arguments with which `fn` should be called.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n */\nexport function callback R, TA, R>(\n fn: T | undefined,\n args: unknown[],\n thisArg?: TA\n): R | undefined {\n if (fn && typeof fn.call === 'function') {\n return fn.apply(thisArg, args);\n }\n}\n\n/**\n * Note(SB) for performance sake, this method should only be used when loopable type\n * is unknown or in none intensive code (not called often and small loopable). Else\n * it's preferable to use a regular for() loop and save extra function calls.\n * @param loopable - The object or array to be iterated.\n * @param fn - The function to call for each item.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n * @param [reverse] - If true, iterates backward on the loopable.\n */\nexport function each(\n loopable: Record,\n fn: (this: TA, v: T, i: string) => void,\n thisArg?: TA,\n reverse?: boolean\n): void;\nexport function each(\n loopable: T[],\n fn: (this: TA, v: T, i: number) => void,\n thisArg?: TA,\n reverse?: boolean\n): void;\nexport function each(\n loopable: T[] | Record,\n fn: (this: TA, v: T, i: any) => void,\n thisArg?: TA,\n reverse?: boolean\n) {\n let i: number, len: number, keys: string[];\n if (isArray(loopable)) {\n len = loopable.length;\n if (reverse) {\n for (i = len - 1; i >= 0; i--) {\n fn.call(thisArg, loopable[i], i);\n }\n } else {\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[i], i);\n }\n }\n } else if (isObject(loopable)) {\n keys = Object.keys(loopable);\n len = keys.length;\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[keys[i]], keys[i]);\n }\n }\n}\n\n/**\n * Returns true if the `a0` and `a1` arrays have the same content, else returns false.\n * @param a0 - The array to compare\n * @param a1 - The array to compare\n * @private\n */\nexport function _elementsEqual(a0: ActiveDataPoint[], a1: ActiveDataPoint[]) {\n let i: number, ilen: number, v0: ActiveDataPoint, v1: ActiveDataPoint;\n\n if (!a0 || !a1 || a0.length !== a1.length) {\n return false;\n }\n\n for (i = 0, ilen = a0.length; i < ilen; ++i) {\n v0 = a0[i];\n v1 = a1[i];\n\n if (v0.datasetIndex !== v1.datasetIndex || v0.index !== v1.index) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Returns a deep copy of `source` without keeping references on objects and arrays.\n * @param source - The value to clone.\n */\nexport function clone(source: T): T {\n if (isArray(source)) {\n return source.map(clone) as unknown as T;\n }\n\n if (isObject(source)) {\n const target = Object.create(null);\n const keys = Object.keys(source);\n const klen = keys.length;\n let k = 0;\n\n for (; k < klen; ++k) {\n target[keys[k]] = clone(source[keys[k]]);\n }\n\n return target;\n }\n\n return source;\n}\n\nfunction isValidKey(key: string) {\n return ['__proto__', 'prototype', 'constructor'].indexOf(key) === -1;\n}\n\n/**\n * The default merger when Chart.helpers.merge is called without merger option.\n * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback.\n * @private\n */\nexport function _merger(key: string, target: AnyObject, source: AnyObject, options: AnyObject) {\n if (!isValidKey(key)) {\n return;\n }\n\n const tval = target[key];\n const sval = source[key];\n\n if (isObject(tval) && isObject(sval)) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n merge(tval, sval, options);\n } else {\n target[key] = clone(sval);\n }\n}\n\nexport interface MergeOptions {\n merger?: (key: string, target: AnyObject, source: AnyObject, options?: AnyObject) => void;\n}\n\n/**\n * Recursively deep copies `source` properties into `target` with the given `options`.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param target - The target object in which all sources are merged into.\n * @param source - Object(s) to merge into `target`.\n * @param [options] - Merging options:\n * @param [options.merger] - The merge method (key, target, source, options)\n * @returns The `target` object.\n */\nexport function merge(target: T, source: [], options?: MergeOptions): T;\nexport function merge(target: T, source: S1, options?: MergeOptions): T & S1;\nexport function merge(target: T, source: [S1], options?: MergeOptions): T & S1;\nexport function merge(target: T, source: [S1, S2], options?: MergeOptions): T & S1 & S2;\nexport function merge(target: T, source: [S1, S2, S3], options?: MergeOptions): T & S1 & S2 & S3;\nexport function merge(\n target: T,\n source: [S1, S2, S3, S4],\n options?: MergeOptions\n): T & S1 & S2 & S3 & S4;\nexport function merge(target: T, source: AnyObject[], options?: MergeOptions): AnyObject;\nexport function merge(target: T, source: AnyObject[], options?: MergeOptions): AnyObject {\n const sources = isArray(source) ? source : [source];\n const ilen = sources.length;\n\n if (!isObject(target)) {\n return target as AnyObject;\n }\n\n options = options || {};\n const merger = options.merger || _merger;\n let current: AnyObject;\n\n for (let i = 0; i < ilen; ++i) {\n current = sources[i];\n if (!isObject(current)) {\n continue;\n }\n\n const keys = Object.keys(current);\n for (let k = 0, klen = keys.length; k < klen; ++k) {\n merger(keys[k], target, current, options as AnyObject);\n }\n }\n\n return target;\n}\n\n/**\n * Recursively deep copies `source` properties into `target` *only* if not defined in target.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param target - The target object in which all sources are merged into.\n * @param source - Object(s) to merge into `target`.\n * @returns The `target` object.\n */\nexport function mergeIf(target: T, source: []): T;\nexport function mergeIf(target: T, source: S1): T & S1;\nexport function mergeIf(target: T, source: [S1]): T & S1;\nexport function mergeIf(target: T, source: [S1, S2]): T & S1 & S2;\nexport function mergeIf(target: T, source: [S1, S2, S3]): T & S1 & S2 & S3;\nexport function mergeIf(target: T, source: [S1, S2, S3, S4]): T & S1 & S2 & S3 & S4;\nexport function mergeIf(target: T, source: AnyObject[]): AnyObject;\nexport function mergeIf(target: T, source: AnyObject[]): AnyObject {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n return merge(target, source, {merger: _mergerIf});\n}\n\n/**\n * Merges source[key] in target[key] only if target[key] is undefined.\n * @private\n */\nexport function _mergerIf(key: string, target: AnyObject, source: AnyObject) {\n if (!isValidKey(key)) {\n return;\n }\n\n const tval = target[key];\n const sval = source[key];\n\n if (isObject(tval) && isObject(sval)) {\n mergeIf(tval, sval);\n } else if (!Object.prototype.hasOwnProperty.call(target, key)) {\n target[key] = clone(sval);\n }\n}\n\n/**\n * @private\n */\nexport function _deprecated(scope: string, value: unknown, previous: string, current: string) {\n if (value !== undefined) {\n console.warn(scope + ': \"' + previous +\n '\" is deprecated. Please use \"' + current + '\" instead');\n }\n}\n\n// resolveObjectKey resolver cache\nconst keyResolvers = {\n // Chart.helpers.core resolveObjectKey should resolve empty key to root object\n '': v => v,\n // default resolvers\n x: o => o.x,\n y: o => o.y\n};\n\n/**\n * @private\n */\nexport function _splitKey(key: string) {\n const parts = key.split('.');\n const keys: string[] = [];\n let tmp = '';\n for (const part of parts) {\n tmp += part;\n if (tmp.endsWith('\\\\')) {\n tmp = tmp.slice(0, -1) + '.';\n } else {\n keys.push(tmp);\n tmp = '';\n }\n }\n return keys;\n}\n\nfunction _getKeyResolver(key: string) {\n const keys = _splitKey(key);\n return obj => {\n for (const k of keys) {\n if (k === '') {\n // For backward compatibility:\n // Chart.helpers.core resolveObjectKey should break at empty key\n break;\n }\n obj = obj && obj[k];\n }\n return obj;\n };\n}\n\nexport function resolveObjectKey(obj: AnyObject, key: string): any {\n const resolver = keyResolvers[key] || (keyResolvers[key] = _getKeyResolver(key));\n return resolver(obj);\n}\n\n/**\n * @private\n */\nexport function _capitalize(str: string) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n\nexport const defined = (value: unknown) => typeof value !== 'undefined';\n\nexport const isFunction = (value: unknown): value is (...args: any[]) => any => typeof value === 'function';\n\n// Adapted from https://stackoverflow.com/questions/31128855/comparing-ecma6-sets-for-equality#31129384\nexport const setsEqual = (a: Set, b: Set) => {\n if (a.size !== b.size) {\n return false;\n }\n\n for (const item of a) {\n if (!b.has(item)) {\n return false;\n }\n }\n\n return true;\n};\n\n/**\n * @param e - The event\n * @private\n */\nexport function _isClickEvent(e: ChartEvent) {\n return e.type === 'mouseup' || e.type === 'click' || e.type === 'contextmenu';\n}\n","import type {Point} from '../types/geometric.js';\nimport {isFinite as isFiniteNumber} from './helpers.core.js';\n\n/**\n * @alias Chart.helpers.math\n * @namespace\n */\n\nexport const PI = Math.PI;\nexport const TAU = 2 * PI;\nexport const PITAU = TAU + PI;\nexport const INFINITY = Number.POSITIVE_INFINITY;\nexport const RAD_PER_DEG = PI / 180;\nexport const HALF_PI = PI / 2;\nexport const QUARTER_PI = PI / 4;\nexport const TWO_THIRDS_PI = PI * 2 / 3;\n\nexport const log10 = Math.log10;\nexport const sign = Math.sign;\n\nexport function almostEquals(x: number, y: number, epsilon: number) {\n return Math.abs(x - y) < epsilon;\n}\n\n/**\n * Implementation of the nice number algorithm used in determining where axis labels will go\n */\nexport function niceNum(range: number) {\n const roundedRange = Math.round(range);\n range = almostEquals(range, roundedRange, range / 1000) ? roundedRange : range;\n const niceRange = Math.pow(10, Math.floor(log10(range)));\n const fraction = range / niceRange;\n const niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10;\n return niceFraction * niceRange;\n}\n\n/**\n * Returns an array of factors sorted from 1 to sqrt(value)\n * @private\n */\nexport function _factorize(value: number) {\n const result: number[] = [];\n const sqrt = Math.sqrt(value);\n let i: number;\n\n for (i = 1; i < sqrt; i++) {\n if (value % i === 0) {\n result.push(i);\n result.push(value / i);\n }\n }\n if (sqrt === (sqrt | 0)) { // if value is a square number\n result.push(sqrt);\n }\n\n result.sort((a, b) => a - b).pop();\n return result;\n}\n\n/**\n * Verifies that attempting to coerce n to string or number won't throw a TypeError.\n */\nfunction isNonPrimitive(n: unknown) {\n return typeof n === 'symbol' || (typeof n === 'object' && n !== null && !(Symbol.toPrimitive in n || 'toString' in n || 'valueOf' in n));\n}\n\nexport function isNumber(n: unknown): n is number {\n return !isNonPrimitive(n) && !isNaN(parseFloat(n as string)) && isFinite(n as number);\n}\n\nexport function almostWhole(x: number, epsilon: number) {\n const rounded = Math.round(x);\n return ((rounded - epsilon) <= x) && ((rounded + epsilon) >= x);\n}\n\n/**\n * @private\n */\nexport function _setMinAndMaxByKey(\n array: Record[],\n target: { min: number, max: number },\n property: string\n) {\n let i: number, ilen: number, value: number;\n\n for (i = 0, ilen = array.length; i < ilen; i++) {\n value = array[i][property];\n if (!isNaN(value)) {\n target.min = Math.min(target.min, value);\n target.max = Math.max(target.max, value);\n }\n }\n}\n\nexport function toRadians(degrees: number) {\n return degrees * (PI / 180);\n}\n\nexport function toDegrees(radians: number) {\n return radians * (180 / PI);\n}\n\n/**\n * Returns the number of decimal places\n * i.e. the number of digits after the decimal point, of the value of this Number.\n * @param x - A number.\n * @returns The number of decimal places.\n * @private\n */\nexport function _decimalPlaces(x: number) {\n if (!isFiniteNumber(x)) {\n return;\n }\n let e = 1;\n let p = 0;\n while (Math.round(x * e) / e !== x) {\n e *= 10;\n p++;\n }\n return p;\n}\n\n// Gets the angle from vertical upright to the point about a centre.\nexport function getAngleFromPoint(\n centrePoint: Point,\n anglePoint: Point\n) {\n const distanceFromXCenter = anglePoint.x - centrePoint.x;\n const distanceFromYCenter = anglePoint.y - centrePoint.y;\n const radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n\n let angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n\n if (angle < (-0.5 * PI)) {\n angle += TAU; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n }\n\n return {\n angle,\n distance: radialDistanceFromCenter\n };\n}\n\nexport function distanceBetweenPoints(pt1: Point, pt2: Point) {\n return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n}\n\n/**\n * Shortest distance between angles, in either direction.\n * @private\n */\nexport function _angleDiff(a: number, b: number) {\n return (a - b + PITAU) % TAU - PI;\n}\n\n/**\n * Normalize angle to be between 0 and 2*PI\n * @private\n */\nexport function _normalizeAngle(a: number) {\n return (a % TAU + TAU) % TAU;\n}\n\n/**\n * @private\n */\nexport function _angleBetween(angle: number, start: number, end: number, sameAngleIsFullCircle?: boolean) {\n const a = _normalizeAngle(angle);\n const s = _normalizeAngle(start);\n const e = _normalizeAngle(end);\n const angleToStart = _normalizeAngle(s - a);\n const angleToEnd = _normalizeAngle(e - a);\n const startToAngle = _normalizeAngle(a - s);\n const endToAngle = _normalizeAngle(a - e);\n return a === s || a === e || (sameAngleIsFullCircle && s === e)\n || (angleToStart > angleToEnd && startToAngle < endToAngle);\n}\n\n/**\n * Limit `value` between `min` and `max`\n * @param value\n * @param min\n * @param max\n * @private\n */\nexport function _limitValue(value: number, min: number, max: number) {\n return Math.max(min, Math.min(max, value));\n}\n\n/**\n * @param {number} value\n * @private\n */\nexport function _int16Range(value: number) {\n return _limitValue(value, -32768, 32767);\n}\n\n/**\n * @param value\n * @param start\n * @param end\n * @param [epsilon]\n * @private\n */\nexport function _isBetween(value: number, start: number, end: number, epsilon = 1e-6) {\n return value >= Math.min(start, end) - epsilon && value <= Math.max(start, end) + epsilon;\n}\n","import {_capitalize} from './helpers.core.js';\n\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param value - value to find\n * @param cmp\n * @private\n */\nexport function _lookup(\n table: number[],\n value: number,\n cmp?: (value: number) => boolean\n): {lo: number, hi: number};\nexport function _lookup(\n table: T[],\n value: number,\n cmp: (value: number) => boolean\n): {lo: number, hi: number};\nexport function _lookup(\n table: unknown[],\n value: number,\n cmp?: (value: number) => boolean\n) {\n cmp = cmp || ((index) => table[index] < value);\n let hi = table.length - 1;\n let lo = 0;\n let mid: number;\n\n while (hi - lo > 1) {\n mid = (lo + hi) >> 1;\n if (cmp(mid)) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n\n return {lo, hi};\n}\n\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @param last - lookup last index\n * @private\n */\nexport const _lookupByKey = (\n table: Record[],\n key: string,\n value: number,\n last?: boolean\n) =>\n _lookup(table, value, last\n ? index => {\n const ti = table[index][key];\n return ti < value || ti === value && table[index + 1][key] === value;\n }\n : index => table[index][key] < value);\n\n/**\n * Reverse binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @private\n */\nexport const _rlookupByKey = (\n table: Record[],\n key: string,\n value: number\n) =>\n _lookup(table, value, index => table[index][key] >= value);\n\n/**\n * Return subset of `values` between `min` and `max` inclusive.\n * Values are assumed to be in sorted order.\n * @param values - sorted array of values\n * @param min - min value\n * @param max - max value\n */\nexport function _filterBetween(values: number[], min: number, max: number) {\n let start = 0;\n let end = values.length;\n\n while (start < end && values[start] < min) {\n start++;\n }\n while (end > start && values[end - 1] > max) {\n end--;\n }\n\n return start > 0 || end < values.length\n ? values.slice(start, end)\n : values;\n}\n\nconst arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'] as const;\n\nexport interface ArrayListener {\n _onDataPush?(...item: T[]): void;\n _onDataPop?(): void;\n _onDataShift?(): void;\n _onDataSplice?(index: number, deleteCount: number, ...items: T[]): void;\n _onDataUnshift?(...item: T[]): void;\n}\n\n/**\n * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice',\n * 'unshift') and notify the listener AFTER the array has been altered. Listeners are\n * called on the '_onData*' callbacks (e.g. _onDataPush, etc.) with same arguments.\n */\nexport function listenArrayEvents(array: T[], listener: ArrayListener): void;\nexport function listenArrayEvents(array, listener) {\n if (array._chartjs) {\n array._chartjs.listeners.push(listener);\n return;\n }\n\n Object.defineProperty(array, '_chartjs', {\n configurable: true,\n enumerable: false,\n value: {\n listeners: [listener]\n }\n });\n\n arrayEvents.forEach((key) => {\n const method = '_onData' + _capitalize(key);\n const base = array[key];\n\n Object.defineProperty(array, key, {\n configurable: true,\n enumerable: false,\n value(...args) {\n const res = base.apply(this, args);\n\n array._chartjs.listeners.forEach((object) => {\n if (typeof object[method] === 'function') {\n object[method](...args);\n }\n });\n\n return res;\n }\n });\n });\n}\n\n\n/**\n * Removes the given array event listener and cleanup extra attached properties (such as\n * the _chartjs stub and overridden methods) if array doesn't have any more listeners.\n */\nexport function unlistenArrayEvents(array: T[], listener: ArrayListener): void;\nexport function unlistenArrayEvents(array, listener) {\n const stub = array._chartjs;\n if (!stub) {\n return;\n }\n\n const listeners = stub.listeners;\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n\n if (listeners.length > 0) {\n return;\n }\n\n arrayEvents.forEach((key) => {\n delete array[key];\n });\n\n delete array._chartjs;\n}\n\n/**\n * @param items\n */\nexport function _arrayUnique(items: T[]) {\n const set = new Set(items);\n\n if (set.size === items.length) {\n return items;\n }\n\n return Array.from(set);\n}\n","import type {ChartMeta, PointElement} from '../types/index.js';\n\nimport {_limitValue} from './helpers.math.js';\nimport {_lookupByKey} from './helpers.collection.js';\nimport {isNullOrUndef} from './helpers.core.js';\n\nexport function fontString(pixelSize: number, fontStyle: string, fontFamily: string) {\n return fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n}\n\n/**\n* Request animation polyfill\n*/\nexport const requestAnimFrame = (function() {\n if (typeof window === 'undefined') {\n return function(callback) {\n return callback();\n };\n }\n return window.requestAnimationFrame;\n}());\n\n/**\n * Throttles calling `fn` once per animation frame\n * Latest arguments are used on the actual call\n */\nexport function throttled>(\n fn: (...args: TArgs) => void,\n thisArg: any,\n) {\n let argsToUse = [] as TArgs;\n let ticking = false;\n\n return function(...args: TArgs) {\n // Save the args for use later\n argsToUse = args;\n if (!ticking) {\n ticking = true;\n requestAnimFrame.call(window, () => {\n ticking = false;\n fn.apply(thisArg, argsToUse);\n });\n }\n };\n}\n\n/**\n * Debounces calling `fn` for `delay` ms\n */\nexport function debounce>(fn: (...args: TArgs) => void, delay: number) {\n let timeout;\n return function(...args: TArgs) {\n if (delay) {\n clearTimeout(timeout);\n timeout = setTimeout(fn, delay, args);\n } else {\n fn.apply(this, args);\n }\n return delay;\n };\n}\n\n/**\n * Converts 'start' to 'left', 'end' to 'right' and others to 'center'\n * @private\n */\nexport const _toLeftRightCenter = (align: 'start' | 'end' | 'center') => align === 'start' ? 'left' : align === 'end' ? 'right' : 'center';\n\n/**\n * Returns `start`, `end` or `(start + end) / 2` depending on `align`. Defaults to `center`\n * @private\n */\nexport const _alignStartEnd = (align: 'start' | 'end' | 'center', start: number, end: number) => align === 'start' ? start : align === 'end' ? end : (start + end) / 2;\n\n/**\n * Returns `left`, `right` or `(left + right) / 2` depending on `align`. Defaults to `left`\n * @private\n */\nexport const _textX = (align: 'left' | 'right' | 'center', left: number, right: number, rtl: boolean) => {\n const check = rtl ? 'left' : 'right';\n return align === check ? right : align === 'center' ? (left + right) / 2 : left;\n};\n\n/**\n * Return start and count of visible points.\n * @private\n */\nexport function _getStartAndCountOfVisiblePoints(meta: ChartMeta<'line' | 'scatter'>, points: PointElement[], animationsDisabled: boolean) {\n const pointCount = points.length;\n\n let start = 0;\n let count = pointCount;\n\n if (meta._sorted) {\n const {iScale, vScale, _parsed} = meta;\n const spanGaps = meta.dataset ? meta.dataset.options ? meta.dataset.options.spanGaps : null : null;\n const axis = iScale.axis;\n const {min, max, minDefined, maxDefined} = iScale.getUserBounds();\n\n if (minDefined) {\n start = Math.min(\n // @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, axis, min).lo,\n // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? pointCount : _lookupByKey(points, axis, iScale.getPixelForValue(min)).lo);\n if (spanGaps) {\n const distanceToDefinedLo = (_parsed\n .slice(0, start + 1)\n .reverse()\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n start -= Math.max(0, distanceToDefinedLo);\n }\n start = _limitValue(start, 0, pointCount - 1);\n }\n if (maxDefined) {\n let end = Math.max(\n // @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, iScale.axis, max, true).hi + 1,\n // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? 0 : _lookupByKey(points, axis, iScale.getPixelForValue(max), true).hi + 1);\n if (spanGaps) {\n const distanceToDefinedHi = (_parsed\n .slice(end - 1)\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n end += Math.max(0, distanceToDefinedHi);\n }\n count = _limitValue(end, start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n }\n\n return {start, count};\n}\n\n/**\n * Checks if the scale ranges have changed.\n * @param {object} meta - dataset meta.\n * @returns {boolean}\n * @private\n */\nexport function _scaleRangesChanged(meta) {\n const {xScale, yScale, _scaleRanges} = meta;\n const newRanges = {\n xmin: xScale.min,\n xmax: xScale.max,\n ymin: yScale.min,\n ymax: yScale.max\n };\n if (!_scaleRanges) {\n meta._scaleRanges = newRanges;\n return true;\n }\n const changed = _scaleRanges.xmin !== xScale.min\n\t\t|| _scaleRanges.xmax !== xScale.max\n\t\t|| _scaleRanges.ymin !== yScale.min\n\t\t|| _scaleRanges.ymax !== yScale.max;\n\n Object.assign(_scaleRanges, newRanges);\n return changed;\n}\n","import {PI, TAU, HALF_PI} from './helpers.math.js';\n\nconst atEdge = (t: number) => t === 0 || t === 1;\nconst elasticIn = (t: number, s: number, p: number) => -(Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * TAU / p));\nconst elasticOut = (t: number, s: number, p: number) => Math.pow(2, -10 * t) * Math.sin((t - s) * TAU / p) + 1;\n\n/**\n * Easing functions adapted from Robert Penner's easing equations.\n * @namespace Chart.helpers.easing.effects\n * @see http://www.robertpenner.com/easing/\n */\nconst effects = {\n linear: (t: number) => t,\n\n easeInQuad: (t: number) => t * t,\n\n easeOutQuad: (t: number) => -t * (t - 2),\n\n easeInOutQuad: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t\n : -0.5 * ((--t) * (t - 2) - 1),\n\n easeInCubic: (t: number) => t * t * t,\n\n easeOutCubic: (t: number) => (t -= 1) * t * t + 1,\n\n easeInOutCubic: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t\n : 0.5 * ((t -= 2) * t * t + 2),\n\n easeInQuart: (t: number) => t * t * t * t,\n\n easeOutQuart: (t: number) => -((t -= 1) * t * t * t - 1),\n\n easeInOutQuart: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t * t\n : -0.5 * ((t -= 2) * t * t * t - 2),\n\n easeInQuint: (t: number) => t * t * t * t * t,\n\n easeOutQuint: (t: number) => (t -= 1) * t * t * t * t + 1,\n\n easeInOutQuint: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t * t * t\n : 0.5 * ((t -= 2) * t * t * t * t + 2),\n\n easeInSine: (t: number) => -Math.cos(t * HALF_PI) + 1,\n\n easeOutSine: (t: number) => Math.sin(t * HALF_PI),\n\n easeInOutSine: (t: number) => -0.5 * (Math.cos(PI * t) - 1),\n\n easeInExpo: (t: number) => (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)),\n\n easeOutExpo: (t: number) => (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1,\n\n easeInOutExpo: (t: number) => atEdge(t) ? t : t < 0.5\n ? 0.5 * Math.pow(2, 10 * (t * 2 - 1))\n : 0.5 * (-Math.pow(2, -10 * (t * 2 - 1)) + 2),\n\n easeInCirc: (t: number) => (t >= 1) ? t : -(Math.sqrt(1 - t * t) - 1),\n\n easeOutCirc: (t: number) => Math.sqrt(1 - (t -= 1) * t),\n\n easeInOutCirc: (t: number) => ((t /= 0.5) < 1)\n ? -0.5 * (Math.sqrt(1 - t * t) - 1)\n : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1),\n\n easeInElastic: (t: number) => atEdge(t) ? t : elasticIn(t, 0.075, 0.3),\n\n easeOutElastic: (t: number) => atEdge(t) ? t : elasticOut(t, 0.075, 0.3),\n\n easeInOutElastic(t: number) {\n const s = 0.1125;\n const p = 0.45;\n return atEdge(t) ? t :\n t < 0.5\n ? 0.5 * elasticIn(t * 2, s, p)\n : 0.5 + 0.5 * elasticOut(t * 2 - 1, s, p);\n },\n\n easeInBack(t: number) {\n const s = 1.70158;\n return t * t * ((s + 1) * t - s);\n },\n\n easeOutBack(t: number) {\n const s = 1.70158;\n return (t -= 1) * t * ((s + 1) * t + s) + 1;\n },\n\n easeInOutBack(t: number) {\n let s = 1.70158;\n if ((t /= 0.5) < 1) {\n return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s));\n }\n return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);\n },\n\n easeInBounce: (t: number) => 1 - effects.easeOutBounce(1 - t),\n\n easeOutBounce(t: number) {\n const m = 7.5625;\n const d = 2.75;\n if (t < (1 / d)) {\n return m * t * t;\n }\n if (t < (2 / d)) {\n return m * (t -= (1.5 / d)) * t + 0.75;\n }\n if (t < (2.5 / d)) {\n return m * (t -= (2.25 / d)) * t + 0.9375;\n }\n return m * (t -= (2.625 / d)) * t + 0.984375;\n },\n\n easeInOutBounce: (t: number) => (t < 0.5)\n ? effects.easeInBounce(t * 2) * 0.5\n : effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5,\n} as const;\n\nexport type EasingFunction = keyof typeof effects\n\nexport default effects;\n","import {Color} from '@kurkle/color';\n\nexport function isPatternOrGradient(value: unknown): value is CanvasPattern | CanvasGradient {\n if (value && typeof value === 'object') {\n const type = value.toString();\n return type === '[object CanvasPattern]' || type === '[object CanvasGradient]';\n }\n\n return false;\n}\n\nexport function color(value: CanvasGradient): CanvasGradient;\nexport function color(value: CanvasPattern): CanvasPattern;\nexport function color(\n value:\n | string\n | { r: number; g: number; b: number; a: number }\n | [number, number, number]\n | [number, number, number, number]\n): Color;\nexport function color(value) {\n return isPatternOrGradient(value) ? value : new Color(value);\n}\n\nexport function getHoverColor(value: CanvasGradient): CanvasGradient;\nexport function getHoverColor(value: CanvasPattern): CanvasPattern;\nexport function getHoverColor(value: string): string;\nexport function getHoverColor(value) {\n return isPatternOrGradient(value)\n ? value\n : new Color(value).saturate(0.5).darken(0.1).hexString();\n}\n","const numbers = ['x', 'y', 'borderWidth', 'radius', 'tension'];\nconst colors = ['color', 'borderColor', 'backgroundColor'];\n\nexport function applyAnimationsDefaults(defaults) {\n defaults.set('animation', {\n delay: undefined,\n duration: 1000,\n easing: 'easeOutQuart',\n fn: undefined,\n from: undefined,\n loop: undefined,\n to: undefined,\n type: undefined,\n });\n\n defaults.describe('animation', {\n _fallback: false,\n _indexable: false,\n _scriptable: (name) => name !== 'onProgress' && name !== 'onComplete' && name !== 'fn',\n });\n\n defaults.set('animations', {\n colors: {\n type: 'color',\n properties: colors\n },\n numbers: {\n type: 'number',\n properties: numbers\n },\n });\n\n defaults.describe('animations', {\n _fallback: 'animation',\n });\n\n defaults.set('transitions', {\n active: {\n animation: {\n duration: 400\n }\n },\n resize: {\n animation: {\n duration: 0\n }\n },\n show: {\n animations: {\n colors: {\n from: 'transparent'\n },\n visible: {\n type: 'boolean',\n duration: 0 // show immediately\n },\n }\n },\n hide: {\n animations: {\n colors: {\n to: 'transparent'\n },\n visible: {\n type: 'boolean',\n easing: 'linear',\n fn: v => v | 0 // for keeping the dataset visible all the way through the animation\n },\n }\n }\n });\n}\n","export function applyLayoutsDefaults(defaults) {\n defaults.set('layout', {\n autoPadding: true,\n padding: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n }\n });\n}\n","\nconst intlCache = new Map();\n\nfunction getNumberFormat(locale: string, options?: Intl.NumberFormatOptions) {\n options = options || {};\n const cacheKey = locale + JSON.stringify(options);\n let formatter = intlCache.get(cacheKey);\n if (!formatter) {\n formatter = new Intl.NumberFormat(locale, options);\n intlCache.set(cacheKey, formatter);\n }\n return formatter;\n}\n\nexport function formatNumber(num: number, locale: string, options?: Intl.NumberFormatOptions) {\n return getNumberFormat(locale, options).format(num);\n}\n","import {isArray} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {log10} from '../helpers/helpers.math.js';\n\n/**\n * Namespace to hold formatters for different types of ticks\n * @namespace Chart.Ticks.formatters\n */\nconst formatters = {\n /**\n * Formatter for value labels\n * @method Chart.Ticks.formatters.values\n * @param value the value to display\n * @return {string|string[]} the label to display\n */\n values(value) {\n return isArray(value) ? /** @type {string[]} */ (value) : '' + value;\n },\n\n /**\n * Formatter for numeric ticks\n * @method Chart.Ticks.formatters.numeric\n * @param tickValue {number} the value to be formatted\n * @param index {number} the position of the tickValue parameter in the ticks array\n * @param ticks {object[]} the list of ticks being converted\n * @return {string} string representation of the tickValue parameter\n */\n numeric(tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0'; // never show decimal places for 0\n }\n\n const locale = this.chart.options.locale;\n let notation;\n let delta = tickValue; // This is used when there are less than 2 ticks as the tick interval.\n\n if (ticks.length > 1) {\n // all ticks are small or there huge numbers; use scientific notation\n const maxTick = Math.max(Math.abs(ticks[0].value), Math.abs(ticks[ticks.length - 1].value));\n if (maxTick < 1e-4 || maxTick > 1e+15) {\n notation = 'scientific';\n }\n\n delta = calculateDelta(tickValue, ticks);\n }\n\n const logDelta = log10(Math.abs(delta));\n\n // When datasets have values approaching Number.MAX_VALUE, the tick calculations might result in\n // infinity and eventually NaN. Passing NaN for minimumFractionDigits or maximumFractionDigits\n // will make the number formatter throw. So instead we check for isNaN and use a fallback value.\n //\n // toFixed has a max of 20 decimal places\n const numDecimal = isNaN(logDelta) ? 1 : Math.max(Math.min(-1 * Math.floor(logDelta), 20), 0);\n\n const options = {notation, minimumFractionDigits: numDecimal, maximumFractionDigits: numDecimal};\n Object.assign(options, this.options.ticks.format);\n\n return formatNumber(tickValue, locale, options);\n },\n\n\n /**\n * Formatter for logarithmic ticks\n * @method Chart.Ticks.formatters.logarithmic\n * @param tickValue {number} the value to be formatted\n * @param index {number} the position of the tickValue parameter in the ticks array\n * @param ticks {object[]} the list of ticks being converted\n * @return {string} string representation of the tickValue parameter\n */\n logarithmic(tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0';\n }\n const remain = ticks[index].significand || (tickValue / (Math.pow(10, Math.floor(log10(tickValue)))));\n if ([1, 2, 3, 5, 10, 15].includes(remain) || index > 0.8 * ticks.length) {\n return formatters.numeric.call(this, tickValue, index, ticks);\n }\n return '';\n }\n\n};\n\n\nfunction calculateDelta(tickValue, ticks) {\n // Figure out how many digits to show\n // The space between the first two ticks might be smaller than normal spacing\n let delta = ticks.length > 3 ? ticks[2].value - ticks[1].value : ticks[1].value - ticks[0].value;\n\n // If we have a number like 2.5 as the delta, figure out how many decimal places we need\n if (Math.abs(delta) >= 1 && tickValue !== Math.floor(tickValue)) {\n // not an integer\n delta = tickValue - Math.floor(tickValue);\n }\n return delta;\n}\n\n/**\n * Namespace to hold static tick generation functions\n * @namespace Chart.Ticks\n */\nexport default {formatters};\n","import Ticks from './core.ticks.js';\n\nexport function applyScaleDefaults(defaults) {\n defaults.set('scale', {\n display: true,\n offset: false,\n reverse: false,\n beginAtZero: false,\n\n /**\n * Scale boundary strategy (bypassed by min/max time options)\n * - `data`: make sure data are fully visible, ticks outside are removed\n * - `ticks`: make sure ticks are fully visible, data outside are truncated\n * @see https://github.com/chartjs/Chart.js/pull/4556\n * @since 3.0.0\n */\n bounds: 'ticks',\n\n clip: true,\n\n /**\n * Addition grace added to max and reduced from min data value.\n * @since 3.0.0\n */\n grace: 0,\n\n // grid line settings\n grid: {\n display: true,\n lineWidth: 1,\n drawOnChartArea: true,\n drawTicks: true,\n tickLength: 8,\n tickWidth: (_ctx, options) => options.lineWidth,\n tickColor: (_ctx, options) => options.color,\n offset: false,\n },\n\n border: {\n display: true,\n dash: [],\n dashOffset: 0.0,\n width: 1\n },\n\n // scale title\n title: {\n // display property\n display: false,\n\n // actual label\n text: '',\n\n // top/bottom padding\n padding: {\n top: 4,\n bottom: 4\n }\n },\n\n // label settings\n ticks: {\n minRotation: 0,\n maxRotation: 50,\n mirror: false,\n textStrokeWidth: 0,\n textStrokeColor: '',\n padding: 3,\n display: true,\n autoSkip: true,\n autoSkipPadding: 3,\n labelOffset: 0,\n // We pass through arrays to be rendered as multiline labels, we convert Others to strings here.\n callback: Ticks.formatters.values,\n minor: {},\n major: {},\n align: 'center',\n crossAlign: 'near',\n\n showLabelBackdrop: false,\n backdropColor: 'rgba(255, 255, 255, 0.75)',\n backdropPadding: 2,\n }\n });\n\n defaults.route('scale.ticks', 'color', '', 'color');\n defaults.route('scale.grid', 'color', '', 'borderColor');\n defaults.route('scale.border', 'color', '', 'borderColor');\n defaults.route('scale.title', 'color', '', 'color');\n\n defaults.describe('scale', {\n _fallback: false,\n _scriptable: (name) => !name.startsWith('before') && !name.startsWith('after') && name !== 'callback' && name !== 'parser',\n _indexable: (name) => name !== 'borderDash' && name !== 'tickBorderDash' && name !== 'dash',\n });\n\n defaults.describe('scales', {\n _fallback: 'scale',\n });\n\n defaults.describe('scale.ticks', {\n _scriptable: (name) => name !== 'backdropPadding' && name !== 'callback',\n _indexable: (name) => name !== 'backdropPadding',\n });\n}\n","import {getHoverColor} from '../helpers/helpers.color.js';\nimport {isObject, merge, valueOrDefault} from '../helpers/helpers.core.js';\nimport {applyAnimationsDefaults} from './core.animations.defaults.js';\nimport {applyLayoutsDefaults} from './core.layouts.defaults.js';\nimport {applyScaleDefaults} from './core.scale.defaults.js';\n\nexport const overrides = Object.create(null);\nexport const descriptors = Object.create(null);\n\n/**\n * @param {object} node\n * @param {string} key\n * @return {object}\n */\nfunction getScope(node, key) {\n if (!key) {\n return node;\n }\n const keys = key.split('.');\n for (let i = 0, n = keys.length; i < n; ++i) {\n const k = keys[i];\n node = node[k] || (node[k] = Object.create(null));\n }\n return node;\n}\n\nfunction set(root, scope, values) {\n if (typeof scope === 'string') {\n return merge(getScope(root, scope), values);\n }\n return merge(getScope(root, ''), scope);\n}\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is exported for typedoc\n */\nexport class Defaults {\n constructor(_descriptors, _appliers) {\n this.animation = undefined;\n this.backgroundColor = 'rgba(0,0,0,0.1)';\n this.borderColor = 'rgba(0,0,0,0.1)';\n this.color = '#666';\n this.datasets = {};\n this.devicePixelRatio = (context) => context.chart.platform.getDevicePixelRatio();\n this.elements = {};\n this.events = [\n 'mousemove',\n 'mouseout',\n 'click',\n 'touchstart',\n 'touchmove'\n ];\n this.font = {\n family: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n size: 12,\n style: 'normal',\n lineHeight: 1.2,\n weight: null\n };\n this.hover = {};\n this.hoverBackgroundColor = (ctx, options) => getHoverColor(options.backgroundColor);\n this.hoverBorderColor = (ctx, options) => getHoverColor(options.borderColor);\n this.hoverColor = (ctx, options) => getHoverColor(options.color);\n this.indexAxis = 'x';\n this.interaction = {\n mode: 'nearest',\n intersect: true,\n includeInvisible: false\n };\n this.maintainAspectRatio = true;\n this.onHover = null;\n this.onClick = null;\n this.parsing = true;\n this.plugins = {};\n this.responsive = true;\n this.scale = undefined;\n this.scales = {};\n this.showLine = true;\n this.drawActiveElementsOnTop = true;\n\n this.describe(_descriptors);\n this.apply(_appliers);\n }\n\n /**\n\t * @param {string|object} scope\n\t * @param {object} [values]\n\t */\n set(scope, values) {\n return set(this, scope, values);\n }\n\n /**\n\t * @param {string} scope\n\t */\n get(scope) {\n return getScope(this, scope);\n }\n\n /**\n\t * @param {string|object} scope\n\t * @param {object} [values]\n\t */\n describe(scope, values) {\n return set(descriptors, scope, values);\n }\n\n override(scope, values) {\n return set(overrides, scope, values);\n }\n\n /**\n\t * Routes the named defaults to fallback to another scope/name.\n\t * This routing is useful when those target values, like defaults.color, are changed runtime.\n\t * If the values would be copied, the runtime change would not take effect. By routing, the\n\t * fallback is evaluated at each access, so its always up to date.\n\t *\n\t * Example:\n\t *\n\t * \tdefaults.route('elements.arc', 'backgroundColor', '', 'color')\n\t * - reads the backgroundColor from defaults.color when undefined locally\n\t *\n\t * @param {string} scope Scope this route applies to.\n\t * @param {string} name Property name that should be routed to different namespace when not defined here.\n\t * @param {string} targetScope The namespace where those properties should be routed to.\n\t * Empty string ('') is the root of defaults.\n\t * @param {string} targetName The target name in the target scope the property should be routed to.\n\t */\n route(scope, name, targetScope, targetName) {\n const scopeObject = getScope(this, scope);\n const targetScopeObject = getScope(this, targetScope);\n const privateName = '_' + name;\n\n Object.defineProperties(scopeObject, {\n // A private property is defined to hold the actual value, when this property is set in its scope (set in the setter)\n [privateName]: {\n value: scopeObject[name],\n writable: true\n },\n // The actual property is defined as getter/setter so we can do the routing when value is not locally set.\n [name]: {\n enumerable: true,\n get() {\n const local = this[privateName];\n const target = targetScopeObject[targetName];\n if (isObject(local)) {\n return Object.assign({}, target, local);\n }\n return valueOrDefault(local, target);\n },\n set(value) {\n this[privateName] = value;\n }\n }\n });\n }\n\n apply(appliers) {\n appliers.forEach((apply) => apply(this));\n }\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Defaults({\n _scriptable: (name) => !name.startsWith('on'),\n _indexable: (name) => name !== 'events',\n hover: {\n _fallback: 'interaction'\n },\n interaction: {\n _scriptable: false,\n _indexable: false,\n }\n}, [applyAnimationsDefaults, applyLayoutsDefaults, applyScaleDefaults]);\n","import type {\n Chart,\n Point,\n FontSpec,\n CanvasFontSpec,\n PointStyle,\n RenderTextOpts,\n BackdropOptions\n} from '../types/index.js';\nimport type {\n TRBL,\n SplinePoint,\n RoundedRect,\n TRBLCorners\n} from '../types/geometric.js';\nimport {isArray, isNullOrUndef} from './helpers.core.js';\nimport {PI, TAU, HALF_PI, QUARTER_PI, TWO_THIRDS_PI, RAD_PER_DEG} from './helpers.math.js';\n\n/**\n * Converts the given font object into a CSS font string.\n * @param font - A font object.\n * @return The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font\n * @private\n */\nexport function toFontString(font: FontSpec) {\n if (!font || isNullOrUndef(font.size) || isNullOrUndef(font.family)) {\n return null;\n }\n\n return (font.style ? font.style + ' ' : '')\n\t\t+ (font.weight ? font.weight + ' ' : '')\n\t\t+ font.size + 'px '\n\t\t+ font.family;\n}\n\n/**\n * @private\n */\nexport function _measureText(\n ctx: CanvasRenderingContext2D,\n data: Record,\n gc: string[],\n longest: number,\n string: string\n) {\n let textWidth = data[string];\n if (!textWidth) {\n textWidth = data[string] = ctx.measureText(string).width;\n gc.push(string);\n }\n if (textWidth > longest) {\n longest = textWidth;\n }\n return longest;\n}\n\ntype Thing = string | undefined | null\ntype Things = (Thing | Thing[])[]\n\n/**\n * @private\n */\n// eslint-disable-next-line complexity\nexport function _longestText(\n ctx: CanvasRenderingContext2D,\n font: string,\n arrayOfThings: Things,\n cache?: {data?: Record, garbageCollect?: string[], font?: string}\n) {\n cache = cache || {};\n let data = cache.data = cache.data || {};\n let gc = cache.garbageCollect = cache.garbageCollect || [];\n\n if (cache.font !== font) {\n data = cache.data = {};\n gc = cache.garbageCollect = [];\n cache.font = font;\n }\n\n ctx.save();\n\n ctx.font = font;\n let longest = 0;\n const ilen = arrayOfThings.length;\n let i: number, j: number, jlen: number, thing: Thing | Thing[], nestedThing: Thing | Thing[];\n for (i = 0; i < ilen; i++) {\n thing = arrayOfThings[i];\n\n // Undefined strings and arrays should not be measured\n if (thing !== undefined && thing !== null && !isArray(thing)) {\n longest = _measureText(ctx, data, gc, longest, thing);\n } else if (isArray(thing)) {\n // if it is an array lets measure each element\n // to do maybe simplify this function a bit so we can do this more recursively?\n for (j = 0, jlen = thing.length; j < jlen; j++) {\n nestedThing = thing[j];\n // Undefined strings and arrays should not be measured\n if (nestedThing !== undefined && nestedThing !== null && !isArray(nestedThing)) {\n longest = _measureText(ctx, data, gc, longest, nestedThing);\n }\n }\n }\n }\n\n ctx.restore();\n\n const gcLen = gc.length / 2;\n if (gcLen > arrayOfThings.length) {\n for (i = 0; i < gcLen; i++) {\n delete data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n return longest;\n}\n\n/**\n * Returns the aligned pixel value to avoid anti-aliasing blur\n * @param chart - The chart instance.\n * @param pixel - A pixel value.\n * @param width - The width of the element.\n * @returns The aligned pixel value.\n * @private\n */\nexport function _alignPixel(chart: Chart, pixel: number, width: number) {\n const devicePixelRatio = chart.currentDevicePixelRatio;\n const halfWidth = width !== 0 ? Math.max(width / 2, 0.5) : 0;\n return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth;\n}\n\n/**\n * Clears the entire canvas.\n */\nexport function clearCanvas(canvas?: HTMLCanvasElement, ctx?: CanvasRenderingContext2D) {\n if (!ctx && !canvas) {\n return;\n }\n\n ctx = ctx || canvas.getContext('2d');\n\n ctx.save();\n // canvas.width and canvas.height do not consider the canvas transform,\n // while clearRect does\n ctx.resetTransform();\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.restore();\n}\n\nexport interface DrawPointOptions {\n pointStyle: PointStyle;\n rotation?: number;\n radius: number;\n borderWidth: number;\n}\n\nexport function drawPoint(\n ctx: CanvasRenderingContext2D,\n options: DrawPointOptions,\n x: number,\n y: number\n) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n drawPointLegend(ctx, options, x, y, null);\n}\n\n// eslint-disable-next-line complexity\nexport function drawPointLegend(\n ctx: CanvasRenderingContext2D,\n options: DrawPointOptions,\n x: number,\n y: number,\n w: number\n) {\n let type: string, xOffset: number, yOffset: number, size: number, cornerRadius: number, width: number, xOffsetW: number, yOffsetW: number;\n const style = options.pointStyle;\n const rotation = options.rotation;\n const radius = options.radius;\n let rad = (rotation || 0) * RAD_PER_DEG;\n\n if (style && typeof style === 'object') {\n type = style.toString();\n if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate(rad);\n ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);\n ctx.restore();\n return;\n }\n }\n\n if (isNaN(radius) || radius <= 0) {\n return;\n }\n\n ctx.beginPath();\n\n switch (style) {\n // Default includes circle\n default:\n if (w) {\n ctx.ellipse(x, y, w / 2, radius, 0, 0, TAU);\n } else {\n ctx.arc(x, y, radius, 0, TAU);\n }\n ctx.closePath();\n break;\n case 'triangle':\n width = w ? w / 2 : radius;\n ctx.moveTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n ctx.closePath();\n break;\n case 'rectRounded':\n // NOTE: the rounded rect implementation changed to use `arc` instead of\n // `quadraticCurveTo` since it generates better results when rect is\n // almost a circle. 0.516 (instead of 0.5) produces results with visually\n // closer proportion to the previous impl and it is inscribed in the\n // circle with `radius`. For more details, see the following PRs:\n // https://github.com/chartjs/Chart.js/issues/5597\n // https://github.com/chartjs/Chart.js/issues/5858\n cornerRadius = radius * 0.516;\n size = radius - cornerRadius;\n xOffset = Math.cos(rad + QUARTER_PI) * size;\n xOffsetW = Math.cos(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n yOffset = Math.sin(rad + QUARTER_PI) * size;\n yOffsetW = Math.sin(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n ctx.arc(x - xOffsetW, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\n ctx.arc(x + yOffsetW, y - xOffset, cornerRadius, rad - HALF_PI, rad);\n ctx.arc(x + xOffsetW, y + yOffset, cornerRadius, rad, rad + HALF_PI);\n ctx.arc(x - yOffsetW, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);\n ctx.closePath();\n break;\n case 'rect':\n if (!rotation) {\n size = Math.SQRT1_2 * radius;\n width = w ? w / 2 : size;\n ctx.rect(x - width, y - size, 2 * width, 2 * size);\n break;\n }\n rad += QUARTER_PI;\n /* falls through */\n case 'rectRot':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n ctx.closePath();\n break;\n case 'crossRot':\n rad += QUARTER_PI;\n /* falls through */\n case 'cross':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'star':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n rad += QUARTER_PI;\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'line':\n xOffset = w ? w / 2 : Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n break;\n case 'dash':\n ctx.moveTo(x, y);\n ctx.lineTo(x + Math.cos(rad) * (w ? w / 2 : radius), y + Math.sin(rad) * radius);\n break;\n case false:\n ctx.closePath();\n break;\n }\n\n ctx.fill();\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n}\n\n/**\n * Returns true if the point is inside the rectangle\n * @param point - The point to test\n * @param area - The rectangle\n * @param margin - allowed margin\n * @private\n */\nexport function _isPointInArea(\n point: Point,\n area: TRBL,\n margin?: number\n) {\n margin = margin || 0.5; // margin - default is to match rounded decimals\n\n return !area || (point && point.x > area.left - margin && point.x < area.right + margin &&\n\t\tpoint.y > area.top - margin && point.y < area.bottom + margin);\n}\n\nexport function clipArea(ctx: CanvasRenderingContext2D, area: TRBL) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n ctx.clip();\n}\n\nexport function unclipArea(ctx: CanvasRenderingContext2D) {\n ctx.restore();\n}\n\n/**\n * @private\n */\nexport function _steppedLineTo(\n ctx: CanvasRenderingContext2D,\n previous: Point,\n target: Point,\n flip?: boolean,\n mode?: string\n) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n if (mode === 'middle') {\n const midpoint = (previous.x + target.x) / 2.0;\n ctx.lineTo(midpoint, previous.y);\n ctx.lineTo(midpoint, target.y);\n } else if (mode === 'after' !== !!flip) {\n ctx.lineTo(previous.x, target.y);\n } else {\n ctx.lineTo(target.x, previous.y);\n }\n ctx.lineTo(target.x, target.y);\n}\n\n/**\n * @private\n */\nexport function _bezierCurveTo(\n ctx: CanvasRenderingContext2D,\n previous: SplinePoint,\n target: SplinePoint,\n flip?: boolean\n) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n ctx.bezierCurveTo(\n flip ? previous.cp1x : previous.cp2x,\n flip ? previous.cp1y : previous.cp2y,\n flip ? target.cp2x : target.cp1x,\n flip ? target.cp2y : target.cp1y,\n target.x,\n target.y);\n}\n\nfunction setRenderOpts(ctx: CanvasRenderingContext2D, opts: RenderTextOpts) {\n if (opts.translation) {\n ctx.translate(opts.translation[0], opts.translation[1]);\n }\n\n if (!isNullOrUndef(opts.rotation)) {\n ctx.rotate(opts.rotation);\n }\n\n if (opts.color) {\n ctx.fillStyle = opts.color;\n }\n\n if (opts.textAlign) {\n ctx.textAlign = opts.textAlign;\n }\n\n if (opts.textBaseline) {\n ctx.textBaseline = opts.textBaseline;\n }\n}\n\nfunction decorateText(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n line: string,\n opts: RenderTextOpts\n) {\n if (opts.strikethrough || opts.underline) {\n /**\n * Now that IE11 support has been dropped, we can use more\n * of the TextMetrics object. The actual bounding boxes\n * are unflagged in Chrome, Firefox, Edge, and Safari so they\n * can be safely used.\n * See https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics#Browser_compatibility\n */\n const metrics = ctx.measureText(line);\n const left = x - metrics.actualBoundingBoxLeft;\n const right = x + metrics.actualBoundingBoxRight;\n const top = y - metrics.actualBoundingBoxAscent;\n const bottom = y + metrics.actualBoundingBoxDescent;\n const yDecoration = opts.strikethrough ? (top + bottom) / 2 : bottom;\n\n ctx.strokeStyle = ctx.fillStyle;\n ctx.beginPath();\n ctx.lineWidth = opts.decorationWidth || 2;\n ctx.moveTo(left, yDecoration);\n ctx.lineTo(right, yDecoration);\n ctx.stroke();\n }\n}\n\nfunction drawBackdrop(ctx: CanvasRenderingContext2D, opts: BackdropOptions) {\n const oldColor = ctx.fillStyle;\n\n ctx.fillStyle = opts.color as string;\n ctx.fillRect(opts.left, opts.top, opts.width, opts.height);\n ctx.fillStyle = oldColor;\n}\n\n/**\n * Render text onto the canvas\n */\nexport function renderText(\n ctx: CanvasRenderingContext2D,\n text: string | string[],\n x: number,\n y: number,\n font: CanvasFontSpec,\n opts: RenderTextOpts = {}\n) {\n const lines = isArray(text) ? text : [text];\n const stroke = opts.strokeWidth > 0 && opts.strokeColor !== '';\n let i: number, line: string;\n\n ctx.save();\n ctx.font = font.string;\n setRenderOpts(ctx, opts);\n\n for (i = 0; i < lines.length; ++i) {\n line = lines[i];\n\n if (opts.backdrop) {\n drawBackdrop(ctx, opts.backdrop);\n }\n\n if (stroke) {\n if (opts.strokeColor) {\n ctx.strokeStyle = opts.strokeColor;\n }\n\n if (!isNullOrUndef(opts.strokeWidth)) {\n ctx.lineWidth = opts.strokeWidth;\n }\n\n ctx.strokeText(line, x, y, opts.maxWidth);\n }\n\n ctx.fillText(line, x, y, opts.maxWidth);\n decorateText(ctx, x, y, line, opts);\n\n y += Number(font.lineHeight);\n }\n\n ctx.restore();\n}\n\n/**\n * Add a path of a rectangle with rounded corners to the current sub-path\n * @param ctx - Context\n * @param rect - Bounding rect\n */\nexport function addRoundedRectPath(\n ctx: CanvasRenderingContext2D,\n rect: RoundedRect & { radius: TRBLCorners }\n) {\n const {x, y, w, h, radius} = rect;\n\n // top left arc\n ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, 1.5 * PI, PI, true);\n\n // line from top left to bottom left\n ctx.lineTo(x, y + h - radius.bottomLeft);\n\n // bottom left arc\n ctx.arc(x + radius.bottomLeft, y + h - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true);\n\n // line from bottom left to bottom right\n ctx.lineTo(x + w - radius.bottomRight, y + h);\n\n // bottom right arc\n ctx.arc(x + w - radius.bottomRight, y + h - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true);\n\n // line from bottom right to top right\n ctx.lineTo(x + w, y + radius.topRight);\n\n // top right arc\n ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true);\n\n // line from top right to top left\n ctx.lineTo(x + radius.topLeft, y);\n}\n","import defaults from '../core/core.defaults.js';\nimport {isArray, isObject, toDimension, valueOrDefault} from './helpers.core.js';\nimport {toFontString} from './helpers.canvas.js';\nimport type {ChartArea, FontSpec, Point} from '../types/index.js';\nimport type {TRBL, TRBLCorners} from '../types/geometric.js';\n\nconst LINE_HEIGHT = /^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/;\nconst FONT_STYLE = /^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;\n\n/**\n * @alias Chart.helpers.options\n * @namespace\n */\n/**\n * Converts the given line height `value` in pixels for a specific font `size`.\n * @param value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').\n * @param size - The font size (in pixels) used to resolve relative `value`.\n * @returns The effective line height in pixels (size * 1.2 if value is invalid).\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\n * @since 2.7.0\n */\nexport function toLineHeight(value: number | string, size: number): number {\n const matches = ('' + value).match(LINE_HEIGHT);\n if (!matches || matches[1] === 'normal') {\n return size * 1.2;\n }\n\n value = +matches[2];\n\n switch (matches[3]) {\n case 'px':\n return value;\n case '%':\n value /= 100;\n break;\n default:\n break;\n }\n\n return size * value;\n}\n\nconst numberOrZero = (v: unknown) => +v || 0;\n\n/**\n * @param value\n * @param props\n */\nexport function _readValueToProps(value: number | Record, props: K[]): Record;\nexport function _readValueToProps(value: number | Record, props: Record): Record;\nexport function _readValueToProps(value: number | Record, props: string[] | Record) {\n const ret = {};\n const objProps = isObject(props);\n const keys = objProps ? Object.keys(props) : props;\n const read = isObject(value)\n ? objProps\n ? prop => valueOrDefault(value[prop], value[props[prop]])\n : prop => value[prop]\n : () => value;\n\n for (const prop of keys) {\n ret[prop] = numberOrZero(read(prop));\n }\n return ret;\n}\n\n/**\n * Converts the given value into a TRBL object.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left)\n * @since 3.0.0\n */\nexport function toTRBL(value: number | TRBL | Point) {\n return _readValueToProps(value, {top: 'y', right: 'x', bottom: 'y', left: 'x'});\n}\n\n/**\n * Converts the given value into a TRBL corners object (similar with css border-radius).\n * @param value - If a number, set the value to all TRBL corner components,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * @returns The TRBL corner values (topLeft, topRight, bottomLeft, bottomRight)\n * @since 3.0.0\n */\nexport function toTRBLCorners(value: number | TRBLCorners) {\n return _readValueToProps(value, ['topLeft', 'topRight', 'bottomLeft', 'bottomRight']);\n}\n\n/**\n * Converts the given value into a padding object with pre-computed width/height.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left, width, height)\n * @since 2.7.0\n */\nexport function toPadding(value?: number | TRBL): ChartArea {\n const obj = toTRBL(value) as ChartArea;\n\n obj.width = obj.left + obj.right;\n obj.height = obj.top + obj.bottom;\n\n return obj;\n}\n\n/**\n * Parses font options and returns the font object.\n * @param options - A object that contains font options to be parsed.\n * @param fallback - A object that contains fallback font options.\n * @return The font object.\n * @private\n */\n\nexport function toFont(options: Partial, fallback?: Partial) {\n options = options || {};\n fallback = fallback || defaults.font as FontSpec;\n\n let size = valueOrDefault(options.size, fallback.size);\n\n if (typeof size === 'string') {\n size = parseInt(size, 10);\n }\n let style = valueOrDefault(options.style, fallback.style);\n if (style && !('' + style).match(FONT_STYLE)) {\n console.warn('Invalid font style specified: \"' + style + '\"');\n style = undefined;\n }\n\n const font = {\n family: valueOrDefault(options.family, fallback.family),\n lineHeight: toLineHeight(valueOrDefault(options.lineHeight, fallback.lineHeight), size),\n size,\n style,\n weight: valueOrDefault(options.weight, fallback.weight),\n string: ''\n };\n\n font.string = toFontString(font);\n return font;\n}\n\n/**\n * Evaluates the given `inputs` sequentially and returns the first defined value.\n * @param inputs - An array of values, falling back to the last value.\n * @param context - If defined and the current value is a function, the value\n * is called with `context` as first argument and the result becomes the new input.\n * @param index - If defined and the current value is an array, the value\n * at `index` become the new input.\n * @param info - object to return information about resolution in\n * @param info.cacheable - Will be set to `false` if option is not cacheable.\n * @since 2.7.0\n */\nexport function resolve(inputs: Array, context?: object, index?: number, info?: { cacheable: boolean }) {\n let cacheable = true;\n let i: number, ilen: number, value: unknown;\n\n for (i = 0, ilen = inputs.length; i < ilen; ++i) {\n value = inputs[i];\n if (value === undefined) {\n continue;\n }\n if (context !== undefined && typeof value === 'function') {\n value = value(context);\n cacheable = false;\n }\n if (index !== undefined && isArray(value)) {\n value = value[index % value.length];\n cacheable = false;\n }\n if (value !== undefined) {\n if (info && !cacheable) {\n info.cacheable = false;\n }\n return value;\n }\n }\n}\n\n/**\n * @param minmax\n * @param grace\n * @param beginAtZero\n * @private\n */\nexport function _addGrace(minmax: { min: number; max: number; }, grace: number | string, beginAtZero: boolean) {\n const {min, max} = minmax;\n const change = toDimension(grace, (max - min) / 2);\n const keepZero = (value: number, add: number) => beginAtZero && value === 0 ? 0 : value + add;\n return {\n min: keepZero(min, -Math.abs(change)),\n max: keepZero(max, change)\n };\n}\n\n/**\n * Create a context inheriting parentContext\n * @param parentContext\n * @param context\n * @returns\n */\nexport function createContext(parentContext: null, context: T): T;\nexport function createContext(parentContext: P, context: T): P & T;\nexport function createContext(parentContext: object, context: object) {\n return Object.assign(Object.create(parentContext), context);\n}\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport type {AnyObject} from '../types/basic.js';\nimport type {ChartMeta} from '../types/index.js';\nimport type {\n ResolverObjectKey,\n ResolverCache,\n ResolverProxy,\n DescriptorDefaults,\n Descriptor,\n ContextCache,\n ContextProxy\n} from './helpers.config.types.js';\nimport {isArray, isFunction, isObject, resolveObjectKey, _capitalize} from './helpers.core.js';\n\nexport * from './helpers.config.types.js';\n\n/**\n * Creates a Proxy for resolving raw values for options.\n * @param scopes - The option scopes to look for values, in resolution order\n * @param prefixes - The prefixes for values, in resolution order.\n * @param rootScopes - The root option scopes\n * @param fallback - Parent scopes fallback\n * @param getTarget - callback for getting the target for changed values\n * @returns Proxy\n * @private\n */\nexport function _createResolver<\n T extends AnyObject[] = AnyObject[],\n R extends AnyObject[] = T\n>(\n scopes: T,\n prefixes = [''],\n rootScopes?: R,\n fallback?: ResolverObjectKey,\n getTarget = () => scopes[0]\n) {\n const finalRootScopes = rootScopes || scopes;\n if (typeof fallback === 'undefined') {\n fallback = _resolve('_fallback', scopes);\n }\n const cache: ResolverCache = {\n [Symbol.toStringTag]: 'Object',\n _cacheable: true,\n _scopes: scopes,\n _rootScopes: finalRootScopes,\n _fallback: fallback,\n _getTarget: getTarget,\n override: (scope: AnyObject) => _createResolver([scope, ...scopes], prefixes, finalRootScopes, fallback),\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */\n deleteProperty(target, prop: string) {\n delete target[prop]; // remove from cache\n delete target._keys; // remove cached keys\n delete scopes[0][prop]; // remove from top level scope\n return true;\n },\n\n /**\n * A trap for getting property values.\n */\n get(target, prop: string) {\n return _cached(target, prop,\n () => _resolveWithPrefixes(prop, prefixes, scopes, target));\n },\n\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */\n getOwnPropertyDescriptor(target, prop) {\n return Reflect.getOwnPropertyDescriptor(target._scopes[0], prop);\n },\n\n /**\n * A trap for Object.getPrototypeOf.\n */\n getPrototypeOf() {\n return Reflect.getPrototypeOf(scopes[0]);\n },\n\n /**\n * A trap for the in operator.\n */\n has(target, prop: string) {\n return getKeysFromAllScopes(target).includes(prop);\n },\n\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */\n ownKeys(target) {\n return getKeysFromAllScopes(target);\n },\n\n /**\n * A trap for setting property values.\n */\n set(target, prop: string, value) {\n const storage = target._storage || (target._storage = getTarget());\n target[prop] = storage[prop] = value; // set to top level scope + cache\n delete target._keys; // remove cached keys\n return true;\n }\n }) as ResolverProxy;\n}\n\n/**\n * Returns an Proxy for resolving option values with context.\n * @param proxy - The Proxy returned by `_createResolver`\n * @param context - Context object for scriptable/indexable options\n * @param subProxy - The proxy provided for scriptable options\n * @param descriptorDefaults - Defaults for descriptors\n * @private\n */\nexport function _attachContext<\n T extends AnyObject[] = AnyObject[],\n R extends AnyObject[] = T\n>(\n proxy: ResolverProxy,\n context: AnyObject,\n subProxy?: ResolverProxy,\n descriptorDefaults?: DescriptorDefaults\n) {\n const cache: ContextCache = {\n _cacheable: false,\n _proxy: proxy,\n _context: context,\n _subProxy: subProxy,\n _stack: new Set(),\n _descriptors: _descriptors(proxy, descriptorDefaults),\n setContext: (ctx: AnyObject) => _attachContext(proxy, ctx, subProxy, descriptorDefaults),\n override: (scope: AnyObject) => _attachContext(proxy.override(scope), context, subProxy, descriptorDefaults)\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */\n deleteProperty(target, prop) {\n delete target[prop]; // remove from cache\n delete proxy[prop]; // remove from proxy\n return true;\n },\n\n /**\n * A trap for getting property values.\n */\n get(target, prop: string, receiver) {\n return _cached(target, prop,\n () => _resolveWithContext(target, prop, receiver));\n },\n\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */\n getOwnPropertyDescriptor(target, prop) {\n return target._descriptors.allKeys\n ? Reflect.has(proxy, prop) ? {enumerable: true, configurable: true} : undefined\n : Reflect.getOwnPropertyDescriptor(proxy, prop);\n },\n\n /**\n * A trap for Object.getPrototypeOf.\n */\n getPrototypeOf() {\n return Reflect.getPrototypeOf(proxy);\n },\n\n /**\n * A trap for the in operator.\n */\n has(target, prop) {\n return Reflect.has(proxy, prop);\n },\n\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */\n ownKeys() {\n return Reflect.ownKeys(proxy);\n },\n\n /**\n * A trap for setting property values.\n */\n set(target, prop, value) {\n proxy[prop] = value; // set to proxy\n delete target[prop]; // remove from cache\n return true;\n }\n }) as ContextProxy;\n}\n\n/**\n * @private\n */\nexport function _descriptors(\n proxy: ResolverCache,\n defaults: DescriptorDefaults = {scriptable: true, indexable: true}\n): Descriptor {\n const {_scriptable = defaults.scriptable, _indexable = defaults.indexable, _allKeys = defaults.allKeys} = proxy;\n return {\n allKeys: _allKeys,\n scriptable: _scriptable,\n indexable: _indexable,\n isScriptable: isFunction(_scriptable) ? _scriptable : () => _scriptable,\n isIndexable: isFunction(_indexable) ? _indexable : () => _indexable\n };\n}\n\nconst readKey = (prefix: string, name: string) => prefix ? prefix + _capitalize(name) : name;\nconst needsSubResolver = (prop: string, value: unknown) => isObject(value) && prop !== 'adapters' &&\n (Object.getPrototypeOf(value) === null || value.constructor === Object);\n\nfunction _cached(\n target: AnyObject,\n prop: string,\n resolve: () => unknown\n) {\n if (Object.prototype.hasOwnProperty.call(target, prop) || prop === 'constructor') {\n return target[prop];\n }\n\n const value = resolve();\n // cache the resolved value\n target[prop] = value;\n return value;\n}\n\nfunction _resolveWithContext(\n target: ContextCache,\n prop: string,\n receiver: AnyObject\n) {\n const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n let value = _proxy[prop]; // resolve from proxy\n\n // resolve with context\n if (isFunction(value) && descriptors.isScriptable(prop)) {\n value = _resolveScriptable(prop, value, target, receiver);\n }\n if (isArray(value) && value.length) {\n value = _resolveArray(prop, value, target, descriptors.isIndexable);\n }\n if (needsSubResolver(prop, value)) {\n // if the resolved value is an object, create a sub resolver for it\n value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors);\n }\n return value;\n}\n\nfunction _resolveScriptable(\n prop: string,\n getValue: (ctx: AnyObject, sub: AnyObject) => unknown,\n target: ContextCache,\n receiver: AnyObject\n) {\n const {_proxy, _context, _subProxy, _stack} = target;\n if (_stack.has(prop)) {\n throw new Error('Recursion detected: ' + Array.from(_stack).join('->') + '->' + prop);\n }\n _stack.add(prop);\n let value = getValue(_context, _subProxy || receiver);\n _stack.delete(prop);\n if (needsSubResolver(prop, value)) {\n // When scriptable option returns an object, create a resolver on that.\n value = createSubResolver(_proxy._scopes, _proxy, prop, value);\n }\n return value;\n}\n\nfunction _resolveArray(\n prop: string,\n value: unknown[],\n target: ContextCache,\n isIndexable: (key: string) => boolean\n) {\n const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n\n if (typeof _context.index !== 'undefined' && isIndexable(prop)) {\n return value[_context.index % value.length];\n } else if (isObject(value[0])) {\n // Array of objects, return array or resolvers\n const arr = value;\n const scopes = _proxy._scopes.filter(s => s !== arr);\n value = [];\n for (const item of arr) {\n const resolver = createSubResolver(scopes, _proxy, prop, item);\n value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop], descriptors));\n }\n }\n return value;\n}\n\nfunction resolveFallback(\n fallback: ResolverObjectKey | ((prop: ResolverObjectKey, value: unknown) => ResolverObjectKey),\n prop: ResolverObjectKey,\n value: unknown\n) {\n return isFunction(fallback) ? fallback(prop, value) : fallback;\n}\n\nconst getScope = (key: ResolverObjectKey, parent: AnyObject) => key === true ? parent\n : typeof key === 'string' ? resolveObjectKey(parent, key) : undefined;\n\nfunction addScopes(\n set: Set,\n parentScopes: AnyObject[],\n key: ResolverObjectKey,\n parentFallback: ResolverObjectKey,\n value: unknown\n) {\n for (const parent of parentScopes) {\n const scope = getScope(key, parent);\n if (scope) {\n set.add(scope);\n const fallback = resolveFallback(scope._fallback, key, value);\n if (typeof fallback !== 'undefined' && fallback !== key && fallback !== parentFallback) {\n // When we reach the descriptor that defines a new _fallback, return that.\n // The fallback will resume to that new scope.\n return fallback;\n }\n } else if (scope === false && typeof parentFallback !== 'undefined' && key !== parentFallback) {\n // Fallback to `false` results to `false`, when falling back to different key.\n // For example `interaction` from `hover` or `plugins.tooltip` and `animation` from `animations`\n return null;\n }\n }\n return false;\n}\n\nfunction createSubResolver(\n parentScopes: AnyObject[],\n resolver: ResolverCache,\n prop: ResolverObjectKey,\n value: unknown\n) {\n const rootScopes = resolver._rootScopes;\n const fallback = resolveFallback(resolver._fallback, prop, value);\n const allScopes = [...parentScopes, ...rootScopes];\n const set = new Set();\n set.add(value);\n let key = addScopesFromKey(set, allScopes, prop, fallback || prop, value);\n if (key === null) {\n return false;\n }\n if (typeof fallback !== 'undefined' && fallback !== prop) {\n key = addScopesFromKey(set, allScopes, fallback, key, value);\n if (key === null) {\n return false;\n }\n }\n return _createResolver(Array.from(set), [''], rootScopes, fallback,\n () => subGetTarget(resolver, prop as string, value));\n}\n\nfunction addScopesFromKey(\n set: Set,\n allScopes: AnyObject[],\n key: ResolverObjectKey,\n fallback: ResolverObjectKey,\n item: unknown\n) {\n while (key) {\n key = addScopes(set, allScopes, key, fallback, item);\n }\n return key;\n}\n\nfunction subGetTarget(\n resolver: ResolverCache,\n prop: string,\n value: unknown\n) {\n const parent = resolver._getTarget();\n if (!(prop in parent)) {\n parent[prop] = {};\n }\n const target = parent[prop];\n if (isArray(target) && isObject(value)) {\n // For array of objects, the object is used to store updated values\n return value;\n }\n return target || {};\n}\n\nfunction _resolveWithPrefixes(\n prop: string,\n prefixes: string[],\n scopes: AnyObject[],\n proxy: ResolverProxy\n) {\n let value: unknown;\n for (const prefix of prefixes) {\n value = _resolve(readKey(prefix, prop), scopes);\n if (typeof value !== 'undefined') {\n return needsSubResolver(prop, value)\n ? createSubResolver(scopes, proxy, prop, value)\n : value;\n }\n }\n}\n\nfunction _resolve(key: string, scopes: AnyObject[]) {\n for (const scope of scopes) {\n if (!scope) {\n continue;\n }\n const value = scope[key];\n if (typeof value !== 'undefined') {\n return value;\n }\n }\n}\n\nfunction getKeysFromAllScopes(target: ResolverCache) {\n let keys = target._keys;\n if (!keys) {\n keys = target._keys = resolveKeysFromAllScopes(target._scopes);\n }\n return keys;\n}\n\nfunction resolveKeysFromAllScopes(scopes: AnyObject[]) {\n const set = new Set();\n for (const scope of scopes) {\n for (const key of Object.keys(scope).filter(k => !k.startsWith('_'))) {\n set.add(key);\n }\n }\n return Array.from(set);\n}\n\nexport function _parseObjectDataRadialScale(\n meta: ChartMeta<'line' | 'scatter'>,\n data: AnyObject[],\n start: number,\n count: number\n) {\n const {iScale} = meta;\n const {key = 'r'} = this._parsing;\n const parsed = new Array<{r: unknown}>(count);\n let i: number, ilen: number, index: number, item: AnyObject;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n r: iScale.parse(resolveObjectKey(item, key), index)\n };\n }\n return parsed;\n}\n","import {almostEquals, distanceBetweenPoints, sign} from './helpers.math.js';\nimport {_isPointInArea} from './helpers.canvas.js';\nimport type {ChartArea} from '../types/index.js';\nimport type {SplinePoint} from '../types/geometric.js';\n\nconst EPSILON = Number.EPSILON || 1e-14;\n\ntype OptionalSplinePoint = SplinePoint | false\nconst getPoint = (points: SplinePoint[], i: number): OptionalSplinePoint => i < points.length && !points[i].skip && points[i];\nconst getValueAxis = (indexAxis: 'x' | 'y') => indexAxis === 'x' ? 'y' : 'x';\n\nexport function splineCurve(\n firstPoint: SplinePoint,\n middlePoint: SplinePoint,\n afterPoint: SplinePoint,\n t: number\n): {\n previous: SplinePoint\n next: SplinePoint\n } {\n // Props to Rob Spencer at scaled innovation for his post on splining between points\n // http://scaledinnovation.com/analytics/splines/aboutSplines.html\n\n // This function must also respect \"skipped\" points\n\n const previous = firstPoint.skip ? middlePoint : firstPoint;\n const current = middlePoint;\n const next = afterPoint.skip ? middlePoint : afterPoint;\n const d01 = distanceBetweenPoints(current, previous);\n const d12 = distanceBetweenPoints(next, current);\n\n let s01 = d01 / (d01 + d12);\n let s12 = d12 / (d01 + d12);\n\n // If all points are the same, s01 & s02 will be inf\n s01 = isNaN(s01) ? 0 : s01;\n s12 = isNaN(s12) ? 0 : s12;\n\n const fa = t * s01; // scaling factor for triangle Ta\n const fb = t * s12;\n\n return {\n previous: {\n x: current.x - fa * (next.x - previous.x),\n y: current.y - fa * (next.y - previous.y)\n },\n next: {\n x: current.x + fb * (next.x - previous.x),\n y: current.y + fb * (next.y - previous.y)\n }\n };\n}\n\n/**\n * Adjust tangents to ensure monotonic properties\n */\nfunction monotoneAdjust(points: SplinePoint[], deltaK: number[], mK: number[]) {\n const pointsLen = points.length;\n\n let alphaK: number, betaK: number, tauK: number, squaredMagnitude: number, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n for (let i = 0; i < pointsLen - 1; ++i) {\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent || !pointAfter) {\n continue;\n }\n\n if (almostEquals(deltaK[i], 0, EPSILON)) {\n mK[i] = mK[i + 1] = 0;\n continue;\n }\n\n alphaK = mK[i] / deltaK[i];\n betaK = mK[i + 1] / deltaK[i];\n squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n if (squaredMagnitude <= 9) {\n continue;\n }\n\n tauK = 3 / Math.sqrt(squaredMagnitude);\n mK[i] = alphaK * tauK * deltaK[i];\n mK[i + 1] = betaK * tauK * deltaK[i];\n }\n}\n\nfunction monotoneCompute(points: SplinePoint[], mK: number[], indexAxis: 'x' | 'y' = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n let delta: number, pointBefore: OptionalSplinePoint, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n\n for (let i = 0; i < pointsLen; ++i) {\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n\n const iPixel = pointCurrent[indexAxis];\n const vPixel = pointCurrent[valueAxis];\n if (pointBefore) {\n delta = (iPixel - pointBefore[indexAxis]) / 3;\n pointCurrent[`cp1${indexAxis}`] = iPixel - delta;\n pointCurrent[`cp1${valueAxis}`] = vPixel - delta * mK[i];\n }\n if (pointAfter) {\n delta = (pointAfter[indexAxis] - iPixel) / 3;\n pointCurrent[`cp2${indexAxis}`] = iPixel + delta;\n pointCurrent[`cp2${valueAxis}`] = vPixel + delta * mK[i];\n }\n }\n}\n\n/**\n * This function calculates Bézier control points in a similar way than |splineCurve|,\n * but preserves monotonicity of the provided data and ensures no local extremums are added\n * between the dataset discrete points due to the interpolation.\n * See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n */\nexport function splineCurveMonotone(points: SplinePoint[], indexAxis: 'x' | 'y' = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n const deltaK: number[] = Array(pointsLen).fill(0);\n const mK: number[] = Array(pointsLen);\n\n // Calculate slopes (deltaK) and initialize tangents (mK)\n let i, pointBefore: OptionalSplinePoint, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n\n for (i = 0; i < pointsLen; ++i) {\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n\n if (pointAfter) {\n const slopeDelta = pointAfter[indexAxis] - pointCurrent[indexAxis];\n\n // In the case of two points that appear at the same x pixel, slopeDeltaX is 0\n deltaK[i] = slopeDelta !== 0 ? (pointAfter[valueAxis] - pointCurrent[valueAxis]) / slopeDelta : 0;\n }\n mK[i] = !pointBefore ? deltaK[i]\n : !pointAfter ? deltaK[i - 1]\n : (sign(deltaK[i - 1]) !== sign(deltaK[i])) ? 0\n : (deltaK[i - 1] + deltaK[i]) / 2;\n }\n\n monotoneAdjust(points, deltaK, mK);\n\n monotoneCompute(points, mK, indexAxis);\n}\n\nfunction capControlPoint(pt: number, min: number, max: number) {\n return Math.max(Math.min(pt, max), min);\n}\n\nfunction capBezierPoints(points: SplinePoint[], area: ChartArea) {\n let i, ilen, point, inArea, inAreaPrev;\n let inAreaNext = _isPointInArea(points[0], area);\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n inAreaPrev = inArea;\n inArea = inAreaNext;\n inAreaNext = i < ilen - 1 && _isPointInArea(points[i + 1], area);\n if (!inArea) {\n continue;\n }\n point = points[i];\n if (inAreaPrev) {\n point.cp1x = capControlPoint(point.cp1x, area.left, area.right);\n point.cp1y = capControlPoint(point.cp1y, area.top, area.bottom);\n }\n if (inAreaNext) {\n point.cp2x = capControlPoint(point.cp2x, area.left, area.right);\n point.cp2y = capControlPoint(point.cp2y, area.top, area.bottom);\n }\n }\n}\n\n/**\n * @private\n */\nexport function _updateBezierControlPoints(\n points: SplinePoint[],\n options,\n area: ChartArea,\n loop: boolean,\n indexAxis: 'x' | 'y'\n) {\n let i: number, ilen: number, point: SplinePoint, controlPoints: ReturnType;\n\n // Only consider points that are drawn in case the spanGaps option is used\n if (options.spanGaps) {\n points = points.filter((pt) => !pt.skip);\n }\n\n if (options.cubicInterpolationMode === 'monotone') {\n splineCurveMonotone(points, indexAxis);\n } else {\n let prev = loop ? points[points.length - 1] : points[0];\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n point = points[i];\n controlPoints = splineCurve(\n prev,\n point,\n points[Math.min(i + 1, ilen - (loop ? 0 : 1)) % ilen],\n options.tension\n );\n point.cp1x = controlPoints.previous.x;\n point.cp1y = controlPoints.previous.y;\n point.cp2x = controlPoints.next.x;\n point.cp2y = controlPoints.next.y;\n prev = point;\n }\n }\n\n if (options.capBezierPoints) {\n capBezierPoints(points, area);\n }\n}\n","import type {ChartArea, Scale} from '../types/index.js';\nimport type PrivateChart from '../core/core.controller.js';\nimport type {Chart, ChartEvent} from '../types.js';\nimport {INFINITY} from './helpers.math.js';\n\n/**\n * @private\n */\nexport function _isDomSupported(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\n/**\n * @private\n */\nexport function _getParentNode(domNode: HTMLCanvasElement): HTMLCanvasElement {\n let parent = domNode.parentNode;\n if (parent && parent.toString() === '[object ShadowRoot]') {\n parent = (parent as ShadowRoot).host;\n }\n return parent as HTMLCanvasElement;\n}\n\n/**\n * convert max-width/max-height values that may be percentages into a number\n * @private\n */\n\nfunction parseMaxStyle(styleValue: string | number, node: HTMLElement, parentProperty: string) {\n let valueInPixels: number;\n if (typeof styleValue === 'string') {\n valueInPixels = parseInt(styleValue, 10);\n\n if (styleValue.indexOf('%') !== -1) {\n // percentage * size in dimension\n valueInPixels = (valueInPixels / 100) * node.parentNode[parentProperty];\n }\n } else {\n valueInPixels = styleValue;\n }\n\n return valueInPixels;\n}\n\nconst getComputedStyle = (element: HTMLElement): CSSStyleDeclaration =>\n element.ownerDocument.defaultView.getComputedStyle(element, null);\n\nexport function getStyle(el: HTMLElement, property: string): string {\n return getComputedStyle(el).getPropertyValue(property);\n}\n\nconst positions = ['top', 'right', 'bottom', 'left'];\nfunction getPositionedStyle(styles: CSSStyleDeclaration, style: string, suffix?: string): ChartArea {\n const result = {} as ChartArea;\n suffix = suffix ? '-' + suffix : '';\n for (let i = 0; i < 4; i++) {\n const pos = positions[i];\n result[pos] = parseFloat(styles[style + '-' + pos + suffix]) || 0;\n }\n result.width = result.left + result.right;\n result.height = result.top + result.bottom;\n return result;\n}\n\nconst useOffsetPos = (x: number, y: number, target: HTMLElement | EventTarget) =>\n (x > 0 || y > 0) && (!target || !(target as HTMLElement).shadowRoot);\n\n/**\n * @param e\n * @param canvas\n * @returns Canvas position\n */\nfunction getCanvasPosition(\n e: Event | TouchEvent | MouseEvent,\n canvas: HTMLCanvasElement\n): {\n x: number;\n y: number;\n box: boolean;\n } {\n const touches = (e as TouchEvent).touches;\n const source = (touches && touches.length ? touches[0] : e) as MouseEvent;\n const {offsetX, offsetY} = source as MouseEvent;\n let box = false;\n let x, y;\n if (useOffsetPos(offsetX, offsetY, e.target)) {\n x = offsetX;\n y = offsetY;\n } else {\n const rect = canvas.getBoundingClientRect();\n x = source.clientX - rect.left;\n y = source.clientY - rect.top;\n box = true;\n }\n return {x, y, box};\n}\n\n/**\n * Gets an event's x, y coordinates, relative to the chart area\n * @param event\n * @param chart\n * @returns x and y coordinates of the event\n */\n\nexport function getRelativePosition(\n event: Event | ChartEvent | TouchEvent | MouseEvent,\n chart: Chart | PrivateChart\n): { x: number; y: number } {\n if ('native' in event) {\n return event;\n }\n\n const {canvas, currentDevicePixelRatio} = chart;\n const style = getComputedStyle(canvas);\n const borderBox = style.boxSizing === 'border-box';\n const paddings = getPositionedStyle(style, 'padding');\n const borders = getPositionedStyle(style, 'border', 'width');\n const {x, y, box} = getCanvasPosition(event, canvas);\n const xOffset = paddings.left + (box && borders.left);\n const yOffset = paddings.top + (box && borders.top);\n\n let {width, height} = chart;\n if (borderBox) {\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n return {\n x: Math.round((x - xOffset) / width * canvas.width / currentDevicePixelRatio),\n y: Math.round((y - yOffset) / height * canvas.height / currentDevicePixelRatio)\n };\n}\n\nfunction getContainerSize(canvas: HTMLCanvasElement, width: number, height: number): Partial {\n let maxWidth: number, maxHeight: number;\n\n if (width === undefined || height === undefined) {\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n width = canvas.clientWidth;\n height = canvas.clientHeight;\n } else {\n const rect = container.getBoundingClientRect(); // this is the border box of the container\n const containerStyle = getComputedStyle(container);\n const containerBorder = getPositionedStyle(containerStyle, 'border', 'width');\n const containerPadding = getPositionedStyle(containerStyle, 'padding');\n width = rect.width - containerPadding.width - containerBorder.width;\n height = rect.height - containerPadding.height - containerBorder.height;\n maxWidth = parseMaxStyle(containerStyle.maxWidth, container, 'clientWidth');\n maxHeight = parseMaxStyle(containerStyle.maxHeight, container, 'clientHeight');\n }\n }\n return {\n width,\n height,\n maxWidth: maxWidth || INFINITY,\n maxHeight: maxHeight || INFINITY\n };\n}\n\nconst round1 = (v: number) => Math.round(v * 10) / 10;\n\n// eslint-disable-next-line complexity\nexport function getMaximumSize(\n canvas: HTMLCanvasElement,\n bbWidth?: number,\n bbHeight?: number,\n aspectRatio?: number\n): { width: number; height: number } {\n const style = getComputedStyle(canvas);\n const margins = getPositionedStyle(style, 'margin');\n const maxWidth = parseMaxStyle(style.maxWidth, canvas, 'clientWidth') || INFINITY;\n const maxHeight = parseMaxStyle(style.maxHeight, canvas, 'clientHeight') || INFINITY;\n const containerSize = getContainerSize(canvas, bbWidth, bbHeight);\n let {width, height} = containerSize;\n\n if (style.boxSizing === 'content-box') {\n const borders = getPositionedStyle(style, 'border', 'width');\n const paddings = getPositionedStyle(style, 'padding');\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n width = Math.max(0, width - margins.width);\n height = Math.max(0, aspectRatio ? width / aspectRatio : height - margins.height);\n width = round1(Math.min(width, maxWidth, containerSize.maxWidth));\n height = round1(Math.min(height, maxHeight, containerSize.maxHeight));\n if (width && !height) {\n // https://github.com/chartjs/Chart.js/issues/4659\n // If the canvas has width, but no height, default to aspectRatio of 2 (canvas default)\n height = round1(width / 2);\n }\n\n const maintainHeight = bbWidth !== undefined || bbHeight !== undefined;\n\n if (maintainHeight && aspectRatio && containerSize.height && height > containerSize.height) {\n height = containerSize.height;\n width = round1(Math.floor(height * aspectRatio));\n }\n\n return {width, height};\n}\n\n/**\n * @param chart\n * @param forceRatio\n * @param forceStyle\n * @returns True if the canvas context size or transformation has changed.\n */\nexport function retinaScale(\n chart: Chart | PrivateChart,\n forceRatio: number,\n forceStyle?: boolean\n): boolean | void {\n const pixelRatio = forceRatio || 1;\n const deviceHeight = round1(chart.height * pixelRatio);\n const deviceWidth = round1(chart.width * pixelRatio);\n\n (chart as PrivateChart).height = round1(chart.height);\n (chart as PrivateChart).width = round1(chart.width);\n\n const canvas = chart.canvas;\n\n // If no style has been set on the canvas, the render size is used as display size,\n // making the chart visually bigger, so let's enforce it to the \"correct\" values.\n // See https://github.com/chartjs/Chart.js/issues/3575\n if (canvas.style && (forceStyle || (!canvas.style.height && !canvas.style.width))) {\n canvas.style.height = `${chart.height}px`;\n canvas.style.width = `${chart.width}px`;\n }\n\n if (chart.currentDevicePixelRatio !== pixelRatio\n || canvas.height !== deviceHeight\n || canvas.width !== deviceWidth) {\n (chart as PrivateChart).currentDevicePixelRatio = pixelRatio;\n canvas.height = deviceHeight;\n canvas.width = deviceWidth;\n chart.ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n return true;\n }\n return false;\n}\n\n/**\n * Detects support for options object argument in addEventListener.\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\n * @private\n */\nexport const supportsEventListenerOptions = (function() {\n let passiveSupported = false;\n try {\n const options = {\n get passive() { // This function will be called when the browser attempts to access the passive property.\n passiveSupported = true;\n return false;\n }\n } as EventListenerOptions;\n\n if (_isDomSupported()) {\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n }\n } catch (e) {\n // continue regardless of error\n }\n return passiveSupported;\n}());\n\n/**\n * The \"used\" size is the final value of a dimension property after all calculations have\n * been performed. This method uses the computed style of `element` but returns undefined\n * if the computed style is not expressed in pixels. That can happen in some cases where\n * `element` has a size relative to its parent and this last one is not yet displayed,\n * for example because of `display: none` on a parent node.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\n * @returns Size in pixels or undefined if unknown.\n */\n\nexport function readUsedSize(\n element: HTMLElement,\n property: 'width' | 'height'\n): number | undefined {\n const value = getStyle(element, property);\n const matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n return matches ? +matches[1] : undefined;\n}\n","import type {Point, SplinePoint} from '../types/geometric.js';\n\n/**\n * @private\n */\nexport function _pointInLine(p1: Point, p2: Point, t: number, mode?) { // eslint-disable-line @typescript-eslint/no-unused-vars\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: p1.y + t * (p2.y - p1.y)\n };\n}\n\n/**\n * @private\n */\nexport function _steppedInterpolation(\n p1: Point,\n p2: Point,\n t: number, mode: 'middle' | 'after' | unknown\n) {\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: mode === 'middle' ? t < 0.5 ? p1.y : p2.y\n : mode === 'after' ? t < 1 ? p1.y : p2.y\n : t > 0 ? p2.y : p1.y\n };\n}\n\n/**\n * @private\n */\nexport function _bezierInterpolation(p1: SplinePoint, p2: SplinePoint, t: number, mode?) { // eslint-disable-line @typescript-eslint/no-unused-vars\n const cp1 = {x: p1.cp2x, y: p1.cp2y};\n const cp2 = {x: p2.cp1x, y: p2.cp1y};\n const a = _pointInLine(p1, cp1, t);\n const b = _pointInLine(cp1, cp2, t);\n const c = _pointInLine(cp2, p2, t);\n const d = _pointInLine(a, b, t);\n const e = _pointInLine(b, c, t);\n return _pointInLine(d, e, t);\n}\n","export interface RTLAdapter {\n x(x: number): number;\n setWidth(w: number): void;\n textAlign(align: 'center' | 'left' | 'right'): 'center' | 'left' | 'right';\n xPlus(x: number, value: number): number;\n leftForLtr(x: number, itemWidth: number): number;\n}\n\nconst getRightToLeftAdapter = function(rectX: number, width: number): RTLAdapter {\n return {\n x(x) {\n return rectX + rectX + width - x;\n },\n setWidth(w) {\n width = w;\n },\n textAlign(align) {\n if (align === 'center') {\n return align;\n }\n return align === 'right' ? 'left' : 'right';\n },\n xPlus(x, value) {\n return x - value;\n },\n leftForLtr(x, itemWidth) {\n return x - itemWidth;\n },\n };\n};\n\nconst getLeftToRightAdapter = function(): RTLAdapter {\n return {\n x(x) {\n return x;\n },\n setWidth(w) { // eslint-disable-line no-unused-vars\n },\n textAlign(align) {\n return align;\n },\n xPlus(x, value) {\n return x + value;\n },\n leftForLtr(x, _itemWidth) { // eslint-disable-line @typescript-eslint/no-unused-vars\n return x;\n },\n };\n};\n\nexport function getRtlAdapter(rtl: boolean, rectX: number, width: number) {\n return rtl ? getRightToLeftAdapter(rectX, width) : getLeftToRightAdapter();\n}\n\nexport function overrideTextDirection(ctx: CanvasRenderingContext2D, direction: 'ltr' | 'rtl') {\n let style: CSSStyleDeclaration, original: [string, string];\n if (direction === 'ltr' || direction === 'rtl') {\n style = ctx.canvas.style;\n original = [\n style.getPropertyValue('direction'),\n style.getPropertyPriority('direction'),\n ];\n\n style.setProperty('direction', direction, 'important');\n (ctx as { prevTextDirection?: [string, string] }).prevTextDirection = original;\n }\n}\n\nexport function restoreTextDirection(ctx: CanvasRenderingContext2D, original?: [string, string]) {\n if (original !== undefined) {\n delete (ctx as { prevTextDirection?: [string, string] }).prevTextDirection;\n ctx.canvas.style.setProperty('direction', original[0], original[1]);\n }\n}\n","import {_angleBetween, _angleDiff, _isBetween, _normalizeAngle} from './helpers.math.js';\nimport {createContext} from './helpers.options.js';\nimport {isPatternOrGradient} from './helpers.color.js';\n\n/**\n * @typedef { import('../elements/element.line.js').default } LineElement\n * @typedef { import('../elements/element.point.js').default } PointElement\n * @typedef {{start: number, end: number, loop: boolean, style?: any}} Segment\n */\n\nfunction propertyFn(property) {\n if (property === 'angle') {\n return {\n between: _angleBetween,\n compare: _angleDiff,\n normalize: _normalizeAngle,\n };\n }\n return {\n between: _isBetween,\n compare: (a, b) => a - b,\n normalize: x => x\n };\n}\n\nfunction normalizeSegment({start, end, count, loop, style}) {\n return {\n start: start % count,\n end: end % count,\n loop: loop && (end - start + 1) % count === 0,\n style\n };\n}\n\nfunction getSegment(segment, points, bounds) {\n const {property, start: startBound, end: endBound} = bounds;\n const {between, normalize} = propertyFn(property);\n const count = points.length;\n // eslint-disable-next-line prefer-const\n let {start, end, loop} = segment;\n let i, ilen;\n\n if (loop) {\n start += count;\n end += count;\n for (i = 0, ilen = count; i < ilen; ++i) {\n if (!between(normalize(points[start % count][property]), startBound, endBound)) {\n break;\n }\n start--;\n end--;\n }\n start %= count;\n end %= count;\n }\n\n if (end < start) {\n end += count;\n }\n return {start, end, loop, style: segment.style};\n}\n\n/**\n * Returns the sub-segment(s) of a line segment that fall in the given bounds\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} [segment.style] - segment style\n * @param {PointElement[]} points - the points that this segment refers to\n * @param {object} [bounds]\n * @param {string} bounds.property - the property of a `PointElement` we are bounding. `x`, `y` or `angle`.\n * @param {number} bounds.start - start value of the property\n * @param {number} bounds.end - end value of the property\n * @private\n **/\nexport function _boundSegment(segment, points, bounds) {\n if (!bounds) {\n return [segment];\n }\n\n const {property, start: startBound, end: endBound} = bounds;\n const count = points.length;\n const {compare, between, normalize} = propertyFn(property);\n const {start, end, loop, style} = getSegment(segment, points, bounds);\n\n const result = [];\n let inside = false;\n let subStart = null;\n let value, point, prevValue;\n\n const startIsBefore = () => between(startBound, prevValue, value) && compare(startBound, prevValue) !== 0;\n const endIsBefore = () => compare(endBound, value) === 0 || between(endBound, prevValue, value);\n const shouldStart = () => inside || startIsBefore();\n const shouldStop = () => !inside || endIsBefore();\n\n for (let i = start, prev = start; i <= end; ++i) {\n point = points[i % count];\n\n if (point.skip) {\n continue;\n }\n\n value = normalize(point[property]);\n\n if (value === prevValue) {\n continue;\n }\n\n inside = between(value, startBound, endBound);\n\n if (subStart === null && shouldStart()) {\n subStart = compare(value, startBound) === 0 ? i : prev;\n }\n\n if (subStart !== null && shouldStop()) {\n result.push(normalizeSegment({start: subStart, end: i, loop, count, style}));\n subStart = null;\n }\n prev = i;\n prevValue = value;\n }\n\n if (subStart !== null) {\n result.push(normalizeSegment({start: subStart, end, loop, count, style}));\n }\n\n return result;\n}\n\n\n/**\n * Returns the segments of the line that are inside given bounds\n * @param {LineElement} line\n * @param {object} [bounds]\n * @param {string} bounds.property - the property we are bounding with. `x`, `y` or `angle`.\n * @param {number} bounds.start - start value of the `property`\n * @param {number} bounds.end - end value of the `property`\n * @private\n */\nexport function _boundSegments(line, bounds) {\n const result = [];\n const segments = line.segments;\n\n for (let i = 0; i < segments.length; i++) {\n const sub = _boundSegment(segments[i], line.points, bounds);\n if (sub.length) {\n result.push(...sub);\n }\n }\n return result;\n}\n\n/**\n * Find start and end index of a line.\n */\nfunction findStartAndEnd(points, count, loop, spanGaps) {\n let start = 0;\n let end = count - 1;\n\n if (loop && !spanGaps) {\n // loop and not spanning gaps, first find a gap to start from\n while (start < count && !points[start].skip) {\n start++;\n }\n }\n\n // find first non skipped point (after the first gap possibly)\n while (start < count && points[start].skip) {\n start++;\n }\n\n // if we looped to count, start needs to be 0\n start %= count;\n\n if (loop) {\n // loop will go past count, if start > 0\n end += start;\n }\n\n while (end > start && points[end % count].skip) {\n end--;\n }\n\n // end could be more than count, normalize\n end %= count;\n\n return {start, end};\n}\n\n/**\n * Compute solid segments from Points, when spanGaps === false\n * @param {PointElement[]} points - the points\n * @param {number} start - start index\n * @param {number} max - max index (can go past count on a loop)\n * @param {boolean} loop - boolean indicating that this would be a loop if no gaps are found\n */\nfunction solidSegments(points, start, max, loop) {\n const count = points.length;\n const result = [];\n let last = start;\n let prev = points[start];\n let end;\n\n for (end = start + 1; end <= max; ++end) {\n const cur = points[end % count];\n if (cur.skip || cur.stop) {\n if (!prev.skip) {\n loop = false;\n result.push({start: start % count, end: (end - 1) % count, loop});\n // @ts-ignore\n start = last = cur.stop ? end : null;\n }\n } else {\n last = end;\n if (prev.skip) {\n start = end;\n }\n }\n prev = cur;\n }\n\n if (last !== null) {\n result.push({start: start % count, end: last % count, loop});\n }\n\n return result;\n}\n\n/**\n * Compute the continuous segments that define the whole line\n * There can be skipped points within a segment, if spanGaps is true.\n * @param {LineElement} line\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n * @private\n */\nexport function _computeSegments(line, segmentOptions) {\n const points = line.points;\n const spanGaps = line.options.spanGaps;\n const count = points.length;\n\n if (!count) {\n return [];\n }\n\n const loop = !!line._loop;\n const {start, end} = findStartAndEnd(points, count, loop, spanGaps);\n\n if (spanGaps === true) {\n return splitByStyles(line, [{start, end, loop}], points, segmentOptions);\n }\n\n const max = end < start ? end + count : end;\n const completeLoop = !!line._fullLoop && start === 0 && end === count - 1;\n return splitByStyles(line, solidSegments(points, start, max, completeLoop), points, segmentOptions);\n}\n\n/**\n * @param {Segment[]} segments\n * @param {PointElement[]} points\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n */\nfunction splitByStyles(line, segments, points, segmentOptions) {\n if (!segmentOptions || !segmentOptions.setContext || !points) {\n return segments;\n }\n return doSplitByStyles(line, segments, points, segmentOptions);\n}\n\n/**\n * @param {LineElement} line\n * @param {Segment[]} segments\n * @param {PointElement[]} points\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n */\nfunction doSplitByStyles(line, segments, points, segmentOptions) {\n const chartContext = line._chart.getContext();\n const baseStyle = readStyle(line.options);\n const {_datasetIndex: datasetIndex, options: {spanGaps}} = line;\n const count = points.length;\n const result = [];\n let prevStyle = baseStyle;\n let start = segments[0].start;\n let i = start;\n\n function addStyle(s, e, l, st) {\n const dir = spanGaps ? -1 : 1;\n if (s === e) {\n return;\n }\n // Style can not start/end on a skipped point, adjust indices accordingly\n s += count;\n while (points[s % count].skip) {\n s -= dir;\n }\n while (points[e % count].skip) {\n e += dir;\n }\n if (s % count !== e % count) {\n result.push({start: s % count, end: e % count, loop: l, style: st});\n prevStyle = st;\n start = e % count;\n }\n }\n\n for (const segment of segments) {\n start = spanGaps ? start : segment.start;\n let prev = points[start % count];\n let style;\n for (i = start + 1; i <= segment.end; i++) {\n const pt = points[i % count];\n style = readStyle(segmentOptions.setContext(createContext(chartContext, {\n type: 'segment',\n p0: prev,\n p1: pt,\n p0DataIndex: (i - 1) % count,\n p1DataIndex: i % count,\n datasetIndex\n })));\n if (styleChanged(style, prevStyle)) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n prev = pt;\n prevStyle = style;\n }\n if (start < i - 1) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n }\n\n return result;\n}\n\nfunction readStyle(options) {\n return {\n backgroundColor: options.backgroundColor,\n borderCapStyle: options.borderCapStyle,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderJoinStyle: options.borderJoinStyle,\n borderWidth: options.borderWidth,\n borderColor: options.borderColor\n };\n}\n\nfunction styleChanged(style, prevStyle) {\n if (!prevStyle) {\n return false;\n }\n const cache = [];\n const replacer = function(key, value) {\n if (!isPatternOrGradient(value)) {\n return value;\n }\n if (!cache.includes(value)) {\n cache.push(value);\n }\n return cache.indexOf(value);\n };\n return JSON.stringify(style, replacer) !== JSON.stringify(prevStyle, replacer);\n}\n","import type {Chart, ChartArea, ChartMeta, Scale, TRBL} from '../types/index.js';\n\nfunction getSizeForArea(scale: Scale, chartArea: ChartArea, field: keyof ChartArea) {\n return scale.options.clip ? scale[field] : chartArea[field];\n}\n\nfunction getDatasetArea(meta: ChartMeta, chartArea: ChartArea): TRBL {\n const {xScale, yScale} = meta;\n if (xScale && yScale) {\n return {\n left: getSizeForArea(xScale, chartArea, 'left'),\n right: getSizeForArea(xScale, chartArea, 'right'),\n top: getSizeForArea(yScale, chartArea, 'top'),\n bottom: getSizeForArea(yScale, chartArea, 'bottom')\n };\n }\n return chartArea;\n}\n\nexport function getDatasetClipArea(chart: Chart, meta: ChartMeta): TRBL | false {\n const clip = meta._clip;\n if (clip.disabled) {\n return false;\n }\n const area = getDatasetArea(meta, chart.chartArea);\n\n return {\n left: clip.left === false ? 0 : area.left - (clip.left === true ? 0 : clip.left),\n right: clip.right === false ? chart.width : area.right + (clip.right === true ? 0 : clip.right),\n top: clip.top === false ? 0 : area.top - (clip.top === true ? 0 : clip.top),\n bottom: clip.bottom === false ? chart.height : area.bottom + (clip.bottom === true ? 0 : clip.bottom)\n };\n}\n","import {requestAnimFrame} from '../helpers/helpers.extras.js';\n\n/**\n * @typedef { import('./core.animation.js').default } Animation\n * @typedef { import('./core.controller.js').default } Chart\n */\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is export for typedoc\n */\nexport class Animator {\n constructor() {\n this._request = null;\n this._charts = new Map();\n this._running = false;\n this._lastDate = undefined;\n }\n\n /**\n\t * @private\n\t */\n _notify(chart, anims, date, type) {\n const callbacks = anims.listeners[type];\n const numSteps = anims.duration;\n\n callbacks.forEach(fn => fn({\n chart,\n initial: anims.initial,\n numSteps,\n currentStep: Math.min(date - anims.start, numSteps)\n }));\n }\n\n /**\n\t * @private\n\t */\n _refresh() {\n if (this._request) {\n return;\n }\n this._running = true;\n\n this._request = requestAnimFrame.call(window, () => {\n this._update();\n this._request = null;\n\n if (this._running) {\n this._refresh();\n }\n });\n }\n\n /**\n\t * @private\n\t */\n _update(date = Date.now()) {\n let remaining = 0;\n\n this._charts.forEach((anims, chart) => {\n if (!anims.running || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n let draw = false;\n let item;\n\n for (; i >= 0; --i) {\n item = items[i];\n\n if (item._active) {\n if (item._total > anims.duration) {\n // if the animation has been updated and its duration prolonged,\n // update to total duration of current animations run (for progress event)\n anims.duration = item._total;\n }\n item.tick(date);\n draw = true;\n } else {\n // Remove the item by replacing it with last item and removing the last\n // A lot faster than splice.\n items[i] = items[items.length - 1];\n items.pop();\n }\n }\n\n if (draw) {\n chart.draw();\n this._notify(chart, anims, date, 'progress');\n }\n\n if (!items.length) {\n anims.running = false;\n this._notify(chart, anims, date, 'complete');\n anims.initial = false;\n }\n\n remaining += items.length;\n });\n\n this._lastDate = date;\n\n if (remaining === 0) {\n this._running = false;\n }\n }\n\n /**\n\t * @private\n\t */\n _getAnims(chart) {\n const charts = this._charts;\n let anims = charts.get(chart);\n if (!anims) {\n anims = {\n running: false,\n initial: true,\n items: [],\n listeners: {\n complete: [],\n progress: []\n }\n };\n charts.set(chart, anims);\n }\n return anims;\n }\n\n /**\n\t * @param {Chart} chart\n\t * @param {string} event - event name\n\t * @param {Function} cb - callback\n\t */\n listen(chart, event, cb) {\n this._getAnims(chart).listeners[event].push(cb);\n }\n\n /**\n\t * Add animations\n\t * @param {Chart} chart\n\t * @param {Animation[]} items - animations\n\t */\n add(chart, items) {\n if (!items || !items.length) {\n return;\n }\n this._getAnims(chart).items.push(...items);\n }\n\n /**\n\t * Counts number of active animations for the chart\n\t * @param {Chart} chart\n\t */\n has(chart) {\n return this._getAnims(chart).items.length > 0;\n }\n\n /**\n\t * Start animating (all charts)\n\t * @param {Chart} chart\n\t */\n start(chart) {\n const anims = this._charts.get(chart);\n if (!anims) {\n return;\n }\n anims.running = true;\n anims.start = Date.now();\n anims.duration = anims.items.reduce((acc, cur) => Math.max(acc, cur._duration), 0);\n this._refresh();\n }\n\n running(chart) {\n if (!this._running) {\n return false;\n }\n const anims = this._charts.get(chart);\n if (!anims || !anims.running || !anims.items.length) {\n return false;\n }\n return true;\n }\n\n /**\n\t * Stop all animations for the chart\n\t * @param {Chart} chart\n\t */\n stop(chart) {\n const anims = this._charts.get(chart);\n if (!anims || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n\n for (; i >= 0; --i) {\n items[i].cancel();\n }\n anims.items = [];\n this._notify(chart, anims, Date.now(), 'complete');\n }\n\n /**\n\t * Remove chart from Animator\n\t * @param {Chart} chart\n\t */\n remove(chart) {\n return this._charts.delete(chart);\n }\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Animator();\n","import effects from '../helpers/helpers.easing.js';\nimport {resolve} from '../helpers/helpers.options.js';\nimport {color as helpersColor} from '../helpers/helpers.color.js';\n\nconst transparent = 'transparent';\nconst interpolators = {\n boolean(from, to, factor) {\n return factor > 0.5 ? to : from;\n },\n /**\n * @param {string} from\n * @param {string} to\n * @param {number} factor\n */\n color(from, to, factor) {\n const c0 = helpersColor(from || transparent);\n const c1 = c0.valid && helpersColor(to || transparent);\n return c1 && c1.valid\n ? c1.mix(c0, factor).hexString()\n : to;\n },\n number(from, to, factor) {\n return from + (to - from) * factor;\n }\n};\n\nexport default class Animation {\n constructor(cfg, target, prop, to) {\n const currentValue = target[prop];\n\n to = resolve([cfg.to, to, currentValue, cfg.from]);\n const from = resolve([cfg.from, currentValue, to]);\n\n this._active = true;\n this._fn = cfg.fn || interpolators[cfg.type || typeof from];\n this._easing = effects[cfg.easing] || effects.linear;\n this._start = Math.floor(Date.now() + (cfg.delay || 0));\n this._duration = this._total = Math.floor(cfg.duration);\n this._loop = !!cfg.loop;\n this._target = target;\n this._prop = prop;\n this._from = from;\n this._to = to;\n this._promises = undefined;\n }\n\n active() {\n return this._active;\n }\n\n update(cfg, to, date) {\n if (this._active) {\n this._notify(false);\n\n const currentValue = this._target[this._prop];\n const elapsed = date - this._start;\n const remain = this._duration - elapsed;\n this._start = date;\n this._duration = Math.floor(Math.max(remain, cfg.duration));\n this._total += elapsed;\n this._loop = !!cfg.loop;\n this._to = resolve([cfg.to, to, currentValue, cfg.from]);\n this._from = resolve([cfg.from, currentValue, to]);\n }\n }\n\n cancel() {\n if (this._active) {\n // update current evaluated value, for smoother animations\n this.tick(Date.now());\n this._active = false;\n this._notify(false);\n }\n }\n\n tick(date) {\n const elapsed = date - this._start;\n const duration = this._duration;\n const prop = this._prop;\n const from = this._from;\n const loop = this._loop;\n const to = this._to;\n let factor;\n\n this._active = from !== to && (loop || (elapsed < duration));\n\n if (!this._active) {\n this._target[prop] = to;\n this._notify(true);\n return;\n }\n\n if (elapsed < 0) {\n this._target[prop] = from;\n return;\n }\n\n factor = (elapsed / duration) % 2;\n factor = loop && factor > 1 ? 2 - factor : factor;\n factor = this._easing(Math.min(1, Math.max(0, factor)));\n\n this._target[prop] = this._fn(from, to, factor);\n }\n\n wait() {\n const promises = this._promises || (this._promises = []);\n return new Promise((res, rej) => {\n promises.push({res, rej});\n });\n }\n\n _notify(resolved) {\n const method = resolved ? 'res' : 'rej';\n const promises = this._promises || [];\n for (let i = 0; i < promises.length; i++) {\n promises[i][method]();\n }\n }\n}\n","import animator from './core.animator.js';\nimport Animation from './core.animation.js';\nimport defaults from './core.defaults.js';\nimport {isArray, isObject} from '../helpers/helpers.core.js';\n\nexport default class Animations {\n constructor(chart, config) {\n this._chart = chart;\n this._properties = new Map();\n this.configure(config);\n }\n\n configure(config) {\n if (!isObject(config)) {\n return;\n }\n\n const animationOptions = Object.keys(defaults.animation);\n const animatedProps = this._properties;\n\n Object.getOwnPropertyNames(config).forEach(key => {\n const cfg = config[key];\n if (!isObject(cfg)) {\n return;\n }\n const resolved = {};\n for (const option of animationOptions) {\n resolved[option] = cfg[option];\n }\n\n (isArray(cfg.properties) && cfg.properties || [key]).forEach((prop) => {\n if (prop === key || !animatedProps.has(prop)) {\n animatedProps.set(prop, resolved);\n }\n });\n });\n }\n\n /**\n\t * Utility to handle animation of `options`.\n\t * @private\n\t */\n _animateOptions(target, values) {\n const newOptions = values.options;\n const options = resolveTargetOptions(target, newOptions);\n if (!options) {\n return [];\n }\n\n const animations = this._createAnimations(options, newOptions);\n if (newOptions.$shared) {\n // Going to shared options:\n // After all animations are done, assign the shared options object to the element\n // So any new updates to the shared options are observed\n awaitAll(target.options.$animations, newOptions).then(() => {\n target.options = newOptions;\n }, () => {\n // rejected, noop\n });\n }\n\n return animations;\n }\n\n /**\n\t * @private\n\t */\n _createAnimations(target, values) {\n const animatedProps = this._properties;\n const animations = [];\n const running = target.$animations || (target.$animations = {});\n const props = Object.keys(values);\n const date = Date.now();\n let i;\n\n for (i = props.length - 1; i >= 0; --i) {\n const prop = props[i];\n if (prop.charAt(0) === '$') {\n continue;\n }\n\n if (prop === 'options') {\n animations.push(...this._animateOptions(target, values));\n continue;\n }\n const value = values[prop];\n let animation = running[prop];\n const cfg = animatedProps.get(prop);\n\n if (animation) {\n if (cfg && animation.active()) {\n // There is an existing active animation, let's update that\n animation.update(cfg, value, date);\n continue;\n } else {\n animation.cancel();\n }\n }\n if (!cfg || !cfg.duration) {\n // not animated, set directly to new value\n target[prop] = value;\n continue;\n }\n\n running[prop] = animation = new Animation(cfg, target, prop, value);\n animations.push(animation);\n }\n return animations;\n }\n\n\n /**\n\t * Update `target` properties to new values, using configured animations\n\t * @param {object} target - object to update\n\t * @param {object} values - new target properties\n\t * @returns {boolean|undefined} - `true` if animations were started\n\t **/\n update(target, values) {\n if (this._properties.size === 0) {\n // Nothing is animated, just apply the new values.\n Object.assign(target, values);\n return;\n }\n\n const animations = this._createAnimations(target, values);\n\n if (animations.length) {\n animator.add(this._chart, animations);\n return true;\n }\n }\n}\n\nfunction awaitAll(animations, properties) {\n const running = [];\n const keys = Object.keys(properties);\n for (let i = 0; i < keys.length; i++) {\n const anim = animations[keys[i]];\n if (anim && anim.active()) {\n running.push(anim.wait());\n }\n }\n // @ts-ignore\n return Promise.all(running);\n}\n\nfunction resolveTargetOptions(target, newOptions) {\n if (!newOptions) {\n return;\n }\n let options = target.options;\n if (!options) {\n target.options = newOptions;\n return;\n }\n if (options.$shared) {\n // Going from shared options to distinct one:\n // Create new options object containing the old shared values and start updating that.\n target.options = options = Object.assign({}, options, {$shared: false, $animations: {}});\n }\n return options;\n}\n","import Animations from './core.animations.js';\nimport defaults from './core.defaults.js';\nimport {isArray, isFinite, isObject, valueOrDefault, resolveObjectKey, defined} from '../helpers/helpers.core.js';\nimport {listenArrayEvents, unlistenArrayEvents} from '../helpers/helpers.collection.js';\nimport {createContext, sign} from '../helpers/index.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('./core.scale.js').default } Scale\n */\n\nfunction scaleClip(scale, allowedOverflow) {\n const opts = scale && scale.options || {};\n const reverse = opts.reverse;\n const min = opts.min === undefined ? allowedOverflow : 0;\n const max = opts.max === undefined ? allowedOverflow : 0;\n return {\n start: reverse ? max : min,\n end: reverse ? min : max\n };\n}\n\nfunction defaultClip(xScale, yScale, allowedOverflow) {\n if (allowedOverflow === false) {\n return false;\n }\n const x = scaleClip(xScale, allowedOverflow);\n const y = scaleClip(yScale, allowedOverflow);\n\n return {\n top: y.end,\n right: x.end,\n bottom: y.start,\n left: x.start\n };\n}\n\nfunction toClip(value) {\n let t, r, b, l;\n\n if (isObject(value)) {\n t = value.top;\n r = value.right;\n b = value.bottom;\n l = value.left;\n } else {\n t = r = b = l = value;\n }\n\n return {\n top: t,\n right: r,\n bottom: b,\n left: l,\n disabled: value === false\n };\n}\n\nfunction getSortedDatasetIndices(chart, filterVisible) {\n const keys = [];\n const metasets = chart._getSortedDatasetMetas(filterVisible);\n let i, ilen;\n\n for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n keys.push(metasets[i].index);\n }\n return keys;\n}\n\nfunction applyStack(stack, value, dsIndex, options = {}) {\n const keys = stack.keys;\n const singleMode = options.mode === 'single';\n let i, ilen, datasetIndex, otherValue;\n\n if (value === null) {\n return;\n }\n\n let found = false;\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n datasetIndex = +keys[i];\n if (datasetIndex === dsIndex) {\n found = true;\n if (options.all) {\n continue;\n }\n break;\n }\n otherValue = stack.values[datasetIndex];\n if (isFinite(otherValue) && (singleMode || (value === 0 || sign(value) === sign(otherValue)))) {\n value += otherValue;\n }\n }\n\n if (!found && !options.all) {\n return 0;\n }\n\n return value;\n}\n\nfunction convertObjectDataToArray(data, meta) {\n const {iScale, vScale} = meta;\n const iAxisKey = iScale.axis === 'x' ? 'x' : 'y';\n const vAxisKey = vScale.axis === 'x' ? 'x' : 'y';\n const keys = Object.keys(data);\n const adata = new Array(keys.length);\n let i, ilen, key;\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n key = keys[i];\n adata[i] = {\n [iAxisKey]: key,\n [vAxisKey]: data[key]\n };\n }\n return adata;\n}\n\nfunction isStacked(scale, meta) {\n const stacked = scale && scale.options.stacked;\n return stacked || (stacked === undefined && meta.stack !== undefined);\n}\n\nfunction getStackKey(indexScale, valueScale, meta) {\n return `${indexScale.id}.${valueScale.id}.${meta.stack || meta.type}`;\n}\n\nfunction getUserBounds(scale) {\n const {min, max, minDefined, maxDefined} = scale.getUserBounds();\n return {\n min: minDefined ? min : Number.NEGATIVE_INFINITY,\n max: maxDefined ? max : Number.POSITIVE_INFINITY\n };\n}\n\nfunction getOrCreateStack(stacks, stackKey, indexValue) {\n const subStack = stacks[stackKey] || (stacks[stackKey] = {});\n return subStack[indexValue] || (subStack[indexValue] = {});\n}\n\nfunction getLastIndexInStack(stack, vScale, positive, type) {\n for (const meta of vScale.getMatchingVisibleMetas(type).reverse()) {\n const value = stack[meta.index];\n if ((positive && value > 0) || (!positive && value < 0)) {\n return meta.index;\n }\n }\n\n return null;\n}\n\nfunction updateStacks(controller, parsed) {\n const {chart, _cachedMeta: meta} = controller;\n const stacks = chart._stacks || (chart._stacks = {}); // map structure is {stackKey: {datasetIndex: value}}\n const {iScale, vScale, index: datasetIndex} = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const key = getStackKey(iScale, vScale, meta);\n const ilen = parsed.length;\n let stack;\n\n for (let i = 0; i < ilen; ++i) {\n const item = parsed[i];\n const {[iAxis]: index, [vAxis]: value} = item;\n const itemStacks = item._stacks || (item._stacks = {});\n stack = itemStacks[vAxis] = getOrCreateStack(stacks, key, index);\n stack[datasetIndex] = value;\n\n stack._top = getLastIndexInStack(stack, vScale, true, meta.type);\n stack._bottom = getLastIndexInStack(stack, vScale, false, meta.type);\n\n const visualValues = stack._visualValues || (stack._visualValues = {});\n visualValues[datasetIndex] = value;\n }\n}\n\nfunction getFirstScaleId(chart, axis) {\n const scales = chart.scales;\n return Object.keys(scales).filter(key => scales[key].axis === axis).shift();\n}\n\nfunction createDatasetContext(parent, index) {\n return createContext(parent,\n {\n active: false,\n dataset: undefined,\n datasetIndex: index,\n index,\n mode: 'default',\n type: 'dataset'\n }\n );\n}\n\nfunction createDataContext(parent, index, element) {\n return createContext(parent, {\n active: false,\n dataIndex: index,\n parsed: undefined,\n raw: undefined,\n element,\n index,\n mode: 'default',\n type: 'data'\n });\n}\n\nfunction clearStacks(meta, items) {\n // Not using meta.index here, because it might be already updated if the dataset changed location\n const datasetIndex = meta.controller.index;\n const axis = meta.vScale && meta.vScale.axis;\n if (!axis) {\n return;\n }\n\n items = items || meta._parsed;\n for (const parsed of items) {\n const stacks = parsed._stacks;\n if (!stacks || stacks[axis] === undefined || stacks[axis][datasetIndex] === undefined) {\n return;\n }\n delete stacks[axis][datasetIndex];\n if (stacks[axis]._visualValues !== undefined && stacks[axis]._visualValues[datasetIndex] !== undefined) {\n delete stacks[axis]._visualValues[datasetIndex];\n }\n }\n}\n\nconst isDirectUpdateMode = (mode) => mode === 'reset' || mode === 'none';\nconst cloneIfNotShared = (cached, shared) => shared ? cached : Object.assign({}, cached);\nconst createStack = (canStack, meta, chart) => canStack && !meta.hidden && meta._stacked\n && {keys: getSortedDatasetIndices(chart, true), values: null};\n\nexport default class DatasetController {\n\n /**\n * @type {any}\n */\n static defaults = {};\n\n /**\n * Element type used to generate a meta dataset (e.g. Chart.element.LineElement).\n */\n static datasetElementType = null;\n\n /**\n * Element type used to generate a meta data (e.g. Chart.element.PointElement).\n */\n static dataElementType = null;\n\n /**\n\t * @param {Chart} chart\n\t * @param {number} datasetIndex\n\t */\n constructor(chart, datasetIndex) {\n this.chart = chart;\n this._ctx = chart.ctx;\n this.index = datasetIndex;\n this._cachedDataOpts = {};\n this._cachedMeta = this.getMeta();\n this._type = this._cachedMeta.type;\n this.options = undefined;\n /** @type {boolean | object} */\n this._parsing = false;\n this._data = undefined;\n this._objectData = undefined;\n this._sharedOptions = undefined;\n this._drawStart = undefined;\n this._drawCount = undefined;\n this.enableOptionSharing = false;\n this.supportsDecimation = false;\n this.$context = undefined;\n this._syncList = [];\n this.datasetElementType = new.target.datasetElementType;\n this.dataElementType = new.target.dataElementType;\n\n this.initialize();\n }\n\n initialize() {\n const meta = this._cachedMeta;\n this.configure();\n this.linkScales();\n meta._stacked = isStacked(meta.vScale, meta);\n this.addElements();\n\n if (this.options.fill && !this.chart.isPluginEnabled('filler')) {\n console.warn(\"Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options\");\n }\n }\n\n updateIndex(datasetIndex) {\n if (this.index !== datasetIndex) {\n clearStacks(this._cachedMeta);\n }\n this.index = datasetIndex;\n }\n\n linkScales() {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n\n const chooseId = (axis, x, y, r) => axis === 'x' ? x : axis === 'r' ? r : y;\n\n const xid = meta.xAxisID = valueOrDefault(dataset.xAxisID, getFirstScaleId(chart, 'x'));\n const yid = meta.yAxisID = valueOrDefault(dataset.yAxisID, getFirstScaleId(chart, 'y'));\n const rid = meta.rAxisID = valueOrDefault(dataset.rAxisID, getFirstScaleId(chart, 'r'));\n const indexAxis = meta.indexAxis;\n const iid = meta.iAxisID = chooseId(indexAxis, xid, yid, rid);\n const vid = meta.vAxisID = chooseId(indexAxis, yid, xid, rid);\n meta.xScale = this.getScaleForId(xid);\n meta.yScale = this.getScaleForId(yid);\n meta.rScale = this.getScaleForId(rid);\n meta.iScale = this.getScaleForId(iid);\n meta.vScale = this.getScaleForId(vid);\n }\n\n getDataset() {\n return this.chart.data.datasets[this.index];\n }\n\n getMeta() {\n return this.chart.getDatasetMeta(this.index);\n }\n\n /**\n\t * @param {string} scaleID\n\t * @return {Scale}\n\t */\n getScaleForId(scaleID) {\n return this.chart.scales[scaleID];\n }\n\n /**\n\t * @private\n\t */\n _getOtherScale(scale) {\n const meta = this._cachedMeta;\n return scale === meta.iScale\n ? meta.vScale\n : meta.iScale;\n }\n\n reset() {\n this._update('reset');\n }\n\n /**\n\t * @private\n\t */\n _destroy() {\n const meta = this._cachedMeta;\n if (this._data) {\n unlistenArrayEvents(this._data, this);\n }\n if (meta._stacked) {\n clearStacks(meta);\n }\n }\n\n /**\n\t * @private\n\t */\n _dataCheck() {\n const dataset = this.getDataset();\n const data = dataset.data || (dataset.data = []);\n const _data = this._data;\n\n // In order to correctly handle data addition/deletion animation (and thus simulate\n // real-time charts), we need to monitor these data modifications and synchronize\n // the internal metadata accordingly.\n\n if (isObject(data)) {\n const meta = this._cachedMeta;\n this._data = convertObjectDataToArray(data, meta);\n } else if (_data !== data) {\n if (_data) {\n // This case happens when the user replaced the data array instance.\n unlistenArrayEvents(_data, this);\n // Discard old parsed data and stacks\n const meta = this._cachedMeta;\n clearStacks(meta);\n meta._parsed = [];\n }\n if (data && Object.isExtensible(data)) {\n listenArrayEvents(data, this);\n }\n this._syncList = [];\n this._data = data;\n }\n }\n\n addElements() {\n const meta = this._cachedMeta;\n\n this._dataCheck();\n\n if (this.datasetElementType) {\n meta.dataset = new this.datasetElementType();\n }\n }\n\n buildOrUpdateElements(resetNewElements) {\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n let stackChanged = false;\n\n this._dataCheck();\n\n // make sure cached _stacked status is current\n const oldStacked = meta._stacked;\n meta._stacked = isStacked(meta.vScale, meta);\n\n // detect change in stack option\n if (meta.stack !== dataset.stack) {\n stackChanged = true;\n // remove values from old stack\n clearStacks(meta);\n meta.stack = dataset.stack;\n }\n\n // Re-sync meta data in case the user replaced the data array or if we missed\n // any updates and so make sure that we handle number of datapoints changing.\n this._resyncElements(resetNewElements);\n\n // if stack changed, update stack values for the whole dataset\n if (stackChanged || oldStacked !== meta._stacked) {\n updateStacks(this, meta._parsed);\n meta._stacked = isStacked(meta.vScale, meta);\n }\n }\n\n /**\n\t * Merges user-supplied and default dataset-level options\n\t * @private\n\t */\n configure() {\n const config = this.chart.config;\n const scopeKeys = config.datasetScopeKeys(this._type);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys, true);\n this.options = config.createResolver(scopes, this.getContext());\n this._parsing = this.options.parsing;\n this._cachedDataOpts = {};\n }\n\n /**\n\t * @param {number} start\n\t * @param {number} count\n\t */\n parse(start, count) {\n const {_cachedMeta: meta, _data: data} = this;\n const {iScale, _stacked} = meta;\n const iAxis = iScale.axis;\n\n let sorted = start === 0 && count === data.length ? true : meta._sorted;\n let prev = start > 0 && meta._parsed[start - 1];\n let i, cur, parsed;\n\n if (this._parsing === false) {\n meta._parsed = data;\n meta._sorted = true;\n parsed = data;\n } else {\n if (isArray(data[start])) {\n parsed = this.parseArrayData(meta, data, start, count);\n } else if (isObject(data[start])) {\n parsed = this.parseObjectData(meta, data, start, count);\n } else {\n parsed = this.parsePrimitiveData(meta, data, start, count);\n }\n\n const isNotInOrderComparedToPrev = () => cur[iAxis] === null || (prev && cur[iAxis] < prev[iAxis]);\n for (i = 0; i < count; ++i) {\n meta._parsed[i + start] = cur = parsed[i];\n if (sorted) {\n if (isNotInOrderComparedToPrev()) {\n sorted = false;\n }\n prev = cur;\n }\n }\n meta._sorted = sorted;\n }\n\n if (_stacked) {\n updateStacks(this, parsed);\n }\n }\n\n /**\n\t * Parse array of primitive values\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [1,3,4]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id.\n\t * Example: {xScale0: 0, yScale0: 1}\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n const {iScale, vScale} = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = new Array(count);\n let i, ilen, index;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n parsed[i] = {\n [iAxis]: singleScale || iScale.parse(labels[index], index),\n [vAxis]: vScale.parse(data[index], index)\n };\n }\n return parsed;\n }\n\n /**\n\t * Parse array of arrays\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [[1,2],[3,4]]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id.\n\t * Example: {x: 0, y: 1}\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const parsed = new Array(count);\n let i, ilen, index, item;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(item[0], index),\n y: yScale.parse(item[1], index)\n };\n }\n return parsed;\n }\n\n /**\n\t * Parse array of objects\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [{x:1, y:5}, {x:2, y:10}]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id. _custom is optional\n\t * Example: {xScale0: 0, yScale0: 1, _custom: {r: 10, foo: 'bar'}}\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n const parsed = new Array(count);\n let i, ilen, index, item;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(resolveObjectKey(item, xAxisKey), index),\n y: yScale.parse(resolveObjectKey(item, yAxisKey), index)\n };\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n getParsed(index) {\n return this._cachedMeta._parsed[index];\n }\n\n /**\n\t * @protected\n\t */\n getDataElement(index) {\n return this._cachedMeta.data[index];\n }\n\n /**\n\t * @protected\n\t */\n applyStack(scale, parsed, mode) {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const value = parsed[scale.axis];\n const stack = {\n keys: getSortedDatasetIndices(chart, true),\n values: parsed._stacks[scale.axis]._visualValues\n };\n return applyStack(stack, value, meta.index, {mode});\n }\n\n /**\n\t * @protected\n\t */\n updateRangeFromParsed(range, scale, parsed, stack) {\n const parsedValue = parsed[scale.axis];\n let value = parsedValue === null ? NaN : parsedValue;\n const values = stack && parsed._stacks[scale.axis];\n if (stack && values) {\n stack.values = values;\n value = applyStack(stack, parsedValue, this._cachedMeta.index);\n }\n range.min = Math.min(range.min, value);\n range.max = Math.max(range.max, value);\n }\n\n /**\n\t * @protected\n\t */\n getMinMax(scale, canStack) {\n const meta = this._cachedMeta;\n const _parsed = meta._parsed;\n const sorted = meta._sorted && scale === meta.iScale;\n const ilen = _parsed.length;\n const otherScale = this._getOtherScale(scale);\n const stack = createStack(canStack, meta, this.chart);\n const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n const {min: otherMin, max: otherMax} = getUserBounds(otherScale);\n let i, parsed;\n\n function _skip() {\n parsed = _parsed[i];\n const otherValue = parsed[otherScale.axis];\n return !isFinite(parsed[scale.axis]) || otherMin > otherValue || otherMax < otherValue;\n }\n\n for (i = 0; i < ilen; ++i) {\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n if (sorted) {\n // if the data is sorted, we don't need to check further from this end of array\n break;\n }\n }\n if (sorted) {\n // in the sorted case, find first non-skipped value from other end of array\n for (i = ilen - 1; i >= 0; --i) {\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n break;\n }\n }\n return range;\n }\n\n getAllParsedValues(scale) {\n const parsed = this._cachedMeta._parsed;\n const values = [];\n let i, ilen, value;\n\n for (i = 0, ilen = parsed.length; i < ilen; ++i) {\n value = parsed[i][scale.axis];\n if (isFinite(value)) {\n values.push(value);\n }\n }\n return values;\n }\n\n /**\n\t * @return {number|boolean}\n\t * @protected\n\t */\n getMaxOverflow() {\n return false;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const parsed = this.getParsed(index);\n return {\n label: iScale ? '' + iScale.getLabelForValue(parsed[iScale.axis]) : '',\n value: vScale ? '' + vScale.getLabelForValue(parsed[vScale.axis]) : ''\n };\n }\n\n /**\n\t * @private\n\t */\n _update(mode) {\n const meta = this._cachedMeta;\n this.update(mode || 'default');\n meta._clip = toClip(valueOrDefault(this.options.clip, defaultClip(meta.xScale, meta.yScale, this.getMaxOverflow())));\n }\n\n /**\n\t * @param {string} mode\n\t */\n update(mode) {} // eslint-disable-line no-unused-vars\n\n draw() {\n const ctx = this._ctx;\n const chart = this.chart;\n const meta = this._cachedMeta;\n const elements = meta.data || [];\n const area = chart.chartArea;\n const active = [];\n const start = this._drawStart || 0;\n const count = this._drawCount || (elements.length - start);\n const drawActiveElementsOnTop = this.options.drawActiveElementsOnTop;\n let i;\n\n if (meta.dataset) {\n meta.dataset.draw(ctx, area, start, count);\n }\n\n for (i = start; i < start + count; ++i) {\n const element = elements[i];\n if (element.hidden) {\n continue;\n }\n if (element.active && drawActiveElementsOnTop) {\n active.push(element);\n } else {\n element.draw(ctx, area);\n }\n }\n\n for (i = 0; i < active.length; ++i) {\n active[i].draw(ctx, area);\n }\n }\n\n /**\n\t * Returns a set of predefined style properties that should be used to represent the dataset\n\t * or the data if the index is specified\n\t * @param {number} index - data index\n\t * @param {boolean} [active] - true if hover\n\t * @return {object} style object\n\t */\n getStyle(index, active) {\n const mode = active ? 'active' : 'default';\n return index === undefined && this._cachedMeta.dataset\n ? this.resolveDatasetElementOptions(mode)\n : this.resolveDataElementOptions(index || 0, mode);\n }\n\n /**\n\t * @protected\n\t */\n getContext(index, active, mode) {\n const dataset = this.getDataset();\n let context;\n if (index >= 0 && index < this._cachedMeta.data.length) {\n const element = this._cachedMeta.data[index];\n context = element.$context ||\n (element.$context = createDataContext(this.getContext(), index, element));\n context.parsed = this.getParsed(index);\n context.raw = dataset.data[index];\n context.index = context.dataIndex = index;\n } else {\n context = this.$context ||\n (this.$context = createDatasetContext(this.chart.getContext(), this.index));\n context.dataset = dataset;\n context.index = context.datasetIndex = this.index;\n }\n\n context.active = !!active;\n context.mode = mode;\n return context;\n }\n\n /**\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDatasetElementOptions(mode) {\n return this._resolveElementOptions(this.datasetElementType.id, mode);\n }\n\n /**\n\t * @param {number} index\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDataElementOptions(index, mode) {\n return this._resolveElementOptions(this.dataElementType.id, mode, index);\n }\n\n /**\n\t * @private\n\t */\n _resolveElementOptions(elementType, mode = 'default', index) {\n const active = mode === 'active';\n const cache = this._cachedDataOpts;\n const cacheKey = elementType + '-' + mode;\n const cached = cache[cacheKey];\n const sharing = this.enableOptionSharing && defined(index);\n if (cached) {\n return cloneIfNotShared(cached, sharing);\n }\n const config = this.chart.config;\n const scopeKeys = config.datasetElementScopeKeys(this._type, elementType);\n const prefixes = active ? [`${elementType}Hover`, 'hover', elementType, ''] : [elementType, ''];\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n const names = Object.keys(defaults.elements[elementType]);\n // context is provided as a function, and is called only if needed,\n // so we don't create a context for each element if not needed.\n const context = () => this.getContext(index, active, mode);\n const values = config.resolveNamedOptions(scopes, names, context, prefixes);\n\n if (values.$shared) {\n // `$shared` indicates this set of options can be shared between multiple elements.\n // Sharing is used to reduce number of properties to change during animation.\n values.$shared = sharing;\n\n // We cache options by `mode`, which can be 'active' for example. This enables us\n // to have the 'active' element options and 'default' options to switch between\n // when interacting.\n cache[cacheKey] = Object.freeze(cloneIfNotShared(values, sharing));\n }\n\n return values;\n }\n\n\n /**\n\t * @private\n\t */\n _resolveAnimations(index, transition, active) {\n const chart = this.chart;\n const cache = this._cachedDataOpts;\n const cacheKey = `animation-${transition}`;\n const cached = cache[cacheKey];\n if (cached) {\n return cached;\n }\n let options;\n if (chart.options.animation !== false) {\n const config = this.chart.config;\n const scopeKeys = config.datasetAnimationScopeKeys(this._type, transition);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n options = config.createResolver(scopes, this.getContext(index, active, transition));\n }\n const animations = new Animations(chart, options && options.animations);\n if (options && options._cacheable) {\n cache[cacheKey] = Object.freeze(animations);\n }\n return animations;\n }\n\n /**\n\t * Utility for getting the options object shared between elements\n\t * @protected\n\t */\n getSharedOptions(options) {\n if (!options.$shared) {\n return;\n }\n return this._sharedOptions || (this._sharedOptions = Object.assign({}, options));\n }\n\n /**\n\t * Utility for determining if `options` should be included in the updated properties\n\t * @protected\n\t */\n includeOptions(mode, sharedOptions) {\n return !sharedOptions || isDirectUpdateMode(mode) || this.chart._animationsDisabled;\n }\n\n /**\n * @todo v4, rename to getSharedOptions and remove excess functions\n */\n _getSharedOptions(start, mode) {\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const previouslySharedOptions = this._sharedOptions;\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions) || (sharedOptions !== previouslySharedOptions);\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n return {sharedOptions, includeOptions};\n }\n\n /**\n\t * Utility for updating an element with new properties, using animations when appropriate.\n\t * @protected\n\t */\n updateElement(element, index, properties, mode) {\n if (isDirectUpdateMode(mode)) {\n Object.assign(element, properties);\n } else {\n this._resolveAnimations(index, mode).update(element, properties);\n }\n }\n\n /**\n\t * Utility to animate the shared options, that are potentially affecting multiple elements.\n\t * @protected\n\t */\n updateSharedOptions(sharedOptions, mode, newOptions) {\n if (sharedOptions && !isDirectUpdateMode(mode)) {\n this._resolveAnimations(undefined, mode).update(sharedOptions, newOptions);\n }\n }\n\n /**\n\t * @private\n\t */\n _setStyle(element, index, mode, active) {\n element.active = active;\n const options = this.getStyle(index, active);\n this._resolveAnimations(index, mode, active).update(element, {\n // When going from active to inactive, we need to update to the shared options.\n // This way the once hovered element will end up with the same original shared options instance, after animation.\n options: (!active && this.getSharedOptions(options)) || options\n });\n }\n\n removeHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', false);\n }\n\n setHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', true);\n }\n\n /**\n\t * @private\n\t */\n _removeDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n\n if (element) {\n this._setStyle(element, undefined, 'active', false);\n }\n }\n\n /**\n\t * @private\n\t */\n _setDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n\n if (element) {\n this._setStyle(element, undefined, 'active', true);\n }\n }\n\n /**\n\t * @private\n\t */\n _resyncElements(resetNewElements) {\n const data = this._data;\n const elements = this._cachedMeta.data;\n\n // Apply changes detected through array listeners\n for (const [method, arg1, arg2] of this._syncList) {\n this[method](arg1, arg2);\n }\n this._syncList = [];\n\n const numMeta = elements.length;\n const numData = data.length;\n const count = Math.min(numData, numMeta);\n\n if (count) {\n // TODO: It is not optimal to always parse the old data\n // This is done because we are not detecting direct assignments:\n // chart.data.datasets[0].data[5] = 10;\n // chart.data.datasets[0].data[5].y = 10;\n this.parse(0, count);\n }\n\n if (numData > numMeta) {\n this._insertElements(numMeta, numData - numMeta, resetNewElements);\n } else if (numData < numMeta) {\n this._removeElements(numData, numMeta - numData);\n }\n }\n\n /**\n\t * @private\n\t */\n _insertElements(start, count, resetNewElements = true) {\n const meta = this._cachedMeta;\n const data = meta.data;\n const end = start + count;\n let i;\n\n const move = (arr) => {\n arr.length += count;\n for (i = arr.length - 1; i >= end; i--) {\n arr[i] = arr[i - count];\n }\n };\n move(data);\n\n for (i = start; i < end; ++i) {\n data[i] = new this.dataElementType();\n }\n\n if (this._parsing) {\n move(meta._parsed);\n }\n this.parse(start, count);\n\n if (resetNewElements) {\n this.updateElements(data, start, count, 'reset');\n }\n }\n\n updateElements(element, start, count, mode) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * @private\n\t */\n _removeElements(start, count) {\n const meta = this._cachedMeta;\n if (this._parsing) {\n const removed = meta._parsed.splice(start, count);\n if (meta._stacked) {\n clearStacks(meta, removed);\n }\n }\n meta.data.splice(start, count);\n }\n\n /**\n\t * @private\n */\n _sync(args) {\n if (this._parsing) {\n this._syncList.push(args);\n } else {\n const [method, arg1, arg2] = args;\n this[method](arg1, arg2);\n }\n this.chart._dataChanges.push([this.index, ...args]);\n }\n\n _onDataPush() {\n const count = arguments.length;\n this._sync(['_insertElements', this.getDataset().data.length - count, count]);\n }\n\n _onDataPop() {\n this._sync(['_removeElements', this._cachedMeta.data.length - 1, 1]);\n }\n\n _onDataShift() {\n this._sync(['_removeElements', 0, 1]);\n }\n\n _onDataSplice(start, count) {\n if (count) {\n this._sync(['_removeElements', start, count]);\n }\n const newCount = arguments.length - 2;\n if (newCount) {\n this._sync(['_insertElements', start, newCount]);\n }\n }\n\n _onDataUnshift() {\n this._sync(['_insertElements', 0, arguments.length]);\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {\n _arrayUnique, isArray, isNullOrUndef,\n valueOrDefault, resolveObjectKey, sign, defined\n} from '../helpers/index.js';\n\nfunction getAllScaleValues(scale, type) {\n if (!scale._cache.$bar) {\n const visibleMetas = scale.getMatchingVisibleMetas(type);\n let values = [];\n\n for (let i = 0, ilen = visibleMetas.length; i < ilen; i++) {\n values = values.concat(visibleMetas[i].controller.getAllParsedValues(scale));\n }\n scale._cache.$bar = _arrayUnique(values.sort((a, b) => a - b));\n }\n return scale._cache.$bar;\n}\n\n/**\n * Computes the \"optimal\" sample size to maintain bars equally sized while preventing overlap.\n * @private\n */\nfunction computeMinSampleSize(meta) {\n const scale = meta.iScale;\n const values = getAllScaleValues(scale, meta.type);\n let min = scale._length;\n let i, ilen, curr, prev;\n const updateMinAndPrev = () => {\n if (curr === 32767 || curr === -32768) {\n // Ignore truncated pixels\n return;\n }\n if (defined(prev)) {\n // curr - prev === 0 is ignored\n min = Math.min(min, Math.abs(curr - prev) || min);\n }\n prev = curr;\n };\n\n for (i = 0, ilen = values.length; i < ilen; ++i) {\n curr = scale.getPixelForValue(values[i]);\n updateMinAndPrev();\n }\n\n prev = undefined;\n for (i = 0, ilen = scale.ticks.length; i < ilen; ++i) {\n curr = scale.getPixelForTick(i);\n updateMinAndPrev();\n }\n\n return min;\n}\n\n/**\n * Computes an \"ideal\" category based on the absolute bar thickness or, if undefined or null,\n * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This\n * mode currently always generates bars equally sized (until we introduce scriptable options?).\n * @private\n */\nfunction computeFitCategoryTraits(index, ruler, options, stackCount) {\n const thickness = options.barThickness;\n let size, ratio;\n\n if (isNullOrUndef(thickness)) {\n size = ruler.min * options.categoryPercentage;\n ratio = options.barPercentage;\n } else {\n // When bar thickness is enforced, category and bar percentages are ignored.\n // Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%')\n // and deprecate barPercentage since this value is ignored when thickness is absolute.\n size = thickness * stackCount;\n ratio = 1;\n }\n\n return {\n chunk: size / stackCount,\n ratio,\n start: ruler.pixels[index] - (size / 2)\n };\n}\n\n/**\n * Computes an \"optimal\" category that globally arranges bars side by side (no gap when\n * percentage options are 1), based on the previous and following categories. This mode\n * generates bars with different widths when data are not evenly spaced.\n * @private\n */\nfunction computeFlexCategoryTraits(index, ruler, options, stackCount) {\n const pixels = ruler.pixels;\n const curr = pixels[index];\n let prev = index > 0 ? pixels[index - 1] : null;\n let next = index < pixels.length - 1 ? pixels[index + 1] : null;\n const percent = options.categoryPercentage;\n\n if (prev === null) {\n // first data: its size is double based on the next point or,\n // if it's also the last data, we use the scale size.\n prev = curr - (next === null ? ruler.end - ruler.start : next - curr);\n }\n\n if (next === null) {\n // last data: its size is also double based on the previous point.\n next = curr + curr - prev;\n }\n\n const start = curr - (curr - Math.min(prev, next)) / 2 * percent;\n const size = Math.abs(next - prev) / 2 * percent;\n\n return {\n chunk: size / stackCount,\n ratio: options.barPercentage,\n start\n };\n}\n\nfunction parseFloatBar(entry, item, vScale, i) {\n const startValue = vScale.parse(entry[0], i);\n const endValue = vScale.parse(entry[1], i);\n const min = Math.min(startValue, endValue);\n const max = Math.max(startValue, endValue);\n let barStart = min;\n let barEnd = max;\n\n if (Math.abs(min) > Math.abs(max)) {\n barStart = max;\n barEnd = min;\n }\n\n // Store `barEnd` (furthest away from origin) as parsed value,\n // to make stacking straight forward\n item[vScale.axis] = barEnd;\n\n item._custom = {\n barStart,\n barEnd,\n start: startValue,\n end: endValue,\n min,\n max\n };\n}\n\nfunction parseValue(entry, item, vScale, i) {\n if (isArray(entry)) {\n parseFloatBar(entry, item, vScale, i);\n } else {\n item[vScale.axis] = vScale.parse(entry, i);\n }\n return item;\n}\n\nfunction parseArrayOrPrimitive(meta, data, start, count) {\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = [];\n let i, ilen, item, entry;\n\n for (i = start, ilen = start + count; i < ilen; ++i) {\n entry = data[i];\n item = {};\n item[iScale.axis] = singleScale || iScale.parse(labels[i], i);\n parsed.push(parseValue(entry, item, vScale, i));\n }\n return parsed;\n}\n\nfunction isFloatBar(custom) {\n return custom && custom.barStart !== undefined && custom.barEnd !== undefined;\n}\n\nfunction barSign(size, vScale, actualBase) {\n if (size !== 0) {\n return sign(size);\n }\n return (vScale.isHorizontal() ? 1 : -1) * (vScale.min >= actualBase ? 1 : -1);\n}\n\nfunction borderProps(properties) {\n let reverse, start, end, top, bottom;\n if (properties.horizontal) {\n reverse = properties.base > properties.x;\n start = 'left';\n end = 'right';\n } else {\n reverse = properties.base < properties.y;\n start = 'bottom';\n end = 'top';\n }\n if (reverse) {\n top = 'end';\n bottom = 'start';\n } else {\n top = 'start';\n bottom = 'end';\n }\n return {start, end, reverse, top, bottom};\n}\n\nfunction setBorderSkipped(properties, options, stack, index) {\n let edge = options.borderSkipped;\n const res = {};\n\n if (!edge) {\n properties.borderSkipped = res;\n return;\n }\n\n if (edge === true) {\n properties.borderSkipped = {top: true, right: true, bottom: true, left: true};\n return;\n }\n\n const {start, end, reverse, top, bottom} = borderProps(properties);\n\n if (edge === 'middle' && stack) {\n properties.enableBorderRadius = true;\n if ((stack._top || 0) === index) {\n edge = top;\n } else if ((stack._bottom || 0) === index) {\n edge = bottom;\n } else {\n res[parseEdge(bottom, start, end, reverse)] = true;\n edge = top;\n }\n }\n\n res[parseEdge(edge, start, end, reverse)] = true;\n properties.borderSkipped = res;\n}\n\nfunction parseEdge(edge, a, b, reverse) {\n if (reverse) {\n edge = swap(edge, a, b);\n edge = startEnd(edge, b, a);\n } else {\n edge = startEnd(edge, a, b);\n }\n return edge;\n}\n\nfunction swap(orig, v1, v2) {\n return orig === v1 ? v2 : orig === v2 ? v1 : orig;\n}\n\nfunction startEnd(v, start, end) {\n return v === 'start' ? start : v === 'end' ? end : v;\n}\n\nfunction setInflateAmount(properties, {inflateAmount}, ratio) {\n properties.inflateAmount = inflateAmount === 'auto'\n ? ratio === 1 ? 0.33 : 0\n : inflateAmount;\n}\n\nexport default class BarController extends DatasetController {\n\n static id = 'bar';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'bar',\n\n categoryPercentage: 0.8,\n barPercentage: 0.9,\n grouped: true,\n\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'base', 'width', 'height']\n }\n }\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n _index_: {\n type: 'category',\n offset: true,\n grid: {\n offset: true\n }\n },\n _value_: {\n type: 'linear',\n beginAtZero: true,\n }\n }\n };\n\n\n /**\n\t * Overriding primitive data parsing since we support mixed primitive/array\n\t * data for float bars\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n\n /**\n\t * Overriding array data parsing since we support mixed primitive/array\n\t * data for float bars\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n\n /**\n\t * Overriding object data parsing since we support mixed primitive/array\n\t * value-scale data for float bars\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const {iScale, vScale} = meta;\n const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n const iAxisKey = iScale.axis === 'x' ? xAxisKey : yAxisKey;\n const vAxisKey = vScale.axis === 'x' ? xAxisKey : yAxisKey;\n const parsed = [];\n let i, ilen, item, obj;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n obj = data[i];\n item = {};\n item[iScale.axis] = iScale.parse(resolveObjectKey(obj, iAxisKey), i);\n parsed.push(parseValue(resolveObjectKey(obj, vAxisKey), item, vScale, i));\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n updateRangeFromParsed(range, scale, parsed, stack) {\n super.updateRangeFromParsed(range, scale, parsed, stack);\n const custom = parsed._custom;\n if (custom && scale === this._cachedMeta.vScale) {\n // float bar: only one end of the bar is considered by `super`\n range.min = Math.min(range.min, custom.min);\n range.max = Math.max(range.max, custom.max);\n }\n }\n\n /**\n\t * @return {number|boolean}\n\t * @protected\n\t */\n getMaxOverflow() {\n return 0;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const {iScale, vScale} = meta;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const value = isFloatBar(custom)\n ? '[' + custom.start + ', ' + custom.end + ']'\n : '' + vScale.getLabelForValue(parsed[vScale.axis]);\n\n return {\n label: '' + iScale.getLabelForValue(parsed[iScale.axis]),\n value\n };\n }\n\n initialize() {\n this.enableOptionSharing = true;\n\n super.initialize();\n\n const meta = this._cachedMeta;\n meta.stack = this.getDataset().stack;\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n this.updateElements(meta.data, 0, meta.data.length, mode);\n }\n\n updateElements(bars, start, count, mode) {\n const reset = mode === 'reset';\n const {index, _cachedMeta: {vScale}} = this;\n const base = vScale.getBasePixel();\n const horizontal = vScale.isHorizontal();\n const ruler = this._getRuler();\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n\n for (let i = start; i < start + count; i++) {\n const parsed = this.getParsed(i);\n const vpixels = reset || isNullOrUndef(parsed[vScale.axis]) ? {base, head: base} : this._calculateBarValuePixels(i);\n const ipixels = this._calculateBarIndexPixels(i, ruler);\n const stack = (parsed._stacks || {})[vScale.axis];\n\n const properties = {\n horizontal,\n base: vpixels.base,\n enableBorderRadius: !stack || isFloatBar(parsed._custom) || (index === stack._top || index === stack._bottom),\n x: horizontal ? vpixels.head : ipixels.center,\n y: horizontal ? ipixels.center : vpixels.head,\n height: horizontal ? ipixels.size : Math.abs(vpixels.size),\n width: horizontal ? Math.abs(vpixels.size) : ipixels.size\n };\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, bars[i].active ? 'active' : mode);\n }\n const options = properties.options || bars[i].options;\n setBorderSkipped(properties, options, stack, index);\n setInflateAmount(properties, options, ruler.ratio);\n this.updateElement(bars[i], i, properties, mode);\n }\n }\n\n /**\n\t * Returns the stacks based on groups and bar visibility.\n\t * @param {number} [last] - The dataset index\n\t * @param {number} [dataIndex] - The data index of the ruler\n\t * @returns {string[]} The list of stack IDs\n\t * @private\n\t */\n _getStacks(last, dataIndex) {\n const {iScale} = this._cachedMeta;\n const metasets = iScale.getMatchingVisibleMetas(this._type)\n .filter(meta => meta.controller.options.grouped);\n const stacked = iScale.options.stacked;\n const stacks = [];\n const currentParsed = this._cachedMeta.controller.getParsed(dataIndex);\n const iScaleValue = currentParsed && currentParsed[iScale.axis];\n\n const skipNull = (meta) => {\n const parsed = meta._parsed.find(item => item[iScale.axis] === iScaleValue);\n const val = parsed && parsed[meta.vScale.axis];\n\n if (isNullOrUndef(val) || isNaN(val)) {\n return true;\n }\n };\n\n for (const meta of metasets) {\n if (dataIndex !== undefined && skipNull(meta)) {\n continue;\n }\n\n // stacked | meta.stack\n // | found | not found | undefined\n // false | x | x | x\n // true | | x |\n // undefined | | x | x\n if (stacked === false || stacks.indexOf(meta.stack) === -1 ||\n\t\t\t\t(stacked === undefined && meta.stack === undefined)) {\n stacks.push(meta.stack);\n }\n if (meta.index === last) {\n break;\n }\n }\n\n // No stacks? that means there is no visible data. Let's still initialize an `undefined`\n // stack where possible invisible bars will be located.\n // https://github.com/chartjs/Chart.js/issues/6368\n if (!stacks.length) {\n stacks.push(undefined);\n }\n\n return stacks;\n }\n\n /**\n\t * Returns the effective number of stacks based on groups and bar visibility.\n\t * @private\n\t */\n _getStackCount(index) {\n return this._getStacks(undefined, index).length;\n }\n\n _getAxisCount() {\n return this._getAxis().length;\n }\n\n getFirstScaleIdForIndexAxis() {\n const scales = this.chart.scales;\n const indexScaleId = this.chart.options.indexAxis;\n return Object.keys(scales).filter(key => scales[key].axis === indexScaleId).shift();\n }\n\n _getAxis() {\n const axis = {};\n const firstScaleAxisId = this.getFirstScaleIdForIndexAxis();\n for (const dataset of this.chart.data.datasets) {\n axis[valueOrDefault(\n this.chart.options.indexAxis === 'x' ? dataset.xAxisID : dataset.yAxisID, firstScaleAxisId\n )] = true;\n }\n return Object.keys(axis);\n }\n\n /**\n\t * Returns the stack index for the given dataset based on groups and bar visibility.\n\t * @param {number} [datasetIndex] - The dataset index\n\t * @param {string} [name] - The stack name to find\n * @param {number} [dataIndex]\n\t * @returns {number} The stack index\n\t * @private\n\t */\n _getStackIndex(datasetIndex, name, dataIndex) {\n const stacks = this._getStacks(datasetIndex, dataIndex);\n const index = (name !== undefined)\n ? stacks.indexOf(name)\n : -1; // indexOf returns -1 if element is not present\n\n return (index === -1)\n ? stacks.length - 1\n : index;\n }\n\n /**\n\t * @private\n\t */\n _getRuler() {\n const opts = this.options;\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const pixels = [];\n let i, ilen;\n\n for (i = 0, ilen = meta.data.length; i < ilen; ++i) {\n pixels.push(iScale.getPixelForValue(this.getParsed(i)[iScale.axis], i));\n }\n\n const barThickness = opts.barThickness;\n const min = barThickness || computeMinSampleSize(meta);\n\n return {\n min,\n pixels,\n start: iScale._startPixel,\n end: iScale._endPixel,\n stackCount: this._getStackCount(),\n scale: iScale,\n grouped: opts.grouped,\n // bar thickness ratio used for non-grouped bars\n ratio: barThickness ? 1 : opts.categoryPercentage * opts.barPercentage\n };\n }\n\n /**\n\t * Note: pixel values are not clamped to the scale area.\n\t * @private\n\t */\n _calculateBarValuePixels(index) {\n const {_cachedMeta: {vScale, _stacked, index: datasetIndex}, options: {base: baseValue, minBarLength}} = this;\n const actualBase = baseValue || 0;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const floating = isFloatBar(custom);\n let value = parsed[vScale.axis];\n let start = 0;\n let length = _stacked ? this.applyStack(vScale, parsed, _stacked) : value;\n let head, size;\n\n if (length !== value) {\n start = length - value;\n length = value;\n }\n\n if (floating) {\n value = custom.barStart;\n length = custom.barEnd - custom.barStart;\n // bars crossing origin are not stacked\n if (value !== 0 && sign(value) !== sign(custom.barEnd)) {\n start = 0;\n }\n start += value;\n }\n\n const startValue = !isNullOrUndef(baseValue) && !floating ? baseValue : start;\n let base = vScale.getPixelForValue(startValue);\n\n if (this.chart.getDataVisibility(index)) {\n head = vScale.getPixelForValue(start + length);\n } else {\n // When not visible, no height\n head = base;\n }\n\n size = head - base;\n\n if (Math.abs(size) < minBarLength) {\n size = barSign(size, vScale, actualBase) * minBarLength;\n if (value === actualBase) {\n base -= size / 2;\n }\n const startPixel = vScale.getPixelForDecimal(0);\n const endPixel = vScale.getPixelForDecimal(1);\n const min = Math.min(startPixel, endPixel);\n const max = Math.max(startPixel, endPixel);\n base = Math.max(Math.min(base, max), min);\n head = base + size;\n\n if (_stacked && !floating) {\n // visual data coordinates after applying minBarLength\n parsed._stacks[vScale.axis]._visualValues[datasetIndex] = vScale.getValueForPixel(head) - vScale.getValueForPixel(base);\n }\n }\n\n if (base === vScale.getPixelForValue(actualBase)) {\n const halfGrid = sign(size) * vScale.getLineWidthForValue(actualBase) / 2;\n base += halfGrid;\n size -= halfGrid;\n }\n\n return {\n size,\n base,\n head,\n center: head + size / 2\n };\n }\n\n /**\n\t * @private\n\t */\n _calculateBarIndexPixels(index, ruler) {\n const scale = ruler.scale;\n const options = this.options;\n const skipNull = options.skipNull;\n const maxBarThickness = valueOrDefault(options.maxBarThickness, Infinity);\n let center, size;\n const axisCount = this._getAxisCount();\n if (ruler.grouped) {\n const stackCount = skipNull ? this._getStackCount(index) : ruler.stackCount;\n const range = options.barThickness === 'flex'\n ? computeFlexCategoryTraits(index, ruler, options, stackCount * axisCount)\n : computeFitCategoryTraits(index, ruler, options, stackCount * axisCount);\n const axisID = this.chart.options.indexAxis === 'x' ? this.getDataset().xAxisID : this.getDataset().yAxisID;\n const axisNumber = this._getAxis().indexOf(valueOrDefault(axisID, this.getFirstScaleIdForIndexAxis()));\n const stackIndex = this._getStackIndex(this.index, this._cachedMeta.stack, skipNull ? index : undefined) + axisNumber;\n center = range.start + (range.chunk * stackIndex) + (range.chunk / 2);\n size = Math.min(maxBarThickness, range.chunk * range.ratio);\n } else {\n // For non-grouped bar charts, exact pixel values are used\n center = scale.getPixelForValue(this.getParsed(index)[scale.axis], index);\n size = Math.min(maxBarThickness, ruler.min * ruler.ratio);\n }\n\n\n return {\n base: center - size / 2,\n head: center + size / 2,\n center,\n size\n };\n }\n\n draw() {\n const meta = this._cachedMeta;\n const vScale = meta.vScale;\n const rects = meta.data;\n const ilen = rects.length;\n let i = 0;\n\n for (; i < ilen; ++i) {\n if (this.getParsed(i)[vScale.axis] !== null && !rects[i].hidden) {\n rects[i].draw(this._ctx);\n }\n }\n }\n\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {valueOrDefault} from '../helpers/helpers.core.js';\n\nexport default class BubbleController extends DatasetController {\n\n static id = 'bubble';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'borderWidth', 'radius']\n }\n }\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n\n initialize() {\n this.enableOptionSharing = true;\n super.initialize();\n }\n\n /**\n\t * Parse array of primitive values\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n const parsed = super.parsePrimitiveData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n parsed[i]._custom = this.resolveDataElementOptions(i + start).radius;\n }\n return parsed;\n }\n\n /**\n\t * Parse array of arrays\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n const parsed = super.parseArrayData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item[2], this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n\n /**\n\t * Parse array of objects\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const parsed = super.parseObjectData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item && item.r && +item.r, this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const data = this._cachedMeta.data;\n\n let max = 0;\n for (let i = data.length - 1; i >= 0; --i) {\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const {xScale, yScale} = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n const r = parsed._custom;\n\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + (r ? ', ' + r : '') + ')'\n };\n }\n\n update(mode) {\n const points = this._cachedMeta.data;\n\n // Update Points\n this.updateElements(points, 0, points.length, mode);\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale} = this._cachedMeta;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const parsed = !reset && this.getParsed(i);\n const properties = {};\n const iPixel = properties[iAxis] = reset ? iScale.getPixelForDecimal(0.5) : iScale.getPixelForValue(parsed[iAxis]);\n const vPixel = properties[vAxis] = reset ? vScale.getBasePixel() : vScale.getPixelForValue(parsed[vAxis]);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel);\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n\n if (reset) {\n properties.options.radius = 0;\n }\n }\n\n this.updateElement(point, i, properties, mode);\n }\n }\n\n /**\n\t * @param {number} index\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDataElementOptions(index, mode) {\n const parsed = this.getParsed(index);\n let values = super.resolveDataElementOptions(index, mode);\n\n // In case values were cached (and thus frozen), we need to clone the values\n if (values.$shared) {\n values = Object.assign({}, values, {$shared: false});\n }\n\n // Custom radius resolution\n const radius = values.radius;\n if (mode !== 'active') {\n values.radius = 0;\n }\n values.radius += valueOrDefault(parsed && parsed._custom, radius);\n\n return values;\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isObject, resolveObjectKey, toPercentage, toDimension, valueOrDefault} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {toRadians, PI, TAU, HALF_PI, _angleBetween} from '../helpers/helpers.math.js';\n\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\nfunction getRatioAndOffset(rotation, circumference, cutout) {\n let ratioX = 1;\n let ratioY = 1;\n let offsetX = 0;\n let offsetY = 0;\n // If the chart's circumference isn't a full circle, calculate size as a ratio of the width/height of the arc\n if (circumference < TAU) {\n const startAngle = rotation;\n const endAngle = startAngle + circumference;\n const startX = Math.cos(startAngle);\n const startY = Math.sin(startAngle);\n const endX = Math.cos(endAngle);\n const endY = Math.sin(endAngle);\n const calcMax = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? 1 : Math.max(a, a * cutout, b, b * cutout);\n const calcMin = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? -1 : Math.min(a, a * cutout, b, b * cutout);\n const maxX = calcMax(0, startX, endX);\n const maxY = calcMax(HALF_PI, startY, endY);\n const minX = calcMin(PI, startX, endX);\n const minY = calcMin(PI + HALF_PI, startY, endY);\n ratioX = (maxX - minX) / 2;\n ratioY = (maxY - minY) / 2;\n offsetX = -(maxX + minX) / 2;\n offsetY = -(maxY + minY) / 2;\n }\n return {ratioX, ratioY, offsetX, offsetY};\n}\n\nexport default class DoughnutController extends DatasetController {\n\n static id = 'doughnut';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'arc',\n animation: {\n // Boolean - Whether we animate the rotation of the Doughnut\n animateRotate: true,\n // Boolean - Whether we animate scaling the Doughnut from the centre\n animateScale: false\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['circumference', 'endAngle', 'innerRadius', 'outerRadius', 'startAngle', 'x', 'y', 'offset', 'borderWidth', 'spacing']\n },\n },\n // The percentage of the chart that we cut out of the middle.\n cutout: '50%',\n\n // The rotation of the chart, where the first data arc begins.\n rotation: 0,\n\n // The total circumference of the chart.\n circumference: 360,\n\n // The outer radius of the chart\n radius: '100%',\n\n // Spacing between arcs\n spacing: 0,\n\n indexAxis: 'r',\n };\n\n static descriptors = {\n _scriptable: (name) => name !== 'spacing',\n _indexable: (name) => name !== 'spacing' && !name.startsWith('borderDash') && !name.startsWith('hoverBorderDash'),\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n // Need to override these to give a nice default\n plugins: {\n legend: {\n labels: {\n generateLabels(chart) {\n const data = chart.data;\n const {labels: {pointStyle, textAlign, color, useBorderRadius, borderRadius}} = chart.legend.options;\n if (data.labels.length && data.datasets.length) {\n return data.labels.map((label, i) => {\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n\n return {\n text: label,\n fillStyle: style.backgroundColor,\n fontColor: color,\n hidden: !chart.getDataVisibility(i),\n lineDash: style.borderDash,\n lineDashOffset: style.borderDashOffset,\n lineJoin: style.borderJoinStyle,\n lineWidth: style.borderWidth,\n strokeStyle: style.borderColor,\n textAlign: textAlign,\n pointStyle: pointStyle,\n borderRadius: useBorderRadius && (borderRadius || style.borderRadius),\n // Extra data used for toggling the correct item\n index: i\n };\n });\n }\n return [];\n }\n },\n\n onClick(e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n }\n };\n\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n\n this.enableOptionSharing = true;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.offsetX = undefined;\n this.offsetY = undefined;\n }\n\n linkScales() {}\n\n /**\n\t * Override data parsing, since we are not using scales\n\t */\n parse(start, count) {\n const data = this.getDataset().data;\n const meta = this._cachedMeta;\n\n if (this._parsing === false) {\n meta._parsed = data;\n } else {\n let getter = (i) => +data[i];\n\n if (isObject(data[start])) {\n const {key = 'value'} = this._parsing;\n getter = (i) => +resolveObjectKey(data[i], key);\n }\n\n let i, ilen;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n meta._parsed[i] = getter(i);\n }\n }\n }\n\n /**\n\t * @private\n\t */\n _getRotation() {\n return toRadians(this.options.rotation - 90);\n }\n\n /**\n\t * @private\n\t */\n _getCircumference() {\n return toRadians(this.options.circumference);\n }\n\n /**\n\t * Get the maximal rotation & circumference extents\n\t * across all visible datasets.\n\t */\n _getRotationExtents() {\n let min = TAU;\n let max = -TAU;\n\n for (let i = 0; i < this.chart.data.datasets.length; ++i) {\n if (this.chart.isDatasetVisible(i) && this.chart.getDatasetMeta(i).type === this._type) {\n const controller = this.chart.getDatasetMeta(i).controller;\n const rotation = controller._getRotation();\n const circumference = controller._getCircumference();\n\n min = Math.min(min, rotation);\n max = Math.max(max, rotation + circumference);\n }\n }\n\n return {\n rotation: min,\n circumference: max - min,\n };\n }\n\n /**\n\t * @param {string} mode\n\t */\n update(mode) {\n const chart = this.chart;\n const {chartArea} = chart;\n const meta = this._cachedMeta;\n const arcs = meta.data;\n const spacing = this.getMaxBorderWidth() + this.getMaxOffset(arcs) + this.options.spacing;\n const maxSize = Math.max((Math.min(chartArea.width, chartArea.height) - spacing) / 2, 0);\n const cutout = Math.min(toPercentage(this.options.cutout, maxSize), 1);\n const chartWeight = this._getRingWeight(this.index);\n\n // Compute the maximal rotation & circumference limits.\n // If we only consider our dataset, this can cause problems when two datasets\n // are both less than a circle with different rotations (starting angles)\n const {circumference, rotation} = this._getRotationExtents();\n const {ratioX, ratioY, offsetX, offsetY} = getRatioAndOffset(rotation, circumference, cutout);\n const maxWidth = (chartArea.width - spacing) / ratioX;\n const maxHeight = (chartArea.height - spacing) / ratioY;\n const maxRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0);\n const outerRadius = toDimension(this.options.radius, maxRadius);\n const innerRadius = Math.max(outerRadius * cutout, 0);\n const radiusLength = (outerRadius - innerRadius) / this._getVisibleDatasetWeightTotal();\n this.offsetX = offsetX * outerRadius;\n this.offsetY = offsetY * outerRadius;\n\n meta.total = this.calculateTotal();\n\n this.outerRadius = outerRadius - radiusLength * this._getRingWeightOffset(this.index);\n this.innerRadius = Math.max(this.outerRadius - radiusLength * chartWeight, 0);\n\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n\n /**\n * @private\n */\n _circumference(i, reset) {\n const opts = this.options;\n const meta = this._cachedMeta;\n const circumference = this._getCircumference();\n if ((reset && opts.animation.animateRotate) || !this.chart.getDataVisibility(i) || meta._parsed[i] === null || meta.data[i].hidden) {\n return 0;\n }\n return this.calculateCircumference(meta._parsed[i] * circumference / TAU);\n }\n\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const centerX = (chartArea.left + chartArea.right) / 2;\n const centerY = (chartArea.top + chartArea.bottom) / 2;\n const animateScale = reset && animationOpts.animateScale;\n const innerRadius = animateScale ? 0 : this.innerRadius;\n const outerRadius = animateScale ? 0 : this.outerRadius;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n let startAngle = this._getRotation();\n let i;\n\n for (i = 0; i < start; ++i) {\n startAngle += this._circumference(i, reset);\n }\n\n for (i = start; i < start + count; ++i) {\n const circumference = this._circumference(i, reset);\n const arc = arcs[i];\n const properties = {\n x: centerX + this.offsetX,\n y: centerY + this.offsetY,\n startAngle,\n endAngle: startAngle + circumference,\n circumference,\n outerRadius,\n innerRadius\n };\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, arc.active ? 'active' : mode);\n }\n startAngle += circumference;\n\n this.updateElement(arc, i, properties, mode);\n }\n }\n\n calculateTotal() {\n const meta = this._cachedMeta;\n const metaData = meta.data;\n let total = 0;\n let i;\n\n for (i = 0; i < metaData.length; i++) {\n const value = meta._parsed[i];\n if (value !== null && !isNaN(value) && this.chart.getDataVisibility(i) && !metaData[i].hidden) {\n total += Math.abs(value);\n }\n }\n\n return total;\n }\n\n calculateCircumference(value) {\n const total = this._cachedMeta.total;\n if (total > 0 && !isNaN(value)) {\n return TAU * (Math.abs(value) / total);\n }\n return 0;\n }\n\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index], chart.options.locale);\n\n return {\n label: labels[index] || '',\n value,\n };\n }\n\n getMaxBorderWidth(arcs) {\n let max = 0;\n const chart = this.chart;\n let i, ilen, meta, controller, options;\n\n if (!arcs) {\n // Find the outmost visible dataset\n for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) {\n if (chart.isDatasetVisible(i)) {\n meta = chart.getDatasetMeta(i);\n arcs = meta.data;\n controller = meta.controller;\n break;\n }\n }\n }\n\n if (!arcs) {\n return 0;\n }\n\n for (i = 0, ilen = arcs.length; i < ilen; ++i) {\n options = controller.resolveDataElementOptions(i);\n if (options.borderAlign !== 'inner') {\n max = Math.max(max, options.borderWidth || 0, options.hoverBorderWidth || 0);\n }\n }\n return max;\n }\n\n getMaxOffset(arcs) {\n let max = 0;\n\n for (let i = 0, ilen = arcs.length; i < ilen; ++i) {\n const options = this.resolveDataElementOptions(i);\n max = Math.max(max, options.offset || 0, options.hoverOffset || 0);\n }\n return max;\n }\n\n /**\n\t * Get radius length offset of the dataset in relation to the visible datasets weights. This allows determining the inner and outer radius correctly\n\t * @private\n\t */\n _getRingWeightOffset(datasetIndex) {\n let ringWeightOffset = 0;\n\n for (let i = 0; i < datasetIndex; ++i) {\n if (this.chart.isDatasetVisible(i)) {\n ringWeightOffset += this._getRingWeight(i);\n }\n }\n\n return ringWeightOffset;\n }\n\n /**\n\t * @private\n\t */\n _getRingWeight(datasetIndex) {\n return Math.max(valueOrDefault(this.chart.data.datasets[datasetIndex].weight, 1), 0);\n }\n\n /**\n\t * Returns the sum of all visible data set weights.\n\t * @private\n\t */\n _getVisibleDatasetWeightTotal() {\n return this._getRingWeightOffset(this.chart.data.datasets.length) || 1;\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isNullOrUndef} from '../helpers/index.js';\nimport {isNumber} from '../helpers/helpers.math.js';\nimport {_getStartAndCountOfVisiblePoints, _scaleRangesChanged} from '../helpers/helpers.extras.js';\n\nexport default class LineController extends DatasetController {\n\n static id = 'line';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n\n showLine: true,\n spanGaps: false,\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n _index_: {\n type: 'category',\n },\n _value_: {\n type: 'linear',\n },\n }\n };\n\n initialize() {\n this.enableOptionSharing = true;\n this.supportsDecimation = true;\n super.initialize();\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const {dataset: line, data: points = [], _dataset} = meta;\n // @ts-ignore\n const animationsDisabled = this.chart._animationsDisabled;\n let {start, count} = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n\n this._drawStart = start;\n this._drawCount = count;\n\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n\n // Update Line\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n\n // Update Points\n this.updateElements(points, start, count, mode);\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale, _stacked, _dataset} = this._cachedMeta;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const {spanGaps, segment} = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n const end = start + count;\n const pointsCount = points.length;\n let prevParsed = start > 0 && this.getParsed(start - 1);\n\n for (let i = 0; i < pointsCount; ++i) {\n const point = points[i];\n const properties = directUpdate ? point : {};\n\n if (i < start || i >= end) {\n properties.skip = true;\n continue;\n }\n\n const parsed = this.getParsed(i);\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && (Math.abs(parsed[iAxis] - prevParsed[iAxis])) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n\n prevParsed = parsed;\n }\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n const data = meta.data || [];\n if (!data.length) {\n return border;\n }\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n\n draw() {\n const meta = this._cachedMeta;\n meta.dataset.updateControlPoints(this.chart.chartArea, meta.iScale.axis);\n super.draw();\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {toRadians, PI, formatNumber, _parseObjectDataRadialScale} from '../helpers/index.js';\n\nexport default class PolarAreaController extends DatasetController {\n\n static id = 'polarArea';\n\n /**\n * @type {any}\n */\n static defaults = {\n dataElementType: 'arc',\n animation: {\n animateRotate: true,\n animateScale: true\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'startAngle', 'endAngle', 'innerRadius', 'outerRadius']\n },\n },\n indexAxis: 'r',\n startAngle: 0,\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n plugins: {\n legend: {\n labels: {\n generateLabels(chart) {\n const data = chart.data;\n if (data.labels.length && data.datasets.length) {\n const {labels: {pointStyle, color}} = chart.legend.options;\n\n return data.labels.map((label, i) => {\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n fontColor: color,\n lineWidth: style.borderWidth,\n pointStyle: pointStyle,\n hidden: !chart.getDataVisibility(i),\n\n // Extra data used for toggling the correct item\n index: i\n };\n });\n }\n return [];\n }\n },\n\n onClick(e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n },\n\n scales: {\n r: {\n type: 'radialLinear',\n angleLines: {\n display: false\n },\n beginAtZero: true,\n grid: {\n circular: true\n },\n pointLabels: {\n display: false\n },\n startAngle: 0\n }\n }\n };\n\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n }\n\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index].r, chart.options.locale);\n\n return {\n label: labels[index] || '',\n value,\n };\n }\n\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n\n update(mode) {\n const arcs = this._cachedMeta.data;\n\n this._updateRadius();\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n\n /**\n * @protected\n */\n getMinMax() {\n const meta = this._cachedMeta;\n const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n\n meta.data.forEach((element, index) => {\n const parsed = this.getParsed(index).r;\n\n if (!isNaN(parsed) && this.chart.getDataVisibility(index)) {\n if (parsed < range.min) {\n range.min = parsed;\n }\n\n if (parsed > range.max) {\n range.max = parsed;\n }\n }\n });\n\n return range;\n }\n\n /**\n\t * @private\n\t */\n _updateRadius() {\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n\n const outerRadius = Math.max(minSize / 2, 0);\n const innerRadius = Math.max(opts.cutoutPercentage ? (outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);\n const radiusLength = (outerRadius - innerRadius) / chart.getVisibleDatasetCount();\n\n this.outerRadius = outerRadius - (radiusLength * this.index);\n this.innerRadius = this.outerRadius - radiusLength;\n }\n\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const scale = this._cachedMeta.rScale;\n const centerX = scale.xCenter;\n const centerY = scale.yCenter;\n const datasetStartAngle = scale.getIndexAngle(0) - 0.5 * PI;\n let angle = datasetStartAngle;\n let i;\n\n const defaultAngle = 360 / this.countVisibleElements();\n\n for (i = 0; i < start; ++i) {\n angle += this._computeAngle(i, mode, defaultAngle);\n }\n for (i = start; i < start + count; i++) {\n const arc = arcs[i];\n let startAngle = angle;\n let endAngle = angle + this._computeAngle(i, mode, defaultAngle);\n let outerRadius = chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(this.getParsed(i).r) : 0;\n angle = endAngle;\n\n if (reset) {\n if (animationOpts.animateScale) {\n outerRadius = 0;\n }\n if (animationOpts.animateRotate) {\n startAngle = endAngle = datasetStartAngle;\n }\n }\n\n const properties = {\n x: centerX,\n y: centerY,\n innerRadius: 0,\n outerRadius,\n startAngle,\n endAngle,\n options: this.resolveDataElementOptions(i, arc.active ? 'active' : mode)\n };\n\n this.updateElement(arc, i, properties, mode);\n }\n }\n\n countVisibleElements() {\n const meta = this._cachedMeta;\n let count = 0;\n\n meta.data.forEach((element, index) => {\n if (!isNaN(this.getParsed(index).r) && this.chart.getDataVisibility(index)) {\n count++;\n }\n });\n\n return count;\n }\n\n /**\n\t * @private\n\t */\n _computeAngle(index, mode, defaultAngle) {\n return this.chart.getDataVisibility(index)\n ? toRadians(this.resolveDataElementOptions(index, mode).angle || defaultAngle)\n : 0;\n }\n}\n","import DoughnutController from './controller.doughnut.js';\n\n// Pie charts are Doughnut chart with different defaults\nexport default class PieController extends DoughnutController {\n\n static id = 'pie';\n\n /**\n * @type {any}\n */\n static defaults = {\n // The percentage of the chart that we cut out of the middle.\n cutout: 0,\n\n // The rotation of the chart, where the first data arc begins.\n rotation: 0,\n\n // The total circumference of the chart.\n circumference: 360,\n\n // The outer radius of the chart\n radius: '100%'\n };\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {_parseObjectDataRadialScale} from '../helpers/index.js';\n\nexport default class RadarController extends DatasetController {\n\n static id = 'radar';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n indexAxis: 'r',\n showLine: true,\n elements: {\n line: {\n fill: 'start'\n }\n },\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n scales: {\n r: {\n type: 'radialLinear',\n }\n }\n };\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const vScale = this._cachedMeta.vScale;\n const parsed = this.getParsed(index);\n\n return {\n label: vScale.getLabels()[index],\n value: '' + vScale.getLabelForValue(parsed[vScale.axis])\n };\n }\n\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const line = meta.dataset;\n const points = meta.data || [];\n const labels = meta.iScale.getLabels();\n\n // Update Line\n line.points = points;\n // In resize mode only point locations change, so no need to set the points or options.\n if (mode !== 'resize') {\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n\n const properties = {\n _loop: true,\n _fullLoop: labels.length === points.length,\n options\n };\n\n this.updateElement(line, undefined, properties, mode);\n }\n\n // Update Points\n this.updateElements(points, 0, points.length, mode);\n }\n\n updateElements(points, start, count, mode) {\n const scale = this._cachedMeta.rScale;\n const reset = mode === 'reset';\n\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const options = this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n const pointPosition = scale.getPointPositionForValue(i, this.getParsed(i).r);\n\n const x = reset ? scale.xCenter : pointPosition.x;\n const y = reset ? scale.yCenter : pointPosition.y;\n\n const properties = {\n x,\n y,\n angle: pointPosition.angle,\n skip: isNaN(x) || isNaN(y),\n options\n };\n\n this.updateElement(point, i, properties, mode);\n }\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isNullOrUndef} from '../helpers/index.js';\nimport {isNumber} from '../helpers/helpers.math.js';\nimport {_getStartAndCountOfVisiblePoints, _scaleRangesChanged} from '../helpers/helpers.extras.js';\n\nexport default class ScatterController extends DatasetController {\n\n static id = 'scatter';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n showLine: false,\n fill: false\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n\n interaction: {\n mode: 'point'\n },\n\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const {xScale, yScale} = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + ')'\n };\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const {data: points = []} = meta;\n // @ts-ignore\n const animationsDisabled = this.chart._animationsDisabled;\n let {start, count} = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n\n this._drawStart = start;\n this._drawCount = count;\n\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n\n if (this.options.showLine) {\n\n // https://github.com/chartjs/Chart.js/issues/11333\n if (!this.datasetElementType) {\n this.addElements();\n }\n const {dataset: line, _dataset} = meta;\n\n // Update Line\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n\n const options = this.resolveDatasetElementOptions(mode);\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n } else if (this.datasetElementType) {\n // https://github.com/chartjs/Chart.js/issues/11333\n delete meta.dataset;\n this.datasetElementType = false;\n }\n\n // Update Points\n this.updateElements(points, start, count, mode);\n }\n\n addElements() {\n const {showLine} = this.options;\n\n if (!this.datasetElementType && showLine) {\n this.datasetElementType = this.chart.registry.getElement('line');\n }\n\n super.addElements();\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale, _stacked, _dataset} = this._cachedMeta;\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const {spanGaps, segment} = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n let prevParsed = start > 0 && this.getParsed(start - 1);\n\n for (let i = start; i < start + count; ++i) {\n const point = points[i];\n const parsed = this.getParsed(i);\n const properties = directUpdate ? point : {};\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && (Math.abs(parsed[iAxis] - prevParsed[iAxis])) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n\n prevParsed = parsed;\n }\n\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const data = meta.data || [];\n\n if (!this.options.showLine) {\n let max = 0;\n for (let i = data.length - 1; i >= 0; --i) {\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n\n if (!data.length) {\n return border;\n }\n\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n}\n","/**\n * @namespace Chart._adapters\n * @since 2.8.0\n * @private\n */\n\nimport type {AnyObject} from '../types/basic.js';\nimport type {ChartOptions} from '../types/index.js';\n\nexport type TimeUnit = 'millisecond' | 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'year';\n\nexport interface DateAdapter {\n readonly options: T;\n /**\n * Will called with chart options after adapter creation.\n */\n init(this: DateAdapter, chartOptions: ChartOptions): void;\n /**\n * Returns a map of time formats for the supported formatting units defined\n * in Unit as well as 'datetime' representing a detailed date/time string.\n */\n formats(this: DateAdapter): Record;\n /**\n * Parses the given `value` and return the associated timestamp.\n * @param value - the value to parse (usually comes from the data)\n * @param [format] - the expected data format\n */\n parse(this: DateAdapter, value: unknown, format?: string): number | null;\n /**\n * Returns the formatted date in the specified `format` for a given `timestamp`.\n * @param timestamp - the timestamp to format\n * @param format - the date/time token\n */\n format(this: DateAdapter, timestamp: number, format: string): string;\n /**\n * Adds the specified `amount` of `unit` to the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param amount - the amount to add\n * @param unit - the unit as string\n */\n add(this: DateAdapter, timestamp: number, amount: number, unit: TimeUnit): number;\n /**\n * Returns the number of `unit` between the given timestamps.\n * @param a - the input timestamp (reference)\n * @param b - the timestamp to subtract\n * @param unit - the unit as string\n */\n diff(this: DateAdapter, a: number, b: number, unit: TimeUnit): number;\n /**\n * Returns start of `unit` for the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param unit - the unit as string\n * @param [weekday] - the ISO day of the week with 1 being Monday\n * and 7 being Sunday (only needed if param *unit* is `isoWeek`).\n */\n startOf(this: DateAdapter, timestamp: number, unit: TimeUnit | 'isoWeek', weekday?: number | boolean): number;\n /**\n * Returns end of `unit` for the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param unit - the unit as string\n */\n endOf(this: DateAdapter, timestamp: number, unit: TimeUnit): number;\n}\n\nfunction abstract(): T {\n throw new Error('This method is not implemented: Check that a complete date adapter is provided.');\n}\n\n/**\n * Date adapter (current used by the time scale)\n * @namespace Chart._adapters._date\n * @memberof Chart._adapters\n * @private\n */\nclass DateAdapterBase implements DateAdapter {\n\n /**\n * Override default date adapter methods.\n * Accepts type parameter to define options type.\n * @example\n * Chart._adapters._date.override<{myAdapterOption: string}>({\n * init() {\n * console.log(this.options.myAdapterOption);\n * }\n * })\n */\n static override(\n members: Partial, 'options'>>\n ) {\n Object.assign(DateAdapterBase.prototype, members);\n }\n\n readonly options: AnyObject;\n\n constructor(options?: AnyObject) {\n this.options = options || {};\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n init() {}\n\n formats(): Record {\n return abstract();\n }\n\n parse(): number | null {\n return abstract();\n }\n\n format(): string {\n return abstract();\n }\n\n add(): number {\n return abstract();\n }\n\n diff(): number {\n return abstract();\n }\n\n startOf(): number {\n return abstract();\n }\n\n endOf(): number {\n return abstract();\n }\n}\n\nexport default {\n _date: DateAdapterBase as {\n new (options?: AnyObject): DateAdapter;\n override(\n members: Partial, 'options'>>\n ): void;\n }\n};\n","import {_lookupByKey, _rlookupByKey} from '../helpers/helpers.collection.js';\nimport {getRelativePosition} from '../helpers/helpers.dom.js';\nimport {_angleBetween, getAngleFromPoint} from '../helpers/helpers.math.js';\nimport {_isPointInArea, isNullOrUndef} from '../helpers/index.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef {{axis?: string, intersect?: boolean, includeInvisible?: boolean}} InteractionOptions\n * @typedef {{datasetIndex: number, index: number, element: import('./core.element.js').default}} InteractionItem\n * @typedef { import('../types/index.js').Point } Point\n */\n\n/**\n * Helper function to do binary search when possible\n * @param {object} metaset - the dataset meta\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {number} value - the value to find\n * @param {boolean} [intersect] - should the element intersect\n * @returns {{lo:number, hi:number}} indices to search data array between\n */\nfunction binarySearch(metaset, axis, value, intersect) {\n const {controller, data, _sorted} = metaset;\n const iScale = controller._cachedMeta.iScale;\n const spanGaps = metaset.dataset ? metaset.dataset.options ? metaset.dataset.options.spanGaps : null : null;\n\n if (iScale && axis === iScale.axis && axis !== 'r' && _sorted && data.length) {\n const lookupMethod = iScale._reversePixels ? _rlookupByKey : _lookupByKey;\n if (!intersect) {\n const result = lookupMethod(data, axis, value);\n if (spanGaps) {\n const {vScale} = controller._cachedMeta;\n const {_parsed} = metaset;\n\n const distanceToDefinedLo = (_parsed\n .slice(0, result.lo + 1)\n .reverse()\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n result.lo -= Math.max(0, distanceToDefinedLo);\n\n const distanceToDefinedHi = (_parsed\n .slice(result.hi)\n .findIndex(\n point => !isNullOrUndef(point[vScale.axis])));\n result.hi += Math.max(0, distanceToDefinedHi);\n }\n return result;\n } else if (controller._sharedOptions) {\n // _sharedOptions indicates that each element has equal options -> equal proportions\n // So we can do a ranged binary search based on the range of first element and\n // be confident to get the full range of indices that can intersect with the value.\n const el = data[0];\n const range = typeof el.getRange === 'function' && el.getRange(axis);\n if (range) {\n const start = lookupMethod(data, axis, value - range);\n const end = lookupMethod(data, axis, value + range);\n return {lo: start.lo, hi: end.hi};\n }\n }\n }\n // Default to all elements, when binary search can not be used.\n return {lo: 0, hi: data.length - 1};\n}\n\n/**\n * Helper function to select candidate elements for interaction\n * @param {Chart} chart - the chart\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {function} handler - the callback to execute for each visible item\n * @param {boolean} [intersect] - consider intersecting items\n */\nfunction evaluateInteractionItems(chart, axis, position, handler, intersect) {\n const metasets = chart.getSortedVisibleDatasetMetas();\n const value = position[axis];\n for (let i = 0, ilen = metasets.length; i < ilen; ++i) {\n const {index, data} = metasets[i];\n const {lo, hi} = binarySearch(metasets[i], axis, value, intersect);\n for (let j = lo; j <= hi; ++j) {\n const element = data[j];\n if (!element.skip) {\n handler(element, index, j);\n }\n }\n }\n}\n\n/**\n * Get a distance metric function for two points based on the\n * axis mode setting\n * @param {string} axis - the axis mode. x|y|xy|r\n */\nfunction getDistanceMetricForAxis(axis) {\n const useX = axis.indexOf('x') !== -1;\n const useY = axis.indexOf('y') !== -1;\n\n return function(pt1, pt2) {\n const deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n const deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n };\n}\n\n/**\n * Helper function to get the items that intersect the event position\n * @param {Chart} chart - the chart\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) {\n const items = [];\n\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return items;\n }\n\n const evaluationFunc = function(element, datasetIndex, index) {\n if (!includeInvisible && !_isPointInArea(element, chart.chartArea, 0)) {\n return;\n }\n if (element.inRange(position.x, position.y, useFinalPosition)) {\n items.push({element, datasetIndex, index});\n }\n };\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc, true);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position for a radial chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestRadialItems(chart, position, axis, useFinalPosition) {\n let items = [];\n\n function evaluationFunc(element, datasetIndex, index) {\n const {startAngle, endAngle} = element.getProps(['startAngle', 'endAngle'], useFinalPosition);\n const {angle} = getAngleFromPoint(element, {x: position.x, y: position.y});\n\n if (_angleBetween(angle, startAngle, endAngle)) {\n items.push({element, datasetIndex, index});\n }\n }\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position for a cartesian chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n let items = [];\n const distanceMetric = getDistanceMetricForAxis(axis);\n let minDistance = Number.POSITIVE_INFINITY;\n\n function evaluationFunc(element, datasetIndex, index) {\n const inRange = element.inRange(position.x, position.y, useFinalPosition);\n if (intersect && !inRange) {\n return;\n }\n\n const center = element.getCenterPoint(useFinalPosition);\n const pointInArea = !!includeInvisible || chart.isPointInArea(center);\n if (!pointInArea && !inRange) {\n return;\n }\n\n const distance = distanceMetric(position, center);\n if (distance < minDistance) {\n items = [{element, datasetIndex, index}];\n minDistance = distance;\n } else if (distance === minDistance) {\n // Can have multiple items at the same distance in which case we sort by size\n items.push({element, datasetIndex, index});\n }\n }\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position considering all visible items in the chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return [];\n }\n\n return axis === 'r' && !intersect\n ? getNearestRadialItems(chart, position, axis, useFinalPosition)\n : getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible);\n}\n\n/**\n * Helper function to get the items matching along the given X or Y axis\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axis to match\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @return {InteractionItem[]} the nearest items\n */\nfunction getAxisItems(chart, position, axis, intersect, useFinalPosition) {\n const items = [];\n const rangeMethod = axis === 'x' ? 'inXRange' : 'inYRange';\n let intersectsItem = false;\n\n evaluateInteractionItems(chart, axis, position, (element, datasetIndex, index) => {\n if (element[rangeMethod] && element[rangeMethod](position[axis], useFinalPosition)) {\n items.push({element, datasetIndex, index});\n intersectsItem = intersectsItem || element.inRange(position.x, position.y, useFinalPosition);\n }\n });\n\n // If we want to trigger on an intersect and we don't have any items\n // that intersect the position, return nothing\n if (intersect && !intersectsItem) {\n return [];\n }\n return items;\n}\n\n/**\n * Contains interaction related functions\n * @namespace Chart.Interaction\n */\nexport default {\n // Part of the public API to facilitate developers creating their own modes\n evaluateInteractionItems,\n\n // Helper function for different modes\n modes: {\n /**\n\t\t * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item\n\t\t * @function Chart.Interaction.modes.index\n\t\t * @since v2.4.0\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n index(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n // Default axis for index mode is 'x' to match old behaviour\n const axis = options.axis || 'x';\n const includeInvisible = options.includeInvisible || false;\n const items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible)\n : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n const elements = [];\n\n if (!items.length) {\n return [];\n }\n\n chart.getSortedVisibleDatasetMetas().forEach((meta) => {\n const index = items[0].index;\n const element = meta.data[index];\n\n // don't count items that are skipped (null data)\n if (element && !element.skip) {\n elements.push({element, datasetIndex: meta.index, index});\n }\n });\n\n return elements;\n },\n\n /**\n\t\t * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect is false, we find the nearest item and return the items in that dataset\n\t\t * @function Chart.Interaction.modes.dataset\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n dataset(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n let items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) :\n getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n\n if (items.length > 0) {\n const datasetIndex = items[0].datasetIndex;\n const data = chart.getDatasetMeta(datasetIndex).data;\n items = [];\n for (let i = 0; i < data.length; ++i) {\n items.push({element: data[i], datasetIndex, index: i});\n }\n }\n\n return items;\n },\n\n /**\n\t\t * Point mode returns all elements that hit test based on the event position\n\t\t * of the event\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n point(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible);\n },\n\n /**\n\t\t * nearest mode returns the element closest to the point\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n nearest(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getNearestItems(chart, position, axis, options.intersect, useFinalPosition, includeInvisible);\n },\n\n /**\n\t\t * x mode returns the elements that hit-test at the current x coordinate\n\t\t * @function Chart.Interaction.modes.x\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n x(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'x', options.intersect, useFinalPosition);\n },\n\n /**\n\t\t * y mode returns the elements that hit-test at the current y coordinate\n\t\t * @function Chart.Interaction.modes.y\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n y(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'y', options.intersect, useFinalPosition);\n }\n }\n};\n","import {defined, each, isObject} from '../helpers/helpers.core.js';\nimport {toPadding} from '../helpers/helpers.options.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n */\n\nconst STATIC_POSITIONS = ['left', 'top', 'right', 'bottom'];\n\nfunction filterByPosition(array, position) {\n return array.filter(v => v.pos === position);\n}\n\nfunction filterDynamicPositionByAxis(array, axis) {\n return array.filter(v => STATIC_POSITIONS.indexOf(v.pos) === -1 && v.box.axis === axis);\n}\n\nfunction sortByWeight(array, reverse) {\n return array.sort((a, b) => {\n const v0 = reverse ? b : a;\n const v1 = reverse ? a : b;\n return v0.weight === v1.weight ?\n v0.index - v1.index :\n v0.weight - v1.weight;\n });\n}\n\nfunction wrapBoxes(boxes) {\n const layoutBoxes = [];\n let i, ilen, box, pos, stack, stackWeight;\n\n for (i = 0, ilen = (boxes || []).length; i < ilen; ++i) {\n box = boxes[i];\n ({position: pos, options: {stack, stackWeight = 1}} = box);\n layoutBoxes.push({\n index: i,\n box,\n pos,\n horizontal: box.isHorizontal(),\n weight: box.weight,\n stack: stack && (pos + stack),\n stackWeight\n });\n }\n return layoutBoxes;\n}\n\nfunction buildStacks(layouts) {\n const stacks = {};\n for (const wrap of layouts) {\n const {stack, pos, stackWeight} = wrap;\n if (!stack || !STATIC_POSITIONS.includes(pos)) {\n continue;\n }\n const _stack = stacks[stack] || (stacks[stack] = {count: 0, placed: 0, weight: 0, size: 0});\n _stack.count++;\n _stack.weight += stackWeight;\n }\n return stacks;\n}\n\n/**\n * store dimensions used instead of available chartArea in fitBoxes\n **/\nfunction setLayoutDims(layouts, params) {\n const stacks = buildStacks(layouts);\n const {vBoxMaxWidth, hBoxMaxHeight} = params;\n let i, ilen, layout;\n for (i = 0, ilen = layouts.length; i < ilen; ++i) {\n layout = layouts[i];\n const {fullSize} = layout.box;\n const stack = stacks[layout.stack];\n const factor = stack && layout.stackWeight / stack.weight;\n if (layout.horizontal) {\n layout.width = factor ? factor * vBoxMaxWidth : fullSize && params.availableWidth;\n layout.height = hBoxMaxHeight;\n } else {\n layout.width = vBoxMaxWidth;\n layout.height = factor ? factor * hBoxMaxHeight : fullSize && params.availableHeight;\n }\n }\n return stacks;\n}\n\nfunction buildLayoutBoxes(boxes) {\n const layoutBoxes = wrapBoxes(boxes);\n const fullSize = sortByWeight(layoutBoxes.filter(wrap => wrap.box.fullSize), true);\n const left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true);\n const right = sortByWeight(filterByPosition(layoutBoxes, 'right'));\n const top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true);\n const bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom'));\n const centerHorizontal = filterDynamicPositionByAxis(layoutBoxes, 'x');\n const centerVertical = filterDynamicPositionByAxis(layoutBoxes, 'y');\n\n return {\n fullSize,\n leftAndTop: left.concat(top),\n rightAndBottom: right.concat(centerVertical).concat(bottom).concat(centerHorizontal),\n chartArea: filterByPosition(layoutBoxes, 'chartArea'),\n vertical: left.concat(right).concat(centerVertical),\n horizontal: top.concat(bottom).concat(centerHorizontal)\n };\n}\n\nfunction getCombinedMax(maxPadding, chartArea, a, b) {\n return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);\n}\n\nfunction updateMaxPadding(maxPadding, boxPadding) {\n maxPadding.top = Math.max(maxPadding.top, boxPadding.top);\n maxPadding.left = Math.max(maxPadding.left, boxPadding.left);\n maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom);\n maxPadding.right = Math.max(maxPadding.right, boxPadding.right);\n}\n\nfunction updateDims(chartArea, params, layout, stacks) {\n const {pos, box} = layout;\n const maxPadding = chartArea.maxPadding;\n\n // dynamically placed boxes size is not considered\n if (!isObject(pos)) {\n if (layout.size) {\n // this layout was already counted for, lets first reduce old size\n chartArea[pos] -= layout.size;\n }\n const stack = stacks[layout.stack] || {size: 0, count: 1};\n stack.size = Math.max(stack.size, layout.horizontal ? box.height : box.width);\n layout.size = stack.size / stack.count;\n chartArea[pos] += layout.size;\n }\n\n if (box.getPadding) {\n updateMaxPadding(maxPadding, box.getPadding());\n }\n\n const newWidth = Math.max(0, params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right'));\n const newHeight = Math.max(0, params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom'));\n const widthChanged = newWidth !== chartArea.w;\n const heightChanged = newHeight !== chartArea.h;\n chartArea.w = newWidth;\n chartArea.h = newHeight;\n\n // return booleans on the changes per direction\n return layout.horizontal\n ? {same: widthChanged, other: heightChanged}\n : {same: heightChanged, other: widthChanged};\n}\n\nfunction handleMaxPadding(chartArea) {\n const maxPadding = chartArea.maxPadding;\n\n function updatePos(pos) {\n const change = Math.max(maxPadding[pos] - chartArea[pos], 0);\n chartArea[pos] += change;\n return change;\n }\n chartArea.y += updatePos('top');\n chartArea.x += updatePos('left');\n updatePos('right');\n updatePos('bottom');\n}\n\nfunction getMargins(horizontal, chartArea) {\n const maxPadding = chartArea.maxPadding;\n\n function marginForPositions(positions) {\n const margin = {left: 0, top: 0, right: 0, bottom: 0};\n positions.forEach((pos) => {\n margin[pos] = Math.max(chartArea[pos], maxPadding[pos]);\n });\n return margin;\n }\n\n return horizontal\n ? marginForPositions(['left', 'right'])\n : marginForPositions(['top', 'bottom']);\n}\n\nfunction fitBoxes(boxes, chartArea, params, stacks) {\n const refitBoxes = [];\n let i, ilen, layout, box, refit, changed;\n\n for (i = 0, ilen = boxes.length, refit = 0; i < ilen; ++i) {\n layout = boxes[i];\n box = layout.box;\n\n box.update(\n layout.width || chartArea.w,\n layout.height || chartArea.h,\n getMargins(layout.horizontal, chartArea)\n );\n const {same, other} = updateDims(chartArea, params, layout, stacks);\n\n // Dimensions changed and there were non full width boxes before this\n // -> we have to refit those\n refit |= same && refitBoxes.length;\n\n // Chart area changed in the opposite direction\n changed = changed || other;\n\n if (!box.fullSize) { // fullSize boxes don't need to be re-fitted in any case\n refitBoxes.push(layout);\n }\n }\n\n return refit && fitBoxes(refitBoxes, chartArea, params, stacks) || changed;\n}\n\nfunction setBoxDims(box, left, top, width, height) {\n box.top = top;\n box.left = left;\n box.right = left + width;\n box.bottom = top + height;\n box.width = width;\n box.height = height;\n}\n\nfunction placeBoxes(boxes, chartArea, params, stacks) {\n const userPadding = params.padding;\n let {x, y} = chartArea;\n\n for (const layout of boxes) {\n const box = layout.box;\n const stack = stacks[layout.stack] || {count: 1, placed: 0, weight: 1};\n const weight = (layout.stackWeight / stack.weight) || 1;\n if (layout.horizontal) {\n const width = chartArea.w * weight;\n const height = stack.size || box.height;\n if (defined(stack.start)) {\n y = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, userPadding.left, y, params.outerWidth - userPadding.right - userPadding.left, height);\n } else {\n setBoxDims(box, chartArea.left + stack.placed, y, width, height);\n }\n stack.start = y;\n stack.placed += width;\n y = box.bottom;\n } else {\n const height = chartArea.h * weight;\n const width = stack.size || box.width;\n if (defined(stack.start)) {\n x = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, x, userPadding.top, width, params.outerHeight - userPadding.bottom - userPadding.top);\n } else {\n setBoxDims(box, x, chartArea.top + stack.placed, width, height);\n }\n stack.start = x;\n stack.placed += height;\n x = box.right;\n }\n }\n\n chartArea.x = x;\n chartArea.y = y;\n}\n\n/**\n * @interface LayoutItem\n * @typedef {object} LayoutItem\n * @prop {string} position - The position of the item in the chart layout. Possible values are\n * 'left', 'top', 'right', 'bottom', and 'chartArea'\n * @prop {number} weight - The weight used to sort the item. Higher weights are further away from the chart area\n * @prop {boolean} fullSize - if true, and the item is horizontal, then push vertical boxes down\n * @prop {function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom)\n * @prop {function} update - Takes two parameters: width and height. Returns size of item\n * @prop {function} draw - Draws the element\n * @prop {function} [getPadding] - Returns an object with padding on the edges\n * @prop {number} width - Width of item. Must be valid after update()\n * @prop {number} height - Height of item. Must be valid after update()\n * @prop {number} left - Left edge of the item. Set by layout system and cannot be used in update\n * @prop {number} top - Top edge of the item. Set by layout system and cannot be used in update\n * @prop {number} right - Right edge of the item. Set by layout system and cannot be used in update\n * @prop {number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update\n */\n\n// The layout service is very self explanatory. It's responsible for the layout within a chart.\n// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need\n// It is this service's responsibility of carrying out that layout.\nexport default {\n\n /**\n\t * Register a box to a chart.\n\t * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title.\n\t * @param {Chart} chart - the chart to use\n\t * @param {LayoutItem} item - the item to add to be laid out\n\t */\n addBox(chart, item) {\n if (!chart.boxes) {\n chart.boxes = [];\n }\n\n // initialize item with default values\n item.fullSize = item.fullSize || false;\n item.position = item.position || 'top';\n item.weight = item.weight || 0;\n // @ts-ignore\n item._layers = item._layers || function() {\n return [{\n z: 0,\n draw(chartArea) {\n item.draw(chartArea);\n }\n }];\n };\n\n chart.boxes.push(item);\n },\n\n /**\n\t * Remove a layoutItem from a chart\n\t * @param {Chart} chart - the chart to remove the box from\n\t * @param {LayoutItem} layoutItem - the item to remove from the layout\n\t */\n removeBox(chart, layoutItem) {\n const index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n if (index !== -1) {\n chart.boxes.splice(index, 1);\n }\n },\n\n /**\n\t * Sets (or updates) options on the given `item`.\n\t * @param {Chart} chart - the chart in which the item lives (or will be added to)\n\t * @param {LayoutItem} item - the item to configure with the given options\n\t * @param {object} options - the new item options.\n\t */\n configure(chart, item, options) {\n item.fullSize = options.fullSize;\n item.position = options.position;\n item.weight = options.weight;\n },\n\n /**\n\t * Fits boxes of the given chart into the given size by having each box measure itself\n\t * then running a fitting algorithm\n\t * @param {Chart} chart - the chart\n\t * @param {number} width - the width to fit into\n\t * @param {number} height - the height to fit into\n * @param {number} minPadding - minimum padding required for each side of chart area\n\t */\n update(chart, width, height, minPadding) {\n if (!chart) {\n return;\n }\n\n const padding = toPadding(chart.options.layout.padding);\n const availableWidth = Math.max(width - padding.width, 0);\n const availableHeight = Math.max(height - padding.height, 0);\n const boxes = buildLayoutBoxes(chart.boxes);\n const verticalBoxes = boxes.vertical;\n const horizontalBoxes = boxes.horizontal;\n\n // Before any changes are made, notify boxes that an update is about to being\n // This is used to clear any cached data (e.g. scale limits)\n each(chart.boxes, box => {\n if (typeof box.beforeLayout === 'function') {\n box.beforeLayout();\n }\n });\n\n // Essentially we now have any number of boxes on each of the 4 sides.\n // Our canvas looks like the following.\n // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and\n // B1 is the bottom axis\n // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays\n // These locations are single-box locations only, when trying to register a chartArea location that is already taken,\n // an error will be thrown.\n //\n // |----------------------------------------------------|\n // | T1 (Full Width) |\n // |----------------------------------------------------|\n // | | | T2 | |\n // | |----|-------------------------------------|----|\n // | | | C1 | | C2 | |\n // | | |----| |----| |\n // | | | | |\n // | L1 | L2 | ChartArea (C0) | R1 |\n // | | | | |\n // | | |----| |----| |\n // | | | C3 | | C4 | |\n // | |----|-------------------------------------|----|\n // | | | B1 | |\n // |----------------------------------------------------|\n // | B2 (Full Width) |\n // |----------------------------------------------------|\n //\n\n const visibleVerticalBoxCount = verticalBoxes.reduce((total, wrap) =>\n wrap.box.options && wrap.box.options.display === false ? total : total + 1, 0) || 1;\n\n const params = Object.freeze({\n outerWidth: width,\n outerHeight: height,\n padding,\n availableWidth,\n availableHeight,\n vBoxMaxWidth: availableWidth / 2 / visibleVerticalBoxCount,\n hBoxMaxHeight: availableHeight / 2\n });\n const maxPadding = Object.assign({}, padding);\n updateMaxPadding(maxPadding, toPadding(minPadding));\n const chartArea = Object.assign({\n maxPadding,\n w: availableWidth,\n h: availableHeight,\n x: padding.left,\n y: padding.top\n }, padding);\n\n const stacks = setLayoutDims(verticalBoxes.concat(horizontalBoxes), params);\n\n // First fit the fullSize boxes, to reduce probability of re-fitting.\n fitBoxes(boxes.fullSize, chartArea, params, stacks);\n\n // Then fit vertical boxes\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n\n // Then fit horizontal boxes\n if (fitBoxes(horizontalBoxes, chartArea, params, stacks)) {\n // if the area changed, re-fit vertical boxes\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n }\n\n handleMaxPadding(chartArea);\n\n // Finally place the boxes to correct coordinates\n placeBoxes(boxes.leftAndTop, chartArea, params, stacks);\n\n // Move to opposite side of chart\n chartArea.x += chartArea.w;\n chartArea.y += chartArea.h;\n\n placeBoxes(boxes.rightAndBottom, chartArea, params, stacks);\n\n chart.chartArea = {\n left: chartArea.left,\n top: chartArea.top,\n right: chartArea.left + chartArea.w,\n bottom: chartArea.top + chartArea.h,\n height: chartArea.h,\n width: chartArea.w,\n };\n\n // Finally update boxes in chartArea (radial scale for example)\n each(boxes.chartArea, (layout) => {\n const box = layout.box;\n Object.assign(box, chart.chartArea);\n box.update(chartArea.w, chartArea.h, {left: 0, top: 0, right: 0, bottom: 0});\n });\n }\n};\n","\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\n/**\n * Abstract class that allows abstracting platform dependencies away from the chart.\n */\nexport default class BasePlatform {\n /**\n\t * Called at chart construction time, returns a context2d instance implementing\n\t * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}.\n\t * @param {HTMLCanvasElement} canvas - The canvas from which to acquire context (platform specific)\n\t * @param {number} [aspectRatio] - The chart options\n\t */\n acquireContext(canvas, aspectRatio) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Called at chart destruction time, releases any resources associated to the context\n\t * previously returned by the acquireContext() method.\n\t * @param {CanvasRenderingContext2D} context - The context2d instance\n\t * @returns {boolean} true if the method succeeded, else false\n\t */\n releaseContext(context) { // eslint-disable-line no-unused-vars\n return false;\n }\n\n /**\n\t * Registers the specified listener on the given chart.\n\t * @param {Chart} chart - Chart from which to listen for event\n\t * @param {string} type - The ({@link ChartEvent}) type to listen for\n\t * @param {function} listener - Receives a notification (an object that implements\n\t * the {@link ChartEvent} interface) when an event of the specified type occurs.\n\t */\n addEventListener(chart, type, listener) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Removes the specified listener previously registered with addEventListener.\n\t * @param {Chart} chart - Chart from which to remove the listener\n\t * @param {string} type - The ({@link ChartEvent}) type to remove\n\t * @param {function} listener - The listener function to remove from the event target.\n\t */\n removeEventListener(chart, type, listener) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * @returns {number} the current devicePixelRatio of the device this platform is connected to.\n\t */\n getDevicePixelRatio() {\n return 1;\n }\n\n /**\n\t * Returns the maximum size in pixels of given canvas element.\n\t * @param {HTMLCanvasElement} element\n\t * @param {number} [width] - content width of parent element\n\t * @param {number} [height] - content height of parent element\n\t * @param {number} [aspectRatio] - aspect ratio to maintain\n\t */\n getMaximumSize(element, width, height, aspectRatio) {\n width = Math.max(0, width || element.width);\n height = height || element.height;\n return {\n width,\n height: Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height)\n };\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @returns {boolean} true if the canvas is attached to the platform, false if not.\n\t */\n isAttached(canvas) { // eslint-disable-line no-unused-vars\n return true;\n }\n\n /**\n * Updates config with platform specific requirements\n * @param {import('../core/core.config.js').default} config\n */\n updateConfig(config) { // eslint-disable-line no-unused-vars\n // no-op\n }\n}\n","/**\n * Platform fallback implementation (minimal).\n * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939\n */\n\nimport BasePlatform from './platform.base.js';\n\n/**\n * Platform class for charts without access to the DOM or to many element properties\n * This platform is used by default for any chart passed an OffscreenCanvas.\n * @extends BasePlatform\n */\nexport default class BasicPlatform extends BasePlatform {\n acquireContext(item) {\n // To prevent canvas fingerprinting, some add-ons undefine the getContext\n // method, for example: https://github.com/kkapsner/CanvasBlocker\n // https://github.com/chartjs/Chart.js/issues/2807\n return item && item.getContext && item.getContext('2d') || null;\n }\n updateConfig(config) {\n config.options.animation = false;\n }\n}\n","/**\n * Chart.Platform implementation for targeting a web browser\n */\n\nimport BasePlatform from './platform.base.js';\nimport {_getParentNode, getRelativePosition, supportsEventListenerOptions, readUsedSize, getMaximumSize} from '../helpers/helpers.dom.js';\nimport {throttled} from '../helpers/helpers.extras.js';\nimport {isNullOrUndef} from '../helpers/helpers.core.js';\n\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\nconst EXPANDO_KEY = '$chartjs';\n\n/**\n * DOM event types -> Chart.js event types.\n * Note: only events with different types are mapped.\n * @see https://developer.mozilla.org/en-US/docs/Web/Events\n */\nconst EVENT_TYPES = {\n touchstart: 'mousedown',\n touchmove: 'mousemove',\n touchend: 'mouseup',\n pointerenter: 'mouseenter',\n pointerdown: 'mousedown',\n pointermove: 'mousemove',\n pointerup: 'mouseup',\n pointerleave: 'mouseout',\n pointerout: 'mouseout'\n};\n\nconst isNullOrEmpty = value => value === null || value === '';\n/**\n * Initializes the canvas style and render size without modifying the canvas display size,\n * since responsiveness is handled by the controller.resize() method. The config is used\n * to determine the aspect ratio to apply in case no explicit height has been specified.\n * @param {HTMLCanvasElement} canvas\n * @param {number} [aspectRatio]\n */\nfunction initCanvas(canvas, aspectRatio) {\n const style = canvas.style;\n\n // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it\n // returns null or '' if no explicit value has been set to the canvas attribute.\n const renderHeight = canvas.getAttribute('height');\n const renderWidth = canvas.getAttribute('width');\n\n // Chart.js modifies some canvas values that we want to restore on destroy\n canvas[EXPANDO_KEY] = {\n initial: {\n height: renderHeight,\n width: renderWidth,\n style: {\n display: style.display,\n height: style.height,\n width: style.width\n }\n }\n };\n\n // Force canvas to display as block to avoid extra space caused by inline\n // elements, which would interfere with the responsive resize process.\n // https://github.com/chartjs/Chart.js/issues/2538\n style.display = style.display || 'block';\n // Include possible borders in the size\n style.boxSizing = style.boxSizing || 'border-box';\n\n if (isNullOrEmpty(renderWidth)) {\n const displayWidth = readUsedSize(canvas, 'width');\n if (displayWidth !== undefined) {\n canvas.width = displayWidth;\n }\n }\n\n if (isNullOrEmpty(renderHeight)) {\n if (canvas.style.height === '') {\n // If no explicit render height and style height, let's apply the aspect ratio,\n // which one can be specified by the user but also by charts as default option\n // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2.\n canvas.height = canvas.width / (aspectRatio || 2);\n } else {\n const displayHeight = readUsedSize(canvas, 'height');\n if (displayHeight !== undefined) {\n canvas.height = displayHeight;\n }\n }\n }\n\n return canvas;\n}\n\n// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events.\n// https://github.com/chartjs/Chart.js/issues/4287\nconst eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false;\n\nfunction addListener(node, type, listener) {\n if (node) {\n node.addEventListener(type, listener, eventListenerOptions);\n }\n}\n\nfunction removeListener(chart, type, listener) {\n if (chart && chart.canvas) {\n chart.canvas.removeEventListener(type, listener, eventListenerOptions);\n }\n}\n\nfunction fromNativeEvent(event, chart) {\n const type = EVENT_TYPES[event.type] || event.type;\n const {x, y} = getRelativePosition(event, chart);\n return {\n type,\n chart,\n native: event,\n x: x !== undefined ? x : null,\n y: y !== undefined ? y : null,\n };\n}\n\nfunction nodeListContains(nodeList, canvas) {\n for (const node of nodeList) {\n if (node === canvas || node.contains(canvas)) {\n return true;\n }\n }\n}\n\nfunction createAttachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver(entries => {\n let trigger = false;\n for (const entry of entries) {\n trigger = trigger || nodeListContains(entry.addedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.removedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {childList: true, subtree: true});\n return observer;\n}\n\nfunction createDetachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver(entries => {\n let trigger = false;\n for (const entry of entries) {\n trigger = trigger || nodeListContains(entry.removedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.addedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {childList: true, subtree: true});\n return observer;\n}\n\nconst drpListeningCharts = new Map();\nlet oldDevicePixelRatio = 0;\n\nfunction onWindowResize() {\n const dpr = window.devicePixelRatio;\n if (dpr === oldDevicePixelRatio) {\n return;\n }\n oldDevicePixelRatio = dpr;\n drpListeningCharts.forEach((resize, chart) => {\n if (chart.currentDevicePixelRatio !== dpr) {\n resize();\n }\n });\n}\n\nfunction listenDevicePixelRatioChanges(chart, resize) {\n if (!drpListeningCharts.size) {\n window.addEventListener('resize', onWindowResize);\n }\n drpListeningCharts.set(chart, resize);\n}\n\nfunction unlistenDevicePixelRatioChanges(chart) {\n drpListeningCharts.delete(chart);\n if (!drpListeningCharts.size) {\n window.removeEventListener('resize', onWindowResize);\n }\n}\n\nfunction createResizeObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n return;\n }\n const resize = throttled((width, height) => {\n const w = container.clientWidth;\n listener(width, height);\n if (w < container.clientWidth) {\n // If the container size shrank during chart resize, let's assume\n // scrollbar appeared. So we resize again with the scrollbar visible -\n // effectively making chart smaller and the scrollbar hidden again.\n // Because we are inside `throttled`, and currently `ticking`, scroll\n // events are ignored during this whole 2 resize process.\n // If we assumed wrong and something else happened, we are resizing\n // twice in a frame (potential performance issue)\n listener();\n }\n }, window);\n\n // @ts-ignore until https://github.com/microsoft/TypeScript/issues/37861 implemented\n const observer = new ResizeObserver(entries => {\n const entry = entries[0];\n const width = entry.contentRect.width;\n const height = entry.contentRect.height;\n // When its container's display is set to 'none' the callback will be called with a\n // size of (0, 0), which will cause the chart to lose its original height, so skip\n // resizing in such case.\n if (width === 0 && height === 0) {\n return;\n }\n resize(width, height);\n });\n observer.observe(container);\n listenDevicePixelRatioChanges(chart, resize);\n\n return observer;\n}\n\nfunction releaseObserver(chart, type, observer) {\n if (observer) {\n observer.disconnect();\n }\n if (type === 'resize') {\n unlistenDevicePixelRatioChanges(chart);\n }\n}\n\nfunction createProxyAndListen(chart, type, listener) {\n const canvas = chart.canvas;\n const proxy = throttled((event) => {\n // This case can occur if the chart is destroyed while waiting\n // for the throttled function to occur. We prevent crashes by checking\n // for a destroyed chart\n if (chart.ctx !== null) {\n listener(fromNativeEvent(event, chart));\n }\n }, chart);\n\n addListener(canvas, type, proxy);\n\n return proxy;\n}\n\n/**\n * Platform class for charts that can access the DOM and global window/document properties\n * @extends BasePlatform\n */\nexport default class DomPlatform extends BasePlatform {\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @param {number} [aspectRatio]\n\t * @return {CanvasRenderingContext2D|null}\n\t */\n acquireContext(canvas, aspectRatio) {\n // To prevent canvas fingerprinting, some add-ons undefine the getContext\n // method, for example: https://github.com/kkapsner/CanvasBlocker\n // https://github.com/chartjs/Chart.js/issues/2807\n const context = canvas && canvas.getContext && canvas.getContext('2d');\n\n // `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the canvas is\n // inside an iframe or when running in a protected environment. We could guess the\n // types from their toString() value but let's keep things flexible and assume it's\n // a sufficient condition if the canvas has a context2D which has canvas as `canvas`.\n // https://github.com/chartjs/Chart.js/issues/3887\n // https://github.com/chartjs/Chart.js/issues/4102\n // https://github.com/chartjs/Chart.js/issues/4152\n if (context && context.canvas === canvas) {\n // Load platform resources on first chart creation, to make it possible to\n // import the library before setting platform options.\n initCanvas(canvas, aspectRatio);\n return context;\n }\n\n return null;\n }\n\n /**\n\t * @param {CanvasRenderingContext2D} context\n\t */\n releaseContext(context) {\n const canvas = context.canvas;\n if (!canvas[EXPANDO_KEY]) {\n return false;\n }\n\n const initial = canvas[EXPANDO_KEY].initial;\n ['height', 'width'].forEach((prop) => {\n const value = initial[prop];\n if (isNullOrUndef(value)) {\n canvas.removeAttribute(prop);\n } else {\n canvas.setAttribute(prop, value);\n }\n });\n\n const style = initial.style || {};\n Object.keys(style).forEach((key) => {\n canvas.style[key] = style[key];\n });\n\n // The canvas render size might have been changed (and thus the state stack discarded),\n // we can't use save() and restore() to restore the initial state. So make sure that at\n // least the canvas context is reset to the default state by setting the canvas width.\n // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html\n // eslint-disable-next-line no-self-assign\n canvas.width = canvas.width;\n\n delete canvas[EXPANDO_KEY];\n return true;\n }\n\n /**\n\t *\n\t * @param {Chart} chart\n\t * @param {string} type\n\t * @param {function} listener\n\t */\n addEventListener(chart, type, listener) {\n // Can have only one listener per type, so make sure previous is removed\n this.removeEventListener(chart, type);\n\n const proxies = chart.$proxies || (chart.$proxies = {});\n const handlers = {\n attach: createAttachObserver,\n detach: createDetachObserver,\n resize: createResizeObserver\n };\n const handler = handlers[type] || createProxyAndListen;\n proxies[type] = handler(chart, type, listener);\n }\n\n\n /**\n\t * @param {Chart} chart\n\t * @param {string} type\n\t */\n removeEventListener(chart, type) {\n const proxies = chart.$proxies || (chart.$proxies = {});\n const proxy = proxies[type];\n\n if (!proxy) {\n return;\n }\n\n const handlers = {\n attach: releaseObserver,\n detach: releaseObserver,\n resize: releaseObserver\n };\n const handler = handlers[type] || removeListener;\n handler(chart, type, proxy);\n proxies[type] = undefined;\n }\n\n getDevicePixelRatio() {\n return window.devicePixelRatio;\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @param {number} [width] - content width of parent element\n\t * @param {number} [height] - content height of parent element\n\t * @param {number} [aspectRatio] - aspect ratio to maintain\n\t */\n getMaximumSize(canvas, width, height, aspectRatio) {\n return getMaximumSize(canvas, width, height, aspectRatio);\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t */\n isAttached(canvas) {\n const container = canvas && _getParentNode(canvas);\n return !!(container && container.isConnected);\n }\n}\n","import {_isDomSupported} from '../helpers/index.js';\nimport BasePlatform from './platform.base.js';\nimport BasicPlatform from './platform.basic.js';\nimport DomPlatform from './platform.dom.js';\n\nexport function _detectPlatform(canvas) {\n if (!_isDomSupported() || (typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas)) {\n return BasicPlatform;\n }\n return DomPlatform;\n}\n\nexport {BasePlatform, BasicPlatform, DomPlatform};\n","import type {AnyObject} from '../types/basic.js';\nimport type {Point} from '../types/geometric.js';\nimport type {Animation} from '../types/animation.js';\nimport {isNumber} from '../helpers/helpers.math.js';\n\nexport default class Element {\n\n static defaults = {};\n static defaultRoutes = undefined;\n\n x: number;\n y: number;\n active = false;\n options: O;\n $animations: Record;\n\n tooltipPosition(useFinalPosition: boolean): Point {\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return {x, y} as Point;\n }\n\n hasValue() {\n return isNumber(this.x) && isNumber(this.y);\n }\n\n /**\n * Gets the current or final value of each prop. Can return extra properties (whole object).\n * @param props - properties to get\n * @param [final] - get the final value (animation target)\n */\n getProps

(props: P, final?: boolean): Pick;\n getProps

(props: P[], final?: boolean): Partial>;\n getProps(props: string[], final?: boolean): Partial> {\n const anims = this.$animations;\n if (!final || !anims) {\n // let's not create an object, if not needed\n return this as Record;\n }\n const ret: Record = {};\n props.forEach((prop) => {\n ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : this[prop as string];\n });\n return ret;\n }\n}\n","import {isNullOrUndef, valueOrDefault} from '../helpers/helpers.core.js';\nimport {_factorize} from '../helpers/helpers.math.js';\n\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef {{value:number | string, label?:string, major?:boolean, $context?:any}} Tick\n */\n\n/**\n * Returns a subset of ticks to be plotted to avoid overlapping labels.\n * @param {import('./core.scale.js').default} scale\n * @param {Tick[]} ticks\n * @return {Tick[]}\n * @private\n */\nexport function autoSkip(scale, ticks) {\n const tickOpts = scale.options.ticks;\n const determinedMaxTicks = determineMaxTicks(scale);\n const ticksLimit = Math.min(tickOpts.maxTicksLimit || determinedMaxTicks, determinedMaxTicks);\n const majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : [];\n const numMajorIndices = majorIndices.length;\n const first = majorIndices[0];\n const last = majorIndices[numMajorIndices - 1];\n const newTicks = [];\n\n // If there are too many major ticks to display them all\n if (numMajorIndices > ticksLimit) {\n skipMajors(ticks, newTicks, majorIndices, numMajorIndices / ticksLimit);\n return newTicks;\n }\n\n const spacing = calculateSpacing(majorIndices, ticks, ticksLimit);\n\n if (numMajorIndices > 0) {\n let i, ilen;\n const avgMajorSpacing = numMajorIndices > 1 ? Math.round((last - first) / (numMajorIndices - 1)) : null;\n skip(ticks, newTicks, spacing, isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first);\n for (i = 0, ilen = numMajorIndices - 1; i < ilen; i++) {\n skip(ticks, newTicks, spacing, majorIndices[i], majorIndices[i + 1]);\n }\n skip(ticks, newTicks, spacing, last, isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing);\n return newTicks;\n }\n skip(ticks, newTicks, spacing);\n return newTicks;\n}\n\nfunction determineMaxTicks(scale) {\n const offset = scale.options.offset;\n const tickLength = scale._tickSize();\n const maxScale = scale._length / tickLength + (offset ? 0 : 1);\n const maxChart = scale._maxLength / tickLength;\n return Math.floor(Math.min(maxScale, maxChart));\n}\n\n/**\n * @param {number[]} majorIndices\n * @param {Tick[]} ticks\n * @param {number} ticksLimit\n */\nfunction calculateSpacing(majorIndices, ticks, ticksLimit) {\n const evenMajorSpacing = getEvenSpacing(majorIndices);\n const spacing = ticks.length / ticksLimit;\n\n // If the major ticks are evenly spaced apart, place the minor ticks\n // so that they divide the major ticks into even chunks\n if (!evenMajorSpacing) {\n return Math.max(spacing, 1);\n }\n\n const factors = _factorize(evenMajorSpacing);\n for (let i = 0, ilen = factors.length - 1; i < ilen; i++) {\n const factor = factors[i];\n if (factor > spacing) {\n return factor;\n }\n }\n return Math.max(spacing, 1);\n}\n\n/**\n * @param {Tick[]} ticks\n */\nfunction getMajorIndices(ticks) {\n const result = [];\n let i, ilen;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n if (ticks[i].major) {\n result.push(i);\n }\n }\n return result;\n}\n\n/**\n * @param {Tick[]} ticks\n * @param {Tick[]} newTicks\n * @param {number[]} majorIndices\n * @param {number} spacing\n */\nfunction skipMajors(ticks, newTicks, majorIndices, spacing) {\n let count = 0;\n let next = majorIndices[0];\n let i;\n\n spacing = Math.ceil(spacing);\n for (i = 0; i < ticks.length; i++) {\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = majorIndices[count * spacing];\n }\n }\n}\n\n/**\n * @param {Tick[]} ticks\n * @param {Tick[]} newTicks\n * @param {number} spacing\n * @param {number} [majorStart]\n * @param {number} [majorEnd]\n */\nfunction skip(ticks, newTicks, spacing, majorStart, majorEnd) {\n const start = valueOrDefault(majorStart, 0);\n const end = Math.min(valueOrDefault(majorEnd, ticks.length), ticks.length);\n let count = 0;\n let length, i, next;\n\n spacing = Math.ceil(spacing);\n if (majorEnd) {\n length = majorEnd - majorStart;\n spacing = length / Math.floor(length / spacing);\n }\n\n next = start;\n\n while (next < 0) {\n count++;\n next = Math.round(start + count * spacing);\n }\n\n for (i = Math.max(start, 0); i < end; i++) {\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = Math.round(start + count * spacing);\n }\n }\n}\n\n\n/**\n * @param {number[]} arr\n */\nfunction getEvenSpacing(arr) {\n const len = arr.length;\n let i, diff;\n\n if (len < 2) {\n return false;\n }\n\n for (diff = arr[0], i = 1; i < len; ++i) {\n if (arr[i] - arr[i - 1] !== diff) {\n return false;\n }\n }\n return diff;\n}\n","import Element from './core.element.js';\nimport {_alignPixel, _measureText, renderText, clipArea, unclipArea} from '../helpers/helpers.canvas.js';\nimport {callback as call, each, finiteOrDefault, isArray, isFinite, isNullOrUndef, isObject, valueOrDefault} from '../helpers/helpers.core.js';\nimport {toDegrees, toRadians, _int16Range, _limitValue, HALF_PI} from '../helpers/helpers.math.js';\nimport {_alignStartEnd, _toLeftRightCenter} from '../helpers/helpers.extras.js';\nimport {createContext, toFont, toPadding, _addGrace} from '../helpers/helpers.options.js';\nimport {autoSkip} from './core.scale.autoskip.js';\n\nconst reverseAlign = (align) => align === 'left' ? 'right' : align === 'right' ? 'left' : align;\nconst offsetFromEdge = (scale, edge, offset) => edge === 'top' || edge === 'left' ? scale[edge] + offset : scale[edge] - offset;\nconst getTicksLimit = (ticksLength, maxTicksLimit) => Math.min(maxTicksLimit || ticksLength, ticksLength);\n\n/**\n * @typedef { import('../types/index.js').Chart } Chart\n * @typedef {{value:number | string, label?:string, major?:boolean, $context?:any}} Tick\n */\n\n/**\n * Returns a new array containing numItems from arr\n * @param {any[]} arr\n * @param {number} numItems\n */\nfunction sample(arr, numItems) {\n const result = [];\n const increment = arr.length / numItems;\n const len = arr.length;\n let i = 0;\n\n for (; i < len; i += increment) {\n result.push(arr[Math.floor(i)]);\n }\n return result;\n}\n\n/**\n * @param {Scale} scale\n * @param {number} index\n * @param {boolean} offsetGridLines\n */\nfunction getPixelForGridLine(scale, index, offsetGridLines) {\n const length = scale.ticks.length;\n const validIndex = Math.min(index, length - 1);\n const start = scale._startPixel;\n const end = scale._endPixel;\n const epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error.\n let lineValue = scale.getPixelForTick(validIndex);\n let offset;\n\n if (offsetGridLines) {\n if (length === 1) {\n offset = Math.max(lineValue - start, end - lineValue);\n } else if (index === 0) {\n offset = (scale.getPixelForTick(1) - lineValue) / 2;\n } else {\n offset = (lineValue - scale.getPixelForTick(validIndex - 1)) / 2;\n }\n lineValue += validIndex < index ? offset : -offset;\n\n // Return undefined if the pixel is out of the range\n if (lineValue < start - epsilon || lineValue > end + epsilon) {\n return;\n }\n }\n return lineValue;\n}\n\n/**\n * @param {object} caches\n * @param {number} length\n */\nfunction garbageCollect(caches, length) {\n each(caches, (cache) => {\n const gc = cache.gc;\n const gcLen = gc.length / 2;\n let i;\n if (gcLen > length) {\n for (i = 0; i < gcLen; ++i) {\n delete cache.data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n });\n}\n\n/**\n * @param {object} options\n */\nfunction getTickMarkLength(options) {\n return options.drawTicks ? options.tickLength : 0;\n}\n\n/**\n * @param {object} options\n */\nfunction getTitleHeight(options, fallback) {\n if (!options.display) {\n return 0;\n }\n\n const font = toFont(options.font, fallback);\n const padding = toPadding(options.padding);\n const lines = isArray(options.text) ? options.text.length : 1;\n\n return (lines * font.lineHeight) + padding.height;\n}\n\nfunction createScaleContext(parent, scale) {\n return createContext(parent, {\n scale,\n type: 'scale'\n });\n}\n\nfunction createTickContext(parent, index, tick) {\n return createContext(parent, {\n tick,\n index,\n type: 'tick'\n });\n}\n\nfunction titleAlign(align, position, reverse) {\n /** @type {CanvasTextAlign} */\n let ret = _toLeftRightCenter(align);\n if ((reverse && position !== 'right') || (!reverse && position === 'right')) {\n ret = reverseAlign(ret);\n }\n return ret;\n}\n\nfunction titleArgs(scale, offset, position, align) {\n const {top, left, bottom, right, chart} = scale;\n const {chartArea, scales} = chart;\n let rotation = 0;\n let maxWidth, titleX, titleY;\n const height = bottom - top;\n const width = right - left;\n\n if (scale.isHorizontal()) {\n titleX = _alignStartEnd(align, left, right);\n\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleY = scales[positionAxisID].getPixelForValue(value) + height - offset;\n } else if (position === 'center') {\n titleY = (chartArea.bottom + chartArea.top) / 2 + height - offset;\n } else {\n titleY = offsetFromEdge(scale, position, offset);\n }\n maxWidth = right - left;\n } else {\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleX = scales[positionAxisID].getPixelForValue(value) - width + offset;\n } else if (position === 'center') {\n titleX = (chartArea.left + chartArea.right) / 2 - width + offset;\n } else {\n titleX = offsetFromEdge(scale, position, offset);\n }\n titleY = _alignStartEnd(align, bottom, top);\n rotation = position === 'left' ? -HALF_PI : HALF_PI;\n }\n return {titleX, titleY, maxWidth, rotation};\n}\n\nexport default class Scale extends Element {\n\n // eslint-disable-next-line max-statements\n constructor(cfg) {\n super();\n\n /** @type {string} */\n this.id = cfg.id;\n /** @type {string} */\n this.type = cfg.type;\n /** @type {any} */\n this.options = undefined;\n /** @type {CanvasRenderingContext2D} */\n this.ctx = cfg.ctx;\n /** @type {Chart} */\n this.chart = cfg.chart;\n\n // implements box\n /** @type {number} */\n this.top = undefined;\n /** @type {number} */\n this.bottom = undefined;\n /** @type {number} */\n this.left = undefined;\n /** @type {number} */\n this.right = undefined;\n /** @type {number} */\n this.width = undefined;\n /** @type {number} */\n this.height = undefined;\n this._margins = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n };\n /** @type {number} */\n this.maxWidth = undefined;\n /** @type {number} */\n this.maxHeight = undefined;\n /** @type {number} */\n this.paddingTop = undefined;\n /** @type {number} */\n this.paddingBottom = undefined;\n /** @type {number} */\n this.paddingLeft = undefined;\n /** @type {number} */\n this.paddingRight = undefined;\n\n // scale-specific properties\n /** @type {string=} */\n this.axis = undefined;\n /** @type {number=} */\n this.labelRotation = undefined;\n this.min = undefined;\n this.max = undefined;\n this._range = undefined;\n /** @type {Tick[]} */\n this.ticks = [];\n /** @type {object[]|null} */\n this._gridLineItems = null;\n /** @type {object[]|null} */\n this._labelItems = null;\n /** @type {object|null} */\n this._labelSizes = null;\n this._length = 0;\n this._maxLength = 0;\n this._longestTextCache = {};\n /** @type {number} */\n this._startPixel = undefined;\n /** @type {number} */\n this._endPixel = undefined;\n this._reversePixels = false;\n this._userMax = undefined;\n this._userMin = undefined;\n this._suggestedMax = undefined;\n this._suggestedMin = undefined;\n this._ticksLength = 0;\n this._borderValue = 0;\n this._cache = {};\n this._dataLimitsCached = false;\n this.$context = undefined;\n }\n\n /**\n\t * @param {any} options\n\t * @since 3.0\n\t */\n init(options) {\n this.options = options.setContext(this.getContext());\n\n this.axis = options.axis;\n\n // parse min/max value, so we can properly determine min/max for other scales\n this._userMin = this.parse(options.min);\n this._userMax = this.parse(options.max);\n this._suggestedMin = this.parse(options.suggestedMin);\n this._suggestedMax = this.parse(options.suggestedMax);\n }\n\n /**\n\t * Parse a supported input value to internal representation.\n\t * @param {*} raw\n\t * @param {number} [index]\n\t * @since 3.0\n\t */\n parse(raw, index) { // eslint-disable-line no-unused-vars\n return raw;\n }\n\n /**\n\t * @return {{min: number, max: number, minDefined: boolean, maxDefined: boolean}}\n\t * @protected\n\t * @since 3.0\n\t */\n getUserBounds() {\n let {_userMin, _userMax, _suggestedMin, _suggestedMax} = this;\n _userMin = finiteOrDefault(_userMin, Number.POSITIVE_INFINITY);\n _userMax = finiteOrDefault(_userMax, Number.NEGATIVE_INFINITY);\n _suggestedMin = finiteOrDefault(_suggestedMin, Number.POSITIVE_INFINITY);\n _suggestedMax = finiteOrDefault(_suggestedMax, Number.NEGATIVE_INFINITY);\n return {\n min: finiteOrDefault(_userMin, _suggestedMin),\n max: finiteOrDefault(_userMax, _suggestedMax),\n minDefined: isFinite(_userMin),\n maxDefined: isFinite(_userMax)\n };\n }\n\n /**\n\t * @param {boolean} canStack\n\t * @return {{min: number, max: number}}\n\t * @protected\n\t * @since 3.0\n\t */\n getMinMax(canStack) {\n let {min, max, minDefined, maxDefined} = this.getUserBounds();\n let range;\n\n if (minDefined && maxDefined) {\n return {min, max};\n }\n\n const metas = this.getMatchingVisibleMetas();\n for (let i = 0, ilen = metas.length; i < ilen; ++i) {\n range = metas[i].controller.getMinMax(this, canStack);\n if (!minDefined) {\n min = Math.min(min, range.min);\n }\n if (!maxDefined) {\n max = Math.max(max, range.max);\n }\n }\n\n // Make sure min <= max when only min or max is defined by user and the data is outside that range\n min = maxDefined && min > max ? max : min;\n max = minDefined && min > max ? min : max;\n\n return {\n min: finiteOrDefault(min, finiteOrDefault(max, min)),\n max: finiteOrDefault(max, finiteOrDefault(min, max))\n };\n }\n\n /**\n\t * Get the padding needed for the scale\n\t * @return {{top: number, left: number, bottom: number, right: number}} the necessary padding\n\t * @private\n\t */\n getPadding() {\n return {\n left: this.paddingLeft || 0,\n top: this.paddingTop || 0,\n right: this.paddingRight || 0,\n bottom: this.paddingBottom || 0\n };\n }\n\n /**\n\t * Returns the scale tick objects\n\t * @return {Tick[]}\n\t * @since 2.7\n\t */\n getTicks() {\n return this.ticks;\n }\n\n /**\n\t * @return {string[]}\n\t */\n getLabels() {\n const data = this.chart.data;\n return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];\n }\n\n /**\n * @return {import('../types.js').LabelItem[]}\n */\n getLabelItems(chartArea = this.chart.chartArea) {\n const items = this._labelItems || (this._labelItems = this._computeLabelItems(chartArea));\n return items;\n }\n\n // When a new layout is created, reset the data limits cache\n beforeLayout() {\n this._cache = {};\n this._dataLimitsCached = false;\n }\n\n // These methods are ordered by lifecycle. Utilities then follow.\n // Any function defined here is inherited by all scale types.\n // Any function can be extended by the scale type\n\n beforeUpdate() {\n call(this.options.beforeUpdate, [this]);\n }\n\n /**\n\t * @param {number} maxWidth - the max width in pixels\n\t * @param {number} maxHeight - the max height in pixels\n\t * @param {{top: number, left: number, bottom: number, right: number}} margins - the space between the edge of the other scales and edge of the chart\n\t * This space comes from two sources:\n\t * - padding - space that's required to show the labels at the edges of the scale\n\t * - thickness of scales or legends in another orientation\n\t */\n update(maxWidth, maxHeight, margins) {\n const {beginAtZero, grace, ticks: tickOpts} = this.options;\n const sampleSize = tickOpts.sampleSize;\n\n // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n this.beforeUpdate();\n\n // Absorb the master measurements\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins = Object.assign({\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n }, margins);\n\n this.ticks = null;\n this._labelSizes = null;\n this._gridLineItems = null;\n this._labelItems = null;\n\n // Dimensions\n this.beforeSetDimensions();\n this.setDimensions();\n this.afterSetDimensions();\n\n this._maxLength = this.isHorizontal()\n ? this.width + margins.left + margins.right\n : this.height + margins.top + margins.bottom;\n\n // Data min/max\n if (!this._dataLimitsCached) {\n this.beforeDataLimits();\n this.determineDataLimits();\n this.afterDataLimits();\n this._range = _addGrace(this, grace, beginAtZero);\n this._dataLimitsCached = true;\n }\n\n this.beforeBuildTicks();\n\n this.ticks = this.buildTicks() || [];\n\n // Allow modification of ticks in callback.\n this.afterBuildTicks();\n\n // Compute tick rotation and fit using a sampled subset of labels\n // We generally don't need to compute the size of every single label for determining scale size\n const samplingEnabled = sampleSize < this.ticks.length;\n this._convertTicksToLabels(samplingEnabled ? sample(this.ticks, sampleSize) : this.ticks);\n\n // configure is called twice, once here, once from core.controller.updateLayout.\n // Here we haven't been positioned yet, but dimensions are correct.\n // Variables set in configure are needed for calculateLabelRotation, and\n // it's ok that coordinates are not correct there, only dimensions matter.\n this.configure();\n\n // Tick Rotation\n this.beforeCalculateLabelRotation();\n this.calculateLabelRotation(); // Preconditions: number of ticks and sizes of largest labels must be calculated beforehand\n this.afterCalculateLabelRotation();\n\n // Auto-skip\n if (tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto')) {\n this.ticks = autoSkip(this, this.ticks);\n this._labelSizes = null;\n this.afterAutoSkip();\n }\n\n if (samplingEnabled) {\n // Generate labels using all non-skipped ticks\n this._convertTicksToLabels(this.ticks);\n }\n\n this.beforeFit();\n this.fit(); // Preconditions: label rotation and label sizes must be calculated beforehand\n this.afterFit();\n\n // IMPORTANT: after this point, we consider that `this.ticks` will NEVER change!\n\n this.afterUpdate();\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n let reversePixels = this.options.reverse;\n let startPixel, endPixel;\n\n if (this.isHorizontal()) {\n startPixel = this.left;\n endPixel = this.right;\n } else {\n startPixel = this.top;\n endPixel = this.bottom;\n // by default vertical scales are from bottom to top, so pixels are reversed\n reversePixels = !reversePixels;\n }\n this._startPixel = startPixel;\n this._endPixel = endPixel;\n this._reversePixels = reversePixels;\n this._length = endPixel - startPixel;\n this._alignToPixels = this.options.alignToPixels;\n }\n\n afterUpdate() {\n call(this.options.afterUpdate, [this]);\n }\n\n //\n\n beforeSetDimensions() {\n call(this.options.beforeSetDimensions, [this]);\n }\n setDimensions() {\n // Set the unconstrained dimension before label rotation\n if (this.isHorizontal()) {\n // Reset position before calculating rotation\n this.width = this.maxWidth;\n this.left = 0;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n\n // Reset position before calculating rotation\n this.top = 0;\n this.bottom = this.height;\n }\n\n // Reset padding\n this.paddingLeft = 0;\n this.paddingTop = 0;\n this.paddingRight = 0;\n this.paddingBottom = 0;\n }\n afterSetDimensions() {\n call(this.options.afterSetDimensions, [this]);\n }\n\n _callHooks(name) {\n this.chart.notifyPlugins(name, this.getContext());\n call(this.options[name], [this]);\n }\n\n // Data limits\n beforeDataLimits() {\n this._callHooks('beforeDataLimits');\n }\n determineDataLimits() {}\n afterDataLimits() {\n this._callHooks('afterDataLimits');\n }\n\n //\n beforeBuildTicks() {\n this._callHooks('beforeBuildTicks');\n }\n /**\n\t * @return {object[]} the ticks\n\t */\n buildTicks() {\n return [];\n }\n afterBuildTicks() {\n this._callHooks('afterBuildTicks');\n }\n\n beforeTickToLabelConversion() {\n call(this.options.beforeTickToLabelConversion, [this]);\n }\n /**\n\t * Convert ticks to label strings\n\t * @param {Tick[]} ticks\n\t */\n generateTickLabels(ticks) {\n const tickOpts = this.options.ticks;\n let i, ilen, tick;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n tick = ticks[i];\n tick.label = call(tickOpts.callback, [tick.value, i, ticks], this);\n }\n }\n afterTickToLabelConversion() {\n call(this.options.afterTickToLabelConversion, [this]);\n }\n\n //\n\n beforeCalculateLabelRotation() {\n call(this.options.beforeCalculateLabelRotation, [this]);\n }\n calculateLabelRotation() {\n const options = this.options;\n const tickOpts = options.ticks;\n const numTicks = getTicksLimit(this.ticks.length, options.ticks.maxTicksLimit);\n const minRotation = tickOpts.minRotation || 0;\n const maxRotation = tickOpts.maxRotation;\n let labelRotation = minRotation;\n let tickWidth, maxHeight, maxLabelDiagonal;\n\n if (!this._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !this.isHorizontal()) {\n this.labelRotation = minRotation;\n return;\n }\n\n const labelSizes = this._getLabelSizes();\n const maxLabelWidth = labelSizes.widest.width;\n const maxLabelHeight = labelSizes.highest.height;\n\n // Estimate the width of each grid based on the canvas width, the maximum\n // label width and the number of tick intervals\n const maxWidth = _limitValue(this.chart.width - maxLabelWidth, 0, this.maxWidth);\n tickWidth = options.offset ? this.maxWidth / numTicks : maxWidth / (numTicks - 1);\n\n // Allow 3 pixels x2 padding either side for label readability\n if (maxLabelWidth + 6 > tickWidth) {\n tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));\n maxHeight = this.maxHeight - getTickMarkLength(options.grid)\n\t\t\t\t- tickOpts.padding - getTitleHeight(options.title, this.chart.options.font);\n maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight);\n labelRotation = toDegrees(Math.min(\n Math.asin(_limitValue((labelSizes.highest.height + 6) / tickWidth, -1, 1)),\n Math.asin(_limitValue(maxHeight / maxLabelDiagonal, -1, 1)) - Math.asin(_limitValue(maxLabelHeight / maxLabelDiagonal, -1, 1))\n ));\n labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation));\n }\n\n this.labelRotation = labelRotation;\n }\n afterCalculateLabelRotation() {\n call(this.options.afterCalculateLabelRotation, [this]);\n }\n afterAutoSkip() {}\n\n //\n\n beforeFit() {\n call(this.options.beforeFit, [this]);\n }\n fit() {\n // Reset\n const minSize = {\n width: 0,\n height: 0\n };\n\n const {chart, options: {ticks: tickOpts, title: titleOpts, grid: gridOpts}} = this;\n const display = this._isVisible();\n const isHorizontal = this.isHorizontal();\n\n if (display) {\n const titleHeight = getTitleHeight(titleOpts, chart.options.font);\n if (isHorizontal) {\n minSize.width = this.maxWidth;\n minSize.height = getTickMarkLength(gridOpts) + titleHeight;\n } else {\n minSize.height = this.maxHeight; // fill all the height\n minSize.width = getTickMarkLength(gridOpts) + titleHeight;\n }\n\n // Don't bother fitting the ticks if we are not showing the labels\n if (tickOpts.display && this.ticks.length) {\n const {first, last, widest, highest} = this._getLabelSizes();\n const tickPadding = tickOpts.padding * 2;\n const angleRadians = toRadians(this.labelRotation);\n const cos = Math.cos(angleRadians);\n const sin = Math.sin(angleRadians);\n\n if (isHorizontal) {\n // A horizontal axis is more constrained by the height.\n const labelHeight = tickOpts.mirror ? 0 : sin * widest.width + cos * highest.height;\n minSize.height = Math.min(this.maxHeight, minSize.height + labelHeight + tickPadding);\n } else {\n // A vertical axis is more constrained by the width. Labels are the\n // dominant factor here, so get that length first and account for padding\n const labelWidth = tickOpts.mirror ? 0 : cos * widest.width + sin * highest.height;\n\n minSize.width = Math.min(this.maxWidth, minSize.width + labelWidth + tickPadding);\n }\n this._calculatePadding(first, last, sin, cos);\n }\n }\n\n this._handleMargins();\n\n if (isHorizontal) {\n this.width = this._length = chart.width - this._margins.left - this._margins.right;\n this.height = minSize.height;\n } else {\n this.width = minSize.width;\n this.height = this._length = chart.height - this._margins.top - this._margins.bottom;\n }\n }\n\n _calculatePadding(first, last, sin, cos) {\n const {ticks: {align, padding}, position} = this.options;\n const isRotated = this.labelRotation !== 0;\n const labelsBelowTicks = position !== 'top' && this.axis === 'x';\n\n if (this.isHorizontal()) {\n const offsetLeft = this.getPixelForTick(0) - this.left;\n const offsetRight = this.right - this.getPixelForTick(this.ticks.length - 1);\n let paddingLeft = 0;\n let paddingRight = 0;\n\n // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned\n // which means that the right padding is dominated by the font height\n if (isRotated) {\n if (labelsBelowTicks) {\n paddingLeft = cos * first.width;\n paddingRight = sin * last.height;\n } else {\n paddingLeft = sin * first.height;\n paddingRight = cos * last.width;\n }\n } else if (align === 'start') {\n paddingRight = last.width;\n } else if (align === 'end') {\n paddingLeft = first.width;\n } else if (align !== 'inner') {\n paddingLeft = first.width / 2;\n paddingRight = last.width / 2;\n }\n\n // Adjust padding taking into account changes in offsets\n this.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * this.width / (this.width - offsetLeft), 0);\n this.paddingRight = Math.max((paddingRight - offsetRight + padding) * this.width / (this.width - offsetRight), 0);\n } else {\n let paddingTop = last.height / 2;\n let paddingBottom = first.height / 2;\n\n if (align === 'start') {\n paddingTop = 0;\n paddingBottom = first.height;\n } else if (align === 'end') {\n paddingTop = last.height;\n paddingBottom = 0;\n }\n\n this.paddingTop = paddingTop + padding;\n this.paddingBottom = paddingBottom + padding;\n }\n }\n\n /**\n\t * Handle margins and padding interactions\n\t * @private\n\t */\n _handleMargins() {\n if (this._margins) {\n this._margins.left = Math.max(this.paddingLeft, this._margins.left);\n this._margins.top = Math.max(this.paddingTop, this._margins.top);\n this._margins.right = Math.max(this.paddingRight, this._margins.right);\n this._margins.bottom = Math.max(this.paddingBottom, this._margins.bottom);\n }\n }\n\n afterFit() {\n call(this.options.afterFit, [this]);\n }\n\n // Shared Methods\n /**\n\t * @return {boolean}\n\t */\n isHorizontal() {\n const {axis, position} = this.options;\n return position === 'top' || position === 'bottom' || axis === 'x';\n }\n /**\n\t * @return {boolean}\n\t */\n isFullSize() {\n return this.options.fullSize;\n }\n\n /**\n\t * @param {Tick[]} ticks\n\t * @private\n\t */\n _convertTicksToLabels(ticks) {\n this.beforeTickToLabelConversion();\n\n this.generateTickLabels(ticks);\n\n // Ticks should be skipped when callback returns null or undef, so lets remove those.\n let i, ilen;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n if (isNullOrUndef(ticks[i].label)) {\n ticks.splice(i, 1);\n ilen--;\n i--;\n }\n }\n\n this.afterTickToLabelConversion();\n }\n\n /**\n\t * @return {{ first: object, last: object, widest: object, highest: object, widths: Array, heights: array }}\n\t * @private\n\t */\n _getLabelSizes() {\n let labelSizes = this._labelSizes;\n\n if (!labelSizes) {\n const sampleSize = this.options.ticks.sampleSize;\n let ticks = this.ticks;\n if (sampleSize < ticks.length) {\n ticks = sample(ticks, sampleSize);\n }\n\n this._labelSizes = labelSizes = this._computeLabelSizes(ticks, ticks.length, this.options.ticks.maxTicksLimit);\n }\n\n return labelSizes;\n }\n\n /**\n\t * Returns {width, height, offset} objects for the first, last, widest, highest tick\n\t * labels where offset indicates the anchor point offset from the top in pixels.\n\t * @return {{ first: object, last: object, widest: object, highest: object, widths: Array, heights: array }}\n\t * @private\n\t */\n _computeLabelSizes(ticks, length, maxTicksLimit) {\n const {ctx, _longestTextCache: caches} = this;\n const widths = [];\n const heights = [];\n const increment = Math.floor(length / getTicksLimit(length, maxTicksLimit));\n let widestLabelSize = 0;\n let highestLabelSize = 0;\n let i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel;\n\n for (i = 0; i < length; i += increment) {\n label = ticks[i].label;\n tickFont = this._resolveTickFontOptions(i);\n ctx.font = fontString = tickFont.string;\n cache = caches[fontString] = caches[fontString] || {data: {}, gc: []};\n lineHeight = tickFont.lineHeight;\n width = height = 0;\n // Undefined labels and arrays should not be measured\n if (!isNullOrUndef(label) && !isArray(label)) {\n width = _measureText(ctx, cache.data, cache.gc, width, label);\n height = lineHeight;\n } else if (isArray(label)) {\n // if it is an array let's measure each element\n for (j = 0, jlen = label.length; j < jlen; ++j) {\n nestedLabel = /** @type {string} */ (label[j]);\n // Undefined labels and arrays should not be measured\n if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) {\n width = _measureText(ctx, cache.data, cache.gc, width, nestedLabel);\n height += lineHeight;\n }\n }\n }\n widths.push(width);\n heights.push(height);\n widestLabelSize = Math.max(width, widestLabelSize);\n highestLabelSize = Math.max(height, highestLabelSize);\n }\n garbageCollect(caches, length);\n\n const widest = widths.indexOf(widestLabelSize);\n const highest = heights.indexOf(highestLabelSize);\n\n const valueAt = (idx) => ({width: widths[idx] || 0, height: heights[idx] || 0});\n\n return {\n first: valueAt(0),\n last: valueAt(length - 1),\n widest: valueAt(widest),\n highest: valueAt(highest),\n widths,\n heights,\n };\n }\n\n /**\n\t * Used to get the label to display in the tooltip for the given value\n\t * @param {*} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n return value;\n }\n\n /**\n\t * Returns the location of the given data point. Value can either be an index or a numerical value\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {*} value\n\t * @param {number} [index]\n\t * @return {number}\n\t */\n getPixelForValue(value, index) { // eslint-disable-line no-unused-vars\n return NaN;\n }\n\n /**\n\t * Used to get the data value from a given pixel. This is the inverse of getPixelForValue\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} pixel\n\t * @return {*}\n\t */\n getValueForPixel(pixel) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Returns the location of the tick at the given index\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} index\n\t * @return {number}\n\t */\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n\n /**\n\t * Utility for getting the pixel location of a percentage of scale\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} decimal\n\t * @return {number}\n\t */\n getPixelForDecimal(decimal) {\n if (this._reversePixels) {\n decimal = 1 - decimal;\n }\n\n const pixel = this._startPixel + decimal * this._length;\n return _int16Range(this._alignToPixels ? _alignPixel(this.chart, pixel, 0) : pixel);\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getDecimalForPixel(pixel) {\n const decimal = (pixel - this._startPixel) / this._length;\n return this._reversePixels ? 1 - decimal : decimal;\n }\n\n /**\n\t * Returns the pixel for the minimum chart value\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @return {number}\n\t */\n getBasePixel() {\n return this.getPixelForValue(this.getBaseValue());\n }\n\n /**\n\t * @return {number}\n\t */\n getBaseValue() {\n const {min, max} = this;\n\n return min < 0 && max < 0 ? max :\n min > 0 && max > 0 ? min :\n 0;\n }\n\n /**\n\t * @protected\n\t */\n getContext(index) {\n const ticks = this.ticks || [];\n\n if (index >= 0 && index < ticks.length) {\n const tick = ticks[index];\n return tick.$context ||\n\t\t\t\t(tick.$context = createTickContext(this.getContext(), index, tick));\n }\n return this.$context ||\n\t\t\t(this.$context = createScaleContext(this.chart.getContext(), this));\n }\n\n /**\n\t * @return {number}\n\t * @private\n\t */\n _tickSize() {\n const optionTicks = this.options.ticks;\n\n // Calculate space needed by label in axis direction.\n const rot = toRadians(this.labelRotation);\n const cos = Math.abs(Math.cos(rot));\n const sin = Math.abs(Math.sin(rot));\n\n const labelSizes = this._getLabelSizes();\n const padding = optionTicks.autoSkipPadding || 0;\n const w = labelSizes ? labelSizes.widest.width + padding : 0;\n const h = labelSizes ? labelSizes.highest.height + padding : 0;\n\n // Calculate space needed for 1 tick in axis direction.\n return this.isHorizontal()\n ? h * cos > w * sin ? w / cos : h / sin\n : h * sin < w * cos ? h / cos : w / sin;\n }\n\n /**\n\t * @return {boolean}\n\t * @private\n\t */\n _isVisible() {\n const display = this.options.display;\n\n if (display !== 'auto') {\n return !!display;\n }\n\n return this.getMatchingVisibleMetas().length > 0;\n }\n\n /**\n\t * @private\n\t */\n _computeGridLineItems(chartArea) {\n const axis = this.axis;\n const chart = this.chart;\n const options = this.options;\n const {grid, position, border} = options;\n const offset = grid.offset;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const ticksLength = ticks.length + (offset ? 1 : 0);\n const tl = getTickMarkLength(grid);\n const items = [];\n\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = borderOpts.display ? borderOpts.width : 0;\n const axisHalfWidth = axisWidth / 2;\n const alignBorderValue = function(pixel) {\n return _alignPixel(chart, pixel, axisWidth);\n };\n let borderValue, i, lineValue, alignedLineValue;\n let tx1, ty1, tx2, ty2, x1, y1, x2, y2;\n\n if (position === 'top') {\n borderValue = alignBorderValue(this.bottom);\n ty1 = this.bottom - tl;\n ty2 = borderValue - axisHalfWidth;\n y1 = alignBorderValue(chartArea.top) + axisHalfWidth;\n y2 = chartArea.bottom;\n } else if (position === 'bottom') {\n borderValue = alignBorderValue(this.top);\n y1 = chartArea.top;\n y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;\n ty1 = borderValue + axisHalfWidth;\n ty2 = this.top + tl;\n } else if (position === 'left') {\n borderValue = alignBorderValue(this.right);\n tx1 = this.right - tl;\n tx2 = borderValue - axisHalfWidth;\n x1 = alignBorderValue(chartArea.left) + axisHalfWidth;\n x2 = chartArea.right;\n } else if (position === 'right') {\n borderValue = alignBorderValue(this.left);\n x1 = chartArea.left;\n x2 = alignBorderValue(chartArea.right) - axisHalfWidth;\n tx1 = borderValue + axisHalfWidth;\n tx2 = this.left + tl;\n } else if (axis === 'x') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.top + chartArea.bottom) / 2 + 0.5);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n\n y1 = chartArea.top;\n y2 = chartArea.bottom;\n ty1 = borderValue + axisHalfWidth;\n ty2 = ty1 + tl;\n } else if (axis === 'y') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.left + chartArea.right) / 2);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n\n tx1 = borderValue - axisHalfWidth;\n tx2 = tx1 - tl;\n x1 = chartArea.left;\n x2 = chartArea.right;\n }\n\n const limit = valueOrDefault(options.ticks.maxTicksLimit, ticksLength);\n const step = Math.max(1, Math.ceil(ticksLength / limit));\n for (i = 0; i < ticksLength; i += step) {\n const context = this.getContext(i);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n\n const lineWidth = optsAtIndex.lineWidth;\n const lineColor = optsAtIndex.color;\n const borderDash = optsAtIndexBorder.dash || [];\n const borderDashOffset = optsAtIndexBorder.dashOffset;\n\n const tickWidth = optsAtIndex.tickWidth;\n const tickColor = optsAtIndex.tickColor;\n const tickBorderDash = optsAtIndex.tickBorderDash || [];\n const tickBorderDashOffset = optsAtIndex.tickBorderDashOffset;\n\n lineValue = getPixelForGridLine(this, i, offset);\n\n // Skip if the pixel is out of the range\n if (lineValue === undefined) {\n continue;\n }\n\n alignedLineValue = _alignPixel(chart, lineValue, lineWidth);\n\n if (isHorizontal) {\n tx1 = tx2 = x1 = x2 = alignedLineValue;\n } else {\n ty1 = ty2 = y1 = y2 = alignedLineValue;\n }\n\n items.push({\n tx1,\n ty1,\n tx2,\n ty2,\n x1,\n y1,\n x2,\n y2,\n width: lineWidth,\n color: lineColor,\n borderDash,\n borderDashOffset,\n tickWidth,\n tickColor,\n tickBorderDash,\n tickBorderDashOffset,\n });\n }\n\n this._ticksLength = ticksLength;\n this._borderValue = borderValue;\n\n return items;\n }\n\n /**\n\t * @private\n\t */\n _computeLabelItems(chartArea) {\n const axis = this.axis;\n const options = this.options;\n const {position, ticks: optionTicks} = options;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const {align, crossAlign, padding, mirror} = optionTicks;\n const tl = getTickMarkLength(options.grid);\n const tickAndPadding = tl + padding;\n const hTickAndPadding = mirror ? -padding : tickAndPadding;\n const rotation = -toRadians(this.labelRotation);\n const items = [];\n let i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;\n let textBaseline = 'middle';\n\n if (position === 'top') {\n y = this.bottom - hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'bottom') {\n y = this.top + hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'left') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (position === 'right') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (axis === 'x') {\n if (position === 'center') {\n y = ((chartArea.top + chartArea.bottom) / 2) + tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n y = this.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding;\n }\n textAlign = this._getXAxisLabelAlignment();\n } else if (axis === 'y') {\n if (position === 'center') {\n x = ((chartArea.left + chartArea.right) / 2) - tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n x = this.chart.scales[positionAxisID].getPixelForValue(value);\n }\n textAlign = this._getYAxisLabelAlignment(tl).textAlign;\n }\n\n if (axis === 'y') {\n if (align === 'start') {\n textBaseline = 'top';\n } else if (align === 'end') {\n textBaseline = 'bottom';\n }\n }\n\n const labelSizes = this._getLabelSizes();\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n tick = ticks[i];\n label = tick.label;\n\n const optsAtIndex = optionTicks.setContext(this.getContext(i));\n pixel = this.getPixelForTick(i) + optionTicks.labelOffset;\n font = this._resolveTickFontOptions(i);\n lineHeight = font.lineHeight;\n lineCount = isArray(label) ? label.length : 1;\n const halfCount = lineCount / 2;\n const color = optsAtIndex.color;\n const strokeColor = optsAtIndex.textStrokeColor;\n const strokeWidth = optsAtIndex.textStrokeWidth;\n let tickTextAlign = textAlign;\n\n if (isHorizontal) {\n x = pixel;\n\n if (textAlign === 'inner') {\n if (i === ilen - 1) {\n tickTextAlign = !this.options.reverse ? 'right' : 'left';\n } else if (i === 0) {\n tickTextAlign = !this.options.reverse ? 'left' : 'right';\n } else {\n tickTextAlign = 'center';\n }\n }\n\n if (position === 'top') {\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = -lineCount * lineHeight + lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = -labelSizes.highest.height / 2 - halfCount * lineHeight + lineHeight;\n } else {\n textOffset = -labelSizes.highest.height + lineHeight / 2;\n }\n } else {\n // eslint-disable-next-line no-lonely-if\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = labelSizes.highest.height / 2 - halfCount * lineHeight;\n } else {\n textOffset = labelSizes.highest.height - lineCount * lineHeight;\n }\n }\n if (mirror) {\n textOffset *= -1;\n }\n if (rotation !== 0 && !optsAtIndex.showLabelBackdrop) {\n x += (lineHeight / 2) * Math.sin(rotation);\n }\n } else {\n y = pixel;\n textOffset = (1 - lineCount) * lineHeight / 2;\n }\n\n let backdrop;\n\n if (optsAtIndex.showLabelBackdrop) {\n const labelPadding = toPadding(optsAtIndex.backdropPadding);\n const height = labelSizes.heights[i];\n const width = labelSizes.widths[i];\n\n let top = textOffset - labelPadding.top;\n let left = 0 - labelPadding.left;\n\n switch (textBaseline) {\n case 'middle':\n top -= height / 2;\n break;\n case 'bottom':\n top -= height;\n break;\n default:\n break;\n }\n\n switch (textAlign) {\n case 'center':\n left -= width / 2;\n break;\n case 'right':\n left -= width;\n break;\n case 'inner':\n if (i === ilen - 1) {\n left -= width;\n } else if (i > 0) {\n left -= width / 2;\n }\n break;\n default:\n break;\n }\n\n backdrop = {\n left,\n top,\n width: width + labelPadding.width,\n height: height + labelPadding.height,\n\n color: optsAtIndex.backdropColor,\n };\n }\n\n items.push({\n label,\n font,\n textOffset,\n options: {\n rotation,\n color,\n strokeColor,\n strokeWidth,\n textAlign: tickTextAlign,\n textBaseline,\n translation: [x, y],\n backdrop,\n }\n });\n }\n\n return items;\n }\n\n _getXAxisLabelAlignment() {\n const {position, ticks} = this.options;\n const rotation = -toRadians(this.labelRotation);\n\n if (rotation) {\n return position === 'top' ? 'left' : 'right';\n }\n\n let align = 'center';\n\n if (ticks.align === 'start') {\n align = 'left';\n } else if (ticks.align === 'end') {\n align = 'right';\n } else if (ticks.align === 'inner') {\n align = 'inner';\n }\n\n return align;\n }\n\n _getYAxisLabelAlignment(tl) {\n const {position, ticks: {crossAlign, mirror, padding}} = this.options;\n const labelSizes = this._getLabelSizes();\n const tickAndPadding = tl + padding;\n const widest = labelSizes.widest.width;\n\n let textAlign;\n let x;\n\n if (position === 'left') {\n if (mirror) {\n x = this.right + padding;\n\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += (widest / 2);\n } else {\n textAlign = 'right';\n x += widest;\n }\n } else {\n x = this.right - tickAndPadding;\n\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= (widest / 2);\n } else {\n textAlign = 'left';\n x = this.left;\n }\n }\n } else if (position === 'right') {\n if (mirror) {\n x = this.left + padding;\n\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= (widest / 2);\n } else {\n textAlign = 'left';\n x -= widest;\n }\n } else {\n x = this.left + tickAndPadding;\n\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += widest / 2;\n } else {\n textAlign = 'right';\n x = this.right;\n }\n }\n } else {\n textAlign = 'right';\n }\n\n return {textAlign, x};\n }\n\n /**\n\t * @private\n\t */\n _computeLabelArea() {\n if (this.options.ticks.mirror) {\n return;\n }\n\n const chart = this.chart;\n const position = this.options.position;\n\n if (position === 'left' || position === 'right') {\n return {top: 0, left: this.left, bottom: chart.height, right: this.right};\n } if (position === 'top' || position === 'bottom') {\n return {top: this.top, left: 0, bottom: this.bottom, right: chart.width};\n }\n }\n\n /**\n * @protected\n */\n drawBackground() {\n const {ctx, options: {backgroundColor}, left, top, width, height} = this;\n if (backgroundColor) {\n ctx.save();\n ctx.fillStyle = backgroundColor;\n ctx.fillRect(left, top, width, height);\n ctx.restore();\n }\n }\n\n getLineWidthForValue(value) {\n const grid = this.options.grid;\n if (!this._isVisible() || !grid.display) {\n return 0;\n }\n const ticks = this.ticks;\n const index = ticks.findIndex(t => t.value === value);\n if (index >= 0) {\n const opts = grid.setContext(this.getContext(index));\n return opts.lineWidth;\n }\n return 0;\n }\n\n /**\n\t * @protected\n\t */\n drawGrid(chartArea) {\n const grid = this.options.grid;\n const ctx = this.ctx;\n const items = this._gridLineItems || (this._gridLineItems = this._computeGridLineItems(chartArea));\n let i, ilen;\n\n const drawLine = (p1, p2, style) => {\n if (!style.width || !style.color) {\n return;\n }\n ctx.save();\n ctx.lineWidth = style.width;\n ctx.strokeStyle = style.color;\n ctx.setLineDash(style.borderDash || []);\n ctx.lineDashOffset = style.borderDashOffset;\n\n ctx.beginPath();\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n ctx.stroke();\n ctx.restore();\n };\n\n if (grid.display) {\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n const item = items[i];\n\n if (grid.drawOnChartArea) {\n drawLine(\n {x: item.x1, y: item.y1},\n {x: item.x2, y: item.y2},\n item\n );\n }\n\n if (grid.drawTicks) {\n drawLine(\n {x: item.tx1, y: item.ty1},\n {x: item.tx2, y: item.ty2},\n {\n color: item.tickColor,\n width: item.tickWidth,\n borderDash: item.tickBorderDash,\n borderDashOffset: item.tickBorderDashOffset\n }\n );\n }\n }\n }\n }\n\n /**\n\t * @protected\n\t */\n drawBorder() {\n const {chart, ctx, options: {border, grid}} = this;\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = border.display ? borderOpts.width : 0;\n if (!axisWidth) {\n return;\n }\n const lastLineWidth = grid.setContext(this.getContext(0)).lineWidth;\n const borderValue = this._borderValue;\n let x1, x2, y1, y2;\n\n if (this.isHorizontal()) {\n x1 = _alignPixel(chart, this.left, axisWidth) - axisWidth / 2;\n x2 = _alignPixel(chart, this.right, lastLineWidth) + lastLineWidth / 2;\n y1 = y2 = borderValue;\n } else {\n y1 = _alignPixel(chart, this.top, axisWidth) - axisWidth / 2;\n y2 = _alignPixel(chart, this.bottom, lastLineWidth) + lastLineWidth / 2;\n x1 = x2 = borderValue;\n }\n ctx.save();\n ctx.lineWidth = borderOpts.width;\n ctx.strokeStyle = borderOpts.color;\n\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n\n ctx.restore();\n }\n\n /**\n\t * @protected\n\t */\n drawLabels(chartArea) {\n const optionTicks = this.options.ticks;\n\n if (!optionTicks.display) {\n return;\n }\n\n const ctx = this.ctx;\n\n const area = this._computeLabelArea();\n if (area) {\n clipArea(ctx, area);\n }\n\n const items = this.getLabelItems(chartArea);\n for (const item of items) {\n const renderTextOptions = item.options;\n const tickFont = item.font;\n const label = item.label;\n const y = item.textOffset;\n renderText(ctx, label, 0, y, tickFont, renderTextOptions);\n }\n\n if (area) {\n unclipArea(ctx);\n }\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {\n const {ctx, options: {position, title, reverse}} = this;\n\n if (!title.display) {\n return;\n }\n\n const font = toFont(title.font);\n const padding = toPadding(title.padding);\n const align = title.align;\n let offset = font.lineHeight / 2;\n\n if (position === 'bottom' || position === 'center' || isObject(position)) {\n offset += padding.bottom;\n if (isArray(title.text)) {\n offset += font.lineHeight * (title.text.length - 1);\n }\n } else {\n offset += padding.top;\n }\n\n const {titleX, titleY, maxWidth, rotation} = titleArgs(this, offset, position, align);\n\n renderText(ctx, title.text, 0, 0, font, {\n color: title.color,\n maxWidth,\n rotation,\n textAlign: titleAlign(align, position, reverse),\n textBaseline: 'middle',\n translation: [titleX, titleY],\n });\n }\n\n draw(chartArea) {\n if (!this._isVisible()) {\n return;\n }\n\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawBorder();\n this.drawTitle();\n this.drawLabels(chartArea);\n }\n\n /**\n\t * @return {object[]}\n\t * @private\n\t */\n _layers() {\n const opts = this.options;\n const tz = opts.ticks && opts.ticks.z || 0;\n const gz = valueOrDefault(opts.grid && opts.grid.z, -1);\n const bz = valueOrDefault(opts.border && opts.border.z, 0);\n\n if (!this._isVisible() || this.draw !== Scale.prototype.draw) {\n // backward compatibility: draw has been overridden by custom scale\n return [{\n z: tz,\n draw: (chartArea) => {\n this.draw(chartArea);\n }\n }];\n }\n\n return [{\n z: gz,\n draw: (chartArea) => {\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawTitle();\n }\n }, {\n z: bz,\n draw: () => {\n this.drawBorder();\n }\n }, {\n z: tz,\n draw: (chartArea) => {\n this.drawLabels(chartArea);\n }\n }];\n }\n\n /**\n\t * Returns visible dataset metas that are attached to this scale\n\t * @param {string} [type] - if specified, also filter by dataset type\n\t * @return {object[]}\n\t */\n getMatchingVisibleMetas(type) {\n const metas = this.chart.getSortedVisibleDatasetMetas();\n const axisID = this.axis + 'AxisID';\n const result = [];\n let i, ilen;\n\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n const meta = metas[i];\n if (meta[axisID] === this.id && (!type || meta.type === type)) {\n result.push(meta);\n }\n }\n return result;\n }\n\n /**\n\t * @param {number} index\n\t * @return {object}\n\t * @protected\n \t */\n _resolveTickFontOptions(index) {\n const opts = this.options.ticks.setContext(this.getContext(index));\n return toFont(opts.font);\n }\n\n /**\n * @protected\n */\n _maxDigits() {\n const fontSize = this._resolveTickFontOptions(0).lineHeight;\n return (this.isHorizontal() ? this.width : this.height) / fontSize;\n }\n}\n","import {merge} from '../helpers/index.js';\nimport defaults, {overrides} from './core.defaults.js';\n\n/**\n * @typedef {{id: string, defaults: any, overrides?: any, defaultRoutes: any}} IChartComponent\n */\n\nexport default class TypedRegistry {\n constructor(type, scope, override) {\n this.type = type;\n this.scope = scope;\n this.override = override;\n this.items = Object.create(null);\n }\n\n isForType(type) {\n return Object.prototype.isPrototypeOf.call(this.type.prototype, type.prototype);\n }\n\n /**\n\t * @param {IChartComponent} item\n\t * @returns {string} The scope where items defaults were registered to.\n\t */\n register(item) {\n const proto = Object.getPrototypeOf(item);\n let parentScope;\n\n if (isIChartComponent(proto)) {\n // Make sure the parent is registered and note the scope where its defaults are.\n parentScope = this.register(proto);\n }\n\n const items = this.items;\n const id = item.id;\n const scope = this.scope + '.' + id;\n\n if (!id) {\n throw new Error('class does not have id: ' + item);\n }\n\n if (id in items) {\n // already registered\n return scope;\n }\n\n items[id] = item;\n registerDefaults(item, scope, parentScope);\n if (this.override) {\n defaults.override(item.id, item.overrides);\n }\n\n return scope;\n }\n\n /**\n\t * @param {string} id\n\t * @returns {object?}\n\t */\n get(id) {\n return this.items[id];\n }\n\n /**\n\t * @param {IChartComponent} item\n\t */\n unregister(item) {\n const items = this.items;\n const id = item.id;\n const scope = this.scope;\n\n if (id in items) {\n delete items[id];\n }\n\n if (scope && id in defaults[scope]) {\n delete defaults[scope][id];\n if (this.override) {\n delete overrides[id];\n }\n }\n }\n}\n\nfunction registerDefaults(item, scope, parentScope) {\n // Inherit the parent's defaults and keep existing defaults\n const itemDefaults = merge(Object.create(null), [\n parentScope ? defaults.get(parentScope) : {},\n defaults.get(scope),\n item.defaults\n ]);\n\n defaults.set(scope, itemDefaults);\n\n if (item.defaultRoutes) {\n routeDefaults(scope, item.defaultRoutes);\n }\n\n if (item.descriptors) {\n defaults.describe(scope, item.descriptors);\n }\n}\n\nfunction routeDefaults(scope, routes) {\n Object.keys(routes).forEach(property => {\n const propertyParts = property.split('.');\n const sourceName = propertyParts.pop();\n const sourceScope = [scope].concat(propertyParts).join('.');\n const parts = routes[property].split('.');\n const targetName = parts.pop();\n const targetScope = parts.join('.');\n defaults.route(sourceScope, sourceName, targetScope, targetName);\n });\n}\n\nfunction isIChartComponent(proto) {\n return 'id' in proto && 'defaults' in proto;\n}\n","import DatasetController from './core.datasetController.js';\nimport Element from './core.element.js';\nimport Scale from './core.scale.js';\nimport TypedRegistry from './core.typedRegistry.js';\nimport {each, callback as call, _capitalize} from '../helpers/helpers.core.js';\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is exported for typedoc\n */\nexport class Registry {\n constructor() {\n this.controllers = new TypedRegistry(DatasetController, 'datasets', true);\n this.elements = new TypedRegistry(Element, 'elements');\n this.plugins = new TypedRegistry(Object, 'plugins');\n this.scales = new TypedRegistry(Scale, 'scales');\n // Order is important, Scale has Element in prototype chain,\n // so Scales must be before Elements. Plugins are a fallback, so not listed here.\n this._typedRegistries = [this.controllers, this.scales, this.elements];\n }\n\n /**\n\t * @param {...any} args\n\t */\n add(...args) {\n this._each('register', args);\n }\n\n remove(...args) {\n this._each('unregister', args);\n }\n\n /**\n\t * @param {...typeof DatasetController} args\n\t */\n addControllers(...args) {\n this._each('register', args, this.controllers);\n }\n\n /**\n\t * @param {...typeof Element} args\n\t */\n addElements(...args) {\n this._each('register', args, this.elements);\n }\n\n /**\n\t * @param {...any} args\n\t */\n addPlugins(...args) {\n this._each('register', args, this.plugins);\n }\n\n /**\n\t * @param {...typeof Scale} args\n\t */\n addScales(...args) {\n this._each('register', args, this.scales);\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof DatasetController}\n\t */\n getController(id) {\n return this._get(id, this.controllers, 'controller');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof Element}\n\t */\n getElement(id) {\n return this._get(id, this.elements, 'element');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {object}\n\t */\n getPlugin(id) {\n return this._get(id, this.plugins, 'plugin');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof Scale}\n\t */\n getScale(id) {\n return this._get(id, this.scales, 'scale');\n }\n\n /**\n\t * @param {...typeof DatasetController} args\n\t */\n removeControllers(...args) {\n this._each('unregister', args, this.controllers);\n }\n\n /**\n\t * @param {...typeof Element} args\n\t */\n removeElements(...args) {\n this._each('unregister', args, this.elements);\n }\n\n /**\n\t * @param {...any} args\n\t */\n removePlugins(...args) {\n this._each('unregister', args, this.plugins);\n }\n\n /**\n\t * @param {...typeof Scale} args\n\t */\n removeScales(...args) {\n this._each('unregister', args, this.scales);\n }\n\n /**\n\t * @private\n\t */\n _each(method, args, typedRegistry) {\n [...args].forEach(arg => {\n const reg = typedRegistry || this._getRegistryForType(arg);\n if (typedRegistry || reg.isForType(arg) || (reg === this.plugins && arg.id)) {\n this._exec(method, reg, arg);\n } else {\n // Handle loopable args\n // Use case:\n // import * as plugins from './plugins.js';\n // Chart.register(plugins);\n each(arg, item => {\n // If there are mixed types in the loopable, make sure those are\n // registered in correct registry\n // Use case: (treemap exporting controller, elements etc)\n // import * as treemap from 'chartjs-chart-treemap.js';\n // Chart.register(treemap);\n\n const itemReg = typedRegistry || this._getRegistryForType(item);\n this._exec(method, itemReg, item);\n });\n }\n });\n }\n\n /**\n\t * @private\n\t */\n _exec(method, registry, component) {\n const camelMethod = _capitalize(method);\n call(component['before' + camelMethod], [], component); // beforeRegister / beforeUnregister\n registry[method](component);\n call(component['after' + camelMethod], [], component); // afterRegister / afterUnregister\n }\n\n /**\n\t * @private\n\t */\n _getRegistryForType(type) {\n for (let i = 0; i < this._typedRegistries.length; i++) {\n const reg = this._typedRegistries[i];\n if (reg.isForType(type)) {\n return reg;\n }\n }\n // plugins is the fallback registry\n return this.plugins;\n }\n\n /**\n\t * @private\n\t */\n _get(id, typedRegistry, type) {\n const item = typedRegistry.get(id);\n if (item === undefined) {\n throw new Error('\"' + id + '\" is not a registered ' + type + '.');\n }\n return item;\n }\n\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Registry();\n","import registry from './core.registry.js';\nimport {callback as callCallback, isNullOrUndef, valueOrDefault} from '../helpers/helpers.core.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../plugins/plugin.tooltip.js').default } Tooltip\n */\n\n/**\n * @callback filterCallback\n * @param {{plugin: object, options: object}} value\n * @param {number} [index]\n * @param {array} [array]\n * @param {object} [thisArg]\n * @return {boolean}\n */\n\n\nexport default class PluginService {\n constructor() {\n this._init = undefined;\n }\n\n /**\n\t * Calls enabled plugins for `chart` on the specified hook and with the given args.\n\t * This method immediately returns as soon as a plugin explicitly returns false. The\n\t * returned value can be used, for instance, to interrupt the current action.\n\t * @param {Chart} chart - The chart instance for which plugins should be called.\n\t * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n\t * @param {object} [args] - Extra arguments to apply to the hook call.\n * @param {filterCallback} [filter] - Filtering function for limiting which plugins are notified\n\t * @returns {boolean} false if any of the plugins return false, else returns true.\n\t */\n notify(chart, hook, args, filter) {\n if (hook === 'beforeInit') {\n this._init = this._createDescriptors(chart, true);\n this._notify(this._init, chart, 'install');\n }\n\n if (this._init === undefined) { // Do not trigger events before install\n return;\n }\n\n const descriptors = filter ? this._descriptors(chart).filter(filter) : this._descriptors(chart);\n const result = this._notify(descriptors, chart, hook, args);\n\n if (hook === 'afterDestroy') {\n this._notify(descriptors, chart, 'stop');\n this._notify(this._init, chart, 'uninstall');\n this._init = undefined; // Do not trigger events after uninstall\n }\n return result;\n }\n\n /**\n\t * @private\n\t */\n _notify(descriptors, chart, hook, args) {\n args = args || {};\n for (const descriptor of descriptors) {\n const plugin = descriptor.plugin;\n const method = plugin[hook];\n const params = [chart, args, descriptor.options];\n if (callCallback(method, params, plugin) === false && args.cancelable) {\n return false;\n }\n }\n\n return true;\n }\n\n invalidate() {\n // When plugins are registered, there is the possibility of a double\n // invalidate situation. In this case, we only want to invalidate once.\n // If we invalidate multiple times, the `_oldCache` is lost and all of the\n // plugins are restarted without being correctly stopped.\n // See https://github.com/chartjs/Chart.js/issues/8147\n if (!isNullOrUndef(this._cache)) {\n this._oldCache = this._cache;\n this._cache = undefined;\n }\n }\n\n /**\n\t * @param {Chart} chart\n\t * @private\n\t */\n _descriptors(chart) {\n if (this._cache) {\n return this._cache;\n }\n\n const descriptors = this._cache = this._createDescriptors(chart);\n\n this._notifyStateChanges(chart);\n\n return descriptors;\n }\n\n _createDescriptors(chart, all) {\n const config = chart && chart.config;\n const options = valueOrDefault(config.options && config.options.plugins, {});\n const plugins = allPlugins(config);\n // options === false => all plugins are disabled\n return options === false && !all ? [] : createDescriptors(chart, plugins, options, all);\n }\n\n /**\n\t * @param {Chart} chart\n\t * @private\n\t */\n _notifyStateChanges(chart) {\n const previousDescriptors = this._oldCache || [];\n const descriptors = this._cache;\n const diff = (a, b) => a.filter(x => !b.some(y => x.plugin.id === y.plugin.id));\n this._notify(diff(previousDescriptors, descriptors), chart, 'stop');\n this._notify(diff(descriptors, previousDescriptors), chart, 'start');\n }\n}\n\n/**\n * @param {import('./core.config.js').default} config\n */\nfunction allPlugins(config) {\n const localIds = {};\n const plugins = [];\n const keys = Object.keys(registry.plugins.items);\n for (let i = 0; i < keys.length; i++) {\n plugins.push(registry.getPlugin(keys[i]));\n }\n\n const local = config.plugins || [];\n for (let i = 0; i < local.length; i++) {\n const plugin = local[i];\n\n if (plugins.indexOf(plugin) === -1) {\n plugins.push(plugin);\n localIds[plugin.id] = true;\n }\n }\n\n return {plugins, localIds};\n}\n\nfunction getOpts(options, all) {\n if (!all && options === false) {\n return null;\n }\n if (options === true) {\n return {};\n }\n return options;\n}\n\nfunction createDescriptors(chart, {plugins, localIds}, options, all) {\n const result = [];\n const context = chart.getContext();\n\n for (const plugin of plugins) {\n const id = plugin.id;\n const opts = getOpts(options[id], all);\n if (opts === null) {\n continue;\n }\n result.push({\n plugin,\n options: pluginOpts(chart.config, {plugin, local: localIds[id]}, opts, context)\n });\n }\n\n return result;\n}\n\nfunction pluginOpts(config, {plugin, local}, opts, context) {\n const keys = config.pluginScopeKeys(plugin);\n const scopes = config.getOptionScopes(opts, keys);\n if (local && plugin.defaults) {\n // make sure plugin defaults are in scopes for local (not registered) plugins\n scopes.push(plugin.defaults);\n }\n return config.createResolver(scopes, context, [''], {\n // These are just defaults that plugins can override\n scriptable: false,\n indexable: false,\n allKeys: true\n });\n}\n","import defaults, {overrides, descriptors} from './core.defaults.js';\nimport {mergeIf, resolveObjectKey, isArray, isFunction, valueOrDefault, isObject} from '../helpers/helpers.core.js';\nimport {_attachContext, _createResolver, _descriptors} from '../helpers/helpers.config.js';\n\nexport function getIndexAxis(type, options) {\n const datasetDefaults = defaults.datasets[type] || {};\n const datasetOptions = (options.datasets || {})[type] || {};\n return datasetOptions.indexAxis || options.indexAxis || datasetDefaults.indexAxis || 'x';\n}\n\nfunction getAxisFromDefaultScaleID(id, indexAxis) {\n let axis = id;\n if (id === '_index_') {\n axis = indexAxis;\n } else if (id === '_value_') {\n axis = indexAxis === 'x' ? 'y' : 'x';\n }\n return axis;\n}\n\nfunction getDefaultScaleIDFromAxis(axis, indexAxis) {\n return axis === indexAxis ? '_index_' : '_value_';\n}\n\nfunction idMatchesAxis(id) {\n if (id === 'x' || id === 'y' || id === 'r') {\n return id;\n }\n}\n\nfunction axisFromPosition(position) {\n if (position === 'top' || position === 'bottom') {\n return 'x';\n }\n if (position === 'left' || position === 'right') {\n return 'y';\n }\n}\n\nexport function determineAxis(id, ...scaleOptions) {\n if (idMatchesAxis(id)) {\n return id;\n }\n for (const opts of scaleOptions) {\n const axis = opts.axis\n || axisFromPosition(opts.position)\n || id.length > 1 && idMatchesAxis(id[0].toLowerCase());\n if (axis) {\n return axis;\n }\n }\n throw new Error(`Cannot determine type of '${id}' axis. Please provide 'axis' or 'position' option.`);\n}\n\nfunction getAxisFromDataset(id, axis, dataset) {\n if (dataset[axis + 'AxisID'] === id) {\n return {axis};\n }\n}\n\nfunction retrieveAxisFromDatasets(id, config) {\n if (config.data && config.data.datasets) {\n const boundDs = config.data.datasets.filter((d) => d.xAxisID === id || d.yAxisID === id);\n if (boundDs.length) {\n return getAxisFromDataset(id, 'x', boundDs[0]) || getAxisFromDataset(id, 'y', boundDs[0]);\n }\n }\n return {};\n}\n\nfunction mergeScaleConfig(config, options) {\n const chartDefaults = overrides[config.type] || {scales: {}};\n const configScales = options.scales || {};\n const chartIndexAxis = getIndexAxis(config.type, options);\n const scales = Object.create(null);\n\n // First figure out first scale id's per axis.\n Object.keys(configScales).forEach(id => {\n const scaleConf = configScales[id];\n if (!isObject(scaleConf)) {\n return console.error(`Invalid scale configuration for scale: ${id}`);\n }\n if (scaleConf._proxy) {\n return console.warn(`Ignoring resolver passed as options for scale: ${id}`);\n }\n const axis = determineAxis(id, scaleConf, retrieveAxisFromDatasets(id, config), defaults.scales[scaleConf.type]);\n const defaultId = getDefaultScaleIDFromAxis(axis, chartIndexAxis);\n const defaultScaleOptions = chartDefaults.scales || {};\n scales[id] = mergeIf(Object.create(null), [{axis}, scaleConf, defaultScaleOptions[axis], defaultScaleOptions[defaultId]]);\n });\n\n // Then merge dataset defaults to scale configs\n config.data.datasets.forEach(dataset => {\n const type = dataset.type || config.type;\n const indexAxis = dataset.indexAxis || getIndexAxis(type, options);\n const datasetDefaults = overrides[type] || {};\n const defaultScaleOptions = datasetDefaults.scales || {};\n Object.keys(defaultScaleOptions).forEach(defaultID => {\n const axis = getAxisFromDefaultScaleID(defaultID, indexAxis);\n const id = dataset[axis + 'AxisID'] || axis;\n scales[id] = scales[id] || Object.create(null);\n mergeIf(scales[id], [{axis}, configScales[id], defaultScaleOptions[defaultID]]);\n });\n });\n\n // apply scale defaults, if not overridden by dataset defaults\n Object.keys(scales).forEach(key => {\n const scale = scales[key];\n mergeIf(scale, [defaults.scales[scale.type], defaults.scale]);\n });\n\n return scales;\n}\n\nfunction initOptions(config) {\n const options = config.options || (config.options = {});\n\n options.plugins = valueOrDefault(options.plugins, {});\n options.scales = mergeScaleConfig(config, options);\n}\n\nfunction initData(data) {\n data = data || {};\n data.datasets = data.datasets || [];\n data.labels = data.labels || [];\n return data;\n}\n\nfunction initConfig(config) {\n config = config || {};\n config.data = initData(config.data);\n\n initOptions(config);\n\n return config;\n}\n\nconst keyCache = new Map();\nconst keysCached = new Set();\n\nfunction cachedKeys(cacheKey, generate) {\n let keys = keyCache.get(cacheKey);\n if (!keys) {\n keys = generate();\n keyCache.set(cacheKey, keys);\n keysCached.add(keys);\n }\n return keys;\n}\n\nconst addIfFound = (set, obj, key) => {\n const opts = resolveObjectKey(obj, key);\n if (opts !== undefined) {\n set.add(opts);\n }\n};\n\nexport default class Config {\n constructor(config) {\n this._config = initConfig(config);\n this._scopeCache = new Map();\n this._resolverCache = new Map();\n }\n\n get platform() {\n return this._config.platform;\n }\n\n get type() {\n return this._config.type;\n }\n\n set type(type) {\n this._config.type = type;\n }\n\n get data() {\n return this._config.data;\n }\n\n set data(data) {\n this._config.data = initData(data);\n }\n\n get options() {\n return this._config.options;\n }\n\n set options(options) {\n this._config.options = options;\n }\n\n get plugins() {\n return this._config.plugins;\n }\n\n update() {\n const config = this._config;\n this.clearCache();\n initOptions(config);\n }\n\n clearCache() {\n this._scopeCache.clear();\n this._resolverCache.clear();\n }\n\n /**\n * Returns the option scope keys for resolving dataset options.\n * These keys do not include the dataset itself, because it is not under options.\n * @param {string} datasetType\n * @return {string[][]}\n */\n datasetScopeKeys(datasetType) {\n return cachedKeys(datasetType,\n () => [[\n `datasets.${datasetType}`,\n ''\n ]]);\n }\n\n /**\n * Returns the option scope keys for resolving dataset animation options.\n * These keys do not include the dataset itself, because it is not under options.\n * @param {string} datasetType\n * @param {string} transition\n * @return {string[][]}\n */\n datasetAnimationScopeKeys(datasetType, transition) {\n return cachedKeys(`${datasetType}.transition.${transition}`,\n () => [\n [\n `datasets.${datasetType}.transitions.${transition}`,\n `transitions.${transition}`,\n ],\n // The following are used for looking up the `animations` and `animation` keys\n [\n `datasets.${datasetType}`,\n ''\n ]\n ]);\n }\n\n /**\n * Returns the options scope keys for resolving element options that belong\n * to an dataset. These keys do not include the dataset itself, because it\n * is not under options.\n * @param {string} datasetType\n * @param {string} elementType\n * @return {string[][]}\n */\n datasetElementScopeKeys(datasetType, elementType) {\n return cachedKeys(`${datasetType}-${elementType}`,\n () => [[\n `datasets.${datasetType}.elements.${elementType}`,\n `datasets.${datasetType}`,\n `elements.${elementType}`,\n ''\n ]]);\n }\n\n /**\n * Returns the options scope keys for resolving plugin options.\n * @param {{id: string, additionalOptionScopes?: string[]}} plugin\n * @return {string[][]}\n */\n pluginScopeKeys(plugin) {\n const id = plugin.id;\n const type = this.type;\n return cachedKeys(`${type}-plugin-${id}`,\n () => [[\n `plugins.${id}`,\n ...plugin.additionalOptionScopes || [],\n ]]);\n }\n\n /**\n * @private\n */\n _cachedScopes(mainScope, resetCache) {\n const _scopeCache = this._scopeCache;\n let cache = _scopeCache.get(mainScope);\n if (!cache || resetCache) {\n cache = new Map();\n _scopeCache.set(mainScope, cache);\n }\n return cache;\n }\n\n /**\n * Resolves the objects from options and defaults for option value resolution.\n * @param {object} mainScope - The main scope object for options\n * @param {string[][]} keyLists - The arrays of keys in resolution order\n * @param {boolean} [resetCache] - reset the cache for this mainScope\n */\n getOptionScopes(mainScope, keyLists, resetCache) {\n const {options, type} = this;\n const cache = this._cachedScopes(mainScope, resetCache);\n const cached = cache.get(keyLists);\n if (cached) {\n return cached;\n }\n\n const scopes = new Set();\n\n keyLists.forEach(keys => {\n if (mainScope) {\n scopes.add(mainScope);\n keys.forEach(key => addIfFound(scopes, mainScope, key));\n }\n keys.forEach(key => addIfFound(scopes, options, key));\n keys.forEach(key => addIfFound(scopes, overrides[type] || {}, key));\n keys.forEach(key => addIfFound(scopes, defaults, key));\n keys.forEach(key => addIfFound(scopes, descriptors, key));\n });\n\n const array = Array.from(scopes);\n if (array.length === 0) {\n array.push(Object.create(null));\n }\n if (keysCached.has(keyLists)) {\n cache.set(keyLists, array);\n }\n return array;\n }\n\n /**\n * Returns the option scopes for resolving chart options\n * @return {object[]}\n */\n chartOptionScopes() {\n const {options, type} = this;\n\n return [\n options,\n overrides[type] || {},\n defaults.datasets[type] || {}, // https://github.com/chartjs/Chart.js/issues/8531\n {type},\n defaults,\n descriptors\n ];\n }\n\n /**\n * @param {object[]} scopes\n * @param {string[]} names\n * @param {function|object} context\n * @param {string[]} [prefixes]\n * @return {object}\n */\n resolveNamedOptions(scopes, names, context, prefixes = ['']) {\n const result = {$shared: true};\n const {resolver, subPrefixes} = getResolver(this._resolverCache, scopes, prefixes);\n let options = resolver;\n if (needContext(resolver, names)) {\n result.$shared = false;\n context = isFunction(context) ? context() : context;\n // subResolver is passed to scriptable options. It should not resolve to hover options.\n const subResolver = this.createResolver(scopes, context, subPrefixes);\n options = _attachContext(resolver, context, subResolver);\n }\n\n for (const prop of names) {\n result[prop] = options[prop];\n }\n return result;\n }\n\n /**\n * @param {object[]} scopes\n * @param {object} [context]\n * @param {string[]} [prefixes]\n * @param {{scriptable: boolean, indexable: boolean, allKeys?: boolean}} [descriptorDefaults]\n */\n createResolver(scopes, context, prefixes = [''], descriptorDefaults) {\n const {resolver} = getResolver(this._resolverCache, scopes, prefixes);\n return isObject(context)\n ? _attachContext(resolver, context, undefined, descriptorDefaults)\n : resolver;\n }\n}\n\nfunction getResolver(resolverCache, scopes, prefixes) {\n let cache = resolverCache.get(scopes);\n if (!cache) {\n cache = new Map();\n resolverCache.set(scopes, cache);\n }\n const cacheKey = prefixes.join();\n let cached = cache.get(cacheKey);\n if (!cached) {\n const resolver = _createResolver(scopes, prefixes);\n cached = {\n resolver,\n subPrefixes: prefixes.filter(p => !p.toLowerCase().includes('hover'))\n };\n cache.set(cacheKey, cached);\n }\n return cached;\n}\n\nconst hasFunction = value => isObject(value)\n && Object.getOwnPropertyNames(value).some((key) => isFunction(value[key]));\n\nfunction needContext(proxy, names) {\n const {isScriptable, isIndexable} = _descriptors(proxy);\n\n for (const prop of names) {\n const scriptable = isScriptable(prop);\n const indexable = isIndexable(prop);\n const value = (indexable || scriptable) && proxy[prop];\n if ((scriptable && (isFunction(value) || hasFunction(value)))\n || (indexable && isArray(value))) {\n return true;\n }\n }\n return false;\n}\n","import animator from './core.animator.js';\nimport defaults, {overrides} from './core.defaults.js';\nimport Interaction from './core.interaction.js';\nimport layouts from './core.layouts.js';\nimport {_detectPlatform} from '../platform/index.js';\nimport PluginService from './core.plugins.js';\nimport registry from './core.registry.js';\nimport Config, {determineAxis, getIndexAxis} from './core.config.js';\nimport {each, callback as callCallback, uid, valueOrDefault, _elementsEqual, isNullOrUndef, setsEqual, defined, isFunction, _isClickEvent} from '../helpers/helpers.core.js';\nimport {clearCanvas, clipArea, createContext, unclipArea, _isPointInArea, _isDomSupported, retinaScale, getDatasetClipArea} from '../helpers/index.js';\n// @ts-ignore\nimport {version} from '../../package.json';\nimport {debounce} from '../helpers/helpers.extras.js';\n\n/**\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../types/index.js').Point } Point\n */\n\nconst KNOWN_POSITIONS = ['top', 'bottom', 'left', 'right', 'chartArea'];\nfunction positionIsHorizontal(position, axis) {\n return position === 'top' || position === 'bottom' || (KNOWN_POSITIONS.indexOf(position) === -1 && axis === 'x');\n}\n\nfunction compare2Level(l1, l2) {\n return function(a, b) {\n return a[l1] === b[l1]\n ? a[l2] - b[l2]\n : a[l1] - b[l1];\n };\n}\n\nfunction onAnimationsComplete(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n\n chart.notifyPlugins('afterRender');\n callCallback(animationOptions && animationOptions.onComplete, [context], chart);\n}\n\nfunction onAnimationProgress(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n callCallback(animationOptions && animationOptions.onProgress, [context], chart);\n}\n\n/**\n * Chart.js can take a string id of a canvas element, a 2d context, or a canvas element itself.\n * Attempt to unwrap the item passed into the chart constructor so that it is a canvas element (if possible).\n */\nfunction getCanvas(item) {\n if (_isDomSupported() && typeof item === 'string') {\n item = document.getElementById(item);\n } else if (item && item.length) {\n // Support for array based queries (such as jQuery)\n item = item[0];\n }\n\n if (item && item.canvas) {\n // Support for any object associated to a canvas (including a context2d)\n item = item.canvas;\n }\n return item;\n}\n\nconst instances = {};\nconst getChart = (key) => {\n const canvas = getCanvas(key);\n return Object.values(instances).filter((c) => c.canvas === canvas).pop();\n};\n\nfunction moveNumericKeys(obj, start, move) {\n const keys = Object.keys(obj);\n for (const key of keys) {\n const intKey = +key;\n if (intKey >= start) {\n const value = obj[key];\n delete obj[key];\n if (move > 0 || intKey > start) {\n obj[intKey + move] = value;\n }\n }\n }\n}\n\n/**\n * @param {ChartEvent} e\n * @param {ChartEvent|null} lastEvent\n * @param {boolean} inChartArea\n * @param {boolean} isClick\n * @returns {ChartEvent|null}\n */\nfunction determineLastEvent(e, lastEvent, inChartArea, isClick) {\n if (!inChartArea || e.type === 'mouseout') {\n return null;\n }\n if (isClick) {\n return lastEvent;\n }\n return e;\n}\n\nclass Chart {\n\n static defaults = defaults;\n static instances = instances;\n static overrides = overrides;\n static registry = registry;\n static version = version;\n static getChart = getChart;\n\n static register(...items) {\n registry.add(...items);\n invalidatePlugins();\n }\n\n static unregister(...items) {\n registry.remove(...items);\n invalidatePlugins();\n }\n\n // eslint-disable-next-line max-statements\n constructor(item, userConfig) {\n const config = this.config = new Config(userConfig);\n const initialCanvas = getCanvas(item);\n const existingChart = getChart(initialCanvas);\n if (existingChart) {\n throw new Error(\n 'Canvas is already in use. Chart with ID \\'' + existingChart.id + '\\'' +\n\t\t\t\t' must be destroyed before the canvas with ID \\'' + existingChart.canvas.id + '\\' can be reused.'\n );\n }\n\n const options = config.createResolver(config.chartOptionScopes(), this.getContext());\n\n this.platform = new (config.platform || _detectPlatform(initialCanvas))();\n this.platform.updateConfig(config);\n\n const context = this.platform.acquireContext(initialCanvas, options.aspectRatio);\n const canvas = context && context.canvas;\n const height = canvas && canvas.height;\n const width = canvas && canvas.width;\n\n this.id = uid();\n this.ctx = context;\n this.canvas = canvas;\n this.width = width;\n this.height = height;\n this._options = options;\n // Store the previously used aspect ratio to determine if a resize\n // is needed during updates. Do this after _options is set since\n // aspectRatio uses a getter\n this._aspectRatio = this.aspectRatio;\n this._layers = [];\n this._metasets = [];\n this._stacks = undefined;\n this.boxes = [];\n this.currentDevicePixelRatio = undefined;\n this.chartArea = undefined;\n this._active = [];\n this._lastEvent = undefined;\n this._listeners = {};\n /** @type {?{attach?: function, detach?: function, resize?: function}} */\n this._responsiveListeners = undefined;\n this._sortedMetasets = [];\n this.scales = {};\n this._plugins = new PluginService();\n this.$proxies = {};\n this._hiddenIndices = {};\n this.attached = false;\n this._animationsDisabled = undefined;\n this.$context = undefined;\n this._doResize = debounce(mode => this.update(mode), options.resizeDelay || 0);\n this._dataChanges = [];\n\n // Add the chart instance to the global namespace\n instances[this.id] = this;\n\n if (!context || !canvas) {\n // The given item is not a compatible context2d element, let's return before finalizing\n // the chart initialization but after setting basic chart / controller properties that\n // can help to figure out that the chart is not valid (e.g chart.canvas !== null);\n // https://github.com/chartjs/Chart.js/issues/2807\n console.error(\"Failed to create chart: can't acquire context from the given item\");\n return;\n }\n\n animator.listen(this, 'complete', onAnimationsComplete);\n animator.listen(this, 'progress', onAnimationProgress);\n\n this._initialize();\n if (this.attached) {\n this.update();\n }\n }\n\n get aspectRatio() {\n const {options: {aspectRatio, maintainAspectRatio}, width, height, _aspectRatio} = this;\n if (!isNullOrUndef(aspectRatio)) {\n // If aspectRatio is defined in options, use that.\n return aspectRatio;\n }\n\n if (maintainAspectRatio && _aspectRatio) {\n // If maintainAspectRatio is truthly and we had previously determined _aspectRatio, use that\n return _aspectRatio;\n }\n\n // Calculate\n return height ? width / height : null;\n }\n\n get data() {\n return this.config.data;\n }\n\n set data(data) {\n this.config.data = data;\n }\n\n get options() {\n return this._options;\n }\n\n set options(options) {\n this.config.options = options;\n }\n\n get registry() {\n return registry;\n }\n\n /**\n\t * @private\n\t */\n _initialize() {\n // Before init plugin notification\n this.notifyPlugins('beforeInit');\n\n if (this.options.responsive) {\n this.resize();\n } else {\n retinaScale(this, this.options.devicePixelRatio);\n }\n\n this.bindEvents();\n\n // After init plugin notification\n this.notifyPlugins('afterInit');\n\n return this;\n }\n\n clear() {\n clearCanvas(this.canvas, this.ctx);\n return this;\n }\n\n stop() {\n animator.stop(this);\n return this;\n }\n\n /**\n\t * Resize the chart to its container or to explicit dimensions.\n\t * @param {number} [width]\n\t * @param {number} [height]\n\t */\n resize(width, height) {\n if (!animator.running(this)) {\n this._resize(width, height);\n } else {\n this._resizeBeforeDraw = {width, height};\n }\n }\n\n _resize(width, height) {\n const options = this.options;\n const canvas = this.canvas;\n const aspectRatio = options.maintainAspectRatio && this.aspectRatio;\n const newSize = this.platform.getMaximumSize(canvas, width, height, aspectRatio);\n const newRatio = options.devicePixelRatio || this.platform.getDevicePixelRatio();\n const mode = this.width ? 'resize' : 'attach';\n\n this.width = newSize.width;\n this.height = newSize.height;\n this._aspectRatio = this.aspectRatio;\n if (!retinaScale(this, newRatio, true)) {\n return;\n }\n\n this.notifyPlugins('resize', {size: newSize});\n\n callCallback(options.onResize, [this, newSize], this);\n\n if (this.attached) {\n if (this._doResize(mode)) {\n // The resize update is delayed, only draw without updating.\n this.render();\n }\n }\n }\n\n ensureScalesHaveIDs() {\n const options = this.options;\n const scalesOptions = options.scales || {};\n\n each(scalesOptions, (axisOptions, axisID) => {\n axisOptions.id = axisID;\n });\n }\n\n /**\n\t * Builds a map of scale ID to scale object for future lookup.\n\t */\n buildOrUpdateScales() {\n const options = this.options;\n const scaleOpts = options.scales;\n const scales = this.scales;\n const updated = Object.keys(scales).reduce((obj, id) => {\n obj[id] = false;\n return obj;\n }, {});\n let items = [];\n\n if (scaleOpts) {\n items = items.concat(\n Object.keys(scaleOpts).map((id) => {\n const scaleOptions = scaleOpts[id];\n const axis = determineAxis(id, scaleOptions);\n const isRadial = axis === 'r';\n const isHorizontal = axis === 'x';\n return {\n options: scaleOptions,\n dposition: isRadial ? 'chartArea' : isHorizontal ? 'bottom' : 'left',\n dtype: isRadial ? 'radialLinear' : isHorizontal ? 'category' : 'linear'\n };\n })\n );\n }\n\n each(items, (item) => {\n const scaleOptions = item.options;\n const id = scaleOptions.id;\n const axis = determineAxis(id, scaleOptions);\n const scaleType = valueOrDefault(scaleOptions.type, item.dtype);\n\n if (scaleOptions.position === undefined || positionIsHorizontal(scaleOptions.position, axis) !== positionIsHorizontal(item.dposition)) {\n scaleOptions.position = item.dposition;\n }\n\n updated[id] = true;\n let scale = null;\n if (id in scales && scales[id].type === scaleType) {\n scale = scales[id];\n } else {\n const scaleClass = registry.getScale(scaleType);\n scale = new scaleClass({\n id,\n type: scaleType,\n ctx: this.ctx,\n chart: this\n });\n scales[scale.id] = scale;\n }\n\n scale.init(scaleOptions, options);\n });\n // clear up discarded scales\n each(updated, (hasUpdated, id) => {\n if (!hasUpdated) {\n delete scales[id];\n }\n });\n\n each(scales, (scale) => {\n layouts.configure(this, scale, scale.options);\n layouts.addBox(this, scale);\n });\n }\n\n /**\n\t * @private\n\t */\n _updateMetasets() {\n const metasets = this._metasets;\n const numData = this.data.datasets.length;\n const numMeta = metasets.length;\n\n metasets.sort((a, b) => a.index - b.index);\n if (numMeta > numData) {\n for (let i = numData; i < numMeta; ++i) {\n this._destroyDatasetMeta(i);\n }\n metasets.splice(numData, numMeta - numData);\n }\n this._sortedMetasets = metasets.slice(0).sort(compare2Level('order', 'index'));\n }\n\n /**\n\t * @private\n\t */\n _removeUnreferencedMetasets() {\n const {_metasets: metasets, data: {datasets}} = this;\n if (metasets.length > datasets.length) {\n delete this._stacks;\n }\n metasets.forEach((meta, index) => {\n if (datasets.filter(x => x === meta._dataset).length === 0) {\n this._destroyDatasetMeta(index);\n }\n });\n }\n\n buildOrUpdateControllers() {\n const newControllers = [];\n const datasets = this.data.datasets;\n let i, ilen;\n\n this._removeUnreferencedMetasets();\n\n for (i = 0, ilen = datasets.length; i < ilen; i++) {\n const dataset = datasets[i];\n let meta = this.getDatasetMeta(i);\n const type = dataset.type || this.config.type;\n\n if (meta.type && meta.type !== type) {\n this._destroyDatasetMeta(i);\n meta = this.getDatasetMeta(i);\n }\n meta.type = type;\n meta.indexAxis = dataset.indexAxis || getIndexAxis(type, this.options);\n meta.order = dataset.order || 0;\n meta.index = i;\n meta.label = '' + dataset.label;\n meta.visible = this.isDatasetVisible(i);\n\n if (meta.controller) {\n meta.controller.updateIndex(i);\n meta.controller.linkScales();\n } else {\n const ControllerClass = registry.getController(type);\n const {datasetElementType, dataElementType} = defaults.datasets[type];\n Object.assign(ControllerClass, {\n dataElementType: registry.getElement(dataElementType),\n datasetElementType: datasetElementType && registry.getElement(datasetElementType)\n });\n meta.controller = new ControllerClass(this, i);\n newControllers.push(meta.controller);\n }\n }\n\n this._updateMetasets();\n return newControllers;\n }\n\n /**\n\t * Reset the elements of all datasets\n\t * @private\n\t */\n _resetElements() {\n each(this.data.datasets, (dataset, datasetIndex) => {\n this.getDatasetMeta(datasetIndex).controller.reset();\n }, this);\n }\n\n /**\n\t* Resets the chart back to its state before the initial animation\n\t*/\n reset() {\n this._resetElements();\n this.notifyPlugins('reset');\n }\n\n update(mode) {\n const config = this.config;\n\n config.update();\n const options = this._options = config.createResolver(config.chartOptionScopes(), this.getContext());\n const animsDisabled = this._animationsDisabled = !options.animation;\n\n this._updateScales();\n this._checkEventBindings();\n this._updateHiddenIndices();\n\n // plugins options references might have change, let's invalidate the cache\n // https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167\n this._plugins.invalidate();\n\n if (this.notifyPlugins('beforeUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n\n // Make sure dataset controllers are updated and new controllers are reset\n const newControllers = this.buildOrUpdateControllers();\n\n this.notifyPlugins('beforeElementsUpdate');\n\n // Make sure all dataset controllers have correct meta data counts\n let minPadding = 0;\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; i++) {\n const {controller} = this.getDatasetMeta(i);\n const reset = !animsDisabled && newControllers.indexOf(controller) === -1;\n // New controllers will be reset after the layout pass, so we only want to modify\n // elements added to new datasets\n controller.buildOrUpdateElements(reset);\n minPadding = Math.max(+controller.getMaxOverflow(), minPadding);\n }\n minPadding = this._minPadding = options.layout.autoPadding ? minPadding : 0;\n this._updateLayout(minPadding);\n\n // Only reset the controllers if we have animations\n if (!animsDisabled) {\n // Can only reset the new controllers after the scales have been updated\n // Reset is done to get the starting point for the initial animation\n each(newControllers, (controller) => {\n controller.reset();\n });\n }\n\n this._updateDatasets(mode);\n\n // Do this before render so that any plugins that need final scale updates can use it\n this.notifyPlugins('afterUpdate', {mode});\n\n this._layers.sort(compare2Level('z', '_idx'));\n\n // Replay last event from before update, or set hover styles on active elements\n const {_active, _lastEvent} = this;\n if (_lastEvent) {\n this._eventHandler(_lastEvent, true);\n } else if (_active.length) {\n this._updateHoverStyles(_active, _active, true);\n }\n\n this.render();\n }\n\n /**\n * @private\n */\n _updateScales() {\n each(this.scales, (scale) => {\n layouts.removeBox(this, scale);\n });\n\n this.ensureScalesHaveIDs();\n this.buildOrUpdateScales();\n }\n\n /**\n * @private\n */\n _checkEventBindings() {\n const options = this.options;\n const existingEvents = new Set(Object.keys(this._listeners));\n const newEvents = new Set(options.events);\n\n if (!setsEqual(existingEvents, newEvents) || !!this._responsiveListeners !== options.responsive) {\n // The configured events have changed. Rebind.\n this.unbindEvents();\n this.bindEvents();\n }\n }\n\n /**\n * @private\n */\n _updateHiddenIndices() {\n const {_hiddenIndices} = this;\n const changes = this._getUniformDataChanges() || [];\n for (const {method, start, count} of changes) {\n const move = method === '_removeElements' ? -count : count;\n moveNumericKeys(_hiddenIndices, start, move);\n }\n }\n\n /**\n * @private\n */\n _getUniformDataChanges() {\n const _dataChanges = this._dataChanges;\n if (!_dataChanges || !_dataChanges.length) {\n return;\n }\n\n this._dataChanges = [];\n const datasetCount = this.data.datasets.length;\n const makeSet = (idx) => new Set(\n _dataChanges\n .filter(c => c[0] === idx)\n .map((c, i) => i + ',' + c.splice(1).join(','))\n );\n\n const changeSet = makeSet(0);\n for (let i = 1; i < datasetCount; i++) {\n if (!setsEqual(changeSet, makeSet(i))) {\n return;\n }\n }\n return Array.from(changeSet)\n .map(c => c.split(','))\n .map(a => ({method: a[1], start: +a[2], count: +a[3]}));\n }\n\n /**\n\t * Updates the chart layout unless a plugin returns `false` to the `beforeLayout`\n\t * hook, in which case, plugins will not be called on `afterLayout`.\n\t * @private\n\t */\n _updateLayout(minPadding) {\n if (this.notifyPlugins('beforeLayout', {cancelable: true}) === false) {\n return;\n }\n\n layouts.update(this, this.width, this.height, minPadding);\n\n const area = this.chartArea;\n const noArea = area.width <= 0 || area.height <= 0;\n\n this._layers = [];\n each(this.boxes, (box) => {\n if (noArea && box.position === 'chartArea') {\n // Skip drawing and configuring chartArea boxes when chartArea is zero or negative\n return;\n }\n\n // configure is called twice, once in core.scale.update and once here.\n // Here the boxes are fully updated and at their final positions.\n if (box.configure) {\n box.configure();\n }\n this._layers.push(...box._layers());\n }, this);\n\n this._layers.forEach((item, index) => {\n item._idx = index;\n });\n\n this.notifyPlugins('afterLayout');\n }\n\n /**\n\t * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate`\n\t * hook, in which case, plugins will not be called on `afterDatasetsUpdate`.\n\t * @private\n\t */\n _updateDatasets(mode) {\n if (this.notifyPlugins('beforeDatasetsUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this.getDatasetMeta(i).controller.configure();\n }\n\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this._updateDataset(i, isFunction(mode) ? mode({datasetIndex: i}) : mode);\n }\n\n this.notifyPlugins('afterDatasetsUpdate', {mode});\n }\n\n /**\n\t * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate`\n\t * hook, in which case, plugins will not be called on `afterDatasetUpdate`.\n\t * @private\n\t */\n _updateDataset(index, mode) {\n const meta = this.getDatasetMeta(index);\n const args = {meta, index, mode, cancelable: true};\n\n if (this.notifyPlugins('beforeDatasetUpdate', args) === false) {\n return;\n }\n\n meta.controller._update(mode);\n\n args.cancelable = false;\n this.notifyPlugins('afterDatasetUpdate', args);\n }\n\n render() {\n if (this.notifyPlugins('beforeRender', {cancelable: true}) === false) {\n return;\n }\n\n if (animator.has(this)) {\n if (this.attached && !animator.running(this)) {\n animator.start(this);\n }\n } else {\n this.draw();\n onAnimationsComplete({chart: this});\n }\n }\n\n draw() {\n let i;\n if (this._resizeBeforeDraw) {\n const {width, height} = this._resizeBeforeDraw;\n // Unset pending resize request now to avoid possible recursion within _resize\n this._resizeBeforeDraw = null;\n this._resize(width, height);\n }\n this.clear();\n\n if (this.width <= 0 || this.height <= 0) {\n return;\n }\n\n if (this.notifyPlugins('beforeDraw', {cancelable: true}) === false) {\n return;\n }\n\n // Because of plugin hooks (before/afterDatasetsDraw), datasets can't\n // currently be part of layers. Instead, we draw\n // layers <= 0 before(default, backward compat), and the rest after\n const layers = this._layers;\n for (i = 0; i < layers.length && layers[i].z <= 0; ++i) {\n layers[i].draw(this.chartArea);\n }\n\n this._drawDatasets();\n\n // Rest of layers\n for (; i < layers.length; ++i) {\n layers[i].draw(this.chartArea);\n }\n\n this.notifyPlugins('afterDraw');\n }\n\n /**\n\t * @private\n\t */\n _getSortedDatasetMetas(filterVisible) {\n const metasets = this._sortedMetasets;\n const result = [];\n let i, ilen;\n\n for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n const meta = metasets[i];\n if (!filterVisible || meta.visible) {\n result.push(meta);\n }\n }\n\n return result;\n }\n\n /**\n\t * Gets the visible dataset metas in drawing order\n\t * @return {object[]}\n\t */\n getSortedVisibleDatasetMetas() {\n return this._getSortedDatasetMetas(true);\n }\n\n /**\n\t * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw`\n\t * hook, in which case, plugins will not be called on `afterDatasetsDraw`.\n\t * @private\n\t */\n _drawDatasets() {\n if (this.notifyPlugins('beforeDatasetsDraw', {cancelable: true}) === false) {\n return;\n }\n\n const metasets = this.getSortedVisibleDatasetMetas();\n for (let i = metasets.length - 1; i >= 0; --i) {\n this._drawDataset(metasets[i]);\n }\n\n this.notifyPlugins('afterDatasetsDraw');\n }\n\n /**\n\t * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw`\n\t * hook, in which case, plugins will not be called on `afterDatasetDraw`.\n\t * @private\n\t */\n _drawDataset(meta) {\n const ctx = this.ctx;\n const args = {\n meta,\n index: meta.index,\n cancelable: true\n };\n // @ts-expect-error\n const clip = getDatasetClipArea(this, meta);\n\n if (this.notifyPlugins('beforeDatasetDraw', args) === false) {\n return;\n }\n\n if (clip) {\n clipArea(ctx, clip);\n }\n\n meta.controller.draw();\n\n if (clip) {\n unclipArea(ctx);\n }\n\n args.cancelable = false;\n this.notifyPlugins('afterDatasetDraw', args);\n }\n\n /**\n * Checks whether the given point is in the chart area.\n * @param {Point} point - in relative coordinates (see, e.g., getRelativePosition)\n * @returns {boolean}\n */\n isPointInArea(point) {\n return _isPointInArea(point, this.chartArea, this._minPadding);\n }\n\n getElementsAtEventForMode(e, mode, options, useFinalPosition) {\n const method = Interaction.modes[mode];\n if (typeof method === 'function') {\n return method(this, e, options, useFinalPosition);\n }\n\n return [];\n }\n\n getDatasetMeta(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n const metasets = this._metasets;\n let meta = metasets.filter(x => x && x._dataset === dataset).pop();\n\n if (!meta) {\n meta = {\n type: null,\n data: [],\n dataset: null,\n controller: null,\n hidden: null,\t\t\t// See isDatasetVisible() comment\n xAxisID: null,\n yAxisID: null,\n order: dataset && dataset.order || 0,\n index: datasetIndex,\n _dataset: dataset,\n _parsed: [],\n _sorted: false\n };\n metasets.push(meta);\n }\n\n return meta;\n }\n\n getContext() {\n return this.$context || (this.$context = createContext(null, {chart: this, type: 'chart'}));\n }\n\n getVisibleDatasetCount() {\n return this.getSortedVisibleDatasetMetas().length;\n }\n\n isDatasetVisible(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n if (!dataset) {\n return false;\n }\n\n const meta = this.getDatasetMeta(datasetIndex);\n\n // meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false,\n // the dataset.hidden value is ignored, else if null, the dataset hidden state is returned.\n return typeof meta.hidden === 'boolean' ? !meta.hidden : !dataset.hidden;\n }\n\n setDatasetVisibility(datasetIndex, visible) {\n const meta = this.getDatasetMeta(datasetIndex);\n meta.hidden = !visible;\n }\n\n toggleDataVisibility(index) {\n this._hiddenIndices[index] = !this._hiddenIndices[index];\n }\n\n getDataVisibility(index) {\n return !this._hiddenIndices[index];\n }\n\n /**\n\t * @private\n\t */\n _updateVisibility(datasetIndex, dataIndex, visible) {\n const mode = visible ? 'show' : 'hide';\n const meta = this.getDatasetMeta(datasetIndex);\n const anims = meta.controller._resolveAnimations(undefined, mode);\n\n if (defined(dataIndex)) {\n meta.data[dataIndex].hidden = !visible;\n this.update();\n } else {\n this.setDatasetVisibility(datasetIndex, visible);\n // Animate visible state, so hide animation can be seen. This could be handled better if update / updateDataset returned a Promise.\n anims.update(meta, {visible});\n this.update((ctx) => ctx.datasetIndex === datasetIndex ? mode : undefined);\n }\n }\n\n hide(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, false);\n }\n\n show(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, true);\n }\n\n /**\n\t * @private\n\t */\n _destroyDatasetMeta(datasetIndex) {\n const meta = this._metasets[datasetIndex];\n if (meta && meta.controller) {\n meta.controller._destroy();\n }\n delete this._metasets[datasetIndex];\n }\n\n _stop() {\n let i, ilen;\n this.stop();\n animator.remove(this);\n\n for (i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this._destroyDatasetMeta(i);\n }\n }\n\n destroy() {\n this.notifyPlugins('beforeDestroy');\n const {canvas, ctx} = this;\n\n this._stop();\n this.config.clearCache();\n\n if (canvas) {\n this.unbindEvents();\n clearCanvas(canvas, ctx);\n this.platform.releaseContext(ctx);\n this.canvas = null;\n this.ctx = null;\n }\n\n delete instances[this.id];\n\n this.notifyPlugins('afterDestroy');\n }\n\n toBase64Image(...args) {\n return this.canvas.toDataURL(...args);\n }\n\n /**\n\t * @private\n\t */\n bindEvents() {\n this.bindUserEvents();\n if (this.options.responsive) {\n this.bindResponsiveEvents();\n } else {\n this.attached = true;\n }\n }\n\n /**\n * @private\n */\n bindUserEvents() {\n const listeners = this._listeners;\n const platform = this.platform;\n\n const _add = (type, listener) => {\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n\n const listener = (e, x, y) => {\n e.offsetX = x;\n e.offsetY = y;\n this._eventHandler(e);\n };\n\n each(this.options.events, (type) => _add(type, listener));\n }\n\n /**\n * @private\n */\n bindResponsiveEvents() {\n if (!this._responsiveListeners) {\n this._responsiveListeners = {};\n }\n const listeners = this._responsiveListeners;\n const platform = this.platform;\n\n const _add = (type, listener) => {\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n const _remove = (type, listener) => {\n if (listeners[type]) {\n platform.removeEventListener(this, type, listener);\n delete listeners[type];\n }\n };\n\n const listener = (width, height) => {\n if (this.canvas) {\n this.resize(width, height);\n }\n };\n\n let detached; // eslint-disable-line prefer-const\n const attached = () => {\n _remove('attach', attached);\n\n this.attached = true;\n this.resize();\n\n _add('resize', listener);\n _add('detach', detached);\n };\n\n detached = () => {\n this.attached = false;\n\n _remove('resize', listener);\n\n // Stop animating and remove metasets, so when re-attached, the animations start from beginning.\n this._stop();\n this._resize(0, 0);\n\n _add('attach', attached);\n };\n\n if (platform.isAttached(this.canvas)) {\n attached();\n } else {\n detached();\n }\n }\n\n /**\n\t * @private\n\t */\n unbindEvents() {\n each(this._listeners, (listener, type) => {\n this.platform.removeEventListener(this, type, listener);\n });\n this._listeners = {};\n\n each(this._responsiveListeners, (listener, type) => {\n this.platform.removeEventListener(this, type, listener);\n });\n this._responsiveListeners = undefined;\n }\n\n updateHoverStyle(items, mode, enabled) {\n const prefix = enabled ? 'set' : 'remove';\n let meta, item, i, ilen;\n\n if (mode === 'dataset') {\n meta = this.getDatasetMeta(items[0].datasetIndex);\n meta.controller['_' + prefix + 'DatasetHoverStyle']();\n }\n\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n item = items[i];\n const controller = item && this.getDatasetMeta(item.datasetIndex).controller;\n if (controller) {\n controller[prefix + 'HoverStyle'](item.element, item.datasetIndex, item.index);\n }\n }\n }\n\n /**\n\t * Get active (hovered) elements\n\t * @returns array\n\t */\n getActiveElements() {\n return this._active || [];\n }\n\n /**\n\t * Set active (hovered) elements\n\t * @param {array} activeElements New active data points\n\t */\n setActiveElements(activeElements) {\n const lastActive = this._active || [];\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = this.getDatasetMeta(datasetIndex);\n if (!meta) {\n throw new Error('No dataset found at index ' + datasetIndex);\n }\n\n return {\n datasetIndex,\n element: meta.data[index],\n index,\n };\n });\n const changed = !_elementsEqual(active, lastActive);\n\n if (changed) {\n this._active = active;\n // Make sure we don't use the previous mouse event to override the active elements in update.\n this._lastEvent = null;\n this._updateHoverStyles(active, lastActive);\n }\n }\n\n /**\n\t * Calls enabled plugins on the specified hook and with the given args.\n\t * This method immediately returns as soon as a plugin explicitly returns false. The\n\t * returned value can be used, for instance, to interrupt the current action.\n\t * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n\t * @param {Object} [args] - Extra arguments to apply to the hook call.\n * @param {import('./core.plugins.js').filterCallback} [filter] - Filtering function for limiting which plugins are notified\n\t * @returns {boolean} false if any of the plugins return false, else returns true.\n\t */\n notifyPlugins(hook, args, filter) {\n return this._plugins.notify(this, hook, args, filter);\n }\n\n /**\n * Check if a plugin with the specific ID is registered and enabled\n * @param {string} pluginId - The ID of the plugin of which to check if it is enabled\n * @returns {boolean}\n */\n isPluginEnabled(pluginId) {\n return this._plugins._cache.filter(p => p.plugin.id === pluginId).length === 1;\n }\n\n /**\n\t * @private\n\t */\n _updateHoverStyles(active, lastActive, replay) {\n const hoverOptions = this.options.hover;\n const diff = (a, b) => a.filter(x => !b.some(y => x.datasetIndex === y.datasetIndex && x.index === y.index));\n const deactivated = diff(lastActive, active);\n const activated = replay ? active : diff(active, lastActive);\n\n if (deactivated.length) {\n this.updateHoverStyle(deactivated, hoverOptions.mode, false);\n }\n\n if (activated.length && hoverOptions.mode) {\n this.updateHoverStyle(activated, hoverOptions.mode, true);\n }\n }\n\n /**\n\t * @private\n\t */\n _eventHandler(e, replay) {\n const args = {\n event: e,\n replay,\n cancelable: true,\n inChartArea: this.isPointInArea(e)\n };\n const eventFilter = (plugin) => (plugin.options.events || this.options.events).includes(e.native.type);\n\n if (this.notifyPlugins('beforeEvent', args, eventFilter) === false) {\n return;\n }\n\n const changed = this._handleEvent(e, replay, args.inChartArea);\n\n args.cancelable = false;\n this.notifyPlugins('afterEvent', args, eventFilter);\n\n if (changed || args.changed) {\n this.render();\n }\n\n return this;\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e the event to handle\n\t * @param {boolean} [replay] - true if the event was replayed by `update`\n * @param {boolean} [inChartArea] - true if the event is inside chartArea\n\t * @return {boolean} true if the chart needs to re-render\n\t * @private\n\t */\n _handleEvent(e, replay, inChartArea) {\n const {_active: lastActive = [], options} = this;\n\n // If the event is replayed from `update`, we should evaluate with the final positions.\n //\n // The `replay`:\n // It's the last event (excluding click) that has occurred before `update`.\n // So mouse has not moved. It's also over the chart, because there is a `replay`.\n //\n // The why:\n // If animations are active, the elements haven't moved yet compared to state before update.\n // But if they will, we are activating the elements that would be active, if this check\n // was done after the animations have completed. => \"final positions\".\n // If there is no animations, the \"final\" and \"current\" positions are equal.\n // This is done so we do not have to evaluate the active elements each animation frame\n // - it would be expensive.\n const useFinalPosition = replay;\n const active = this._getActiveElements(e, lastActive, inChartArea, useFinalPosition);\n const isClick = _isClickEvent(e);\n const lastEvent = determineLastEvent(e, this._lastEvent, inChartArea, isClick);\n\n if (inChartArea) {\n // Set _lastEvent to null while we are processing the event handlers.\n // This prevents recursion if the handler calls chart.update()\n this._lastEvent = null;\n\n // Invoke onHover hook\n callCallback(options.onHover, [e, active, this], this);\n\n if (isClick) {\n callCallback(options.onClick, [e, active, this], this);\n }\n }\n\n const changed = !_elementsEqual(active, lastActive);\n if (changed || replay) {\n this._active = active;\n this._updateHoverStyles(active, lastActive, replay);\n }\n\n this._lastEvent = lastEvent;\n\n return changed;\n }\n\n /**\n * @param {ChartEvent} e - The event\n * @param {import('../types/index.js').ActiveElement[]} lastActive - Previously active elements\n * @param {boolean} inChartArea - Is the event inside chartArea\n * @param {boolean} useFinalPosition - Should the evaluation be done with current or final (after animation) element positions\n * @returns {import('../types/index.js').ActiveElement[]} - The active elements\n * @pravate\n */\n _getActiveElements(e, lastActive, inChartArea, useFinalPosition) {\n if (e.type === 'mouseout') {\n return [];\n }\n\n if (!inChartArea) {\n // Let user control the active elements outside chartArea. Eg. using Legend.\n return lastActive;\n }\n\n const hoverOptions = this.options.hover;\n return this.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition);\n }\n}\n\n// @ts-ignore\nfunction invalidatePlugins() {\n return each(Chart.instances, (chart) => chart._plugins.invalidate());\n}\n\nexport default Chart;\n","import Element from '../core/core.element.js';\nimport {_angleBetween, getAngleFromPoint, TAU, HALF_PI, valueOrDefault} from '../helpers/index.js';\nimport {PI, _angleDiff, _normalizeAngle, _isBetween, _limitValue} from '../helpers/helpers.math.js';\nimport {_readValueToProps} from '../helpers/helpers.options.js';\nimport type {ArcOptions, Point} from '../types/index.js';\n\nfunction clipSelf(ctx: CanvasRenderingContext2D, element: ArcElement, endAngle: number) {\n const {startAngle, x, y, outerRadius, innerRadius, options} = element;\n const {borderWidth, borderJoinStyle} = options;\n const outerAngleClip = Math.min(borderWidth / outerRadius, _normalizeAngle(startAngle - endAngle));\n ctx.beginPath();\n ctx.arc(x, y, outerRadius - borderWidth / 2, startAngle + outerAngleClip / 2, endAngle - outerAngleClip / 2);\n\n if (innerRadius > 0) {\n const innerAngleClip = Math.min(borderWidth / innerRadius, _normalizeAngle(startAngle - endAngle));\n ctx.arc(x, y, innerRadius + borderWidth / 2, endAngle - innerAngleClip / 2, startAngle + innerAngleClip / 2, true);\n } else {\n const clipWidth = Math.min(borderWidth / 2, outerRadius * _normalizeAngle(startAngle - endAngle));\n\n if (borderJoinStyle === 'round') {\n ctx.arc(x, y, clipWidth, endAngle - PI / 2, startAngle + PI / 2, true);\n } else if (borderJoinStyle === 'bevel') {\n const r = 2 * clipWidth * clipWidth;\n const endX = -r * Math.cos(endAngle + PI / 2) + x;\n const endY = -r * Math.sin(endAngle + PI / 2) + y;\n const startX = r * Math.cos(startAngle + PI / 2) + x;\n const startY = r * Math.sin(startAngle + PI / 2) + y;\n ctx.lineTo(endX, endY);\n ctx.lineTo(startX, startY);\n }\n }\n ctx.closePath();\n\n ctx.moveTo(0, 0);\n ctx.rect(0, 0, ctx.canvas.width, ctx.canvas.height);\n\n ctx.clip('evenodd');\n}\n\n\nfunction clipArc(ctx: CanvasRenderingContext2D, element: ArcElement, endAngle: number) {\n const {startAngle, pixelMargin, x, y, outerRadius, innerRadius} = element;\n let angleMargin = pixelMargin / outerRadius;\n\n // Draw an inner border by clipping the arc and drawing a double-width border\n // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders\n ctx.beginPath();\n ctx.arc(x, y, outerRadius, startAngle - angleMargin, endAngle + angleMargin);\n if (innerRadius > pixelMargin) {\n angleMargin = pixelMargin / innerRadius;\n ctx.arc(x, y, innerRadius, endAngle + angleMargin, startAngle - angleMargin, true);\n } else {\n ctx.arc(x, y, pixelMargin, endAngle + HALF_PI, startAngle - HALF_PI);\n }\n ctx.closePath();\n ctx.clip();\n}\n\nfunction toRadiusCorners(value) {\n return _readValueToProps(value, ['outerStart', 'outerEnd', 'innerStart', 'innerEnd']);\n}\n\n/**\n * Parse border radius from the provided options\n */\nfunction parseBorderRadius(arc: ArcElement, innerRadius: number, outerRadius: number, angleDelta: number) {\n const o = toRadiusCorners(arc.options.borderRadius);\n const halfThickness = (outerRadius - innerRadius) / 2;\n const innerLimit = Math.min(halfThickness, angleDelta * innerRadius / 2);\n\n // Outer limits are complicated. We want to compute the available angular distance at\n // a radius of outerRadius - borderRadius because for small angular distances, this term limits.\n // We compute at r = outerRadius - borderRadius because this circle defines the center of the border corners.\n //\n // If the borderRadius is large, that value can become negative.\n // This causes the outer borders to lose their radius entirely, which is rather unexpected. To solve that, if borderRadius > outerRadius\n // we know that the thickness term will dominate and compute the limits at that point\n const computeOuterLimit = (val) => {\n const outerArcLimit = (outerRadius - Math.min(halfThickness, val)) * angleDelta / 2;\n return _limitValue(val, 0, Math.min(halfThickness, outerArcLimit));\n };\n\n return {\n outerStart: computeOuterLimit(o.outerStart),\n outerEnd: computeOuterLimit(o.outerEnd),\n innerStart: _limitValue(o.innerStart, 0, innerLimit),\n innerEnd: _limitValue(o.innerEnd, 0, innerLimit),\n };\n}\n\n/**\n * Convert (r, 𝜃) to (x, y)\n */\nfunction rThetaToXY(r: number, theta: number, x: number, y: number) {\n return {\n x: x + r * Math.cos(theta),\n y: y + r * Math.sin(theta),\n };\n}\n\n\n/**\n * Path the arc, respecting border radius by separating into left and right halves.\n *\n * Start End\n *\n * 1--->a--->2 Outer\n * / \\\n * 8 3\n * | |\n * | |\n * 7 4\n * \\ /\n * 6<---b<---5 Inner\n */\nfunction pathArc(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n end: number,\n circular: boolean,\n) {\n const {x, y, startAngle: start, pixelMargin, innerRadius: innerR} = element;\n\n const outerRadius = Math.max(element.outerRadius + spacing + offset - pixelMargin, 0);\n const innerRadius = innerR > 0 ? innerR + spacing + offset + pixelMargin : 0;\n\n let spacingOffset = 0;\n const alpha = end - start;\n\n if (spacing) {\n // When spacing is present, it is the same for all items\n // So we adjust the start and end angle of the arc such that\n // the distance is the same as it would be without the spacing\n const noSpacingInnerRadius = innerR > 0 ? innerR - spacing : 0;\n const noSpacingOuterRadius = outerRadius > 0 ? outerRadius - spacing : 0;\n const avNogSpacingRadius = (noSpacingInnerRadius + noSpacingOuterRadius) / 2;\n const adjustedAngle = avNogSpacingRadius !== 0 ? (alpha * avNogSpacingRadius) / (avNogSpacingRadius + spacing) : alpha;\n spacingOffset = (alpha - adjustedAngle) / 2;\n }\n\n const beta = Math.max(0.001, alpha * outerRadius - offset / PI) / outerRadius;\n const angleOffset = (alpha - beta) / 2;\n const startAngle = start + angleOffset + spacingOffset;\n const endAngle = end - angleOffset - spacingOffset;\n const {outerStart, outerEnd, innerStart, innerEnd} = parseBorderRadius(element, innerRadius, outerRadius, endAngle - startAngle);\n\n const outerStartAdjustedRadius = outerRadius - outerStart;\n const outerEndAdjustedRadius = outerRadius - outerEnd;\n const outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius;\n const outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius;\n\n const innerStartAdjustedRadius = innerRadius + innerStart;\n const innerEndAdjustedRadius = innerRadius + innerEnd;\n const innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius;\n const innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius;\n\n ctx.beginPath();\n\n if (circular) {\n // The first arc segments from point 1 to point a to point 2\n const outerMidAdjustedAngle = (outerStartAdjustedAngle + outerEndAdjustedAngle) / 2;\n ctx.arc(x, y, outerRadius, outerStartAdjustedAngle, outerMidAdjustedAngle);\n ctx.arc(x, y, outerRadius, outerMidAdjustedAngle, outerEndAdjustedAngle);\n\n // The corner segment from point 2 to point 3\n if (outerEnd > 0) {\n const pCenter = rThetaToXY(outerEndAdjustedRadius, outerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerEnd, outerEndAdjustedAngle, endAngle + HALF_PI);\n }\n\n // The line from point 3 to point 4\n const p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y);\n ctx.lineTo(p4.x, p4.y);\n\n // The corner segment from point 4 to point 5\n if (innerEnd > 0) {\n const pCenter = rThetaToXY(innerEndAdjustedRadius, innerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerEnd, endAngle + HALF_PI, innerEndAdjustedAngle + Math.PI);\n }\n\n // The inner arc from point 5 to point b to point 6\n const innerMidAdjustedAngle = ((endAngle - (innerEnd / innerRadius)) + (startAngle + (innerStart / innerRadius))) / 2;\n ctx.arc(x, y, innerRadius, endAngle - (innerEnd / innerRadius), innerMidAdjustedAngle, true);\n ctx.arc(x, y, innerRadius, innerMidAdjustedAngle, startAngle + (innerStart / innerRadius), true);\n\n // The corner segment from point 6 to point 7\n if (innerStart > 0) {\n const pCenter = rThetaToXY(innerStartAdjustedRadius, innerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerStart, innerStartAdjustedAngle + Math.PI, startAngle - HALF_PI);\n }\n\n // The line from point 7 to point 8\n const p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y);\n ctx.lineTo(p8.x, p8.y);\n\n // The corner segment from point 8 to point 1\n if (outerStart > 0) {\n const pCenter = rThetaToXY(outerStartAdjustedRadius, outerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerStart, startAngle - HALF_PI, outerStartAdjustedAngle);\n }\n } else {\n ctx.moveTo(x, y);\n\n const outerStartX = Math.cos(outerStartAdjustedAngle) * outerRadius + x;\n const outerStartY = Math.sin(outerStartAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerStartX, outerStartY);\n\n const outerEndX = Math.cos(outerEndAdjustedAngle) * outerRadius + x;\n const outerEndY = Math.sin(outerEndAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerEndX, outerEndY);\n }\n\n ctx.closePath();\n}\n\nfunction drawArc(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n circular: boolean,\n) {\n const {fullCircles, startAngle, circumference} = element;\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for (let i = 0; i < fullCircles; ++i) {\n ctx.fill();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.fill();\n return endAngle;\n}\n\nfunction drawBorder(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n circular: boolean,\n) {\n const {fullCircles, startAngle, circumference, options} = element;\n const {borderWidth, borderJoinStyle, borderDash, borderDashOffset, borderRadius} = options;\n const inner = options.borderAlign === 'inner';\n\n if (!borderWidth) {\n return;\n }\n\n ctx.setLineDash(borderDash || []);\n ctx.lineDashOffset = borderDashOffset;\n\n if (inner) {\n ctx.lineWidth = borderWidth * 2;\n ctx.lineJoin = borderJoinStyle || 'round';\n } else {\n ctx.lineWidth = borderWidth;\n ctx.lineJoin = borderJoinStyle || 'bevel';\n }\n\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for (let i = 0; i < fullCircles; ++i) {\n ctx.stroke();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n\n if (inner) {\n clipArc(ctx, element, endAngle);\n }\n\n if (options.selfJoin && endAngle - startAngle >= PI && borderRadius === 0 && borderJoinStyle !== 'miter') {\n clipSelf(ctx, element, endAngle);\n }\n\n if (!fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.stroke();\n }\n}\n\nexport interface ArcProps extends Point {\n startAngle: number;\n endAngle: number;\n innerRadius: number;\n outerRadius: number;\n circumference: number;\n}\n\nexport default class ArcElement extends Element {\n\n static id = 'arc';\n\n static defaults = {\n borderAlign: 'center',\n borderColor: '#fff',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: undefined,\n borderRadius: 0,\n borderWidth: 2,\n offset: 0,\n spacing: 0,\n angle: undefined,\n circular: true,\n selfJoin: false,\n };\n\n static defaultRoutes = {\n backgroundColor: 'backgroundColor'\n };\n\n static descriptors = {\n _scriptable: true,\n _indexable: (name) => name !== 'borderDash'\n };\n\n circumference: number;\n endAngle: number;\n fullCircles: number;\n innerRadius: number;\n outerRadius: number;\n pixelMargin: number;\n startAngle: number;\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.circumference = undefined;\n this.startAngle = undefined;\n this.endAngle = undefined;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.pixelMargin = 0;\n this.fullCircles = 0;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n inRange(chartX: number, chartY: number, useFinalPosition: boolean) {\n const point = this.getProps(['x', 'y'], useFinalPosition);\n const {angle, distance} = getAngleFromPoint(point, {x: chartX, y: chartY});\n const {startAngle, endAngle, innerRadius, outerRadius, circumference} = this.getProps([\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius',\n 'circumference'\n ], useFinalPosition);\n const rAdjust = (this.options.spacing + this.options.borderWidth) / 2;\n const _circumference = valueOrDefault(circumference, endAngle - startAngle);\n const nonZeroBetween = _angleBetween(angle, startAngle, endAngle) && startAngle !== endAngle;\n const betweenAngles = _circumference >= TAU || nonZeroBetween;\n const withinRadius = _isBetween(distance, innerRadius + rAdjust, outerRadius + rAdjust);\n\n return (betweenAngles && withinRadius);\n }\n\n getCenterPoint(useFinalPosition: boolean) {\n const {x, y, startAngle, endAngle, innerRadius, outerRadius} = this.getProps([\n 'x',\n 'y',\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius'\n ], useFinalPosition);\n const {offset, spacing} = this.options;\n const halfAngle = (startAngle + endAngle) / 2;\n const halfRadius = (innerRadius + outerRadius + spacing + offset) / 2;\n return {\n x: x + Math.cos(halfAngle) * halfRadius,\n y: y + Math.sin(halfAngle) * halfRadius\n };\n }\n\n tooltipPosition(useFinalPosition: boolean) {\n return this.getCenterPoint(useFinalPosition);\n }\n\n draw(ctx: CanvasRenderingContext2D) {\n const {options, circumference} = this;\n const offset = (options.offset || 0) / 4;\n const spacing = (options.spacing || 0) / 2;\n const circular = options.circular;\n this.pixelMargin = (options.borderAlign === 'inner') ? 0.33 : 0;\n this.fullCircles = circumference > TAU ? Math.floor(circumference / TAU) : 0;\n\n if (circumference === 0 || this.innerRadius < 0 || this.outerRadius < 0) {\n return;\n }\n\n ctx.save();\n\n const halfAngle = (this.startAngle + this.endAngle) / 2;\n ctx.translate(Math.cos(halfAngle) * offset, Math.sin(halfAngle) * offset);\n const fix = 1 - Math.sin(Math.min(PI, circumference || 0));\n const radiusOffset = offset * fix;\n\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n\n drawArc(ctx, this, radiusOffset, spacing, circular);\n drawBorder(ctx, this, radiusOffset, spacing, circular);\n\n ctx.restore();\n }\n}\n","import Element from '../core/core.element.js';\nimport {_bezierInterpolation, _pointInLine, _steppedInterpolation} from '../helpers/helpers.interpolation.js';\nimport {_computeSegments, _boundSegments} from '../helpers/helpers.segment.js';\nimport {_steppedLineTo, _bezierCurveTo} from '../helpers/helpers.canvas.js';\nimport {_updateBezierControlPoints} from '../helpers/helpers.curve.js';\nimport {valueOrDefault} from '../helpers/index.js';\n\n/**\n * @typedef { import('./element.point.js').default } PointElement\n */\n\nfunction setStyle(ctx, options, style = options) {\n ctx.lineCap = valueOrDefault(style.borderCapStyle, options.borderCapStyle);\n ctx.setLineDash(valueOrDefault(style.borderDash, options.borderDash));\n ctx.lineDashOffset = valueOrDefault(style.borderDashOffset, options.borderDashOffset);\n ctx.lineJoin = valueOrDefault(style.borderJoinStyle, options.borderJoinStyle);\n ctx.lineWidth = valueOrDefault(style.borderWidth, options.borderWidth);\n ctx.strokeStyle = valueOrDefault(style.borderColor, options.borderColor);\n}\n\nfunction lineTo(ctx, previous, target) {\n ctx.lineTo(target.x, target.y);\n}\n\n/**\n * @returns {any}\n */\nfunction getLineMethod(options) {\n if (options.stepped) {\n return _steppedLineTo;\n }\n\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierCurveTo;\n }\n\n return lineTo;\n}\n\nfunction pathVars(points, segment, params = {}) {\n const count = points.length;\n const {start: paramsStart = 0, end: paramsEnd = count - 1} = params;\n const {start: segmentStart, end: segmentEnd} = segment;\n const start = Math.max(paramsStart, segmentStart);\n const end = Math.min(paramsEnd, segmentEnd);\n const outside = paramsStart < segmentStart && paramsEnd < segmentStart || paramsStart > segmentEnd && paramsEnd > segmentEnd;\n\n return {\n count,\n start,\n loop: segment.loop,\n ilen: end < start && !outside ? count + end - start : end - start\n };\n}\n\n/**\n * Create path from points, grouping by truncated x-coordinate\n * Points need to be in order by x-coordinate for this to work efficiently\n * @param {CanvasRenderingContext2D|Path2D} ctx - Context\n * @param {LineElement} line\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} params\n * @param {boolean} params.move - move to starting point (vs line to it)\n * @param {boolean} params.reverse - path the segment from end to start\n * @param {number} params.start - limit segment to points starting from `start` index\n * @param {number} params.end - limit segment to points ending at `start` + `count` index\n */\nfunction pathSegment(ctx, line, segment, params) {\n const {points, options} = line;\n const {count, start, loop, ilen} = pathVars(points, segment, params);\n const lineMethod = getLineMethod(options);\n // eslint-disable-next-line prefer-const\n let {move = true, reverse} = params || {};\n let i, point, prev;\n\n for (i = 0; i <= ilen; ++i) {\n point = points[(start + (reverse ? ilen - i : i)) % count];\n\n if (point.skip) {\n // If there is a skipped point inside a segment, spanGaps must be true\n continue;\n } else if (move) {\n ctx.moveTo(point.x, point.y);\n move = false;\n } else {\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n\n prev = point;\n }\n\n if (loop) {\n point = points[(start + (reverse ? ilen : 0)) % count];\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n\n return !!loop;\n}\n\n/**\n * Create path from points, grouping by truncated x-coordinate\n * Points need to be in order by x-coordinate for this to work efficiently\n * @param {CanvasRenderingContext2D|Path2D} ctx - Context\n * @param {LineElement} line\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} params\n * @param {boolean} params.move - move to starting point (vs line to it)\n * @param {boolean} params.reverse - path the segment from end to start\n * @param {number} params.start - limit segment to points starting from `start` index\n * @param {number} params.end - limit segment to points ending at `start` + `count` index\n */\nfunction fastPathSegment(ctx, line, segment, params) {\n const points = line.points;\n const {count, start, ilen} = pathVars(points, segment, params);\n const {move = true, reverse} = params || {};\n let avgX = 0;\n let countX = 0;\n let i, point, prevX, minY, maxY, lastY;\n\n const pointIndex = (index) => (start + (reverse ? ilen - index : index)) % count;\n const drawX = () => {\n if (minY !== maxY) {\n // Draw line to maxY and minY, using the average x-coordinate\n ctx.lineTo(avgX, maxY);\n ctx.lineTo(avgX, minY);\n // Line to y-value of last point in group. So the line continues\n // from correct position. Not using move, to have solid path.\n ctx.lineTo(avgX, lastY);\n }\n };\n\n if (move) {\n point = points[pointIndex(0)];\n ctx.moveTo(point.x, point.y);\n }\n\n for (i = 0; i <= ilen; ++i) {\n point = points[pointIndex(i)];\n\n if (point.skip) {\n // If there is a skipped point inside a segment, spanGaps must be true\n continue;\n }\n\n const x = point.x;\n const y = point.y;\n const truncX = x | 0; // truncated x-coordinate\n\n if (truncX === prevX) {\n // Determine `minY` / `maxY` and `avgX` while we stay within same x-position\n if (y < minY) {\n minY = y;\n } else if (y > maxY) {\n maxY = y;\n }\n // For first point in group, countX is `0`, so average will be `x` / 1.\n avgX = (countX * avgX + x) / ++countX;\n } else {\n drawX();\n // Draw line to next x-position, using the first (or only)\n // y-value in that group\n ctx.lineTo(x, y);\n\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n }\n // Keep track of the last y-value in group\n lastY = y;\n }\n drawX();\n}\n\n/**\n * @param {LineElement} line - the line\n * @returns {function}\n * @private\n */\nfunction _getSegmentMethod(line) {\n const opts = line.options;\n const borderDash = opts.borderDash && opts.borderDash.length;\n const useFastPath = !line._decimated && !line._loop && !opts.tension && opts.cubicInterpolationMode !== 'monotone' && !opts.stepped && !borderDash;\n return useFastPath ? fastPathSegment : pathSegment;\n}\n\n/**\n * @private\n */\nfunction _getInterpolationMethod(options) {\n if (options.stepped) {\n return _steppedInterpolation;\n }\n\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierInterpolation;\n }\n\n return _pointInLine;\n}\n\nfunction strokePathWithCache(ctx, line, start, count) {\n let path = line._path;\n if (!path) {\n path = line._path = new Path2D();\n if (line.path(path, start, count)) {\n path.closePath();\n }\n }\n setStyle(ctx, line.options);\n ctx.stroke(path);\n}\n\nfunction strokePathDirect(ctx, line, start, count) {\n const {segments, options} = line;\n const segmentMethod = _getSegmentMethod(line);\n\n for (const segment of segments) {\n setStyle(ctx, options, segment.style);\n ctx.beginPath();\n if (segmentMethod(ctx, line, segment, {start, end: start + count - 1})) {\n ctx.closePath();\n }\n ctx.stroke();\n }\n}\n\nconst usePath2D = typeof Path2D === 'function';\n\nfunction draw(ctx, line, start, count) {\n if (usePath2D && !line.options.segment) {\n strokePathWithCache(ctx, line, start, count);\n } else {\n strokePathDirect(ctx, line, start, count);\n }\n}\n\nexport default class LineElement extends Element {\n\n static id = 'line';\n\n /**\n * @type {any}\n */\n static defaults = {\n borderCapStyle: 'butt',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderWidth: 3,\n capBezierPoints: true,\n cubicInterpolationMode: 'default',\n fill: false,\n spanGaps: false,\n stepped: false,\n tension: 0,\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n\n static descriptors = {\n _scriptable: true,\n _indexable: (name) => name !== 'borderDash' && name !== 'fill',\n };\n\n\n constructor(cfg) {\n super();\n\n this.animated = true;\n this.options = undefined;\n this._chart = undefined;\n this._loop = undefined;\n this._fullLoop = undefined;\n this._path = undefined;\n this._points = undefined;\n this._segments = undefined;\n this._decimated = false;\n this._pointsUpdated = false;\n this._datasetIndex = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n updateControlPoints(chartArea, indexAxis) {\n const options = this.options;\n if ((options.tension || options.cubicInterpolationMode === 'monotone') && !options.stepped && !this._pointsUpdated) {\n const loop = options.spanGaps ? this._loop : this._fullLoop;\n _updateBezierControlPoints(this._points, options, chartArea, loop, indexAxis);\n this._pointsUpdated = true;\n }\n }\n\n set points(points) {\n this._points = points;\n delete this._segments;\n delete this._path;\n this._pointsUpdated = false;\n }\n\n get points() {\n return this._points;\n }\n\n get segments() {\n return this._segments || (this._segments = _computeSegments(this, this.options.segment));\n }\n\n /**\n\t * First non-skipped point on this line\n\t * @returns {PointElement|undefined}\n\t */\n first() {\n const segments = this.segments;\n const points = this.points;\n return segments.length && points[segments[0].start];\n }\n\n /**\n\t * Last non-skipped point on this line\n\t * @returns {PointElement|undefined}\n\t */\n last() {\n const segments = this.segments;\n const points = this.points;\n const count = segments.length;\n return count && points[segments[count - 1].end];\n }\n\n /**\n\t * Interpolate a point in this line at the same value on `property` as\n\t * the reference `point` provided\n\t * @param {PointElement} point - the reference point\n\t * @param {string} property - the property to match on\n\t * @returns {PointElement|undefined}\n\t */\n interpolate(point, property) {\n const options = this.options;\n const value = point[property];\n const points = this.points;\n const segments = _boundSegments(this, {property, start: value, end: value});\n\n if (!segments.length) {\n return;\n }\n\n const result = [];\n const _interpolate = _getInterpolationMethod(options);\n let i, ilen;\n for (i = 0, ilen = segments.length; i < ilen; ++i) {\n const {start, end} = segments[i];\n const p1 = points[start];\n const p2 = points[end];\n if (p1 === p2) {\n result.push(p1);\n continue;\n }\n const t = Math.abs((value - p1[property]) / (p2[property] - p1[property]));\n const interpolated = _interpolate(p1, p2, t, options.stepped);\n interpolated[property] = point[property];\n result.push(interpolated);\n }\n return result.length === 1 ? result[0] : result;\n }\n\n /**\n\t * Append a segment of this line to current path.\n\t * @param {CanvasRenderingContext2D} ctx\n\t * @param {object} segment\n\t * @param {number} segment.start - start index of the segment, referring the points array\n \t * @param {number} segment.end - end index of the segment, referring the points array\n \t * @param {boolean} segment.loop - indicates that the segment is a loop\n\t * @param {object} params\n\t * @param {boolean} params.move - move to starting point (vs line to it)\n\t * @param {boolean} params.reverse - path the segment from end to start\n\t * @param {number} params.start - limit segment to points starting from `start` index\n\t * @param {number} params.end - limit segment to points ending at `start` + `count` index\n\t * @returns {undefined|boolean} - true if the segment is a full loop (path should be closed)\n\t */\n pathSegment(ctx, segment, params) {\n const segmentMethod = _getSegmentMethod(this);\n return segmentMethod(ctx, this, segment, params);\n }\n\n /**\n\t * Append all segments of this line to current path.\n\t * @param {CanvasRenderingContext2D|Path2D} ctx\n\t * @param {number} [start]\n\t * @param {number} [count]\n\t * @returns {undefined|boolean} - true if line is a full loop (path should be closed)\n\t */\n path(ctx, start, count) {\n const segments = this.segments;\n const segmentMethod = _getSegmentMethod(this);\n let loop = this._loop;\n\n start = start || 0;\n count = count || (this.points.length - start);\n\n for (const segment of segments) {\n loop &= segmentMethod(ctx, this, segment, {start, end: start + count - 1});\n }\n return !!loop;\n }\n\n /**\n\t * Draw\n\t * @param {CanvasRenderingContext2D} ctx\n\t * @param {object} chartArea\n\t * @param {number} [start]\n\t * @param {number} [count]\n\t */\n draw(ctx, chartArea, start, count) {\n const options = this.options || {};\n const points = this.points || [];\n\n if (points.length && options.borderWidth) {\n ctx.save();\n\n draw(ctx, this, start, count);\n\n ctx.restore();\n }\n\n if (this.animated) {\n // When line is animated, the control points and path are not cached.\n this._pointsUpdated = false;\n this._path = undefined;\n }\n }\n}\n","import Element from '../core/core.element.js';\nimport {drawPoint, _isPointInArea} from '../helpers/helpers.canvas.js';\nimport type {\n CartesianParsedData,\n ChartArea,\n Point,\n PointHoverOptions,\n PointOptions,\n} from '../types/index.js';\n\nfunction inRange(el: PointElement, pos: number, axis: 'x' | 'y', useFinalPosition?: boolean) {\n const options = el.options;\n const {[axis]: value} = el.getProps([axis], useFinalPosition);\n\n return (Math.abs(pos - value) < options.radius + options.hitRadius);\n}\n\nexport type PointProps = Point\n\nexport default class PointElement extends Element {\n\n static id = 'point';\n\n parsed: CartesianParsedData;\n skip?: boolean;\n stop?: boolean;\n\n /**\n * @type {any}\n */\n static defaults = {\n borderWidth: 1,\n hitRadius: 1,\n hoverBorderWidth: 1,\n hoverRadius: 4,\n pointStyle: 'circle',\n radius: 3,\n rotation: 0\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.parsed = undefined;\n this.skip = undefined;\n this.stop = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n inRange(mouseX: number, mouseY: number, useFinalPosition?: boolean) {\n const options = this.options;\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return ((Math.pow(mouseX - x, 2) + Math.pow(mouseY - y, 2)) < Math.pow(options.hitRadius + options.radius, 2));\n }\n\n inXRange(mouseX: number, useFinalPosition?: boolean) {\n return inRange(this, mouseX, 'x', useFinalPosition);\n }\n\n inYRange(mouseY: number, useFinalPosition?: boolean) {\n return inRange(this, mouseY, 'y', useFinalPosition);\n }\n\n getCenterPoint(useFinalPosition?: boolean) {\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return {x, y};\n }\n\n size(options?: Partial) {\n options = options || this.options || {};\n let radius = options.radius || 0;\n radius = Math.max(radius, radius && options.hoverRadius || 0);\n const borderWidth = radius && options.borderWidth || 0;\n return (radius + borderWidth) * 2;\n }\n\n draw(ctx: CanvasRenderingContext2D, area: ChartArea) {\n const options = this.options;\n\n if (this.skip || options.radius < 0.1 || !_isPointInArea(this, area, this.size(options) / 2)) {\n return;\n }\n\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n ctx.fillStyle = options.backgroundColor;\n drawPoint(ctx, options, this.x, this.y);\n }\n\n getRange() {\n const options = this.options || {};\n // @ts-expect-error Fallbacks should never be hit in practice\n return options.radius + options.hitRadius;\n }\n}\n","import Element from '../core/core.element.js';\nimport {isObject, _isBetween, _limitValue} from '../helpers/index.js';\nimport {addRoundedRectPath} from '../helpers/helpers.canvas.js';\nimport {toTRBL, toTRBLCorners} from '../helpers/helpers.options.js';\n\n/** @typedef {{ x: number, y: number, base: number, horizontal: boolean, width: number, height: number }} BarProps */\n\n/**\n * Helper function to get the bounds of the bar regardless of the orientation\n * @param {BarElement} bar the bar\n * @param {boolean} [useFinalPosition]\n * @return {object} bounds of the bar\n * @private\n */\nfunction getBarBounds(bar, useFinalPosition) {\n const {x, y, base, width, height} = /** @type {BarProps} */ (bar.getProps(['x', 'y', 'base', 'width', 'height'], useFinalPosition));\n\n let left, right, top, bottom, half;\n\n if (bar.horizontal) {\n half = height / 2;\n left = Math.min(x, base);\n right = Math.max(x, base);\n top = y - half;\n bottom = y + half;\n } else {\n half = width / 2;\n left = x - half;\n right = x + half;\n top = Math.min(y, base);\n bottom = Math.max(y, base);\n }\n\n return {left, top, right, bottom};\n}\n\nfunction skipOrLimit(skip, value, min, max) {\n return skip ? 0 : _limitValue(value, min, max);\n}\n\nfunction parseBorderWidth(bar, maxW, maxH) {\n const value = bar.options.borderWidth;\n const skip = bar.borderSkipped;\n const o = toTRBL(value);\n\n return {\n t: skipOrLimit(skip.top, o.top, 0, maxH),\n r: skipOrLimit(skip.right, o.right, 0, maxW),\n b: skipOrLimit(skip.bottom, o.bottom, 0, maxH),\n l: skipOrLimit(skip.left, o.left, 0, maxW)\n };\n}\n\nfunction parseBorderRadius(bar, maxW, maxH) {\n const {enableBorderRadius} = bar.getProps(['enableBorderRadius']);\n const value = bar.options.borderRadius;\n const o = toTRBLCorners(value);\n const maxR = Math.min(maxW, maxH);\n const skip = bar.borderSkipped;\n\n // If the value is an object, assume the user knows what they are doing\n // and apply as directed.\n const enableBorder = enableBorderRadius || isObject(value);\n\n return {\n topLeft: skipOrLimit(!enableBorder || skip.top || skip.left, o.topLeft, 0, maxR),\n topRight: skipOrLimit(!enableBorder || skip.top || skip.right, o.topRight, 0, maxR),\n bottomLeft: skipOrLimit(!enableBorder || skip.bottom || skip.left, o.bottomLeft, 0, maxR),\n bottomRight: skipOrLimit(!enableBorder || skip.bottom || skip.right, o.bottomRight, 0, maxR)\n };\n}\n\nfunction boundingRects(bar) {\n const bounds = getBarBounds(bar);\n const width = bounds.right - bounds.left;\n const height = bounds.bottom - bounds.top;\n const border = parseBorderWidth(bar, width / 2, height / 2);\n const radius = parseBorderRadius(bar, width / 2, height / 2);\n\n return {\n outer: {\n x: bounds.left,\n y: bounds.top,\n w: width,\n h: height,\n radius\n },\n inner: {\n x: bounds.left + border.l,\n y: bounds.top + border.t,\n w: width - border.l - border.r,\n h: height - border.t - border.b,\n radius: {\n topLeft: Math.max(0, radius.topLeft - Math.max(border.t, border.l)),\n topRight: Math.max(0, radius.topRight - Math.max(border.t, border.r)),\n bottomLeft: Math.max(0, radius.bottomLeft - Math.max(border.b, border.l)),\n bottomRight: Math.max(0, radius.bottomRight - Math.max(border.b, border.r)),\n }\n }\n };\n}\n\nfunction inRange(bar, x, y, useFinalPosition) {\n const skipX = x === null;\n const skipY = y === null;\n const skipBoth = skipX && skipY;\n const bounds = bar && !skipBoth && getBarBounds(bar, useFinalPosition);\n\n return bounds\n\t\t&& (skipX || _isBetween(x, bounds.left, bounds.right))\n\t\t&& (skipY || _isBetween(y, bounds.top, bounds.bottom));\n}\n\nfunction hasRadius(radius) {\n return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight;\n}\n\n/**\n * Add a path of a rectangle to the current sub-path\n * @param {CanvasRenderingContext2D} ctx Context\n * @param {*} rect Bounding rect\n */\nfunction addNormalRectPath(ctx, rect) {\n ctx.rect(rect.x, rect.y, rect.w, rect.h);\n}\n\nfunction inflateRect(rect, amount, refRect = {}) {\n const x = rect.x !== refRect.x ? -amount : 0;\n const y = rect.y !== refRect.y ? -amount : 0;\n const w = (rect.x + rect.w !== refRect.x + refRect.w ? amount : 0) - x;\n const h = (rect.y + rect.h !== refRect.y + refRect.h ? amount : 0) - y;\n return {\n x: rect.x + x,\n y: rect.y + y,\n w: rect.w + w,\n h: rect.h + h,\n radius: rect.radius\n };\n}\n\nexport default class BarElement extends Element {\n\n static id = 'bar';\n\n /**\n * @type {any}\n */\n static defaults = {\n borderSkipped: 'start',\n borderWidth: 0,\n borderRadius: 0,\n inflateAmount: 'auto',\n pointStyle: undefined\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.horizontal = undefined;\n this.base = undefined;\n this.width = undefined;\n this.height = undefined;\n this.inflateAmount = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n draw(ctx) {\n const {inflateAmount, options: {borderColor, backgroundColor}} = this;\n const {inner, outer} = boundingRects(this);\n const addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath;\n\n ctx.save();\n\n if (outer.w !== inner.w || outer.h !== inner.h) {\n ctx.beginPath();\n addRectPath(ctx, inflateRect(outer, inflateAmount, inner));\n ctx.clip();\n addRectPath(ctx, inflateRect(inner, -inflateAmount, outer));\n ctx.fillStyle = borderColor;\n ctx.fill('evenodd');\n }\n\n ctx.beginPath();\n addRectPath(ctx, inflateRect(inner, inflateAmount));\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n\n ctx.restore();\n }\n\n inRange(mouseX, mouseY, useFinalPosition) {\n return inRange(this, mouseX, mouseY, useFinalPosition);\n }\n\n inXRange(mouseX, useFinalPosition) {\n return inRange(this, mouseX, null, useFinalPosition);\n }\n\n inYRange(mouseY, useFinalPosition) {\n return inRange(this, null, mouseY, useFinalPosition);\n }\n\n getCenterPoint(useFinalPosition) {\n const {x, y, base, horizontal} = /** @type {BarProps} */ (this.getProps(['x', 'y', 'base', 'horizontal'], useFinalPosition));\n return {\n x: horizontal ? (x + base) / 2 : x,\n y: horizontal ? y : (y + base) / 2\n };\n }\n\n getRange(axis) {\n return axis === 'x' ? this.width / 2 : this.height / 2;\n }\n}\n","import defaults from '../core/core.defaults.js';\nimport Element from '../core/core.element.js';\nimport layouts from '../core/core.layouts.js';\nimport {addRoundedRectPath, drawPointLegend, renderText} from '../helpers/helpers.canvas.js';\nimport {\n _isBetween,\n callback as call,\n clipArea,\n getRtlAdapter,\n overrideTextDirection,\n restoreTextDirection,\n toFont,\n toPadding,\n unclipArea,\n valueOrDefault,\n} from '../helpers/index.js';\nimport {_alignStartEnd, _textX, _toLeftRightCenter} from '../helpers/helpers.extras.js';\nimport {toTRBLCorners} from '../helpers/helpers.options.js';\n\n/**\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n */\n\nconst getBoxSize = (labelOpts, fontSize) => {\n let {boxHeight = fontSize, boxWidth = fontSize} = labelOpts;\n\n if (labelOpts.usePointStyle) {\n boxHeight = Math.min(boxHeight, fontSize);\n boxWidth = labelOpts.pointStyleWidth || Math.min(boxWidth, fontSize);\n }\n\n return {\n boxWidth,\n boxHeight,\n itemHeight: Math.max(fontSize, boxHeight)\n };\n};\n\nconst itemsEqual = (a, b) => a !== null && b !== null && a.datasetIndex === b.datasetIndex && a.index === b.index;\n\nexport class Legend extends Element {\n\n /**\n\t * @param {{ ctx: any; options: any; chart: any; }} config\n\t */\n constructor(config) {\n super();\n\n this._added = false;\n\n // Contains hit boxes for each dataset (in dataset order)\n this.legendHitBoxes = [];\n\n /**\n \t\t * @private\n \t\t */\n this._hoveredItem = null;\n\n // Are we in doughnut mode which has a different data type\n this.doughnutMode = false;\n\n this.chart = config.chart;\n this.options = config.options;\n this.ctx = config.ctx;\n this.legendItems = undefined;\n this.columnSizes = undefined;\n this.lineWidths = undefined;\n this.maxHeight = undefined;\n this.maxWidth = undefined;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.height = undefined;\n this.width = undefined;\n this._margins = undefined;\n this.position = undefined;\n this.weight = undefined;\n this.fullSize = undefined;\n }\n\n update(maxWidth, maxHeight, margins) {\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins;\n\n this.setDimensions();\n this.buildLabels();\n this.fit();\n }\n\n setDimensions() {\n if (this.isHorizontal()) {\n this.width = this.maxWidth;\n this.left = this._margins.left;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n this.top = this._margins.top;\n this.bottom = this.height;\n }\n }\n\n buildLabels() {\n const labelOpts = this.options.labels || {};\n let legendItems = call(labelOpts.generateLabels, [this.chart], this) || [];\n\n if (labelOpts.filter) {\n legendItems = legendItems.filter((item) => labelOpts.filter(item, this.chart.data));\n }\n\n if (labelOpts.sort) {\n legendItems = legendItems.sort((a, b) => labelOpts.sort(a, b, this.chart.data));\n }\n\n if (this.options.reverse) {\n legendItems.reverse();\n }\n\n this.legendItems = legendItems;\n }\n\n fit() {\n const {options, ctx} = this;\n\n // The legend may not be displayed for a variety of reasons including\n // the fact that the defaults got set to `false`.\n // When the legend is not displayed, there are no guarantees that the options\n // are correctly formatted so we need to bail out as early as possible.\n if (!options.display) {\n this.width = this.height = 0;\n return;\n }\n\n const labelOpts = options.labels;\n const labelFont = toFont(labelOpts.font);\n const fontSize = labelFont.size;\n const titleHeight = this._computeTitleHeight();\n const {boxWidth, itemHeight} = getBoxSize(labelOpts, fontSize);\n\n let width, height;\n\n ctx.font = labelFont.string;\n\n if (this.isHorizontal()) {\n width = this.maxWidth; // fill all the width\n height = this._fitRows(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n } else {\n height = this.maxHeight; // fill all the height\n width = this._fitCols(titleHeight, labelFont, boxWidth, itemHeight) + 10;\n }\n\n this.width = Math.min(width, options.maxWidth || this.maxWidth);\n this.height = Math.min(height, options.maxHeight || this.maxHeight);\n }\n\n /**\n\t * @private\n\t */\n _fitRows(titleHeight, fontSize, boxWidth, itemHeight) {\n const {ctx, maxWidth, options: {labels: {padding}}} = this;\n const hitboxes = this.legendHitBoxes = [];\n // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one\n const lineWidths = this.lineWidths = [0];\n const lineHeight = itemHeight + padding;\n let totalHeight = titleHeight;\n\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n\n let row = -1;\n let top = -lineHeight;\n this.legendItems.forEach((legendItem, i) => {\n const itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n\n if (i === 0 || lineWidths[lineWidths.length - 1] + itemWidth + 2 * padding > maxWidth) {\n totalHeight += lineHeight;\n lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0;\n top += lineHeight;\n row++;\n }\n\n hitboxes[i] = {left: 0, top, row, width: itemWidth, height: itemHeight};\n\n lineWidths[lineWidths.length - 1] += itemWidth + padding;\n });\n\n return totalHeight;\n }\n\n _fitCols(titleHeight, labelFont, boxWidth, _itemHeight) {\n const {ctx, maxHeight, options: {labels: {padding}}} = this;\n const hitboxes = this.legendHitBoxes = [];\n const columnSizes = this.columnSizes = [];\n const heightLimit = maxHeight - titleHeight;\n\n let totalWidth = padding;\n let currentColWidth = 0;\n let currentColHeight = 0;\n\n let left = 0;\n let col = 0;\n\n this.legendItems.forEach((legendItem, i) => {\n const {itemWidth, itemHeight} = calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight);\n\n // If too tall, go to new column\n if (i > 0 && currentColHeight + itemHeight + 2 * padding > heightLimit) {\n totalWidth += currentColWidth + padding;\n columnSizes.push({width: currentColWidth, height: currentColHeight}); // previous column size\n left += currentColWidth + padding;\n col++;\n currentColWidth = currentColHeight = 0;\n }\n\n // Store the hitbox width and height here. Final position will be updated in `draw`\n hitboxes[i] = {left, top: currentColHeight, col, width: itemWidth, height: itemHeight};\n\n // Get max width\n currentColWidth = Math.max(currentColWidth, itemWidth);\n currentColHeight += itemHeight + padding;\n });\n\n totalWidth += currentColWidth;\n columnSizes.push({width: currentColWidth, height: currentColHeight}); // previous column size\n\n return totalWidth;\n }\n\n adjustHitBoxes() {\n if (!this.options.display) {\n return;\n }\n const titleHeight = this._computeTitleHeight();\n const {legendHitBoxes: hitboxes, options: {align, labels: {padding}, rtl}} = this;\n const rtlHelper = getRtlAdapter(rtl, this.left, this.width);\n if (this.isHorizontal()) {\n let row = 0;\n let left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n for (const hitbox of hitboxes) {\n if (row !== hitbox.row) {\n row = hitbox.row;\n left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n }\n hitbox.top += this.top + titleHeight + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(left), hitbox.width);\n left += hitbox.width + padding;\n }\n } else {\n let col = 0;\n let top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n for (const hitbox of hitboxes) {\n if (hitbox.col !== col) {\n col = hitbox.col;\n top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n }\n hitbox.top = top;\n hitbox.left += this.left + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(hitbox.left), hitbox.width);\n top += hitbox.height + padding;\n }\n }\n }\n\n isHorizontal() {\n return this.options.position === 'top' || this.options.position === 'bottom';\n }\n\n draw() {\n if (this.options.display) {\n const ctx = this.ctx;\n clipArea(ctx, this);\n\n this._draw();\n\n unclipArea(ctx);\n }\n }\n\n /**\n\t * @private\n\t */\n _draw() {\n const {options: opts, columnSizes, lineWidths, ctx} = this;\n const {align, labels: labelOpts} = opts;\n const defaultColor = defaults.color;\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const labelFont = toFont(labelOpts.font);\n const {padding} = labelOpts;\n const fontSize = labelFont.size;\n const halfFontSize = fontSize / 2;\n let cursor;\n\n this.drawTitle();\n\n // Canvas setup\n ctx.textAlign = rtlHelper.textAlign('left');\n ctx.textBaseline = 'middle';\n ctx.lineWidth = 0.5;\n ctx.font = labelFont.string;\n\n const {boxWidth, boxHeight, itemHeight} = getBoxSize(labelOpts, fontSize);\n\n // current position\n const drawLegendBox = function(x, y, legendItem) {\n if (isNaN(boxWidth) || boxWidth <= 0 || isNaN(boxHeight) || boxHeight < 0) {\n return;\n }\n\n // Set the ctx for the box\n ctx.save();\n\n const lineWidth = valueOrDefault(legendItem.lineWidth, 1);\n ctx.fillStyle = valueOrDefault(legendItem.fillStyle, defaultColor);\n ctx.lineCap = valueOrDefault(legendItem.lineCap, 'butt');\n ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, 0);\n ctx.lineJoin = valueOrDefault(legendItem.lineJoin, 'miter');\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, defaultColor);\n\n ctx.setLineDash(valueOrDefault(legendItem.lineDash, []));\n\n if (labelOpts.usePointStyle) {\n // Recalculate x and y for drawPoint() because its expecting\n // x and y to be center of figure (instead of top left)\n const drawOptions = {\n radius: boxHeight * Math.SQRT2 / 2,\n pointStyle: legendItem.pointStyle,\n rotation: legendItem.rotation,\n borderWidth: lineWidth\n };\n const centerX = rtlHelper.xPlus(x, boxWidth / 2);\n const centerY = y + halfFontSize;\n\n // Draw pointStyle as legend symbol\n drawPointLegend(ctx, drawOptions, centerX, centerY, labelOpts.pointStyleWidth && boxWidth);\n } else {\n // Draw box as legend symbol\n // Adjust position when boxHeight < fontSize (want it centered)\n const yBoxTop = y + Math.max((fontSize - boxHeight) / 2, 0);\n const xBoxLeft = rtlHelper.leftForLtr(x, boxWidth);\n const borderRadius = toTRBLCorners(legendItem.borderRadius);\n\n ctx.beginPath();\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n addRoundedRectPath(ctx, {\n x: xBoxLeft,\n y: yBoxTop,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius,\n });\n } else {\n ctx.rect(xBoxLeft, yBoxTop, boxWidth, boxHeight);\n }\n\n ctx.fill();\n if (lineWidth !== 0) {\n ctx.stroke();\n }\n }\n\n ctx.restore();\n };\n\n const fillText = function(x, y, legendItem) {\n renderText(ctx, legendItem.text, x, y + (itemHeight / 2), labelFont, {\n strikethrough: legendItem.hidden,\n textAlign: rtlHelper.textAlign(legendItem.textAlign)\n });\n };\n\n // Horizontal\n const isHorizontal = this.isHorizontal();\n const titleHeight = this._computeTitleHeight();\n if (isHorizontal) {\n cursor = {\n x: _alignStartEnd(align, this.left + padding, this.right - lineWidths[0]),\n y: this.top + padding + titleHeight,\n line: 0\n };\n } else {\n cursor = {\n x: this.left + padding,\n y: _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[0].height),\n line: 0\n };\n }\n\n overrideTextDirection(this.ctx, opts.textDirection);\n\n const lineHeight = itemHeight + padding;\n this.legendItems.forEach((legendItem, i) => {\n ctx.strokeStyle = legendItem.fontColor; // for strikethrough effect\n ctx.fillStyle = legendItem.fontColor; // render in correct colour\n\n const textWidth = ctx.measureText(legendItem.text).width;\n const textAlign = rtlHelper.textAlign(legendItem.textAlign || (legendItem.textAlign = labelOpts.textAlign));\n const width = boxWidth + halfFontSize + textWidth;\n let x = cursor.x;\n let y = cursor.y;\n\n rtlHelper.setWidth(this.width);\n\n if (isHorizontal) {\n if (i > 0 && x + width + padding > this.right) {\n y = cursor.y += lineHeight;\n cursor.line++;\n x = cursor.x = _alignStartEnd(align, this.left + padding, this.right - lineWidths[cursor.line]);\n }\n } else if (i > 0 && y + lineHeight > this.bottom) {\n x = cursor.x = x + columnSizes[cursor.line].width + padding;\n cursor.line++;\n y = cursor.y = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[cursor.line].height);\n }\n\n const realX = rtlHelper.x(x);\n\n drawLegendBox(realX, y, legendItem);\n\n x = _textX(textAlign, x + boxWidth + halfFontSize, isHorizontal ? x + width : this.right, opts.rtl);\n\n // Fill the actual label\n fillText(rtlHelper.x(x), y, legendItem);\n\n if (isHorizontal) {\n cursor.x += width + padding;\n } else if (typeof legendItem.text !== 'string') {\n const fontLineHeight = labelFont.lineHeight;\n cursor.y += calculateLegendItemHeight(legendItem, fontLineHeight) + padding;\n } else {\n cursor.y += lineHeight;\n }\n });\n\n restoreTextDirection(this.ctx, opts.textDirection);\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {\n const opts = this.options;\n const titleOpts = opts.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n\n if (!titleOpts.display) {\n return;\n }\n\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const ctx = this.ctx;\n const position = titleOpts.position;\n const halfFontSize = titleFont.size / 2;\n const topPaddingPlusHalfFontSize = titlePadding.top + halfFontSize;\n let y;\n\n // These defaults are used when the legend is vertical.\n // When horizontal, they are computed below.\n let left = this.left;\n let maxWidth = this.width;\n\n if (this.isHorizontal()) {\n // Move left / right so that the title is above the legend lines\n maxWidth = Math.max(...this.lineWidths);\n y = this.top + topPaddingPlusHalfFontSize;\n left = _alignStartEnd(opts.align, left, this.right - maxWidth);\n } else {\n // Move down so that the title is above the legend stack in every alignment\n const maxHeight = this.columnSizes.reduce((acc, size) => Math.max(acc, size.height), 0);\n y = topPaddingPlusHalfFontSize + _alignStartEnd(opts.align, this.top, this.bottom - maxHeight - opts.labels.padding - this._computeTitleHeight());\n }\n\n // Now that we know the left edge of the inner legend box, compute the correct\n // X coordinate from the title alignment\n const x = _alignStartEnd(position, left, left + maxWidth);\n\n // Canvas setup\n ctx.textAlign = rtlHelper.textAlign(_toLeftRightCenter(position));\n ctx.textBaseline = 'middle';\n ctx.strokeStyle = titleOpts.color;\n ctx.fillStyle = titleOpts.color;\n ctx.font = titleFont.string;\n\n renderText(ctx, titleOpts.text, x, y, titleFont);\n }\n\n /**\n\t * @private\n\t */\n _computeTitleHeight() {\n const titleOpts = this.options.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n return titleOpts.display ? titleFont.lineHeight + titlePadding.height : 0;\n }\n\n /**\n\t * @private\n\t */\n _getLegendItemAt(x, y) {\n let i, hitBox, lh;\n\n if (_isBetween(x, this.left, this.right)\n && _isBetween(y, this.top, this.bottom)) {\n // See if we are touching one of the dataset boxes\n lh = this.legendHitBoxes;\n for (i = 0; i < lh.length; ++i) {\n hitBox = lh[i];\n\n if (_isBetween(x, hitBox.left, hitBox.left + hitBox.width)\n && _isBetween(y, hitBox.top, hitBox.top + hitBox.height)) {\n // Touching an element\n return this.legendItems[i];\n }\n }\n }\n\n return null;\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e - The event to handle\n\t */\n handleEvent(e) {\n const opts = this.options;\n if (!isListened(e.type, opts)) {\n return;\n }\n\n // Chart event already has relative position in it\n const hoveredItem = this._getLegendItemAt(e.x, e.y);\n\n if (e.type === 'mousemove' || e.type === 'mouseout') {\n const previous = this._hoveredItem;\n const sameItem = itemsEqual(previous, hoveredItem);\n if (previous && !sameItem) {\n call(opts.onLeave, [e, previous, this], this);\n }\n\n this._hoveredItem = hoveredItem;\n\n if (hoveredItem && !sameItem) {\n call(opts.onHover, [e, hoveredItem, this], this);\n }\n } else if (hoveredItem) {\n call(opts.onClick, [e, hoveredItem, this], this);\n }\n }\n}\n\nfunction calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight) {\n const itemWidth = calculateItemWidth(legendItem, boxWidth, labelFont, ctx);\n const itemHeight = calculateItemHeight(_itemHeight, legendItem, labelFont.lineHeight);\n return {itemWidth, itemHeight};\n}\n\nfunction calculateItemWidth(legendItem, boxWidth, labelFont, ctx) {\n let legendItemText = legendItem.text;\n if (legendItemText && typeof legendItemText !== 'string') {\n legendItemText = legendItemText.reduce((a, b) => a.length > b.length ? a : b);\n }\n return boxWidth + (labelFont.size / 2) + ctx.measureText(legendItemText).width;\n}\n\nfunction calculateItemHeight(_itemHeight, legendItem, fontLineHeight) {\n let itemHeight = _itemHeight;\n if (typeof legendItem.text !== 'string') {\n itemHeight = calculateLegendItemHeight(legendItem, fontLineHeight);\n }\n return itemHeight;\n}\n\nfunction calculateLegendItemHeight(legendItem, fontLineHeight) {\n const labelHeight = legendItem.text ? legendItem.text.length : 0;\n return fontLineHeight * labelHeight;\n}\n\nfunction isListened(type, opts) {\n if ((type === 'mousemove' || type === 'mouseout') && (opts.onHover || opts.onLeave)) {\n return true;\n }\n if (opts.onClick && (type === 'click' || type === 'mouseup')) {\n return true;\n }\n return false;\n}\n\nexport default {\n id: 'legend',\n\n /**\n\t * For tests\n\t * @private\n\t */\n _element: Legend,\n\n start(chart, _args, options) {\n const legend = chart.legend = new Legend({ctx: chart.ctx, options, chart});\n layouts.configure(chart, legend, options);\n layouts.addBox(chart, legend);\n },\n\n stop(chart) {\n layouts.removeBox(chart, chart.legend);\n delete chart.legend;\n },\n\n // During the beforeUpdate step, the layout configuration needs to run\n // This ensures that if the legend position changes (via an option update)\n // the layout system respects the change. See https://github.com/chartjs/Chart.js/issues/7527\n beforeUpdate(chart, _args, options) {\n const legend = chart.legend;\n layouts.configure(chart, legend, options);\n legend.options = options;\n },\n\n // The labels need to be built after datasets are updated to ensure that colors\n // and other styling are correct. See https://github.com/chartjs/Chart.js/issues/6968\n afterUpdate(chart) {\n const legend = chart.legend;\n legend.buildLabels();\n legend.adjustHitBoxes();\n },\n\n\n afterEvent(chart, args) {\n if (!args.replay) {\n chart.legend.handleEvent(args.event);\n }\n },\n\n defaults: {\n display: true,\n position: 'top',\n align: 'center',\n fullSize: true,\n reverse: false,\n weight: 1000,\n\n // a callback that will handle\n onClick(e, legendItem, legend) {\n const index = legendItem.datasetIndex;\n const ci = legend.chart;\n if (ci.isDatasetVisible(index)) {\n ci.hide(index);\n legendItem.hidden = true;\n } else {\n ci.show(index);\n legendItem.hidden = false;\n }\n },\n\n onHover: null,\n onLeave: null,\n\n labels: {\n color: (ctx) => ctx.chart.options.color,\n boxWidth: 40,\n padding: 10,\n // Generates labels shown in the legend\n // Valid properties to return:\n // text : text to display\n // fillStyle : fill of coloured box\n // strokeStyle: stroke of coloured box\n // hidden : if this legend item refers to a hidden item\n // lineCap : cap style for line\n // lineDash\n // lineDashOffset :\n // lineJoin :\n // lineWidth :\n generateLabels(chart) {\n const datasets = chart.data.datasets;\n const {labels: {usePointStyle, pointStyle, textAlign, color, useBorderRadius, borderRadius}} = chart.legend.options;\n\n return chart._getSortedDatasetMetas().map((meta) => {\n const style = meta.controller.getStyle(usePointStyle ? 0 : undefined);\n const borderWidth = toPadding(style.borderWidth);\n\n return {\n text: datasets[meta.index].label,\n fillStyle: style.backgroundColor,\n fontColor: color,\n hidden: !meta.visible,\n lineCap: style.borderCapStyle,\n lineDash: style.borderDash,\n lineDashOffset: style.borderDashOffset,\n lineJoin: style.borderJoinStyle,\n lineWidth: (borderWidth.width + borderWidth.height) / 4,\n strokeStyle: style.borderColor,\n pointStyle: pointStyle || style.pointStyle,\n rotation: style.rotation,\n textAlign: textAlign || style.textAlign,\n borderRadius: useBorderRadius && (borderRadius || style.borderRadius),\n\n // Below is extra data used for toggling the datasets\n datasetIndex: meta.index\n };\n }, this);\n }\n },\n\n title: {\n color: (ctx) => ctx.chart.options.color,\n display: false,\n position: 'center',\n text: '',\n }\n },\n\n descriptors: {\n _scriptable: (name) => !name.startsWith('on'),\n labels: {\n _scriptable: (name) => !['generateLabels', 'filter', 'sort'].includes(name),\n }\n },\n};\n","import {Title} from './plugin.title.js';\nimport layouts from '../core/core.layouts.js';\n\nconst map = new WeakMap();\n\nexport default {\n id: 'subtitle',\n\n start(chart, _args, options) {\n const title = new Title({\n ctx: chart.ctx,\n options,\n chart\n });\n\n layouts.configure(chart, title, options);\n layouts.addBox(chart, title);\n map.set(chart, title);\n },\n\n stop(chart) {\n layouts.removeBox(chart, map.get(chart));\n map.delete(chart);\n },\n\n beforeUpdate(chart, _args, options) {\n const title = map.get(chart);\n layouts.configure(chart, title, options);\n title.options = options;\n },\n\n defaults: {\n align: 'center',\n display: false,\n font: {\n weight: 'normal',\n },\n fullSize: true,\n padding: 0,\n position: 'top',\n text: '',\n weight: 1500 // by default greater than legend (1000) and smaller than title (2000)\n },\n\n defaultRoutes: {\n color: 'color'\n },\n\n descriptors: {\n _scriptable: true,\n _indexable: false,\n },\n};\n","import Animations from '../core/core.animations.js';\nimport Element from '../core/core.element.js';\nimport {addRoundedRectPath} from '../helpers/helpers.canvas.js';\nimport {each, noop, isNullOrUndef, isArray, _elementsEqual, isObject} from '../helpers/helpers.core.js';\nimport {toFont, toPadding, toTRBLCorners} from '../helpers/helpers.options.js';\nimport {getRtlAdapter, overrideTextDirection, restoreTextDirection} from '../helpers/helpers.rtl.js';\nimport {distanceBetweenPoints, _limitValue} from '../helpers/helpers.math.js';\nimport {createContext, drawPoint} from '../helpers/index.js';\n\n/**\n * @typedef { import('../platform/platform.base.js').Chart } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../types/index.js').ActiveElement } ActiveElement\n * @typedef { import('../core/core.interaction.js').InteractionItem } InteractionItem\n */\n\nconst positioners = {\n /**\n\t * Average mode places the tooltip at the average position of the elements shown\n\t */\n average(items) {\n if (!items.length) {\n return false;\n }\n\n let i, len;\n let xSet = new Set();\n let y = 0;\n let count = 0;\n\n for (i = 0, len = items.length; i < len; ++i) {\n const el = items[i].element;\n if (el && el.hasValue()) {\n const pos = el.tooltipPosition();\n xSet.add(pos.x);\n y += pos.y;\n ++count;\n }\n }\n\n // No visible items where found, return false so we don't have to divide by 0 which reduces in NaN\n if (count === 0 || xSet.size === 0) {\n return false;\n }\n\n const xAverage = [...xSet].reduce((a, b) => a + b) / xSet.size;\n\n return {\n x: xAverage,\n y: y / count\n };\n },\n\n /**\n\t * Gets the tooltip position nearest of the item nearest to the event position\n\t */\n nearest(items, eventPosition) {\n if (!items.length) {\n return false;\n }\n\n let x = eventPosition.x;\n let y = eventPosition.y;\n let minDistance = Number.POSITIVE_INFINITY;\n let i, len, nearestElement;\n\n for (i = 0, len = items.length; i < len; ++i) {\n const el = items[i].element;\n if (el && el.hasValue()) {\n const center = el.getCenterPoint();\n const d = distanceBetweenPoints(eventPosition, center);\n\n if (d < minDistance) {\n minDistance = d;\n nearestElement = el;\n }\n }\n }\n\n if (nearestElement) {\n const tp = nearestElement.tooltipPosition();\n x = tp.x;\n y = tp.y;\n }\n\n return {\n x,\n y\n };\n }\n};\n\n// Helper to push or concat based on if the 2nd parameter is an array or not\nfunction pushOrConcat(base, toPush) {\n if (toPush) {\n if (isArray(toPush)) {\n // base = base.concat(toPush);\n Array.prototype.push.apply(base, toPush);\n } else {\n base.push(toPush);\n }\n }\n\n return base;\n}\n\n/**\n * Returns array of strings split by newline\n * @param {*} str - The value to split by newline.\n * @returns {string|string[]} value if newline present - Returned from String split() method\n * @function\n */\nfunction splitNewlines(str) {\n if ((typeof str === 'string' || str instanceof String) && str.indexOf('\\n') > -1) {\n return str.split('\\n');\n }\n return str;\n}\n\n\n/**\n * Private helper to create a tooltip item model\n * @param {Chart} chart\n * @param {ActiveElement} item - {element, index, datasetIndex} to create the tooltip item for\n * @return new tooltip item\n */\nfunction createTooltipItem(chart, item) {\n const {element, datasetIndex, index} = item;\n const controller = chart.getDatasetMeta(datasetIndex).controller;\n const {label, value} = controller.getLabelAndValue(index);\n\n return {\n chart,\n label,\n parsed: controller.getParsed(index),\n raw: chart.data.datasets[datasetIndex].data[index],\n formattedValue: value,\n dataset: controller.getDataset(),\n dataIndex: index,\n datasetIndex,\n element\n };\n}\n\n/**\n * Get the size of the tooltip\n */\nfunction getTooltipSize(tooltip, options) {\n const ctx = tooltip.chart.ctx;\n const {body, footer, title} = tooltip;\n const {boxWidth, boxHeight} = options;\n const bodyFont = toFont(options.bodyFont);\n const titleFont = toFont(options.titleFont);\n const footerFont = toFont(options.footerFont);\n const titleLineCount = title.length;\n const footerLineCount = footer.length;\n const bodyLineItemCount = body.length;\n\n const padding = toPadding(options.padding);\n let height = padding.height;\n let width = 0;\n\n // Count of all lines in the body\n let combinedBodyLength = body.reduce((count, bodyItem) => count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length, 0);\n combinedBodyLength += tooltip.beforeBody.length + tooltip.afterBody.length;\n\n if (titleLineCount) {\n height += titleLineCount * titleFont.lineHeight\n\t\t\t+ (titleLineCount - 1) * options.titleSpacing\n\t\t\t+ options.titleMarginBottom;\n }\n if (combinedBodyLength) {\n // Body lines may include some extra height depending on boxHeight\n const bodyLineHeight = options.displayColors ? Math.max(boxHeight, bodyFont.lineHeight) : bodyFont.lineHeight;\n height += bodyLineItemCount * bodyLineHeight\n\t\t\t+ (combinedBodyLength - bodyLineItemCount) * bodyFont.lineHeight\n\t\t\t+ (combinedBodyLength - 1) * options.bodySpacing;\n }\n if (footerLineCount) {\n height += options.footerMarginTop\n\t\t\t+ footerLineCount * footerFont.lineHeight\n\t\t\t+ (footerLineCount - 1) * options.footerSpacing;\n }\n\n // Title width\n let widthPadding = 0;\n const maxLineWidth = function(line) {\n width = Math.max(width, ctx.measureText(line).width + widthPadding);\n };\n\n ctx.save();\n\n ctx.font = titleFont.string;\n each(tooltip.title, maxLineWidth);\n\n // Body width\n ctx.font = bodyFont.string;\n each(tooltip.beforeBody.concat(tooltip.afterBody), maxLineWidth);\n\n // Body lines may include some extra width due to the color box\n widthPadding = options.displayColors ? (boxWidth + 2 + options.boxPadding) : 0;\n each(body, (bodyItem) => {\n each(bodyItem.before, maxLineWidth);\n each(bodyItem.lines, maxLineWidth);\n each(bodyItem.after, maxLineWidth);\n });\n\n // Reset back to 0\n widthPadding = 0;\n\n // Footer width\n ctx.font = footerFont.string;\n each(tooltip.footer, maxLineWidth);\n\n ctx.restore();\n\n // Add padding\n width += padding.width;\n\n return {width, height};\n}\n\nfunction determineYAlign(chart, size) {\n const {y, height} = size;\n\n if (y < height / 2) {\n return 'top';\n } else if (y > (chart.height - height / 2)) {\n return 'bottom';\n }\n return 'center';\n}\n\nfunction doesNotFitWithAlign(xAlign, chart, options, size) {\n const {x, width} = size;\n const caret = options.caretSize + options.caretPadding;\n if (xAlign === 'left' && x + width + caret > chart.width) {\n return true;\n }\n\n if (xAlign === 'right' && x - width - caret < 0) {\n return true;\n }\n}\n\nfunction determineXAlign(chart, options, size, yAlign) {\n const {x, width} = size;\n const {width: chartWidth, chartArea: {left, right}} = chart;\n let xAlign = 'center';\n\n if (yAlign === 'center') {\n xAlign = x <= (left + right) / 2 ? 'left' : 'right';\n } else if (x <= width / 2) {\n xAlign = 'left';\n } else if (x >= chartWidth - width / 2) {\n xAlign = 'right';\n }\n\n if (doesNotFitWithAlign(xAlign, chart, options, size)) {\n xAlign = 'center';\n }\n\n return xAlign;\n}\n\n/**\n * Helper to get the alignment of a tooltip given the size\n */\nfunction determineAlignment(chart, options, size) {\n const yAlign = size.yAlign || options.yAlign || determineYAlign(chart, size);\n\n return {\n xAlign: size.xAlign || options.xAlign || determineXAlign(chart, options, size, yAlign),\n yAlign\n };\n}\n\nfunction alignX(size, xAlign) {\n let {x, width} = size;\n if (xAlign === 'right') {\n x -= width;\n } else if (xAlign === 'center') {\n x -= (width / 2);\n }\n return x;\n}\n\nfunction alignY(size, yAlign, paddingAndSize) {\n // eslint-disable-next-line prefer-const\n let {y, height} = size;\n if (yAlign === 'top') {\n y += paddingAndSize;\n } else if (yAlign === 'bottom') {\n y -= height + paddingAndSize;\n } else {\n y -= (height / 2);\n }\n return y;\n}\n\n/**\n * Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment\n */\nfunction getBackgroundPoint(options, size, alignment, chart) {\n const {caretSize, caretPadding, cornerRadius} = options;\n const {xAlign, yAlign} = alignment;\n const paddingAndSize = caretSize + caretPadding;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\n\n let x = alignX(size, xAlign);\n const y = alignY(size, yAlign, paddingAndSize);\n\n if (yAlign === 'center') {\n if (xAlign === 'left') {\n x += paddingAndSize;\n } else if (xAlign === 'right') {\n x -= paddingAndSize;\n }\n } else if (xAlign === 'left') {\n x -= Math.max(topLeft, bottomLeft) + caretSize;\n } else if (xAlign === 'right') {\n x += Math.max(topRight, bottomRight) + caretSize;\n }\n\n return {\n x: _limitValue(x, 0, chart.width - size.width),\n y: _limitValue(y, 0, chart.height - size.height)\n };\n}\n\nfunction getAlignedX(tooltip, align, options) {\n const padding = toPadding(options.padding);\n\n return align === 'center'\n ? tooltip.x + tooltip.width / 2\n : align === 'right'\n ? tooltip.x + tooltip.width - padding.right\n : tooltip.x + padding.left;\n}\n\n/**\n * Helper to build before and after body lines\n */\nfunction getBeforeAfterBodyLines(callback) {\n return pushOrConcat([], splitNewlines(callback));\n}\n\nfunction createTooltipContext(parent, tooltip, tooltipItems) {\n return createContext(parent, {\n tooltip,\n tooltipItems,\n type: 'tooltip'\n });\n}\n\nfunction overrideCallbacks(callbacks, context) {\n const override = context && context.dataset && context.dataset.tooltip && context.dataset.tooltip.callbacks;\n return override ? callbacks.override(override) : callbacks;\n}\n\nconst defaultCallbacks = {\n // Args are: (tooltipItems, data)\n beforeTitle: noop,\n title(tooltipItems) {\n if (tooltipItems.length > 0) {\n const item = tooltipItems[0];\n const labels = item.chart.data.labels;\n const labelCount = labels ? labels.length : 0;\n\n if (this && this.options && this.options.mode === 'dataset') {\n return item.dataset.label || '';\n } else if (item.label) {\n return item.label;\n } else if (labelCount > 0 && item.dataIndex < labelCount) {\n return labels[item.dataIndex];\n }\n }\n\n return '';\n },\n afterTitle: noop,\n\n // Args are: (tooltipItems, data)\n beforeBody: noop,\n\n // Args are: (tooltipItem, data)\n beforeLabel: noop,\n label(tooltipItem) {\n if (this && this.options && this.options.mode === 'dataset') {\n return tooltipItem.label + ': ' + tooltipItem.formattedValue || tooltipItem.formattedValue;\n }\n\n let label = tooltipItem.dataset.label || '';\n\n if (label) {\n label += ': ';\n }\n const value = tooltipItem.formattedValue;\n if (!isNullOrUndef(value)) {\n label += value;\n }\n return label;\n },\n labelColor(tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n borderColor: options.borderColor,\n backgroundColor: options.backgroundColor,\n borderWidth: options.borderWidth,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderRadius: 0,\n };\n },\n labelTextColor() {\n return this.options.bodyColor;\n },\n labelPointStyle(tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n pointStyle: options.pointStyle,\n rotation: options.rotation,\n };\n },\n afterLabel: noop,\n\n // Args are: (tooltipItems, data)\n afterBody: noop,\n\n // Args are: (tooltipItems, data)\n beforeFooter: noop,\n footer: noop,\n afterFooter: noop\n};\n\n/**\n * Invoke callback from object with context and arguments.\n * If callback returns `undefined`, then will be invoked default callback.\n * @param {Record} callbacks\n * @param {keyof typeof defaultCallbacks} name\n * @param {*} ctx\n * @param {*} arg\n * @returns {any}\n */\nfunction invokeCallbackWithFallback(callbacks, name, ctx, arg) {\n const result = callbacks[name].call(ctx, arg);\n\n if (typeof result === 'undefined') {\n return defaultCallbacks[name].call(ctx, arg);\n }\n\n return result;\n}\n\nexport class Tooltip extends Element {\n\n /**\n * @namespace Chart.Tooltip.positioners\n */\n static positioners = positioners;\n\n constructor(config) {\n super();\n\n this.opacity = 0;\n this._active = [];\n this._eventPosition = undefined;\n this._size = undefined;\n this._cachedAnimations = undefined;\n this._tooltipItems = [];\n this.$animations = undefined;\n this.$context = undefined;\n this.chart = config.chart;\n this.options = config.options;\n this.dataPoints = undefined;\n this.title = undefined;\n this.beforeBody = undefined;\n this.body = undefined;\n this.afterBody = undefined;\n this.footer = undefined;\n this.xAlign = undefined;\n this.yAlign = undefined;\n this.x = undefined;\n this.y = undefined;\n this.height = undefined;\n this.width = undefined;\n this.caretX = undefined;\n this.caretY = undefined;\n // TODO: V4, make this private, rename to `_labelStyles`, and combine with `labelPointStyles`\n // and `labelTextColors` to create a single variable\n this.labelColors = undefined;\n this.labelPointStyles = undefined;\n this.labelTextColors = undefined;\n }\n\n initialize(options) {\n this.options = options;\n this._cachedAnimations = undefined;\n this.$context = undefined;\n }\n\n /**\n\t * @private\n\t */\n _resolveAnimations() {\n const cached = this._cachedAnimations;\n\n if (cached) {\n return cached;\n }\n\n const chart = this.chart;\n const options = this.options.setContext(this.getContext());\n const opts = options.enabled && chart.options.animation && options.animations;\n const animations = new Animations(this.chart, opts);\n if (opts._cacheable) {\n this._cachedAnimations = Object.freeze(animations);\n }\n\n return animations;\n }\n\n /**\n\t * @protected\n\t */\n getContext() {\n return this.$context ||\n\t\t\t(this.$context = createTooltipContext(this.chart.getContext(), this, this._tooltipItems));\n }\n\n getTitle(context, options) {\n const {callbacks} = options;\n\n const beforeTitle = invokeCallbackWithFallback(callbacks, 'beforeTitle', this, context);\n const title = invokeCallbackWithFallback(callbacks, 'title', this, context);\n const afterTitle = invokeCallbackWithFallback(callbacks, 'afterTitle', this, context);\n\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeTitle));\n lines = pushOrConcat(lines, splitNewlines(title));\n lines = pushOrConcat(lines, splitNewlines(afterTitle));\n\n return lines;\n }\n\n getBeforeBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(\n invokeCallbackWithFallback(options.callbacks, 'beforeBody', this, tooltipItems)\n );\n }\n\n getBody(tooltipItems, options) {\n const {callbacks} = options;\n const bodyItems = [];\n\n each(tooltipItems, (context) => {\n const bodyItem = {\n before: [],\n lines: [],\n after: []\n };\n const scoped = overrideCallbacks(callbacks, context);\n pushOrConcat(bodyItem.before, splitNewlines(invokeCallbackWithFallback(scoped, 'beforeLabel', this, context)));\n pushOrConcat(bodyItem.lines, invokeCallbackWithFallback(scoped, 'label', this, context));\n pushOrConcat(bodyItem.after, splitNewlines(invokeCallbackWithFallback(scoped, 'afterLabel', this, context)));\n\n bodyItems.push(bodyItem);\n });\n\n return bodyItems;\n }\n\n getAfterBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(\n invokeCallbackWithFallback(options.callbacks, 'afterBody', this, tooltipItems)\n );\n }\n\n // Get the footer and beforeFooter and afterFooter lines\n getFooter(tooltipItems, options) {\n const {callbacks} = options;\n\n const beforeFooter = invokeCallbackWithFallback(callbacks, 'beforeFooter', this, tooltipItems);\n const footer = invokeCallbackWithFallback(callbacks, 'footer', this, tooltipItems);\n const afterFooter = invokeCallbackWithFallback(callbacks, 'afterFooter', this, tooltipItems);\n\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeFooter));\n lines = pushOrConcat(lines, splitNewlines(footer));\n lines = pushOrConcat(lines, splitNewlines(afterFooter));\n\n return lines;\n }\n\n /**\n\t * @private\n\t */\n _createItems(options) {\n const active = this._active;\n const data = this.chart.data;\n const labelColors = [];\n const labelPointStyles = [];\n const labelTextColors = [];\n let tooltipItems = [];\n let i, len;\n\n for (i = 0, len = active.length; i < len; ++i) {\n tooltipItems.push(createTooltipItem(this.chart, active[i]));\n }\n\n // If the user provided a filter function, use it to modify the tooltip items\n if (options.filter) {\n tooltipItems = tooltipItems.filter((element, index, array) => options.filter(element, index, array, data));\n }\n\n // If the user provided a sorting function, use it to modify the tooltip items\n if (options.itemSort) {\n tooltipItems = tooltipItems.sort((a, b) => options.itemSort(a, b, data));\n }\n\n // Determine colors for boxes\n each(tooltipItems, (context) => {\n const scoped = overrideCallbacks(options.callbacks, context);\n labelColors.push(invokeCallbackWithFallback(scoped, 'labelColor', this, context));\n labelPointStyles.push(invokeCallbackWithFallback(scoped, 'labelPointStyle', this, context));\n labelTextColors.push(invokeCallbackWithFallback(scoped, 'labelTextColor', this, context));\n });\n\n this.labelColors = labelColors;\n this.labelPointStyles = labelPointStyles;\n this.labelTextColors = labelTextColors;\n this.dataPoints = tooltipItems;\n return tooltipItems;\n }\n\n update(changed, replay) {\n const options = this.options.setContext(this.getContext());\n const active = this._active;\n let properties;\n let tooltipItems = [];\n\n if (!active.length) {\n if (this.opacity !== 0) {\n properties = {\n opacity: 0\n };\n }\n } else {\n const position = positioners[options.position].call(this, active, this._eventPosition);\n tooltipItems = this._createItems(options);\n\n this.title = this.getTitle(tooltipItems, options);\n this.beforeBody = this.getBeforeBody(tooltipItems, options);\n this.body = this.getBody(tooltipItems, options);\n this.afterBody = this.getAfterBody(tooltipItems, options);\n this.footer = this.getFooter(tooltipItems, options);\n\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, size);\n const alignment = determineAlignment(this.chart, options, positionAndSize);\n const backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, this.chart);\n\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n\n properties = {\n opacity: 1,\n x: backgroundPoint.x,\n y: backgroundPoint.y,\n width: size.width,\n height: size.height,\n caretX: position.x,\n caretY: position.y\n };\n }\n\n this._tooltipItems = tooltipItems;\n this.$context = undefined;\n\n if (properties) {\n this._resolveAnimations().update(this, properties);\n }\n\n if (changed && options.external) {\n options.external.call(this, {chart: this.chart, tooltip: this, replay});\n }\n }\n\n drawCaret(tooltipPoint, ctx, size, options) {\n const caretPosition = this.getCaretPosition(tooltipPoint, size, options);\n\n ctx.lineTo(caretPosition.x1, caretPosition.y1);\n ctx.lineTo(caretPosition.x2, caretPosition.y2);\n ctx.lineTo(caretPosition.x3, caretPosition.y3);\n }\n\n getCaretPosition(tooltipPoint, size, options) {\n const {xAlign, yAlign} = this;\n const {caretSize, cornerRadius} = options;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\n const {x: ptX, y: ptY} = tooltipPoint;\n const {width, height} = size;\n let x1, x2, x3, y1, y2, y3;\n\n if (yAlign === 'center') {\n y2 = ptY + (height / 2);\n\n if (xAlign === 'left') {\n x1 = ptX;\n x2 = x1 - caretSize;\n\n // Left draws bottom -> top, this y1 is on the bottom\n y1 = y2 + caretSize;\n y3 = y2 - caretSize;\n } else {\n x1 = ptX + width;\n x2 = x1 + caretSize;\n\n // Right draws top -> bottom, thus y1 is on the top\n y1 = y2 - caretSize;\n y3 = y2 + caretSize;\n }\n\n x3 = x1;\n } else {\n if (xAlign === 'left') {\n x2 = ptX + Math.max(topLeft, bottomLeft) + (caretSize);\n } else if (xAlign === 'right') {\n x2 = ptX + width - Math.max(topRight, bottomRight) - caretSize;\n } else {\n x2 = this.caretX;\n }\n\n if (yAlign === 'top') {\n y1 = ptY;\n y2 = y1 - caretSize;\n\n // Top draws left -> right, thus x1 is on the left\n x1 = x2 - caretSize;\n x3 = x2 + caretSize;\n } else {\n y1 = ptY + height;\n y2 = y1 + caretSize;\n\n // Bottom draws right -> left, thus x1 is on the right\n x1 = x2 + caretSize;\n x3 = x2 - caretSize;\n }\n y3 = y1;\n }\n return {x1, x2, x3, y1, y2, y3};\n }\n\n drawTitle(pt, ctx, options) {\n const title = this.title;\n const length = title.length;\n let titleFont, titleSpacing, i;\n\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n pt.x = getAlignedX(this, options.titleAlign, options);\n\n ctx.textAlign = rtlHelper.textAlign(options.titleAlign);\n ctx.textBaseline = 'middle';\n\n titleFont = toFont(options.titleFont);\n titleSpacing = options.titleSpacing;\n\n ctx.fillStyle = options.titleColor;\n ctx.font = titleFont.string;\n\n for (i = 0; i < length; ++i) {\n ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFont.lineHeight / 2);\n pt.y += titleFont.lineHeight + titleSpacing; // Line Height and spacing\n\n if (i + 1 === length) {\n pt.y += options.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing\n }\n }\n }\n }\n\n /**\n\t * @private\n\t */\n _drawColorBox(ctx, pt, i, rtlHelper, options) {\n const labelColor = this.labelColors[i];\n const labelPointStyle = this.labelPointStyles[i];\n const {boxHeight, boxWidth} = options;\n const bodyFont = toFont(options.bodyFont);\n const colorX = getAlignedX(this, 'left', options);\n const rtlColorX = rtlHelper.x(colorX);\n const yOffSet = boxHeight < bodyFont.lineHeight ? (bodyFont.lineHeight - boxHeight) / 2 : 0;\n const colorY = pt.y + yOffSet;\n\n if (options.usePointStyle) {\n const drawOptions = {\n radius: Math.min(boxWidth, boxHeight) / 2, // fit the circle in the box\n pointStyle: labelPointStyle.pointStyle,\n rotation: labelPointStyle.rotation,\n borderWidth: 1\n };\n // Recalculate x and y for drawPoint() because its expecting\n // x and y to be center of figure (instead of top left)\n const centerX = rtlHelper.leftForLtr(rtlColorX, boxWidth) + boxWidth / 2;\n const centerY = colorY + boxHeight / 2;\n\n // Fill the point with white so that colours merge nicely if the opacity is < 1\n ctx.strokeStyle = options.multiKeyBackground;\n ctx.fillStyle = options.multiKeyBackground;\n drawPoint(ctx, drawOptions, centerX, centerY);\n\n // Draw the point\n ctx.strokeStyle = labelColor.borderColor;\n ctx.fillStyle = labelColor.backgroundColor;\n drawPoint(ctx, drawOptions, centerX, centerY);\n } else {\n // Border\n ctx.lineWidth = isObject(labelColor.borderWidth) ? Math.max(...Object.values(labelColor.borderWidth)) : (labelColor.borderWidth || 1); // TODO, v4 remove fallback\n ctx.strokeStyle = labelColor.borderColor;\n ctx.setLineDash(labelColor.borderDash || []);\n ctx.lineDashOffset = labelColor.borderDashOffset || 0;\n\n // Fill a white rect so that colours merge nicely if the opacity is < 1\n const outerX = rtlHelper.leftForLtr(rtlColorX, boxWidth);\n const innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - 2);\n const borderRadius = toTRBLCorners(labelColor.borderRadius);\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n ctx.beginPath();\n ctx.fillStyle = options.multiKeyBackground;\n addRoundedRectPath(ctx, {\n x: outerX,\n y: colorY,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius,\n });\n ctx.fill();\n ctx.stroke();\n\n // Inner square\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: innerX,\n y: colorY + 1,\n w: boxWidth - 2,\n h: boxHeight - 2,\n radius: borderRadius,\n });\n ctx.fill();\n } else {\n // Normal rect\n ctx.fillStyle = options.multiKeyBackground;\n ctx.fillRect(outerX, colorY, boxWidth, boxHeight);\n ctx.strokeRect(outerX, colorY, boxWidth, boxHeight);\n // Inner square\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.fillRect(innerX, colorY + 1, boxWidth - 2, boxHeight - 2);\n }\n }\n\n // restore fillStyle\n ctx.fillStyle = this.labelTextColors[i];\n }\n\n drawBody(pt, ctx, options) {\n const {body} = this;\n const {bodySpacing, bodyAlign, displayColors, boxHeight, boxWidth, boxPadding} = options;\n const bodyFont = toFont(options.bodyFont);\n let bodyLineHeight = bodyFont.lineHeight;\n let xLinePadding = 0;\n\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n const fillLineOfText = function(line) {\n ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyLineHeight / 2);\n pt.y += bodyLineHeight + bodySpacing;\n };\n\n const bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);\n let bodyItem, textColor, lines, i, j, ilen, jlen;\n\n ctx.textAlign = bodyAlign;\n ctx.textBaseline = 'middle';\n ctx.font = bodyFont.string;\n\n pt.x = getAlignedX(this, bodyAlignForCalculation, options);\n\n // Before body lines\n ctx.fillStyle = options.bodyColor;\n each(this.beforeBody, fillLineOfText);\n\n xLinePadding = displayColors && bodyAlignForCalculation !== 'right'\n ? bodyAlign === 'center' ? (boxWidth / 2 + boxPadding) : (boxWidth + 2 + boxPadding)\n : 0;\n\n // Draw body lines now\n for (i = 0, ilen = body.length; i < ilen; ++i) {\n bodyItem = body[i];\n textColor = this.labelTextColors[i];\n\n ctx.fillStyle = textColor;\n each(bodyItem.before, fillLineOfText);\n\n lines = bodyItem.lines;\n // Draw Legend-like boxes if needed\n if (displayColors && lines.length) {\n this._drawColorBox(ctx, pt, i, rtlHelper, options);\n bodyLineHeight = Math.max(bodyFont.lineHeight, boxHeight);\n }\n\n for (j = 0, jlen = lines.length; j < jlen; ++j) {\n fillLineOfText(lines[j]);\n // Reset for any lines that don't include colorbox\n bodyLineHeight = bodyFont.lineHeight;\n }\n\n each(bodyItem.after, fillLineOfText);\n }\n\n // Reset back to 0 for after body\n xLinePadding = 0;\n bodyLineHeight = bodyFont.lineHeight;\n\n // After body lines\n each(this.afterBody, fillLineOfText);\n pt.y -= bodySpacing; // Remove last body spacing\n }\n\n drawFooter(pt, ctx, options) {\n const footer = this.footer;\n const length = footer.length;\n let footerFont, i;\n\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n pt.x = getAlignedX(this, options.footerAlign, options);\n pt.y += options.footerMarginTop;\n\n ctx.textAlign = rtlHelper.textAlign(options.footerAlign);\n ctx.textBaseline = 'middle';\n\n footerFont = toFont(options.footerFont);\n\n ctx.fillStyle = options.footerColor;\n ctx.font = footerFont.string;\n\n for (i = 0; i < length; ++i) {\n ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFont.lineHeight / 2);\n pt.y += footerFont.lineHeight + options.footerSpacing;\n }\n }\n }\n\n drawBackground(pt, ctx, tooltipSize, options) {\n const {xAlign, yAlign} = this;\n const {x, y} = pt;\n const {width, height} = tooltipSize;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(options.cornerRadius);\n\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n\n ctx.beginPath();\n ctx.moveTo(x + topLeft, y);\n if (yAlign === 'top') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width - topRight, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + topRight);\n if (yAlign === 'center' && xAlign === 'right') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width, y + height - bottomRight);\n ctx.quadraticCurveTo(x + width, y + height, x + width - bottomRight, y + height);\n if (yAlign === 'bottom') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + bottomLeft, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - bottomLeft);\n if (yAlign === 'center' && xAlign === 'left') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x, y + topLeft);\n ctx.quadraticCurveTo(x, y, x + topLeft, y);\n ctx.closePath();\n\n ctx.fill();\n\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n }\n\n /**\n\t * Update x/y animation targets when _active elements are animating too\n\t * @private\n\t */\n _updateAnimationTarget(options) {\n const chart = this.chart;\n const anims = this.$animations;\n const animX = anims && anims.x;\n const animY = anims && anims.y;\n if (animX || animY) {\n const position = positioners[options.position].call(this, this._active, this._eventPosition);\n if (!position) {\n return;\n }\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, this._size);\n const alignment = determineAlignment(chart, options, positionAndSize);\n const point = getBackgroundPoint(options, positionAndSize, alignment, chart);\n if (animX._to !== point.x || animY._to !== point.y) {\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n this.width = size.width;\n this.height = size.height;\n this.caretX = position.x;\n this.caretY = position.y;\n this._resolveAnimations().update(this, point);\n }\n }\n }\n\n /**\n * Determine if the tooltip will draw anything\n * @returns {boolean} True if the tooltip will render\n */\n _willRender() {\n return !!this.opacity;\n }\n\n draw(ctx) {\n const options = this.options.setContext(this.getContext());\n let opacity = this.opacity;\n\n if (!opacity) {\n return;\n }\n\n this._updateAnimationTarget(options);\n\n const tooltipSize = {\n width: this.width,\n height: this.height\n };\n const pt = {\n x: this.x,\n y: this.y\n };\n\n // IE11/Edge does not like very small opacities, so snap to 0\n opacity = Math.abs(opacity) < 1e-3 ? 0 : opacity;\n\n const padding = toPadding(options.padding);\n\n // Truthy/falsey value for empty tooltip\n const hasTooltipContent = this.title.length || this.beforeBody.length || this.body.length || this.afterBody.length || this.footer.length;\n\n if (options.enabled && hasTooltipContent) {\n ctx.save();\n ctx.globalAlpha = opacity;\n\n // Draw Background\n this.drawBackground(pt, ctx, tooltipSize, options);\n\n overrideTextDirection(ctx, options.textDirection);\n\n pt.y += padding.top;\n\n // Titles\n this.drawTitle(pt, ctx, options);\n\n // Body\n this.drawBody(pt, ctx, options);\n\n // Footer\n this.drawFooter(pt, ctx, options);\n\n restoreTextDirection(ctx, options.textDirection);\n\n ctx.restore();\n }\n }\n\n /**\n\t * Get active elements in the tooltip\n\t * @returns {Array} Array of elements that are active in the tooltip\n\t */\n getActiveElements() {\n return this._active || [];\n }\n\n /**\n\t * Set active elements in the tooltip\n\t * @param {array} activeElements Array of active datasetIndex/index pairs.\n\t * @param {object} eventPosition Synthetic event position used in positioning\n\t */\n setActiveElements(activeElements, eventPosition) {\n const lastActive = this._active;\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = this.chart.getDatasetMeta(datasetIndex);\n\n if (!meta) {\n throw new Error('Cannot find a dataset at index ' + datasetIndex);\n }\n\n return {\n datasetIndex,\n element: meta.data[index],\n index,\n };\n });\n const changed = !_elementsEqual(lastActive, active);\n const positionChanged = this._positionChanged(active, eventPosition);\n\n if (changed || positionChanged) {\n this._active = active;\n this._eventPosition = eventPosition;\n this._ignoreReplayEvents = true;\n this.update(true);\n }\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e - The event to handle\n\t * @param {boolean} [replay] - This is a replayed event (from update)\n\t * @param {boolean} [inChartArea] - The event is inside chartArea\n\t * @returns {boolean} true if the tooltip changed\n\t */\n handleEvent(e, replay, inChartArea = true) {\n if (replay && this._ignoreReplayEvents) {\n return false;\n }\n this._ignoreReplayEvents = false;\n\n const options = this.options;\n const lastActive = this._active || [];\n const active = this._getActiveElements(e, lastActive, replay, inChartArea);\n\n // When there are multiple items shown, but the tooltip position is nearest mode\n // an update may need to be made because our position may have changed even though\n // the items are the same as before.\n const positionChanged = this._positionChanged(active, e);\n\n // Remember Last Actives\n const changed = replay || !_elementsEqual(active, lastActive) || positionChanged;\n\n // Only handle target event on tooltip change\n if (changed) {\n this._active = active;\n\n if (options.enabled || options.external) {\n this._eventPosition = {\n x: e.x,\n y: e.y\n };\n\n this.update(true, replay);\n }\n }\n\n return changed;\n }\n\n /**\n\t * Helper for determining the active elements for event\n\t * @param {ChartEvent} e - The event to handle\n\t * @param {InteractionItem[]} lastActive - Previously active elements\n\t * @param {boolean} [replay] - This is a replayed event (from update)\n\t * @param {boolean} [inChartArea] - The event is inside chartArea\n\t * @returns {InteractionItem[]} - Active elements\n\t * @private\n\t */\n _getActiveElements(e, lastActive, replay, inChartArea) {\n const options = this.options;\n\n if (e.type === 'mouseout') {\n return [];\n }\n\n if (!inChartArea) {\n // Let user control the active elements outside chartArea. Eg. using Legend.\n // But make sure that active elements are still valid.\n return lastActive.filter(i =>\n this.chart.data.datasets[i.datasetIndex] &&\n this.chart.getDatasetMeta(i.datasetIndex).controller.getParsed(i.index) !== undefined\n );\n }\n\n // Find Active Elements for tooltips\n const active = this.chart.getElementsAtEventForMode(e, options.mode, options, replay);\n\n if (options.reverse) {\n active.reverse();\n }\n\n return active;\n }\n\n /**\n\t * Determine if the active elements + event combination changes the\n\t * tooltip position\n\t * @param {array} active - Active elements\n\t * @param {ChartEvent} e - Event that triggered the position change\n\t * @returns {boolean} True if the position has changed\n\t */\n _positionChanged(active, e) {\n const {caretX, caretY, options} = this;\n const position = positioners[options.position].call(this, active, e);\n return position !== false && (caretX !== position.x || caretY !== position.y);\n }\n}\n\nexport default {\n id: 'tooltip',\n _element: Tooltip,\n positioners,\n\n afterInit(chart, _args, options) {\n if (options) {\n chart.tooltip = new Tooltip({chart, options});\n }\n },\n\n beforeUpdate(chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n\n reset(chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n\n afterDraw(chart) {\n const tooltip = chart.tooltip;\n\n if (tooltip && tooltip._willRender()) {\n const args = {\n tooltip\n };\n\n if (chart.notifyPlugins('beforeTooltipDraw', {...args, cancelable: true}) === false) {\n return;\n }\n\n tooltip.draw(chart.ctx);\n\n chart.notifyPlugins('afterTooltipDraw', args);\n }\n },\n\n afterEvent(chart, args) {\n if (chart.tooltip) {\n // If the event is replayed from `update`, we should evaluate with the final positions.\n const useFinalPosition = args.replay;\n if (chart.tooltip.handleEvent(args.event, useFinalPosition, args.inChartArea)) {\n // notify chart about the change, so it will render\n args.changed = true;\n }\n }\n },\n\n defaults: {\n enabled: true,\n external: null,\n position: 'average',\n backgroundColor: 'rgba(0,0,0,0.8)',\n titleColor: '#fff',\n titleFont: {\n weight: 'bold',\n },\n titleSpacing: 2,\n titleMarginBottom: 6,\n titleAlign: 'left',\n bodyColor: '#fff',\n bodySpacing: 2,\n bodyFont: {\n },\n bodyAlign: 'left',\n footerColor: '#fff',\n footerSpacing: 2,\n footerMarginTop: 6,\n footerFont: {\n weight: 'bold',\n },\n footerAlign: 'left',\n padding: 6,\n caretPadding: 2,\n caretSize: 5,\n cornerRadius: 6,\n boxHeight: (ctx, opts) => opts.bodyFont.size,\n boxWidth: (ctx, opts) => opts.bodyFont.size,\n multiKeyBackground: '#fff',\n displayColors: true,\n boxPadding: 0,\n borderColor: 'rgba(0,0,0,0)',\n borderWidth: 0,\n animation: {\n duration: 400,\n easing: 'easeOutQuart',\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'width', 'height', 'caretX', 'caretY'],\n },\n opacity: {\n easing: 'linear',\n duration: 200\n }\n },\n callbacks: defaultCallbacks\n },\n\n defaultRoutes: {\n bodyFont: 'font',\n footerFont: 'font',\n titleFont: 'font'\n },\n\n descriptors: {\n _scriptable: (name) => name !== 'filter' && name !== 'itemSort' && name !== 'external',\n _indexable: false,\n callbacks: {\n _scriptable: false,\n _indexable: false,\n },\n animation: {\n _fallback: false\n },\n animations: {\n _fallback: 'animation'\n }\n },\n\n // Resolve additionally from `interaction` options and defaults.\n additionalOptionScopes: ['interaction']\n};\n","import Scale from '../core/core.scale.js';\nimport {isNullOrUndef, valueOrDefault, _limitValue} from '../helpers/index.js';\n\nconst addIfString = (labels, raw, index, addedLabels) => {\n if (typeof raw === 'string') {\n index = labels.push(raw) - 1;\n addedLabels.unshift({index, label: raw});\n } else if (isNaN(raw)) {\n index = null;\n }\n return index;\n};\n\nfunction findOrAddLabel(labels, raw, index, addedLabels) {\n const first = labels.indexOf(raw);\n if (first === -1) {\n return addIfString(labels, raw, index, addedLabels);\n }\n const last = labels.lastIndexOf(raw);\n return first !== last ? index : first;\n}\n\nconst validIndex = (index, max) => index === null ? null : _limitValue(Math.round(index), 0, max);\n\nfunction _getLabelForValue(value) {\n const labels = this.getLabels();\n\n if (value >= 0 && value < labels.length) {\n return labels[value];\n }\n return value;\n}\n\nexport default class CategoryScale extends Scale {\n\n static id = 'category';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: _getLabelForValue\n }\n };\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this._startValue = undefined;\n this._valueRange = 0;\n this._addedLabels = [];\n }\n\n init(scaleOptions) {\n const added = this._addedLabels;\n if (added.length) {\n const labels = this.getLabels();\n for (const {index, label} of added) {\n if (labels[index] === label) {\n labels.splice(index, 1);\n }\n }\n this._addedLabels = [];\n }\n super.init(scaleOptions);\n }\n\n parse(raw, index) {\n if (isNullOrUndef(raw)) {\n return null;\n }\n const labels = this.getLabels();\n index = isFinite(index) && labels[index] === raw ? index\n : findOrAddLabel(labels, raw, valueOrDefault(index, raw), this._addedLabels);\n return validIndex(index, labels.length - 1);\n }\n\n determineDataLimits() {\n const {minDefined, maxDefined} = this.getUserBounds();\n let {min, max} = this.getMinMax(true);\n\n if (this.options.bounds === 'ticks') {\n if (!minDefined) {\n min = 0;\n }\n if (!maxDefined) {\n max = this.getLabels().length - 1;\n }\n }\n\n this.min = min;\n this.max = max;\n }\n\n buildTicks() {\n const min = this.min;\n const max = this.max;\n const offset = this.options.offset;\n const ticks = [];\n let labels = this.getLabels();\n\n // If we are viewing some subset of labels, slice the original array\n labels = (min === 0 && max === labels.length - 1) ? labels : labels.slice(min, max + 1);\n\n this._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1);\n this._startValue = this.min - (offset ? 0.5 : 0);\n\n for (let value = min; value <= max; value++) {\n ticks.push({value});\n }\n return ticks;\n }\n\n getLabelForValue(value) {\n return _getLabelForValue.call(this, value);\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n super.configure();\n\n if (!this.isHorizontal()) {\n // For backward compatibility, vertical category scale reverse is inverted.\n this._reversePixels = !this._reversePixels;\n }\n }\n\n // Used to get data value locations. Value can either be an index or a numerical value\n getPixelForValue(value) {\n if (typeof value !== 'number') {\n value = this.parse(value);\n }\n\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n\n // Must override base implementation because it calls getPixelForValue\n // and category scale can have duplicate values\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n\n getValueForPixel(pixel) {\n return Math.round(this._startValue + this.getDecimalForPixel(pixel) * this._valueRange);\n }\n\n getBasePixel() {\n return this.bottom;\n }\n}\n","import {isNullOrUndef} from '../helpers/helpers.core.js';\nimport {almostEquals, almostWhole, niceNum, _decimalPlaces, _setMinAndMaxByKey, sign, toRadians} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\n\n/**\n * Generate a set of linear ticks for an axis\n * 1. If generationOptions.min, generationOptions.max, and generationOptions.step are defined:\n * if (max - min) / step is an integer, ticks are generated as [min, min + step, ..., max]\n * Note that the generationOptions.maxCount setting is respected in this scenario\n *\n * 2. If generationOptions.min, generationOptions.max, and generationOptions.count is defined\n * spacing = (max - min) / count\n * Ticks are generated as [min, min + spacing, ..., max]\n *\n * 3. If generationOptions.count is defined\n * spacing = (niceMax - niceMin) / count\n *\n * 4. Compute optimal spacing of ticks using niceNum algorithm\n *\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {object[]} array of tick objects\n */\nfunction generateTicks(generationOptions, dataRange) {\n const ticks = [];\n // To get a \"nice\" value for the tick spacing, we will use the appropriately named\n // \"nice number\" algorithm. See https://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks\n // for details.\n\n const MIN_SPACING = 1e-14;\n const {bounds, step, min, max, precision, count, maxTicks, maxDigits, includeBounds} = generationOptions;\n const unit = step || 1;\n const maxSpaces = maxTicks - 1;\n const {min: rmin, max: rmax} = dataRange;\n const minDefined = !isNullOrUndef(min);\n const maxDefined = !isNullOrUndef(max);\n const countDefined = !isNullOrUndef(count);\n const minSpacing = (rmax - rmin) / (maxDigits + 1);\n let spacing = niceNum((rmax - rmin) / maxSpaces / unit) * unit;\n let factor, niceMin, niceMax, numSpaces;\n\n // Beyond MIN_SPACING floating point numbers being to lose precision\n // such that we can't do the math necessary to generate ticks\n if (spacing < MIN_SPACING && !minDefined && !maxDefined) {\n return [{value: rmin}, {value: rmax}];\n }\n\n numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);\n if (numSpaces > maxSpaces) {\n // If the calculated num of spaces exceeds maxNumSpaces, recalculate it\n spacing = niceNum(numSpaces * spacing / maxSpaces / unit) * unit;\n }\n\n if (!isNullOrUndef(precision)) {\n // If the user specified a precision, round to that number of decimal places\n factor = Math.pow(10, precision);\n spacing = Math.ceil(spacing * factor) / factor;\n }\n\n if (bounds === 'ticks') {\n niceMin = Math.floor(rmin / spacing) * spacing;\n niceMax = Math.ceil(rmax / spacing) * spacing;\n } else {\n niceMin = rmin;\n niceMax = rmax;\n }\n\n if (minDefined && maxDefined && step && almostWhole((max - min) / step, spacing / 1000)) {\n // Case 1: If min, max and stepSize are set and they make an evenly spaced scale use it.\n // spacing = step;\n // numSpaces = (max - min) / spacing;\n // Note that we round here to handle the case where almostWhole translated an FP error\n numSpaces = Math.round(Math.min((max - min) / spacing, maxTicks));\n spacing = (max - min) / numSpaces;\n niceMin = min;\n niceMax = max;\n } else if (countDefined) {\n // Cases 2 & 3, we have a count specified. Handle optional user defined edges to the range.\n // Sometimes these are no-ops, but it makes the code a lot clearer\n // and when a user defined range is specified, we want the correct ticks\n niceMin = minDefined ? min : niceMin;\n niceMax = maxDefined ? max : niceMax;\n numSpaces = count - 1;\n spacing = (niceMax - niceMin) / numSpaces;\n } else {\n // Case 4\n numSpaces = (niceMax - niceMin) / spacing;\n\n // If very close to our rounded value, use it.\n if (almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n numSpaces = Math.round(numSpaces);\n } else {\n numSpaces = Math.ceil(numSpaces);\n }\n }\n\n // The spacing will have changed in cases 1, 2, and 3 so the factor cannot be computed\n // until this point\n const decimalPlaces = Math.max(\n _decimalPlaces(spacing),\n _decimalPlaces(niceMin)\n );\n factor = Math.pow(10, isNullOrUndef(precision) ? decimalPlaces : precision);\n niceMin = Math.round(niceMin * factor) / factor;\n niceMax = Math.round(niceMax * factor) / factor;\n\n let j = 0;\n if (minDefined) {\n if (includeBounds && niceMin !== min) {\n ticks.push({value: min});\n\n if (niceMin < min) {\n j++; // Skip niceMin\n }\n // If the next nice tick is close to min, skip it\n if (almostEquals(Math.round((niceMin + j * spacing) * factor) / factor, min, relativeLabelSize(min, minSpacing, generationOptions))) {\n j++;\n }\n } else if (niceMin < min) {\n j++;\n }\n }\n\n for (; j < numSpaces; ++j) {\n const tickValue = Math.round((niceMin + j * spacing) * factor) / factor;\n if (maxDefined && tickValue > max) {\n break;\n }\n ticks.push({value: tickValue});\n }\n\n if (maxDefined && includeBounds && niceMax !== max) {\n // If the previous tick is too close to max, replace it with max, else add max\n if (ticks.length && almostEquals(ticks[ticks.length - 1].value, max, relativeLabelSize(max, minSpacing, generationOptions))) {\n ticks[ticks.length - 1].value = max;\n } else {\n ticks.push({value: max});\n }\n } else if (!maxDefined || niceMax === max) {\n ticks.push({value: niceMax});\n }\n\n return ticks;\n}\n\nfunction relativeLabelSize(value, minSpacing, {horizontal, minRotation}) {\n const rad = toRadians(minRotation);\n const ratio = (horizontal ? Math.sin(rad) : Math.cos(rad)) || 0.001;\n const length = 0.75 * minSpacing * ('' + value).length;\n return Math.min(minSpacing / ratio, length);\n}\n\nexport default class LinearScaleBase extends Scale {\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.start = undefined;\n /** @type {number} */\n this.end = undefined;\n /** @type {number} */\n this._startValue = undefined;\n /** @type {number} */\n this._endValue = undefined;\n this._valueRange = 0;\n }\n\n parse(raw, index) { // eslint-disable-line no-unused-vars\n if (isNullOrUndef(raw)) {\n return null;\n }\n if ((typeof raw === 'number' || raw instanceof Number) && !isFinite(+raw)) {\n return null;\n }\n\n return +raw;\n }\n\n handleTickRangeOptions() {\n const {beginAtZero} = this.options;\n const {minDefined, maxDefined} = this.getUserBounds();\n let {min, max} = this;\n\n const setMin = v => (min = minDefined ? min : v);\n const setMax = v => (max = maxDefined ? max : v);\n\n if (beginAtZero) {\n const minSign = sign(min);\n const maxSign = sign(max);\n\n if (minSign < 0 && maxSign < 0) {\n setMax(0);\n } else if (minSign > 0 && maxSign > 0) {\n setMin(0);\n }\n }\n\n if (min === max) {\n let offset = max === 0 ? 1 : Math.abs(max * 0.05);\n\n setMax(max + offset);\n\n if (!beginAtZero) {\n setMin(min - offset);\n }\n }\n this.min = min;\n this.max = max;\n }\n\n getTickLimit() {\n const tickOpts = this.options.ticks;\n // eslint-disable-next-line prefer-const\n let {maxTicksLimit, stepSize} = tickOpts;\n let maxTicks;\n\n if (stepSize) {\n maxTicks = Math.ceil(this.max / stepSize) - Math.floor(this.min / stepSize) + 1;\n if (maxTicks > 1000) {\n console.warn(`scales.${this.id}.ticks.stepSize: ${stepSize} would result generating up to ${maxTicks} ticks. Limiting to 1000.`);\n maxTicks = 1000;\n }\n } else {\n maxTicks = this.computeTickLimit();\n maxTicksLimit = maxTicksLimit || 11;\n }\n\n if (maxTicksLimit) {\n maxTicks = Math.min(maxTicksLimit, maxTicks);\n }\n\n return maxTicks;\n }\n\n /**\n\t * @protected\n\t */\n computeTickLimit() {\n return Number.POSITIVE_INFINITY;\n }\n\n buildTicks() {\n const opts = this.options;\n const tickOpts = opts.ticks;\n\n // Figure out what the max number of ticks we can support it is based on the size of\n // the axis area. For now, we say that the minimum tick spacing in pixels must be 40\n // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n // the graph. Make sure we always have at least 2 ticks\n let maxTicks = this.getTickLimit();\n maxTicks = Math.max(2, maxTicks);\n\n const numericGeneratorOptions = {\n maxTicks,\n bounds: opts.bounds,\n min: opts.min,\n max: opts.max,\n precision: tickOpts.precision,\n step: tickOpts.stepSize,\n count: tickOpts.count,\n maxDigits: this._maxDigits(),\n horizontal: this.isHorizontal(),\n minRotation: tickOpts.minRotation || 0,\n includeBounds: tickOpts.includeBounds !== false\n };\n const dataRange = this._range || this;\n const ticks = generateTicks(numericGeneratorOptions, dataRange);\n\n // At this point, we need to update our max and min given the tick values,\n // since we probably have expanded the range of the scale\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n\n if (opts.reverse) {\n ticks.reverse();\n\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n\n return ticks;\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n const ticks = this.ticks;\n let start = this.min;\n let end = this.max;\n\n super.configure();\n\n if (this.options.offset && ticks.length) {\n const offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;\n start -= offset;\n end += offset;\n }\n this._startValue = start;\n this._endValue = end;\n this._valueRange = end - start;\n }\n\n getLabelForValue(value) {\n return formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n}\n","import {isFinite} from '../helpers/helpers.core.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\nimport {toRadians} from '../helpers/index.js';\n\nexport default class LinearScale extends LinearScaleBase {\n\n static id = 'linear';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: Ticks.formatters.numeric\n }\n };\n\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(true);\n\n this.min = isFinite(min) ? min : 0;\n this.max = isFinite(max) ? max : 1;\n\n // Common base implementation to handle min, max, beginAtZero\n this.handleTickRangeOptions();\n }\n\n /**\n\t * Returns the maximum number of ticks based on the scale dimension\n\t * @protected\n \t */\n computeTickLimit() {\n const horizontal = this.isHorizontal();\n const length = horizontal ? this.width : this.height;\n const minRotation = toRadians(this.options.ticks.minRotation);\n const ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 0.001;\n const tickFont = this._resolveTickFontOptions(0);\n return Math.ceil(length / Math.min(40, tickFont.lineHeight / ratio));\n }\n\n // Utils\n getPixelForValue(value) {\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n\n getValueForPixel(pixel) {\n return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;\n }\n}\n","import {finiteOrDefault, isFinite} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {_setMinAndMaxByKey, log10} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\n\nconst log10Floor = v => Math.floor(log10(v));\nconst changeExponent = (v, m) => Math.pow(10, log10Floor(v) + m);\n\nfunction isMajor(tickVal) {\n const remain = tickVal / (Math.pow(10, log10Floor(tickVal)));\n return remain === 1;\n}\n\nfunction steps(min, max, rangeExp) {\n const rangeStep = Math.pow(10, rangeExp);\n const start = Math.floor(min / rangeStep);\n const end = Math.ceil(max / rangeStep);\n return end - start;\n}\n\nfunction startExp(min, max) {\n const range = max - min;\n let rangeExp = log10Floor(range);\n while (steps(min, max, rangeExp) > 10) {\n rangeExp++;\n }\n while (steps(min, max, rangeExp) < 10) {\n rangeExp--;\n }\n return Math.min(rangeExp, log10Floor(min));\n}\n\n\n/**\n * Generate a set of logarithmic ticks\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {object[]} array of tick objects\n */\nfunction generateTicks(generationOptions, {min, max}) {\n min = finiteOrDefault(generationOptions.min, min);\n const ticks = [];\n const minExp = log10Floor(min);\n let exp = startExp(min, max);\n let precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\n const stepSize = Math.pow(10, exp);\n const base = minExp > exp ? Math.pow(10, minExp) : 0;\n const start = Math.round((min - base) * precision) / precision;\n const offset = Math.floor((min - base) / stepSize / 10) * stepSize * 10;\n let significand = Math.floor((start - offset) / Math.pow(10, exp));\n let value = finiteOrDefault(generationOptions.min, Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision);\n while (value < max) {\n ticks.push({value, major: isMajor(value), significand});\n if (significand >= 10) {\n significand = significand < 15 ? 15 : 20;\n } else {\n significand++;\n }\n if (significand >= 20) {\n exp++;\n significand = 2;\n precision = exp >= 0 ? 1 : precision;\n }\n value = Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision;\n }\n const lastTick = finiteOrDefault(generationOptions.max, value);\n ticks.push({value: lastTick, major: isMajor(lastTick), significand});\n\n return ticks;\n}\n\nexport default class LogarithmicScale extends Scale {\n\n static id = 'logarithmic';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: Ticks.formatters.logarithmic,\n major: {\n enabled: true\n }\n }\n };\n\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.start = undefined;\n /** @type {number} */\n this.end = undefined;\n /** @type {number} */\n this._startValue = undefined;\n this._valueRange = 0;\n }\n\n parse(raw, index) {\n const value = LinearScaleBase.prototype.parse.apply(this, [raw, index]);\n if (value === 0) {\n this._zero = true;\n return undefined;\n }\n return isFinite(value) && value > 0 ? value : null;\n }\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(true);\n\n this.min = isFinite(min) ? Math.max(0, min) : null;\n this.max = isFinite(max) ? Math.max(0, max) : null;\n\n if (this.options.beginAtZero) {\n this._zero = true;\n }\n\n // if data has `0` in it or `beginAtZero` is true, min (non zero) value is at bottom\n // of scale, and it does not equal suggestedMin, lower the min bound by one exp.\n if (this._zero && this.min !== this._suggestedMin && !isFinite(this._userMin)) {\n this.min = min === changeExponent(this.min, 0) ? changeExponent(this.min, -1) : changeExponent(this.min, 0);\n }\n\n this.handleTickRangeOptions();\n }\n\n handleTickRangeOptions() {\n const {minDefined, maxDefined} = this.getUserBounds();\n let min = this.min;\n let max = this.max;\n\n const setMin = v => (min = minDefined ? min : v);\n const setMax = v => (max = maxDefined ? max : v);\n\n if (min === max) {\n if (min <= 0) { // includes null\n setMin(1);\n setMax(10);\n } else {\n setMin(changeExponent(min, -1));\n setMax(changeExponent(max, +1));\n }\n }\n if (min <= 0) {\n setMin(changeExponent(max, -1));\n }\n if (max <= 0) {\n\n setMax(changeExponent(min, +1));\n }\n\n this.min = min;\n this.max = max;\n }\n\n buildTicks() {\n const opts = this.options;\n\n const generationOptions = {\n min: this._userMin,\n max: this._userMax\n };\n const ticks = generateTicks(generationOptions, this);\n\n // At this point, we need to update our max and min given the tick values,\n // since we probably have expanded the range of the scale\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n\n if (opts.reverse) {\n ticks.reverse();\n\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n\n return ticks;\n }\n\n /**\n\t * @param {number} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n return value === undefined\n ? '0'\n : formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n const start = this.min;\n\n super.configure();\n\n this._startValue = log10(start);\n this._valueRange = log10(this.max) - log10(start);\n }\n\n getPixelForValue(value) {\n if (value === undefined || value === 0) {\n value = this.min;\n }\n if (value === null || isNaN(value)) {\n return NaN;\n }\n return this.getPixelForDecimal(value === this.min\n ? 0\n : (log10(value) - this._startValue) / this._valueRange);\n }\n\n getValueForPixel(pixel) {\n const decimal = this.getDecimalForPixel(pixel);\n return Math.pow(10, this._startValue + decimal * this._valueRange);\n }\n}\n","import defaults from '../core/core.defaults.js';\nimport {_longestText, addRoundedRectPath, renderText, _isPointInArea} from '../helpers/helpers.canvas.js';\nimport {HALF_PI, TAU, toDegrees, toRadians, _normalizeAngle, PI} from '../helpers/helpers.math.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\nimport {valueOrDefault, isArray, isFinite, callback as callCallback, isNullOrUndef} from '../helpers/helpers.core.js';\nimport {createContext, toFont, toPadding, toTRBLCorners} from '../helpers/helpers.options.js';\n\nfunction getTickBackdropHeight(opts) {\n const tickOpts = opts.ticks;\n\n if (tickOpts.display && opts.display) {\n const padding = toPadding(tickOpts.backdropPadding);\n return valueOrDefault(tickOpts.font && tickOpts.font.size, defaults.font.size) + padding.height;\n }\n return 0;\n}\n\nfunction measureLabelSize(ctx, font, label) {\n label = isArray(label) ? label : [label];\n return {\n w: _longestText(ctx, font.string, label),\n h: label.length * font.lineHeight\n };\n}\n\nfunction determineLimits(angle, pos, size, min, max) {\n if (angle === min || angle === max) {\n return {\n start: pos - (size / 2),\n end: pos + (size / 2)\n };\n } else if (angle < min || angle > max) {\n return {\n start: pos - size,\n end: pos\n };\n }\n\n return {\n start: pos,\n end: pos + size\n };\n}\n\n/**\n * Helper function to fit a radial linear scale with point labels\n */\nfunction fitWithPointLabels(scale) {\n\n // Right, this is really confusing and there is a lot of maths going on here\n // The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9\n //\n // Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif\n //\n // Solution:\n //\n // We assume the radius of the polygon is half the size of the canvas at first\n // at each index we check if the text overlaps.\n //\n // Where it does, we store that angle and that index.\n //\n // After finding the largest index and angle we calculate how much we need to remove\n // from the shape radius to move the point inwards by that x.\n //\n // We average the left and right distances to get the maximum shape radius that can fit in the box\n // along with labels.\n //\n // Once we have that, we can find the centre point for the chart, by taking the x text protrusion\n // on each side, removing that from the size, halving it and adding the left x protrusion width.\n //\n // This will mean we have a shape fitted to the canvas, as large as it can be with the labels\n // and position it in the most space efficient manner\n //\n // https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif\n\n // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width.\n // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points\n const orig = {\n l: scale.left + scale._padding.left,\n r: scale.right - scale._padding.right,\n t: scale.top + scale._padding.top,\n b: scale.bottom - scale._padding.bottom\n };\n const limits = Object.assign({}, orig);\n const labelSizes = [];\n const padding = [];\n const valueCount = scale._pointLabels.length;\n const pointLabelOpts = scale.options.pointLabels;\n const additionalAngle = pointLabelOpts.centerPointLabels ? PI / valueCount : 0;\n\n for (let i = 0; i < valueCount; i++) {\n const opts = pointLabelOpts.setContext(scale.getPointLabelContext(i));\n padding[i] = opts.padding;\n const pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i], additionalAngle);\n const plFont = toFont(opts.font);\n const textSize = measureLabelSize(scale.ctx, plFont, scale._pointLabels[i]);\n labelSizes[i] = textSize;\n\n const angleRadians = _normalizeAngle(scale.getIndexAngle(i) + additionalAngle);\n const angle = Math.round(toDegrees(angleRadians));\n const hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n const vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n updateLimits(limits, orig, angleRadians, hLimits, vLimits);\n }\n\n scale.setCenterPoint(\n orig.l - limits.l,\n limits.r - orig.r,\n orig.t - limits.t,\n limits.b - orig.b\n );\n\n // Now that text size is determined, compute the full positions\n scale._pointLabelItems = buildPointLabelItems(scale, labelSizes, padding);\n}\n\nfunction updateLimits(limits, orig, angle, hLimits, vLimits) {\n const sin = Math.abs(Math.sin(angle));\n const cos = Math.abs(Math.cos(angle));\n let x = 0;\n let y = 0;\n if (hLimits.start < orig.l) {\n x = (orig.l - hLimits.start) / sin;\n limits.l = Math.min(limits.l, orig.l - x);\n } else if (hLimits.end > orig.r) {\n x = (hLimits.end - orig.r) / sin;\n limits.r = Math.max(limits.r, orig.r + x);\n }\n if (vLimits.start < orig.t) {\n y = (orig.t - vLimits.start) / cos;\n limits.t = Math.min(limits.t, orig.t - y);\n } else if (vLimits.end > orig.b) {\n y = (vLimits.end - orig.b) / cos;\n limits.b = Math.max(limits.b, orig.b + y);\n }\n}\n\nfunction createPointLabelItem(scale, index, itemOpts) {\n const outerDistance = scale.drawingArea;\n const {extra, additionalAngle, padding, size} = itemOpts;\n const pointLabelPosition = scale.getPointPosition(index, outerDistance + extra + padding, additionalAngle);\n const angle = Math.round(toDegrees(_normalizeAngle(pointLabelPosition.angle + HALF_PI)));\n const y = yForAngle(pointLabelPosition.y, size.h, angle);\n const textAlign = getTextAlignForAngle(angle);\n const left = leftForTextAlign(pointLabelPosition.x, size.w, textAlign);\n return {\n // if to draw or overlapped\n visible: true,\n\n // Text position\n x: pointLabelPosition.x,\n y,\n\n // Text rendering data\n textAlign,\n\n // Bounding box\n left,\n top: y,\n right: left + size.w,\n bottom: y + size.h\n };\n}\n\nfunction isNotOverlapped(item, area) {\n if (!area) {\n return true;\n }\n const {left, top, right, bottom} = item;\n const apexesInArea = _isPointInArea({x: left, y: top}, area) || _isPointInArea({x: left, y: bottom}, area) ||\n _isPointInArea({x: right, y: top}, area) || _isPointInArea({x: right, y: bottom}, area);\n return !apexesInArea;\n}\n\nfunction buildPointLabelItems(scale, labelSizes, padding) {\n const items = [];\n const valueCount = scale._pointLabels.length;\n const opts = scale.options;\n const {centerPointLabels, display} = opts.pointLabels;\n const itemOpts = {\n extra: getTickBackdropHeight(opts) / 2,\n additionalAngle: centerPointLabels ? PI / valueCount : 0\n };\n let area;\n\n for (let i = 0; i < valueCount; i++) {\n itemOpts.padding = padding[i];\n itemOpts.size = labelSizes[i];\n\n const item = createPointLabelItem(scale, i, itemOpts);\n items.push(item);\n if (display === 'auto') {\n item.visible = isNotOverlapped(item, area);\n if (item.visible) {\n area = item;\n }\n }\n }\n return items;\n}\n\nfunction getTextAlignForAngle(angle) {\n if (angle === 0 || angle === 180) {\n return 'center';\n } else if (angle < 180) {\n return 'left';\n }\n\n return 'right';\n}\n\nfunction leftForTextAlign(x, w, align) {\n if (align === 'right') {\n x -= w;\n } else if (align === 'center') {\n x -= (w / 2);\n }\n return x;\n}\n\nfunction yForAngle(y, h, angle) {\n if (angle === 90 || angle === 270) {\n y -= (h / 2);\n } else if (angle > 270 || angle < 90) {\n y -= h;\n }\n return y;\n}\n\nfunction drawPointLabelBox(ctx, opts, item) {\n const {left, top, right, bottom} = item;\n const {backdropColor} = opts;\n\n if (!isNullOrUndef(backdropColor)) {\n const borderRadius = toTRBLCorners(opts.borderRadius);\n const padding = toPadding(opts.backdropPadding);\n ctx.fillStyle = backdropColor;\n\n const backdropLeft = left - padding.left;\n const backdropTop = top - padding.top;\n const backdropWidth = right - left + padding.width;\n const backdropHeight = bottom - top + padding.height;\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: backdropLeft,\n y: backdropTop,\n w: backdropWidth,\n h: backdropHeight,\n radius: borderRadius,\n });\n ctx.fill();\n } else {\n ctx.fillRect(backdropLeft, backdropTop, backdropWidth, backdropHeight);\n }\n }\n}\n\nfunction drawPointLabels(scale, labelCount) {\n const {ctx, options: {pointLabels}} = scale;\n\n for (let i = labelCount - 1; i >= 0; i--) {\n const item = scale._pointLabelItems[i];\n if (!item.visible) {\n // overlapping\n continue;\n }\n const optsAtIndex = pointLabels.setContext(scale.getPointLabelContext(i));\n drawPointLabelBox(ctx, optsAtIndex, item);\n const plFont = toFont(optsAtIndex.font);\n const {x, y, textAlign} = item;\n\n renderText(\n ctx,\n scale._pointLabels[i],\n x,\n y + (plFont.lineHeight / 2),\n plFont,\n {\n color: optsAtIndex.color,\n textAlign: textAlign,\n textBaseline: 'middle'\n }\n );\n }\n}\n\nfunction pathRadiusLine(scale, radius, circular, labelCount) {\n const {ctx} = scale;\n if (circular) {\n // Draw circular arcs between the points\n ctx.arc(scale.xCenter, scale.yCenter, radius, 0, TAU);\n } else {\n // Draw straight lines connecting each index\n let pointPosition = scale.getPointPosition(0, radius);\n ctx.moveTo(pointPosition.x, pointPosition.y);\n\n for (let i = 1; i < labelCount; i++) {\n pointPosition = scale.getPointPosition(i, radius);\n ctx.lineTo(pointPosition.x, pointPosition.y);\n }\n }\n}\n\nfunction drawRadiusLine(scale, gridLineOpts, radius, labelCount, borderOpts) {\n const ctx = scale.ctx;\n const circular = gridLineOpts.circular;\n\n const {color, lineWidth} = gridLineOpts;\n\n if ((!circular && !labelCount) || !color || !lineWidth || radius < 0) {\n return;\n }\n\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth = lineWidth;\n ctx.setLineDash(borderOpts.dash || []);\n ctx.lineDashOffset = borderOpts.dashOffset;\n\n ctx.beginPath();\n pathRadiusLine(scale, radius, circular, labelCount);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n}\n\nfunction createPointLabelContext(parent, index, label) {\n return createContext(parent, {\n label,\n index,\n type: 'pointLabel'\n });\n}\n\nexport default class RadialLinearScale extends LinearScaleBase {\n\n static id = 'radialLinear';\n\n /**\n * @type {any}\n */\n static defaults = {\n display: true,\n\n // Boolean - Whether to animate scaling the chart from the centre\n animate: true,\n position: 'chartArea',\n\n angleLines: {\n display: true,\n lineWidth: 1,\n borderDash: [],\n borderDashOffset: 0.0\n },\n\n grid: {\n circular: false\n },\n\n startAngle: 0,\n\n // label settings\n ticks: {\n // Boolean - Show a backdrop to the scale label\n showLabelBackdrop: true,\n\n callback: Ticks.formatters.numeric\n },\n\n pointLabels: {\n backdropColor: undefined,\n\n // Number - The backdrop padding above & below the label in pixels\n backdropPadding: 2,\n\n // Boolean - if true, show point labels\n display: true,\n\n // Number - Point label font size in pixels\n font: {\n size: 10\n },\n\n // Function - Used to convert point labels\n callback(label) {\n return label;\n },\n\n // Number - Additionl padding between scale and pointLabel\n padding: 5,\n\n // Boolean - if true, center point labels to slices in polar chart\n centerPointLabels: false\n }\n };\n\n static defaultRoutes = {\n 'angleLines.color': 'borderColor',\n 'pointLabels.color': 'color',\n 'ticks.color': 'color'\n };\n\n static descriptors = {\n angleLines: {\n _fallback: 'grid'\n }\n };\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.xCenter = undefined;\n /** @type {number} */\n this.yCenter = undefined;\n /** @type {number} */\n this.drawingArea = undefined;\n /** @type {string[]} */\n this._pointLabels = [];\n this._pointLabelItems = [];\n }\n\n setDimensions() {\n // Set the unconstrained dimension before label rotation\n const padding = this._padding = toPadding(getTickBackdropHeight(this.options) / 2);\n const w = this.width = this.maxWidth - padding.width;\n const h = this.height = this.maxHeight - padding.height;\n this.xCenter = Math.floor(this.left + w / 2 + padding.left);\n this.yCenter = Math.floor(this.top + h / 2 + padding.top);\n this.drawingArea = Math.floor(Math.min(w, h) / 2);\n }\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(false);\n\n this.min = isFinite(min) && !isNaN(min) ? min : 0;\n this.max = isFinite(max) && !isNaN(max) ? max : 0;\n\n // Common base implementation to handle min, max, beginAtZero\n this.handleTickRangeOptions();\n }\n\n /**\n\t * Returns the maximum number of ticks based on the scale dimension\n\t * @protected\n\t */\n computeTickLimit() {\n return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));\n }\n\n generateTickLabels(ticks) {\n LinearScaleBase.prototype.generateTickLabels.call(this, ticks);\n\n // Point labels\n this._pointLabels = this.getLabels()\n .map((value, index) => {\n const label = callCallback(this.options.pointLabels.callback, [value, index], this);\n return label || label === 0 ? label : '';\n })\n .filter((v, i) => this.chart.getDataVisibility(i));\n }\n\n fit() {\n const opts = this.options;\n\n if (opts.display && opts.pointLabels.display) {\n fitWithPointLabels(this);\n } else {\n this.setCenterPoint(0, 0, 0, 0);\n }\n }\n\n setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) {\n this.xCenter += Math.floor((leftMovement - rightMovement) / 2);\n this.yCenter += Math.floor((topMovement - bottomMovement) / 2);\n this.drawingArea -= Math.min(this.drawingArea / 2, Math.max(leftMovement, rightMovement, topMovement, bottomMovement));\n }\n\n getIndexAngle(index) {\n const angleMultiplier = TAU / (this._pointLabels.length || 1);\n const startAngle = this.options.startAngle || 0;\n\n return _normalizeAngle(index * angleMultiplier + toRadians(startAngle));\n }\n\n getDistanceFromCenterForValue(value) {\n if (isNullOrUndef(value)) {\n return NaN;\n }\n\n // Take into account half font size + the yPadding of the top value\n const scalingFactor = this.drawingArea / (this.max - this.min);\n if (this.options.reverse) {\n return (this.max - value) * scalingFactor;\n }\n return (value - this.min) * scalingFactor;\n }\n\n getValueForDistanceFromCenter(distance) {\n if (isNullOrUndef(distance)) {\n return NaN;\n }\n\n const scaledDistance = distance / (this.drawingArea / (this.max - this.min));\n return this.options.reverse ? this.max - scaledDistance : this.min + scaledDistance;\n }\n\n getPointLabelContext(index) {\n const pointLabels = this._pointLabels || [];\n\n if (index >= 0 && index < pointLabels.length) {\n const pointLabel = pointLabels[index];\n return createPointLabelContext(this.getContext(), index, pointLabel);\n }\n }\n\n getPointPosition(index, distanceFromCenter, additionalAngle = 0) {\n const angle = this.getIndexAngle(index) - HALF_PI + additionalAngle;\n return {\n x: Math.cos(angle) * distanceFromCenter + this.xCenter,\n y: Math.sin(angle) * distanceFromCenter + this.yCenter,\n angle\n };\n }\n\n getPointPositionForValue(index, value) {\n return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n }\n\n getBasePosition(index) {\n return this.getPointPositionForValue(index || 0, this.getBaseValue());\n }\n\n getPointLabelPosition(index) {\n const {left, top, right, bottom} = this._pointLabelItems[index];\n return {\n left,\n top,\n right,\n bottom,\n };\n }\n\n /**\n\t * @protected\n\t */\n drawBackground() {\n const {backgroundColor, grid: {circular}} = this.options;\n if (backgroundColor) {\n const ctx = this.ctx;\n ctx.save();\n ctx.beginPath();\n pathRadiusLine(this, this.getDistanceFromCenterForValue(this._endValue), circular, this._pointLabels.length);\n ctx.closePath();\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n ctx.restore();\n }\n }\n\n /**\n\t * @protected\n\t */\n drawGrid() {\n const ctx = this.ctx;\n const opts = this.options;\n const {angleLines, grid, border} = opts;\n const labelCount = this._pointLabels.length;\n\n let i, offset, position;\n\n if (opts.pointLabels.display) {\n drawPointLabels(this, labelCount);\n }\n\n if (grid.display) {\n this.ticks.forEach((tick, index) => {\n if (index !== 0 || (index === 0 && this.min < 0)) {\n offset = this.getDistanceFromCenterForValue(tick.value);\n const context = this.getContext(index);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n\n drawRadiusLine(this, optsAtIndex, offset, labelCount, optsAtIndexBorder);\n }\n });\n }\n\n if (angleLines.display) {\n ctx.save();\n\n for (i = labelCount - 1; i >= 0; i--) {\n const optsAtIndex = angleLines.setContext(this.getPointLabelContext(i));\n const {color, lineWidth} = optsAtIndex;\n\n if (!lineWidth || !color) {\n continue;\n }\n\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = color;\n\n ctx.setLineDash(optsAtIndex.borderDash);\n ctx.lineDashOffset = optsAtIndex.borderDashOffset;\n\n offset = this.getDistanceFromCenterForValue(opts.reverse ? this.min : this.max);\n position = this.getPointPosition(i, offset);\n ctx.beginPath();\n ctx.moveTo(this.xCenter, this.yCenter);\n ctx.lineTo(position.x, position.y);\n ctx.stroke();\n }\n\n ctx.restore();\n }\n }\n\n /**\n\t * @protected\n\t */\n drawBorder() {}\n\n /**\n\t * @protected\n\t */\n drawLabels() {\n const ctx = this.ctx;\n const opts = this.options;\n const tickOpts = opts.ticks;\n\n if (!tickOpts.display) {\n return;\n }\n\n const startAngle = this.getIndexAngle(0);\n let offset, width;\n\n ctx.save();\n ctx.translate(this.xCenter, this.yCenter);\n ctx.rotate(startAngle);\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n\n this.ticks.forEach((tick, index) => {\n if ((index === 0 && this.min >= 0) && !opts.reverse) {\n return;\n }\n\n const optsAtIndex = tickOpts.setContext(this.getContext(index));\n const tickFont = toFont(optsAtIndex.font);\n offset = this.getDistanceFromCenterForValue(this.ticks[index].value);\n\n if (optsAtIndex.showLabelBackdrop) {\n ctx.font = tickFont.string;\n width = ctx.measureText(tick.label).width;\n ctx.fillStyle = optsAtIndex.backdropColor;\n\n const padding = toPadding(optsAtIndex.backdropPadding);\n ctx.fillRect(\n -width / 2 - padding.left,\n -offset - tickFont.size / 2 - padding.top,\n width + padding.width,\n tickFont.size + padding.height\n );\n }\n\n renderText(ctx, tick.label, 0, -offset, tickFont, {\n color: optsAtIndex.color,\n strokeColor: optsAtIndex.textStrokeColor,\n strokeWidth: optsAtIndex.textStrokeWidth,\n });\n });\n\n ctx.restore();\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {}\n}\n","import adapters from '../core/core.adapters.js';\nimport {callback as call, isFinite, isNullOrUndef, mergeIf, valueOrDefault} from '../helpers/helpers.core.js';\nimport {toRadians, isNumber, _limitValue} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport {_arrayUnique, _filterBetween, _lookup} from '../helpers/helpers.collection.js';\n\n/**\n * @typedef { import('../core/core.adapters.js').TimeUnit } Unit\n * @typedef {{common: boolean, size: number, steps?: number}} Interval\n * @typedef { import('../core/core.adapters.js').DateAdapter } DateAdapter\n */\n\n/**\n * @type {Object}\n */\nconst INTERVALS = {\n millisecond: {common: true, size: 1, steps: 1000},\n second: {common: true, size: 1000, steps: 60},\n minute: {common: true, size: 60000, steps: 60},\n hour: {common: true, size: 3600000, steps: 24},\n day: {common: true, size: 86400000, steps: 30},\n week: {common: false, size: 604800000, steps: 4},\n month: {common: true, size: 2.628e9, steps: 12},\n quarter: {common: false, size: 7.884e9, steps: 4},\n year: {common: true, size: 3.154e10}\n};\n\n/**\n * @type {Unit[]}\n */\nconst UNITS = /** @type Unit[] */ /* #__PURE__ */ (Object.keys(INTERVALS));\n\n/**\n * @param {number} a\n * @param {number} b\n */\nfunction sorter(a, b) {\n return a - b;\n}\n\n/**\n * @param {TimeScale} scale\n * @param {*} input\n * @return {number}\n */\nfunction parse(scale, input) {\n if (isNullOrUndef(input)) {\n return null;\n }\n\n const adapter = scale._adapter;\n const {parser, round, isoWeekday} = scale._parseOpts;\n let value = input;\n\n if (typeof parser === 'function') {\n value = parser(value);\n }\n\n // Only parse if it's not a timestamp already\n if (!isFinite(value)) {\n value = typeof parser === 'string'\n ? adapter.parse(value, parser)\n : adapter.parse(value);\n }\n\n if (value === null) {\n return null;\n }\n\n if (round) {\n value = round === 'week' && (isNumber(isoWeekday) || isoWeekday === true)\n ? adapter.startOf(value, 'isoWeek', isoWeekday)\n : adapter.startOf(value, round);\n }\n\n return +value;\n}\n\n/**\n * Figures out what unit results in an appropriate number of auto-generated ticks\n * @param {Unit} minUnit\n * @param {number} min\n * @param {number} max\n * @param {number} capacity\n * @return {object}\n */\nfunction determineUnitForAutoTicks(minUnit, min, max, capacity) {\n const ilen = UNITS.length;\n\n for (let i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {\n const interval = INTERVALS[UNITS[i]];\n const factor = interval.steps ? interval.steps : Number.MAX_SAFE_INTEGER;\n\n if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n return UNITS[i];\n }\n }\n\n return UNITS[ilen - 1];\n}\n\n/**\n * Figures out what unit to format a set of ticks with\n * @param {TimeScale} scale\n * @param {number} numTicks\n * @param {Unit} minUnit\n * @param {number} min\n * @param {number} max\n * @return {Unit}\n */\nfunction determineUnitForFormatting(scale, numTicks, minUnit, min, max) {\n for (let i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--) {\n const unit = UNITS[i];\n if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) {\n return unit;\n }\n }\n\n return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n}\n\n/**\n * @param {Unit} unit\n * @return {object}\n */\nfunction determineMajorUnit(unit) {\n for (let i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) {\n if (INTERVALS[UNITS[i]].common) {\n return UNITS[i];\n }\n }\n}\n\n/**\n * @param {object} ticks\n * @param {number} time\n * @param {number[]} [timestamps] - if defined, snap to these timestamps\n */\nfunction addTick(ticks, time, timestamps) {\n if (!timestamps) {\n ticks[time] = true;\n } else if (timestamps.length) {\n const {lo, hi} = _lookup(timestamps, time);\n const timestamp = timestamps[lo] >= time ? timestamps[lo] : timestamps[hi];\n ticks[timestamp] = true;\n }\n}\n\n/**\n * @param {TimeScale} scale\n * @param {object[]} ticks\n * @param {object} map\n * @param {Unit} majorUnit\n * @return {object[]}\n */\nfunction setMajorTicks(scale, ticks, map, majorUnit) {\n const adapter = scale._adapter;\n const first = +adapter.startOf(ticks[0].value, majorUnit);\n const last = ticks[ticks.length - 1].value;\n let major, index;\n\n for (major = first; major <= last; major = +adapter.add(major, 1, majorUnit)) {\n index = map[major];\n if (index >= 0) {\n ticks[index].major = true;\n }\n }\n return ticks;\n}\n\n/**\n * @param {TimeScale} scale\n * @param {number[]} values\n * @param {Unit|undefined} [majorUnit]\n * @return {object[]}\n */\nfunction ticksFromTimestamps(scale, values, majorUnit) {\n const ticks = [];\n /** @type {Object} */\n const map = {};\n const ilen = values.length;\n let i, value;\n\n for (i = 0; i < ilen; ++i) {\n value = values[i];\n map[value] = i;\n\n ticks.push({\n value,\n major: false\n });\n }\n\n // We set the major ticks separately from the above loop because calling startOf for every tick\n // is expensive when there is a large number of ticks\n return (ilen === 0 || !majorUnit) ? ticks : setMajorTicks(scale, ticks, map, majorUnit);\n}\n\nexport default class TimeScale extends Scale {\n\n static id = 'time';\n\n /**\n * @type {any}\n */\n static defaults = {\n /**\n * Scale boundary strategy (bypassed by min/max time options)\n * - `data`: make sure data are fully visible, ticks outside are removed\n * - `ticks`: make sure ticks are fully visible, data outside are truncated\n * @see https://github.com/chartjs/Chart.js/pull/4556\n * @since 2.7.0\n */\n bounds: 'data',\n\n adapters: {},\n time: {\n parser: false, // false == a pattern string from or a custom callback that converts its argument to a timestamp\n unit: false, // false == automatic or override with week, month, year, etc.\n round: false, // none, or override with week, month, year, etc.\n isoWeekday: false, // override week start day\n minUnit: 'millisecond',\n displayFormats: {}\n },\n ticks: {\n /**\n * Ticks generation input values:\n * - 'auto': generates \"optimal\" ticks based on scale size and time options.\n * - 'data': generates ticks from data (including labels from data {t|x|y} objects).\n * - 'labels': generates ticks from user given `data.labels` values ONLY.\n * @see https://github.com/chartjs/Chart.js/pull/4507\n * @since 2.7.0\n */\n source: 'auto',\n\n callback: false,\n\n major: {\n enabled: false\n }\n }\n };\n\n /**\n\t * @param {object} props\n\t */\n constructor(props) {\n super(props);\n\n /** @type {{data: number[], labels: number[], all: number[]}} */\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n\n /** @type {Unit} */\n this._unit = 'day';\n /** @type {Unit=} */\n this._majorUnit = undefined;\n this._offsets = {};\n this._normalized = false;\n this._parseOpts = undefined;\n }\n\n init(scaleOpts, opts = {}) {\n const time = scaleOpts.time || (scaleOpts.time = {});\n /** @type {DateAdapter} */\n const adapter = this._adapter = new adapters._date(scaleOpts.adapters.date);\n\n adapter.init(opts);\n\n // Backward compatibility: before introducing adapter, `displayFormats` was\n // supposed to contain *all* unit/string pairs but this can't be resolved\n // when loading the scale (adapters are loaded afterward), so let's populate\n // missing formats on update\n mergeIf(time.displayFormats, adapter.formats());\n\n this._parseOpts = {\n parser: time.parser,\n round: time.round,\n isoWeekday: time.isoWeekday\n };\n\n super.init(scaleOpts);\n\n this._normalized = opts.normalized;\n }\n\n /**\n\t * @param {*} raw\n\t * @param {number?} [index]\n\t * @return {number}\n\t */\n parse(raw, index) { // eslint-disable-line no-unused-vars\n if (raw === undefined) {\n return null;\n }\n return parse(this, raw);\n }\n\n beforeLayout() {\n super.beforeLayout();\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n }\n\n determineDataLimits() {\n const options = this.options;\n const adapter = this._adapter;\n const unit = options.time.unit || 'day';\n // eslint-disable-next-line prefer-const\n let {min, max, minDefined, maxDefined} = this.getUserBounds();\n\n /**\n\t\t * @param {object} bounds\n\t\t */\n function _applyBounds(bounds) {\n if (!minDefined && !isNaN(bounds.min)) {\n min = Math.min(min, bounds.min);\n }\n if (!maxDefined && !isNaN(bounds.max)) {\n max = Math.max(max, bounds.max);\n }\n }\n\n // If we have user provided `min` and `max` labels / data bounds can be ignored\n if (!minDefined || !maxDefined) {\n // Labels are always considered, when user did not force bounds\n _applyBounds(this._getLabelBounds());\n\n // If `bounds` is `'ticks'` and `ticks.source` is `'labels'`,\n // data bounds are ignored (and don't need to be determined)\n if (options.bounds !== 'ticks' || options.ticks.source !== 'labels') {\n _applyBounds(this.getMinMax(false));\n }\n }\n\n min = isFinite(min) && !isNaN(min) ? min : +adapter.startOf(Date.now(), unit);\n max = isFinite(max) && !isNaN(max) ? max : +adapter.endOf(Date.now(), unit) + 1;\n\n // Make sure that max is strictly higher than min (required by the timeseries lookup table)\n this.min = Math.min(min, max - 1);\n this.max = Math.max(min + 1, max);\n }\n\n /**\n\t * @private\n\t */\n _getLabelBounds() {\n const arr = this.getLabelTimestamps();\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n\n if (arr.length) {\n min = arr[0];\n max = arr[arr.length - 1];\n }\n return {min, max};\n }\n\n /**\n\t * @return {object[]}\n\t */\n buildTicks() {\n const options = this.options;\n const timeOpts = options.time;\n const tickOpts = options.ticks;\n const timestamps = tickOpts.source === 'labels' ? this.getLabelTimestamps() : this._generate();\n\n if (options.bounds === 'ticks' && timestamps.length) {\n this.min = this._userMin || timestamps[0];\n this.max = this._userMax || timestamps[timestamps.length - 1];\n }\n\n const min = this.min;\n const max = this.max;\n\n const ticks = _filterBetween(timestamps, min, max);\n\n // PRIVATE\n // determineUnitForFormatting relies on the number of ticks so we don't use it when\n // autoSkip is enabled because we don't yet know what the final number of ticks will be\n this._unit = timeOpts.unit || (tickOpts.autoSkip\n ? determineUnitForAutoTicks(timeOpts.minUnit, this.min, this.max, this._getLabelCapacity(min))\n : determineUnitForFormatting(this, ticks.length, timeOpts.minUnit, this.min, this.max));\n this._majorUnit = !tickOpts.major.enabled || this._unit === 'year' ? undefined\n : determineMajorUnit(this._unit);\n this.initOffsets(timestamps);\n\n if (options.reverse) {\n ticks.reverse();\n }\n\n return ticksFromTimestamps(this, ticks, this._majorUnit);\n }\n\n afterAutoSkip() {\n // Offsets for bar charts need to be handled with the auto skipped\n // ticks. Once ticks have been skipped, we re-compute the offsets.\n if (this.options.offsetAfterAutoskip) {\n this.initOffsets(this.ticks.map(tick => +tick.value));\n }\n }\n\n /**\n\t * Returns the start and end offsets from edges in the form of {start, end}\n\t * where each value is a relative width to the scale and ranges between 0 and 1.\n\t * They add extra margins on the both sides by scaling down the original scale.\n\t * Offsets are added when the `offset` option is true.\n\t * @param {number[]} timestamps\n\t * @protected\n\t */\n initOffsets(timestamps = []) {\n let start = 0;\n let end = 0;\n let first, last;\n\n if (this.options.offset && timestamps.length) {\n first = this.getDecimalForValue(timestamps[0]);\n if (timestamps.length === 1) {\n start = 1 - first;\n } else {\n start = (this.getDecimalForValue(timestamps[1]) - first) / 2;\n }\n last = this.getDecimalForValue(timestamps[timestamps.length - 1]);\n if (timestamps.length === 1) {\n end = last;\n } else {\n end = (last - this.getDecimalForValue(timestamps[timestamps.length - 2])) / 2;\n }\n }\n const limit = timestamps.length < 3 ? 0.5 : 0.25;\n start = _limitValue(start, 0, limit);\n end = _limitValue(end, 0, limit);\n\n this._offsets = {start, end, factor: 1 / (start + 1 + end)};\n }\n\n /**\n\t * Generates a maximum of `capacity` timestamps between min and max, rounded to the\n\t * `minor` unit using the given scale time `options`.\n\t * Important: this method can return ticks outside the min and max range, it's the\n\t * responsibility of the calling code to clamp values if needed.\n\t * @protected\n\t */\n _generate() {\n const adapter = this._adapter;\n const min = this.min;\n const max = this.max;\n const options = this.options;\n const timeOpts = options.time;\n // @ts-ignore\n const minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, this._getLabelCapacity(min));\n const stepSize = valueOrDefault(options.ticks.stepSize, 1);\n const weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n const hasWeekday = isNumber(weekday) || weekday === true;\n const ticks = {};\n let first = min;\n let time, count;\n\n // For 'week' unit, handle the first day of week option\n if (hasWeekday) {\n first = +adapter.startOf(first, 'isoWeek', weekday);\n }\n\n // Align first ticks on unit\n first = +adapter.startOf(first, hasWeekday ? 'day' : minor);\n\n // Prevent browser from freezing in case user options request millions of milliseconds\n if (adapter.diff(max, min, minor) > 100000 * stepSize) {\n throw new Error(min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor);\n }\n\n const timestamps = options.ticks.source === 'data' && this.getDataTimestamps();\n for (time = first, count = 0; time < max; time = +adapter.add(time, stepSize, minor), count++) {\n addTick(ticks, time, timestamps);\n }\n\n if (time === max || options.bounds === 'ticks' || count === 1) {\n addTick(ticks, time, timestamps);\n }\n\n // @ts-ignore\n return Object.keys(ticks).sort(sorter).map(x => +x);\n }\n\n /**\n\t * @param {number} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n const adapter = this._adapter;\n const timeOpts = this.options.time;\n\n if (timeOpts.tooltipFormat) {\n return adapter.format(value, timeOpts.tooltipFormat);\n }\n return adapter.format(value, timeOpts.displayFormats.datetime);\n }\n\n /**\n\t * @param {number} value\n\t * @param {string|undefined} format\n\t * @return {string}\n\t */\n format(value, format) {\n const options = this.options;\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const fmt = format || formats[unit];\n return this._adapter.format(value, fmt);\n }\n\n /**\n\t * Function to format an individual tick mark\n\t * @param {number} time\n\t * @param {number} index\n\t * @param {object[]} ticks\n\t * @param {string|undefined} [format]\n\t * @return {string}\n\t * @private\n\t */\n _tickFormatFunction(time, index, ticks, format) {\n const options = this.options;\n const formatter = options.ticks.callback;\n\n if (formatter) {\n return call(formatter, [time, index, ticks], this);\n }\n\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const majorUnit = this._majorUnit;\n const minorFormat = unit && formats[unit];\n const majorFormat = majorUnit && formats[majorUnit];\n const tick = ticks[index];\n const major = majorUnit && majorFormat && tick && tick.major;\n\n return this._adapter.format(time, format || (major ? majorFormat : minorFormat));\n }\n\n /**\n\t * @param {object[]} ticks\n\t */\n generateTickLabels(ticks) {\n let i, ilen, tick;\n\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n tick = ticks[i];\n tick.label = this._tickFormatFunction(tick.value, i, ticks);\n }\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getDecimalForValue(value) {\n return value === null ? NaN : (value - this.min) / (this.max - this.min);\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getPixelForValue(value) {\n const offsets = this._offsets;\n const pos = this.getDecimalForValue(value);\n return this.getPixelForDecimal((offsets.start + pos) * offsets.factor);\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const pos = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return this.min + pos * (this.max - this.min);\n }\n\n /**\n\t * @param {string} label\n\t * @return {{w:number, h:number}}\n\t * @private\n\t */\n _getLabelSize(label) {\n const ticksOpts = this.options.ticks;\n const tickLabelWidth = this.ctx.measureText(label).width;\n const angle = toRadians(this.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);\n const cosRotation = Math.cos(angle);\n const sinRotation = Math.sin(angle);\n const tickFontSize = this._resolveTickFontOptions(0).size;\n\n return {\n w: (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation),\n h: (tickLabelWidth * sinRotation) + (tickFontSize * cosRotation)\n };\n }\n\n /**\n\t * @param {number} exampleTime\n\t * @return {number}\n\t * @private\n\t */\n _getLabelCapacity(exampleTime) {\n const timeOpts = this.options.time;\n const displayFormats = timeOpts.displayFormats;\n\n // pick the longest format (milliseconds) for guesstimation\n const format = displayFormats[timeOpts.unit] || displayFormats.millisecond;\n const exampleLabel = this._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(this, [exampleTime], this._majorUnit), format);\n const size = this._getLabelSize(exampleLabel);\n // subtract 1 - if offset then there's one less label than tick\n // if not offset then one half label padding is added to each end leaving room for one less label\n const capacity = Math.floor(this.isHorizontal() ? this.width / size.w : this.height / size.h) - 1;\n return capacity > 0 ? capacity : 1;\n }\n\n /**\n\t * @protected\n\t */\n getDataTimestamps() {\n let timestamps = this._cache.data || [];\n let i, ilen;\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const metas = this.getMatchingVisibleMetas();\n\n if (this._normalized && metas.length) {\n return (this._cache.data = metas[0].controller.getAllParsedValues(this));\n }\n\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(this));\n }\n\n return (this._cache.data = this.normalize(timestamps));\n }\n\n /**\n\t * @protected\n\t */\n getLabelTimestamps() {\n const timestamps = this._cache.labels || [];\n let i, ilen;\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const labels = this.getLabels();\n for (i = 0, ilen = labels.length; i < ilen; ++i) {\n timestamps.push(parse(this, labels[i]));\n }\n\n return (this._cache.labels = this._normalized ? timestamps : this.normalize(timestamps));\n }\n\n /**\n\t * @param {number[]} values\n\t * @protected\n\t */\n normalize(values) {\n // It seems to be somewhat faster to do sorting first\n return _arrayUnique(values.sort(sorter));\n }\n}\n","import TimeScale from './scale.time.js';\nimport {_lookupByKey} from '../helpers/helpers.collection.js';\n\n/**\n * Linearly interpolates the given source `val` using the table. If value is out of bounds, values\n * at edges are used for the interpolation.\n * @param {object} table\n * @param {number} val\n * @param {boolean} [reverse] lookup time based on position instead of vice versa\n * @return {object}\n */\nfunction interpolate(table, val, reverse) {\n let lo = 0;\n let hi = table.length - 1;\n let prevSource, nextSource, prevTarget, nextTarget;\n if (reverse) {\n if (val >= table[lo].pos && val <= table[hi].pos) {\n ({lo, hi} = _lookupByKey(table, 'pos', val));\n }\n ({pos: prevSource, time: prevTarget} = table[lo]);\n ({pos: nextSource, time: nextTarget} = table[hi]);\n } else {\n if (val >= table[lo].time && val <= table[hi].time) {\n ({lo, hi} = _lookupByKey(table, 'time', val));\n }\n ({time: prevSource, pos: prevTarget} = table[lo]);\n ({time: nextSource, pos: nextTarget} = table[hi]);\n }\n\n const span = nextSource - prevSource;\n return span ? prevTarget + (nextTarget - prevTarget) * (val - prevSource) / span : prevTarget;\n}\n\nclass TimeSeriesScale extends TimeScale {\n\n static id = 'timeseries';\n\n /**\n * @type {any}\n */\n static defaults = TimeScale.defaults;\n\n /**\n\t * @param {object} props\n\t */\n constructor(props) {\n super(props);\n\n /** @type {object[]} */\n this._table = [];\n /** @type {number} */\n this._minPos = undefined;\n /** @type {number} */\n this._tableRange = undefined;\n }\n\n /**\n\t * @protected\n\t */\n initOffsets() {\n const timestamps = this._getTimestampsForTable();\n const table = this._table = this.buildLookupTable(timestamps);\n this._minPos = interpolate(table, this.min);\n this._tableRange = interpolate(table, this.max) - this._minPos;\n super.initOffsets(timestamps);\n }\n\n /**\n\t * Returns an array of {time, pos} objects used to interpolate a specific `time` or position\n\t * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is\n\t * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other\n\t * extremity (left + width or top + height). Note that it would be more optimized to directly\n\t * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need\n\t * to create the lookup table. The table ALWAYS contains at least two items: min and max.\n\t * @param {number[]} timestamps\n\t * @return {object[]}\n\t * @protected\n\t */\n buildLookupTable(timestamps) {\n const {min, max} = this;\n const items = [];\n const table = [];\n let i, ilen, prev, curr, next;\n\n for (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n curr = timestamps[i];\n if (curr >= min && curr <= max) {\n items.push(curr);\n }\n }\n\n if (items.length < 2) {\n // In case there is less that 2 timestamps between min and max, the scale is defined by min and max\n return [\n {time: min, pos: 0},\n {time: max, pos: 1}\n ];\n }\n\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n next = items[i + 1];\n prev = items[i - 1];\n curr = items[i];\n\n // only add points that breaks the scale linearity\n if (Math.round((next + prev) / 2) !== curr) {\n table.push({time: curr, pos: i / (ilen - 1)});\n }\n }\n return table;\n }\n\n /**\n * Generates all timestamps defined in the data.\n * Important: this method can return ticks outside the min and max range, it's the\n * responsibility of the calling code to clamp values if needed.\n * @protected\n */\n _generate() {\n const min = this.min;\n const max = this.max;\n let timestamps = super.getDataTimestamps();\n if (!timestamps.includes(min) || !timestamps.length) {\n timestamps.splice(0, 0, min);\n }\n if (!timestamps.includes(max) || timestamps.length === 1) {\n timestamps.push(max);\n }\n return timestamps.sort((a, b) => a - b);\n }\n\n /**\n\t * Returns all timestamps\n\t * @return {number[]}\n\t * @private\n\t */\n _getTimestampsForTable() {\n let timestamps = this._cache.all || [];\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const data = this.getDataTimestamps();\n const label = this.getLabelTimestamps();\n if (data.length && label.length) {\n // If combining labels and data (data might not contain all labels),\n // we need to recheck uniqueness and sort\n timestamps = this.normalize(data.concat(label));\n } else {\n timestamps = data.length ? data : label;\n }\n timestamps = this._cache.all = timestamps;\n\n return timestamps;\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getDecimalForValue(value) {\n return (interpolate(this._table, value) - this._minPos) / this._tableRange;\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const decimal = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return interpolate(this._table, decimal * this._tableRange + this._minPos, true);\n }\n}\n\nexport default TimeSeriesScale;\n","import type { PropType } from 'vue'\nimport type {\n ChartType,\n ChartData,\n ChartOptions,\n Plugin,\n UpdateMode\n} from 'chart.js'\n\nexport const CommonProps = {\n data: {\n type: Object as PropType,\n required: true\n },\n options: {\n type: Object as PropType,\n default: () => ({})\n },\n plugins: {\n type: Array as PropType,\n default: () => []\n },\n datasetIdKey: {\n type: String,\n default: 'label'\n },\n updateMode: {\n type: String as PropType,\n default: undefined\n }\n} as const\n\nexport const A11yProps = {\n ariaLabel: {\n type: String\n },\n ariaDescribedby: {\n type: String\n }\n} as const\n\nexport const Props = {\n type: {\n type: String as PropType,\n required: true\n },\n destroyDelay: {\n type: Number,\n default: 0 // No delay by default\n },\n ...CommonProps,\n ...A11yProps\n} as const\n","import { isProxy, toRaw, version } from 'vue'\nimport type {\n Chart,\n ChartType,\n ChartData,\n ChartDataset,\n ChartOptions,\n DefaultDataPoint\n} from 'chart.js'\n\nexport const compatProps =\n version[0] === '2'\n ? (internals: I, props: T) =>\n Object.assign(internals, { attrs: props }) as unknown as I & T\n : (internals: I, props: T) =>\n Object.assign(internals, props)\n\nexport function toRawIfProxy(obj: T) {\n return isProxy(obj) ? toRaw(obj) : obj\n}\n\nexport function cloneProxy(obj: T, src = obj) {\n return isProxy(src) ? new Proxy(obj, {}) : obj\n}\n\nexport function setOptions<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(chart: Chart, nextOptions: ChartOptions) {\n const options = chart.options\n\n if (options && nextOptions) {\n Object.assign(options, nextOptions)\n }\n}\n\nexport function setLabels<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(\n currentData: ChartData,\n nextLabels: TLabel[] | undefined\n) {\n currentData.labels = nextLabels\n}\n\nexport function setDatasets<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(\n currentData: ChartData,\n nextDatasets: ChartDataset[],\n datasetIdKey: string\n) {\n const addedDatasets: ChartDataset[] = []\n\n currentData.datasets = nextDatasets.map(\n (nextDataset: Record) => {\n // given the new set, find it's current match\n const currentDataset = currentData.datasets.find(\n (dataset: Record) =>\n dataset[datasetIdKey] === nextDataset[datasetIdKey]\n )\n\n // There is no original to update, so simply add new one\n if (\n !currentDataset ||\n !nextDataset.data ||\n addedDatasets.includes(currentDataset)\n ) {\n return { ...nextDataset } as ChartDataset\n }\n\n addedDatasets.push(currentDataset)\n\n Object.assign(currentDataset, nextDataset)\n\n return currentDataset\n }\n )\n}\n\nexport function cloneData<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(data: ChartData, datasetIdKey: string) {\n const nextData: ChartData = {\n labels: [],\n datasets: []\n }\n\n setLabels(nextData, data.labels)\n setDatasets(nextData, data.datasets, datasetIdKey)\n\n return nextData\n}\n\n/**\n * Get dataset from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getDatasetAtEvent(chart: Chart, event: MouseEvent) {\n return chart.getElementsAtEventForMode(\n event,\n 'dataset',\n { intersect: true },\n false\n )\n}\n\n/**\n * Get single dataset element from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getElementAtEvent(chart: Chart, event: MouseEvent) {\n return chart.getElementsAtEventForMode(\n event,\n 'nearest',\n { intersect: true },\n false\n )\n}\n\n/**\n * Get all dataset elements from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getElementsAtEvent(chart: Chart, event: MouseEvent) {\n return chart.getElementsAtEventForMode(\n event,\n 'index',\n { intersect: true },\n false\n )\n}\n","import { Chart as ChartJS } from 'chart.js'\nimport {\n defineComponent,\n h,\n nextTick,\n onUnmounted,\n onMounted,\n ref,\n shallowRef,\n toRaw,\n watch\n} from 'vue'\n\nimport type { ChartComponent } from './types.js'\nimport { Props } from './props.js'\nimport {\n cloneData,\n setLabels,\n setDatasets,\n setOptions,\n toRawIfProxy,\n cloneProxy\n} from './utils.js'\n\nexport const Chart = defineComponent({\n props: Props,\n setup(props, { expose, slots }) {\n const canvasRef = ref(null)\n const chartRef = shallowRef(null)\n\n expose({ chart: chartRef })\n\n const renderChart = () => {\n if (!canvasRef.value) return\n\n const { type, data, options, plugins, datasetIdKey } = props\n const clonedData = cloneData(data, datasetIdKey)\n const proxiedData = cloneProxy(clonedData, data)\n\n chartRef.value = new ChartJS(canvasRef.value, {\n type,\n data: proxiedData,\n options: { ...options },\n plugins\n })\n }\n\n const destroyChart = () => {\n const chart = toRaw(chartRef.value)\n\n if (chart) {\n if (props.destroyDelay > 0) {\n setTimeout(() => {\n chart.destroy()\n chartRef.value = null\n }, props.destroyDelay)\n } else {\n chart.destroy()\n chartRef.value = null\n }\n }\n }\n\n const update = (chart: ChartJS) => {\n chart.update(props.updateMode)\n }\n\n onMounted(renderChart)\n\n onUnmounted(destroyChart)\n\n watch(\n [() => props.options, () => props.data],\n (\n [nextOptionsProxy, nextDataProxy],\n [prevOptionsProxy, prevDataProxy]\n ) => {\n const chart = toRaw(chartRef.value)\n\n if (!chart) {\n return\n }\n\n let shouldUpdate = false\n\n if (nextOptionsProxy) {\n const nextOptions = toRawIfProxy(nextOptionsProxy)\n const prevOptions = toRawIfProxy(prevOptionsProxy)\n\n if (nextOptions && nextOptions !== prevOptions) {\n setOptions(chart, nextOptions)\n shouldUpdate = true\n }\n }\n\n if (nextDataProxy) {\n const nextLabels = toRawIfProxy(nextDataProxy.labels)\n const prevLabels = toRawIfProxy(prevDataProxy.labels)\n const nextDatasets = toRawIfProxy(nextDataProxy.datasets)\n const prevDatasets = toRawIfProxy(prevDataProxy.datasets)\n\n if (nextLabels !== prevLabels) {\n setLabels(chart.config.data, nextLabels)\n shouldUpdate = true\n }\n\n if (nextDatasets && nextDatasets !== prevDatasets) {\n setDatasets(chart.config.data, nextDatasets, props.datasetIdKey)\n shouldUpdate = true\n }\n }\n\n if (shouldUpdate) {\n nextTick(() => {\n update(chart)\n })\n }\n },\n { deep: true }\n )\n\n return () => {\n return h(\n 'canvas',\n {\n role: 'img',\n 'aria-label': props.ariaLabel,\n 'aria-describedby': props.ariaDescribedby,\n ref: canvasRef\n },\n [h('p', {}, [slots.default ? slots.default() : ''])]\n )\n }\n }\n}) as ChartComponent\n","import { defineComponent, shallowRef, h } from 'vue'\nimport type { ChartType, ChartComponentLike, DefaultDataPoint } from 'chart.js'\nimport {\n Chart as ChartJS,\n BarController,\n BubbleController,\n DoughnutController,\n LineController,\n PieController,\n PolarAreaController,\n RadarController,\n ScatterController\n} from 'chart.js'\nimport type { DistributiveArray } from 'chart.js/dist/types/utils'\nimport type { TypedChartComponent, ChartComponentRef } from './types.js'\nimport { CommonProps } from './props.js'\nimport { Chart } from './chart.js'\nimport { compatProps } from './utils.js'\n\nexport function createTypedChart<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(\n type: TType,\n registerables: ChartComponentLike\n): TypedChartComponent {\n ChartJS.register(registerables)\n\n return defineComponent({\n props: CommonProps,\n setup(props, { expose }) {\n const ref = shallowRef(null)\n const reforwardRef = (chartRef: ChartComponentRef) => {\n ref.value = chartRef?.chart\n }\n\n expose({ chart: ref })\n\n return () => {\n return h(\n Chart,\n compatProps(\n {\n ref: reforwardRef as any\n },\n {\n type,\n ...props\n }\n )\n )\n }\n }\n }) as any\n}\n\nexport interface ExtendedDataPoint {\n [key: string]: string | number | null | ExtendedDataPoint\n}\n\nexport const Bar = /* #__PURE__ */ createTypedChart<\n 'bar',\n DefaultDataPoint<'bar'> | DistributiveArray\n>('bar', BarController)\n\nexport const Doughnut = /* #__PURE__ */ createTypedChart(\n 'doughnut',\n DoughnutController\n)\n\nexport const Line = /* #__PURE__ */ createTypedChart('line', LineController)\n\nexport const Pie = /* #__PURE__ */ createTypedChart('pie', PieController)\n\nexport const PolarArea = /* #__PURE__ */ createTypedChart(\n 'polarArea',\n PolarAreaController\n)\n\nexport const Radar = /* #__PURE__ */ createTypedChart('radar', RadarController)\n\nexport const Bubble = /* #__PURE__ */ createTypedChart(\n 'bubble',\n BubbleController\n)\n\nexport const Scatter = /* #__PURE__ */ createTypedChart(\n 'scatter',\n ScatterController\n)\n","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport \"core-js/modules/es.iterator.reduce.js\";\nimport \"core-js/modules/web.url-search-params.delete.js\";\nimport \"core-js/modules/web.url-search-params.has.js\";\nimport \"core-js/modules/web.url-search-params.size.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport packageInfo from '../../package.json';\nimport { Doughnut } from 'vue-chartjs';\nimport { Chart as ChartJS, ArcElement, Tooltip, Legend } from 'chart.js';\nChartJS.register(ArcElement, Tooltip, Legend);\nexport default {\n name: 'SysCogStatus',\n components: {\n Doughnut\n },\n data() {\n return {\n loading: false,\n rebuilding: false,\n backing: false,\n restoring: false,\n indexInfo: {},\n version: packageInfo.version,\n // 从package.json获取版本号\n loadErrors: {\n newest: false,\n oldest: false\n },\n // 渠道图表颜色\n channelColors: ['#8B5CF6', '#EC4899', '#06B6D4', '#10B981', '#F59E0B', '#EF4444', '#6366F1', '#84CC16'],\n // 状态图表颜色\n typeColors: ['#10B981', '#3B82F6', '#F59E0B', '#EF4444', '#8B5CF6', '#EC4899', '#06B6D4', '#84CC16']\n };\n },\n computed: {\n // 渠道分布图表数据\n channelChartData() {\n const stats = this.indexInfo.channelStats || {};\n return {\n labels: Object.keys(stats),\n datasets: [{\n data: Object.values(stats),\n backgroundColor: this.channelColors.slice(0, Object.keys(stats).length),\n borderWidth: 0\n }]\n };\n },\n // 文件状态图表数据\n typeChartData() {\n const stats = this.indexInfo.typeStats || {};\n return {\n labels: Object.keys(stats).map(k => k || '未知类型'),\n datasets: [{\n data: Object.values(stats),\n backgroundColor: this.typeColors.slice(0, Object.keys(stats).length),\n borderWidth: 0\n }]\n };\n },\n // 图表配置\n chartOptions() {\n return {\n responsive: true,\n maintainAspectRatio: true,\n cutout: '65%',\n plugins: {\n legend: {\n display: false\n },\n tooltip: {\n backgroundColor: 'rgba(0, 0, 0, 0.8)',\n titleColor: '#fff',\n bodyColor: '#fff',\n padding: 12,\n cornerRadius: 8,\n displayColors: true,\n callbacks: {\n label: context => {\n const value = context.raw;\n const total = context.dataset.data.reduce((a, b) => a + b, 0);\n const percentage = (value / total * 100).toFixed(1);\n return ` ${value.toLocaleString()} (${percentage}%)`;\n }\n }\n }\n },\n animation: {\n animateRotate: true,\n animateScale: true\n }\n };\n }\n },\n mounted() {\n this.fetchIndexInfo();\n },\n methods: {\n // 获取渠道图表颜色\n getChartColor(index) {\n return this.channelColors[index % this.channelColors.length];\n },\n // 获取状态图表颜色\n getTypeChartColor(index) {\n return this.typeColors[index % this.typeColors.length];\n },\n // 获取索引信息\n async fetchIndexInfo() {\n this.loading = true;\n try {\n const response = await fetchWithAuth('/api/manage/list?action=info', {\n method: 'GET'\n });\n if (response.ok) {\n const data = await response.json();\n this.indexInfo = data;\n } else {\n throw new Error('API请求失败');\n }\n } catch (error) {\n console.error('获取索引信息失败:', error);\n this.$message.error('获取索引信息失败');\n } finally {\n this.loading = false;\n }\n },\n // 重建索引\n async rebuildIndex() {\n this.rebuilding = true;\n try {\n const response = await fetchWithAuth('/api/manage/list?action=rebuild', {\n method: 'GET'\n });\n if (response.ok) {\n this.$message.success('索引重建已启动,请稍后刷新查看最新状态');\n // 延迟刷新数据\n setTimeout(() => {\n this.fetchIndexInfo();\n }, 3000);\n } else {\n throw new Error('API请求失败');\n }\n } catch (error) {\n console.error('重建索引失败:', error);\n this.$message.error('重建索引失败');\n } finally {\n this.rebuilding = false;\n }\n },\n // 备份数据\n async backupData() {\n this.backing = true;\n try {\n const response = await fetchWithAuth('/api/manage/sysConfig/backup?action=backup', {\n method: 'GET'\n });\n if (response.ok) {\n // 创建下载链接\n const blob = await response.blob();\n const url = window.URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `imgbed_backup_${new Date().toISOString().split('T')[0]}.json`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n window.URL.revokeObjectURL(url);\n this.$message.success('备份文件已下载');\n } else {\n const errorData = await response.json();\n throw new Error(errorData.error || 'API请求失败');\n }\n } catch (error) {\n console.error('备份数据失败:', error);\n this.$message.error('备份数据失败: ' + error.message);\n } finally {\n this.backing = false;\n }\n },\n // 选择恢复文件\n selectRestoreFile() {\n if (this.restoring) return;\n this.$refs.fileInput.click();\n },\n // 处理文件选择\n async handleFileSelect(event) {\n const file = event.target.files[0];\n if (!file) return;\n if (!file.name.endsWith('.json')) {\n this.$message.error('请选择JSON格式的备份文件');\n return;\n }\n\n // 确认恢复操作\n try {\n await this.$confirm('恢复操作将覆盖现有的文件元数据和系统设置,此操作不可逆。确定要继续吗?', '确认恢复', {\n confirmButtonText: '确定恢复',\n cancelButtonText: '取消',\n type: 'warning'\n });\n await this.restoreData(file);\n } catch (error) {\n if (error !== 'cancel') {\n console.error('确认恢复失败:', error);\n }\n }\n\n // 清除文件选择\n event.target.value = '';\n },\n // 恢复数据\n async restoreData(file) {\n this.restoring = true;\n try {\n const response = await fetchWithAuth('/api/manage/sysConfig/backup?action=restore', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: await file.text()\n });\n if (response.ok) {\n const result = await response.json();\n this.$message.success(`恢复完成!已恢复 ${result.stats.restoredFiles} 个文件和 ${result.stats.restoredSettings} 个设置项`);\n // 刷新索引信息\n setTimeout(() => {\n this.fetchIndexInfo();\n }, 1000);\n } else {\n const errorData = await response.json();\n throw new Error(errorData.error || 'API请求失败');\n }\n } catch (error) {\n console.error('恢复数据失败:', error);\n this.$message.error('恢复数据失败: ' + error.message);\n } finally {\n this.restoring = false;\n }\n },\n // 格式化时间\n formatTime(timestamp) {\n if (!timestamp) return '未知';\n const date = new Date(timestamp);\n return date.toLocaleString('zh-CN', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit'\n });\n },\n // 计算百分比\n getPercentage(value, total) {\n if (!total || total === 0) return 0;\n return Math.round(value / total * 100);\n },\n // 计算时间差\n getTimeAgo(timestamp) {\n if (!timestamp) return '';\n const now = Date.now();\n const diff = now - timestamp;\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\n const days = Math.floor(diff / 86400000);\n if (days > 0) return `${days}天前`;\n if (hours > 0) return `${hours}小时前`;\n if (minutes > 0) return `${minutes}分钟前`;\n return '刚刚';\n },\n // 图片加载失败处理\n handleImageError(type) {\n this.loadErrors[type] = true;\n },\n // 检查是否应该显示预览图\n isValidPreview(type, file) {\n if (this.loadErrors[type]) return false;\n if (!file?.metadata?.FileType) return false;\n return file.metadata.FileType.includes('image') || file.metadata.FileType.includes('video');\n },\n // 打开发布页面\n openReleases() {\n window.open('https://github.com/MarSeventh/CloudFlare-ImgBed/releases', '_blank');\n },\n // 判断是否为图片文件\n isImageFile(file) {\n if (!file) return false;\n // 优先通过 FileType 判断\n if (file.metadata?.FileType?.includes('image')) return true;\n // 通过文件名后缀判断\n const fileName = file.metadata?.FileName || file.id || '';\n const extension = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();\n const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg', 'ico', 'tiff', 'tif', 'avif', 'heic', 'heif'];\n return imageExtensions.includes(extension);\n },\n // 判断是否为视频文件\n isVideoFile(file) {\n if (!file) return false;\n // 优先通过 FileType 判断\n if (file.metadata?.FileType?.includes('video')) return true;\n // 通过文件名后缀判断\n const fileName = file.metadata?.FileName || file.id || '';\n const extension = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();\n const videoExtensions = ['mp4', 'webm', 'ogg', 'avi', 'mov', 'flv', 'wmv', 'mkv', 'm4v', '3gp', 'mpeg', 'mpg'];\n return videoExtensions.includes(extension);\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogStatus.vue?vue&type=template&id=54756a6a&scoped=true\"\nimport script from \"./SysCogStatus.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogStatus.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogStatus.vue?vue&type=style&index=0&id=54756a6a&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-54756a6a\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createTextVNode as _createTextVNode, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, createBlock as _createBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"upload-settings\"\n};\nconst _hoisted_2 = {\n class: \"upload-channel\"\n};\nconst _hoisted_3 = {\n class: \"first-title\"\n};\nconst _hoisted_4 = {\n class: \"channel-settings\"\n};\nconst _hoisted_5 = {\n class: \"second-title\"\n};\nconst _hoisted_6 = {\n key: 0\n};\nconst _hoisted_7 = {\n key: 1\n};\nconst _hoisted_8 = {\n class: \"quota-status\"\n};\nconst _hoisted_9 = {\n key: 2\n};\nconst _hoisted_10 = {\n class: \"quota-status\"\n};\nconst _hoisted_11 = {\n key: 3\n};\nconst _hoisted_12 = {\n class: \"discord-limit-tip\"\n};\nconst _hoisted_13 = {\n key: 4\n};\nconst _hoisted_14 = {\n class: \"huggingface-tip\"\n};\nconst _hoisted_15 = {\n class: \"actions\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_radio = _resolveComponent(\"el-radio\");\n const _component_el_radio_group = _resolveComponent(\"el-radio-group\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_input_number = _resolveComponent(\"el-input-number\");\n const _component_el_progress = _resolveComponent(\"el-progress\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h3\", _hoisted_3, [_cache[5] || (_cache[5] = _createTextVNode(\"上传渠道 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"设置每类上传渠道的详细配置
点击“保存设置”会同时保存对每类配置的修改\",\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]), _createVNode(_component_el_radio_group, {\n modelValue: $data.activeChannel,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.activeChannel = $event)\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.channels, channel => {\n return _openBlock(), _createBlock(_component_el_radio, {\n key: channel.value,\n label: channel.value\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(channel.label), 1)]),\n _: 2\n }, 1032, [\"label\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\"])]), _createElementVNode(\"div\", _hoisted_4, [_createElementVNode(\"h4\", _hoisted_5, [_createTextVNode(_toDisplayString($options.activeChannelLabel) + \" 设置 \", 1), $data.activeChannel === 'telegram' ? (_openBlock(), _createBlock(_component_el_tooltip, {\n key: 0,\n content: \"为保证兼容性,v2版本前设置的 Telegram 相关环境变量请保留\",\n placement: \"right\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })) : _createCommentVNode(\"\", true)]), $data.activeChannel === 'telegram' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_6, [_createVNode(_component_el_form, {\n model: $data.telegramSettings,\n \"label-position\": \"top\",\n class: \"channel-form\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"负载均衡\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.telegramSettings.loadBalance.enabled,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $data.telegramSettings.loadBalance.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.telegramSettings.channels, (channel, index) => {\n return _openBlock(), _createBlock(_component_el_form, {\n key: index,\n model: channel,\n \"label-position\": \"top\",\n rules: $data.tgRules,\n ref_for: true,\n ref: \"tgChannelForm\",\n class: \"channel-form\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"渠道名\",\n prop: \"name\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.name,\n \"onUpdate:modelValue\": $event => channel.name = $event,\n disabled: channel.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"启用渠道\",\n prop: \"enabled\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: channel.enabled,\n \"onUpdate:modelValue\": $event => channel.enabled = $event\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"Bot Token\",\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.botToken,\n \"onUpdate:modelValue\": $event => channel.botToken = $event,\n disabled: channel.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"Chat ID\",\n prop: \"chatId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.chatId,\n \"onUpdate:modelValue\": $event => channel.chatId = $event,\n disabled: channel.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, null, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n type: \"danger\",\n onClick: $event => $options.deleteChannel(index),\n size: \"small\",\n disabled: channel.fixed\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"])]),\n _: 2\n }, 1024)]),\n _: 2\n }, 1032, [\"model\", \"rules\"]);\n }), 128))])) : _createCommentVNode(\"\", true), $data.activeChannel === 'cfr2' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.cfr2Settings.channels, (channel, index) => {\n return _openBlock(), _createBlock(_component_el_form, {\n model: channel,\n \"label-position\": \"top\",\n class: \"channel-form\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"渠道名\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.name,\n \"onUpdate:modelValue\": $event => channel.name = $event,\n disabled: channel.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"启用渠道\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: channel.enabled,\n \"onUpdate:modelValue\": $event => channel.enabled = $event\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_cache[6] || (_cache[6] = _createTextVNode(\" 公开访问链接 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"若启用图像审查,请设置该项\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.publicUrl,\n \"onUpdate:modelValue\": $event => channel.publicUrl = $event\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_cache[7] || (_cache[7] = _createTextVNode(\" 容量限制 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"启用后,当存储容量达到阈值时,该渠道将自动停止接收新文件,上传会自动切换到其他可用渠道\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: channel.quota.enabled,\n \"onUpdate:modelValue\": $event => channel.quota.enabled = $event,\n onChange: val => $options.onQuotaEnabledChange(val, channel)\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"onChange\"])]),\n _: 2\n }, 1024), channel.quota.enabled ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: \"容量上限 (GB)\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: channel.quota.limitGB,\n \"onUpdate:modelValue\": $event => channel.quota.limitGB = $event,\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024)) : _createCommentVNode(\"\", true), channel.quota.enabled ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 1\n }, {\n label: _withCtx(() => [_cache[8] || (_cache[8] = _createTextVNode(\" 阈值 (%) \", -1)), _createVNode(_component_el_tooltip, {\n content: \"当已用容量达到此百分比时停止写入,默认95%\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: channel.quota.threshold,\n \"onUpdate:modelValue\": $event => channel.quota.threshold = $event,\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024)) : _createCommentVNode(\"\", true), channel.quota.enabled && channel.name ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 2\n }, {\n label: _withCtx(() => [_cache[9] || (_cache[9] = _createTextVNode(\" 当前用量 \", -1)), _createVNode(_component_el_button, {\n link: \"\",\n type: \"primary\",\n onClick: $options.refreshQuota,\n loading: $data.quotaLoading,\n style: {\n \"margin-left\": \"8px\"\n }\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sync-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"loading\"])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_8, [_createVNode(_component_el_progress, {\n percentage: $options.getQuotaPercentage(channel),\n status: $options.getQuotaStatus(channel),\n \"stroke-width\": 20,\n \"text-inside\": true,\n format: () => $options.getQuotaText(channel)\n }, null, 8, [\"percentage\", \"status\", \"format\"]), _createElementVNode(\"div\", {\n class: _normalizeClass([\"quota-info\", {\n 'quota-warning': $options.isQuotaExceeded(channel)\n }])\n }, _toDisplayString($options.getQuotaStatusText(channel)), 3)])]),\n _: 2\n }, 1024)) : _createCommentVNode(\"\", true)]),\n _: 2\n }, 1032, [\"model\"]);\n }), 256))])) : _createCommentVNode(\"\", true), $data.activeChannel === 's3' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_9, [_createVNode(_component_el_form, {\n model: $data.s3Settings,\n \"label-position\": \"top\",\n class: \"channel-form\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"负载均衡\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.s3Settings.loadBalance.enabled,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.s3Settings.loadBalance.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.s3Settings.channels, (channel, index) => {\n return _openBlock(), _createBlock(_component_el_form, {\n model: channel,\n \"label-position\": \"top\",\n rules: $data.s3Rules,\n ref_for: true,\n ref: \"s3ChannelForm\",\n class: \"channel-form\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"渠道名\",\n prop: \"name\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.name,\n \"onUpdate:modelValue\": $event => channel.name = $event,\n disabled: channel.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"启用渠道\",\n prop: \"enabled\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: channel.enabled,\n \"onUpdate:modelValue\": $event => channel.enabled = $event\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n prop: \"endpoint\"\n }, {\n label: _withCtx(() => [_cache[10] || (_cache[10] = _createTextVNode(\" Endpoint \", -1)), _createVNode(_component_el_tooltip, {\n content: \"服务提供商 Endpoint,例如 https://s3.us-east-005.backblazeb2.com\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.endpoint,\n \"onUpdate:modelValue\": $event => channel.endpoint = $event,\n disabled: channel.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"路径风格\",\n prop: \"pathStyle\"\n }, {\n label: _withCtx(() => [_cache[11] || (_cache[11] = _createTextVNode(\" 路径风格 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"S3 路径风格/虚拟主机风格,使用 OpenList 作为 S3 提供者时需打开此开关
路径风格:https://s3.example.com/下方存储桶名称/文件路径
虚拟主机风格:https://下方存储桶名称.s3.example.com/文件路径\",\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: channel.pathStyle,\n \"onUpdate:modelValue\": $event => channel.pathStyle = $event,\n disabled: channel.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"存储桶名称\",\n prop: \"bucketName\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.bucketName,\n \"onUpdate:modelValue\": $event => channel.bucketName = $event,\n disabled: channel.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"存储桶区域\",\n prop: \"region\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.region,\n \"onUpdate:modelValue\": $event => channel.region = $event,\n placeholder: \"默认填写 auto 即可\",\n disabled: channel.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"访问密钥 ID\",\n prop: \"accessKeyId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.accessKeyId,\n \"onUpdate:modelValue\": $event => channel.accessKeyId = $event,\n disabled: channel.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"机密访问密钥\",\n prop: \"secretAccessKey\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.secretAccessKey,\n \"onUpdate:modelValue\": $event => channel.secretAccessKey = $event,\n disabled: channel.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_cache[12] || (_cache[12] = _createTextVNode(\" 容量限制 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"启用后,当存储容量达到阈值时,该渠道将自动停止接收新文件,上传会自动切换到其他可用渠道\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: channel.quota.enabled,\n \"onUpdate:modelValue\": $event => channel.quota.enabled = $event,\n onChange: val => $options.onQuotaEnabledChange(val, channel)\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"onChange\"])]),\n _: 2\n }, 1024), channel.quota.enabled ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: \"容量上限 (GB)\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: channel.quota.limitGB,\n \"onUpdate:modelValue\": $event => channel.quota.limitGB = $event,\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024)) : _createCommentVNode(\"\", true), channel.quota.enabled ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 1\n }, {\n label: _withCtx(() => [_cache[13] || (_cache[13] = _createTextVNode(\" 阈值 (%) \", -1)), _createVNode(_component_el_tooltip, {\n content: \"当已用容量达到此百分比时停止写入,默认95%\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: channel.quota.threshold,\n \"onUpdate:modelValue\": $event => channel.quota.threshold = $event,\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024)) : _createCommentVNode(\"\", true), channel.quota.enabled && channel.name ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 2\n }, {\n label: _withCtx(() => [_cache[14] || (_cache[14] = _createTextVNode(\" 当前用量 \", -1)), _createVNode(_component_el_button, {\n link: \"\",\n type: \"primary\",\n onClick: $options.refreshQuota,\n loading: $data.quotaLoading,\n style: {\n \"margin-left\": \"8px\"\n }\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sync-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"loading\"])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_10, [_createVNode(_component_el_progress, {\n percentage: $options.getQuotaPercentage(channel),\n status: $options.getQuotaStatus(channel),\n \"stroke-width\": 20,\n \"text-inside\": true,\n format: () => $options.getQuotaText(channel)\n }, null, 8, [\"percentage\", \"status\", \"format\"]), _createElementVNode(\"div\", {\n class: _normalizeClass([\"quota-info\", {\n 'quota-warning': $options.isQuotaExceeded(channel)\n }])\n }, _toDisplayString($options.getQuotaStatusText(channel)), 3)])]),\n _: 2\n }, 1024)) : _createCommentVNode(\"\", true), _createVNode(_component_el_form_item, null, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n type: \"danger\",\n onClick: $event => $options.deleteChannel(index),\n size: \"small\",\n disabled: channel.fixed\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"])]),\n _: 2\n }, 1024)]),\n _: 2\n }, 1032, [\"model\", \"rules\"]);\n }), 256))])) : _createCommentVNode(\"\", true), $data.activeChannel === 'discord' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_11, [_createVNode(_component_el_form, {\n model: $data.discordSettings,\n \"label-position\": \"top\",\n class: \"channel-form\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"负载均衡\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.discordSettings.loadBalance.enabled,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.discordSettings.loadBalance.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.discordSettings.channels, (channel, index) => {\n return _openBlock(), _createBlock(_component_el_form, {\n key: index,\n model: channel,\n \"label-position\": \"top\",\n rules: $data.discordRules,\n ref_for: true,\n ref: \"discordChannelForm\",\n class: \"channel-form\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"渠道名\",\n prop: \"name\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.name,\n \"onUpdate:modelValue\": $event => channel.name = $event,\n disabled: channel.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"启用渠道\",\n prop: \"enabled\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: channel.enabled,\n \"onUpdate:modelValue\": $event => channel.enabled = $event\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"Bot Token\",\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.botToken,\n \"onUpdate:modelValue\": $event => channel.botToken = $event,\n disabled: channel.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"Channel ID\",\n prop: \"channelId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.channelId,\n \"onUpdate:modelValue\": $event => channel.channelId = $event,\n disabled: channel.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_cache[15] || (_cache[15] = _createTextVNode(\" 代理域名 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"可选,用于国内访问 Discord CDN,填写代理域名(不含 https://)\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.proxyUrl,\n \"onUpdate:modelValue\": $event => channel.proxyUrl = $event,\n placeholder: \"例如: your-proxy.example.com\"\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_cache[16] || (_cache[16] = _createTextVNode(\" Nitro 会员 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"开启后单文件限制提升至 25MB,关闭则为 10MB\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: channel.isNitro,\n \"onUpdate:modelValue\": $event => channel.isNitro = $event\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, null, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_12, [_createVNode(_component_font_awesome_icon, {\n icon: \"info-circle\",\n style: {\n \"margin-right\": \"5px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(channel.isNitro ? 'Nitro 会员单文件限制 25MB,超过将自动切换其他渠道' : 'Discord 免费用户单文件限制 10MB,超过将自动切换其他渠道'), 1)])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, null, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n type: \"danger\",\n onClick: $event => $options.deleteChannel(index),\n size: \"small\",\n disabled: channel.fixed\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"])]),\n _: 2\n }, 1024)]),\n _: 2\n }, 1032, [\"model\", \"rules\"]);\n }), 128))])) : _createCommentVNode(\"\", true), $data.activeChannel === 'huggingface' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_13, [_createVNode(_component_el_form, {\n model: $data.huggingfaceSettings,\n \"label-position\": \"top\",\n class: \"channel-form\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"负载均衡\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.huggingfaceSettings.loadBalance.enabled,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.huggingfaceSettings.loadBalance.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.huggingfaceSettings.channels, (channel, index) => {\n return _openBlock(), _createBlock(_component_el_form, {\n key: index,\n model: channel,\n \"label-position\": \"top\",\n rules: $data.huggingfaceRules,\n ref_for: true,\n ref: \"huggingfaceChannelForm\",\n class: \"channel-form\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"渠道名\",\n prop: \"name\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.name,\n \"onUpdate:modelValue\": $event => channel.name = $event,\n disabled: channel.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"启用渠道\",\n prop: \"enabled\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: channel.enabled,\n \"onUpdate:modelValue\": $event => channel.enabled = $event\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n prop: \"repo\"\n }, {\n label: _withCtx(() => [_cache[17] || (_cache[17] = _createTextVNode(\" 仓库名 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"格式:用户名/仓库名,例如 username/my-images\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.repo,\n \"onUpdate:modelValue\": $event => channel.repo = $event,\n disabled: channel.fixed,\n placeholder: \"username/repo-name\"\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, {\n label: \"Access Token\",\n prop: \"token\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: channel.token,\n \"onUpdate:modelValue\": $event => channel.token = $event,\n disabled: channel.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_cache[18] || (_cache[18] = _createTextVNode(\" 私有仓库 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"开启后仓库将设为私有,访问时需要通过服务器代理\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: channel.isPrivate,\n \"onUpdate:modelValue\": $event => channel.isPrivate = $event\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\"])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, null, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_14, [_createVNode(_component_font_awesome_icon, {\n icon: \"info-circle\",\n style: {\n \"margin-right\": \"5px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(channel.isPrivate ? '私有仓库限制 100GB,访问时服务器会代理请求' : '公开仓库无容量限制,文件可直接访问'), 1)])]),\n _: 2\n }, 1024), _createVNode(_component_el_form_item, null, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n type: \"danger\",\n onClick: $event => $options.deleteChannel(index),\n size: \"small\",\n disabled: channel.fixed\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"])]),\n _: 2\n }, 1024)]),\n _: 2\n }, 1032, [\"model\", \"rules\"]);\n }), 128))])) : _createCommentVNode(\"\", true)]), _createElementVNode(\"div\", _hoisted_15, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.addChannel\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\"\n })]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.saveSettings\n }, {\n default: _withCtx(() => [...(_cache[19] || (_cache[19] = [_createTextVNode(\"保存设置\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])])])), [[_directive_loading, $data.loading]]);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.every.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nimport \"core-js/modules/es.iterator.find.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nexport default {\n data() {\n return {\n // 一级设置:上传渠道\n channels: [{\n value: 'telegram',\n label: 'Telegram'\n }, {\n value: 'cfr2',\n label: 'CloudFlare R2'\n }, {\n value: 's3',\n label: 'S3'\n }, {\n value: 'discord',\n label: 'Discord'\n }, {\n value: 'huggingface',\n label: 'HuggingFace'\n }],\n activeChannel: 'telegram',\n // 当前选中的上传渠道\n\n // 二级设置:Telegram 配置\n telegramSettings: {\n loadBalance: {},\n channels: []\n },\n tgRules: {\n name: [{\n required: true,\n message: '请输入渠道名',\n trigger: 'blur'\n }, {\n validator: (rule, value, callback) => {\n const names = this.telegramSettings.channels.map(item => item.name);\n if (names.filter(name => name === value).length > 1) {\n callback(new Error('渠道名不能重复'));\n } else if (value === 'Telegram_env') {\n // 判断该渠道保存位置是否为环境变量\n const savePath = this.telegramSettings.channels.find(item => item.name === value).savePath;\n if (savePath !== 'environment variable') {\n callback(new Error('渠道名不能为保留值'));\n } else {\n callback();\n }\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }],\n botToken: [{\n required: true,\n message: '请输入 Bot Token',\n trigger: 'blur'\n }],\n chatId: [{\n required: true,\n message: '请输入 Chat ID',\n trigger: 'blur'\n }]\n },\n // 二级设置:CFR2 配置\n cfr2Settings: {\n channels: []\n },\n // 二级设置:S3 配置\n s3Settings: {\n loadBalance: {},\n channels: []\n },\n // 二级设置:Discord 配置\n discordSettings: {\n loadBalance: {},\n channels: []\n },\n // 二级设置:HuggingFace 配置\n huggingfaceSettings: {\n loadBalance: {},\n channels: []\n },\n huggingfaceRules: {\n name: [{\n required: true,\n message: '请输入渠道名',\n trigger: 'blur'\n }, {\n validator: (rule, value, callback) => {\n const names = this.huggingfaceSettings.channels.map(item => item.name);\n if (names.filter(name => name === value).length > 1) {\n callback(new Error('渠道名不能重复'));\n } else if (value === 'HuggingFace_env') {\n const savePath = this.huggingfaceSettings.channels.find(item => item.name === value).savePath;\n if (savePath !== 'environment variable') {\n callback(new Error('渠道名不能为保留值'));\n } else {\n callback();\n }\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }],\n token: [{\n required: true,\n message: '请输入 Access Token',\n trigger: 'blur'\n }],\n repo: [{\n required: true,\n message: '请输入仓库名',\n trigger: 'blur'\n }]\n },\n discordRules: {\n name: [{\n required: true,\n message: '请输入渠道名',\n trigger: 'blur'\n }, {\n validator: (rule, value, callback) => {\n const names = this.discordSettings.channels.map(item => item.name);\n if (names.filter(name => name === value).length > 1) {\n callback(new Error('渠道名不能重复'));\n } else if (value === 'Discord_env') {\n const savePath = this.discordSettings.channels.find(item => item.name === value).savePath;\n if (savePath !== 'environment variable') {\n callback(new Error('渠道名不能为保留值'));\n } else {\n callback();\n }\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }],\n botToken: [{\n required: true,\n message: '请输入 Bot Token',\n trigger: 'blur'\n }],\n channelId: [{\n required: true,\n message: '请输入 Channel ID',\n trigger: 'blur'\n }]\n },\n // 容量统计数据\n quotaStats: {},\n quotaLoading: false,\n s3Rules: {\n name: [{\n required: true,\n message: '请输入渠道名',\n trigger: 'blur'\n }, {\n validator: (rule, value, callback) => {\n const names = this.s3Settings.channels.map(item => item.name);\n if (names.filter(name => name === value).length > 1) {\n callback(new Error('渠道名不能重复'));\n } else if (value === 'S3_env') {\n // 判断该渠道保存位置是否为环境变量\n const savePath = this.s3Settings.channels.find(item => item.name === value).savePath;\n if (savePath !== 'environment variable') {\n callback(new Error('渠道名不能为保留值'));\n } else {\n callback();\n }\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }],\n endpoint: [{\n required: true,\n message: '请输入 Endpoint',\n trigger: 'blur'\n }],\n bucketName: [{\n required: true,\n message: '请输入存储桶名称',\n trigger: 'blur'\n }],\n region: [{\n required: true,\n message: '请输入存储桶区域',\n trigger: 'blur'\n }],\n accessKeyId: [{\n required: true,\n message: '请输入访问密钥 ID',\n trigger: 'blur'\n }],\n secretAccessKey: [{\n required: true,\n message: '请输入机密访问密钥',\n trigger: 'blur'\n }]\n },\n // 加载状态\n loading: false\n };\n },\n computed: {\n // 当前选中渠道的标签\n activeChannelLabel() {\n const channel = this.channels.find(item => item.value === this.activeChannel);\n return channel ? channel.label : '';\n }\n },\n methods: {\n addChannel() {\n switch (this.activeChannel) {\n case 'telegram':\n this.telegramSettings.channels.push({\n id: this.telegramSettings.channels.length + 1,\n name: '',\n type: 'telegram',\n savePath: 'database',\n botToken: '',\n chatId: '',\n enabled: true,\n fixed: false\n });\n break;\n case 'cfr2':\n // this.cfr2Settings.channels.push({\n // id: this.cfr2Settings.channels.length + 1,\n // name: '',\n // type: 'cfr2',\n // savePath: 'database',\n // enabled: true,\n // fixed: false\n // });\n this.$message.error('R2渠道请通过绑定 R2 存储桶或通过 S3 渠道添加');\n break;\n case 's3':\n this.s3Settings.channels.push({\n id: this.s3Settings.channels.length + 1,\n name: '',\n type: 's3',\n savePath: 'database',\n accessKeyId: '',\n secretAccessKey: '',\n region: '',\n bucketName: '',\n endpoint: '',\n pathStyle: false,\n enabled: true,\n fixed: false,\n quota: {\n enabled: false,\n limitGB: 10,\n threshold: 95\n }\n });\n break;\n case 'discord':\n this.discordSettings.channels.push({\n id: this.discordSettings.channels.length + 1,\n name: '',\n type: 'discord',\n savePath: 'database',\n botToken: '',\n channelId: '',\n proxyUrl: '',\n isNitro: false,\n enabled: true,\n fixed: false\n });\n break;\n case 'huggingface':\n this.huggingfaceSettings.channels.push({\n id: this.huggingfaceSettings.channels.length + 1,\n name: '',\n type: 'huggingface',\n savePath: 'database',\n token: '',\n repo: '',\n isPrivate: false,\n enabled: true,\n fixed: false\n });\n break;\n }\n },\n deleteChannel(index) {\n switch (this.activeChannel) {\n case 'telegram':\n // 调整 id\n this.telegramSettings.channels.forEach((item, i) => {\n if (i > index) {\n item.id -= 1;\n }\n });\n this.telegramSettings.channels.splice(index, 1);\n break;\n case 'cfr2':\n // 调整 id\n this.cfr2Settings.channels.forEach((item, i) => {\n if (i > index) {\n item.id -= 1;\n }\n });\n this.cfr2Settings.channels.splice(index, 1);\n break;\n case 's3':\n // 调整 id\n this.s3Settings.channels.forEach((item, i) => {\n if (i > index) {\n item.id -= 1;\n }\n });\n this.s3Settings.channels.splice(index, 1);\n break;\n case 'discord':\n // 调整 id\n this.discordSettings.channels.forEach((item, i) => {\n if (i > index) {\n item.id -= 1;\n }\n });\n this.discordSettings.channels.splice(index, 1);\n break;\n case 'huggingface':\n // 调整 id\n this.huggingfaceSettings.channels.forEach((item, i) => {\n if (i > index) {\n item.id -= 1;\n }\n });\n this.huggingfaceSettings.channels.splice(index, 1);\n break;\n }\n },\n saveSettings() {\n // 所有表单的 Promise 数组\n let validationPromises = [];\n\n // Telegram\n if (this.$refs.tgChannelForm) {\n this.$refs.tgChannelForm.forEach(form => {\n validationPromises.push(new Promise(resolve => {\n form.validate(valid => resolve(valid));\n }));\n });\n }\n\n // S3\n if (this.$refs.s3ChannelForm) {\n this.$refs.s3ChannelForm.forEach(form => {\n validationPromises.push(new Promise(resolve => {\n form.validate(valid => resolve(valid));\n }));\n });\n }\n\n // Discord\n if (this.$refs.discordChannelForm) {\n this.$refs.discordChannelForm.forEach(form => {\n validationPromises.push(new Promise(resolve => {\n form.validate(valid => resolve(valid));\n }));\n });\n }\n\n // HuggingFace\n if (this.$refs.huggingfaceChannelForm) {\n this.$refs.huggingfaceChannelForm.forEach(form => {\n validationPromises.push(new Promise(resolve => {\n form.validate(valid => resolve(valid));\n }));\n });\n }\n\n // 等待所有验证完成\n Promise.all(validationPromises).then(results => {\n const isValid = results.every(valid => valid);\n if (!isValid) {\n return;\n }\n\n // 保存设置\n const settings = {\n telegram: this.telegramSettings,\n cfr2: this.cfr2Settings,\n s3: this.s3Settings,\n discord: this.discordSettings,\n huggingface: this.huggingfaceSettings\n };\n fetchWithAuth('/api/manage/sysConfig/upload', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(settings)\n }).then(() => {\n this.$message.success('设置已保存');\n });\n });\n },\n // 获取容量统计(重新计算)\n async refreshQuota() {\n this.quotaLoading = true;\n try {\n // 使用 POST 请求重新统计容量(会触发索引重建)\n const response = await fetchWithAuth('/api/manage/quota', {\n method: 'POST'\n });\n const data = await response.json();\n if (data.success) {\n this.quotaStats = data.channelStats || {};\n } else {\n // 如果重新统计失败,尝试获取已有数据\n const getResponse = await fetchWithAuth('/api/manage/quota');\n const getData = await getResponse.json();\n if (getData.success) {\n this.quotaStats = getData.quotaStats || {};\n }\n }\n } catch (error) {\n console.error('Failed to refresh quota stats:', error);\n } finally {\n this.quotaLoading = false;\n }\n },\n // 获取容量统计(仅读取,不重建索引)\n async loadQuotaStats() {\n try {\n const response = await fetchWithAuth('/api/manage/quota');\n const data = await response.json();\n if (data.success) {\n this.quotaStats = data.quotaStats || {};\n }\n } catch (error) {\n console.error('Failed to load quota stats:', error);\n }\n },\n // 获取渠道已用容量 (GB)\n getChannelUsedGB(channel) {\n const stats = this.quotaStats[channel.name];\n if (!stats) return 0;\n return (stats.usedMB || 0) / 1024;\n },\n // 获取容量百分比\n getQuotaPercentage(channel) {\n const usedGB = this.getChannelUsedGB(channel);\n const limitGB = channel.quota?.limitGB || 10;\n const percentage = usedGB / limitGB * 100;\n return Math.min(100, Math.round(percentage * 10) / 10);\n },\n // 获取进度条状态\n getQuotaStatus(channel) {\n const percentage = this.getQuotaPercentage(channel);\n const threshold = channel.quota?.threshold || 95;\n if (percentage >= threshold) return 'exception';\n if (percentage >= 80) return 'warning';\n return 'success';\n },\n // 获取容量文本\n getQuotaText(channel) {\n const usedGB = this.getChannelUsedGB(channel);\n const limitGB = channel.quota?.limitGB || 10;\n return `${usedGB.toFixed(2)} / ${limitGB} GB`;\n },\n // 判断是否超过阈值\n isQuotaExceeded(channel) {\n const percentage = this.getQuotaPercentage(channel);\n const threshold = channel.quota?.threshold || 95;\n return percentage >= threshold;\n },\n // 获取状态文本\n getQuotaStatusText(channel) {\n const percentage = this.getQuotaPercentage(channel);\n const threshold = channel.quota?.threshold || 95;\n if (percentage >= threshold) {\n return `⚠️ 已达到容量阈值 (${threshold}%),渠道写入已暂停`;\n }\n if (percentage >= 80) {\n return `⚡ 容量使用较高,接近阈值`;\n }\n return `✓ 容量正常`;\n },\n // 容量限制开关变化时\n async onQuotaEnabledChange(enabled, channel) {\n if (enabled && channel.name) {\n // 首次启用时,检查是否有该渠道的统计数据\n const stats = this.quotaStats[channel.name];\n if (!stats) {\n // 没有统计数据,提示用户需要重新统计\n this.$confirm('首次启用容量限制需要统计现有文件容量,这可能需要一些时间。是否立即统计?', '初始化容量统计', {\n confirmButtonText: '立即统计',\n cancelButtonText: '稍后手动统计',\n type: 'info'\n }).then(async () => {\n await this.recalculateQuota();\n }).catch(() => {\n this.$message.info('您可以稍后点击刷新按钮手动统计');\n });\n }\n }\n },\n // 重新统计容量\n async recalculateQuota() {\n this.quotaLoading = true;\n try {\n this.$message.info('正在统计容量,请稍候...');\n const response = await fetchWithAuth('/api/manage/quota', {\n method: 'POST'\n });\n const data = await response.json();\n if (data.success) {\n this.quotaStats = data.channelStats || {};\n this.$message.success('容量统计完成');\n } else {\n this.$message.error('统计失败: ' + (data.error || '未知错误'));\n }\n } catch (error) {\n console.error('Failed to recalculate quota:', error);\n this.$message.error('统计失败');\n } finally {\n this.quotaLoading = false;\n }\n }\n },\n mounted() {\n this.loading = true;\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/upload').then(response => response.json()).then(data => {\n this.telegramSettings = data.telegram;\n // 确保 R2 渠道有 quota 默认值\n if (data.cfr2 && data.cfr2.channels) {\n data.cfr2.channels = data.cfr2.channels.map(channel => ({\n ...channel,\n quota: channel.quota || {\n enabled: false,\n limitGB: 10,\n threshold: 95\n }\n }));\n }\n this.cfr2Settings = data.cfr2;\n // 确保 S3 渠道有 quota 默认值\n if (data.s3 && data.s3.channels) {\n data.s3.channels = data.s3.channels.map(channel => ({\n ...channel,\n quota: channel.quota || {\n enabled: false,\n limitGB: 10,\n threshold: 95\n }\n }));\n }\n this.s3Settings = data.s3;\n // 确保 Discord 渠道有默认值\n if (data.discord && data.discord.channels) {\n data.discord.channels = data.discord.channels.map(channel => ({\n ...channel,\n proxyUrl: channel.proxyUrl || ''\n }));\n }\n this.discordSettings = data.discord || {\n loadBalance: {},\n channels: []\n };\n // 确保 HuggingFace 渠道有默认值\n if (data.huggingface && data.huggingface.channels) {\n data.huggingface.channels = data.huggingface.channels.map(channel => ({\n ...channel,\n isPrivate: channel.isPrivate || false\n }));\n }\n this.huggingfaceSettings = data.huggingface || {\n loadBalance: {},\n channels: []\n };\n // 加载容量统计(仅读取,不重建索引)\n this.loadQuotaStats();\n }).finally(() => {\n this.loading = false;\n });\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogUpload.vue?vue&type=template&id=d5b2dcdc&scoped=true\"\nimport script from \"./SysCogUpload.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogUpload.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogUpload.vue?vue&type=style&index=0&id=d5b2dcdc&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-d5b2dcdc\"]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, Transition as _Transition, createTextVNode as _createTextVNode, toDisplayString as _toDisplayString, renderList as _renderList, Fragment as _Fragment, createElementBlock as _createElementBlock, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"security-settings\"\n};\nconst _hoisted_2 = {\n class: \"first-settings\"\n};\nconst _hoisted_3 = {\n class: \"second-title token-title\"\n};\nconst _hoisted_4 = {\n class: \"token-actions\"\n};\nconst _hoisted_5 = {\n class: \"token-table-container\"\n};\nconst _hoisted_6 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_7 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_8 = {\n class: \"token-display\"\n};\nconst _hoisted_9 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_10 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_11 = {\n class: \"table-cell-content action-buttons\"\n};\nconst _hoisted_12 = {\n class: \"first-settings\"\n};\nconst _hoisted_13 = {\n class: \"second-title\"\n};\nconst _hoisted_14 = {\n class: \"first-settings\"\n};\nconst _hoisted_15 = {\n class: \"actions\"\n};\nconst _hoisted_16 = {\n class: \"dialog-footer\"\n};\nconst _hoisted_17 = {\n class: \"dialog-footer\"\n};\nconst _hoisted_18 = {\n class: \"token-result\"\n};\nconst _hoisted_19 = {\n style: {\n \"margin-bottom\": \"15px\",\n \"color\": \"#e6a23c\"\n }\n};\nconst _hoisted_20 = {\n class: \"dialog-footer\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_table_column = _resolveComponent(\"el-table-column\");\n const _component_el_tag = _resolveComponent(\"el-tag\");\n const _component_el_table = _resolveComponent(\"el-table\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_el_checkbox = _resolveComponent(\"el-checkbox\");\n const _component_el_checkbox_group = _resolveComponent(\"el-checkbox-group\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_cache[26] || (_cache[26] = _createElementVNode(\"h3\", {\n class: \"first-title\"\n }, \"认证管理\", -1)), _cache[27] || (_cache[27] = _createElementVNode(\"h4\", {\n class: \"second-title\"\n }, \"用户端认证\", -1)), _createVNode(_component_el_form, {\n model: $data.authSettings.user,\n rules: $data.userPassRules,\n ref: \"userPassForm\",\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"上传密码\",\n prop: \"authCode\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.user.authCode,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.authSettings.user.authCode = $event),\n type: \"password\",\n \"show-password\": \"\",\n onInput: $options.handleUserPassInput,\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"onInput\"])]),\n _: 1\n }), _createVNode(_Transition, {\n name: \"fade-slide\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [$data.showUserPassConfirm ? (_openBlock(), _createBlock(_component_el_form_item, {\n label: \"确认密码\",\n prop: \"confirmNewUserPassword\",\n key: \"user-confirm\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.user.confirmNewUserPassword,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $data.authSettings.user.confirmNewUserPassword = $event),\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })) : _createCommentVNode(\"\", true)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\", \"rules\"]), _cache[28] || (_cache[28] = _createElementVNode(\"h4\", {\n class: \"second-title\"\n }, \"管理端认证\", -1)), _createVNode(_component_el_form, {\n model: $data.authSettings.admin,\n rules: $data.adminPassRules,\n ref: \"adminPassForm\",\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"用户名\",\n prop: \"adminUsername\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.admin.adminUsername,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.authSettings.admin.adminUsername = $event),\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"密码\",\n prop: \"adminPassword\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.admin.adminPassword,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.authSettings.admin.adminPassword = $event),\n type: \"password\",\n \"show-password\": \"\",\n onInput: $options.handleAdminPassInput,\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"onInput\"])]),\n _: 1\n }), _createVNode(_Transition, {\n name: \"fade-slide\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [$data.showAdminPassConfirm ? (_openBlock(), _createBlock(_component_el_form_item, {\n label: \"确认密码\",\n prop: \"confirmNewAdminPassword\",\n key: \"admin-confirm\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.admin.confirmNewAdminPassword,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.authSettings.admin.confirmNewAdminPassword = $event),\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })) : _createCommentVNode(\"\", true)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\", \"rules\"]), _createElementVNode(\"h4\", _hoisted_3, [_cache[23] || (_cache[23] = _createTextVNode(\"API Token 管理 \", -1)), _createElementVNode(\"a\", _hoisted_4, [_createVNode(_component_el_button, {\n type: \"primary\",\n size: \"small\",\n onClick: _cache[5] || (_cache[5] = $event => $data.showCreateTokenDialog = true),\n circle: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\"\n })]),\n _: 1\n })])]), _createElementVNode(\"div\", _hoisted_5, [_withDirectives((_openBlock(), _createBlock(_component_el_table, {\n data: $data.apiTokens,\n class: \"token-table\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_table_column, {\n prop: \"name\",\n label: \"名称\",\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_6, _toDisplayString(scope.row.name), 1)]),\n _: 1\n }), _createVNode(_component_el_table_column, {\n prop: \"token\",\n label: \"Token\",\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_7, [_createElementVNode(\"span\", _hoisted_8, _toDisplayString(scope.row.token), 1)])]),\n _: 1\n }), _createVNode(_component_el_table_column, {\n prop: \"permissions\",\n label: \"权限\",\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_9, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(scope.row.permissions, perm => {\n return _openBlock(), _createBlock(_component_el_tag, {\n key: perm,\n size: \"small\",\n class: \"permission-tag\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.getPermissionText(perm)), 1)]),\n _: 2\n }, 1024);\n }), 128))])]),\n _: 1\n }), _createVNode(_component_el_table_column, {\n prop: \"createdAt\",\n label: \"创建时间\",\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_10, _toDisplayString($options.formatDate(scope.row.createdAt)), 1)]),\n _: 1\n }), _createVNode(_component_el_table_column, {\n label: \"操作\",\n fixed: \"right\",\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_11, [_createVNode(_component_el_button, {\n class: \"action-button\",\n size: \"small\",\n onClick: $event => $options.editToken(scope.row)\n }, {\n default: _withCtx(() => [...(_cache[24] || (_cache[24] = [_createTextVNode(\"编辑\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n class: \"action-button\",\n size: \"small\",\n type: \"danger\",\n onClick: $event => $options.deleteToken(scope.row.id)\n }, {\n default: _withCtx(() => [...(_cache[25] || (_cache[25] = [_createTextVNode(\"删除\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"data\"])), [[_directive_loading, $data.tokenLoading]])])]), _createElementVNode(\"div\", _hoisted_12, [_cache[30] || (_cache[30] = _createElementVNode(\"h3\", {\n class: \"first-title\"\n }, \"上传管理\", -1)), _createElementVNode(\"h4\", _hoisted_13, [_cache[29] || (_cache[29] = _createTextVNode(\"图像审查 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"仅对非分块上传文件生效,支持 nsfwjs 和 moderatecontent.com 渠道\",\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]), _createVNode(_component_el_form, {\n model: $data.uploadSettings.moderate,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"开启审查\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.uploadSettings.moderate.enabled,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.uploadSettings.moderate.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"审查渠道\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.uploadSettings.moderate.channel,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => $data.uploadSettings.moderate.channel = $event),\n placeholder: \"请选择审查渠道\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_option, {\n label: \"moderatecontent.com\",\n value: \"moderatecontent.com\"\n }), _createVNode(_component_el_option, {\n label: \"nsfwjs\",\n value: \"nsfwjs\"\n })]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n }), $data.uploadSettings.moderate.channel === 'moderatecontent.com' ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: \"API Key\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.uploadSettings.moderate.moderateContentApiKey,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $data.uploadSettings.moderate.moderateContentApiKey = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })) : _createCommentVNode(\"\", true), $data.uploadSettings.moderate.channel === 'nsfwjs' ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 1,\n label: \"API 路径\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.uploadSettings.moderate.nsfwApiPath,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => $data.uploadSettings.moderate.nsfwApiPath = $event),\n placeholder: \"https://nsfwjs.your.domain\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\"])]), _createElementVNode(\"div\", _hoisted_14, [_cache[33] || (_cache[33] = _createElementVNode(\"h3\", {\n class: \"first-title\"\n }, \"访问管理\", -1)), _cache[34] || (_cache[34] = _createElementVNode(\"h4\", {\n class: \"second-title\"\n }, \"域名过滤\", -1)), _createVNode(_component_el_form, {\n model: $data.accessSettings,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_cache[31] || (_cache[31] = _createTextVNode(\" 放行域名 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"1.针对访问域名设置权限
2.留空默认全部放行,多个域名请用英文逗号分隔\",\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.accessSettings.allowedDomains,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => $data.accessSettings.allowedDomains = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _cache[35] || (_cache[35] = _createElementVNode(\"h4\", {\n class: \"second-title\"\n }, \"白名单模式\", -1)), _createVNode(_component_el_form, {\n model: $data.accessSettings,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, null, {\n label: _withCtx(() => [_cache[32] || (_cache[32] = _createTextVNode(\" 是否开启 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"1.针对文件设置权限
2.开启后,仅被加入白名单的文件可被访问\",\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.accessSettings.whiteListMode,\n \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => $data.accessSettings.whiteListMode = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"])]), _createElementVNode(\"div\", _hoisted_15, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.saveSettings\n }, {\n default: _withCtx(() => [...(_cache[36] || (_cache[36] = [_createTextVNode(\"保存设置\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])]), _createVNode(_component_el_dialog, {\n modelValue: $data.showCreateTokenDialog,\n \"onUpdate:modelValue\": _cache[15] || (_cache[15] = $event => $data.showCreateTokenDialog = $event),\n title: \"创建新 API Token\",\n width: $options.dialogWidth\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_16, [_createVNode(_component_el_button, {\n onClick: _cache[14] || (_cache[14] = $event => $data.showCreateTokenDialog = false)\n }, {\n default: _withCtx(() => [...(_cache[40] || (_cache[40] = [_createTextVNode(\"取消\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.createToken\n }, {\n default: _withCtx(() => [...(_cache[41] || (_cache[41] = [_createTextVNode(\"创建\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.newToken,\n rules: $data.tokenRules,\n ref: \"tokenForm\",\n \"label-width\": \"100px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"Token 名称\",\n prop: \"name\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newToken.name,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $data.newToken.name = $event),\n placeholder: \"请输入Token名称\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"权限\",\n prop: \"permissions\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox_group, {\n modelValue: $data.newToken.permissions,\n \"onUpdate:modelValue\": _cache[13] || (_cache[13] = $event => $data.newToken.permissions = $event)\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox, {\n label: \"upload\"\n }, {\n default: _withCtx(() => [...(_cache[37] || (_cache[37] = [_createTextVNode(\"上传\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"delete\"\n }, {\n default: _withCtx(() => [...(_cache[38] || (_cache[38] = [_createTextVNode(\"删除\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"list\"\n }, {\n default: _withCtx(() => [...(_cache[39] || (_cache[39] = [_createTextVNode(\"列出\", -1)]))]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"width\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showEditTokenDialog,\n \"onUpdate:modelValue\": _cache[19] || (_cache[19] = $event => $data.showEditTokenDialog = $event),\n title: \"编辑 API Token\",\n width: $options.dialogWidth\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_17, [_createVNode(_component_el_button, {\n onClick: _cache[18] || (_cache[18] = $event => $data.showEditTokenDialog = false)\n }, {\n default: _withCtx(() => [...(_cache[45] || (_cache[45] = [_createTextVNode(\"取消\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.updateToken\n }, {\n default: _withCtx(() => [...(_cache[46] || (_cache[46] = [_createTextVNode(\"更新\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.editingToken,\n rules: $data.tokenRules,\n ref: \"editTokenForm\",\n \"label-width\": \"100px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"Token 名称\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editingToken.name,\n \"onUpdate:modelValue\": _cache[16] || (_cache[16] = $event => $data.editingToken.name = $event),\n disabled: \"\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"权限\",\n prop: \"permissions\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox_group, {\n modelValue: $data.editingToken.permissions,\n \"onUpdate:modelValue\": _cache[17] || (_cache[17] = $event => $data.editingToken.permissions = $event)\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox, {\n label: \"upload\"\n }, {\n default: _withCtx(() => [...(_cache[42] || (_cache[42] = [_createTextVNode(\"上传\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"delete\"\n }, {\n default: _withCtx(() => [...(_cache[43] || (_cache[43] = [_createTextVNode(\"删除\", -1)]))]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"list\"\n }, {\n default: _withCtx(() => [...(_cache[44] || (_cache[44] = [_createTextVNode(\"列出\", -1)]))]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"width\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showTokenResultDialog,\n \"onUpdate:modelValue\": _cache[22] || (_cache[22] = $event => $data.showTokenResultDialog = $event),\n title: \"Token 创建成功\",\n width: $options.dialogWidth\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_20, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[21] || (_cache[21] = $event => $data.showTokenResultDialog = false)\n }, {\n default: _withCtx(() => [...(_cache[49] || (_cache[49] = [_createTextVNode(\"我已保存\", -1)]))]),\n _: 1\n })])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_18, [_createElementVNode(\"p\", _hoisted_19, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n style: {\n \"margin-right\": \"5px\"\n }\n }), _cache[47] || (_cache[47] = _createTextVNode(\" 请妥善保存以下Token,关闭此窗口后将无法再次查看完整Token! \", -1))]), _createVNode(_component_el_form, {\n \"label-width\": \"100px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"Token 名称\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"span\", null, _toDisplayString($data.createdToken.name), 1)]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"完整Token\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.createdToken.token,\n \"onUpdate:modelValue\": _cache[20] || (_cache[20] = $event => $data.createdToken.token = $event),\n readonly: \"\"\n }, {\n append: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: $options.copyToken\n }, {\n default: _withCtx(() => [...(_cache[48] || (_cache[48] = [_createTextVNode(\"复制\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n })])]),\n _: 1\n }, 8, [\"modelValue\", \"width\"])])), [[_directive_loading, $data.loading]]);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.every.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nexport default {\n data() {\n return {\n authSettings: {\n user: {},\n admin: {}\n },\n uploadSettings: {\n moderate: {}\n },\n accessSettings: {},\n apiTokens: [],\n // API Token列表\n // 加载状态\n loading: false,\n tokenLoading: false,\n // 修改密码相关\n oriUserPassword: '',\n // 原上传密码\n oriAdminPassword: '',\n // 原管理端密码\n\n showUserPassConfirm: false,\n // 显示用户密码确认框\n showAdminPassConfirm: false,\n // 显示管理密码确认框\n\n // Token对话框相关\n showCreateTokenDialog: false,\n showEditTokenDialog: false,\n showTokenResultDialog: false,\n newToken: {\n name: '',\n owner: '',\n permissions: []\n },\n editingToken: {\n id: '',\n name: '',\n owner: '',\n permissions: []\n },\n createdToken: {\n name: '',\n token: ''\n },\n userPassRules: {\n authCode: [{\n validator: (rule, value, callback) => {\n // URL保留字符列表\n const urlReservedChars = ['%', '&', '?', '#', '/'];\n const hasReservedChar = urlReservedChars.some(char => value && value.includes(char));\n if (hasReservedChar) {\n callback(new Error('密码不能包含部分URL保留字符: % & ? # /'));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }],\n confirmNewUserPassword: [{\n message: '请再次输入上传密码',\n trigger: 'blur'\n }, {\n validator: (rule, value, callback) => {\n if (value && value !== this.authSettings.user.authCode) {\n callback(new Error('两次输入密码不一致'));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n },\n adminPassRules: {\n confirmNewAdminPassword: [{\n message: '请再次输入管理密码',\n trigger: 'blur'\n }, {\n validator: (rule, value, callback) => {\n if (value && value !== this.authSettings.admin.adminPassword) {\n callback(new Error('两次输入密码不一致'));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n },\n tokenRules: {\n name: [{\n required: true,\n message: '请输入Token名称',\n trigger: 'blur'\n }],\n permissions: [{\n required: true,\n message: '请选择权限',\n trigger: 'change'\n }]\n }\n };\n },\n computed: {\n dialogWidth() {\n return window.innerWidth > 768 ? '50%' : '90%';\n }\n },\n methods: {\n handleUserPassInput() {\n if (this.authSettings.user.authCode !== this.oriUserPassword) {\n this.showUserPassConfirm = true;\n } else {\n this.showUserPassConfirm = false;\n }\n },\n handleAdminPassInput() {\n if (this.authSettings.admin.adminPassword !== this.oriAdminPassword) {\n this.showAdminPassConfirm = true;\n } else {\n this.showAdminPassConfirm = false;\n }\n },\n // Token相关方法\n getPermissionText(permission) {\n const permissionMap = {\n 'upload': '上传',\n 'delete': '删除',\n 'list': '列出'\n };\n return permissionMap[permission] || permission;\n },\n formatDate(dateString) {\n return new Date(dateString).toLocaleString('zh-CN');\n },\n async loadApiTokens() {\n this.tokenLoading = true;\n try {\n const response = await fetchWithAuth('/api/manage/apiTokens');\n const data = await response.json();\n this.apiTokens = data.tokens || [];\n } catch (error) {\n this.$message.error('获取Token列表失败');\n } finally {\n this.tokenLoading = false;\n }\n },\n createToken() {\n this.$refs.tokenForm.validate(async valid => {\n if (!valid) return;\n try {\n this.newToken.owner = 'admin'; // 默认所有Token归属管理员\n const response = await fetchWithAuth('/api/manage/apiTokens', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(this.newToken)\n });\n const data = await response.json();\n if (response.ok) {\n this.createdToken = {\n name: data.name,\n token: data.token\n };\n this.showCreateTokenDialog = false;\n this.showTokenResultDialog = true;\n this.newToken = {\n name: '',\n owner: '',\n permissions: []\n };\n await this.loadApiTokens();\n this.$message.success('Token创建成功');\n } else {\n this.$message.error(data.error || 'Token创建失败');\n }\n } catch (error) {\n this.$message.error('Token创建失败');\n }\n });\n },\n editToken(token) {\n this.editingToken = {\n id: token.id,\n name: token.name,\n owner: token.owner,\n permissions: [...token.permissions]\n };\n this.showEditTokenDialog = true;\n },\n updateToken() {\n this.$refs.editTokenForm.validate(async valid => {\n if (!valid) return;\n try {\n const response = await fetchWithAuth('/api/manage/apiTokens', {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n tokenId: this.editingToken.id,\n permissions: this.editingToken.permissions\n })\n });\n const data = await response.json();\n if (response.ok) {\n this.showEditTokenDialog = false;\n await this.loadApiTokens();\n this.$message.success('Token权限更新成功');\n } else {\n this.$message.error(data.error || 'Token更新失败');\n }\n } catch (error) {\n this.$message.error('Token更新失败');\n }\n });\n },\n async deleteToken(tokenId) {\n try {\n await this.$confirm('此操作将永久删除该Token,是否继续?', '提示', {\n confirmButtonText: '确定',\n cancelButtonText: '取消',\n type: 'warning'\n });\n const response = await fetchWithAuth(`/api/manage/apiTokens?id=${tokenId}`, {\n method: 'DELETE'\n });\n const data = await response.json();\n if (response.ok) {\n await this.loadApiTokens();\n this.$message.success('Token删除成功');\n } else {\n this.$message.error(data.error || 'Token删除失败');\n }\n } catch (error) {\n if (error !== 'cancel') {\n this.$message.error('Token删除失败');\n }\n }\n },\n async copyToken() {\n try {\n await navigator.clipboard.writeText(this.createdToken.token);\n this.$message.success('Token已复制到剪贴板');\n } catch (error) {\n this.$message.error('复制失败,请手动复制');\n }\n },\n saveSettings() {\n // 所有表单的Promise数组\n let validationPromises = [];\n\n // 验证用户密码表单\n validationPromises.push(new Promise(resolve => {\n this.$refs.userPassForm.validate(valid => {\n resolve(valid);\n });\n }));\n\n // 验证管理密码表单\n validationPromises.push(new Promise(resolve => {\n this.$refs.adminPassForm.validate(valid => {\n resolve(valid);\n });\n }));\n\n // 等待所有验证完成\n Promise.all(validationPromises).then(results => {\n const isValid = results.every(valid => valid);\n if (!isValid) {\n return;\n }\n const settings = {\n auth: this.authSettings,\n upload: this.uploadSettings,\n access: this.accessSettings\n };\n // 不保存确认密码相关字段\n delete settings.auth.user.confirmNewUserPassword;\n delete settings.auth.admin.confirmNewAdminPassword;\n fetchWithAuth('/api/manage/sysConfig/security', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(settings)\n }).then(() => {\n this.$message.success('设置已保存');\n // 更新原密码\n this.oriUserPassword = this.authSettings.user.authCode;\n this.oriAdminPassword = this.authSettings.admin.adminPassword;\n this.showUserPassConfirm = false;\n this.showAdminPassConfirm = false;\n });\n });\n }\n },\n mounted() {\n this.loading = true;\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/security').then(response => response.json()).then(data => {\n this.authSettings = data.auth;\n this.uploadSettings = data.upload;\n this.accessSettings = data.access;\n\n // 保存原密码\n this.oriUserPassword = this.authSettings.user.authCode;\n this.oriAdminPassword = this.authSettings.admin.adminPassword;\n this.authSettings.user.confirmNewUserPassword = '';\n this.authSettings.admin.confirmNewAdminPassword = '';\n\n // 加载API Token列表\n this.loadApiTokens();\n }).finally(() => {\n this.loading = false;\n });\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogSecurity.vue?vue&type=template&id=3b7344a0&scoped=true\"\nimport script from \"./SysCogSecurity.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogSecurity.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogSecurity.vue?vue&type=style&index=0&id=3b7344a0&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-3b7344a0\"]])\n\nexport default __exports__","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createTextVNode as _createTextVNode, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"page-settings\"\n};\nconst _hoisted_2 = {\n class: \"first-title\"\n};\nconst _hoisted_3 = {\n class: \"actions\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.groupedSettings, (categoryGroup, categoryName) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: categoryName,\n class: \"first-settings\"\n }, [_createElementVNode(\"h3\", _hoisted_2, _toDisplayString(categoryName), 1), _createVNode(_component_el_form, {\n model: $data.settings,\n \"label-width\": \"150px\"\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(categoryGroup, (setting, index) => {\n return _openBlock(), _createBlock(_component_el_form_item, {\n key: setting.id\n }, {\n label: _withCtx(() => [_createTextVNode(_toDisplayString(setting.label) + \" \", 1), setting.tooltip ? (_openBlock(), _createBlock(_component_el_tooltip, {\n key: 0,\n content: setting.tooltip,\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n }, 8, [\"content\"])) : _createCommentVNode(\"\", true)]),\n default: _withCtx(() => [setting.type === 'select' ? (_openBlock(), _createBlock(_component_el_select, {\n key: 0,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: setting.fixed,\n placeholder: setting.placeholder,\n style: {\n \"width\": \"100%\"\n }\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(setting.options, option => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: option.value,\n label: option.label,\n value: option.value\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 2\n }, 1032, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\", \"placeholder\"])) : setting.type === 'boolean' ? (_openBlock(), _createBlock(_component_el_switch, {\n key: 1,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: setting.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])) : (_openBlock(), _createBlock(_component_el_input, {\n key: 2,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: setting.fixed,\n placeholder: setting.placeholder\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\", \"placeholder\"]))]),\n _: 2\n }, 1024);\n }), 128))]),\n _: 2\n }, 1032, [\"model\"])]);\n }), 128)), _createElementVNode(\"div\", _hoisted_3, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.saveSettings\n }, {\n default: _withCtx(() => [...(_cache[0] || (_cache[0] = [_createTextVNode(\"保存设置\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])])])), [[_directive_loading, $data.loading]]);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nexport default {\n data() {\n return {\n settings: {\n config: []\n },\n // 加载状态\n loading: false\n };\n },\n computed: {\n // 根据category将配置项分组\n groupedSettings() {\n const grouped = {};\n if (this.settings.config) {\n this.settings.config.forEach(setting => {\n const category = setting.category || '其他设置';\n if (!grouped[category]) {\n grouped[category] = [];\n }\n grouped[category].push(setting);\n });\n }\n return grouped;\n }\n },\n methods: {\n saveSettings() {\n fetchWithAuth('/api/manage/sysConfig/page', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(this.settings)\n }).then(() => this.$message.success('设置已保存'));\n }\n },\n mounted() {\n this.loading = true;\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/page').then(response => response.json()).then(data => {\n this.settings = data;\n // 处理布尔类型的值初始化\n if (this.settings.config) {\n this.settings.config.forEach(setting => {\n if (setting.type === 'boolean') {\n // 将字符串转换为布尔值\n if (typeof setting.value === 'string') {\n setting.value = setting.value === 'true';\n } else if (setting.value === undefined || setting.value === null) {\n // 如果没有值,使用默认值\n setting.value = setting.default || false;\n }\n }\n });\n }\n }).finally(() => {\n this.loading = false;\n });\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogPage.vue?vue&type=template&id=7b059a1c&scoped=true\"\nimport script from \"./SysCogPage.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogPage.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogPage.vue?vue&type=style&index=0&id=7b059a1c&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-7b059a1c\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createTextVNode as _createTextVNode, createElementVNode as _createElementVNode, resolveDirective as _resolveDirective, openBlock as _openBlock, createElementBlock as _createElementBlock, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"others-settings\"\n};\nconst _hoisted_2 = {\n class: \"first-settings\"\n};\nconst _hoisted_3 = {\n class: \"first-title\"\n};\nconst _hoisted_4 = {\n class: \"first-title\"\n};\nconst _hoisted_5 = {\n class: \"first-title\"\n};\nconst _hoisted_6 = {\n class: \"first-title\"\n};\nconst _hoisted_7 = {\n class: \"first-title\"\n};\nconst _hoisted_8 = {\n class: \"actions\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h3\", _hoisted_3, [_cache[11] || (_cache[11] = _createTextVNode(\"远端遥测 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"便于问题查找和定位,建议开启\",\n placement: \"right\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]), _createVNode(_component_el_form, {\n model: $data.settings.telemetry,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"启用\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.telemetry.enabled,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.settings.telemetry.enabled = $event),\n disabled: $data.settings.telemetry.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_4, [_cache[12] || (_cache[12] = _createTextVNode(\"随机图像API \", -1)), _createVNode(_component_el_tooltip, {\n content: \"API具体用法请查阅文档\",\n placement: \"right\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]), _createVNode(_component_el_form, {\n model: $data.settings.randomImageAPI,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"启用\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.randomImageAPI.enabled,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $data.settings.randomImageAPI.enabled = $event),\n disabled: $data.settings.randomImageAPI.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n prop: \"randomImageAPI.allowedDir\"\n }, {\n label: _withCtx(() => [_cache[13] || (_cache[13] = _createElementVNode(\"span\", null, \"目录\", -1)), _createVNode(_component_el_tooltip, {\n content: \"1. 开放随机图权限的目录,默认为根目录,多个目录用逗号分隔
2. 目录均采用绝对路径,例如/img/cover,表示该目录及其所有子目录的文件可被随机图API访问\",\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.randomImageAPI.allowedDir,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.settings.randomImageAPI.allowedDir = $event),\n disabled: $data.settings.randomImageAPI.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_5, [_cache[14] || (_cache[14] = _createTextVNode(\"访客图库 \", -1)), _createVNode(_component_el_tooltip, {\n content: \"启用后,访客可通过 /browse 路径浏览指定目录的图片(只读,无法删除/移动)\",\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]), _createVNode(_component_el_form, {\n model: $data.settings.publicBrowse,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"启用\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.publicBrowse.enabled,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.settings.publicBrowse.enabled = $event),\n disabled: $data.settings.publicBrowse.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n prop: \"publicBrowse.allowedDir\"\n }, {\n label: _withCtx(() => [_cache[16] || (_cache[16] = _createElementVNode(\"span\", null, \"开放目录\", -1)), _createVNode(_component_el_tooltip, {\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n content: _withCtx(() => [...(_cache[15] || (_cache[15] = [_createElementVNode(\"div\", {\n style: {\n \"max-width\": \"320px\",\n \"line-height\": \"1.6\"\n }\n }, [_createElementVNode(\"p\", {\n style: {\n \"margin\": \"0 0 8px 0\"\n }\n }, [_createElementVNode(\"b\", null, \"允许公开浏览的目录,多个目录用逗号分隔\")]), _createElementVNode(\"p\", {\n style: {\n \"margin\": \"0 0 8px 0\"\n }\n }, \"示例:wallpaper,photos,album\"), _createElementVNode(\"p\", {\n style: {\n \"margin\": \"0 0 8px 0\",\n \"color\": \"#909399\"\n }\n }, \"支持子目录:2026/lucky,2026/rich\"), _createElementVNode(\"p\", {\n style: {\n \"margin\": \"0\",\n \"color\": \"#67c23a\"\n }\n }, \"访问链接:https://你的域名/browse/2026/lucky\")], -1)]))]),\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.publicBrowse.allowedDir,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.settings.publicBrowse.allowedDir = $event),\n disabled: $data.settings.publicBrowse.fixed,\n placeholder: \"wallpaper,photos,album\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_6, [_cache[17] || (_cache[17] = _createTextVNode(\"CloudFlare API Token \", -1)), _createVNode(_component_el_tooltip, {\n content: \"设置后可以使后端拉黑、删除等操作不受CDN缓存限制
建议设置,设置方式请查阅文档\",\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]), _createVNode(_component_el_form, {\n model: $data.settings.cloudflareApiToken,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"区域ID\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.cloudflareApiToken.CF_ZONE_ID,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => $data.settings.cloudflareApiToken.CF_ZONE_ID = $event),\n disabled: $data.settings.cloudflareApiToken.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"账户邮箱\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.cloudflareApiToken.CF_EMAIL,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.settings.cloudflareApiToken.CF_EMAIL = $event),\n disabled: $data.settings.cloudflareApiToken.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"API Key\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.cloudflareApiToken.CF_API_KEY,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => $data.settings.cloudflareApiToken.CF_API_KEY = $event),\n disabled: $data.settings.cloudflareApiToken.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_7, [_cache[18] || (_cache[18] = _createTextVNode(\"WebDAV \", -1)), _createVNode(_component_el_tooltip, {\n content: \"启用后,可以通过WebDAV协议访问和管理图片\",\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n style: {\n \"margin-left\": \"5px\",\n \"cursor\": \"pointer\"\n }\n })]),\n _: 1\n })]), _createVNode(_component_el_form, {\n model: $data.settings.webDAV,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: \"启用\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.webDAV.enabled,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $data.settings.webDAV.enabled = $event),\n disabled: $data.settings.webDAV.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"用户名\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.webDAV.username,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => $data.settings.webDAV.username = $event),\n disabled: $data.settings.webDAV.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: \"密码\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.webDAV.password,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => $data.settings.webDAV.password = $event),\n disabled: $data.settings.webDAV.fixed,\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"])]), _createElementVNode(\"div\", _hoisted_8, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.saveSettings\n }, {\n default: _withCtx(() => [...(_cache[19] || (_cache[19] = [_createTextVNode(\"保存设置\", -1)]))]),\n _: 1\n }, 8, [\"onClick\"])])])), [[_directive_loading, $data.loading]]);\n}","import \"core-js/modules/es.json.stringify.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nexport default {\n data() {\n return {\n settings: {\n telemetry: {},\n randomImageAPI: {},\n cloudflareApiToken: {},\n webDAV: {},\n publicBrowse: {}\n },\n // 加载状态\n loading: false\n };\n },\n computed: {},\n methods: {\n saveSettings() {\n fetchWithAuth('/api/manage/sysConfig/others', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(this.settings)\n }).then(() => this.$message.success('设置已保存'));\n }\n },\n mounted() {\n this.loading = true;\n // 获取上传设置\n fetchWithAuth('/api/manage/sysConfig/others').then(response => response.json()).then(data => {\n this.settings = data;\n }).finally(() => {\n this.loading = false;\n });\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogOthers.vue?vue&type=template&id=4d2a1bec&scoped=true\"\nimport script from \"./SysCogOthers.vue?vue&type=script&lang=js\"\nexport * from \"./SysCogOthers.vue?vue&type=script&lang=js\"\n\nimport \"./SysCogOthers.vue?vue&type=style&index=0&id=4d2a1bec&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-4d2a1bec\"]])\n\nexport default __exports__","import \"core-js/modules/es.array.push.js\";\nimport DashboardTabs from '@/components/DashboardTabs.vue';\nimport SysConfigTabs from '@/components/SysConfigTabs.vue';\nimport SysCogStatus from '@/components/SysCogStatus.vue';\nimport SysCogUpload from '@/components/SysCogUpload.vue';\nimport SysCogSecurity from '@/components/SysCogSecurity.vue';\nimport SysCogPage from '@/components/SysCogPage.vue';\nimport SysCogOthers from '@/components/SysCogOthers.vue';\nexport default {\n name: 'SystemConfig',\n data() {\n return {\n activeIndex: 'status',\n isSidebarCollapse: false\n };\n },\n watch: {\n // 监听锚点变化\n '$route.hash': {\n immediate: true,\n handler(newHash) {\n this.activeIndex = newHash.replace('#', '');\n window.scrollTo(0, 0); // 滚动到页面顶部\n }\n },\n activeIndex(newIndex) {\n // 更新锚点\n const hash = `#${newIndex}`;\n this.$router.push({\n hash\n });\n }\n },\n components: {\n DashboardTabs,\n SysConfigTabs,\n SysCogStatus,\n SysCogUpload,\n SysCogSecurity,\n SysCogPage,\n SysCogOthers\n },\n computed: {\n disableTooltip() {\n return window.innerWidth < 768;\n },\n // 根据锚点动态返回对应的组件\n currentComponent() {\n const hash = this.$route.hash.replace('#', '');\n switch (hash) {\n case 'status':\n return SysCogStatus;\n case 'upload':\n return SysCogUpload;\n case 'security':\n return SysCogSecurity;\n case 'page':\n return SysCogPage;\n case 'others':\n return SysCogOthers;\n default:\n return SysCogStatus;\n }\n }\n },\n methods: {\n handleLogout() {\n this.$store.commit('setCredentials', null);\n this.$router.push('/adminLogin');\n },\n // 设置默认锚点\n setDefaultHash() {\n const defaultHash = '#status'; // 默认锚点\n window.location.hash = defaultHash;\n this.activeIndex = defaultHash.replace('#', '');\n }\n },\n mounted() {\n // 如果 URL 中没有锚点,则设置默认锚点\n if (!window.location.hash) {\n this.setDefaultHash();\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SystemConfig.vue?vue&type=template&id=c5d2c9c2&scoped=true\"\nimport script from \"./SystemConfig.vue?vue&type=script&lang=js\"\nexport * from \"./SystemConfig.vue?vue&type=script&lang=js\"\n\nimport \"./SystemConfig.vue?vue&type=style&index=0&id=c5d2c9c2&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-c5d2c9c2\"]])\n\nexport default __exports__"],"names":["_typeof","o","Symbol","iterator","constructor","prototype","toPrimitive","t","r","e","i","call","TypeError","String","Number","toPropertyKey","_defineProperty","Object","defineProperty","value","enumerable","configurable","writable","_hoisted_1","class","_hoisted_2","_hoisted_3","render","_ctx","_cache","$props","$setup","$data","$options","_component_font_awesome_icon","isCollapse","menuItems","item","key","index","activeIndex","onClick","$event","handleSelect","icon","title","args","toggleCollapse","name","props","type","default","Boolean","data","methods","this","$emit","checkMobile","isMobile","window","innerWidth","mounted","addEventListener","beforeDestroy","removeEventListener","__exports__","_component_DashboardTabs","_component_el_tooltip","_component_el_header","_component_SysConfigTabs","activeTab","disabled","disableTooltip","content","placement","handleLogout","_","isSidebarCollapse","currentComponent","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","_hoisted_45","_hoisted_46","_hoisted_47","_hoisted_48","_hoisted_49","_hoisted_50","_hoisted_51","_hoisted_52","_hoisted_53","_hoisted_54","_hoisted_55","_hoisted_56","_hoisted_57","_hoisted_58","_hoisted_59","_hoisted_60","_hoisted_61","_hoisted_62","_hoisted_63","_hoisted_64","_hoisted_65","_hoisted_66","_hoisted_67","_component_Doughnut","_component_el_button","_component_el_image","_directive_loading","fetchIndexInfo","indexInfo","totalFiles","toLocaleString","formatTime","lastUpdated","getTimeAgo","openReleases","version","keys","channelStats","length","channelChartData","options","chartOptions","count","channel","style","background","getChartColor","getPercentage","typeStats","typeChartData","getTypeChartColor","loading","rebuilding","rebuildIndex","backing","backupData","ref","accept","onChange","handleFileSelect","restoring","selectRestoreFile","newestFile","oldestFile","isImageFile","loadErrors","src","id","fit","onError","handleImageError","isVideoFile","muted","loop","autoplay","metadata","FileName","TimeStamp","round","v","lim","l","h","Math","max","min","p2b","n2b","b2n","n2p","map$1","A","B","C","D","E","F","a","b","c","d","f","hex","h1","h2","eq","isShort","g","hexParse","str","ret","len","alpha","hexString","undefined","HUE_RE","hsl2rgbn","s","n","k","hsv2rgbn","hwb2rgbn","w","rgb","hueValue","rgb2hsl","range","calln","Array","isArray","map","hsl2rgb","hwb2rgb","hsv2rgb","hue","hueParse","m","exec","p1","p2","rotate","deg","hslString","x","Z","Y","X","W","V","U","T","S","R","Q","P","O","N","M","L","K","G","H","I","J","names$1","OiceXe","antiquewEte","aqua","aquamarRe","azuY","beige","bisque","black","blanKedOmond","Xe","XeviTet","bPwn","burlywood","caMtXe","KartYuse","KocTate","cSO","cSnflowerXe","cSnsilk","crimson","cyan","xXe","xcyan","xgTMnPd","xWay","xgYF","xgYy","xkhaki","xmagFta","xTivegYF","xSange","xScEd","xYd","xsOmon","xsHgYF","xUXe","xUWay","xUgYy","xQe","xviTet","dAppRk","dApskyXe","dimWay","dimgYy","dodgerXe","fiYbrick","flSOwEte","foYstWAn","fuKsia","gaRsbSo","ghostwEte","gTd","gTMnPd","Way","gYF","gYFLw","gYy","honeyMw","hotpRk","RdianYd","Rdigo","ivSy","khaki","lavFMr","lavFMrXsh","lawngYF","NmoncEffon","ZXe","ZcSO","Zcyan","ZgTMnPdLw","ZWay","ZgYF","ZgYy","ZpRk","ZsOmon","ZsHgYF","ZskyXe","ZUWay","ZUgYy","ZstAlXe","ZLw","lime","limegYF","lRF","magFta","maPon","VaquamarRe","VXe","VScEd","VpurpN","VsHgYF","VUXe","VsprRggYF","VQe","VviTetYd","midnightXe","mRtcYam","mistyPse","moccasR","navajowEte","navy","Tdlace","Tive","TivedBb","Sange","SangeYd","ScEd","pOegTMnPd","pOegYF","pOeQe","pOeviTetYd","papayawEp","pHKpuff","peru","pRk","plum","powMrXe","purpN","YbeccapurpN","Yd","Psybrown","PyOXe","saddNbPwn","sOmon","sandybPwn","sHgYF","sHshell","siFna","silver","skyXe","UXe","UWay","UgYy","snow","sprRggYF","stAlXe","tan","teO","tEstN","tomato","Qe","viTet","JHt","wEte","wEtesmoke","Lw","LwgYF","unpack","unpacked","tkeys","j","ok","nk","replace","parseInt","names","nameParse","transparent","toLowerCase","RGB_RE","rgbParse","rgbString","to","pow","from","interpolate","rgb1","rgb2","modHSL","ratio","tmp","clone","proto","assign","fromObject","input","functionParse","charAt","Color","_rgb","_valid","valid","obj","mix","color","weight","c1","c2","w2","p","w1","clearer","greyscale","val","opaquer","negate","lighten","darken","saturate","desaturate","noop","uid","isNullOrUndef","toString","slice","isObject","isNumberFinite","isFinite","finiteOrDefault","defaultValue","valueOrDefault","toPercentage","dimension","endsWith","parseFloat","toDimension","callback","fn","thisArg","apply","each","loopable","reverse","_elementsEqual","a0","a1","ilen","v0","v1","datasetIndex","source","target","create","klen","isValidKey","indexOf","_merger","tval","sval","merge","sources","merger","current","mergeIf","_mergerIf","hasOwnProperty","keyResolvers","y","_splitKey","parts","split","part","push","_getKeyResolver","resolveObjectKey","resolver","_capitalize","toUpperCase","defined","isFunction","setsEqual","size","has","_isClickEvent","PI","TAU","PITAU","INFINITY","POSITIVE_INFINITY","RAD_PER_DEG","HALF_PI","QUARTER_PI","TWO_THIRDS_PI","log10","sign","almostEquals","epsilon","abs","niceNum","roundedRange","niceRange","floor","fraction","niceFraction","_factorize","result","sqrt","sort","pop","isNonPrimitive","isNumber","isNaN","almostWhole","rounded","_setMinAndMaxByKey","array","property","toRadians","degrees","toDegrees","radians","_decimalPlaces","getAngleFromPoint","centrePoint","anglePoint","distanceFromXCenter","distanceFromYCenter","radialDistanceFromCenter","angle","atan2","distance","distanceBetweenPoints","pt1","pt2","_angleDiff","_normalizeAngle","_angleBetween","start","end","sameAngleIsFullCircle","angleToStart","angleToEnd","startToAngle","endToAngle","_limitValue","_int16Range","_isBetween","_lookup","table","cmp","mid","hi","lo","_lookupByKey","last","ti","_rlookupByKey","_filterBetween","values","arrayEvents","listenArrayEvents","listener","_chartjs","listeners","forEach","method","base","res","object","unlistenArrayEvents","stub","splice","_arrayUnique","items","set","Set","requestAnimFrame","requestAnimationFrame","throttled","argsToUse","ticking","debounce","delay","timeout","clearTimeout","setTimeout","_toLeftRightCenter","align","_alignStartEnd","_textX","left","right","rtl","check","_getStartAndCountOfVisiblePoints","meta","points","animationsDisabled","pointCount","_sorted","iScale","vScale","_parsed","spanGaps","dataset","axis","minDefined","maxDefined","getUserBounds","getPixelForValue","distanceToDefinedLo","findIndex","point","distanceToDefinedHi","_scaleRangesChanged","xScale","yScale","_scaleRanges","newRanges","xmin","xmax","ymin","ymax","changed","atEdge","elasticIn","sin","elasticOut","effects","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","cos","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","easeOutElastic","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeInBounce","easeOutBounce","easeInOutBounce","isPatternOrGradient","getHoverColor","numbers","colors","applyAnimationsDefaults","defaults","duration","easing","describe","_fallback","_indexable","_scriptable","properties","active","animation","resize","show","animations","visible","hide","applyLayoutsDefaults","autoPadding","padding","top","bottom","intlCache","Map","getNumberFormat","locale","cacheKey","JSON","stringify","formatter","get","Intl","NumberFormat","formatNumber","num","format","formatters","numeric","tickValue","ticks","chart","notation","delta","maxTick","calculateDelta","logDelta","numDecimal","minimumFractionDigits","maximumFractionDigits","logarithmic","remain","significand","includes","Ticks","applyScaleDefaults","display","offset","beginAtZero","bounds","clip","grace","grid","lineWidth","drawOnChartArea","drawTicks","tickLength","tickWidth","tickColor","border","dash","dashOffset","width","text","minRotation","maxRotation","mirror","textStrokeWidth","textStrokeColor","autoSkip","autoSkipPadding","labelOffset","minor","major","crossAlign","showLabelBackdrop","backdropColor","backdropPadding","route","startsWith","overrides","descriptors","getScope$1","node","root","scope","Defaults","_descriptors","_appliers","backgroundColor","borderColor","datasets","devicePixelRatio","context","platform","getDevicePixelRatio","elements","events","font","family","lineHeight","hover","hoverBackgroundColor","ctx","hoverBorderColor","hoverColor","indexAxis","interaction","mode","intersect","includeInvisible","maintainAspectRatio","onHover","parsing","plugins","responsive","scale","scales","showLine","drawActiveElementsOnTop","override","targetScope","targetName","scopeObject","targetScopeObject","privateName","defineProperties","local","appliers","toFontString","_measureText","gc","longest","string","textWidth","measureText","_longestText","arrayOfThings","cache","garbageCollect","save","jlen","thing","nestedThing","restore","gcLen","_alignPixel","pixel","currentDevicePixelRatio","halfWidth","clearCanvas","canvas","getContext","resetTransform","clearRect","height","drawPoint","drawPointLegend","xOffset","yOffset","cornerRadius","xOffsetW","yOffsetW","pointStyle","rotation","radius","rad","translate","drawImage","beginPath","ellipse","arc","closePath","moveTo","lineTo","SQRT1_2","rect","fill","borderWidth","stroke","_isPointInArea","area","margin","clipArea","unclipArea","_steppedLineTo","previous","flip","midpoint","_bezierCurveTo","bezierCurveTo","cp1x","cp2x","cp1y","cp2y","setRenderOpts","opts","translation","fillStyle","textAlign","textBaseline","decorateText","line","strikethrough","underline","metrics","actualBoundingBoxLeft","actualBoundingBoxRight","actualBoundingBoxAscent","actualBoundingBoxDescent","yDecoration","strokeStyle","decorationWidth","drawBackdrop","oldColor","fillRect","renderText","lines","strokeWidth","strokeColor","backdrop","strokeText","maxWidth","fillText","addRoundedRectPath","topLeft","bottomLeft","bottomRight","topRight","LINE_HEIGHT","FONT_STYLE","toLineHeight","matches","match","numberOrZero","_readValueToProps","objProps","read","prop","toTRBL","toTRBLCorners","toPadding","toFont","fallback","console","warn","resolve","inputs","info","cacheable","_addGrace","minmax","change","keepZero","add","createContext","parentContext","_createResolver","scopes","prefixes","rootScopes","getTarget","finalRootScopes","_resolve","toStringTag","_cacheable","_scopes","_rootScopes","_getTarget","Proxy","deleteProperty","_keys","_cached","_resolveWithPrefixes","getOwnPropertyDescriptor","Reflect","getPrototypeOf","getKeysFromAllScopes","ownKeys","storage","_storage","_attachContext","proxy","subProxy","descriptorDefaults","_proxy","_context","_subProxy","_stack","setContext","receiver","_resolveWithContext","allKeys","scriptable","indexable","_allKeys","isScriptable","isIndexable","readKey","prefix","needsSubResolver","_resolveScriptable","_resolveArray","getValue","Error","join","delete","createSubResolver","arr","filter","resolveFallback","getScope","parent","addScopes","parentScopes","parentFallback","allScopes","addScopesFromKey","subGetTarget","resolveKeysFromAllScopes","_parseObjectDataRadialScale","_parsing","parsed","parse","EPSILON","getPoint","skip","getValueAxis","splineCurve","firstPoint","middlePoint","afterPoint","next","d01","d12","s01","s12","fa","fb","monotoneAdjust","deltaK","mK","pointsLen","alphaK","betaK","tauK","squaredMagnitude","pointCurrent","pointAfter","monotoneCompute","valueAxis","pointBefore","iPixel","vPixel","splineCurveMonotone","slopeDelta","capControlPoint","pt","capBezierPoints","inArea","inAreaPrev","inAreaNext","_updateBezierControlPoints","controlPoints","cubicInterpolationMode","prev","tension","_isDomSupported","document","_getParentNode","domNode","parentNode","host","parseMaxStyle","styleValue","parentProperty","valueInPixels","getComputedStyle","element","ownerDocument","defaultView","getStyle","el","getPropertyValue","positions","getPositionedStyle","styles","suffix","pos","useOffsetPos","shadowRoot","getCanvasPosition","touches","offsetX","offsetY","box","getBoundingClientRect","clientX","clientY","getRelativePosition","event","borderBox","boxSizing","paddings","borders","getContainerSize","maxHeight","container","containerStyle","containerBorder","containerPadding","clientWidth","clientHeight","round1","getMaximumSize","bbWidth","bbHeight","aspectRatio","margins","containerSize","maintainHeight","retinaScale","forceRatio","forceStyle","pixelRatio","deviceHeight","deviceWidth","setTransform","supportsEventListenerOptions","passiveSupported","passive","readUsedSize","_pointInLine","_steppedInterpolation","_bezierInterpolation","cp1","cp2","getRightToLeftAdapter","rectX","setWidth","xPlus","leftForLtr","itemWidth","getLeftToRightAdapter","_itemWidth","getRtlAdapter","overrideTextDirection","direction","original","getPropertyPriority","setProperty","prevTextDirection","restoreTextDirection","propertyFn","between","compare","normalize","normalizeSegment","getSegment","segment","startBound","endBound","_boundSegment","prevValue","inside","subStart","startIsBefore","endIsBefore","shouldStart","shouldStop","_boundSegments","segments","sub","findStartAndEnd","solidSegments","cur","stop","_computeSegments","segmentOptions","_loop","splitByStyles","completeLoop","_fullLoop","doSplitByStyles","chartContext","_chart","baseStyle","readStyle","_datasetIndex","prevStyle","addStyle","st","dir","p0","p0DataIndex","p1DataIndex","styleChanged","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","replacer","getSizeForArea","chartArea","field","getDatasetArea","getDatasetClipArea","_clip","Animator","_request","_charts","_running","_lastDate","_notify","anims","date","callbacks","numSteps","initial","currentStep","_refresh","_update","Date","now","remaining","running","draw","_active","_total","tick","_getAnims","charts","complete","progress","listen","cb","reduce","acc","_duration","cancel","remove","animator","interpolators","boolean","factor","c0","number","Animation","cfg","currentValue","_fn","_easing","_start","_target","_prop","_from","_to","_promises","update","elapsed","wait","promises","Promise","rej","resolved","Animations","config","_properties","configure","animationOptions","animatedProps","getOwnPropertyNames","option","_animateOptions","newOptions","resolveTargetOptions","_createAnimations","$shared","awaitAll","$animations","then","anim","all","scaleClip","allowedOverflow","defaultClip","toClip","getSortedDatasetIndices","filterVisible","metasets","_getSortedDatasetMetas","applyStack","stack","dsIndex","singleMode","otherValue","found","convertObjectDataToArray","iAxisKey","vAxisKey","adata","isStacked","stacked","getStackKey","indexScale","valueScale","NEGATIVE_INFINITY","getOrCreateStack","stacks","stackKey","indexValue","subStack","getLastIndexInStack","positive","getMatchingVisibleMetas","updateStacks","controller","_cachedMeta","_stacks","iAxis","vAxis","itemStacks","_top","_bottom","visualValues","_visualValues","getFirstScaleId","shift","createDatasetContext","createDataContext","dataIndex","raw","clearStacks","isDirectUpdateMode","cloneIfNotShared","cached","shared","createStack","canStack","hidden","_stacked","DatasetController","_cachedDataOpts","getMeta","_type","_data","_objectData","_sharedOptions","_drawStart","_drawCount","enableOptionSharing","supportsDecimation","$context","_syncList","datasetElementType","dataElementType","initialize","linkScales","addElements","isPluginEnabled","updateIndex","getDataset","chooseId","xid","xAxisID","yid","yAxisID","rid","rAxisID","iid","iAxisID","vid","vAxisID","getScaleForId","rScale","getDatasetMeta","scaleID","_getOtherScale","reset","_destroy","_dataCheck","isExtensible","buildOrUpdateElements","resetNewElements","stackChanged","oldStacked","_resyncElements","scopeKeys","datasetScopeKeys","getOptionScopes","createResolver","sorted","parseArrayData","parseObjectData","parsePrimitiveData","isNotInOrderComparedToPrev","labels","getLabels","singleScale","xAxisKey","yAxisKey","getParsed","getDataElement","updateRangeFromParsed","parsedValue","NaN","getMinMax","otherScale","otherMin","otherMax","_skip","getAllParsedValues","getMaxOverflow","getLabelAndValue","label","getLabelForValue","resolveDatasetElementOptions","resolveDataElementOptions","_resolveElementOptions","elementType","sharing","datasetElementScopeKeys","resolveNamedOptions","freeze","_resolveAnimations","transition","datasetAnimationScopeKeys","getSharedOptions","includeOptions","sharedOptions","_animationsDisabled","_getSharedOptions","firstOpts","previouslySharedOptions","updateSharedOptions","updateElement","_setStyle","removeHoverStyle","setHoverStyle","_removeDatasetHoverStyle","_setDatasetHoverStyle","arg1","arg2","numMeta","numData","_insertElements","_removeElements","move","updateElements","removed","_sync","_dataChanges","_onDataPush","arguments","_onDataPop","_onDataShift","_onDataSplice","newCount","_onDataUnshift","getAllScaleValues","$bar","visibleMetas","concat","computeMinSampleSize","curr","_length","updateMinAndPrev","getPixelForTick","computeFitCategoryTraits","ruler","stackCount","thickness","barThickness","categoryPercentage","barPercentage","chunk","pixels","computeFlexCategoryTraits","percent","parseFloatBar","entry","startValue","endValue","barStart","barEnd","_custom","parseValue","parseArrayOrPrimitive","isFloatBar","custom","barSign","actualBase","isHorizontal","borderProps","horizontal","setBorderSkipped","edge","borderSkipped","enableBorderRadius","parseEdge","swap","startEnd","orig","v2","setInflateAmount","inflateAmount","BarController","super","bars","getBasePixel","_getRuler","vpixels","head","_calculateBarValuePixels","ipixels","_calculateBarIndexPixels","center","_getStacks","grouped","currentParsed","iScaleValue","skipNull","find","_getStackCount","_getAxisCount","_getAxis","getFirstScaleIdForIndexAxis","indexScaleId","firstScaleAxisId","_getStackIndex","_startPixel","_endPixel","baseValue","minBarLength","floating","getDataVisibility","startPixel","getPixelForDecimal","endPixel","getValueForPixel","halfGrid","getLineWidthForValue","maxBarThickness","Infinity","axisCount","axisID","axisNumber","stackIndex","rects","_index_","_value_","BubbleController","getRatioAndOffset","circumference","cutout","ratioX","ratioY","startAngle","endAngle","startX","startY","endX","endY","calcMax","calcMin","maxX","maxY","minX","minY","DoughnutController","innerRadius","outerRadius","getter","_getRotation","_getCircumference","_getRotationExtents","isDatasetVisible","arcs","spacing","getMaxBorderWidth","getMaxOffset","maxSize","chartWeight","_getRingWeight","maxRadius","radiusLength","_getVisibleDatasetWeightTotal","total","calculateTotal","_getRingWeightOffset","_circumference","animateRotate","calculateCircumference","animationOpts","centerX","centerY","animateScale","metaData","borderAlign","hoverBorderWidth","hoverOffset","ringWeightOffset","legend","generateLabels","useBorderRadius","borderRadius","fontColor","lineDash","lineDashOffset","lineJoin","legendItem","toggleDataVisibility","LineController","_dataset","_decimated","animated","maxGapLength","directUpdate","pointsCount","prevParsed","nullData","lastPoint","updateControlPoints","PolarAreaController","bind","_updateRadius","minSize","cutoutPercentage","getVisibleDatasetCount","xCenter","yCenter","datasetStartAngle","getIndexAngle","defaultAngle","countVisibleElements","_computeAngle","getDistanceFromCenterForValue","angleLines","circular","pointLabels","PieController","RadarController","pointPosition","getPointPositionForValue","ScatterController","registry","getElement","abstract","DateAdapterBase","members","init","formats","diff","startOf","endOf","adapters","_date","binarySearch","metaset","lookupMethod","_reversePixels","getRange","evaluateInteractionItems","position","handler","getSortedVisibleDatasetMetas","getDistanceMetricForAxis","useX","useY","deltaX","deltaY","getIntersectItems","useFinalPosition","isPointInArea","evaluationFunc","inRange","getNearestRadialItems","getProps","getNearestCartesianItems","distanceMetric","minDistance","getCenterPoint","pointInArea","getNearestItems","getAxisItems","rangeMethod","intersectsItem","Interaction","modes","nearest","STATIC_POSITIONS","filterByPosition","filterDynamicPositionByAxis","sortByWeight","wrapBoxes","boxes","layoutBoxes","stackWeight","buildStacks","layouts","wrap","placed","setLayoutDims","params","vBoxMaxWidth","hBoxMaxHeight","layout","fullSize","availableWidth","availableHeight","buildLayoutBoxes","centerHorizontal","centerVertical","leftAndTop","rightAndBottom","vertical","getCombinedMax","maxPadding","updateMaxPadding","boxPadding","updateDims","getPadding","newWidth","outerWidth","newHeight","outerHeight","widthChanged","heightChanged","same","other","handleMaxPadding","updatePos","getMargins","marginForPositions","fitBoxes","refitBoxes","refit","setBoxDims","placeBoxes","userPadding","addBox","_layers","z","removeBox","layoutItem","minPadding","verticalBoxes","horizontalBoxes","beforeLayout","visibleVerticalBoxCount","BasePlatform","acquireContext","releaseContext","isAttached","updateConfig","BasicPlatform","EXPANDO_KEY","EVENT_TYPES","touchstart","touchmove","touchend","pointerenter","pointerdown","pointermove","pointerup","pointerleave","pointerout","isNullOrEmpty","initCanvas","renderHeight","getAttribute","renderWidth","displayWidth","displayHeight","eventListenerOptions","addListener","removeListener","fromNativeEvent","native","nodeListContains","nodeList","contains","createAttachObserver","observer","MutationObserver","entries","trigger","addedNodes","removedNodes","observe","childList","subtree","createDetachObserver","drpListeningCharts","oldDevicePixelRatio","onWindowResize","dpr","listenDevicePixelRatioChanges","unlistenDevicePixelRatioChanges","createResizeObserver","ResizeObserver","contentRect","releaseObserver","disconnect","createProxyAndListen","DomPlatform","removeAttribute","setAttribute","proxies","$proxies","handlers","attach","detach","isConnected","_detectPlatform","OffscreenCanvas","Element","tooltipPosition","hasValue","final","tickOpts","determinedMaxTicks","determineMaxTicks","ticksLimit","maxTicksLimit","majorIndices","enabled","getMajorIndices","numMajorIndices","first","newTicks","skipMajors","calculateSpacing","avgMajorSpacing","_tickSize","maxScale","maxChart","_maxLength","evenMajorSpacing","getEvenSpacing","factors","ceil","majorStart","majorEnd","reverseAlign","offsetFromEdge","getTicksLimit","ticksLength","sample","numItems","increment","getPixelForGridLine","offsetGridLines","validIndex","lineValue","caches","getTickMarkLength","getTitleHeight","createScaleContext","createTickContext","titleAlign","titleArgs","titleX","titleY","positionAxisID","Scale","_margins","paddingTop","paddingBottom","paddingLeft","paddingRight","labelRotation","_range","_gridLineItems","_labelItems","_labelSizes","_longestTextCache","_userMax","_userMin","_suggestedMax","_suggestedMin","_ticksLength","_borderValue","_dataLimitsCached","suggestedMin","suggestedMax","metas","getTicks","xLabels","yLabels","getLabelItems","_computeLabelItems","beforeUpdate","sampleSize","beforeSetDimensions","setDimensions","afterSetDimensions","beforeDataLimits","determineDataLimits","afterDataLimits","beforeBuildTicks","buildTicks","afterBuildTicks","samplingEnabled","_convertTicksToLabels","beforeCalculateLabelRotation","calculateLabelRotation","afterCalculateLabelRotation","afterAutoSkip","beforeFit","afterFit","afterUpdate","reversePixels","_alignToPixels","alignToPixels","_callHooks","notifyPlugins","beforeTickToLabelConversion","generateTickLabels","afterTickToLabelConversion","numTicks","maxLabelDiagonal","_isVisible","labelSizes","_getLabelSizes","maxLabelWidth","widest","maxLabelHeight","highest","asin","titleOpts","gridOpts","titleHeight","tickPadding","angleRadians","labelHeight","labelWidth","_calculatePadding","_handleMargins","isRotated","labelsBelowTicks","offsetLeft","offsetRight","isFullSize","_computeLabelSizes","widths","heights","tickFont","fontString","nestedLabel","widestLabelSize","highestLabelSize","_resolveTickFontOptions","valueAt","idx","decimal","getDecimalForPixel","getBaseValue","optionTicks","rot","_computeGridLineItems","tl","borderOpts","axisWidth","axisHalfWidth","alignBorderValue","borderValue","alignedLineValue","tx1","ty1","tx2","ty2","x1","y1","x2","y2","limit","step","optsAtIndex","optsAtIndexBorder","lineColor","tickBorderDash","tickBorderDashOffset","tickAndPadding","hTickAndPadding","lineCount","textOffset","_getXAxisLabelAlignment","_getYAxisLabelAlignment","halfCount","tickTextAlign","labelPadding","_computeLabelArea","drawBackground","drawGrid","drawLine","setLineDash","drawBorder","lastLineWidth","drawLabels","renderTextOptions","drawTitle","tz","gz","bz","_maxDigits","fontSize","TypedRegistry","isForType","isPrototypeOf","register","parentScope","isIChartComponent","registerDefaults","unregister","itemDefaults","defaultRoutes","routeDefaults","routes","propertyParts","sourceName","sourceScope","Registry","controllers","_typedRegistries","_each","addControllers","addPlugins","addScales","getController","_get","getPlugin","getScale","removeControllers","removeElements","removePlugins","removeScales","typedRegistry","arg","reg","_getRegistryForType","_exec","itemReg","component","camelMethod","PluginService","_init","notify","hook","_createDescriptors","descriptor","plugin","cancelable","invalidate","_oldCache","_notifyStateChanges","allPlugins","createDescriptors","previousDescriptors","some","localIds","getOpts","pluginOpts","pluginScopeKeys","getIndexAxis","datasetDefaults","datasetOptions","getAxisFromDefaultScaleID","getDefaultScaleIDFromAxis","idMatchesAxis","axisFromPosition","determineAxis","scaleOptions","getAxisFromDataset","retrieveAxisFromDatasets","boundDs","mergeScaleConfig","chartDefaults","configScales","chartIndexAxis","scaleConf","error","defaultId","defaultScaleOptions","defaultID","initOptions","initData","initConfig","keyCache","keysCached","cachedKeys","generate","addIfFound","Config","_config","_scopeCache","_resolverCache","clearCache","clear","datasetType","additionalOptionScopes","_cachedScopes","mainScope","resetCache","keyLists","chartOptionScopes","subPrefixes","getResolver","needContext","subResolver","resolverCache","hasFunction","KNOWN_POSITIONS","positionIsHorizontal","compare2Level","l1","l2","onAnimationsComplete","onComplete","onAnimationProgress","onProgress","getCanvas","getElementById","instances","getChart","moveNumericKeys","intKey","determineLastEvent","lastEvent","inChartArea","isClick","Chart","invalidatePlugins","userConfig","initialCanvas","existingChart","_options","_aspectRatio","_metasets","_lastEvent","_listeners","_responsiveListeners","_sortedMetasets","_plugins","_hiddenIndices","attached","_doResize","resizeDelay","_initialize","bindEvents","_resizeBeforeDraw","_resize","newSize","newRatio","onResize","ensureScalesHaveIDs","scalesOptions","axisOptions","buildOrUpdateScales","scaleOpts","updated","isRadial","dposition","dtype","scaleType","scaleClass","hasUpdated","_updateMetasets","_destroyDatasetMeta","_removeUnreferencedMetasets","buildOrUpdateControllers","newControllers","order","ControllerClass","_resetElements","animsDisabled","_updateScales","_checkEventBindings","_updateHiddenIndices","_minPadding","_updateLayout","_updateDatasets","_eventHandler","_updateHoverStyles","existingEvents","newEvents","unbindEvents","changes","_getUniformDataChanges","datasetCount","makeSet","changeSet","noArea","_idx","_updateDataset","layers","_drawDatasets","_drawDataset","getElementsAtEventForMode","setDatasetVisibility","_updateVisibility","_stop","destroy","toBase64Image","toDataURL","bindUserEvents","bindResponsiveEvents","_add","_remove","detached","updateHoverStyle","getActiveElements","setActiveElements","activeElements","lastActive","pluginId","replay","hoverOptions","deactivated","activated","eventFilter","_handleEvent","_getActiveElements","clipSelf","outerAngleClip","innerAngleClip","clipWidth","clipArc","pixelMargin","angleMargin","toRadiusCorners","parseBorderRadius$1","angleDelta","halfThickness","innerLimit","computeOuterLimit","outerArcLimit","outerStart","outerEnd","innerStart","innerEnd","rThetaToXY","theta","pathArc","innerR","spacingOffset","noSpacingInnerRadius","noSpacingOuterRadius","avNogSpacingRadius","adjustedAngle","beta","angleOffset","outerStartAdjustedRadius","outerEndAdjustedRadius","outerStartAdjustedAngle","outerEndAdjustedAngle","innerStartAdjustedRadius","innerEndAdjustedRadius","innerStartAdjustedAngle","innerEndAdjustedAngle","outerMidAdjustedAngle","pCenter","p4","innerMidAdjustedAngle","p8","outerStartX","outerStartY","outerEndX","outerEndY","drawArc","fullCircles","inner","selfJoin","ArcElement","chartX","chartY","rAdjust","nonZeroBetween","betweenAngles","withinRadius","halfAngle","halfRadius","fix","radiusOffset","setStyle","lineCap","getLineMethod","stepped","pathVars","paramsStart","paramsEnd","segmentStart","segmentEnd","outside","pathSegment","lineMethod","fastPathSegment","prevX","lastY","avgX","countX","pointIndex","drawX","truncX","_getSegmentMethod","useFastPath","_getInterpolationMethod","strokePathWithCache","path","_path","Path2D","strokePathDirect","segmentMethod","usePath2D","LineElement","_points","_segments","_pointsUpdated","_interpolate","interpolated","inRange$1","hitRadius","PointElement","mouseX","mouseY","inXRange","inYRange","hoverRadius","getBarBounds","bar","half","skipOrLimit","parseBorderWidth","maxW","maxH","parseBorderRadius","maxR","enableBorder","boundingRects","outer","skipX","skipY","skipBoth","hasRadius","addNormalRectPath","inflateRect","amount","refRect","BarElement","addRectPath","getBoxSize","labelOpts","boxHeight","boxWidth","usePointStyle","pointStyleWidth","itemHeight","itemsEqual","Legend","_added","legendHitBoxes","_hoveredItem","doughnutMode","legendItems","columnSizes","lineWidths","buildLabels","labelFont","_computeTitleHeight","_fitRows","_fitCols","hitboxes","totalHeight","row","_itemHeight","heightLimit","totalWidth","currentColWidth","currentColHeight","col","calculateItemSize","adjustHitBoxes","rtlHelper","hitbox","_draw","defaultColor","halfFontSize","cursor","drawLegendBox","drawOptions","SQRT2","yBoxTop","xBoxLeft","textDirection","realX","fontLineHeight","calculateLegendItemHeight","titleFont","titlePadding","topPaddingPlusHalfFontSize","_getLegendItemAt","hitBox","lh","handleEvent","isListened","hoveredItem","sameItem","onLeave","calculateItemWidth","calculateItemHeight","legendItemText","plugin_legend","_element","_args","afterEvent","ci","WeakMap","positioners","average","xSet","xAverage","eventPosition","nearestElement","tp","pushOrConcat","toPush","splitNewlines","createTooltipItem","formattedValue","getTooltipSize","tooltip","body","footer","bodyFont","footerFont","titleLineCount","footerLineCount","bodyLineItemCount","combinedBodyLength","bodyItem","before","after","beforeBody","afterBody","titleSpacing","titleMarginBottom","bodyLineHeight","displayColors","bodySpacing","footerMarginTop","footerSpacing","widthPadding","maxLineWidth","determineYAlign","doesNotFitWithAlign","xAlign","caret","caretSize","caretPadding","determineXAlign","yAlign","chartWidth","determineAlignment","alignX","alignY","paddingAndSize","getBackgroundPoint","alignment","getAlignedX","getBeforeAfterBodyLines","createTooltipContext","tooltipItems","overrideCallbacks","defaultCallbacks","beforeTitle","labelCount","afterTitle","beforeLabel","tooltipItem","labelColor","labelTextColor","bodyColor","labelPointStyle","afterLabel","beforeFooter","afterFooter","invokeCallbackWithFallback","Tooltip","opacity","_eventPosition","_size","_cachedAnimations","_tooltipItems","dataPoints","caretX","caretY","labelColors","labelPointStyles","labelTextColors","getTitle","getBeforeBody","getBody","bodyItems","scoped","getAfterBody","getFooter","_createItems","itemSort","positionAndSize","backgroundPoint","external","drawCaret","tooltipPoint","caretPosition","getCaretPosition","x3","y3","ptX","ptY","titleColor","_drawColorBox","colorX","rtlColorX","yOffSet","colorY","multiKeyBackground","outerX","innerX","strokeRect","drawBody","bodyAlign","xLinePadding","fillLineOfText","bodyAlignForCalculation","textColor","drawFooter","footerAlign","footerColor","tooltipSize","quadraticCurveTo","_updateAnimationTarget","animX","animY","_willRender","hasTooltipContent","globalAlpha","positionChanged","_positionChanged","_ignoreReplayEvents","plugin_tooltip","afterInit","afterDraw","addIfString","addedLabels","unshift","findOrAddLabel","lastIndexOf","_getLabelForValue","CategoryScale","_startValue","_valueRange","_addedLabels","added","generateTicks$1","generationOptions","dataRange","MIN_SPACING","precision","maxTicks","maxDigits","includeBounds","unit","maxSpaces","rmin","rmax","countDefined","minSpacing","niceMin","niceMax","numSpaces","decimalPlaces","relativeLabelSize","LinearScaleBase","_endValue","handleTickRangeOptions","setMin","setMax","minSign","maxSign","getTickLimit","stepSize","computeTickLimit","numericGeneratorOptions","LinearScale","log10Floor","changeExponent","isMajor","tickVal","steps","rangeExp","rangeStep","startExp","generateTicks","minExp","exp","lastTick","LogarithmicScale","_zero","getTickBackdropHeight","measureLabelSize","determineLimits","fitWithPointLabels","_padding","limits","valueCount","_pointLabels","pointLabelOpts","additionalAngle","centerPointLabels","getPointLabelContext","getPointPosition","drawingArea","plFont","textSize","hLimits","vLimits","updateLimits","setCenterPoint","_pointLabelItems","buildPointLabelItems","createPointLabelItem","itemOpts","outerDistance","extra","pointLabelPosition","yForAngle","getTextAlignForAngle","leftForTextAlign","isNotOverlapped","apexesInArea","drawPointLabelBox","backdropLeft","backdropTop","backdropWidth","backdropHeight","drawPointLabels","pathRadiusLine","drawRadiusLine","gridLineOpts","createPointLabelContext","RadialLinearScale","leftMovement","rightMovement","topMovement","bottomMovement","angleMultiplier","scalingFactor","getValueForDistanceFromCenter","scaledDistance","pointLabel","distanceFromCenter","getBasePosition","getPointLabelPosition","animate","INTERVALS","millisecond","common","second","minute","hour","day","week","month","quarter","year","UNITS","sorter","adapter","_adapter","parser","isoWeekday","_parseOpts","determineUnitForAutoTicks","minUnit","capacity","interval","MAX_SAFE_INTEGER","determineUnitForFormatting","determineMajorUnit","addTick","time","timestamps","timestamp","setMajorTicks","majorUnit","ticksFromTimestamps","TimeScale","_unit","_majorUnit","_offsets","_normalized","displayFormats","normalized","_applyBounds","_getLabelBounds","getLabelTimestamps","timeOpts","_generate","_getLabelCapacity","initOffsets","offsetAfterAutoskip","getDecimalForValue","weekday","hasWeekday","getDataTimestamps","tooltipFormat","datetime","fmt","_tickFormatFunction","minorFormat","majorFormat","offsets","_getLabelSize","ticksOpts","tickLabelWidth","cosRotation","sinRotation","tickFontSize","exampleTime","exampleLabel","prevSource","nextSource","prevTarget","nextTarget","span","TimeSeriesScale","_table","_minPos","_tableRange","_getTimestampsForTable","buildLookupTable","CommonProps","required","datasetIdKey","updateMode","A11yProps","ariaLabel","ariaDescribedby","Props","destroyDelay","compatProps","internals","attrs","toRawIfProxy","isProxy","toRaw","cloneProxy","setOptions","nextOptions","setLabels","currentData","nextLabels","setDatasets","nextDatasets","addedDatasets","nextDataset","currentDataset","cloneData","nextData","defineComponent","setup","param","expose","slots","canvasRef","chartRef","shallowRef","renderChart","clonedData","proxiedData","Chart$1","destroyChart","onMounted","onUnmounted","watch","param1","nextOptionsProxy","nextDataProxy","prevOptionsProxy","prevDataProxy","shouldUpdate","prevOptions","prevLabels","prevDatasets","nextTick","deep","role","createTypedChart","registerables","reforwardRef","Doughnut","components","newest","oldest","channelColors","typeColors","computed","stats","percentage","toFixed","response","fetchWithAuth","json","$message","success","errorData","blob","url","URL","createObjectURL","createElement","href","download","toISOString","appendChild","click","removeChild","revokeObjectURL","message","$refs","fileInput","file","files","$confirm","confirmButtonText","cancelButtonText","restoreData","headers","restoredFiles","restoredSettings","minutes","hours","days","isValidPreview","FileType","open","fileName","extension","substring","imageExtensions","videoExtensions","_component_el_radio","_component_el_radio_group","_component_el_switch","_component_el_form_item","_component_el_form","_component_el_input","_component_el_input_number","_component_el_progress","modelValue","activeChannel","channels","activeChannelLabel","model","telegramSettings","loadBalance","rules","tgRules","ref_for","fixed","botToken","autocomplete","chatId","deleteChannel","cfr2Settings","publicUrl","quota","onQuotaEnabledChange","limitGB","threshold","link","refreshQuota","quotaLoading","getQuotaPercentage","status","getQuotaStatus","getQuotaText","isQuotaExceeded","getQuotaStatusText","s3Settings","s3Rules","endpoint","pathStyle","bucketName","region","placeholder","accessKeyId","secretAccessKey","discordSettings","discordRules","channelId","proxyUrl","isNitro","huggingfaceSettings","huggingfaceRules","repo","token","isPrivate","addChannel","saveSettings","validator","rule","savePath","quotaStats","validationPromises","tgChannelForm","form","validate","s3ChannelForm","discordChannelForm","huggingfaceChannelForm","results","isValid","every","settings","telegram","cfr2","s3","discord","huggingface","getResponse","getData","loadQuotaStats","getChannelUsedGB","usedMB","usedGB","async","recalculateQuota","catch","finally","_component_el_table_column","_component_el_tag","_component_el_table","_component_el_option","_component_el_select","_component_el_checkbox","_component_el_checkbox_group","_component_el_dialog","authSettings","user","userPassRules","authCode","onInput","handleUserPassInput","showUserPassConfirm","confirmNewUserPassword","admin","adminPassRules","adminUsername","adminPassword","handleAdminPassInput","showAdminPassConfirm","confirmNewAdminPassword","showCreateTokenDialog","circle","apiTokens","permissions","perm","getPermissionText","formatDate","createdAt","editToken","deleteToken","tokenLoading","uploadSettings","moderate","moderateContentApiKey","nsfwApiPath","accessSettings","allowedDomains","whiteListMode","dialogWidth","createToken","newToken","tokenRules","showEditTokenDialog","updateToken","editingToken","showTokenResultDialog","createdToken","readonly","append","copyToken","oriUserPassword","oriAdminPassword","owner","urlReservedChars","hasReservedChar","char","permission","permissionMap","dateString","loadApiTokens","tokens","tokenForm","editTokenForm","tokenId","navigator","clipboard","writeText","userPassForm","adminPassForm","auth","upload","access","groupedSettings","categoryGroup","categoryName","setting","category","telemetry","randomImageAPI","allowedDir","publicBrowse","cloudflareApiToken","CF_ZONE_ID","CF_EMAIL","CF_API_KEY","webDAV","username","password","immediate","newHash","scrollTo","newIndex","hash","$router","DashboardTabs","SysConfigTabs","SysCogStatus","SysCogUpload","SysCogSecurity","SysCogPage","SysCogOthers","$route","$store","commit","setDefaultHash","defaultHash","location"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/js/424.28a751ba.js.map.gz b/js/424.28a751ba.js.map.gz deleted file mode 100644 index 9ba164b017d3be21a8e00a569096e96ecdd8c34a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 300876 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
x@&MG`DsULFFd$f2>YU9F_#FD&JhC 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

e939+h1_|K|`Vp7pY!#fYOLD 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�pF73ng-&AVzcr#!GTBm(Agl{lFfE97>l#P+mGR-X%!Kr5PF1#X>;AYtZ`hHH zMvx&xa8G13QGHy(MDWbqbAAxw&?Cc1^|V&hgXGaK)}$&OC_oB-4_&G+4B@aHy$W#5lf>Eqi>N6ApY!l*SMU?MO@su&~6Cg zL!sM`j<-eendfU;H;G_X+cU%e&K9K{YV7V^@oW5hH%`;}?@5nf5_0?~Dtm&6 zWiIl@oLXC&>Z7geVm7lS1ninF8}RDkn2$>4bR-DP?-SGhE*@LZ<-|yAm68>O6Q z`h-o#_yeoJdPU+*m;jvZudrAZx046CBiU|WVXDCOrr{J zS#DG}h0VM2o9vt7a#7U~LDbggc0-Y?2jlUK-5lVujQ`#MqH|rg^lLJ6&DRHH zHsO{B)2g;(SA`qCD`~Ab1;Wgpnd@uFpx$tD5LbU<@^YOS-|ZtV;P0=iWoxO@W@DbC zZ1zcYxu{A?+wd(Wp0_IrrkT$3rZI0}+}HNJXxe&B+d)~5myoO&iAH9cX$Akd;dPcQ zIxu)#B(H;QK(Y@1$`7s=U_SUy`Pn^n*`bYse-0r4v_i6?0r#Ty!fLw4XuypFA5b)} z+}|(H#vv&ie)QEcqkrEJUpQLm4a=qFA#MV-hX}m1D3lwBChB(BTtQil8)0j_K*oZo zyAMNX6&)J{H>?=AUxm3+13`5cd2P$~4eyFfk{nHEi2aT<_w;lA!5YpWYq>87Wg!5E zgdAnnQVl&}G2OhjK99Hn$y+A4`4SL2NJWB4r2jl~(uPPS*T|9R$DSFC2WHP;O~G;& zGnE~&uC7dJugo(rIv5V<2+bvSxP7llAnFI$=(`K|Js$S**AePpR{%f`c>Ja^Hr$tQiZ899`EjZd+^g#3HPsjv*j4 zcHwsH2+NPVokbNyx7$&{ci{J2HI39i2%?LUc?+DR@eU5m^YX&hMJuSyKoXI1Wd>Kwi$0#(sMFBmFulns zfNBY}bXDgM_a+08XtY*u(4aCkc_kMLzOfO(%KLYJFIfMZ} zpW7C;tZdr6oLcPem#T&IipZc84Y%fK<~Xxz$`1qXn5y=_1T@n>_4@-@4=j;d$zf-g zGc(|=Z3dZX>tGUw{qYv2JL65y%)nI}sK$%=5_4py+P>t>mjkY(TT)1iWJAQC%nYcC zZ+38CUZS`XvKApW?q!^Oin%1%fFpxGS}nr7~YsBug@F7 zE9JA<5I)uCQ3mA`I4Hw`yZ8qgwp5o9}N8>X$T$Lj(U2)Q3RYi2(J%^MxdcAlQWp^#Sme=nw(211ai*;|5~X zRpMfIm$tpAX1*iIk@(S%7@TAOYRc<#rSNiEmvffO1`gLLOaaSXp%bL$wFuXMGJv>g zZO_L+@CxaG{IacNTBRKO-Ah*hfw8$^8x0c%l0iZ;kV#HIB*PLk|a!VKHm+RJ>w z4*(F6Oa)Kw*>2lTM^Ptg;aoSgaHuN$d$W)K?(?^35tGZvRY!+$U;!tod3{Tql~UGT z1mlh~6W88!HF&oVvK;EOpD8BX&{JO3H0g9T}LDRLkF?GMTc-^tN{o(3RN z7Cjti=IB_Cb%?eNSoJlpws8f2^(0ElhU@ha4SYNl-K1g2&(K_J2N1BPfB=7M0Crm3 z#9k{!4=RgMi!8#!r=CDTd%U+d>LHP-cCiXs)4r5)n3cZgJzC*|15bW9-K~4oMaNij zBi!QfHtR;*i#$T~Gae5>atM$Yn?`TBceM4FlP^i571||xx)m)Mt`n?kVqat^G|vhD+r?Mq|~QQ3w&Zx z&lCS3SJ~vV$iV5gLZF}qX6ie1a7~p!Y~-Z7W@g}wWsPLJvx8=bW-*T`C z-Iyc%SAXIjNi_1fKIgC9w0S&{9@RNW`)kn{qV}e^ytK0-Z|!_-+-oUs zOjA`Q{G0Qrz%k5=Y0-*mXZgIbkh0quBGCss4nt4zzZjFfcjyf+6sgnJ&(q%)@a}pO=MlkyposeJW5-_cZ99 zywgoBBMnn!1}1cq8LmA*c4D=oWI)TQhBOr`AL?@{1C7OIzE9Z9*3AsRg&5b$6q-bUkP= zrs?kcvn=Bs>ZP9jTY}&k-_`9c^SVscZp-IZ27W*u6Zq%TCv&~&I_89);MAqmuwJo9 zROz9p#7yB~$NZ6A7WDN90E@HWAdx|(07FlQRCLX^u4a8D!{Z-3)K|vCjSy9coY2d^ z8Bc*u&*3IZG0IrCH)yuwf$OC*8!5_<`Mdxk9In@c1M{~FTPn&I*v*We;LLI_s-|I+ zZ&>-<%&O(7GwMD#5CfQ|XqV`jFgDML8^Txi_y3iZ zpD&ldAkD35i%ZhISo8j*n$Mnq(eQf!a$bRDZ8+b){P!NGaaUMx??)9UhoAM*$FRR4Q(P&CcbHV1#X|EGVG zmQa$<<N<#Ri&0G8A0`fm~>M=-SL=_#b_gc*7ae%mKRh|{+F8doCQ8M?Y@}9&wk+TNX zbtD4&P$fZnf4zyUBfNq(pU<6eml_Mbsvp=>l84{pF_3uA@t0?6fx0armM=7YWR8x_ z#PqI|2bsH|wLAP8IM}b{==Rppa)!}!bZJkM2kaa26+%)FZB^XD^Ib-vkS9Os>)Vz6?G(sOtbgOfg! zy&pD8iM60nQi|o;qeDV1L^!N+gN8@N@krsbm<5mnS{4Ue)+8Ld}Mi))4K2E6=79y!7A)$Bp+=6>SGgNed zV4}DV^ErE{X-X685W$wvEw>M|?VI3xC2DcK3H3ES>j2qH#u77(NSZ|9*c~U%n&~}( ze1HtzNWsDKURP&syJG2LU`1maSQq3;uQ-^I3hEm|l;gsoiKgO>W#&WA-3R}i2%Eg8 zm=`NiIYJ<>Lcf;0l#_sQ#q5|?6}W#+?wQgW#E%TUhjQHHh@COy)-gFz#}E^jxz!C+Y3voHS_mn6Wn#kdCyTm z5MepfW(OJ^Hefm?EDT}%1Ul9&&gXO3iwT}}XjgiAno z%)i@p=Ca+uA3rkU#iHrVd*1IRq;{j8kc;CJx5_7a8#2XwZ|&M$$cIA0D(NxClLL1` z_Cn&LtIh-46bb|HV86`fhU{e-UgD}{2z}wRCc1{yWYlTzxN_A2U26a>)T~m45v=;- zU^PhHN$~l{x^hf&hSnxog!tL)Tc_ z;3(b#NX~afQ7L9FznJ_b0=GIv)hulVpYy)G;?M{ox2ledfp_~_p8xUF7PS0IFMYzPhJ(#~}S1|sw9#?LKQjJ|)8mv904 z#UvGIb!G;CxGrX!0d_NXR^V*kZ3a*}FjZ{^ZaM=dF5~y3tptOJ4el46CMG{(x47ge za@{5m>8^R)HPqYmczsw@Psew6@>ytqWv(w5F@}(Pkf`@KZOVdPX!~RD!WJR zaE6cE*?8shBH~1l_>R}AOztap&ZyDd;htq3tOl6_?C9Px+CueJUF)hHe35Sfy|Q@A zBYk{=GxuC$>N-SDR$Kr|K()Vy!AXmkE!<^fp9W4$8~q44E6(3Ivv_xpv7LN;hvIP0 z!$qKPZ82nkR`I4hO4`+zJ-~h}YH$rN&VktkIp-M`U}ICv28~(RnodvbTqGwGT#SI2 zN6tl!TV9V})JV9tu?&=B75N6;5Hr|iHMe6+2md*Ve;HuveOc#Te~0B0gH+&sWDP-% zeLU3oWKmbEb^m}@d0h_QKR+)k)DkjRSer%OG~k!p_}A-A<0^{VrT-qJY^QUd312r_ z)-Wf;$5ABN!phHQgil*J1dV{ne%^>H#l3BxYIu~Ertv%Pyak`1_4o@CK~(FJ7!=9t zar%>=>+!Mh#A3{U3tA0?z{dayZ^K-rrbA{oNJ_kL$OHj zz016eZ=-Ng{P^^#H#`D{^J1(GEd;X0^ldw0K0OYXRTo3arhyPKJZg(GRLklRN-+k< zw7Q9?^as06lj*P$AMDyuXEo!@93=@35u2DA#Rt!OtV6@@1EMT^7?Ol=IOt9yWeJ!` zM@0`=O#-bW4N5XlR$9dp-Ovwj<`GwOI6r;zvA3`7q2#6nlT_?hfjm_bM@j$&1~bMiY4YpL2564KleW z6!nQdzp+ka8YH*)9ffrGCrW9~ZE5Sgwc-KK@;x^m+GDx~K|*&21$ORma2wZ~cOv$k zG@=tJ>@x!NG5GL>Pm(ExQoS7cZ1()@M_^|`Zh~<~X7W2G4 ztLn>P+6Bprcd1s~8tB;emj2%6RxW;+wxRAckzstqcyN5SkH@E2jW>%(is?3yN7bEC zH8Rtz?SsqMhGKlzwu;0FskY&%)7>f31m3Vw9V_kSLR+asYIxaPqR@11b3&gGH#kYK zf<8~Q&{GTuOWkfmR#l@D$IAu31A7%(Ck|wSqz7IT)EP$L;EUc}Oxy(t-?9FT%(jYh zI$zGn+ub!P+Q!b$GIMIDIe5YsturA9qEN@3#+IGj&0CC=M>X8TnyMTfW30T8h=v*j z4T|U?-f=;~MJ=ybqHu;sN5RnPy=TJza4lMF-ir{CgMs_ozW~0*;^$>?Nl(oGLAD{P zfpK3^oOP>xdhDi^+^|e^yJhp<>)jZKM&mzRhaX~_cx%J19Z83yzHJsAH+?;0`gv^4Mme~mfzsJt^K zH~py0u4%p^YUxhxyeiMRJ20yDYMAk7qc->UbrGDQzcnRd-`gJi7QOC{;QN2L7VWxd zy#vMaUcKYKzIMZx_dE3SSrl;#9yvpW^p2`%ixA2iYUOjOBY)&7935{q+}&<_+M}M| z*-*lbDR~}vI{87Qxc|=7+0-QlHomWz#W$+=M)sajqqHwu zu*ypyGO}Qd$@n&6-(-i@K(M{g4-lI<0P?p%EMKz!jKXW@k>WvQhZp$GXN9VWPMahx zL!^d-^`dCnhPy$hD%9BFi7QG0ioxj3QD5HU@Pn&Pw74Lq$oC&h^eVu@UM`+JKUy$_>NHv!y^9r+#7-R#;rB|!enzJfIK zGn)%rR@uX5)X5!F=a3Zz?RCa*_PGVj<{I>uGIJt*M9Zm!P&lDc5<;Jgya_lO z(?Fzg;b7r7X%dH@ZufeLuW7PNj|fpB%(*89*g%nkUC+A?pdT3q21CIlHgzJRrmT!I z;Lva5Y4PVj-gh0-Mcx@l6nM;{qT{~%S6&1_!fDxiX#56UA>*%3eEG>;Cv02S+sV54y@YuZ$G12}?ztk3QJJU8q$R2^V>8r8zG$-nwU{FwPFs2`De4V-79B!)%RP-v zgrhU}MaRsUjydBCZF_CZqaD!2>lBhuyPhWc5N{IpRelOL0UvZaj;quHS05@^SYF@J zK52a~5#5oGAKa*C$VQmyumG^T;9^e!z*GMubN;r2Usiu31_*(-mq%af)N*;BsMSN8cN1`ULCMO5SCZ9fu zu}0{R0N^Sb4Olr85J5VZcqP#;PwX9+j-*|v7#55|IiZ}Z*!22EtX_l}FQFMqD zHH;3u_8BpGo;dFrWuTTR3#4e>l+VHTSk589&k{`8V&91qC&_&FAIp5+i2?*K0{-If z9qEd3QZ!HI#q`Lz8hU_;72j)Mw&3*xPhc>_oi2yOTp>GVhl21S6=P;$Jl#`lS zFpiyW3z}^qq)M|>#H6nh^QhAWuA$i&{MW|@BJ%a`zr6h0FDI{FzIp!k`O9D4Acq77 z{h7Dm&)6zIb7uG%htY!-9soTH9%5|i{aj`-5_upy4iUF-BtT*pK^r_Wy^jLWA9D!U+SrA2-;zfacYr|?%`=<=ia0}v0M!oPt# zqx$<)o9^rmNLA^zgbf6*hh!DQlq(%c93DCzk@BAj^JK3ki;PFTySuNz7btxtmuBZc zJm7eEpjBdrWfe`MGYBksR5q?kH<2tn9@zMGv~2-i)zx`zo8})s|IeG2gKx{U+&OnL z6LipP!TT_0wG3!bFqFp>iK0`IWhOTdX5j@;)txG=3>@PCkK5K>E-;|Svb?Hu(w<`U zJAN`3B}Z?fl@o?V5S1PElcXr`j593GIP%Ecj>fUSIXK#4eVJ$mIGc!250MGtsI@*U z-+)#jxb<*czgacK;8Wue5&DPq^O=a4DV@Eb4RAh~xLLbFK;#et0a-*6Sf1vvBLA_p z7-fFgETCmE^WOYDL~+#qkG4x1SEb)TCd(AAvhIjEApnPrVzXgB^Z98hs67% zF5GSTgIO029;n0abG$*p?7KK)-p`*?pxX8cpPOOA+Ks_^DE8Fbxarhn$WTCo7(_hTl>i#M1V*I{mwdKH#f4 z^-ip?EL(a@?tQRp87Pv^t@+;EL+33Xpwqv> zw)}Yyr+n;QXj?NA#W5oSW3Vx{=gTJ$t8dIaZzKy5tGSBuiM!l;Di8xGBM&y+VPaC@ zS=|?I_@T`LESVfPb7ROb2I4y`sSW8a2ba~dvDLEcAlMCQpgZ;zJsh3$W&PnI`%FAS z*KDf?sivnv%NbmF55;GB9{u04f`2PXR{~kVzbzj6KjmlUR{?M6FZod%d-vy|g5F0s z9*@U5eV2c{aFPrW>_f)0atwn~r*r2b6*ZXi&68K7Z0Br80ao)pdEl;>{VV zPNXVLwb&BLRv4r(Byh2FhQ6YNiH{kNG4AH`r{>+e0mQadBaAr|E`EaOK=l8CPy8~Y zxO#TxLJ5*C97o*RG1UqEyWpF(1xv88x1#CEo!IeIh(vd;w5w&~`1Ue9NEF%1Nd$Pm zhmkom5S~b!5bf7!80Gh&T4OS*?bv8Xc*n{T-87&6$Fitx$Z9Lb^NQzj4q;W>*TAO6 zx_!n**FU+f65||r3Rj)7%NlocV{O{63z@W*DpOwCL|y!#mlmysmPM4Me%h`AXzGIp zTf!)^;XX8O5dXo$u0Z90R7rDbV%S=Ty)Jgsd`(7)w5SGs9)W8MKF|<&6hyzp?;-+U zgJMoQGqYt)c8sv;%^1QxqG<>Pc=WJ9l5N{UaOi31MQkJh0X+G+ZG8lEnvJaFvRH>A zHSu}Arc_rx3>TGSwrO&PiM}*#KK;-n0^H%}(~1=-su9P;eQH5m_NrLfxdSfQiI*Sr zRX72m-$&a8&fnC%Eiu7VNptpobO+zEw8UILx+a~=qltgwgRHAlM7t}BHXBwq2|M&f zRW`*(`$CMFhN{7b(9eB~?wz1K#MDeD2vb5yeUSbDBIY91#RYn@Juhd)H1XM|eb>5M z-UKg?c*?=+`sVkCK)urQpH;7MJ&{Qwk=gLFnxP&7Yp~k^l#K#eqfK~f=Q(CmxThTf zz=VM#)VUS)=jiclCZ4=L_%c6)&*#-?J|{K7B6r8nvu8(4vW{ch3sNTWTt9s>ccS;7 zH*uy&*7$()q2y8K)WTCby!67Oe{LZ|D6^e>rJfZfBw8rga+tc8v%brceak!eokAP$kHT~tOQ+jm^x zE2+-EgF>VzF)!xyh^C95MxFrR0|?5Ex23=BP%7K14SDxX04p8u z*sC{)mY~uX6JU`nYmg;nb*|T*)(aLH>DEq=6o=UKTPxgYTmVpaX5;Xs&T}UbPYxV{ z#0}ABaWpa4q88c5wRurK4uzYHF5Zl9+04k>C^Ak=#9x(+ias{a&(!5tG)@Cyf)#Ye zX(sb_90xP$+GWDDR2 z2M|_&x|}<6WY>r}okz@p9k_ytdh*`v1$TQVIPC)$H@w;N?Q>k-cJ+9xeY%WjX!UB| zDQ>nrenPhQgA1Bo_&9U5~j<5@rRw*?c%m$h9W-NbPtB39i^EPdN3w8 zs^3|}mUUiM#Mu?)3|Xs280o@IidV|*=ZsfTG-ZJc9alg>l!B&kC|(1Ze=|e|HgR_l zuQl}M=`j{V-5Z(*)L@<^+^NA|ey zD;?xxmCp^gUJ+dt6#9;zV7)BMqCBTLc7j_cJL*9w*@BS%X`NpI_o$k05?9U1R)FI- zyu{P=yHy~7s-WLM4%K_;e9se!dMfSJ8)8lM%lq86Kj*9Ba(M}#hYks&>#z6aUD~S{ zy7(aa3}JH2_z@N5)+Vl5K7}8d0j)WPkR$G3p!o^+X6C7m``^y4M&b><)2kCPvP+NL zVsPe*j%7-cB1Hs+Cz+XR_;=z!m6qvJl~;Lf9UbG0(&l8Y-7(RV1U*hLSRwkld&$sK zWfbN51KywD<=)8D37ImzOmqz~QWzpSegcDI$bkpu}3bjuI6J zCuWfv%Y~4s?QA)DSD$3WO1R@V>G+8Wr=V_J<+>f>X=L_L{alPpA{G#JQ#n} zgJjKMprUH8bZzGYAj?D~W(iQH>&%=<$|QjGNE*(ViH71)uymO?i<_uRkYDNUYW(X( zQQEvt^*GI2dtTKP+;mRWWTzXIQnFX@j;9_`A~US&??#!5b{Un{`Y0*KQCU5>kA5Z& z2ngPi>uD5)NR39py%0cLQ<>CL9t?_GB#n{0Y)hIcDQl->TW9(NVv%Gkg2h`gMXqj1 zXpC+n?+N!O6Pu$>qE-00MGJ1XZjN)J;ExUVH#P149SHIR>SXIQYEtzp;1VdD= z2KDCH=eiE#9Cn8RnP_M~RL8WKspCUu$M>ebP21JPKP~hZ5-q{EWbRcT=#0X2iEwAB z{oqPvq4BX3XKo`>i{MiTA|lL+W}4TaU7#Vw$>e>`%gVCSb&VriXOqO6dHPMCc(5qc@Wi+<5X~kb&x|(Ld~YJ8 z5X;TyO6t}0I{D6=XD)Wnj#1t78;1?XTsSKv$k2{7A`mLM&*gU8{!7H`Nh__G=_g*D z&{^ElUWu<#+ofV?Hp#OkIoHe-b6ZBT@ok%Ys9fnV1q}5OqF0KPH0C?%Kbd0L2Ojke zWoBgn@6rbH5UkJR)3h~QsT6Q>qzq+62D^%N@7^`x2QU(CeEIHjvdxY#D+C|9qj_l1=EU`Zg}UCy0_|DdDijSb!hfT3T8GXq z1nrqx_2?TbVQ|vjg_jlQMft(KM{nek!f8seO5y9UjaVfnb~;E8#pHo9QLyPxL2=l5 z0p?9poR`B0tW3X@q5&ofX8tgYDvh$Z2MzWlQ3hwDuWMa%)WgL^dlSsP z9mO(;v86XvBpuk8Rnf9(JwUINnnRH|-ySq8pU*wv+InM#B@%QTxx6lI&iozZ!}34x zUR5dLqH4=?fB*!|Mi9!yGv$dkLL85NPb`y1gFk7D#yXr}zK@+anL3QAqYg$Zaky0w zX+;({5j7EIf;Za}O4Bc({E_B1DV93<>V|LPxm^~Q(#B(p`Ny3;ClZa%5oP1JG#8dV z$9^bEuz8OwP}`rR#fsKNIeQql7M=xY%q0r2FY=Fw9Ob!nCKV!$sSnrVJG_Na!k_Qo zzyB}z_q4hMB-#Jtpa1-S{P9os|MlMzCOc!9@wF>rPU;6aOLu0j0gu47&*h=zxDca6 z`nEm^`oV$u+2^`)yv$T^Wf*&p<&mJv29g(lM@-+!*^%n7moGegccWI+9XXey{4hBK zLCzGEwBeLHmY5sVO;4*OoBlGZR+O(GE?9YvSpfx)=u-uHKC%C~cLT?G9RStwFX4g-5kHu&E1d9T72yzUpWK$8^Y&tVnXiU>q8n1ez5HnFvw3v| zv@EoV9-XQ)e%Q+*N4aS3<9yjx?&Blbc;XR6Ql%HzYN$u|i24#1Ps9WhTTq;lnaD>Q zuA(MV-};T$Mkr4prZRhg+H6XH?5KJ}Jz+KO1;nxyu3zz%-Za z=~#To*12f#CgN%Kn=)wXyooKg$j~+^(D)sM87IYzWf^`7uk8X18^NZPa=??h8qbIT zME^h7HHu@?v}@R8NYq6ZvhG}J*#>>gOt6G2Df2f|-(kfl(PVpL-No`-?X?GD{l9XYaEK-1&RK+T@>69As z76B*|oYSq9n9dD@jC@2)KB?A=jHpK)n}$wnM^+JMB6a#5A5UPYN6$i680O;6oqn5Y zkalb}kz&2O7dX%8G&PbNoQ=(E3noruZ8KR$W>4Z<;>+fiC>XJ_u?SMxW~T!?dh=#l zpL5&(wJg9?64@G$7Nh~mVH$|X{yqu}mv z$d|Z}9bwq6Wf_8Y#r~Xng4(t7)+^dKbsczB+k|)Q#HE#rstY(M3;J@Zr7x?5C3;7Y z_ym`1S8W31seOZ-;joy|``R5iAJtWiD&pX>YXSohB104|y-*@J_E=F1}sW|}uP^Gpvi z{$QhjYSApp&VXrnkDLs5Grm!Q*5!Gn;bH%ij@kjM^hHltcNMdEL|C@64W2Mvi{Ax0 zRH^kcZ*PI2@3o4(k)SGD%YFBdytlE4?c=_q$K!SftH5WVvs4Co8WYMK9`o*9b6Tym zoq@0ui4Dx&d?*%ZLWUs&%9+3Qd@NGzmE5$hAQ4+AEE@B>tt;RtOM9LJ-?i;LNv{xh zwL%|^PVH4O1@;u&Y6^&`Qd?rIc)t)j{CZ()I~KkDWLZQfB874Fvifc!~?RX3u=E{PMY!e#_s-|9ZM}EaA%^g^30Q>Kf z5BD&UsYeH&q#MYJl=a?{q__tbb@j!hCF<^G5~Ck@yO9??$XAk=eTgtgE7{X>A1U+h zBIZ8|486+3LPqoAC4Yn_#lveUp`Vyy15sJstNTXV+{EUqm+}_m^{HPt?B3@g@YluP z+oCUN&oh&d|8G;cN|n32s?O0#Q+Z>Eoad{$j9UcbgbsRuU z`IBxz84aAo7x(zzjWTe&sxM_cFm$=|s<>b;lu^nY-22boy=!iE#8A#C5bZ&FqXZr{ z<%|JWzPQGc!NRVEz1k-Az@koE&q!rr=faNDM_0p9m`ES1V&Wfhpz0)W&P<7@gCy>F$3~87HMWb_^+xQ$pJ0b&BWuK-Dsi~o{$$boFp}?6J3km}k#V}^6mm^BIz-~tF+p_zZ>1kdpB(-(0fPV!3 z8r}3r@a$@Dry&ONPVdjc9Yl#sO-tU#v_A*2B>kWL42EeZjnoE8{Q zdBY9%DVNwBrD|qcRrRbW@qIgNEM!0&pN})j!$5UjId31GaHa{N7KQRd1;QTUh%wba zNz}4GQ6NbogJ8zR3u7#*r1?~VlH)+3)&@W~e+-gboT z6gGQdYrZHP;QaM$o}c@ut`ryZk7TOcOaNwJ6hI$?0A_vwk@(k*Ls5v~Uc!6@v&>uH z&?d`V!Q6yQq6-&Q%sSf#w~LpA$9;ND75xiO6_ISOfew@AQ97+#J1Q@FMTn+b-^my$cJ! zwy!b83~}$#M`qAmR9EN~eo@Tq;P4AJL|BmX9j1iEoF6GjD~BSZl@=kRhZ}tw`YDZ~ z%M7W&k^g+$gA2Vu(NeP2Ti~t~YSNs-Garu|TGPU!id6O-;I^^0glylSLd8sVr(hNe zHg@o5i&2)&T-cBUqZADO2%Frzs;kSQ2^v*gdmlg%6$jT0(`J-h4dl4d@}XUgg!_;(I(56_GQC$6k-4a@zWOj*L?X#|W!J%O%RMF!lV|;UFEFg_ zJpGamXPxuK;0z;iw(>mPGOi2Sq(f$Daa}kkZ54941!V`t@75~vgmCY(RhZjc8kKg# zErr5_^b?t?4m1(Fb|Ido?W&V@)j9EsC6LaW9J6eC5xaYIB7|n1TfJl_R*qh zJGXh`xxH>pA4RLH6d?hKDEE93<4!jk>doc~dR_g6{6pT@fBn<*%lsVUypu>G6_1d@ zN4FL1^rPS-9+NG8!aAVkTqqI zagHOSU4_&lrny3%$VTcUp8=fgr0crUhAbf_`HU9X+2{_#%R;mbzS0gb&NckdmmCHm zS!!+okj>00Giwcr9am>(jctE556$W@F8$3sH0#4H7VW{NL5HRIW51Z72&=UV{m z>1Nb_N0YP#*Q1z;G30_qc0K>M>9`Yv!xc|a&+Y6mkxc^=X)MscavuRz+3WHhd!v^K z(9Iu)qIt{}6$%O*bRG5Hhi=LHJt_Kbbj>MseR;yQmxZ&P8BesY`&g&j9q`R)dzOI? zSP2^Y&jfInIH!Ov+aNq%g>r)4eH@kqr+B}3}!`0o$=ugc(pkFzv)fxe8 z(*aiZ5OeK$!}UX$g?JkNmUZ=XkL0{_9qkbOvq{BeyrnoVtw!pmnHv03d2#buwIqXm zvJDX7cb<1}CKAkFcN9*sW`?(GBBXyLK8Rfog_2KJ^A?wvb_VG%(Yc-J zKx3K;Je!4GiHoc*sv%DXa#ZFLf@qXfBrI)(3{DwRZzsseFjNfaqwD2@{q)Js(XfI# zA_V^?O|J-oxx*HMAVcv6n9R?O?7F9Yc#0nDm>P@2n{X@@s&6qeVfcI z&V{3S0{}xgsa%m(ai4PonlvN~Cqh4=E^fMs#Hc;77COwlXp*UA9TR^qv@Ed)L^KpE zOs9hz$KO7B6!l?8#L~jN9u$hr_^{E$gxJ5-s@Hx`nEd(FvlACGP?}n~uyR@=g~Jh< z1=OUogviN%M}kK0SP;ci7*mF5+YIfvM9Z3^{5o1W%G9N%=hq9RW^TpMTcx=` zy}JcQ5tQuyl27{>9~}5W;QD?~J-?rXp&`B;h12pOe1>-AGP+MG*EGf-y2u+-O_AU9 z8FL+M6V zJRgonhLeOiD)59sXv`WzuwjHFWP4TQMfFMnr=(@eD6~eiZrley5J^YXSh!kO&OX9{ zgI$2(1aL{db2uIt$|^*`64T+(aO4~}8w2Tm_f53Z@4gvFh(xPcR-z|b4Q~7H8)W?6 zeZy~uci)8GaAFqTlw+~xMdL$mQKYq5g?o$eLG~zzj;V(qNEC%B$yuFWhUkU+z%2T; z0^4$w_>EP{k;pFAGaqSLgLfW@q#6;^rqZ?dncli&8<=z5JOmSE{F6z7t|niy>1^@Q zi?=6dyt)%ow1y6vZAEY_3}?5T&w(4CTZf^Gx|-Ui@feCViKx}hSOp&{8hqB{js?d> zCY{^_pKlE(%5-K)H@@a&O2YDE^#S7aA$Nt3o4~sy6CYv4%p7@!loqj*`G^;bS5OHL z(;Z{QtsSSmr#?>-lepm{j_)Rk%HaIK?o~1Cbev^aFo< z0DNC_fUgmH;Hxuwbi9%G=Dv9qvQnmk#Uq=Z$lcD0p9i) z;iF@-?4`l#QFf=7q`k06>}x0RPhKYwPe<+J*gQKQnkq}!**}0S9P^$wlsGbq%=klQb`&w9D9_o5?!nV6s2m>G(`QaCX3H6_1^A&r zvQ9=Gez~BYp4SS@l`=SKwuV$)O9&cYmf?qZ%kW5tqNh{zUillDanO(dvnoowur^Wh zTMqpQBjMOj$cvBy=@#Ws^koh-M9~fp!vxH}pDW9}z)Bdc4_@W%#W0lR^>o;oEM&1! z!#?1MY1H{%3@%o11DgHBXUC@yL+2OLd@mv|Fslh)cUTFv9k*GDc-|76z3#llv?9>D z%aW=fOp}#8MerH@8z=Vcndk$(HQ(N1vf;{!kdX80fzD6fT6$qTY-$l+Jx@&B750Rd zO^$vFfprI+fB+zAdtkm5D}09r~hC= zzJMIOKj-y%QQkz=V`2_gFL<9)bMsJkrfD%x970+{0Gqs|ewmtp)DLF6aL>@Zo}vK4 z#{e|5Y6%v56r<*pV@hC$&&qjTpL5;=*9mlRx;FR5fBYi>g#tYbmpV8soAY_mPA@D( z*2W8;yKHWK6R2~(FPB3Qg*{nL9d_xwSUZu{yMJ{>>zl}SA1K>^?5QRNr5YMTp z0l3t&vZ>=HPKQ4f{z$YHP3TEggR$2T`9RI#cK9!|qlCYKH z3;u#H#~uQD+J0+ZftReq+M2cw`7$zks6G~uIDpv~XmKE*M;F^4uq{nvnAcN%ZpEg# zqpQ#@6cQtA=it+vIOCYTI$Eu~o_dz^RDdxOeAY!iKYM#oOh1$sQ!ouR*CXH?0T~u8 z@zV?7n&nlk`jb$bZxv%9SRlwW0E3dEp5%=v;Vh=8s55`FK7|96FP&8JV_uNXB`?pH z^Sp+9lK8|idCMK=Zqur>BtOSLoxmB)1)58+c!;~?Agu;ucns*6$M~D|VC8gO?=TVx zev5hvp>)uEkpt;ku;p+nbw<1?Z72`O!#6!;ptLdzL~hcZ=CB%v?=B6QBZOP( zKPzXhb|94#HG^s#zTi{>Jy1Qps{r1AP`P=H(--dOdoGlcFpR4faIwGZdWmgjeW~GX)#lGD9))TXq6@YaW6*hs# z3)czj=JI+9LRqlGL2Z$~VNTbku^@!RZ$$|Q(Vn$ranC8C<{vE*1nSrr+z4WSpOrK5 z!Q9{9-~T>`|2)8KcT0*&2j31vD(-jhxbQEc@Q+;fNtAusQuc46>`z?w?wu$+a8Uj0 zcl-PMr|_RY!_Vh{2Hgv^y#S7wxr8lTG1N#g#!ycFQ-0Ucz;%&Ni}GBRSwK|r8;CPp z0TaV=;Ot$g*=k~m0>?9Pxd0TGq^@}Sp&9E)=)tr`qz-a2H2HbY%>jfDI68DulHeX!iXhsi4Vz?$k+QBV7&kHvw zc#OE=N$u3I**5${i#4!OgzFhDXEZ;T`ejgV&Hlb@MB*Q|WSbF5b{8tV6PhI$r(NW& zj!fZr2RR@_wiC)o5bHyLdorOzaCN}-H&poi#?{{U(+!E4qE22aWRQDLJ?V?7ueB)kJrWlgcZn-)nfHH~8UnJL0E|OIg>Msepx(d=Kxjvzq6F+QUpBSLT`nW2t!`}7j$Yk90;jU$Qf4oI&ryA`e zr>3#zq!+}8Iz_U(4@@KdnTJ0gbU6Q?iw^X|K5W`cBZMND{bHn^Ub8eDqa8bp+hsj4 zN?S8ZGX*b9w{&vl9)#ukV-TNvJpW!rie^8$C-jJYC>iqfap-}M-Qy2qIXw3~US)2O z@mdnNp3b_0s!<};^jmyJmR8RGk74$IQm%r3(z8n=a~N4qNXVxbf5OT9X}rG0p8P35 z^=D}pRNit=`k+o8MnlKbNGKQ6#Ei0ELZR}Z!YBDFL{ln{w8g*Mci3PYfCL2&x>=8!HN|I z;w^Va02DcP#^j)}?Tezc0MRf2M*#-H9?!Xom&?TSh^?+h@=}1-&h|)}9DS=;I;aJ! z<|_p=o==~g4N;FGy=R2odnX$qxj6r`kr9Zc_rd;mA|yR~9}I8AGI+zW!>F;t@5av0 zaI5a#O$);y&Bd$dlnhfSKOdrS)R%@0zJtcoMQiJUg3XzC?gHGMf5<*}Hg2O$gE0WX zSw6Ku0MQD=*i~!GSwqIG1c=m>5cNA`#Y?v^VHkns3EPN6PeL6Ih%YGv=IK0d8bPW( zto-{sH;K#yvs}~@^DNq8YQUY`4Dx#F2pX63Ai_&m&_M`Mj=b$4li!|H^QxYh!M~iH zo#`(?xkQZin4C>~H24UYL}*)8!L6KbhD2y$9ykSY)VIH~TtQCT6%P@vG2v?LPRT@s z1K%W<>^1DIT(^As;T*}STc4<8knF3O*2SW&YSGgPm37>pPtc~CiiZ#dgHlq1=I0It z4R_0}hU&w$9#j@5@{3ShDC1Ol@>uz6xn54&svb_yg2t^`F09N5C%qdw@w8lIRYhZa zDk()rvWB4H$?sZEnXICfq{%8$ZTZkE#PE~Y3?uU%qi9*Ikuem`WSlomab9xl4XBa2 zQp(rh97S#wzXtmP{QX<_9s78AelHG0hBPz8HzK>XqrnQS)z*XKo4gaRb0XtTr@5gl zJle;?WmCCcO$g9m(IA3gj=~Hn3({~+^ecxtFP~^CZjlF}3a0tL@h=U1)O)-Z;MGAf42RIwiB))&>_$m#H>VvXc`okF)GpAb?k!h+c113Fmo;b{(6|dBZgl`4BsYlY*UrN z9?gr%6}ue}D@J>06Ko9hK5w^O8Fj7YJRN2;EHA#ZTO~e6Elfz6)VJ8=~F@_DXW&&d7}jH+e{^pJP20$PpZ1x3sK({ zxdwWh9h)bf`mU(|5+2?l6@Zl8XuUt#c3(#%2`SPe+Um1;1#FJ0aDZ<>VYwt!$bmXP zlo@a()_y0-CH{W5Lv~zzG36g+wBN+Rin*pe%_YU!q_)n>W)9Ao>C@m2cpCTlsHwfA zc&GQBWh=DtCaEA@*Gq-?5M7(NBwpUanD#And??ofq;Kr&6a++?o$tIgJN3h3DTF;{ zQ7}GjiAj?niPvrXrWHcI+cgegLYCjE)^Fl3@rpgQzZbT~>~f20jy~datiThB)D(sAi@GFOD|Cg}2p^%0WrWf2}(%OCfedUamK>N%c7)!OxU&QsbNwZqiBa zB;-^lyiYRPLdc$~g!{sC2+PxAs)*LlK0fwkRaR|P+CgVDML*AQWDwgQ2W>)(lPcHdJ;)atISnZe=zp!te6(IZ0Bn_+b+&d&#U1RD9j%`-C!o@eZ%FdDV$usqBeMb)Ypn* z`10ziZzRR?--vJZ3rVp>+05RbH_WwBJ2ziiITss!OV_j~@ZT@$)(7yB$bwd=GxRNN zg0q=3lEGkeP%XJEguUr8=o?y=n0<^Y$8qFp^x`3z-tc2XWMR>JU>hpPj~DJMYU{BXdYxVr=DMahpY6 z{+E2wn9C)K9Ytb!O6*XSA+K17nE?wG>5|!si@;j(+Kh#9885ENlp7^+2^$-DFu%&Y zJb{&SY*GB&hgNQVW3C90?$$doftR-2g)f9v^G$c|08sz?ru*MF-T%Jn{^>W}S>Cj- zZhzbHaCF6y{GsW;=|1OWxc14Z+2?+*eq8VmO?=qnKh=Am{rv&WeT?N>ToX>M#IDUuYP##$hjfMsHFA ze(8g!<{xdHpWB!a#vzDcp=i#@2u1w4D1TFlm|yVd>wSviP@PdgW_PO+Q67W$YwK*! z-R0Sceh}5CRSl7ge4NR#`K4-kCa~!lh4lUi!F=b%46$b13oCA%)`JVXI(1J+*In4) z;l0uEVaFajeUooKm(LNy6{G*|tc=zJtQ?qQZEL;u;!0Jr6yt5}54 z=SGnC0uEq=Jswww0WtSNjf~WWe3E`HqlT zM%=}tCi9mHzHV*4k58bXGp8B|xPQcms&(fuWR3(Cjd_3XJtiY`XB4A{oLcjK1=GAA z@{AJ|8*R)UP;ulJiRcHSsfpYJdu9{G}b%e{L1%QS8ThU%nc67o_sCthw1OAZ4}vM`wMVFGy8RVi;xUoFrF-} z${b}l6&YJ#)W@qL&XHRsa|wv+N61p& zYpOGpgNw^nEEy|h{K7>EPT~z0=RocY7@|;B7Ipb4Mp!8%XOO}j@+d`^nfm5gwwv)V z*dIH9dXiQKKtvM0)9}GNj1Gl>oGc;r21IgCvMQCk$1CHSiIk2k0CHa-ojURmJvp@@ zCDYfRGrWzz_LQ}`N;Gr5EL1767@h?^2GMrUk_2)C5-%@k@#|rnIsq;_7EzYw{i3cG zwr}+i_PItZlAv=EAb7 zIVz5$WCV-*L3Avrg{bf#RPZOqOO)@Eob`bcWYY4C7t7{ixVRtgwvKpMh&Wl`>+H7j z(`HBpo1h@OA20?(C@vm^g82I=f?sS2KBg5~-_OhfGFJ2|yVWt6iBbDdSCwGoGvU9}1nco)f#E*o(?3uvh#k)PxLCQNGoALRnNhzS)$M4G)z`1C zJKoy+7pafaxm!O=gPdF-r$bJU^Lbk2t$p22kDOfCuc1la*6|nXlB2uJUss>}V(1LH zYO{cGCsrRNc`kSCDP+>98ao?_JFjDql~zvgE~%4Q6gB52WoUGLCAHMOM}9sJ_ukg}PqU;4wGI)Z{pRExcoQRWuxzY-vZ6$jN~Wfj;TVJ5A3?4{ zNs?XeNq2pgWFUcwN+9R)6hz%2#pKO$svE>;o3G+c28+hY6iVl3GCMEO~Pt%yvMvnrYi zI9;1h=x*KdiGCD&@y2Lx=Lr?@^$~P@>|Rb(EjWAQ$F%>oP%92SJHMzPay4f&`pzGT z+Ivg8RHH>3Jlmzd12+Yifuij^q#wN+5xHWWa5tf!Ozn=j+ug!+7#u`)r$NDJ;xX1z_~NSnDHFy;P9H<5dz|v2=BiE? zQ&(+H9^?1^2UUf9-RLm1<-K8HJ`{`okTD%K!&eN*f|-a#KorD8NcCtN4z7FGNGBPeME@yeJH=9SuMuQ9GPzF zKx{XLcNpy!N@9nA2&o{GiB&%QoS+PznT%{^a8AsZN9MZcwx!c~`v(SRJEwGV`?jvD z+WeT$=Kx#dUc)5_d*DrcQJ`jGQA1w%sa5!MGiUX6LN^o*-A=bjDxS(&p3i2lVeReg zwVk51-fg2MwAI_!KfC~gZupl|LGGNB91Q?Pity(-&$9wOM9 zD`Kg99n6U9ew)q4{E*kgyi%M5XLSBK zSZZEPw~BBD`F+Bvapw7N4-9mixSBHH78?uyVps47b(XxfMk3W0q@K$t?;N1j0%8HT zZFQMpEE{3@4j-cpcFo^X9$gq4b zlxssXhUdzq6W8FZbcYU#mF&+A?m=H`&^#0#c2z+en_koU;==MGQ~OQV&hkUCc*&U> z;qS~T^)4ad+hxAec?|KgdSvdINt}C9wMm3e@adrN#vok1%vXQI|Nf+~)M+ze^ZRZa zmfX=Z04h?2H>7MojI-DR;o?-k$-n>*KOtI)F)m+4|J-9R-D50Kofo=te^8UZxhAKH zCJyN<|5r55Jkf~uw&H)?C@RjtmUO|}*8SR+V377h6qY+W{oP7~W9jnMzkA*6SAK7F zHfB-fGGD!x$3lR<8y@J?w(M^J5;s%v^_n-$@{&@%E*o28%GkzSv1)3KGPzmBiTNM_ zFz5#si}@OI`OVOi*Lw<8amg?GS{U zI~;lKkgBZ~uj%5vUB4c|T?d_>35$1ynMqmN~ z77vd)Fnm`(>|DbVH?MqfcKAwAUI z=h5AQ?r41J7AU@7lX}&5(xu^hrj> z1-4ckK1F&)Bi;75sO>tFCsfm+QJ1m1$Qz~@HRoWJ>|%u1pFVX^GZYEjiVLx7>`wN0 z29`Of@2bvBZr~oK#Jnx}FFQ4Tvpn60YC8pipy&^&*bm=sa0v4QUkUgtevjp|*)LUn zna|x@n}i!sRYYDxUljPyn7=_@D*X3~|4n#A73CQiI=yynGm~GEe|~MxptKu;3~beD z81xmIgM$gu7QS##Od#DTtNuAIJR;$YY_7m-c|KZF};vo$G1kP__V zICPrVU&(KXdEg1hg-&|<+}oPUfl=-;F7(6<@?~2M5~?e&YWZJ6GZo|!eKp`+-uKP1 zgXyjv``44nKy1g?*Kj$JcdVgM!+JsO#N~eC$du9cY?5)LuaRZrIOiM3=6e2G8Uwk+ z;9hD8@*aQLUI}O<@8;dzesO3upez%&1Qp9N{P^&_$~k{ z_(r21^+A6uXPQ|M?MO7jPII~`41F@& z0m+yHt=uYL?ooaU33KSESGe30>0glRM`j4D0E$iFDQhO4EkMRVRb872L=q9z6Y>4M zMk<&7c?<=Vkw@KX;Jn`aliGQ{MKbJIZR9Wagx<(~)9RYrDw^i`8seFz>hq@?6-rr9 z=Do1z7DB<+$XUO&tM<0qCRhcb@xt4i6?GtRgTJW|Q>?Lt80}?-4AW`W5sr6ZS^Xj!Nr8XmZcg@hiTRZXWKM!Cpn}jz#z65F82i9 z7{9{56+Ca3|Dztt$uQRkE;R?&y~|SyFv`+;JOn^B40L!&;p(> z9R+qc4B!RHzEHsBbuE7A&~@NMN|WdR)3^8BJ)w&oJNwXZIU=>>4bCO5O<44oNUgcYqh#Q?4yIeACx zK-t*Xx1ZLNex_psa1Cv+Mt!s^(L=jB>?{;ausSv3gYo1Nv*GkxQ8I(n+xga^!D)o)xc;sJ7YyBs zl3tF9Dg&ln=Ed5(Kl}F1|J^fP{!1fqW80_2B}F@E{F8+CZduG{FMym!AI^$azZ#-W zWPC?@hBrTXK5-~*t<-j@`D!D5Mie!ppa|;VOz5^JXq-kOy^^}iRyfzVfm;!DL1Ve- zHz6)i3#y+0{??2vvc~wKYdxrG18{iaPCvJ$t@GB>P?XRM9Kt}ysvK5c_Hsed$`S1m^IXe;v`@4WY8-weHT+5kq;AQT>i zjH7mvOO82T=5=1SR(h@SBz>1qmE)q$*D!_4yaiXCrh@C+2eHnJIml$-HDmLd>i<`R{-qz@89dW7y7P*4p3AvITHZt zNi~mv^6RtH4G;l~kdQQh}Vy+h?Y1pJi<`+eK%1?_e4-QAuaOtWudcdITAq06Q0*Bp<4c(*W zs?HatDj|r;5>iyoDO@TTJ`r7H($`iH=A^`MCuao)u&GL`h=kPkxG~YA+agW9|;4uurt8Lya zNk%0)#>tF4FDOHW6d~zkSpB2$XYhl*e{A*yEPLjG`PMBx#Z8VKXpP#3y@#f=DlU`6 zmSKm5`QF@P+tK@@V|7)L^=n_xb#=A3Cu5p;0>@|LsDSR!>J^liZ1`GTd5dvB-C#5> zZV|DRJFMM9wRjq5H=XRlV&x>+xdmB0xtX^7q>0}@g1ERKQSybJc(h0LX|d5pPd@1& zLP6pz`xEa@NtYn7O~;eU*SVMc`jcdb4L9c%#Rk9P4bp@Gj@{k6-No6{)K`-Mv2$HYz{vlw zvmNnyptbP`LQ#9J`A|lU!_kZ(-HecBaj6WsM|5)&(^q1LPo>vo<6Ayy`MdKt%h z`%5WsT;WIw;;gk~Lk2$x&O8ETQcSiVbDl?ab#)xDQiOZqV_Kd0*`8XF${nBd?-KuLnk7Fx;Yv#X6DI@`1TY!r6?dbWJvvfW5JJA{i4OK=EBtwibt7i zb)^q{puO^YV%SYjx-@kQhcaTpx2)opsb)%)x!++`j;7W8n4giKizGZ-03C2;TFoOQ zp-F{m3Q7L?v+Khg5bZ2_aAWUb3SmDVkwo<^_{8|kpD+5*c$0|IpomT?+^r+dK{Emd z8f~>0#7^!}6I~^J1|67aaskl*LgLt|2fbC%3KM)=&P+U z%OY`GH(|Vx6!}`2x!-U3+27vR%GCMnrki_`FKz_nNxsN9c}2H_kgVdyenQnO!~_XF zL2`>5`+!QBOMcPq!yEp%zf}z#GoybXQLnpxszXZq3lkgOJon5T9gjwlDZ}g8xEI%wa zd_lE9#&D$K6Y~ju>8(jLTg?s#;ZS``kIy&%_4V5a=!qz+OCJQWT%kDAJiCjaCF;6D zRa3c0cuWv{)L}d)T8Up3$z8pgFB|g3Vmjj8FS|{D69ER?B_TFCWP%Hm1GOQG_M7$P zX*Ca(BXdmRD8#yF4q*4kZ`l@8H?SG2R?#y*=Hdf{z&H1U2Ifrof)=6>&^Sms>aWJ( zRSt1x-6CO_QoVZXAF9<`4%@I71QkK3zAsGX$d&b8cMn!SRI3+TSXi-%-Nw>)rsL2q zP)*hwslDx5((9K7J8>X^XojkvaZ_E|;YW~0e#B?Uy;1ZE>6+^jI;cu$DeYDv(_hvT zx609nt4VCk=wAhsj$LE-h=*CIDjW4;>0p`gp!4v0_)LP&h#o+C)x9TyT<&lW(1Lb{ zSE;k2x7Fr`;Gq#~1Q39lXGc~g*i{cBX)&^K6FyXBxS46(y+&f9X>%PRCfOx&1x-n%8v)=kn zT1`G%jw3`k_l~7Q^m-y+_)g}o-uju=t8vgrdH2L8qX+mDm8P0AgK8~V;w5wkE^AtQC=1=mQXkgg!&+RRVLpwe?uJ?{px=N=x)3SSz=bFhahmVN(U0y630SX++nrxz^_6bQ zs40JeSXq!GF;-f#EOIIPX~V4|&e->o0;nlR@UAcjx{ytZ!Fxr;{p+EY^Wi^$d@1;1 z8R{lJe6`Kz5!*jp#ev4XJYtB|^(HSI)Z?CoOm=MGL!|8q)Y?dy_dzk zkXJzvO(jpBJevN6{KAjP+=ILt^a!K=NnEE#Nr16Qn2&Uw)NZ^E(=y+x#RyeV0DqPz zb^>W`4M>cKDVU8mV=U-a(ZW^VDj{6OZ|rM_E%Pl>ktnJHf+O7ItDWQN@cducHETSD0FtFCeM zM_aeWG@nNn)WK&q3*pk3|Azb`^Xh8cF~IQ)EZ`EpA-nJETD<0qE(#8zylMc!e5vMFoz7RVu5C;e5m+Fd^^2%ahKwiJI z*4Wv(bzxdDuEGD$-n)3WksJBK{|Y8IXGB^QC3zm1P?mi?o^e)pXKY_vlVm26A5Wd85>)B`{j8ck8Qlg;k=Hhacm11P+KLOp&Z>}&^a2XL^Ds`3wj-Cgrn zGcL<&k{2M0MPJ=8Ptha<9G_?`+PEA8J;d!!#u;Y=JSU>!Ed z#dk|MEVafdmXHKWK|nGH#qVJao?0{d{*?ElQU(8u?@6ijj_*l8BJg7;82W8}hp^V& z!98s>Ko_OVRG;k{y)3?fEAR0P|M%sW5nx&JFo^DkHx{|d zYiHHI7+=CrmWAKM&c_$6J^WdHnYNA9HX|5Jl7dD~FMSM29XZl)*MTLyq)3tafvJap zGV>saA8@hLFXBq%OR+UDoD+v8{2fT}sT{pnfiH05lNE+hBa|vd7*q&Rij04$C8FwB z<55MCq1ci#=K4`(jAQ&Y3DX=Ss?5*@WG3$aSCY~T{}!sP0-*S_F%UBx@g0&<)s zc>K^}YNZR}y{IjOKt#KiR!X^OwpxZM-X`*}?Uo+NZy-i5w=jSX^c;bK>_lJ3G<9_# z5+YO4?>O-P#JjsJezMt>9heh4Fo8C-?KD`(v|i>ZmwMe3*&vy3qc&m83~G}o+uf|_ zSu00IOn|81*)$)&->d==*GoVJehzbUi6baIR}^g$s7VrC6-n4xA)Jlq@vSP_p&OWb z%l8%VU)lu!VC@LqqZa|TBxGmpO(dr{@aQBu_3%mj#m%(i*0_a{EbM_K+r}3Sx1G4_s8KN5y{@|@d9wh# ztUNC{!i_)E`z_r^zL;;_LD>xrBcP;kJE_Y6oJqqBP?MTL zc@7p^wr=V*%rLV}BgVxUc&yK=>7oDrz`V_>i(soCgDB8z@{rJQhW;nG`LJ2XEduCJ zx(=d)-@MY*;dl`;%c8Qb0aHfnibJMz{%nFmYn7Szf$vT^r}S`Sap4MAh$t`n;cA-L zsco!EQuM*5WZ{ENpV{-WvJ?Q*Kqzqvrb#s#*E_W5L2vsSIKpb-C>=u(Ut7Ro#!mbk z(3r>8vt;8-z;vrk?<&tQQUDGQyXy3rny9&6*1$bfwg#K2njZZ~V~FpL%chyvqut$$ zyt!PQ4aend7km6$y^DO}@V9z5uj_@acmMFs!#^OphUn_YFPD#VSY00Y(lP(OK%Cl-cWQe{XMZAl^e+ z0P!Pn8t9$eV+{=e=%DY}h~uN@MR8{-Ju>5Ljz^nC$q{^yvVoy*;uD)lkD?^B zd5%94Q}4fO1f}Qz6n44ptaisBd~n;UZkas>A9H1QJP;PD10$5!w3I--Bm<2Mlp!Fx zBdSv`4x1?WI?9J3<;$v}Xu!3F0PR`b>kntyyw{uACexNYLWIGhX2>(-fZS7yv5v6y zJ=HHpF7P;L{ew0|9hfr6Xt5?0om};&4O<%w?nZuEPOzPLVw{pzBeJaYYky?8LJgoC zXLrU%BQs7U(>flRFRpK$ki7D{qEii^@LliR*q?nA_()#ECkH)R#>8sfXL{!89m_O{Am%Lj;yuk)wxSQo2%QWDz4xKIPlmeRfZ5#iO^(cRF8OSmA~bZp`bl%(6L{FecJI<}D7?E*!PK ztb<W(- zs%9EhGs){FE5?>}&B!L#cSWam!tL(xO%J_VmjV%c^o3aF~K*OeG8E5l?Q?{gVTZ7*GLMYA!&^alRfZ-?BW3&|P zN(Qo$h+a8}hzemwc=HAwiQz(jV;do=BNqV;{Y7z<0{B-j=0LJex$P}F(7?kMv1td# zeVw}eC;6#6o0O!i zd|ir<+uPXLgD#T{v~)B4%A-zz4QK^YiUq~<2=l;rwv)2h0vpyVOR|`&d}86++GAXL z(oF(luX&NZ5CN)a*d1IU_5^i~hmp74y18e=IJZy_&B<^$1X8C7ohUr%;05Qaic$Jx zyckDQ28LOhU0N+F1WZdU^e5Zsed0GpVKX>$y}cmpQ1^|)6_Tw;fHd%%hV#*;8Bo4f z?43{9Lm)_1RK07B+ci3MDXn(%;s?G9%%OR)n4Q^b`0C}GqvNAL|M>Rk#q*;VN5{V& z#2a?tdiA5ZHdI z+q;SV6;!H=wnnm{7nsbm<~TxA__=V%TGEH*LE7>wY`3tGOQb*0KPRUv z7kB;K6##3l8rJL%w+lo=!0ElgB2+=I50anDazfPI^u;k(G4BhaTleawij5YiuVf{_ zb|ECn0_RHFTID&{jFt;^Q<1po<#})GZ+|Pc`sT6O*^dniAR9H5GPR5h>ZWqD5a!_( znF^Rozp#nW972L(A6Ha-$K3J(I3R7=Knc}WqGEYtVcGMt zk`s!|l*|y%0MR+79KdV3w|pLq+*oPg+aw#qEnM;GElkCNSl%lJE^H$t{XI#iFU0tQ z2x%$?vh(o7mZ#EsP^FK=Ct>iricgV0F>VnuY|PE@ z(uh~Zg>86Apa~-9iiJhWor8lFMJC* zL*9A9yTC)?N#6os<2(ZYT=@(5^lJgn%%&YwKg8;uP8n;SwZYILS8!a;&OpERJ+z#x z+PKM%uOCxXQ}}k|0=3YaV%vWllCaX*#fb#0IPo2=H2AysQc5&tJ1kSGA1% zNbdXANF!&VX4zjVmmV!QS_Ti2{u&g;{cp{7Ob}qo`{sdBYxB)K8zYvJE2L6?#!x`t zquYeG!D|nIZ!c(h%E^*v5`ws}`oI7r4J&@QQxiM46g0gQNI&u==N78Bd5l05QKwd$ zC&9N&0Li)CDy@RS;yNrUn{XL>@St)Eyu z`iP;aJuc^=`uOyCAWo`ud*c#OV<|amt}_usd9=ru_D4f-Ws>3KXW7k90))*2;y|l> zSFdC5Ob#K^vQ>scUZ*Q-WlqhVelgbGdM`7B!8P1^wOs0{kW$y+l*gwHJHBfc&A^7OVHhjkGsO#?H|l-cv_6 z&#F%s$9KDb?VQ-lO)}!Jr82I>z`eHU0fuI3CBfAsmMdp|j_W=-y<$goO|au+Qd1ZM zM{$KuClhzy`j(-zkMCgVGVNGb74xX=2r+@z@+>dxujKW~j61pVO2&QZX_!MJWN2_G zEzKhn;uy!zBvgLUNCz*NrFm?qGUsWyBT2MqMCiLAfpvTBj+M54Q8v%>29)O1xf^GS zM4j~3((T^fFr2>VtY=lT%E}80f3w4~`u0koLO_>q*xUBdMX8CwWQg)(ejr?{C@cwE z_7q)olw`s?On8S0OMKD-YXs1cP|UL$gdbCf@5*0_n%)vPhIKW zog2^1BY_4iy&03+SmDdMgDd%ZzhUzzq#?=w)@=kR)w|YEr1CJmNw@vip6v3#T{lmQ$(t~LySv8L)4XVQ zCV36E06T@fX?C2j@7z{9IK{r-sSBmOnc?p69axIXj%#n-E21pl8KU^kp^4Gt6Le(u zp171+eQMZCd674{3>AZJD3EeBBa06&fPo(pF(Q_~ zeD5tlNqZ5kVPBNb5`B>Si)~=!eFm1iV4J`eyGg;ytvjM!2lZ;3+`Iyl|Jc z?ocM(l=GilES%Tw{Rb0GU+M4HZeeLOR@riQN;nNzYMY9BmoCd4yJ5piDajBBjlxaG zQt#aC(Fwu3JxyWFnW5W(H2gcuk9-*KzMH7jUR-;CZEM16CSN;Xt%!8;SRYBN6F^Sb z8%Pey?9ho%?36pMb)lswqR-seanSY(8jx5am z)V*zb9hk}v2Y zopX8h3yHW-%eh6HKup>4Z&2MvXS(%_yAe8sAvv&WwY*#bR&cPhIsfTY4T(=qvAZT| z=&P3Q#lFHP-npwDx{p2gM<1PDLh)6wL2}6WF4Y?%?V6|61v(9mOizs<>MQ!e9QByY zy3tk-zM?p$mzX)H)eQ;3Q+}_Xiq#pE3j}VmcN)2sv11b{twc<29Z6Z`b~1P_`h@?` z{@c=E0ey`CGeBUJ#J`7VriI&_=WQzyh=N+_CKl@jZg*=dg}sP*F;6EYOih&)9cAcH zUo&c%z=FePNs*^9Inkv~5AJ}I;f|1rE*>;`ZQOHV!Qr!6*;Y|hD2g?S{gEYFA%i|` zhJCm?Uja|=w%Hn)t#HCK$gor;q7Qv%YRX!ONUOckv8qBJkqf2o#`l;Hkbf4lSC)N)y&}msE=Z&S+w#lM4CRNmlkvfu&pB{{eZQDB?(qcl2 zN^Dyre33>%GTU}girmCR<_`Zc6&^!V*1-UR(^i~M`F+K{U8&5G*Ozu&at8OScm_ca zK(n|u78o!j&pgbWC?DMa{@X4C>39|bo3)(Hf}5Gk6gir$;?q^1avPtnUVHJe2Qx|C z#qoL`f50kaHg8VG9O_YV1>U~iBONV|N;Ka$*Lid4`6uLAtBVC%Gn0|i(RnE6?490u zuh4ghND-pD=2+9jyK=aqLuJ47+K$U=^60%?f<*;cEXBOhz&vNp@bN0}Q;N*m@+$*Q zU9oM~xVecxWz|Jw&6O3)Rm`bV#~gK#O+M$pC7TLWGR{<1T_|p~vNa6IVd%>Vwi|t=8n@$RJ<*l13WUV%(HfkDR7_pX^v&uz=+8v4GY(dhj0-nFFP5m{I3WfzQe|R}EfBqU2sP8RdGB64gcq_mb1QEo$w|J4` zWmmr&;EB%W7j)FWi!S>5UBE0UCYH!C>E4^=RqxUA{#ID4Vt@txog`^#mWiu zD_uj+%dJ&#Ek#9#Fr&_m%*kmKOstN+;iSR0IK-HT`x%#WyjnIAtoy>+S17hm(+g+K z#8K^jw(#-X+BW^Ws^#UnNj=ka4R=()MsoM>RuBoKdldvXyjIAQ$y)**BqHE2MlBbJ z*00|?|0R3Q^XD6HIfO(bn*iqBfxVO>ji4dp-##qKg>C55CvDjF{q)>DBJOoTQK@vt zqp;}rBY(arVL3?myRPnN`)9ngsHTs&ea=6&py=QR_tqVuE|9;%ap|R3nHM8Sse+m% z1bvdMHa@9U7X3={V=WT(`zVz|y^O+i!Cvc-GAP`DF1KUq&|QAVN}q@)TH6;+^5{hM zBtK0Cn>iwXszq%pfIf+=gd@`E!MWFT8y zOCpBIJ=vf&Y)axHYOyO~N6~uRm{-6;YZ!)jJKmFgD0x>MVME`u3SY3ZhE*gZ)#s1+ zb%&fL{ z>Mr@LZ!SzLxbp zhy${+f9-ODUbR$ywNer zrnAJ9FF{BWsSN%bHSmz|-@lPaymS-wtw9!|zEbS;5x zLV7;r8-SLyD0`5=eBox;=w& z?RhAf+{Ymzqw4fqgG|9iSXFml$?p+SO)orun;Vp(9G5*sb$GKs(De+L`!dX7y3oT` zp@(-D`l?mvt5`a>dC#J^f7|dL2J0Y_4+O*hHKzRk6pMS=)RCDt5DXjs{Z(K&U_W(U z?Zqe^M%aLVe_&uTU~HHB1G9WMFw3vh##(2MZ_M%`-2Bb25DH1Vd`Qk@oyEQ}H~UEA zuM(yW$lmNbAG|jbdyL-?Fo?J{YU84qJ~lp>p;_(&mQm?|5+H*(8==PK!=a87_#ddcuUX!0cb^}5T?mXtkLN^vsH=1(Z?!(U7KBRgmLcZO6g)Qtr zPTFAV9{SGTU)TC%sEVAq{atPl8&2OtFKfYjEj3DOovZv@%$r~31OVOT z+7*0U&Uxn1w{qvP;h6I{^EYzlAw#s}Zn~zP=Cot#Tm5%Uhv1fRjCa?EHS3qaFSr{V zbNR84!yI=*c}9eOY_ILdPI?K;b-tf8PQ6W^ZmWanZlxE(+})__L7BrFLyOcL0h81-Rba&7P%zw0&#zD`z$KK}Ym9DLm~mkrveDDNA|(NnLUYCjzLPS_y$ zahsH2$=3!w_AJ}RXhA+VkEO65ke{O-$Y9AT`!f+Qd9#Sgi6FKe5o}$>h_8Y4PV&=% z7{Qw!%uas*leBaph2u!W-j~wP=hDO8bVMa~V}KVXj5#MG{aWS&O}BRI-R=*TXRfGR zjYLo9UA{a&Cy-#@5%Va8*h2^>?aw=*AOQ%Byosgg#jkiD;V$4B)d}gwK?Rv<9hk5Z zUV8bRbd_P#cVZs$qL%EI;6Vm!{C2vMS3 z2KL)3dW2r_Q8UdAZtNwVOCAfn*EeT&oRLNVB8xzu4Wk5^4w5_0n-Dx zN1II$xUQVz_1=#{g<%=Jj3C?dvihm1dVZaSrQb&sF~-5!H4hI`1b;V%br4 z(She+Hx6@yLrxZo*Oz&Nn9Dv|-lD3_%vKlH6#3Xrmkt8e$xQRwJPM{e52I#fg&nrm4nhl3T7C54}Qr%Ss+$uZLzyWK&f8eZS2j=Q) zcS)VI=H!!xxV9Ko7Tj{$Er74kfRj_rF-39A5*3Nm4^3Lop}dJKUb?ixo}g`H#B zO8ms}Y`@(x`T)e)!JYky>&+E{k?QfHa?8l1xTNGne@yAmzZ!f$cw*&L>dDj7)n6Cr zfq~^hyucu@mW@m)v)xlb2pv$bcZbXYv3t|9XaRIdIG+4&S5SkZchMv;jK-%wKR~w8 z!XWJi5Jj0YdI2{3h+WVi}L8 ze4x|QGMq?o(#Gm!-0vWkK_2K4;$ z%g*`wB84I2Gb^Qv!Uf$$Tu_Y%8l#4a)BrZKCx-~12VsCrQC_#r_Hwe@ljznc%gPgG zd&1Tn{tOZh6BgOpBe3hm;Y)jZXSA`Fl&oW)xh(PV7Xo zfvpLa@Yjm#BNg*~Bu@wOc^{pe0;RcigeGs#RV0l3jVARsnpD~91M{1CM7!N=Z~vw` zp@)^sWKVuOjV@^dd4+1S!YwI$N>D^2hn93h`IB@OMDPx! zMG_9ZOKXwNyuAh-y+b8{%(QDi*~h;A&JW+V5|Kl`pTrj)%bVco3G-*LICoo$P$Q>C^gojj)h{3DJ!( z7zo3^l#TrRBAZkICGl)gU8ynyvm6-ti~8|eUcntEG6*HT&ZOZpcaIu(85AwS5MtA= z`tqXBnv~4c)&Ceg_H*`B?wWQ>(jAOCmK-NEQMuoI#-=czsgr(<$tHDnj3%nRvoI$6 zw5+Y)kovd~pQK7niozpsKP|}X*2+?pYjd-^3_k9r$*K#8@OTXfKMqI5$2!dr;}Y{i zX#28Uqu?d0O>f9~jD$NJt?qyG4shCrnwiH@PVZxX4Fl6Z zxXbPXL85}&SgxX|5p)=w!0J|P${IP}Zk~Y3yf1XA%NpY1)n+kR$2+Pi^G@KiO zSZ@*&&u_>^lDiqXN1=!#Op8Ajm4e>j$Nl}?A14C@@_GQ*dJ9@!wP3&(Sd%i8$CC&)U-PYHC#qGnODH4?vo7mnh9Zu!)XfY6ZbQuN<%JG? zNvxhfp)u6&iX#4kwUIA}azB;v((e|7PRnGYDixjn7o| zp)X8JLYVHN+qao#c?B?;iW=c+u5=7>^JZBzmlkjjb=-4s_?|%X+y{I_^PS#Nv+r6c~TDz6d!>&L1p ztKQbLtbkkMJO|JaHyIE}gr)*epHm>SN-iB^#U`V{iiofy!lZ47rzHdxS!N|YuGM1( zUC<8A7jNBS{PFLLY}yNR;~Z;sNw*%Jc?vXv(f6KvNwnS&Z9ljVA7ZL4m%C^!Xivx% zWTyHZ<;^dOva+wyJMPCT%O2m=BBJT|$!cNOA4>m`6_Y8vIH}fX(;@CCRb)drwi)DStqNB?S_ zpq@;V;Bk2d#lb**!XEdm^FoCE>6^gAt+3ZAn@3wuOi~+O5Sbn=`B*c}_H6#A~&TCWH z3@%oTU@pKkdA(pnO3+lYmF_H?SZ~-{E~-EZGG1m^)}I=dLL`-oi%U-zBPLtoCIw zUGn;75fpEuvWPZB>xkRnJd@W>%odCAXbDH*u2V2JO0&wb8s9-SxKqoAQ0f%)pcZ$< ze;E6bOP!Xa!$W&=et4sl?$WkcBYekvmLv5DB(51Uo}li6G z;@|viPIPRC_d~l2ZRzJnolu)dAk-~yhX5E(Qtnx~sBO7OMa}SssdAP7B2_iJ>ox>i z#K`=~HB>GdJ%mH^NM?cE_$j4mWeeL;Xx^hoxuRbrUpUa8ug{L&eQW0X-aJ;nT1C_n9RV{7o7`KKK zdY!r+JlEU26$z)BbPsg8!TZsjGV#s3?h&_Ud!`S!AL(F&mDp7I#f7cx zgdH^aoOd@)7uzO9lfKYpRwsD3HP>$o*$@P|44?3;pTwlX`%@5oY!pqy(}JapEFJKS zJ(eqzOx#J9;nrknvPxL?Ris@GE#Lw}U_bMT2n&XH=3D>rIu=pIM1MGb2Fk#Wiri}v z-e%QB0wGc?ZYkfw&EpmnflPCKy<4r8h=4t~dSbPH@n}?cv_RF@)sA5T&^%Rl1y)l3 z>Pm6Ee?aND2%H&7m|X;8M_e5-BIuf{Tgm8K$~EYj=B|{SRr67y!$sNT=gU{q#YJA! zJ%=$(C7}ab19LkZ4r$!RSuwU#VE#tItmNk!9loeR z$eWg`h;BF_9bPg@M6pWD2A^Q{$hCl9543`q^LNjOktr6_DSve1H!@q+y-YPpm_~*QoL#1G=1L@_s0)j^h`zEk3pGU6f}sP!a&6Nw5+;LD zt5}~9h|B1`p)DQ&V`RQ@pM*hJDDEwUN5+fuYX{F6yf=o3h2)E{fAOXz+HOSAh$`!8 zwVs2`dWb%z0Fd3{L9ipPvBoW%)%NA0`M-;-YT`)> zCLn@du>iq^{NlrqQqtBS1+X|WCtEjL1G5D<*ITF+g+E9K3V#s?DWexAckb(H?}N!G(x1Y0#5`-e_oy6+Sw^+32%7I$dkt;;V{iD-py6>0O57dl-3@g0~Brj3?RFj&F3A!M-*<^Bb{syg^%^|yV!?QHI4rt1giJc(0 zejQXzG9+4dO>z!0k`__MQ5WRG%@Uk$m0bg-l!F=)w1ga zIXSL#kcjre;iBHEI(o4>QT@K~M`{!&`L6MFM{-_2hZb_b`{)VS8a22^_q6O0VzR}Ub!y454AnWy3wa_C%~^IMhx=@iPbbIFpLmpsh9jp$uA+60oLAU5 z*cUZ;^fiiYHh$lV)^XQe8Tms7<C;0InelJfII~?=2e>@A0sa?Iz&H_ya3( z75FJu1&7~&J9S@&I)OoTG1g%g-Q7*=fPQUnOZ72K3o($ln7ZmGu_`fN1ZLdLY4~ET zD^yD5sl+`Z3{p_n1sL|Jdv+)iw7D@3U0(l3S>^vIizb^Y0W6v*Rw$La&MFKbI?tN? zET87hasWoUO+L=1#_<{kF9O3#B2uYBCL8p2&Y~Q1yvlEA$$gRdoU#JiHNVtkKmpbO z7-)wka9WP(2{tseD#lsy;>|(z;R}@| z2x7plwXZ~G#9VMczpyC(f$$N4Oq_L%S7X>9^Pyo>i&9EI!W1sq3g zLu<}5n4sC5)GVZH3n+8QcRR+M2{EV9%-vsa)%T8w(!{35BS6zo&O!81VF$2v+1m?8?@sAWg-6h z%VjyW1H>JBv6v0a+X?mQ)ifJ}t^V5@If`{jSyB_Ozivu;y@)H4J1WoIL1 zFpR1Z_Yzi|1FBN9XAc56$VJi-E%=agX>UfC~e1getatcDfKZFbT zf(qqj@zQDA;Sx-I&Tc3eb33VS>>RIge%OqVK5qfIPIutSf~}4@!3GA7wZ>imtOB(T ziZf*hELEEmx{UL}Y-6#384ibdJD)o8FUp3EFMu^jHu+h(C>j_J^zlRGQ9Z}ohb*e| z+SFrPWK~`QRiymzvklA`YtL&FOewJ8wZ{$C!-M%n0n&himkFT3!#wZ9U-)7;dIx>}OBK%2@Pe1#To_|0Bi>So~u+??d-C466 znH5K(Gc%_4bt3{kd9R{_rs9*P=SR`Kb?Ds|jsf1dy|`o;t6dyYxcuQ?PvSfSnc2V{ z9{dN)YO$D6(F4!heQ%d#F;UCpd|Hx6Hu=l4BFvmw^3pcoULF<*)2SEZOS%fKk*C`N zY#`h>a3Pz*j%{6M)l#1&ZUMtR<$C@|HRj7NjSvUW&-O##Stim$iyydm!1%?h5-gKNdRc!%X0z5CmV3?-LikkLXR+#6nj0G1k9`<0zC!Ky3E#Bn)++NUL`nZSLe5{@eq zLj1^d-NY9H$L|_TTvk@Fsa07aPPM-lqQP@J;0bcyBbS&OQ;{{haap~9RW1PB4<^maoHl6Yo^J7FN#xBuGj zJ{LMSM=0C@=$^h$+r_kC34ADATaedQzDs$5+q(wj-iP$U`-(8kt-D3W?U2tagM)v^@_fMwDL{z{AhT?%>l_Ko`KyW@DXHK#lE|az@wQdK~rpt=^_X@2(rAP)hDD)L9VlXE?DG`e%40J8j5EbzcZu zHIou3KPHQefF)bm?0w`9+FmKX{HovLjZ{VH1)1H@f)q7}g)(P9GQUomvJ`6t-b!eC zJho)?+g#E|oD7O&bR*>ZQl9MDGG0?88;(WJEG8bfx>{=oK5xEu)>b08jP}8u+M?M_ zJvj%k8CCKw-jbj-<0vvY;wM8w@8t z?um@@#f}3EmvtcO0*%yp(W|lvpfS_^R@V3%T~YUjdwWt=;XzgRhJX0RJdl!r2d1|L zNCTuLkZ`L~4FG(oD6~s08@RY!Yt4OrLYXrPy+P)mHu(9B#xNSM{!Rn8WZk0`a? zl;_UUwwT=845-^81x^%OPxGSLndCKChVCE)Y*Fqk3Xq)cTxC`Lsdg(+vSqi(8bnxq z@D0K=fhS6NZb)~51}k59BbMz=DpRr)C?UH~k1luu;pp%w)G{bRG|;Eb|7WXmwa#7t zGg_WRSOKIxGKU7^we)6PuZJs*mI1|(Y2spCFNrIy2N(TqnQp-jCeStnz4L-cW&WXZ zWG!41N8^#Vsc=6P>p-pV?Ii=OIvS5PjmHTZd7)?|{Cu5>hrZGgq|6ztIKz)U^Th1C z0}}wYX2^i<4fnp0-Q>2D*#{A6p}VAq*|(WYI6~RB@6ElwM(AHPStsa}F5J2G=>)DE5KNt(K!JBL>OK)8)&|_j}ib zB1+uphfC(z7UojSh!O3_^paF4(q&PXQ#-uQs-pJ}GFj1J4IS-~`TcF^ z@HKjoRkns}&9Oekg;^ki+wc8It(em=IAkoJhL#N9Ni#(;1d!OlWT!@qJf-PvDVD=Q zoE5(dNmgfoz1@!SC>dJ;_vQ(7UKZc0OlkXvMiGy?;fGi$!y3y?4% zkgQ9Crsl52NF#1Ftk``B(>A^|7l4lfc1G}q-QVM|NDxF>HTj~-=9feBvj;!`E57M< zwyaqw2rMYr&Oem0GO)p5euUSAx@#2z^Uq-{AnD94DW9K4+J7)&rGG2hIlFvXYPf;^z>e#&M zt^d&L2gFPNV&GibG){KzwGRX8D->VxJ>j#fx2-6k-@M+(J_WKFbo0&%o#e2L`Is~% z)hhRn36_d?6&a%uf;Zet4!elqj6kC4^bK&sz^X5T2A<5n20@vS7h_!F^Qt_{&ZZ1; zWN+pf3PoEc2YA;g@BKTBj@uST^lT@a?19$e&qh8RxBtb8f9iw|RMV7zn zX%ra@w_fgTI(gAeCrALI3!}OBZP79ny~7X>_1fu%LQ<=ho7kTwjG~>;sqS*6@C<4X zs@$PAfh5bHa>6phMqQba1hN1{@B zZMeWl5;Xppzq=XSi`=2YW0r?zH@um?-WzzjIwBGFqaRzi|I*~sdIM|zf3@-bW|rfh z!(2Rlq@UxK70%ipb;f^$QMD_XvIU=(7yEnvGz;*5;)Ud#mazlRLCWI9jY95%iM=aa zq7ozX$D4Us5Da|pYG7u4U(RWn1KHjch-zk$3v*uooc#up9a5}m1&N(yJW z+?DSuuWd)+@DLAmt;&HHSKSLocf~!5lr+VKeFLUVk^0={7Ah9UPl}NvVU?#Ma}$dh zP7IQKMOnEcn#GFy0ibU;bKjMA2Uz~OBYkASUy_xs>%#ejWW?jq= zRmkeCi2T~2Ywu&MDyoLk`kpgP>|wS$AW1%ugj-6O%It<8f`ot4iE}{F2-0h`c0w~v z_u+xr-wTG<`9+bR=i@9K6-B-fulFipAoJN~D+QDS$IfPp2+nxnahNc?aP(Sp z>=F{w++~}QejtaFep84MaXI`eAIPFwA>GA6kw9A#jW3Dg=U>(TL(M2Y!W2Tj=-hUR zSm_}=l1pe5IXDlq`Fy%$kM)y4?NlB#;ifupbX0! zaFTx~XudO|F+`#Z(xN6&Ef5pcu9Q7Opb^>S zq#D1isC;I)oV2}w%+Y>6N?kLkkJXmdI%JXLjCfZYC_xi%K%n&hYd-&nYCZ|&-!V@N z_adSD%`IU^u5<{x4fJqc}8kpm!zW_?j z5B8$6;D6_JZ3FYRfSm|o5}p)t5iEn&XW$>#0E7a6I}GW_ z$L)UVp>bui#&Y0e7&K7Z4MJdD`1APn_dh*D;PZ9hKkn>v`W7M2MNtRfmQSj3PU^rO z0iH*gAzh}3&eI3&uNdbX-U+4n9c`XekYG>ZjN9@mL<^4Zh#>j#r2tLa8M^on1koOl zo&7gZ1G&JpLNP4G{d+AX$IND6R2bZD5FGv-=S0GU;@|iR#bwgtG{*KbBXfd(oJ!>i z56?A#@P_>vY8cX;>MCMZ=#pUqon_7g${Q5BPAa22;@|81R?leT%}W40!4ZqpI26(S zVoIkkFlZRb-G30zhd2-@9&aO{4OoIT$(tVryFUw1`H;FTQYH5(?DeU}N4f!zH?O{y zwvDc0RhN?RIhmCw;UZ9kCIdw^#!m0!qQto&Z%T8X1H?`R=ibx-V3E}X`q2@n2*EbS zT9@;@`Agnh;z`VSl~~e0O91j5=9?}Rf|Ekbb6`FQ?}+gVDv~ase|mY2ASAW9C=np3 zKqLX-gM5*rDuG=C%d@GSL21Y}^6)*7X?T%0my0t5? zVqaryHoj!+Jg~67wBRzy(M7@G79fqL*_;67LsMuDNPI&U)etzEW3}Ourm1oPcy;lo z5U~cKbY0ZJDFkw?U9?^(OH{4}w2HYbuMG^Fe0x=PR$jU3#;XInewoev5P{QYd1ZN= zV1ecZ;8xZkOTs2b&4Yoa04&rtdrn9h6`Gk$a`MKi9p0ogFVYnQZ7^DgUBe-!&&nG& z_;5zjwqcx8)rgn;I>bjIP#QQBc#Lt3lWL2ma(!|*R~!Nex|Y3n!+S%M2`_?bA%K0# zf))To=Nr&iQW01velYPgz09VVmeW}9<>$xeMi4h>v!uI&@fi^YU}m#IAY9Oho##zs zCl0!TR_g%x5L_7WM@~a|Cc+N+bH?FPgs7{2yun$Q;7p7?KhI&qf%K{<2-3p0?_S$? zX*0cdnaH0=GKMQ5xj%>IM*<)9o0KkY6!a|Wue-#n zibOj@bo_Cy1V8P*mh(g+TJk2?15$NU0)k+@ur&>{Tw=A*%vSkD5X($Qh8a~@3ETYR zt>aDLE8jYm%Sl^lC(eqWU6>J<7uwV!+LUt_M8@SKQFEJU5J9h`8!xgA=Fq%EBY|O7 zqnF<8YJk0yI`FAumRf53zyqq!$lnn-;-PO%xc8)EunW%T5}84zLLoSxFDnX#@E%Wz zi;2h#Ve)JxE?o1(ygD+wvVEkq_n-nG+s#oUWODOJWIQmr06VX=@f$PV>Rj))SG^DVc!#-jl8K5^@ekI-b`%#aB;2P9TL3Sa1gSa?Sm8vKw1 z^sn^i9&6^pf*iPw({DY$?i%96*vhwf9bj+3K*^gLW7)pOWvp8{!T4C_gj4Ir>#^b2 zQi0uYQ&_D0h^Nn=W*A<^PpQg`Hbz17#j`CvIQYJHuf@>7(tx0>Idfc{iP$W771Z$Z<;D= zT`ztMkyHY7uCA)&{lCE#M-A3(+csEzxavCYxebo}_-1LhZAj&}4U0zmYQw^mE}xfG zXXzyk1)SSi+%h=lFrXr;=um!yKRvxx3FJ8s@gD$^cLh=v-*Cm(gHTUDA;2OFh^90! z)4+rCBY5sqIahg|`=GD`p(8xTSC)@Jjk|kfl1<_D-zrUlYhWtb&=pu=*IJny)%B2% zpOnT3M!SK?mP^NVQ{+g;ozoDw*nbqobLkQ;)6%xQeo;0r{V?=k4G++ruuL=Yjt=sAv(e(r=W(7Q%;LQA)E(`sP2b(aID!UFV|NHVLgej(#ugq{JCHzPHQBINRNBnM0+T#xkV zh@{I=)PIpyaX4?;uMiko;D+%6=yf6Sx(v{#o@%^maMZ}CVKH9sx_zmc54;)mzI2lZh6`pN=L2j6#jaUpOcn!Jz( z&|0+lv~jU#CBt-I@#dOyjw|5f?oK%*XHSSDZ*K->DIPWAP;^(Gvxe!3r4%4^Qu0Zk z8uGy_p+`;Aj@LpL&N5H;Q(=Z-D0tZw{3JGt@4-mDd1Nx!$3Wd9vo*^nld0W`Sdb1G zz&vX%Y3G5lja$~VGY4jzSD-_w)-H6pplQLmViJY+2Y58P1d~-`h_2CGTebxasubGJ zSvBT`bVG7RCoW#PpRSF2XoA#FLz82zbyH>~HA<$*Xjv zVBvgjl-;w8WKRwpS?+PPzB=t+smAvW7~Eu@dvw+rWbcL4JOgoAUK4-Ad828&2eOeb zBe)UKK=mdX1)FbC73j?fNK#I%HDavpd;9T~rvKa>K|4N9?zqGVyvdfj zsp_@E#`A%M2?rgu`QAKbiQUu>yyJst1(C&$n`D3WyRrV}&aozOiRuFyu|Txx8i%cf z%MW+6?_4Z3)VnBn0LMquYf!j|^Jy!b2*k#2jm#EpXIz_GyvMiXA-jtPSNb+QQd+zt!791a2iT-^?|7K=gKf+ge`Ozh%g~!^`WOWSaAlge>OpFY$ z9w#1YvAQ!3u+0w+CrmiGf$=7r1TF~Sr^?VJ#e<5OGkXrElC;Y!#?R^y8&OjdVx+Xp zT)GJLg8kYwpHBG8m`RbH)Q z`tH0R&a!#WIT12!!{Or?vAywb9n!r=qXww!$~yp^NYbalJ2u4_z@v@p;Wz=#XJl(D zFb$#U=lQg;RS$sAa%{D5f&`betjYciBE5W?H%l*BbD@yh$cyV-jJ<1X?BgT59sB#3 zl<$HZfwT{+HXPeS0nVOw_m|g+%nS$M&*c^FRaSU}pG`RrKS;#xeg_aBdG2m&$RkM{ zLeEO->ef(4Z$v~i0^pdUR>VZ)F5D3YM2Ri>a3D;4K6V&lS4e3TnZPtb7V784w8`hw z9Iu(!-gQQHFCGmva`)tLl6 zugV!s-5Tdvtq9x5$2C~1fK_>3z~g&NaTd{3J-l1C@oZl*%i=8I;lgHzYcY8AY=7?PJkh-$IpFH)%iS3}-*T<5MxDm)wybnQuRUJdezmvpLF+xNCT8$IVgvSuQDmW}2j z456I}V>L&_kKG328Tl!u#?;}`Qpu>+QQ&d5qqNwqyR9-wY|O;vr!GVk530kRb`PR{ zVe~lo^~kh$a0@>?WYG$r6T0$Z45BV+p1Yvk@4gr81)8Y~pv%l}(po@+gyH{Q>Od3h zLi_yNamIUX6Y+zz7vhaT{$6VR8Mh%OdHHzw9ibeWTg?sr=qv^5#6@Vc+P=HeE z_vM(bJwZxe?};MX)B?vt*jO;ZI|_b}OTp^{I|xV;k$RWrN*QIi~+@5cB#soQkWqO+$%XAH>s8)=Mx`{e0SH$K^X`MwiYHZOEN2!!a)f}z4$ofVN zmsI4Z^~PemRghR*L3yF{N+5|6YRJT>AKb)<0}Xx;vLX+(O~Pvm^e5?M7j2{sV}uS@T&}Zvfg~} zo>#9QEN0QeJuHVvR@PF?>-(ai=5TMH2aF!Ek)5&#j|*~kMnghm1V}}!6hX9-R*&{I2`qp$XJDAP-uxfq9G0 zthmenX|Zo^-(ql#UyA(ipvielYM1ZHBmJvX<8 zYU_26eSdhI&+IQn-k6nvefA$gTeKcXc+ zWQ~1FU(CvgUkqLq_0ZgspTZ+(_P|&Cc*WW206Thd{Nw9CKmF;Av(cF4(`jDYaao|G zg1g7|LS(wb-5OyCn5Izt%;*;##h)eJ{$OT0FGt>+f_au4h&jaK0pKdN};{;dl0rVbmT{8HlLc z*s80pKMcS7?rTwuYg*c@a}b96-+XQN_u!y8NUR4~2q&j{{(pIKbPRJJOi(D7d9Z7C zADI93_U)@*UjO*^E&O(lFYoQL?)in&@9VlEyxJ`J^(+Qlt4kP*UN$gi+MYB6ja>}( z=E%Y3#A9XU0f$54gO$mP`J$2WcYF)t`YDirce9@_8sUqk6&{oti%VmOeg}I)`_;RI z@CWGuhE;>Jn`u4sI*p%JKkF zUJtF3`$@RD5NV;^ zIeebHJa^sO;!<03_7lC0icxbDPNCbFA>K3;yu1$4%NKC1QD}R#K+Fo0&F57)uW~R? z4puPWqr2m5L?-P3Sa`Cm;7AWwWVGQ4J2>$jkPxN!AR(54DNI3Y5M;}IPygK~(>0jTzdHVdvw?O(&KfaDsj9iE=3|PCt z=&0x8!+{kqbH>qI2;0oNl%*0lyQ?u0tR zC9F%xb1K%0zPW~z{QR6EIABX5cOM$zx&rNLuM)_1*9zf=n?i%a^WX( z(<1{TP(k4y_2l-BO;5SDfeTI@8vZEI$ABJTzw>#NH{Mjqo^uZq$Ff_kaAPMDz{>c< z-{$oxnX5Y=1ydK9bE5zNN1rbq%4~wsGkmy)d}aqCyTn{+ePyQ(Y{jXJ@gw~BL!sCl z!YPf*fw|0qTjF=2C_*iX0P#Enb12$*GA&PG9m5xpZ|j7S{BY?fCbS-tbQeB`X${dK z+tcYLdX~*o$Cz8lsr4V&{=jiVP?g`xiY`h%k9ZDe*?bTPs+)2HjuugS&7s+j`4$?j zJr)JZ8V+>SIhOIk$bz&r9C%#RbHPY~<*)L>#_t%nuBw{@$_CdM5O+UC1GCAb$E5aU zv%>ymIqNK&pJ1{)I)fQc9DKxyK3#=6gq22}P~q+FwPwO@CP;$T;`rbl4p!#G_wIDV zg@O$O3GcDr0dBc)n3#^G5(N_#UJfjoU?~aJ{CE|@en8OC47TU3L_y{AmMWECK&%sY zOT(`M0hZG~k{x?bYg(3bb7sfcqDF9O^cUpqgnb0f!4k=E6?qL&dB8UP%9`s-a^&_HF}P|x0t%*?J=N0Mu*MKR7ALGXXq)(XgYj~0)%>c7>y&(LQ5w|aNJm`-=U{^px+ zMNtg*^lzs%vG$-oq; zu@ywMMld@%gLAP!!)~zc4VSd57TC3PrHiJV;X+}| zyb6XAairmuKOm9b0Of51W1I2NvuH2`l4emBc5rVp;iWHW1rpZ2=Ril3Y$-yD{enH( z5^~zDLFBhd?+l!b;HaAPp!GWfrk&XL5MGRAOMF0%M8+M4?HYNXliK|4cd$Wb+4OI} zi@j#ZV+Qp}2(&MD(@;~zMJ1^=A!-aR`5wi^gGItVlp*c5`Ec`LxpIND`w?x*-$fk& z)Hw(m?rPFn)$h3X=H-i@ew768ySw)OpbEG4SJ+|3)a9ZYgFieDa?&rE7EDN46FXMi zN2%bksaRu<(F9pgtpjp-CrnI>+%V}|$`SJx#?+}nPEOfSsg_@|=`{RY#r}`uY;@d-(uoCdqjR=bFG)>ZKvd25m_w+@me4&x&J#_J4WOPbF*urw~gJ5<0u zhjXP}JDuRSMcK(M;pvJyj9@<41mt!Vy^?U(G1LB%Y(Hk`4>GT0!9lLxZ&9l6!&Dny(Dvq;atAX$i zm95LEzs7fWiQ}47V0K-}vRxY#X-*f_`d2%h3BuQ8kq zNyBR6@vNC$B|R@bd55~A13#8rw%3mX;>qRJx~h>RYbT=150gk?k-ErVL+81ag6TYmEl=xs}s_Z%$KJm%Q@RKZ#py<^?{;*4gmWJuD^)xSFJy>|AA49Ug`NbEJa(wFNyQoU-=fq3X%hv&yd3OM({rPua3u2!}!%Rh@S5 z`Onb%_#2l#C~BukTF2pWkdRu2c#<Qx1^RV+mq&8K4tWy*tA1jR&V3vmXL?~pNkH_L9` zIlgX}m^zLb%h7c5i=wRDX&a9aJy>0DG@>56V8P*=O|P>h;*G)Mse`34u{!5ww<@G{8}<1e(ZKlQ?>Oo$_m(6I#O!f8^Qi9zf`}XjXg`ku z*l178q=bve#g{s>BHThhGP9#F>qO^^5P}zmO$TbF7EvB#Tr$_43Wp@zI|_0r~vs#nJJvt=Q|F@x_mSdKzaGJ_l9R z_IIR;vZ^}S3vP`>6h4MBPPN#+NdxFb$2cV$7YX}&)B#CF92cpvPOR{kV$xH49q4~ z_cco_AMU~R0lyC2Si_PO0|naxqihOcvvD(sma+Bcpoq^>e z-HjN!K|BoVD#7>ZQ=WST8^z5=4aAv4EvqFTLLfYo5dRR?kg4D2Au!4AE_Z^$N7DL4 z2JsAW*C;PWlC12Gj2*?olwk*;0wq6ntp`H!VWq}CxOD(94g3Y39NWTqaJ|ougb*T$ zEwE+~AjnC5P{e2_7libNyR)ojuq$t|zyNadwF8^KvIK%lIx1A%RCby*sMA3ceg$uc z@je0TD4_T5;m7?U(>%VkOHkBvDB=9)Dz(3owmumqkg~R8x1-Dn$KbKO-{P*U|i5`O`qN{s9^N-3p@wS!J&twf^RSz z`U|Rt2c!{}TQ0Gb?z;b+!n+-q-npTQJ5a~1Xy0%cG(s`lu0Q)`hZWkMy^gSaLf+m6 zZP`EVJBo;c(|#d3UHsj&(l_<}`%3e~lhV~m%GATw?R;$O9-j7-y;jib=<1-%L>z%f z<}35W>Zw>^YDO#dzz9gj?nob1E5e8ug+|9Sx)fLFYht0@I?K2Xbzoy1F}&L z&8ciXhetk%h(mB`QlgJbAXI`bdNy}jp8Oo|FgqEpJBI`V9lf76kY(M6P5q3Ijon@I zzngl8ga=W3$TTHp|L()$1u5D(#x8=OvU83~sy&o?ku-wy4Pp$dYiDNdx)2PspM>5B zd+d=?uP{_(R(o@8@8Z0>h0ilI{spzW{Iz47KhkV@)hyCtX!)XIFt-> zNE|#6g38Nt(g)Mfgu5ysNPq zj@kWhD1+tQP$XWminmG1=5Vc}vfR5BGx%UaUW2AktlHz*88h0*-T|G+kDxyXPDiNB z;%ME5T}TaQ5-JYDU3Q=;oC&J&@DRsSNFoz5hz}oJvm>VAzV#-KLcV3Be-nXT4#6*} zN6txod>-83+n`(KrY&z7JWk7*NT(>JOzynwK)>7kb`h6=;$!(H&;w68-?9YMK6+ZW z^;24d=sZt4N+-o{cTmtOOVkAii{1N;FQ?J)N}ETj`tE7aO+42_vhhXi6t$7UN_RA+ z-wJX9O>YK?>LJ&K&jlF&O!BLIvdE@*{==K`ea9@2 zeR(p8!?+~WW5UMyj_Et0MxCymz@)gF{LG=S>m#3M4nB>Jj8B_s+LQX6c9uG7&-v`_ zZH8#OK7BxD`MQ}AkZp8leC|aj1!Iwn=%B?u5_z;x$?>tATB3rk&mU?Lg@S={i`VjY z;R^LlP>yNJ>hKXie((MzDPIh5n%qG&8DR&qdHEAXek8}Df5-Wi+yc8Bp*XX#Gg#`< z%Ftnp(B|3urbq#4mm#!?hE_=FJ$!>-1<4)d6bF++L3y0>$OXVNYzJ z76ukSilibQx@pF;t*hjN>n}2JLk!51z~YI}U_E{`3GD0tD69M*V4yecd2a;P*4(`2 z$Q0rJiQEiwvH0n(i&%^qijljOeoSDpbb;uf0UzmiFlrBGc^RzznaQdBvrRGm4)t`{<{wHoC9q zF$SFQKS!K#Gi<4Zz(=x(+GHfye-6=}%wds73}s71(53P6VtJPUvp`J0rNbt}HkrIT zf6kimWnNtTnf#c3hUCZ!rDgpKTs-9KY(%fsyF)4go~B^ZT>%zU1@%9jPG5mtEkPG^ zT#VL>D#1s~7Odl=m6?tozHte@Sv_i0{&9_3(^>rFM@-rh^zXNx+9pG{-Bw7V9a9Z( z|4&|2)2{e32c6S5RZz+s%pW;=N*nB{3pKpi)aXXa^(-I;N}$?Nj^?Vj5}pYlpu zj-$rZ7NUlc;RXaSM;oH^tZpb?<)lP-CUimo`LT`&B7oYMx)Peo2*&~YF8F>jg4-_H z7NF1~LV_d9$?uo{X_p@d_(pM$rc1&#fjE2U{1sG_BvgNQl}+CXy(OAz4#9}mn_&P% zNqNrJxC7~Koi%LV0SWev8^0iF=B0jdI!h9NwrzWfrJ3BLaH{W8bzVwd;Y zfDyR3TraogWxa)+?MD*r-tD}sN2&|t@ZGx zs>hAwn>Xk(`d4@KIdsv_l^cb%eGXkz<<|FEf~VE$>1;Qfw7WWSvEx^P!VTW;;N9*(ju$91v*|9JOxU&GLS{1B`i>n$phT?bdVALGevUr6ATPJ_h?k^P+6ni3H5M%f%FIxXlbYgnskL8UnAC zR~CFrxB`S6h9k+@zfL&3@_?ODTk$A~1A!;=#UiV+q5+#+HVMb;;@YB(6ITEhP#7JG zr5?daWr*>pX=OkC=`T-zedGLNYoIr^V13tImnMfeJR@n4bss~|4(E&XK3=!A?uc}% zc5kl3 z(}0tQ+``^!&`!;6ICbA!s-AA}h?kx2o{xe;!sHZP3XCbkbifi2X*)8F=aJJ+wI^T+ zV5(q$jZt}cEYB*Ny{~1MdVHu5>ZPB4ltoc|DP(CtX;9fKid%_ZdN|#3DbW5UtRfmR zTD3T4IVi6j7-N6c@34P$k8vQ?x*7<^LYR?Gr*d7mS!Y{!#M5wvKD(_ak^MwtPsZgC zXHJ0R=rs4duPJ9sEJycox8+uZnKvZx6I+v`B>20o^~wrq^&G;?b68iwRjlr+2hJGf zlGSCo9g9wcJ8-n1M5{ndz>v>}j|u7dE;d9hw6vZ<-61JWLyEcENOTIdx1%_I29cH& z?)dlA&^sRgvuf!(2g}v=p#3V_Rs%R7 z{BMN@8bRSjQiTI4B&8>@c~zD3WBAiaKd%;c%gaY86V!l^Q;>1sf5AZ#ezE=;KfIbQ zF7g8Z`~}fuel92WZ-uL3%5e}Aba zFst$muaRU6LQ^5%54Ijx`I()ZExU8CtzK14MepjjU)p!Aor#5bKg%ENG>eKroM7Yf-d#7ZJ|Bxd!JTZ@syae=iH898G*JHY8iVUEH zjs_%*9GPR-JmHbT#`alV=NCmNF)+6#Ynlor%+QWiAI5i4fOmTVe;%1H%`wp#{S%u( zB2h6!0T37F^XMFB_tEj=UU~K#l9gdgc=90)?FFC+{TPAFOkW0`@_1Snmg)MQFgz|- zGca{E1~Xrvm8!9>#!w@;uJ|Sl5D#u$&9!xl=Mm66#tX-_z%N8|7%j@gL}ewuj5`<(HDM z=QZ>);LNHG{lqOUhmW+-|B}(eZZE3J7FcE!PJ@oIL>;ib;Wm!=`^l;KAny$~pn-Bw zV~5h+Bf!Vezxf!rR*uvestP@3{4;&I*L=T4aOe{|*^DF#7FoX~hL|gHgY0Obvk|M( z#P^YTZO3Ibc|@%lxFLD0qfhScvThpzN9?u1uzTluF(JtbH^9umASVhe9@<919#f4S z0x1!-us7MDc`Bqa|~Th8Gs6!lG!Q*R;=^coW*Z26lGzh zd@Z!T`#K8Q5YEN4O$Qq?L5;uB5J1Dhn`e41NeDnuOyxr*-PlnB148{q}PssS#q zKJIk3ft-TA4DLwQYbvvNQ1{neYPd1~73acaqr)J%wbjOUV{j*}0I1kPPn`I3fu9Vl zAoeCpu9ATfn8SU}NPli^E@KR$(JKN0xl!W|rg_1Bo{T zSleVb!92=XYD*JFGs?`!#!Gk}asf=jZ8roGLY9z)gtNQYY?2cQ82B#d=aKBc_zLe^ zUEMR?bCD(4+_KK@gEcdKt*)-BuBxu$RRZY*UL_8%gtB1Sq=DsiaC@aUaYb(v%1M<@ zg~u|c&LoiTRV;+}cRQ6gqFb_<;?74GIQj=sr0C6dz}W$nB>^Fg4fbOn^t&wjAj>Zj zXNOK87P!q?*=bsER$^P6Ho{gW$)LbPXCKDXzD@ED9x1$#*u*f5B_QqY19E&x~i83nBUq##Rgy|oNi@k~mG=5dzak0=pmLS7ip(;yoT zn&paV@PU*(Q3@_LpvuPBXO!V`HYu>@H-smPOkk4GlB(2|at zt%Q+c0wBihBJ8Z{s~l|NR4eGF11Dr?iKYtGO@|(l3QWlG@E}$2_^iNKrHtQ} zc}SBh;xXHA5bFz)6NgBK=bQmCl)*F=n6s1;+u_oX7_V6vf$+`Ont~+BPrIV^oPo#B za~*ApLJeBXDhWu!?r2S=d zsw3i~1oEn`i$#tw4UaSmp^1l06{h6{(P{elXG=|j12N*@mh z7`h)E8|1R^#xLuipk#Dt2`xFT31Ozap@SDB>EC$00NlwVrG$eEsk-YWdj7 z6KP4_G$yoS2AQ7UOv?)yH6m|X48^=>K1Ti`YLwpDH)fokWG0ZG5W`+E8j4i|qvYam zG;3lsI?qU|&|60oPw+_KVWmJwg^Tm}wj+4WNbZomEeRwyi6TW(^qiBZoT)>0A+1~# zizrGG?0cPPpJdjTjAt5*C|U4Lfl_(FM3|PT>qNgVn+kvsSwJb3tR&Oan6sZsx7_Jn zc}0<)X+Y~_@<4~E7?hHwc6bLJPr8;*L&4LHctTN1jSO{yvMSKSF6|&mhqPA9owI`H zG76Dxsx|1{6vQ{x@o}95UT!z5#gb8V0LZP2Z2sc8x0SHqT52lV&>3keV+#|`m=px`t6COgQWL6a5OpFRk^H#wtZ(1&QB)v>Cfukw@m&s(L zqjreJdPG|KDP^VW@Wvxr6R56hLd_Fp2i+}r{zckK$F~2VugE{Zf6%3;0q_wAl=s8c z<$e$?wyEICoqb7pA(z{`Z+J&8r@WMn-onXo)k;P>T>OrHdRcitOa*@z8pX@7U9l~h z?stR+$LW0&Bc!;HEU*g67J{ia0J4AtL zERi=Y()q5PEt`d^PV6kPGa3+i$FwrS6~oNC_E^Hd!ri!DS*^5G-Xeu+o-A8sii~Hf zmfnf?$U3RwA7n?JIPF$0sdk$+X($l6>I8A}r9Wy;X`t$qm^s}<=l|oDU0|5;Tt0>z@5B^57amVOC#h!_8jQ?#kI?@m!i}B!o4%%DlVS6?Vi0* zKRHvo{4e+HZE+Gb9H0Gn-XvcfMKr;4}BD2a8v4EPZ=< z@#GJJve7VzK4|K+xBbZ%Hf>u!xN}1?tt4OAG1#|h^Je<9Ys0n;+xzIx?yhZ{H+9pW zJJ)aC(X|cB?(FO9!vY(6H*DC61vd2!4t8%y9uNmp|K#V|(GQ{q1Hy(d5}~8sZJT=7 zprZR+cGP?%Qm`uz>)^^|zYr~h0c_^Dd*>q@Y3=h{wbQdqo6CU4JqA)CAr)?Sd%o-* z%4Ar@5&HH0_x*t4VMO-*48(B7wB3$?t$_I+91c3(cvbNxRJbx?f05ogqi|<&N+hJn z*!)sacp&_eiQJ}X6^KRSko7BF!uj7j!Sh*j90h=1II(c=XAw0-fK$Y18QM^5rJ$z% zSu|11L7IlLcKILmE7$A)zUTh!)8u1c2!BI7nN?t$^4RJ6eIM05hs;#?#*=h}!K-wlXJo3r}mqlr!#On>ma!Xm8&NMZP( z!{S+o>W5Y#X%)v+cA*abpV`!r3>=3X&Cv-j{=&q>M6kfPS(tA0odq`QSGs!wU-G79 z5DNk%R_%UeQ#x|8oL~mvDJBxP`@;u29WMgFB`eQCFvX1G{ z3p%`PLGYzxGM#i6@V}Jtw9?fP+g^oOd15#!4TZoWv}Rc^FF|Pkj*MgO)DDqCsynI` zhNtf+>keb&0LR>A!WA66evs-oqNLUx_Io+<+m3fa%^YcP&^;2Z;8YD3GB5yod{1cX zMG~=S>^r?B)F04d9|`STpNVlRpSMLR{h$)&5GRQ2&LFEmFXY-H(?e+_PF5%qhbc>R z(@ODN$-x_tA@+eWoR!~3aTcUo2f}oS$we`O0^IH73}N}v_%u`=ia=YJ8^=%Iy7Qke zJiJ=_V2&j(x2KJ~5`=Cb`4~?RE+rIE6vvtl+cX*R1SD6dR4s6BNF}psMaz~|LoJf5 zuG!8jDpfab)r<)f(F)JOh)6Yz)cNe=6k&B&J zD0+oZ%RkOMR_tQktUiLt0Jp38JhAOm5}|+)ac}?No||(&x$$WJ)Z*Oj`i;}>xijv} z?b?M~wJX=_mp`ptK3cnQ3u#1BMo5rk?)|*@@Cqw0NRrL@oWv7P!LOvZt4m^BPXo}eIj!*!cNZ3*|5!*2K5iG_Rj#RWj@2C1Z42}<)AR|yZ~tB%+jnd@OHJFc7KVJZu60~p6#h%AtiHWiYNmu%ma3%(K0vleAa2T5?(H9Nag)o@0T$sIHs1E; z*{V!CyxO>d>2Y+G$%(jKTO}tEb!iGL`Z>c2H$z~20HpL|_}0C48drpy z5+O$DFje7^othZ6Ih7Raxwnoles{e7)rI<*TeZt4>z6)eJMY*>4AcI4s{Z4>`n@ZQvk&U`XCKX< zs@=SXbri3pPW)H2*MJ_S_Hr#nxfk>UHdIf>}$XW zq!QqUmBg_nBgA}R^NXNpu=$TfuX*jxv86Asg?E7><22VLB$E+3KwS8cun>YkNE&7v z`H9I4Y(%j_!`?k3qw=zsh*}_4SP_#1GaNCTPB_sf`<0|xfgny)b&#cdH(rYc+^(Nb z0`@*=Ttt86mXCZEvB65y^r0`r9^YZ;GkdBwbMDdn2kz}3@Qt$WFgBi{I!lh#1t5&} z5oO`dKiJ0p>#4Y+BZTIJ$I`gnm#+TuPFVD(LVx(szKWuMcN3!jbHeh)P1h>RkEq)o z%NKX>a!en2lY8ny?c&c%7k~1?0G3s{uzsAb0MGx8@PX-vm^MGTMdroKh13&g{fa>o z0+bAD6qA20bq?;9Ny9WzLHlb|%f!<1B4sF>1}Ny0J)H%us5wc=qA(r(p=4IA=r3i> zsDfJ2`{v&QiBN9MUaikwtbh5yojG2cJMZb%_Ik=tFN-6nTSMTaI#`GrhbrH#Tj6R4 z158&CQbKscC?#&(=x~kQ+q1srPb-swqS?|i2N&2dr@+e&7SAxJggwYJ%1prF2TFDN zLBIlq5Y)DuMTFMODjT{a`oMA!n^h~icrPsdg9((TFORsl&ekse9ICquxA8}`nFa7n3REtC3ow?-BTuMe- zo9ZV|xSxEpc>g|<4-}=b01D1SWwl6<7=q*!rDH`)`F{9(K$ZYRs`2-uwJX7D4sp?t*@)c`jDuwsY0y2kpfCzT(!9^xv zo^1X~22z87a`cr9@V!wwp~yP?C2)0K$*bc>9!P2co+J(4xNO-;tw79V#8#`F{LGy{ z>Yn|Jd*`F2tN*+7^|$QyP=y%71R?+v$@a%i(eOEyEICfa?$2h6np3KdXYyt_`-WNAL*17fGxOT%zxn?n^`(~Y4PC+g@cN9DmEj*)L*n$!YknQB?+MPj0&AF;pQAD zG3)b3<(~W#;BJ+rZw_@!zwlMo3RDsZk~QjJY-18L-de`4j-!)g%6p}&wnK%RJrk*9 zCJE`mx;rQvnn|z=%1oC0e{BJpixUsk#YLh zo}?eOJQypIjy5sD{=y%1691M6utxfKB6%RV6#_%>SHPR~@@Ta9{qd!5|01K&o3JaM zJ{qyj`Rhg_I>`VUl`DM=Q_AqyEEX9~z@M@?34bPZ`e&+4|CA5npFaAhw@5Lp%+Ro0 zDTZ+;&~GE$;g?FbB+`lOOG?#1|AS8IQRlg*f$be!-V4f0SWg;XtdPQ1YV=KbUVCuKrs6cyD3*Lt zSB>IU@Iv&w?_O%Jw&4HRu%a`qlNYJ|Z);cFgs|PbEjNtg^Kbj}VN!QT!z_>-cen)j z1HUB}-Xy`AuhFbP85}O+ST2X3>|Bnz$9mqeFJ%M0rEtb+W&i#pu3a*Xe-EVhCv!PE z`k_KHJ(hqC)H&J7CpMNiaG)b1%BRq`c>jpyhxDhZ+Db0?GR<6f-`ovBtf7SPoK~hZ zr!?psq953AUIUa(!CKxsUWn=XgXP56X@z;2^-F|b!|7r>db0QtA#;IuyuDyUQfF|bBw~u<>$IODYmjDpfnxHjG+(amG)03p zNyO#yUgC;)kG8ik!YhvwOu~lV;$djX1lQR@uA9dcqM2vSng^VLZmm}2Vmh3c?AmK)>xP(=)g+_1L|yb`_S(G^){qg19lvdpGX z=kHZbNA0vJ^@{0yv(#`;WSQ=+c3ST4mYVL3E)-tXf@VXIwN70tYp_g}xb}Oc_WPm> zg_p8aEfzJS2-j^IwH{td)Pj1`4c>u6x{=D|fkt7h?X3)?=e?2ixP$?eQ*RvuWfr$45GykwyoOO#a$jz5t03dgvJ zo#vNLqM|}X?r+vb7^ISAf=UdmX%?9(a4jP6*}q>THnSY2`nx(P+NXHynE4~Ebo;2n z(4|M{v%9Mo=*?IH^Li(|M3hIMYR{&Q2t-ROn`jjg7Y>Nnw+w;nizje>Qo;4MO%!NC57ao4S zIQM~jY~G#yrFQiDNAss9d)RHYlc#Z%^-CWsqih^X{i{3fu^;Pa=G<>Ta?gITbmHvd z-0g*jU)MkXvLQ+Qk0N^z&?Mq)ngaUIQi&W`*{UzY+Bc-*LCIt|nc#9-%X{XQc#quD z&DiPXe55dO%!&uG(CHB+!4)pMD7OkL&ZyQ{V)3UdU|IV5#NySfd}&0o)lP>fN=vja z%#(s}qL!j5id_#ncUmHcaJYxB;C(1i!Ior%sKL;a zR?y2z*l%2TfPN+4sMtN_?;NqNw>P9lxR&4VX98}Ti8sDtH&8lm2x-*p(1rv1EJE7p z>1!+`FSA~D5K^!hTRX zM8pcu(S{v_jIl%8Be5i3Qk|i~)4&nzxm^sw+H3gHDt_QdR=C8d^9-yphiCz^8Cn5Y znZ_Vobr4t5JF;S69VV5qYqwHm2!TVbJ!Mtb0}VIBPUYAMt9cNVkAse-+NDlacf{3~ z%)nk0-NviVY@4L&H>Z^mH78hNFoiWP<}_e!}W$`|!9iy{hW1 z39ILciuNmzzBgQOqX5MxYI+++W8=Z`MVK3uvu zi??yxvnhEVZJuT6)9Z)|?pF`okIuTYS8G?U_cmOnpE%2%n5>so%FrMJ7qyat~8O}0_mWE*2Q+3YV%C(bT? zdCr~rd6l*o+gs<(Jeoh{-v12Dt{>jOeik1*aA$5UeKF%6ov&T|neMskj91<|zIfsv z?k6|g4=&ekep@?py>|X*2nIo2Xdlg=LL2bH{3TXw=0xrEx9-d>_t?)1_b#|+V-zQA z8~15$+@@J0b<0{QgOnPHmSRkZh-nl_KSarrj!LHS2dKUSYhx+6`{Y@2J6100@ZOsw z4AJvy#da7i5lI$ASwy1Sbm7h?OJAN-Qm=07Satc8IqNiy64aUQ)om+73D!t7N|ZID zU+Kzp%jaST5owMrtKl11#2 zsjrZ4c+E5*6YIO=cj}>jxDOjaI@UkS6yn7f2@hgw8BY;!0Q6xW< zC!|0M5p#n0$nq59-S_0hk$}{ZR(d;DhvYVEFA$6bJ?l5D+(=;ewrwKV+^&C_-Mi*l z*4VSmhtLXr%6cR&*%Rec*0`_d(wj_}(lc&slAOlu-WHt3?A|q}u{FEan$y_x>on$r zxj;|Rad2*Y4(gU~xpa5MorHFUF&Jw&v9M-Ga2uJFfwael;_S|#u2vt&B-wFS4vnHZ_l|8K3@9! znc6q=k%YCPI;9c7pf2q*rP+yZGg$+NW0*?%b~>_@zmDYpM;{*pjO$RQPc z`)Ks3g*%_tF8qR4!rD~`mQ(-!Ru;{E*aB-UVt`(ok&R>mJ&A2DORWNXBIfSr8a;ca ztcc!zY}@|N8~D}Ait-kT_HM7{4-#khQg$+zi*;4ANZO7B@?sh#- zSW%V2ZKA{H(h)T{ujf3fA)8JMUaG9dnyc!XtLmDo>RNom zwfKhrIq?mtycZwh5I#S(D2Lej3IZKs18cbQxDCZ}0+H^x3?janGGz zEsg!zxuv5gAI+btpTDti_l*11efRh=bc#^6qgbO1Zr=@NWa>#I4&l-K%)*`1?zw+@ zPVkTBPp+x)pTEFRmU(D;C2^rx{ifW~@Y+PbGHq6^PFhoRLtg2Yeu|q|4&2rq8@X+_ z=2)fzxp)5Z#cFNh`J?W+IrrQd_w?uJtAWlWwX^5k(U-N&)C;|@DeD_6>mxw5LWRBT z@X!~fuy3-{=Td1OHMi$naW71%1?9a^YfXW_rodlQ;6MMdCM;4h+q`rxM~3d+7_W-^ z%)R^B>gnNX-^{!7XCKX9VuJU%(^;713A=$tkC+>=n(%CVTcV}mi*zyF|i z`6SZf)mGOs3V-YP;_QQkJ9n`w(63PY3kDBa{O*ILqn8#Rp1@Ev1hYo?pGVE@ zUQ3%)9n!w;mNoDnpuO$;6>D$#D!!s5Mf&1tS-W1{CXxYv>(5`p-M=_@yY}x7sooYd z0bv8Ri{FTsi670MLiH`&%>C-8+L`OvcYD{$t*> zNawqDwrmyvJF~>jsFtNpXDU^@lzG=4OKcf48kN=@VyTX4W%8zBJ61IhzgwwCCW$rO zQjG~scZk(u6{FBv1=H#zYQ8lPl+{Wz<=?eUBV$u`r%eQ>K0%y(>5rOI8mKxYWx_Jc zO7g$6RY%k9tn@9pWy~OlXdQ-$h?ub8sg8gm+S^~*tg>+DX#MW@h-#1KFJZU}rjO&= zT&CmhSN018cM=7)q(gL4wA6Akd@(;c%D+V)D0ve!A!$VQLEWqtcIv7{l;NIb+OT`0 zS{UhFrW(I;5>b~~cb92EG>1hr@)~~L37@@&4tND6`&uM0vsre3bm{2Hg*!Lvmp+!4 zNL3i2*E8IvSB!Bo?)96lmUNI-%EK194mi^FJE5ZVImh>S9T zfbUf`3#5e5#lSMLZF-e433(GAeC8gz?y2&V@_F6Tibc@JB**otm5diLCRJT4z+UWE zQowH0xN2!7uj)F4n-z^T!l~1C=-_Q-tKyV2I}-$%XZ3+So&tFe+JV1RSC1TB5KAVM z6m5^usuU{pUsmw%)~z_Kj*L!>qEk{{R=PXF=RH2=ltHGH9hPNUsiX&>g*&GgKf1qk z;OEdqP7l$B!H_CX*2z0_M$Jt6jM11-n7Ev~VBLsrJR3d+s|p zf}fdlzx~KP`^D0Uv!O9lSOU}Bt2(9S!3l&p3{Me6ysa(4u3&OrN56sj5o1!bOar7N zWm2^?5aXie*%W9O?%Z8?_;vmBFWsZ_VE}s|Zq#^0rO0K9U-{6wO44nUd*pynj{CN+ zY?~^c^MA69F<^H16^>xAq&mvb_NMy}Q?M}o9NanF6QG@9x@w8mHKvZ?wnuscE&G`X zR)rpid*r@Ka<_qdXpgCHfe8lsk1(mP${2!n?O!QlYUGjdT=OOYW8&CTG;e7Lku~=6 zWZ8?e3cN)$S+&Dnz)-icA$UgR6>t~vg6yx97R6m@ey-^dwnCe$b(IT>i zJ=er+r1yy*^`k(zMg^ZN735iUR!D$&9;bGQpr1iuWrGN0n`loSEYeV@t1}FmE}@-a z2(jr`HkLpr|8~X_h;qI{;vI?+ze0ZX$v2Dl@7F*1xpwpe?{0;}jhI;w&8W00*!rpt zjF?R%phU-QU%&Km?VA(zn-8#zq>A4K>id*HN07Yb`9&C{ZVgD9Pj+cZsd0aYGkXkg z_7%@|PR$44s*q%5kNC4I6Q^Vre5UJLV#NWYhmDeo=w4D>sWuVJ4*k+nHCEPwO)wR- zzyp>vuEu!Ye+8lxbHO2*47^6;Y^0fq&XchNu;r+ZIyp5n%`$8fl#7j^oXyIhj;z^8*6bStc+e>4 zeP0&htXw<@S%Ek>X0t(1(s{09)Fwlac@OvCK3<%=jqZN+dw+3fFDb)4ibtSpGZ*k1 z%`rxc*KXf)Klvuv%v#yK5gQ^(q-nSnqAIkx31lN@ljtw8no!Fj;vXu(IcDgC$kih@ z5SKbapS+}4!Q(`0TQBg5o>LqM?NIZj zR0=&hwJ5a$oLDvGWhFRj?>h*KT0!aDs&sE@p2RFOGP|N{d4iw{^mhgxKhLPSF0NA}v06;4Ad;)-(>|&r0jyoI& zig3y26CQ#qMGQ=$!#TvkCA#$U37h)OlkS6KNQjpHacXhy19$dRZRQ*=!p4?Sbv+fH zLr2Cb5d#KZ)g3!9a8wv-_M13dg_S}FcYhK%cwwxtHosxj0wf-_h2p&Y$)MYncx@ms z5}OfWWozKJ5F?v0dOJy+2k|OG=_KC~>J6zqg7<`ATSXsYrIG@o#UG>uUa}=#i7bONdmv+OH({?im@C4?-oP7KmksbPUNsyr|ka zI$a^jekG|^fL~Hv$%1=-GTwwUZWgBdmEVu-+3nu}Nb$82vx6{XONHeESvh7`sVXOx zL^N=3|A1JLjN1_WCm$DxFlTPNXD^7B;z#o{OD9g(F5Ft2y;`5W2ti9x_YBE(6fvcc z$mHqBMEfx)&aEo(I(MvTaV~(u_aD~J-%tSf3f|bmesLH$BnYB9e`)di@7%M0ssHq? zJO4S@LGRu5M&)C@MeK@c*l_t%ol-TY5oXYVHb#d?2=cz*uzj z>WElP-xRNGrR{Q24Bx%~zH(SZ_b8hpm^{Awu=cmh68x_Hd+{eoA?M!udU5V^w$8VI zs9ioO`vUm0DiUY7WgyDL*lTFJ2qB^2Fpv;TtV#@|qF}{q2rq-cl5eAW+d#>yREVZt9-ed8evDP#4GKXpfplno!B^Po@=Y!QWuYgl4F^J{{txft^8hByn zcWiO)o_qEJO*MNOHv(>oz$OJ^=j9NRWbwc*YJAshS z5tEV9Qbpo0d1;?b3a@VS5;z5oj5eEPVBY)1a8L)fh_c*oXq66bPV5TW7gO|mrfQSI z8`}U{T^&l6-dJ6R_VXN+-VEYWiv{OUrBmdSh@JWtxt5>rRLcJMikArW{r8pbu0SO} z7nrh@_nY;adI_$E2jTIC>Xb5N%}7B8M0~Q$s!>P@Z9zqZQY?d9eE5}n_q*EHS4Hb| zOd7QyfTU4#AjLs9Fk>;_V*pV8r}y7iHm{ekMCkJ6t$rgO+9b)LJfZholMU)^>hde_ zv}Zy1CfP<#Hb$@7g%h>Q|B}Hbr8aviSjFb>&bq_cUB)qYf)YE`({V(}D(eojYDbh; zx4jddAo@|E%M=EE#gwsFATBH1Q$`Oq=NJr$TSY|ss8x(eQ}--yfWxAD5U&3JUHazH zowJI2`v=U(%VI>Z?7!;{d$o`JwgX~DAmyhSdO@DL^r8E~<#&P%BW^!M_J5VRYNABE z_~4_Ze|`Zyow>gF@Gm%!hz`8^mp^0mYd8Py-nkQnsY2Kbh_7?(NB8U(?x_p4i$9BU zLu7(+9vM#wFE30nCS7YsK-gdU?n3QfS6K+ai!}De-;dU=T*uu5%0cdqSikgfl*?*+ zEK_EhL8-a+!`0g5lVWc$uCwRr*Y0AVITm3^5Uazdu{<0xt#T?UPEiCnHiFgbXKsN2 zj$udG3Fp+}!!O;lbKv7iOD^0wx^VX^h;MZ9r~h~KLxfQMpP#y?f8?^@m1J5;x-(z9 z-+$_!lH|l>I>Or(#?>f$) z{^2j~iF@wM?b?M~wNodT{yHnoDcD=2m>Jqz;X|u@UJg#F{WEjq3~&D3y?jGHGM`$U zyA2aQ`ei1QiICO*Gfv8}+7fZQpbk)0m_(egBb}1Ob9TRyRQ`)ifqsVJBx{%dQNMD1 z>HL?Ab91tj@d^*49!@b=nDDu!i7_Wv?cgdnESgorAq5}HX(M_RdV8`3200K_nXTyb ze9bJw>6e3O#!4V2z8u(oK_w_hE&hIss6xIvyYTR9a5`h|WtUH~)8o>;FBWI7d7__y z&!9X7-snAemNsdv!=F7I7hlpl37%)_%ZluWlF4L(QKAKJDM@;wyCuf8Bg*e1-gPS0 zaY_mV))5w8Lb_#f#t~rmz51E}yWQ&n-R^Awa^WNIUU>DZ1GlfJ_h%acYJP#-gLgcj znO5I}HhXRW@?Z%*lHmKcfbTn+h0-qpK~6RUq=2C!FuuT2ws>nj0@&h>`6d7^7)Csx z3-1~LKB^R-T-3L=7C`VH3kURj|NWqMSo|tP7=R)MyLzjEmk-)dxe7c^)VcCQSVxAj z)}YiH;EWi*IIoq4<=SvMh|$VFi;J08fV) zQe%lsb_AGaaUW%vnaL`7WwJ_M1d)BKL&_D9BVN=BTMO&QdkXnN{zW@)R!Cth@M?&} z#u~QsmR50^X%tJosH;YC>$^0V8w*$UQhT+9pjr(pf}in=)Ny5NSKNfK-MlR~jN=>R zaP@|n$!0QH!z_>-kKzUJhpvg0Eoior#hR}Xy}|;MjTtET=5qMS&gGP?O7^7}a=E?x zhIiz0FJ%M0rEta&$SsL$mrUc|1L^(AT#k-@2)uO@fc~A6oqS?ri30~ZU>bpNU_#%1 z$hX5vIEtX6+EKv;)7;?hLj(#2U#1ly?4HmRYl8*HqaWDswBqH(ps&3r-jx4Ic;+9) z5Q#z=@pW1mwNwK$V$dS~BX7kEz9%%{y-O>Bu%xt5;9Xkr^Mx?L@W-^mbBoXqexi|Z z8j>*V*<=}*xAT~OBJ91F2wv~e_Mj}h@+iP0Y~(E-W_kf5xr2b0!^0-|s--#8o!l%9 z_vnNz@LbGgVxoW*p9hyd=)6pEApsOvnxiEeA+vCxo6> zH3Q=$N7UXBu8sAGu6MGy)iG5!wqJEq%$N&^h%vP`x8GrR*9z)(H&Iu?Me4+WoN;T_ z-6m>vH^!~FT77Ny7DlPYDA*mwqJpOCX0da^G@V%7>)zO2wK(iS&!o6o9`?xLpS`fp zjZdTMR%B!7g>=^lBGsx>@@_Lg?jFXQq#Stgey?iVVgfvt=#GDq z(%bPQdsAA$DKW;^)5TLBJjP6ts1tYRj@Q5WK#0E2bN9ex2h9Rmtvq|-)IH%GlOX_S z_$XRPE7>KXQdd-3$@qT!Op;>Yxked%me1#78bdI5A?|xgH3~Y}$IyX(6@z&+mHlVg zY$HP`Tg0Zj3~mDP80)PPUK<@tOsECYY3o`+OydE4!bh{}bZSORh=S_?kmFDoL>qE! z4%oQNmJRY#)vwNihBJuaK8`cH^={&gBDB0TTPAMZPFDO$CbWvf*XWTqm(_;n3y`x1 zG`CNp`;FW+&q^k&aH5TF-&?)8>=@25p=%uT5Ay@kY_8`9y-mb8tGWlo`IJZ6_{UG7>2Bu*gHvj>x43g{;dl8v#7 zPP?KSQqfHfp+{#JPR_Yn0IU$Jtl2hN@xoxNef`nWm*<`$95<(x{o)ozQWdFf7904p231+cJqbz=#Z&iLuUt2^Cl>feCdfoGBxLp{fCvPOx4 zNkPL1kN)Cxw0IH`vY__J(tl51To%;&{Ds8_e~HL{8j_?}nE!Rfz-y3ldHICP0mx>w z!b*TEi@81P^fd=Ywum)OvXDm^=5& z(${};XO6pHUu0QC>7~Q^`75>0XW*LS`MKJu4-~_mn0nV%+`pcpDgjG%2x};lH_OZ+ z-NW*VuIA~?QQ)jRk#o^|Rbtb98cJ0kPE+ssD(PfG%up}s)ACiz=H5y)aIsI={X0$3 z2e39(_IOvx({XS}KW)W3Tm?Qihe)?tDp_=9Sw<%t1CI>9Yuvm_R`!S35OvgFrZZos z^prH_6#RUnt^rc3jW=tJvA{?7m41Z*nCeS5E{4 zk}KA`)5By}_}BxQ$=AvBlQb&D0fGNuVd4fV+UsPxg`FfDpf|O$lOnrb9pcu6^13DL zKrCG)gy@b&h{fA;?t_n?1)P9Py%~YjQ zW|*$9ckr^+Xs)&`EEX2XbD)68wDwk?kVAIH8GVv?pA6aA?@@Wicc|BOoXOGi@hEn? z+m_Z5vw#Q@fSe&C@gw>NJ;-;^g5+HRtZd;r+bCI`;nV2xh7wraZliE;yPBtca~;io z{aMr^yt1?bQURdu$8K+;r{>LkKht0RIiu^Y@V**d6lZs!L2$a?EDh!UF>pPz6PC%B z|IzJsFuFJw{q-K)Pu~_xADdb^T0J8FfLOEFbv>H@7+d6Ap|5TsOCMQ)Q1H~$Q^g9WDkO9PIvQsMI-Bnwe)Jkg z?|m<)yV_S06yu3Ca&fo6UGpbu)h)D`$Ca^`#zD?!RwkVyFrfA=WI6l04_J40 zLuQdZKMzZ2K?|L{tKMth%K~o`5SUF_B!NM8{pe}lu5=U1z0!|F!fOKv5hStvz*@rW zRwr3Dgs3LcvElLRfu)+LE$t-1$NL->Zi_X<>2;KP)XD6=EA$c6z{%ajr)Wz=2cxSP zx9>Z_!R=scu{?w7W_O(ki@EDl2NW`jacOZNLSw9vL(}-`Hm;U6qg(OMiD+eKsbz!> zAhg#PxvA~uduA)AUTEmM_ZY%5Sanviu~oHFJ3=@o4dVyPEL3_EC)$B3WM_L24|F37 z^h>+~7L}IK$y;f4s+nS*X+5#Qbh?1{4&=2I(}X*aIlvY`R*^~j>?EoKmYf>n=nZ8# zPLIn_I|bBkTeg}OixIn5Vu)9-X!HKFa(tYk@Dglo$!dzL>~24>g6a(!$yxQy!U7~f z0b12YS;hbZSx~qy13}n0UFv3311KCl!#E2jm}Cufo03P;rByRcYU1j1SJuWui#JW` zGUKjh64jjB?&kE1Lf=7l*UmCpx3AL{dPA#JG`_()f$5)?6zG`#!?A4@(Zk&Vu4)Zb z-vhUkeRSL<@OXbn*QLTMtLc6uWvc7>;c9P%M@F6Ga?&im_inDXSgRDG6F<=8@lGKn>Iad!RO2dLyBqqkzr`L>F&ONe#9} zvT?FjYip^7cHYHK*X`5K6xk-vm-GDmiAB1}_iuV}?c;B<#Rm|(+{Y@(CaP46OE>(| zd?4*a3vb{6IIrV_c15s9WtyXe%E@fbuTJnVe6pEWhjy|_Cc*_rr1`kMv;#G)M)Ej0 z7T>pSY+!pzua~!AO1g&@(tk3|kZnYdsCFEby+r-UMjrmqrBw#0%Z)3o9Bb4}cXox9 zXpRiync^Mx#Fx4DVjI)^NjJOW*57@j_l5!3=WzS}Cs+PrGdO*s5kH-7w`QkD?Pu(F zdG75vn{R86S)=z?e!X>if4W@j?~`cve^Qok{QD$Vy8xc^+m53Ds28G(+gQEwGdb_V zDk~bWw(RS`>Vxm_aw=<3kk@-jH@lP&uPT%1wZXlNbTNl~MI`>x7NN}uWLSDKbBvvl&ncK3)%AR{PhIrnj_7bz^;j8z}+x>LPa zvb~vE3H~PJA8;!OOWB6pZzTWZ)^cUpnU~s6&=xj)qdWu1`FWAL32zBYF{VTfml6o* z5Rih!wgBDwXbt&K|{p&`dJ}PP7##q zj3eP@D8Zi2!&4!H_6gRX2R7HA^cdyk-z&JU>+yLIW|l@RJ$|H_DAZl%brOvnUs_5A zSrJxx^Xz&{$b^3aQHjNLJ`MxZ!xCb%N3p7OdFj|tVC+!#kZ|QHNDFc52Dj;>o%Pr1 z@X`xWE))^2sD)6mRY^#?!Jr+pGeg`l$f+pF@L0-W1gtJ{3sMr4dObu%P{Wo3)gV|} zwRod!>^mtrHOA#tNUkIq-D;QN;^Q~#ulR8~P)kq)+@7f^IRwk@^Axlus=N5=PT|E$ z6{pQoeTTZy@ceXte%YAQk@x<-};O654I?WDeulwSUn@Z!~B0HV0%TO*S9)L{$gZ7E&3F-+bX*SF=UaFYF zCB2HE*_DzHwKO#v!wc5O|+wKt6c*}CIDxz@WNy{ft$&Mx=E^76J5L>*-))y@3-t=Om#wHKOXX0>F&MaheHqJ);@bR=QcT5`L!7R=Xk4rNPWpOmu9xH)Q8D+9k?OY` z{S>Bk0BLpCPa@5>RZo&A8+D#1@(AN2QXTn(IF0oNSpz%aa3dHtrF8r8MP9{qhY#Gj z6KWt;kRy1a>QM}^0)sZmaZ1Nre|g23`srNh?9iT$lJOc~S!4JD{0V?QX-JFLmo{Oz z;|2EnypUnT-OWP8VLv8)A1!~||9i1Dlt%hYCqkw&hBi9**b=ro0ocGg>Nr@z1^WM1 zAT+G^XA=xzvKwmtJ~0mbwz>ET^E)@-APSP!V_J~Yl0xB} zCu6x>Bgo}_&q4qgNQ>md-eL}`Mlk70q7Va}9g?TWgqb0^O4xg-#OD##MW>gl7WgR= z!e+Jq7iN_9CcDg(L19RiSH0_sCLBp}-?&UZ z8WRzC<+XkHTL3pVd7>^XSRY?SJ+C z+MN-9R2Nv%$mfUsn9M`Fn9+{uuz(l;|<1Ez* zGeapYdC}HFY2Aw?L9Vw5t^Etf+=1&!Zozv>V*C-O%Pr>4a??LiyX0}i(g}~{Y^2cx z@frW;`?QmRWfOt-=pL^u=6Y~}E7CgOCQy=o%YAwD?rO90S53#med$XB4Y=-h;*exA5e4 zeO&$vHs1BFH^89WW3@pbHe@d>!Qfn2bOiUNX|CG*-?CXAYZ8YJf7Nf z`+baZyn!O)vB6M}WE-N@M%kC#JK5+TC2&(PfqMiejBg{c)V_j8n&T%`VLZlU7qJss zkla7UX`xBEXN@w&e$Pc;2beYVa*#fD<}(jOHWi4DBq;ex;-i#^#6LQdZU!O}Pb?p@ zIJJMI3SR^G!{;3;LB^|GLCP@@AmTx~k2b1;$4KTcp2J;lkmvG7|aMy-eI4eq>?e%JAzU$97Kt4CKA#v@CYuvQcDmNKoV-z|A=WXPR zftoT}CHt%_XI+@$5W`a89gCc;gPLjB#Gz(+Z z+)ksezz$e36}+gYHgDTRSP`e6mr{(lww0Kz9#&Ci0iBQx6&R|+grWGr?@dw@q*$_5 z6)YpNOwh81EO0S>xrRY{(t{sRsRN1Drvi(sAk^!SLfs!KHOe4*aQafECs_uq6Z=vp z=!rBTGSwm^s)I!sdq>JvWyr8qbm`JjYjGajqwd442)^(x#u;#(9p=F26^5C zh_#U}L|#ZstyG?wkUyS0%Q2ZKyLCy9`O4Arq`0 zJc(QRQzw@v;ZPH-p*MFqw};4BQaGIR085Y_q|iR!aM?HlgbhhWTgD$5t%C{6b8vp; zSais=zSq1(DULx{T13BGH6Xj~7M*?F0^Un+Y`geAIqJcb2OGKv>0P4+%2hCDn6m!_ z7-9}g%Rff*Dupp`S?JF>5ur}I-1caCR1A)2yV5un`E=9R^>>q7H^~j=?H=c6JAL~| z75O9Lv`KPw#Q=ZsAlEJ-SD-}nV=I=htAZzZdiXHX`l4 zq3^qVGO?uV>U!DamsV5<`6-k%hgB<7rI?S()`O&Ghxt^gDtfLG3oT{(BY$T;9ocmn z5Qo#nF2;(;3B|$Cx1M_)O|giR$WA}o`W165@-0Mlu#(7t*h95CjYvn>8iK{|Dxfv~ zYWD`TVohObaQl7BP^+L_Y8Zlbo>ME?@M@}K)*{^2U|>7BcFH*PIBp7r|7SA9X}$MWbhK!ZvUERII!?RMUp&*fL#Njkhu% zYPkn{tKmt&w`44|6Grr|$-n+Q!iFQ*p8Cz@i^X*S#@ge?=dD5U+TIw1LT)Np=lQ$7oGH;Om# z%#{5W$n2ylH=bj=c}2V&+F z5Y3e{bFlhMU9d?Fy+?6<%gs&eUe7+BTy!!U+WxwzC}GWp&Bg7O8Ix1HuVVLE2bMrd-=Lu z@6p`O+s^P1I6lgS*x)q)6-_=I-6q9rZJy6l zU!iccw~hJfx4Q!}@?kjJzrtcY`Rkntj*rl&26qUJKpGT0pD+!Aqnj_l?Km35ekar; zpWQ8_T*J0xHX(AXg5cN!*o}NrWBDI_%?Q8fZ@h2S{C05OWTDhix0q`&ojO8u+|vKR zz)`#LIo{>c|9Rzowa;Ir_r1c)bvN&G>;GBibv?Mh<+b3{8^4O^2)*9rid&08zxizN z_|b1&+N0a%?^y z8bb0$^Rc=v^fvn%S=S?vwfC9dW)-B_RviX^D_&a-4lk{W=DygjY%PlB#=o0dO&k2^ z)~AgIx4LDs4<2plY~}DL7HiF`=cRQqGnMFhH5$Giou9MqMesH2pASoKOrX%K0BCqT zx^3QO7e}{?Eqa2v_X+SDefiGjbhMlNu!`i@8@kz9BR>IoNn*?r4V-CIGBq1AHS-?L zO2Ld-59URt(_-R#$WyJTGEB?!84i$yKaFMiHlve6g~uEJW3yDFt~XbH1{)HXLsm5;nptZ>_f6#3tvAlSx*anK5k~ z`L5o4^EIbVe$;q4i(i}TzmLe-gR0yA#OU^5@r`ns`3tqz`aVX#A}Mzs5uX=@z})DO zd4TeF>*s55ITrbSi+$~`A&5P`#J)V*@?tA?rM$gvn=x24! zS?2tX@n12o3)|Ue8um_MruO^5-r;FeZPOL!T74(x%;7%Ur?2js&>++a#)YUsC$FzG z3pFdrfveC=3M!l16~W6_!tO8H34u3$ZAO3)n1p1C=CJv>+W({Bl5*Q+DzhmjNG*TA zULC$NwZ66^wiy_Tc*H$UIrcII#YKH@bMlAJ&S zGk*BXPFiVAR;i4+()P#JZTUCFkp3xzg_K4E_rgZ1si@N`R#k$Yi*g}_wGwSoRhex) zHK9fcSEDej&09W5oB^xjPLw>rw%&tdCpW@Da(AG=*-wZlv=YE4%a*sfVT1rOJ#qEmiUBgS6foVX0}%v$)Lp>1}Q{x4S)^j~drz=T_u= z_aUEu4|#TZwi&-%`5e4p`LeWB>F=LZ)-XHAW;^xvS{W4{QyyJ3hqp4X`JenS z-S!VyNHVqhwsUzVO7im=hz3$-pUJhx{cs#A<5ejr98x0_-0|5~@M7VMG%J_Uh2wE-OTS=ET@rovln%enylnpKQxsz*(>eS_sU0Y*6AK)wiKqdE^-6YVG zvO5`aKa{}yZh^q)-dyo~g93ur>2l~smQiR9f8y;WkX>E%C@KlAO1shX^+}VeW1w;L z>n|nRXo8jInn@}-akb1s=$rg%9udgqeD)-_rLr&(x%(oPsIhB4=IO9eSswS7$~tl| z7)T&=NTI%6?{Um#cD5${?$l$i0ZrAOvJUMmp7#Am!p>M%ca~;-6#iuW%=5cy6eM_7 zA5qUmW)IOet^Ll;%-kU9f%y$t-5D|FI2R2!JP2P{>4gB`Hg{lp(E|e)?fqo^H(%IP ziN}%2HP^+ZKDlXvFAcg>ej#_D_c_avJ?IOn*Yb_y;%4nYg;;h!`nt|_M0Q{zYOp(S zG1*gf2lhDm>f+A8YLKXn`Zdzb0Yg>X79RW^BRw^0K&Zrfs`%S#R5cB1M3v5et&*_x z(|zM>y5hyM-91On^X%$ zoze)oG*!xw)q#?qa~jz6oLYWXWL`;C>*BJI`?J|Aod95Ry1KaX%SOF#l~(i9`??U* zu}AIE#@Ip_V@hoZSb+G11mKJSpVrx^?s^*T80tNbb87=x4gyG_fwdu&!Kh+~roJ+c z1=qI7Zk(6ykoOsPOL>KMi_(p}1Uw-%XnO@}Y%yrkpXe4>A;p4gWduDgPL4UpRbkOL0z5mmjpZQ&Hr8$f+Zci}_rA=r^N%3d27_~bU z^5V!8XQrC%o=wf4LpmJfg?7-3C)&oQ*VjqMx1JyGpFd_w-d z6#=y^r1ux08BZirX1Zni9R$>Xfxh4-6K(Qf)>*?@St6Sw7>yEfU{M8!#0tx_U;s_l z%);_R*Ia>F7}HMRs}zY$4-%ohOE&A4Lzz&@P=xv!kFfg#8b%=$rIH!Y09%+%(PWNM z1T_QVOcSxJNP!kU8GCF`e;n3i?~(p11dxU84j={r`JPU3aLh{xC`wCCCNTn2^7} zk~?7lktfP!M7kK6bn)0-63{h|n?d*$h-8&ZYX~i(mR@h=b$Plqh$d`I~M+c&m_} zB?Q*R;0E?JrAv1xF6Q;d4})>991jA6}W)1 z4-Q)nz;6J%Pp@3Muy}t;6%ao&G9kjHNG9ewPH2jKpeI*?3{J^Fu}iiH85lIkRVW1W zUi`lFd$5at$Y@ij*E%FD4d6;`k*uID&85gWx&wfEid;A?m2id#S0gMi?I3p!zA?K( zTZtk>LK7J2BWV)?&K*6WLgruJ5UR$qWt%9wxIB>qB2Q;8it#rP_edFE zq>e8B-#sj8dX_Z4iyH600ZHSF3o(nzW)u>q>nb~VNH2i()=xLtVv%` z`~Tkmp8%L84R%SRO~PoCAlB4>AC7rRVoire0W=wZ+Y1J2v;Wyf@~RE2%X?@pC?!gi zQ}CrBJrf=cnSkW|xXy^Hx?Oe&V)0JTRChgOlw%;OnynC{Y_Hpd+dKR|ruf zpqgS>h_qUABZ~x;%t>rsPcfxNZP< zXnnzB$;Pr?M~=ye5?~PBniK{Mm<|au-akZy3tT;}|IIzs3dpP~bVfX63LEy}BrE6x69TKjtbW3xb~ZsdP+JF(rsC~8fql96j1}}# zx5${{UbO)tz$0A@8~m=Iyx-*|(9b|b0Z#!KgJ=e!JO4}}*ot%|`+)b*mt;Bk6s=)W zZ>0!k!HpK$6RZJgdzqRP720FFKO!wtf?R*Sm53b%m}1jAMinQF3&1ks_U@I`PbVAu zm`{+RA&OyLDYa{oRHBM=OSu7n9&HE;(Wu}9pfc>T{i&{5`{w&@`+;k;^hTeL8<2}b z1du1i9?GnXDekK9L}iq`%LC|SPrex0{(G+Zzb|~`i{b3wdkH=b9mMkQmLpN_lQ2>4 z3e*tO#9CwVchONN%JuwyBRx1P)K?472XZPxthg7wRGI67A%(r_ zsw;WT*076ee)YYgrcALyrn-&Wh055!RH-6kt}7n7C@(3pQN}F`{E3pbDRoD0yOaS3 z9xIFG|?blcI3~Az1O2;GVC{I@xcuMkXP1hW0S;O*YWTHwe)E++lHjj#3?6E5C-BL zhJVlFCacK*KzD*={0Uq6DLvR2ht8r(u$)_Go&tS=OuT?5JflwT#%Jik?{k7~VNV&% zt)bfn>mM#MGKzxz(nU`!^*=W4tae8O7YzHO_1)1f`=g58(Zrsa!7n!O*DV|`d**=t z8G!G$Ynb!5P_}C3)r!=OsLLVl3p-P5UA5Q6v^|uC582IuY@3O_8kJh8t0H#KTl+(! zeoOV510rux^mo~=c@#6#T7!VU#I%}tZV&dArth0>Wv_>)?2n!+cxBoSO1^6*(qu) zy?T{$0H$>a)lmKv)6`z5quPw+y8KX5dyER3^&6x@sK9M)O9~hIzDaq#Z%D)q8(ht%ZLnT3C};!P?%_pg!T<|7 zxNXhZld`5OfG}kR``!1i^@IH|S9fD{+29B4BRRUt>kcaw1d2oWDPtTmHeTp&tUk7%e-QM6f!nH9X(laKr~hG*SfPHD)6Oedx=lJd60NE+E* zkQzC7>}Z5y<1n)?(W1<*TGOOU0ctePVRRBQ_(Ttk7K59kZV)W+0!W6*1A{1z_`g)t%m2Gsalc^!P^x;ZJ?Uw|K+N0 z+zLLBO^sX~LB*#dh5a+XrZ>dqZ~U(d{@Y5zBJ7*4@+FT_SOEZ!WN8SavbAffD-ANSa)B}j}dO&^%z-IVQ-`TUZh_kBh3sW`!g9_Ci{^L)D z*{w--cpj!t!j?vTiBf5bnKJG!Tv`7XbkoN90N*?E58U-GXN$K5N=aR>w^*21`0jQh z@-8gA&D`}4W6oAzaFjc6x7(=&vHv<3DSgr$Hpl%nwjBahWt`I| zYO{^_;_X6f!vm~x&bM;4Q$}c&@{epd|I*HW+Mgyf;*f)(>t@(fm>DeQ5B6oDtxRSO zlVa~-af~rsHNojRg`IW?ZgabLKkcn|oxp>Z=E^HjV*5P{mjQ}v(-PB^_W>LL0WBj= z^c^`W-y=8!ScO;~+RqXJU=^;%N7`%JOO-u(pJ%>B_T8FdEM6ht!5Q1345HC|oM8cK zI368N6;$DKyLHOZ8O%IB033XS+C8&%K$Ge=X$aIqo7QNO@XKsf9sJ@HijPe3DFpR2 zp1T3A2dC8oT!i8sz7tmsU3oI+j6)Z@gUY038-GlWT^4wyQ*QO`V@hHwB`v+8y z`ir8PI8<^mKSdgW-7${S_&;RcP5F6FhK&Iy7dtV7l1w!$2B_cylTGIPGBfKV8|w|3 zJwZrtZ?%6Z*Vlbkd49MiT2(mnSS1U@I-~piPAShy$F&us)l{wF3~~^$_(iL6O=dQ) z5Wbqc$NVUfz?3)bfSg7lM)htH=iIWOopicVU3tkVJ!3- z70*@$l&jiX;#5`i?1d||J42xIF1@kD%6ryJu52h4d?XH-Ej|dRP|Y`8&ER$2 znHU8fZ=5njNYVOJK@9p=RDr%UlwU%~3ya-(HgMIQd^H^s)6(?638yBK)tlb__9*Uo z6Gk1pNPWTAw7egQFe`YTf2nS8*Mq(A94m~vKu689P`tpbC}WWPfjpz&yA^oh6ij}1MlmyK%VB|THV;F8Ey6wzSrTwj z4~1u+EJB3ryfI-BWl|n01l~8D%T^87al625ry4CIuk-NBsbZPQjth=I?IL(u>=R5C z4lQy>4pGHg-V<%BY&j#w2a;z}@jjC8Brgr$l2U3%7_2lQ@U$U^oCH%vD?6c|tAlS@ zOs)|ug0EcaZfogk2|0O4P@RBFIRghvG*m@zT z>_3u^&O3r6Yvn26@lK=^|EXF?!$T&|xMdxuo#PiSyjf%&p_eiA5y_%I4kGH~;r*)@()@;QLMy+9CK zFFHhSR#`}WX`vSqywx39BvTF7ZX+=#FabzuW2zcp_`~R)6?Syt>10~8sT!>(9y~I$ zq(y+si3e!*G2yJ5XmzY%`66NZ#EV=^+HwCUl1p_)`^YM>Yjc17U=rB^UeWk4r2#)U zpwhEt_&R;LMPjTq`fZVUgeQalW2%J&(Lz({8IsSAstLYov?L1Hn12B6??I=iKoa;0 z$&j0tB}TZ;VFxtz-&~7-x4I<};KRargqbgXC$dunXgST*ZTiRYewqAEmhK@N(X{!q znmt*fCn8mxrde|5z7ZQMl#+YVVbVo^vApIgR8l7YmdUQO-{E4hZuph(i+wZjY|8HR z(&Su(h^;J0P;-3RNXg%;NSX7PFu)ZY;=^DLbU=Klu!e-^Tqj6{qPX41QKMxp%W$BS9~c(HyibRUV@BTod4-jQDEt%44~G!6U3fNwb2 zw$>DbAXs+hYv4L{NvH>yb>>o}fMG_(lH`tI#$^^72u><-5ePiaNd0+MSGdFNRDX@( z^~}ofd9&T@&BD&~zFLQCp@7gSi%C~hV1?@EY4na4Eh)emT>(l36sPnmU6#Mke?XmF zXL(dSwB_c>4|Z`XcG#tk5bEyqeFk~6&mLvfMY+P{V@k!&LV#b)N1x*0gs4x8qGw8^ zsmVNiM5+2O2`W2Oi^Aj5BEOVq#wK-x$e4b4J~}6 zp3@&|JA|PMjTc<;r{FL(-6}fvwsl%~iNXq5{K;m9(HWUd6Tu7A(yE^ShR6{l_03J5 z1qhZg(_kCC1##Ot{qj`t(Ka~EQDCjNF;jW;?>fB$(P=-)rwXq4Oge}{^TF1Nqd%Ds zNYVHx^r;UfHMz><2Aok0t#digLdK!rQv|+FR^hG2Ka(e6A=pFik5cfeW z4qNyM38DpQAa@~mxjWF@wn?D6I7Z~=v-ZbZCQQ)4Pn4TFaaR%WV+D1vb)x{~}#^WGH(H5Mx)OXgwq zV!QMzZK1~-z1zuF5}62qIOaU@lfy1IA!%B;EY0uh5Wj89iQdVTP1l%cb=JbQeP42Zv z_eO|OqB~DS!@XvW^?=U;_e`Cpu{ViClcrk6X97aESqX8sPe%d2FMOf>7e=j*dx15C z?$()yLd~u(QZ~r?2i1C*`VULsWWC}8v-P$jTrCzk%Jy9c=h>N?49!hv^cQasw_pY- zAl5B#rb@obNjD@7#rjGd_{|w-T)^Tp+e;OE(|l ze6VPie|5#mfu)fEKW@B(avGynJJkLB6!5&>N^XGdHnRk}d#r~w3Hq7+0a=rB$Xy~i zsVsJ)Xwm;@lJm&=tYheVM;dKeXg?C>>7k@L?OGIVHMK~cIMbd-+1BMR8_6FORc%HG z_02QQ9Yz$)hApP)sW&i3sFrv|)w>&QH+F_sSQrO~m?!48Z4d^iq6fKm{Hr0yLAz8A z1K1XAvrbV;-XQ%0b{FFLwDIjOH0j1-#NAVRDE7lV1~!U$kfGkqVRY*lf~GV;0HWXM zUVL2E!iamJ`%E#9VOgVzod*6mkY-%S0%3tUCoXGv$Jx;uuQ9H{9Lur~2UT|cTF*cv zlr*HzUh}Z)ssLQL8r2x}dOI-uDco$xXFDeyu zgFNnJ#AZ6IwlOkfT0I}TGcWCJXp=8hq&g=ZP*tad&ePJ_K>vxYL!Ib8CmJS|=n4s-$mBDh ze^PpP*trNZet_$iMP2$y*$ZR|qZZ6Co80j zXe>8+zkVgyoByrIf_7LdnA-Jri&~VB(5SI5F&JbuXaIbzW#V&wI`r)MV#+33HpqAf z)pfOvPU4U$TZG{nJ?`_qT^!I-LXs+BtrH}<4#Vm=+n!jAW_eXt!qC^y61)c#KMC9? zPF?!~{^pN!gR9;Wk!?uN-rvDK8X!O0oI za_*Y13%~NLRgn-$NdUr-hZ_Dz=N|8+O7_nFBm!S?gr2qVt1;=rFI+QQ)R&N_NawZ%*%v{U1*61ge}5IpxUinD zSQC@fO?ob+JMXW^ADQd@3?4*X{gX?udMPfKU>%4v@ae4?+6lyi)=_-G-f&d#g(w-_ zgpXF`?xRZB(DwmC3waWXl_zl*CE^3@<9MuB(7-d{ zH*B{VUP?XZ$=+*1-pHK9Ub0c!gkf<=zyRG?0$N^^xRZcT?+wz%M}W<7!gzT}`~nvQpz5*AsO&q9xNcKQ&@~ z266@h60#xT*8A#@2D5S46VBbrz`|iI%aG|%J%Kh-^n~Nk8tx0hSHm|Bg_+r78pYAj zE2Dh>@7d5IPdLD1)*X~UMlqp29bN2~l@DLMTTfM#WRD}-e*TzydSymz_=Sj9!`mO{ zN%!E*c%2!^LL^V`z5WJdh`n6(07B|CM&Y77$~gG0-HOwO7@w<<%|*#;+(RX_J$e;6 zEVs+a8EX-D z@9W>SfAGkw9|+4dbypzfB#r5cc0khQ<-yS*S^$K-JIX|ykID8nU4NV^vFS46)y^lRj&Yn-%*M&z%GtawHzJ-t!10JD})Mgj+~ z=i_?CUsiLn6siWk45I>HwFYsp2MXVCL9LnZuG3n9xfcRx$6)m)ADJasZ*4EY;z~6U zp|ea}>RBC;^G|+B3;9yo2`Y5W`L0b|1K#x4qZ+P1TqZWxRmx|Bx&0l*aQ4P^4^#nZ zr0^+4H@ya>i62OBO+;6uUdB|_zHzm}d5(&`w6}{+&eo(hbKX$`oYj*0`L_u|-6iyucj}QSA~!2H}??o^U4~ zy&Yyw7{*@2z^DU3Aelt!tVUPSbKd>%kr5@myM_{tP5|q4%-xzrBPP>>(R83!A5nYc zGTc_T2Xavmc<|n=jkj?ycl91OHo|A`Qw$*We}D5b*rBXaDB}lrf=%Wl zW>8BfV1p8|9_{+G zTAaqpR7p%%qRq@)B2edYJ%F_J27ANgV>E_zb>@FhiikoF%EwZh3eV7&G*MifFSZGn zk@)%{p2%K?K8ws3E8WLDNm@42eza8*6BSB$S$LhIQo>47A|DZxJzy2bODvs*|6~>a z#pT*PyZ=luOtC*!b>uvW5QExGd!>H85rTf|@+kq-kG9%De=a+!>flnCcTaFYNW(c^ zWmYiYjcPiCA!+^tHVX-<*aYgzOJoIilQRhAgWV#y<$*fK8<;~JdGRTU6}lYjF)-fV z0!zFc&PAH}BgS!aB_EP69+y~m5dL=(2?Uf9Gf)_T0cczc*kJ?oS|MOI6|d7N*EGTK zi4>G)J4M=6R`_?~p)304!nXjMs*w=2b7 zz(1mYmxE@kFy0$TL9j=t=Chva$n?He{bLLqWsPgR7A>*?672bi2qa}lUE(xB3MfG+ zG0jqB6vA#y;uv8Um)QR0y^S(*MXsTCbH|A=|`qJ3uEEC zVO5D@wF}=epFWPtQ!PA+ThR_Qi|F8PodRFO1+)Y+uAnPg+QjurHI`p6qsuPO{BVUj zEf3}Is$5eATxU_4;H?GPN=vw2afPKDmPOp`G2>4o*t5BI^0EAnj@R^b) z<8pXAC?x6`fa|0*!VPQMd;&y#=#b36x!(GgJM$=;+u*!xC~-)V*1(VfW>9TtZ%fhF z-1x>XaFztUn4cvtJ6l2Z6nnXHPDNH7=BG4AM+c}$50o}1T- z7qUgFXJsGGK2+U(R7_xW=^RMQLZxe_V9D=rAK=7i$5re76F;i$rPKS?W(X1_q1*F` zhaXBi&{rI`&EZupDE^?8^2qhw*0$*zLQx7o-H`cmX9C+&SM9%p^idWyF6S?rVY-Ya zAj&nxZjdLv313HkOp2HNQ3FiqKlWEN*5t~R?t+D%qm{h8y%kA%$6Qte%kVWfFV-<3 zV#33l%~dT*iSs&k*Ff9^6QcPUQV8|Ffh+&2>AUU;dZD{XhW9|)<6U%A3t2OfrDop#zPc3JuQ`uH+h8V0vM5l5C(WX`w7^d7JhL z{BY|!&uV0JB%c1@2(P-B^^52UGD zUupi7;Vt(#&211QqStdy$z&&mfvq-jCOZ*2e<;%8@P;SN!1CA>4oR}U<5LlmP_+4{=NbyQ6KcL2f zRgO0H-2H+Ck+Euf>zOzJbndnnC!ie2k~BgYZ+b)^(myn1@AFgz>mUO0DpM@f#P3N2 zvn4Aoq7~~{Mb=rOiL0!#e2@yTafNyxl*6$BZ2|&DUcudq(bAdEsCR)td9k#hch-?Z zCN(!G?u+k zb0Fi!pc6Dn4bCY-4_?Mg^IA%XL)RFAGMx?xbC9MnWw{}XtCrylZRSZnu$TQ+hz zhhdsxXmqF`cHuoFm22?+iJU;2Gg1S{X)5Beq{q|V!_~nkcEP*hrk@WMue@6nPg=4<`8F@(=9k%on zIPbhE<;@1}o;rIN>Z_IZ=a2?rz2Qb?Kz)T$U}fR^woa8b0$F8yIrlc0FsctGi)>=2 zBGh%}>A1{Ju9~RqJ~Cx?!^Rn_0<{bhT{R_HQA$$zx?zPGHH6mr(@I^Lx2VPV4(#2~ zcJbA{`{j*p63MV_&%yW#bg=F;vdLxeA{odfu^Tcl%?`=1ar|g)+zWoF>&>P7)Cr5O zZHF?BxdcEn8u44#dj>GrK`5$S9_EM|v;jiJd_fa#-0zt>JUn(?niNiGy zov6-os;`sDP!)0xPNZTC_M4-jLO%OfmCQ=EitDt~UZ+gwPwF1KVm8$oj|o;Ty8w*T zn*ylWl!$4_b;Nv&L-w0B&~{ zJcsoVo-tqNo}jW4Mm6v2!Y}-3^xU%5!7hiRhxyj)HxJrXn^)2%WA%dJjT%U}v-W88C04n(6BUV(O7DjfSm%gODTaqJOmyA(;NI!PtmM3f-$X@l>z?*}2O`t4Z+zCK*c+pLDl0JFpr?bm!mLsK-ZJG^1H3 zNP4-u!gj_WWn6Gv;D-NS`F|b>0_2j}{F+BJsbDOrF|wWo(@p^Pz29-r-1P>7*H|lT zXdXr2xnvpj$an0FIod{rBf)rE%Z1sDp`-xrjDCrB+vN!eHJVr2@z4pAT+P;|jCNw?VoPdVo#jB6g3D?bhL?Cs>|8|BE(n7lz7Sq) z%&VNlL`RlMphLy9kY3MydDHZR5MvRhfGJ>vr|G1AXz6ift)ozhMo(KTsJeD{ zml>q>*eBv}0QVKUldwf-=~u}mun~#u@OeCwRP~Tg!wLR`CHK5Su!FU!bu+>9`0 z01eJg-PV?#*wO{#DPPM5pwvjSn~^kVV0_e@q9gRiocJEv$m-X*1wb%%#_pb>K}G-T zXxYFlBhp%|#cVE+p_SsZt87xK;wOkvkS2Aj!L0pn-u)nB*>V|VM(w+2vvX&1&lC28J47sJt4b5dk154U-hYwj zez&n9lihLP4X(MUXeuH+Igj$a5ou7Y4S`QZEF@tyqYCE`CvtH}$W`5nWf#Ym##ks! zwIT^Hxv>HnqJdtbx)m!R70AYk2*tG!NA= zB8h3D2W{NDFu?gNp=WW_jvj`@e_7Jt&P8aR8~Ny>U!(TLv}`LRLc!Ta9IqKKG3&&P z5+0f&2U06^CJ$69METo>ljDHQWF+oCns){ok|$y^rj8cIzKU#dCP;+ZLzXkE!Vn3s zht?YyB*{mIV$$uR%3Yu~Y{$Wh0K)qRHvHS?Q`9k^%kLvE>DZv;?|j zeX52#?80ic^Qe}KRN-oSF_Kb;hhFzseu6nUL*=<!n#9X6};CLp7oajKB^5LmyNpv^d-~jJ!^E@zdVX#;t2-{NSyOeFkq= z9|VPc7kmGLj34Dg@mZWtDO`lhE~9IhF^p0cg-;+|n)RtvQ5y6*pZZy&$ck1>v(Q^_ zAJ_^Ied7Esjnx(=g+zV%sVrBhV~fQho)3o-_pTOW3`~lXjT((2Mxg%8egYS?-RBi=1mLClH zLR}sWGttyh9+kV}XW)qA3$NdFLV!N-!xH@L2$!qMF1P2SIN3HBsZ^hj(-}aGq6m+_ zFbi3g{ysk;qBHJKvJ=g%79-%=SS#wYldj9-Omecx zV)MJB+2Q`w6e~3rpBXd&OPq4*a&Tgd9Rg$^vh3BpLq&U!CjKP30Joa$ z>Kh#>wNrW)IehdM>cebPt!8&%Hf??T<@V)+?C7bdVRE;@J(aU|O~ZTOKu=%8UmD!u zn5;+6hTqBhND>%6=YqIv7`L_k8a%q4^4VC~&nm)lrs8SICSM%yRE4#O#aDYSdg?0u zU?0%Kfc3O3-0PJAis;u1+sT39f*E}}6YO!ekd#53a>AZ;l;2#+L(WDa%IXktrH^sJ zX39gbI}8G5r)UG;zz3J~BkWA|nclSMU>P5U^)fbD88k5&jCCqrkrJdV=i|=^TVGQ> z*(d84?V!qozhF#VJ!l?R=vs(T4?LJCGsOe^PUnkS$OjR2Od6zA-=5x)qz;A6+!l%4^JX#caNRw8rpepFdyZ6W0eP%>?%iKQ`BFFJuVwn6fZfKo$s~ zQLSKHxE;Nf>xO~fz<6<|y zTe2`-q?O1i>Cs@JHW#3BQOAEyhGkTH) zf@~79j+~7$ZbE>WKw= zGGc=?0AkBp0zi6qhMNI^8uc)J&(=MyeJ8;>+=a7m@{3=%i}|5OIoWK)ZRYnx))o&w zCHgFlbxi_yL=K9Lk2Zou-LZ$oM)(P8IN9Q}A(?0U)?<4?m$i-b^iy1}p7Pc7c=TPf z0Od-85@7c-5SK%H545CS z{W-s{kjAaPVHN!{TA?YZtGILuwC>7aV4kCF=);(+ zz`%p?L1?8$lgmhB#2IWLw5s=jP?ZHOguEouG)fKv{21>^t>5?VV1@_g;M}!L<$^Uf zTvPj(QI{z+hXnC#@_SgvA7oZ|9HOx~UB5Yj(n5%-->(1JlzAMtZK%KDviW0-IHzLw zFL1HG)#vxKRPljb9FBefqhx8Z*|o)jyLHV^eX`z=YxyEQtO?`p_gL=&e}m9`>B|9W5hXO$LXbekoIM50rtX zL1jem6GO&%3nEcl&y| zI55PqsmR`|P*SFO%|rkyYPXlGO#^AqiiGALMD9QS;3_oRD=+s#&yQ`D!3gza0riIw zf3dZ~%|GsGD|s_>Xr${Xna)T_W+bFquvzdYq`M6DBonXPM@;TIFGUwB6lzi7jGVFO77Z^rQc=7o6ZO*|ladG@?C^NC(C zLE>WG$5UcM@nf@VUGJrT;Occ({rA)3ZG~Dri@WOfVYa*{=j?gOR%=dvdo%maE$795 z%mW$@2j2vK$-|$%k|t!T0W^=|vd*6b+V@70pLzj-f!-u`^4e_?hjXDlVsHI>rA^5D zP5PE&eLeCMKNRpxBo2Ad2zt^&@wEtkb{ANSVzP+!r?~b_;R9_nJOlpyAAcj^8(Mq$ b$N&6WR2K2cu7CXPZ~yy$r<>)ckhKv2wl0Cs diff --git a/js/667.bbd60d43.js b/js/667.bbd60d43.js new file mode 100644 index 0000000..38ac5ca --- /dev/null +++ b/js/667.bbd60d43.js @@ -0,0 +1,2 @@ +(self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[667],{1114:function(e,t,i){"use strict";function s(e){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},s(e)}function n(e,t){if("object"!=s(e)||!e)return e;var i=e[Symbol.toPrimitive];if(void 0!==i){var n=i.call(e,t||"default");if("object"!=s(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}function a(e){var t=n(e,"string");return"symbol"==s(t)?t:t+""}function r(e,t,i){return(t=a(t))in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}i.d(t,{A:function(){return r}})},1583:function(e,t,i){var s,n,a;i(4114),function(i,r){n=[],s=r,a="function"===typeof s?s.apply(t,n):s,void 0===a||(e.exports=a)}(0,function(){var e=function(){},t={},i={},s={};function n(e,t){e=e.push?e:[e];var n,a,r,o,l=[],c=e.length,h=c;n=function(e,i){i.length&&l.push(e),h--,h||t(l)};while(c--)a=e[c],r=i[a],r?n(a,r):(o=s[a]=s[a]||[],o.push(n))}function a(e,t){if(e){var n=s[e];if(i[e]=t,n)while(n.length)n[0](e,t),n.splice(0,1)}}function r(t,i){t.call&&(t={success:t}),i.length?(t.error||e)(i):(t.success||e)(t)}function o(t,i,s,n){var a,r,l,c=document,h=s.async,d=(s.numRetries||0)+1,u=s.before||e,p=t.replace(/[\?|#].*$/,""),m=t.replace(/^(css|img|module|nomodule)!/,"");if(n=n||0,/(^css!|\.css$)/.test(p))l=c.createElement("link"),l.rel="stylesheet",l.href=m,a="hideFocus"in l,a&&l.relList&&(a=0,l.rel="preload",l.as="style");else if(/(^img!|\.(png|gif|jpg|svg|webp)$)/.test(p))l=c.createElement("img"),l.src=m;else if(l=c.createElement("script"),l.src=m,l.async=void 0===h||h,r="noModule"in l,/^module!/.test(p)){if(!r)return i(t,"l");l.type="module"}else if(/^nomodule!/.test(p)&&r)return i(t,"l");l.onload=l.onerror=l.onbeforeload=function(e){var r=e.type[0];if(a)try{l.sheet.cssText.length||(r="e")}catch(c){18!=c.code&&(r="e")}if("e"==r){if(n+=1,nt){var i=function(e){var t="".concat(e).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);return t?Math.max(0,(t[1]?t[1].length:0)-(t[2]?+t[2]:0)):0}(t);return parseFloat(e.toFixed(i))}return Math.round(e/t)*t}return function(){function t(e,i){(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")})(this,t),f(e)?this.element=e:p(e)&&(this.element=document.querySelector(e)),f(this.element)&&b(this.element.rangeTouch)&&(this.config=s({},n,{},i),this.init())}return i=t,o=[{key:"setup",value:function(e){var i=1(i=100/l.width*(n.clientX-l.left))?i=0:100i?i-=(100-2*i)*c:50u.handleToggleClick&&u.handleToggleClick(...e))},[(0,s.bF)(n.eB,{name:"icon-fade",mode:"out-in"},{default:(0,s.k6)(()=>[d.isAuto?((0,s.uX)(),(0,s.Wv)(p,{key:"auto-mode",icon:"circle-half-stroke",class:"auto-icon",style:{"font-size":"1.5em",color:"var(--theme-toggle-color)"}})):((0,s.uX)(),(0,s.CE)("svg",{key:"sun-moon",class:(0,a.C4)(["theme_toggle_svg",{dark:d.isDark}]),width:"1.5em",height:"1.5em",viewBox:"0 0 24 24",fill:"none","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",stroke:"currentColor"},[(0,s.Lk)("mask",r,[t[1]||(t[1]=(0,s.Lk)("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:"white"},null,-1)),(0,s.Lk)("circle",{class:"theme_toggle_circle1",fill:"black",cx:d.isDark?"50%":"100%",cy:d.isDark?"23%":"0%",r:d.isDark?"9":"5"},null,8,o)]),(0,s.Lk)("circle",{class:"theme_toggle_circle2",cx:"12",cy:"12",r:d.isDark?"9":"5",mask:"url(#themeMask)"},null,8,l),(0,s.Lk)("g",{class:"theme_toggle_g",stroke:"currentColor",opacity:d.isDark?0:1},[...t[2]||(t[2]=[(0,s.Lk)("line",{x1:"12",y1:"1",x2:"12",y2:"3"},null,-1),(0,s.Lk)("line",{x1:"12",y1:"21",x2:"12",y2:"23"},null,-1),(0,s.Lk)("line",{x1:"4.22",y1:"4.22",x2:"5.64",y2:"5.64"},null,-1),(0,s.Lk)("line",{x1:"18.36",y1:"18.36",x2:"19.78",y2:"19.78"},null,-1),(0,s.Lk)("line",{x1:"1",y1:"12",x2:"3",y2:"12"},null,-1),(0,s.Lk)("line",{x1:"21",y1:"12",x2:"23",y2:"12"},null,-1),(0,s.Lk)("line",{x1:"4.22",y1:"19.78",x2:"5.64",y2:"18.36"},null,-1),(0,s.Lk)("line",{x1:"18.36",y1:"5.64",x2:"19.78",y2:"4.22"},null,-1)])],8,c)],2))]),_:1})])}var d={name:"ToggleDark",data(){return{isDark:this.$store.getters.useDarkMode,isAuto:!this.$store.getters.cusDarkMode}},methods:{handleToggleClick(){this.isAuto?(this.isDark=!1,this.isAuto=!1,this.$store.commit("setCusDarkMode",!0),this.$store.commit("setUseDarkMode",!1)):this.isDark?(this.isAuto=!0,this.$store.commit("setCusDarkMode",!1)):(this.isDark=!0,this.$store.commit("setCusDarkMode",!0),this.$store.commit("setUseDarkMode",!0))}}},u=i(1241);const p=(0,u.A)(d,[["render",h],["__scopeId","data-v-466b2b5c"]]);var m=p},9667:function(e,t,i){"use strict";i.r(t),i.d(t,{default:function(){return as}});var s=i(6768),n=i(5130),a=i(4232);const r=["src"],o=["src"],l={key:2,class:"video-placeholder"},c={class:"audio-cover"},h=["src"],d={key:1,class:"audio-icon-large",viewBox:"0 0 24 24",fill:"currentColor"},u={class:"audio-info"},p={class:"audio-title"},m={key:0,class:"audio-artist"},g=["src"],f={key:4,class:"audio-placeholder"},y={class:"audio-name"};function b(e,t,i,b,v,w){return(0,s.uX)(),(0,s.CE)("div",{class:"tm-viewport",ref:"viewport",onPointerdown:t[3]||(t[3]=(...e)=>w.onPointerDown&&w.onPointerDown(...e)),onPointermove:t[4]||(t[4]=(...e)=>w.onPointerMove&&w.onPointerMove(...e)),onPointerup:t[5]||(t[5]=(...e)=>w.onPointerUp&&w.onPointerUp(...e)),onPointercancel:t[6]||(t[6]=(...e)=>w.onPointerUp&&w.onPointerUp(...e)),onDblclick:t[7]||(t[7]=(0,n.D$)((...e)=>w.onDblClick&&w.onDblClick(...e),["prevent"]))},[i.isImage?((0,s.uX)(),(0,s.CE)("img",{key:0,class:"tm-media",src:i.src,draggable:"false",style:(0,a.Tr)(w.mediaStyle),onLoad:t[0]||(t[0]=(...e)=>w.onLoad&&w.onLoad(...e))},null,44,r)):i.isVideo&&i.isActive?((0,s.uX)(),(0,s.CE)("div",{key:1,class:"tm-video-wrap",onPointerdown:t[1]||(t[1]=(0,n.D$)(()=>{},["stop"]))},[(0,s.Lk)("video",{ref:"videoEl",class:"plyr-video",src:i.src,playsinline:""},null,8,o)],32)):i.isVideo?((0,s.uX)(),(0,s.CE)("div",l,[...t[8]||(t[8]=[(0,s.Lk)("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[(0,s.Lk)("path",{d:"M8 5v14l11-7z"})],-1)])])):i.isAudio&&i.isActive?((0,s.uX)(),(0,s.CE)("div",{key:3,class:"tm-audio-wrap",onPointerdown:t[2]||(t[2]=(0,n.D$)(()=>{},["stop"]))},[(0,s.Lk)("div",c,[v.audioCover?((0,s.uX)(),(0,s.CE)("img",{key:0,src:v.audioCover,class:"cover-img"},null,8,h)):((0,s.uX)(),(0,s.CE)("svg",d,[...t[9]||(t[9]=[(0,s.Lk)("path",{d:"M12 3v10.55c-.59-.34-1.27-.55-2-.55-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4V7h4V3h-6z"},null,-1)])]))]),(0,s.Lk)("div",u,[(0,s.Lk)("div",p,(0,a.v_)(v.audioTitle),1),v.audioArtist?((0,s.uX)(),(0,s.CE)("div",m,(0,a.v_)(v.audioArtist),1)):(0,s.Q3)("",!0)]),(0,s.Lk)("audio",{ref:"audioEl",class:"plyr-audio",src:i.src},null,8,g)],32)):i.isAudio?((0,s.uX)(),(0,s.CE)("div",f,[t[10]||(t[10]=(0,s.Lk)("svg",{class:"audio-icon-large",viewBox:"0 0 24 24",fill:"currentColor"},[(0,s.Lk)("path",{d:"M12 3v10.55c-.59-.34-1.27-.55-2-.55-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4V7h4V3h-6z"})],-1)),(0,s.Lk)("span",y,(0,a.v_)(v.audioTitle),1)])):(0,s.Q3)("",!0)],544)}i(6573),i(8100),i(7936),i(8111),i(7588),i(9577),i(1549),i(9797),i(9631),i(5623),i(4603),i(7566),i(8721);var v=i(1114),w=(i(2489),i(1701),i(8335),i(1148),i(116),i(4114),i(3579),i(3975));const k=e=>null!==e&&"undefined"!==typeof e?e.constructor:null,T=(e,t)=>Boolean(e&&t&&e instanceof t),C=e=>null===e||"undefined"===typeof e,A=e=>k(e)===Object,S=e=>k(e)===Number&&!Number.isNaN(e),x=e=>k(e)===String,E=e=>k(e)===Boolean,M=e=>"function"===typeof e,L=e=>Array.isArray(e),P=e=>T(e,WeakMap),I=e=>T(e,NodeList),$=e=>k(e)===Text,N=e=>T(e,Event),D=e=>T(e,KeyboardEvent),F=e=>T(e,window.TextTrackCue)||T(e,window.VTTCue),_=e=>T(e,TextTrack)||!C(e)&&x(e.kind),R=e=>T(e,Promise)&&M(e.then);function O(e){return null!==e&&"object"===typeof e&&1===e.nodeType&&"object"===typeof e.style&&"object"===typeof e.ownerDocument}function H(e){return C(e)||(x(e)||L(e)||I(e))&&!e.length||A(e)&&!Object.keys(e).length}function V(e){if(T(e,window.URL))return!0;if(!x(e))return!1;let t=e;e.startsWith("http://")&&e.startsWith("https://")||(t=`http://${e}`);try{return!H(new URL(t).hostname)}catch{return!1}}var j={nullOrUndefined:C,object:A,number:S,string:x,boolean:E,function:M,array:L,weakMap:P,nodeList:I,element:O,textNode:$,event:N,keyboardEvent:D,cue:F,track:_,promise:R,url:V,empty:H};const q=(()=>{const e=document.createElement("span"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},i=Object.keys(t).find(t=>void 0!==e.style[t]);return!!j.string(i)&&t[i]})();function B(e,t){setTimeout(()=>{try{e.hidden=!0,e.offsetHeight,e.hidden=!1}catch{}},t)}i(8237),i(3110);function U(e){return JSON.parse(JSON.stringify(e))}function X(e,t){return t.split(".").reduce((e,t)=>e&&e[t],e)}function z(e={},...t){if(!t.length)return e;const i=t.shift();return j.object(i)?(Object.keys(i).forEach(t=>{j.object(i[t])?(Object.keys(e).includes(t)||Object.assign(e,{[t]:{}}),z(e[t],i[t])):Object.assign(e,{[t]:i[t]})}),z(e,...t)):e}function W(e,t){const i=e.length?e:[e];Array.from(i).reverse().forEach((e,i)=>{const s=i>0?t.cloneNode(!0):t,n=e.parentNode,a=e.nextSibling;s.appendChild(e),a?n.insertBefore(s,a):n.appendChild(s)})}function K(e,t){j.element(e)&&!j.empty(t)&&Object.entries(t).filter(([,e])=>!j.nullOrUndefined(e)).forEach(([t,i])=>e.setAttribute(t,i))}function Y(e,t,i){const s=document.createElement(e);return j.object(t)&&K(s,t),j.string(i)&&(s.textContent=i),s}function Q(e,t){j.element(e)&&j.element(t)&&t.parentNode.insertBefore(e,t.nextSibling)}function J(e,t,i,s){j.element(t)&&t.appendChild(Y(e,i,s))}function G(e){j.nodeList(e)||j.array(e)?Array.from(e).forEach(G):j.element(e)&&j.element(e.parentNode)&&e.parentNode.removeChild(e)}function Z(e){if(!j.element(e))return;let{length:t}=e.childNodes;while(t>0)e.removeChild(e.lastChild),t-=1}function ee(e,t){return j.element(t)&&j.element(t.parentNode)&&j.element(e)?(t.parentNode.replaceChild(e,t),e):null}function te(e,t){if(!j.string(e)||j.empty(e))return{};const i={},s=z({},t);return e.split(",").forEach(e=>{const t=e.trim(),n=t.replace(".",""),a=t.replace(/[[\]]/g,""),r=a.split("="),[o]=r,l=r.length>1?r[1].replace(/["']/g,""):"",c=t.charAt(0);switch(c){case".":j.string(s.class)?i.class=`${s.class} ${n}`:i.class=n;break;case"#":i.id=t.replace("#","");break;case"[":i[o]=l;break;default:break}}),z(s,i)}function ie(e,t){if(!j.element(e))return;let i=t;j.boolean(i)||(i=!e.hidden),e.hidden=i}function se(e,t,i){if(j.nodeList(e))return Array.from(e).map(e=>se(e,t,i));if(j.element(e)){let s="toggle";return"undefined"!==typeof i&&(s=i?"add":"remove"),e.classList[s](t),e.classList.contains(t)}return!1}function ne(e,t){return j.element(e)&&e.classList.contains(t)}function ae(e,t){const{prototype:i}=Element;function s(){return Array.from(document.querySelectorAll(t)).includes(this)}const n=i.matches||i.webkitMatchesSelector||i.mozMatchesSelector||i.msMatchesSelector||s;return n.call(e,t)}function re(e,t){const{prototype:i}=Element;function s(){let e=this;do{if(ae.matches(e,t))return e;e=e.parentElement||e.parentNode}while(null!==e&&1===e.nodeType);return null}const n=i.closest||s;return n.call(e,t)}function oe(e){return this.elements.container.querySelectorAll(e)}function le(e){return this.elements.container.querySelector(e)}function ce(e=null,t=!1){j.element(e)&&e.focus({preventScroll:!0,focusVisible:t})}const he={"audio/ogg":"vorbis","audio/wav":"1","video/webm":"vp8, vorbis","video/mp4":"avc1.42E01E, mp4a.40.2","video/ogg":"theora"},de={audio:"canPlayType"in document.createElement("audio"),video:"canPlayType"in document.createElement("video"),check(e,t){const i=de[e]||"html5"!==t,s=i&&de.rangeInput;return{api:i,ui:s}},pip:(()=>document.pictureInPictureEnabled&&!Y("video").disablePictureInPicture)(),airplay:j.function(window.WebKitPlaybackTargetAvailabilityEvent),playsinline:"playsInline"in document.createElement("video"),mime(e){if(j.empty(e))return!1;const[t]=e.split("/");let i=e;if(!this.isHTML5||t!==this.type)return!1;Object.keys(he).includes(i)&&(i+=`; codecs="${he[e]}"`);try{return Boolean(i&&this.media.canPlayType(i).replace(/no/,""))}catch{return!1}},textTracks:"textTracks"in document.createElement("video"),rangeInput:(()=>{const e=document.createElement("input");return e.type="range","range"===e.type})(),touch:"ontouchstart"in document.documentElement,transitions:!1!==q,reducedMotion:"matchMedia"in window&&window.matchMedia("(prefers-reduced-motion)").matches};var ue=de;const pe=(()=>{let e=!1;try{const t=Object.defineProperty({},"passive",{get(){return e=!0,null}});window.addEventListener("test",null,t),window.removeEventListener("test",null,t)}catch{}return e})();function me(e,t,i,s=!1,n=!0,a=!1){if(!e||!("addEventListener"in e)||j.empty(t)||!j.function(i))return;const r=t.split(" ");let o=a;pe&&(o={passive:n,capture:a}),r.forEach(t=>{this&&this.eventListeners&&s&&this.eventListeners.push({element:e,type:t,callback:i,options:o}),e[s?"addEventListener":"removeEventListener"](t,i,o)})}function ge(e,t="",i,s=!0,n=!1){me.call(this,e,t,i,!0,s,n)}function fe(e,t="",i,s=!0,n=!1){me.call(this,e,t,i,!1,s,n)}function ye(e,t="",i,s=!0,n=!1){const a=(...r)=>{fe(e,t,a,s,n),i.apply(this,r)};me.call(this,e,t,a,!0,s,n)}function be(e,t="",i=!1,s={}){if(!j.element(e)||j.empty(t))return;const n=new CustomEvent(t,{bubbles:i,detail:{...s,plyr:this}});e.dispatchEvent(n)}function ve(){this&&this.eventListeners&&(this.eventListeners.forEach(e=>{const{element:t,type:i,callback:s,options:n}=e;t.removeEventListener(i,s,n)}),this.eventListeners=[])}function we(){return new Promise(e=>this.ready?setTimeout(e,0):ge.call(this,this.elements.container,"ready",e)).then(()=>{})}function ke(e){j.promise(e)&&e.then(null,()=>{})}function Te(e){return j.array(e)?e.filter((t,i)=>e.indexOf(t)===i):e}function Ce(e,t){return j.array(e)&&e.length?e.reduce((e,i)=>Math.abs(i-t)({...e,[t/i]:[t,i]}),{});function xe(e){if(!j.array(e)&&(!j.string(e)||!e.includes(":")))return!1;const t=j.array(e)?e:e.split(":");return t.map(Number).every(j.number)}function Ee(e){if(!j.array(e)||!e.every(j.number))return null;const[t,i]=e,s=(e,t)=>0===t?e:s(t,e%t),n=s(t,i);return[t/n,i/n]}function Me(e){const t=e=>xe(e)?e.split(":").map(Number):null;let i=t(e);if(null===i&&(i=t(this.config.ratio)),null===i&&!j.empty(this.embed)&&j.array(this.embed.ratio)&&({ratio:i}=this.embed),null===i&&this.isHTML5){const{videoWidth:e,videoHeight:t}=this.media;i=[e,t]}return Ee(i)}function Le(e){if(!this.isVideo)return{};const{wrapper:t}=this.elements,i=Me.call(this,e);if(!j.array(i))return{};const[s,n]=Ee(i),a=Ae(`aspect-ratio: ${s}/${n}`),r=100/s*n;if(a?t.style.aspectRatio=`${s}/${n}`:t.style.paddingBottom=`${r}%`,this.isVimeo&&!this.config.vimeo.premium&&this.supported.ui){const e=100/this.media.offsetWidth*Number.parseInt(window.getComputedStyle(this.media).paddingBottom,10),i=(e-r)/(e/50);this.fullscreen.active?t.style.paddingBottom=null:this.media.style.transform=`translateY(-${i}%)`}else this.isHTML5&&t.classList.add(this.config.classNames.videoFixedRatio);return{padding:r,ratio:i}}function Pe(e,t,i=.05){const s=e/t,n=Ce(Object.keys(Se),s);return Math.abs(n-s)<=i?Se[n]:[e,t]}function Ie(){const e=Math.max(document.documentElement.clientWidth||0,window.innerWidth||0),t=Math.max(document.documentElement.clientHeight||0,window.innerHeight||0);return[e,t]}const $e={getSources(){if(!this.isHTML5)return[];const e=Array.from(this.media.querySelectorAll("source"));return e.filter(e=>{const t=e.getAttribute("type");return!!j.empty(t)||ue.mime.call(this,t)})},getQualityOptions(){return this.config.quality.forced?this.config.quality.options:$e.getSources.call(this).map(e=>Number(e.getAttribute("size"))).filter(Boolean)},setup(){if(!this.isHTML5)return;const e=this;e.options.speed=e.config.speed.options,j.empty(this.config.ratio)||Le.call(e),Object.defineProperty(e.media,"quality",{get(){const t=$e.getSources.call(e),i=t.find(t=>t.getAttribute("src")===e.source);return i&&Number(i.getAttribute("size"))},set(t){if(e.quality!==t){if(e.config.quality.forced&&j.function(e.config.quality.onChange))e.config.quality.onChange(t);else{const i=$e.getSources.call(e),s=i.find(e=>Number(e.getAttribute("size"))===t);if(!s)return;const{currentTime:n,paused:a,preload:r,readyState:o,playbackRate:l}=e.media;e.media.src=s.getAttribute("src"),("none"!==r||o)&&(e.once("loadedmetadata",()=>{e.speed=l,e.currentTime=n,a||ke(e.play())}),e.media.load())}be.call(e,e.media,"qualitychange",!1,{quality:t})}}})},cancelRequests(){this.isHTML5&&(G($e.getSources.call(this)),this.media.setAttribute("src",this.config.blankVideo),this.media.load(),this.debug.log("Cancelled network requests"))}};var Ne=$e;const De=Boolean(window.document.documentMode),Fe=/Edge/.test(navigator.userAgent),_e="WebkitAppearance"in document.documentElement.style&&!/Edge/.test(navigator.userAgent),Re=/iPhone|iPod/i.test(navigator.userAgent)&&navigator.maxTouchPoints>1,Oe="MacIntel"===navigator.platform&&navigator.maxTouchPoints>1,He=/iPad|iPhone|iPod/i.test(navigator.userAgent)&&navigator.maxTouchPoints>1;var Ve={isIE:De,isEdge:Fe,isWebKit:_e,isIPhone:Re,isIPadOS:Oe,isIos:He};function je(e){return`${e}-${Math.floor(1e4*Math.random())}`}function qe(e,...t){return j.empty(e)?e:e.toString().replace(/\{(\d+)\}/g,(e,i)=>t[i].toString())}function Be(e,t){return 0===e||0===t||Number.isNaN(e)||Number.isNaN(t)?0:(e/t*100).toFixed(2)}function Ue(e="",t="",i=""){return e.replace(new RegExp(t.toString().replace(/([.*+?^=!:${}()|[\]/\\])/g,"\\$1"),"g"),i.toString())}function Xe(e=""){return e.toString().replace(/\w\S*/g,e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase())}function ze(e=""){let t=e.toString();return t=Ue(t,"-"," "),t=Ue(t,"_"," "),t=Xe(t),Ue(t," ","")}function We(e=""){let t=e.toString();return t=ze(t),t.charAt(0).toLowerCase()+t.slice(1)}function Ke(e){const t=document.createDocumentFragment(),i=document.createElement("div");return t.appendChild(i),i.innerHTML=e,t.firstChild.textContent}function Ye(e){const t=document.createElement("div");return t.appendChild(e),t.innerHTML}const Qe={pip:"PIP",airplay:"AirPlay",html5:"HTML5",vimeo:"Vimeo",youtube:"YouTube"},Je={get(e="",t={}){if(j.empty(e)||j.empty(t))return"";let i=X(t.i18n,e);if(j.empty(i))return Object.keys(Qe).includes(e)?Qe[e]:"";const s={"{seektime}":t.seekTime,"{title}":t.title};return Object.entries(s).forEach(([e,t])=>{i=Ue(i,e,t)}),i}};var Ge=Je;class Ze{constructor(e){(0,v.A)(this,"get",e=>{if(!Ze.supported||!this.enabled)return null;const t=window.localStorage.getItem(this.key);if(j.empty(t))return null;const i=JSON.parse(t);return j.string(e)&&e.length?i[e]:i}),(0,v.A)(this,"set",e=>{if(!Ze.supported||!this.enabled)return;if(!j.object(e))return;let t=this.get();j.empty(t)&&(t={}),z(t,e);try{window.localStorage.setItem(this.key,JSON.stringify(t))}catch{}}),this.enabled=e.config.storage.enabled,this.key=e.config.storage.key}static get supported(){try{if(!("localStorage"in window))return!1;const e="___test";return window.localStorage.setItem(e,e),window.localStorage.removeItem(e),!0}catch{return!1}}}var et=Ze;function tt(e,t="text",i=!1){return new Promise((s,n)=>{try{const n=new XMLHttpRequest;if(!("withCredentials"in n))return;i&&(n.withCredentials=!0),n.addEventListener("load",()=>{if("text"===t)try{s(JSON.parse(n.responseText))}catch{s(n.responseText)}else s(n.response)}),n.addEventListener("error",()=>{throw new Error(n.status)}),n.open("GET",e,!0),n.responseType=t,n.send()}catch(a){n(a)}})}function it(e,t){if(!j.string(e))return;const i="cache",s=j.string(t);let n=!1;const a=()=>null!==document.getElementById(t),r=(e,t)=>{e.innerHTML=t,s&&a()||document.body.insertAdjacentElement("afterbegin",e)};if(!s||!a()){const a=et.supported,o=document.createElement("div");if(o.setAttribute("hidden",""),s&&o.setAttribute("id",t),a){const e=window.localStorage.getItem(`${i}-${t}`);if(n=null!==e,n){const t=JSON.parse(e);r(o,t.content)}}tt(e).then(e=>{if(!j.empty(e)){if(a)try{window.localStorage.setItem(`${i}-${t}`,JSON.stringify({content:e}))}catch{}r(o,e)}}).catch(()=>{})}}const st=e=>Math.trunc(e/60/60%60,10),nt=e=>Math.trunc(e/60%60,10),at=e=>Math.trunc(e%60,10);function rt(e=0,t=!1,i=!1){if(!j.number(e))return rt(void 0,t,i);const s=e=>`0${e}`.slice(-2);let n=st(e);const a=nt(e),r=at(e);return n=t||n>0?`${n}:`:"",`${i&&e>0?"-":""}${n}${s(a)}:${s(r)}`}const ot={getIconUrl(){const e=new URL(this.config.iconUrl,window.location),t=window.location.host?window.location.host:window.top.location.host,i=e.host!==t||Ve.isIE&&!window.svg4everybody;return{url:this.config.iconUrl,cors:i}},findElements(){try{return this.elements.controls=le.call(this,this.config.selectors.controls.wrapper),this.elements.buttons={play:oe.call(this,this.config.selectors.buttons.play),pause:le.call(this,this.config.selectors.buttons.pause),restart:le.call(this,this.config.selectors.buttons.restart),rewind:le.call(this,this.config.selectors.buttons.rewind),fastForward:le.call(this,this.config.selectors.buttons.fastForward),mute:le.call(this,this.config.selectors.buttons.mute),pip:le.call(this,this.config.selectors.buttons.pip),airplay:le.call(this,this.config.selectors.buttons.airplay),settings:le.call(this,this.config.selectors.buttons.settings),captions:le.call(this,this.config.selectors.buttons.captions),fullscreen:le.call(this,this.config.selectors.buttons.fullscreen)},this.elements.progress=le.call(this,this.config.selectors.progress),this.elements.inputs={seek:le.call(this,this.config.selectors.inputs.seek),volume:le.call(this,this.config.selectors.inputs.volume)},this.elements.display={buffer:le.call(this,this.config.selectors.display.buffer),currentTime:le.call(this,this.config.selectors.display.currentTime),duration:le.call(this,this.config.selectors.display.duration)},j.element(this.elements.progress)&&(this.elements.display.seekTooltip=this.elements.progress.querySelector(`.${this.config.classNames.tooltip}`)),!0}catch(e){return this.debug.warn("It looks like there is a problem with your custom controls HTML",e),this.toggleNativeControls(!0),!1}},createIcon(e,t){const i="http://www.w3.org/2000/svg",s=ot.getIconUrl.call(this),n=`${s.cors?"":s.url}#${this.config.iconPrefix}`,a=document.createElementNS(i,"svg");K(a,z(t,{"aria-hidden":"true",focusable:"false"}));const r=document.createElementNS(i,"use"),o=`${n}-${e}`;return"href"in r&&r.setAttributeNS("http://www.w3.org/1999/xlink","href",o),r.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",o),a.appendChild(r),a},createLabel(e,t={}){const i=Ge.get(e,this.config),s={...t,class:[t.class,this.config.classNames.hidden].filter(Boolean).join(" ")};return Y("span",s,i)},createBadge(e){if(j.empty(e))return null;const t=Y("span",{class:this.config.classNames.menu.value});return t.appendChild(Y("span",{class:this.config.classNames.menu.badge},e)),t},createButton(e,t){const i=z({},t);let s=We(e);const n={element:"button",toggle:!1,label:null,icon:null,labelPressed:null,iconPressed:null};switch(["element","icon","label"].forEach(e=>{Object.keys(i).includes(e)&&(n[e]=i[e],delete i[e])}),"button"!==n.element||Object.keys(i).includes("type")||(i.type="button"),Object.keys(i).includes("class")?i.class.split(" ").includes(this.config.classNames.control)||z(i,{class:`${i.class} ${this.config.classNames.control}`}):i.class=this.config.classNames.control,e){case"play":n.toggle=!0,n.label="play",n.labelPressed="pause",n.icon="play",n.iconPressed="pause";break;case"mute":n.toggle=!0,n.label="mute",n.labelPressed="unmute",n.icon="volume",n.iconPressed="muted";break;case"captions":n.toggle=!0,n.label="enableCaptions",n.labelPressed="disableCaptions",n.icon="captions-off",n.iconPressed="captions-on";break;case"fullscreen":n.toggle=!0,n.label="enterFullscreen",n.labelPressed="exitFullscreen",n.icon="enter-fullscreen",n.iconPressed="exit-fullscreen";break;case"play-large":i.class+=` ${this.config.classNames.control}--overlaid`,s="play",n.label="play",n.icon="play";break;default:j.empty(n.label)&&(n.label=s),j.empty(n.icon)&&(n.icon=e)}const a=Y(n.element);return n.toggle?(a.appendChild(ot.createIcon.call(this,n.iconPressed,{class:"icon--pressed"})),a.appendChild(ot.createIcon.call(this,n.icon,{class:"icon--not-pressed"})),a.appendChild(ot.createLabel.call(this,n.labelPressed,{class:"label--pressed"})),a.appendChild(ot.createLabel.call(this,n.label,{class:"label--not-pressed"}))):(a.appendChild(ot.createIcon.call(this,n.icon)),a.appendChild(ot.createLabel.call(this,n.label))),z(i,te(this.config.selectors.buttons[s],i)),K(a,i),"play"===s?(j.array(this.elements.buttons[s])||(this.elements.buttons[s]=[]),this.elements.buttons[s].push(a)):this.elements.buttons[s]=a,a},createRange(e,t){const i=Y("input",z(te(this.config.selectors.inputs[e]),{type:"range",min:0,max:100,step:.01,value:0,autocomplete:"off",role:"slider","aria-label":Ge.get(e,this.config),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":0},t));return this.elements.inputs[e]=i,ot.updateRangeFill.call(this,i),w.setup(i),i},createProgress(e,t){const i=Y("progress",z(te(this.config.selectors.display[e]),{min:0,max:100,value:0,role:"progressbar","aria-hidden":!0},t));if("volume"!==e){i.appendChild(Y("span",null,"0"));const t={played:"played",buffer:"buffered"}[e],s=t?Ge.get(t,this.config):"";i.textContent=`% ${s.toLowerCase()}`}return this.elements.display[e]=i,i},createTime(e,t){const i=te(this.config.selectors.display[e],t),s=Y("div",z(i,{class:`${i.class?i.class:""} ${this.config.classNames.display.time} `.trim(),"aria-label":Ge.get(e,this.config),role:"timer"}),"00:00");return this.elements.display[e]=s,s},bindMenuItemShortcuts(e,t){ge.call(this,e,"keydown keyup",i=>{if(![" ","ArrowUp","ArrowDown","ArrowRight"].includes(i.key))return;if(i.preventDefault(),i.stopPropagation(),"keydown"===i.type)return;const s=ae(e,'[role="menuitemradio"]');if(!s&&[" ","ArrowRight"].includes(i.key))ot.showMenuPanel.call(this,t,!0);else{let t;" "!==i.key&&("ArrowDown"===i.key||s&&"ArrowRight"===i.key?(t=e.nextElementSibling,j.element(t)||(t=e.parentNode.firstElementChild)):(t=e.previousElementSibling,j.element(t)||(t=e.parentNode.lastElementChild)),ce.call(this,t,!0))}},!1),ge.call(this,e,"keyup",e=>{"Return"===e.key&&ot.focusFirstMenuItem.call(this,null,!0)})},createMenuItem({value:e,list:t,type:i,title:s,badge:n=null,checked:a=!1}){const r=te(this.config.selectors.inputs[i]),o=Y("button",z(r,{type:"button",role:"menuitemradio",class:`${this.config.classNames.control} ${r.class?r.class:""}`.trim(),"aria-checked":a,value:e})),l=Y("span");l.innerHTML=s,j.element(n)&&l.appendChild(n),o.appendChild(l),Object.defineProperty(o,"checked",{enumerable:!0,get(){return"true"===o.getAttribute("aria-checked")},set(e){e&&Array.from(o.parentNode.children).filter(e=>ae(e,'[role="menuitemradio"]')).forEach(e=>e.setAttribute("aria-checked","false")),o.setAttribute("aria-checked",e?"true":"false")}}),this.listeners.bind(o,"click keyup",t=>{if(!j.keyboardEvent(t)||" "===t.key){switch(t.preventDefault(),t.stopPropagation(),o.checked=!0,i){case"language":this.currentTrack=Number(e);break;case"quality":this.quality=e;break;case"speed":this.speed=Number.parseFloat(e);break;default:break}ot.showMenuPanel.call(this,"home",j.keyboardEvent(t))}},i,!1),ot.bindMenuItemShortcuts.call(this,o,i),t.appendChild(o)},formatTime(e=0,t=!1){if(!j.number(e))return e;const i=st(this.duration)>0;return rt(e,i,t)},updateTimeDisplay(e=null,t=0,i=!1){j.element(e)&&j.number(t)&&(e.textContent=ot.formatTime(t,i))},updateVolume(){this.supported.ui&&(j.element(this.elements.inputs.volume)&&ot.setRange.call(this,this.elements.inputs.volume,this.muted?0:this.volume),j.element(this.elements.buttons.mute)&&(this.elements.buttons.mute.pressed=this.muted||0===this.volume))},setRange(e,t=0){j.element(e)&&(e.value=t,ot.updateRangeFill.call(this,e))},updateProgress(e){if(!this.supported.ui||!j.event(e))return;let t=0;const i=(e,t)=>{const i=j.number(t)?t:0,s=j.element(e)?e:this.elements.display.buffer;if(j.element(s)){s.value=i;const e=s.getElementsByTagName("span")[0];j.element(e)&&(e.childNodes[0].nodeValue=i)}};if(e)switch(e.type){case"timeupdate":case"seeking":case"seeked":t=Be(this.currentTime,this.duration),"timeupdate"===e.type&&ot.setRange.call(this,this.elements.inputs.seek,t);break;case"playing":case"progress":i(this.elements.display.buffer,100*this.buffered);break;default:break}},updateRangeFill(e){const t=j.event(e)?e.target:e;if(j.element(t)&&"range"===t.getAttribute("type")){if(ae(t,this.config.selectors.inputs.seek)){t.setAttribute("aria-valuenow",this.currentTime);const e=ot.formatTime(this.currentTime),i=ot.formatTime(this.duration),s=Ge.get("seekLabel",this.config);t.setAttribute("aria-valuetext",s.replace("{currentTime}",e).replace("{duration}",i))}else if(ae(t,this.config.selectors.inputs.volume)){const e=100*t.value;t.setAttribute("aria-valuenow",e),t.setAttribute("aria-valuetext",`${e.toFixed(1)}%`)}else t.setAttribute("aria-valuenow",t.value);(Ve.isWebKit||Ve.isIPadOS)&&t.style.setProperty("--value",t.value/t.max*100+"%")}},updateSeekTooltip(e){if(!this.config.tooltips.seek||!j.element(this.elements.inputs.seek)||!j.element(this.elements.display.seekTooltip)||0===this.duration)return;const t=this.elements.display.seekTooltip,i=`${this.config.classNames.tooltip}--visible`,s=e=>se(t,i,e);if(this.touch)return void s(!1);let n=0;const a=this.elements.progress.getBoundingClientRect();if(j.event(e)){const t=e.pageX-e.clientX;n=100/a.width*(e.pageX-a.left-t)}else{if(!ne(t,i))return;n=Number.parseFloat(t.style.left,10)}n<0?n=0:n>100&&(n=100);const r=this.duration/100*n;t.textContent=ot.formatTime(r);const o=this.config.markers?.points?.find(({time:e})=>e===Math.round(r));o&&t.insertAdjacentHTML("afterbegin",`${o.label}
`),t.style.left=`${n}%`,j.event(e)&&["mouseenter","mouseleave"].includes(e.type)&&s("mouseenter"===e.type)},timeUpdate(e){const t=!j.element(this.elements.display.duration)&&this.config.invertTime;ot.updateTimeDisplay.call(this,this.elements.display.currentTime,t?this.duration-this.currentTime:this.currentTime,t),e&&"timeupdate"===e.type&&this.media.seeking||ot.updateProgress.call(this,e)},durationUpdate(){if(!this.supported.ui||!this.config.invertTime&&this.currentTime)return;if(this.duration>=2**32)return ie(this.elements.display.currentTime,!0),void ie(this.elements.progress,!0);j.element(this.elements.inputs.seek)&&this.elements.inputs.seek.setAttribute("aria-valuemax",this.duration);const e=j.element(this.elements.display.duration);!e&&this.config.displayDuration&&this.paused&&ot.updateTimeDisplay.call(this,this.elements.display.currentTime,this.duration),e&&ot.updateTimeDisplay.call(this,this.elements.display.duration,this.duration),this.config.markers.enabled&&ot.setMarkers.call(this),ot.updateSeekTooltip.call(this)},toggleMenuButton(e,t){ie(this.elements.settings.buttons[e],!t)},updateSetting(e,t,i){const s=this.elements.settings.panels[e];let n=null,a=t;if("captions"===e)n=this.currentTrack;else{if(n=j.empty(i)?this[e]:i,j.empty(n)&&(n=this.config[e].default),!j.empty(this.options[e])&&!this.options[e].includes(n))return void this.debug.warn(`Unsupported value of '${n}' for ${e}`);if(!this.config[e].options.includes(n))return void this.debug.warn(`Disabled value of '${n}' for ${e}`)}if(j.element(a)||(a=s&&s.querySelector('[role="menu"]')),!j.element(a))return;const r=this.elements.settings.buttons[e].querySelector(`.${this.config.classNames.menu.value}`);r.innerHTML=ot.getLabel.call(this,e,n);const o=a&&a.querySelector(`[value="${n}"]`);j.element(o)&&(o.checked=!0)},getLabel(e,t){switch(e){case"speed":return 1===t?Ge.get("normal",this.config):`${t}×`;case"quality":if(j.number(t)){const e=Ge.get(`qualityLabel.${t}`,this.config);return e.length?e:`${t}p`}return Xe(t);case"captions":return ut.getLabel.call(this);default:return null}},setQualityMenu(e){if(!j.element(this.elements.settings.panels.quality))return;const t="quality",i=this.elements.settings.panels.quality.querySelector('[role="menu"]');j.array(e)&&(this.options.quality=Te(e).filter(e=>this.config.quality.options.includes(e)));const s=!j.empty(this.options.quality)&&this.options.quality.length>1;if(ot.toggleMenuButton.call(this,t,s),Z(i),ot.checkMenu.call(this),!s)return;const n=e=>{const t=Ge.get(`qualityBadge.${e}`,this.config);return t.length?ot.createBadge.call(this,t):null};this.options.quality.sort((e,t)=>{const i=this.config.quality.options;return i.indexOf(e)>i.indexOf(t)?1:-1}).forEach(e=>{ot.createMenuItem.call(this,{value:e,list:i,type:t,title:ot.getLabel.call(this,"quality",e),badge:n(e)})}),ot.updateSetting.call(this,t,i)},setCaptionsMenu(){if(!j.element(this.elements.settings.panels.captions))return;const e="captions",t=this.elements.settings.panels.captions.querySelector('[role="menu"]'),i=ut.getTracks.call(this),s=Boolean(i.length);if(ot.toggleMenuButton.call(this,e,s),Z(t),ot.checkMenu.call(this),!s)return;const n=i.map((e,i)=>({value:i,checked:this.captions.toggled&&this.currentTrack===i,title:ut.getLabel.call(this,e),badge:e.language&&ot.createBadge.call(this,e.language.toUpperCase()),list:t,type:"language"}));n.unshift({value:-1,checked:!this.captions.toggled,title:Ge.get("disabled",this.config),list:t,type:"language"}),n.forEach(ot.createMenuItem.bind(this)),ot.updateSetting.call(this,e,t)},setSpeedMenu(){if(!j.element(this.elements.settings.panels.speed))return;const e="speed",t=this.elements.settings.panels.speed.querySelector('[role="menu"]');this.options.speed=this.options.speed.filter(e=>e>=this.minimumSpeed&&e<=this.maximumSpeed);const i=!j.empty(this.options.speed)&&this.options.speed.length>1;ot.toggleMenuButton.call(this,e,i),Z(t),ot.checkMenu.call(this),i&&(this.options.speed.forEach(i=>{ot.createMenuItem.call(this,{value:i,list:t,type:e,title:ot.getLabel.call(this,"speed",i)})}),ot.updateSetting.call(this,e,t))},checkMenu(){const{buttons:e}=this.elements.settings,t=!j.empty(e)&&Object.values(e).some(e=>!e.hidden);ie(this.elements.settings.menu,!t)},focusFirstMenuItem(e,t=!1){if(this.elements.settings.popup.hidden)return;let i=e;j.element(i)||(i=Object.values(this.elements.settings.panels).find(e=>!e.hidden));const s=i.querySelector('[role^="menuitem"]');ce.call(this,s,t)},toggleMenu(e){const{popup:t}=this.elements.settings,i=this.elements.buttons.settings;if(!j.element(t)||!j.element(i))return;const{hidden:s}=t;let n=s;if(j.boolean(e))n=e;else if(j.keyboardEvent(e)&&"Escape"===e.key)n=!1;else if(j.event(e)){const s=j.function(e.composedPath)?e.composedPath()[0]:e.target,a=t.contains(s);if(a||!a&&e.target!==i&&n)return}i.setAttribute("aria-expanded",n),ie(t,!n),se(this.elements.container,this.config.classNames.menu.open,n),n&&j.keyboardEvent(e)?ot.focusFirstMenuItem.call(this,null,!0):n||s||ce.call(this,i,j.keyboardEvent(e))},getMenuSize(e){const t=e.cloneNode(!0);t.style.position="absolute",t.style.opacity=0,t.removeAttribute("hidden"),e.parentNode.appendChild(t);const i=t.scrollWidth,s=t.scrollHeight;return G(t),{width:i,height:s}},showMenuPanel(e="",t=!1){const i=this.elements.container.querySelector(`#plyr-settings-${this.id}-${e}`);if(!j.element(i))return;const s=i.parentNode,n=Array.from(s.children).find(e=>!e.hidden);if(ue.transitions&&!ue.reducedMotion){s.style.width=`${n.scrollWidth}px`,s.style.height=`${n.scrollHeight}px`;const e=ot.getMenuSize.call(this,i),t=e=>{e.target===s&&["width","height"].includes(e.propertyName)&&(s.style.width="",s.style.height="",fe.call(this,s,q,t))};ge.call(this,s,q,t),s.style.width=`${e.width}px`,s.style.height=`${e.height}px`}ie(n,!0),ie(i,!1),ot.focusFirstMenuItem.call(this,i,t)},setDownloadUrl(){const e=this.elements.buttons.download;j.element(e)&&e.setAttribute("href",this.download)},create(e){const{bindMenuItemShortcuts:t,createButton:i,createProgress:s,createRange:n,createTime:a,setQualityMenu:r,setSpeedMenu:o,showMenuPanel:l}=ot;this.elements.controls=null,j.array(this.config.controls)&&this.config.controls.includes("play-large")&&this.elements.container.appendChild(i.call(this,"play-large"));const c=Y("div",te(this.config.selectors.controls.wrapper));this.elements.controls=c;const h={class:"plyr__controls__item"};return Te(j.array(this.config.controls)?this.config.controls:[]).forEach(r=>{if("restart"===r&&c.appendChild(i.call(this,"restart",h)),"rewind"===r&&c.appendChild(i.call(this,"rewind",h)),"play"===r&&c.appendChild(i.call(this,"play",h)),"fast-forward"===r&&c.appendChild(i.call(this,"fast-forward",h)),"progress"===r){const t=Y("div",{class:`${h.class} plyr__progress__container`}),i=Y("div",te(this.config.selectors.progress));if(i.appendChild(n.call(this,"seek",{id:`plyr-seek-${e.id}`})),i.appendChild(s.call(this,"buffer")),this.config.tooltips.seek){const e=Y("span",{class:this.config.classNames.tooltip},"00:00");i.appendChild(e),this.elements.display.seekTooltip=e}this.elements.progress=i,t.appendChild(this.elements.progress),c.appendChild(t)}if("current-time"===r&&c.appendChild(a.call(this,"currentTime",h)),"duration"===r&&c.appendChild(a.call(this,"duration",h)),"mute"===r||"volume"===r){let{volume:t}=this.elements;if(j.element(t)&&c.contains(t)||(t=Y("div",z({},h,{class:`${h.class} plyr__volume`.trim()})),this.elements.volume=t,c.appendChild(t)),"mute"===r&&t.appendChild(i.call(this,"mute")),"volume"===r&&!Ve.isIos&&!Ve.isIPadOS){const i={max:1,step:.05,value:this.config.volume};t.appendChild(n.call(this,"volume",z(i,{id:`plyr-volume-${e.id}`})))}}if("captions"===r&&c.appendChild(i.call(this,"captions",h)),"settings"===r&&!j.empty(this.config.settings)){const s=Y("div",z({},h,{class:`${h.class} plyr__menu`.trim(),hidden:""}));s.appendChild(i.call(this,"settings",{"aria-haspopup":!0,"aria-controls":`plyr-settings-${e.id}`,"aria-expanded":!1}));const n=Y("div",{class:"plyr__menu__container",id:`plyr-settings-${e.id}`,hidden:""}),a=Y("div"),r=Y("div",{id:`plyr-settings-${e.id}-home`}),o=Y("div",{role:"menu"});r.appendChild(o),a.appendChild(r),this.elements.settings.panels.home=r,this.config.settings.forEach(i=>{const s=Y("button",z(te(this.config.selectors.buttons.settings),{type:"button",class:`${this.config.classNames.control} ${this.config.classNames.control}--forward`,role:"menuitem","aria-haspopup":!0,hidden:""}));t.call(this,s,i),ge.call(this,s,"click",()=>{l.call(this,i,!1)});const n=Y("span",null,Ge.get(i,this.config)),r=Y("span",{class:this.config.classNames.menu.value});r.innerHTML=e[i],n.appendChild(r),s.appendChild(n),o.appendChild(s);const c=Y("div",{id:`plyr-settings-${e.id}-${i}`,hidden:""}),h=Y("button",{type:"button",class:`${this.config.classNames.control} ${this.config.classNames.control}--back`});h.appendChild(Y("span",{"aria-hidden":!0},Ge.get(i,this.config))),h.appendChild(Y("span",{class:this.config.classNames.hidden},Ge.get("menuBack",this.config))),ge.call(this,c,"keydown",e=>{"ArrowLeft"===e.key&&(e.preventDefault(),e.stopPropagation(),l.call(this,"home",!0))},!1),ge.call(this,h,"click",()=>{l.call(this,"home",!1)}),c.appendChild(h),c.appendChild(Y("div",{role:"menu"})),a.appendChild(c),this.elements.settings.buttons[i]=s,this.elements.settings.panels[i]=c}),n.appendChild(a),s.appendChild(n),c.appendChild(s),this.elements.settings.popup=n,this.elements.settings.menu=s}if("pip"===r&&ue.pip&&c.appendChild(i.call(this,"pip",h)),"airplay"===r&&ue.airplay&&c.appendChild(i.call(this,"airplay",h)),"download"===r){const e=z({},h,{element:"a",href:this.download,target:"_blank"});this.isHTML5&&(e.download="");const{download:t}=this.config.urls;!j.url(t)&&this.isEmbed&&z(e,{icon:`logo-${this.provider}`,label:this.provider}),c.appendChild(i.call(this,"download",e))}"fullscreen"===r&&c.appendChild(i.call(this,"fullscreen",h))}),this.isHTML5&&r.call(this,Ne.getQualityOptions.call(this)),o.call(this),c},inject(){if(this.config.loadSprite){const e=ot.getIconUrl.call(this);e.cors&&it(e.url,"sprite-plyr")}this.id=Math.floor(1e4*Math.random());let e=null;this.elements.controls=null;const t={id:this.id,seektime:this.config.seekTime,title:this.config.title};let i=!0;j.function(this.config.controls)&&(this.config.controls=this.config.controls.call(this,t)),this.config.controls||(this.config.controls=[]),j.element(this.config.controls)||j.string(this.config.controls)?e=this.config.controls:(e=ot.create.call(this,{id:this.id,seektime:this.config.seekTime,speed:this.speed,quality:this.quality,captions:ut.getLabel.call(this)}),i=!1);const s=e=>{let i=e;return Object.entries(t).forEach(([e,t])=>{i=Ue(i,`{${e}}`,t)}),i};let n;i&&j.string(this.config.controls)&&(e=s(e)),j.string(this.config.selectors.controls.container)&&(n=document.querySelector(this.config.selectors.controls.container)),j.element(n)||(n=this.elements.container);const a=j.element(e)?"insertAdjacentElement":"insertAdjacentHTML";if(n[a]("afterbegin",e),j.element(this.elements.controls)||ot.findElements.call(this),!j.empty(this.elements.buttons)){const e=e=>{const t=this.config.classNames.controlPressed;e.setAttribute("aria-pressed","false"),Object.defineProperty(e,"pressed",{configurable:!0,enumerable:!0,get(){return ne(e,t)},set(i=!1){se(e,t,i),e.setAttribute("aria-pressed",i?"true":"false")}})};Object.values(this.elements.buttons).filter(Boolean).forEach(t=>{j.array(t)||j.nodeList(t)?Array.from(t).filter(Boolean).forEach(e):e(t)})}if(Ve.isEdge&&B(n),this.config.tooltips.controls){const{classNames:e,selectors:t}=this.config,i=`${t.controls.wrapper} ${t.labels} .${e.hidden}`,s=oe.call(this,i);Array.from(s).forEach(e=>{se(e,this.config.classNames.hidden,!1),se(e,this.config.classNames.tooltip,!0)})}},setMediaMetadata(){try{"mediaSession"in navigator&&(navigator.mediaSession.metadata=new window.MediaMetadata({title:this.config.mediaMetadata.title,artist:this.config.mediaMetadata.artist,album:this.config.mediaMetadata.album,artwork:this.config.mediaMetadata.artwork}))}catch{}},setMarkers(){if(!this.duration||this.elements.markers)return;const e=this.config.markers?.points?.filter(({time:e})=>e>0&&ese(s,n,e);e.forEach(e=>{const t=Y("span",{class:this.config.classNames.marker},""),n=e.time/this.duration*100+"%";s&&(t.addEventListener("mouseenter",()=>{e.label||(s.style.left=n,s.innerHTML=e.label,a(!0))}),t.addEventListener("mouseleave",()=>{a(!1)})),t.addEventListener("click",()=>{this.currentTime=e.time}),t.style.left=n,i.appendChild(t)}),t.appendChild(i),this.config.tooltips.seek||(s=Y("span",{class:this.config.classNames.tooltip},""),t.appendChild(s)),this.elements.markers={points:i,tip:s},this.elements.progress.appendChild(t)}};var lt=ot;function ct(e,t=!0){let i=e;if(t){const e=document.createElement("a");e.href=i,i=e.href}try{return new URL(i)}catch{return null}}function ht(e){const t=new URLSearchParams;return j.object(e)&&Object.entries(e).forEach(([e,i])=>{t.set(e,i)}),t}const dt={setup(){if(!this.supported.ui)return;if(!this.isVideo||this.isYouTube||this.isHTML5&&!ue.textTracks)return void(j.array(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&<.setCaptionsMenu.call(this));if(j.element(this.elements.captions)||(this.elements.captions=Y("div",te(this.config.selectors.captions)),this.elements.captions.setAttribute("dir","auto"),Q(this.elements.captions,this.elements.wrapper)),Ve.isIE&&window.URL){const e=this.media.querySelectorAll("track");Array.from(e).forEach(e=>{const t=e.getAttribute("src"),i=ct(t);null!==i&&i.hostname!==window.location.href.hostname&&["http:","https:"].includes(i.protocol)&&tt(t,"blob").then(t=>{e.setAttribute("src",window.URL.createObjectURL(t))}).catch(()=>{G(e)})})}const e=navigator.languages||[navigator.language||navigator.userLanguage||"en"],t=Te(e.map(e=>e.split("-")[0]));let i=(this.storage.get("language")||this.captions.language||this.config.captions.language||"auto").toLowerCase();"auto"===i&&([i]=t);let s=this.storage.get("captions")||this.captions.active;if(j.boolean(s)||({active:s}=this.config.captions),Object.assign(this.captions,{toggled:!1,active:s,language:i,languages:t}),this.isHTML5){const e=this.config.captions.update?"addtrack removetrack":"removetrack";ge.call(this,this.media.textTracks,e,dt.update.bind(this))}setTimeout(dt.update.bind(this),0)},update(){const e=dt.getTracks.call(this,!0),{active:t,language:i,meta:s,currentTrackNode:n}=this.captions,a=Boolean(e.find(e=>e.language===i));this.isHTML5&&this.isVideo&&e.filter(e=>!s.get(e)).forEach(e=>{this.debug.log("Track added",e),s.set(e,{default:"showing"===e.mode}),"showing"===e.mode&&(e.mode="hidden"),ge.call(this,e,"cuechange",()=>dt.updateCues.call(this))}),(a&&this.language!==i||!e.includes(n))&&(dt.setLanguage.call(this,i),dt.toggle.call(this,t&&a)),this.elements&&se(this.elements.container,this.config.classNames.captions.enabled,!j.empty(e)),j.array(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&<.setCaptionsMenu.call(this)},toggle(e,t=!0){if(!this.supported.ui)return;const{toggled:i}=this.captions,s=this.config.classNames.captions.active,n=j.nullOrUndefined(e)?!i:e;if(n!==i){if(t||(this.captions.active=n,this.storage.set({captions:n})),!this.language&&n&&!t){const e=dt.getTracks.call(this),t=dt.findTrack.call(this,[this.captions.language,...this.captions.languages],!0);return this.captions.language=t.language,void dt.set.call(this,e.indexOf(t))}this.elements.buttons.captions&&(this.elements.buttons.captions.pressed=n),se(this.elements.container,s,n),this.captions.toggled=n,lt.updateSetting.call(this,"captions"),be.call(this,this.media,n?"captionsenabled":"captionsdisabled")}setTimeout(()=>{n&&this.captions.toggled&&(this.captions.currentTrackNode.mode="hidden")})},set(e,t=!0){const i=dt.getTracks.call(this);if(-1!==e)if(j.number(e))if(e in i){if(this.captions.currentTrack!==e){this.captions.currentTrack=e;const s=i[e],{language:n}=s||{};this.captions.currentTrackNode=s,lt.updateSetting.call(this,"captions"),t||(this.captions.language=n,this.storage.set({language:n})),this.isVimeo&&this.embed.enableTextTrack(n),be.call(this,this.media,"languagechange")}dt.toggle.call(this,!0,t),this.isHTML5&&this.isVideo&&dt.updateCues.call(this)}else this.debug.warn("Track not found",e);else this.debug.warn("Invalid caption argument",e);else dt.toggle.call(this,!1,t)},setLanguage(e,t=!0){if(!j.string(e))return void this.debug.warn("Invalid language argument",e);const i=e.toLowerCase();this.captions.language=i;const s=dt.getTracks.call(this),n=dt.findTrack.call(this,[i]);dt.set.call(this,s.indexOf(n),t)},getTracks(e=!1){const t=Array.from((this.media||{}).textTracks||[]);return t.filter(t=>!this.isHTML5||e||this.captions.meta.has(t)).filter(e=>["captions","subtitles"].includes(e.kind))},findTrack(e,t=!1){const i=dt.getTracks.call(this),s=e=>Number((this.captions.meta.get(e)||{}).default),n=Array.from(i).sort((e,t)=>s(t)-s(e));let a;return e.every(e=>(a=n.find(t=>t.language===e),!a)),a||(t?n[0]:void 0)},getCurrentTrack(){return dt.getTracks.call(this)[this.currentTrack]},getLabel(e){let t=e;return!j.track(t)&&ue.textTracks&&this.captions.toggled&&(t=dt.getCurrentTrack.call(this)),j.track(t)?j.empty(t.label)?j.empty(t.language)?Ge.get("enabled",this.config):e.language.toUpperCase():t.label:Ge.get("disabled",this.config)},updateCues(e){if(!this.supported.ui)return;if(!j.element(this.elements.captions))return void this.debug.warn("No captions element to render to");if(!j.nullOrUndefined(e)&&!Array.isArray(e))return void this.debug.warn("updateCues: Invalid input",e);let t=e;if(!t){const e=dt.getCurrentTrack.call(this);t=Array.from((e||{}).activeCues||[]).map(e=>e.getCueAsHTML()).map(Ye)}const i=t.map(e=>e.trim()).join("\n"),s=i!==this.elements.captions.innerHTML;if(s){Z(this.elements.captions);const e=Y("span",te(this.config.selectors.caption));e.innerHTML=i,this.elements.captions.appendChild(e),be.call(this,this.media,"cuechange")}}};var ut=dt;const pt={enabled:!0,title:"",debug:!1,autoplay:!1,autopause:!0,playsinline:!0,seekTime:10,volume:1,muted:!1,duration:null,displayDuration:!0,invertTime:!0,toggleInvert:!0,ratio:null,clickToPlay:!0,hideControls:!0,resetOnEnd:!1,disableContextMenu:!0,loadSprite:!0,iconPrefix:"plyr",iconUrl:"https://cdn.plyr.io/3.8.3/plyr.svg",blankVideo:"https://cdn.plyr.io/static/blank.mp4",quality:{default:576,options:[4320,2880,2160,1440,1080,720,576,480,360,240],forced:!1,onChange:null},loop:{active:!1},speed:{selected:1,options:[.5,.75,1,1.25,1.5,1.75,2,4]},keyboard:{focused:!0,global:!1},tooltips:{controls:!1,seek:!0},captions:{active:!1,language:"auto",update:!1},fullscreen:{enabled:!0,fallback:!0,iosNative:!1},storage:{enabled:!0,key:"plyr"},controls:["play-large","play","progress","current-time","mute","volume","captions","settings","pip","airplay","fullscreen"],settings:["captions","quality","speed"],i18n:{restart:"Restart",rewind:"Rewind {seektime}s",play:"Play",pause:"Pause",fastForward:"Forward {seektime}s",seek:"Seek",seekLabel:"{currentTime} of {duration}",played:"Played",buffered:"Buffered",currentTime:"Current time",duration:"Duration",volume:"Volume",mute:"Mute",unmute:"Unmute",enableCaptions:"Enable captions",disableCaptions:"Disable captions",download:"Download",enterFullscreen:"Enter fullscreen",exitFullscreen:"Exit fullscreen",frameTitle:"Player for {title}",captions:"Captions",settings:"Settings",pip:"PIP",menuBack:"Go back to previous menu",speed:"Speed",normal:"Normal",quality:"Quality",loop:"Loop",start:"Start",end:"End",all:"All",reset:"Reset",disabled:"Disabled",enabled:"Enabled",advertisement:"Ad",qualityBadge:{2160:"4K",1440:"HD",1080:"HD",720:"HD",576:"SD",480:"SD"}},urls:{download:null,vimeo:{sdk:"https://player.vimeo.com/api/player.js",iframe:"https://player.vimeo.com/video/{0}?{1}",api:"https://vimeo.com/api/oembed.json?url={0}"},youtube:{sdk:"https://www.youtube.com/iframe_api",api:"https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}"},googleIMA:{sdk:"https://imasdk.googleapis.com/js/sdkloader/ima3.js"}},listeners:{seek:null,play:null,pause:null,restart:null,rewind:null,fastForward:null,mute:null,volume:null,captions:null,download:null,fullscreen:null,pip:null,airplay:null,speed:null,quality:null,loop:null,language:null},events:["ended","progress","stalled","playing","waiting","canplay","canplaythrough","loadstart","loadeddata","loadedmetadata","timeupdate","volumechange","play","pause","error","seeking","seeked","emptied","ratechange","cuechange","download","enterfullscreen","exitfullscreen","captionsenabled","captionsdisabled","languagechange","controlshidden","controlsshown","ready","statechange","qualitychange","adsloaded","adscontentpause","adscontentresume","adstarted","adsmidpoint","adscomplete","adsallcomplete","adsimpression","adsclick"],selectors:{editable:"input, textarea, select, [contenteditable]",container:".plyr",controls:{container:null,wrapper:".plyr__controls"},labels:"[data-plyr]",buttons:{play:'[data-plyr="play"]',pause:'[data-plyr="pause"]',restart:'[data-plyr="restart"]',rewind:'[data-plyr="rewind"]',fastForward:'[data-plyr="fast-forward"]',mute:'[data-plyr="mute"]',captions:'[data-plyr="captions"]',download:'[data-plyr="download"]',fullscreen:'[data-plyr="fullscreen"]',pip:'[data-plyr="pip"]',airplay:'[data-plyr="airplay"]',settings:'[data-plyr="settings"]',loop:'[data-plyr="loop"]'},inputs:{seek:'[data-plyr="seek"]',volume:'[data-plyr="volume"]',speed:'[data-plyr="speed"]',language:'[data-plyr="language"]',quality:'[data-plyr="quality"]'},display:{currentTime:".plyr__time--current",duration:".plyr__time--duration",buffer:".plyr__progress__buffer",loop:".plyr__progress__loop",volume:".plyr__volume--display"},progress:".plyr__progress",captions:".plyr__captions",caption:".plyr__caption"},classNames:{type:"plyr--{0}",provider:"plyr--{0}",video:"plyr__video-wrapper",embed:"plyr__video-embed",videoFixedRatio:"plyr__video-wrapper--fixed-ratio",embedContainer:"plyr__video-embed__container",poster:"plyr__poster",posterEnabled:"plyr__poster-enabled",ads:"plyr__ads",control:"plyr__control",controlPressed:"plyr__control--pressed",playing:"plyr--playing",paused:"plyr--paused",stopped:"plyr--stopped",loading:"plyr--loading",hover:"plyr--hover",tooltip:"plyr__tooltip",cues:"plyr__cues",marker:"plyr__progress__marker",hidden:"plyr__sr-only",hideControls:"plyr--hide-controls",isTouch:"plyr--is-touch",uiSupported:"plyr--full-ui",noTransition:"plyr--no-transition",display:{time:"plyr__time"},menu:{value:"plyr__menu__value",badge:"plyr__badge",open:"plyr--menu-open"},captions:{enabled:"plyr--captions-enabled",active:"plyr--captions-active"},fullscreen:{enabled:"plyr--fullscreen-enabled",fallback:"plyr--fullscreen-fallback"},pip:{supported:"plyr--pip-supported",active:"plyr--pip-active"},airplay:{supported:"plyr--airplay-supported",active:"plyr--airplay-active"},previewThumbnails:{thumbContainer:"plyr__preview-thumb",thumbContainerShown:"plyr__preview-thumb--is-shown",imageContainer:"plyr__preview-thumb__image-container",timeContainer:"plyr__preview-thumb__time-container",scrubbingContainer:"plyr__preview-scrubbing",scrubbingContainerShown:"plyr__preview-scrubbing--is-shown"}},attributes:{embed:{provider:"data-plyr-provider",id:"data-plyr-embed-id",hash:"data-plyr-embed-hash"}},ads:{enabled:!1,publisherId:"",tagUrl:""},previewThumbnails:{enabled:!1,src:"",withCredentials:!1},vimeo:{byline:!1,portrait:!1,title:!1,speed:!0,transparent:!1,customControls:!0,referrerPolicy:null,premium:!1},youtube:{rel:0,showinfo:0,iv_load_policy:3,modestbranding:1,customControls:!0,noCookie:!1},mediaMetadata:{title:"",artist:"",album:"",artwork:[]},markers:{enabled:!1,points:[]}};var mt=pt;const gt={active:"picture-in-picture",inactive:"inline"};const ft={html5:"html5",youtube:"youtube",vimeo:"vimeo"},yt={audio:"audio",video:"video"};function bt(e){return/^(?:https?:\/\/)?(?:www\.)?(?:youtube\.com|youtube-nocookie\.com|youtu\.?be)\/.+$/.test(e)?ft.youtube:/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(e)?ft.vimeo:null}function vt(){}class wt{constructor(e=!1){this.enabled=window.console&&e,this.enabled&&this.log("Debugging enabled")}get log(){return this.enabled?Function.prototype.bind.call(console.log,console):vt}get warn(){return this.enabled?Function.prototype.bind.call(console.warn,console):vt}get error(){return this.enabled?Function.prototype.bind.call(console.error,console):vt}}class kt{constructor(e){(0,v.A)(this,"onChange",()=>{if(!this.supported)return;const e=this.player.elements.buttons.fullscreen;j.element(e)&&(e.pressed=this.active);const t=this.target===this.player.media?this.target:this.player.elements.container;be.call(this.player,t,this.active?"enterfullscreen":"exitfullscreen",!0)}),(0,v.A)(this,"toggleFallback",(e=!1)=>{if(e?this.scrollPosition={x:window.scrollX??0,y:window.scrollY??0}:window.scrollTo(this.scrollPosition.x,this.scrollPosition.y),document.body.style.overflow=e?"hidden":"",se(this.target,this.player.config.classNames.fullscreen.fallback,e),Ve.isIos){let t=document.head.querySelector('meta[name="viewport"]');const i="viewport-fit=cover";t||(t=document.createElement("meta"),t.setAttribute("name","viewport"));const s=j.string(t.content)&&t.content.includes(i);e?(this.cleanupViewport=!s,s||(t.content+=`,${i}`)):this.cleanupViewport&&(t.content=t.content.split(",").filter(e=>e.trim()!==i).join(","))}this.onChange()}),(0,v.A)(this,"trapFocus",e=>{if(Ve.isIos||Ve.isIPadOS||!this.active||"Tab"!==e.key)return;const t=document.activeElement,i=oe.call(this.player,"a[href], button:not(:disabled), input:not(:disabled), [tabindex]"),[s]=i,n=i[i.length-1];t!==n||e.shiftKey?t===s&&e.shiftKey&&(n.focus(),e.preventDefault()):(s.focus(),e.preventDefault())}),(0,v.A)(this,"update",()=>{if(this.supported){let e;e=this.forceFallback?"Fallback (forced)":kt.nativeSupported?"Native":"Fallback",this.player.debug.log(`${e} fullscreen enabled`)}else this.player.debug.log("Fullscreen not supported and fallback disabled");se(this.player.elements.container,this.player.config.classNames.fullscreen.enabled,this.supported)}),(0,v.A)(this,"enter",()=>{this.supported&&(Ve.isIos&&this.player.config.fullscreen.iosNative?this.player.isVimeo?this.player.embed.requestFullscreen():this.target.webkitEnterFullscreen():!kt.nativeSupported||this.forceFallback?this.toggleFallback(!0):this.prefix?j.empty(this.prefix)||this.target[`${this.prefix}Request${this.property}`]():this.target.requestFullscreen({navigationUI:"hide"}))}),(0,v.A)(this,"exit",()=>{if(this.supported)if(Ve.isIos&&this.player.config.fullscreen.iosNative)this.player.isVimeo?this.player.embed.exitFullscreen():this.target.webkitEnterFullscreen(),ke(this.player.play());else if(!kt.nativeSupported||this.forceFallback)this.toggleFallback(!1);else if(this.prefix){if(!j.empty(this.prefix)){const e="moz"===this.prefix?"Cancel":"Exit";document[`${this.prefix}${e}${this.property}`]()}}else(document.cancelFullScreen||document.exitFullscreen).call(document)}),(0,v.A)(this,"toggle",()=>{this.active?this.exit():this.enter()}),this.player=e,this.prefix=kt.prefix,this.property=kt.property,this.scrollPosition={x:0,y:0},this.forceFallback="force"===e.config.fullscreen.fallback,this.player.elements.fullscreen=e.config.fullscreen.container&&re(this.player.elements.container,e.config.fullscreen.container),ge.call(this.player,document,"ms"===this.prefix?"MSFullscreenChange":`${this.prefix}fullscreenchange`,()=>{this.onChange()}),ge.call(this.player,this.player.elements.container,"dblclick",e=>{j.element(this.player.elements.controls)&&this.player.elements.controls.contains(e.target)||this.player.listeners.proxy(e,this.toggle,"fullscreen")}),ge.call(this,this.player.elements.container,"keydown",e=>this.trapFocus(e)),this.update()}static get nativeSupported(){return!!(document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled)}get useNative(){return kt.nativeSupported&&!this.forceFallback}static get prefix(){if(j.function(document.exitFullscreen))return"";let e="";const t=["webkit","moz","ms"];return t.some(t=>!(!j.function(document[`${t}ExitFullscreen`])&&!j.function(document[`${t}CancelFullScreen`]))&&(e=t,!0)),e}static get property(){return"moz"===this.prefix?"FullScreen":"Fullscreen"}get supported(){return[this.player.config.fullscreen.enabled,this.player.isVideo,kt.nativeSupported||this.player.config.fullscreen.fallback,!this.player.isYouTube||kt.nativeSupported||!Ve.isIos||this.player.config.playsinline&&!this.player.config.fullscreen.iosNative].every(Boolean)}get active(){if(!this.supported)return!1;if(!kt.nativeSupported||this.forceFallback)return ne(this.target,this.player.config.classNames.fullscreen.fallback);const e=this.prefix?this.target.getRootNode()[`${this.prefix}${this.property}Element`]:this.target.getRootNode().fullscreenElement;return e&&e.shadowRoot?e===this.target.getRootNode().host:e===this.target}get target(){return Ve.isIos&&this.player.config.fullscreen.iosNative?this.player.media:this.player.elements.fullscreen??this.player.elements.container}}var Tt=kt;function Ct(e,t=1){return new Promise((i,s)=>{const n=new Image,a=()=>{delete n.onload,delete n.onerror,(n.naturalWidth>=t?i:s)(n)};Object.assign(n,{onload:a,onerror:a,src:e})})}const At={addStyleHook(){se(this.elements.container,this.config.selectors.container.replace(".",""),!0),se(this.elements.container,this.config.classNames.uiSupported,this.supported.ui)},toggleNativeControls(e=!1){e&&this.isHTML5?this.media.setAttribute("controls",""):this.media.removeAttribute("controls")},build(){if(this.listeners.media(),!this.supported.ui)return this.debug.warn(`Basic support only for ${this.provider} ${this.type}`),void At.toggleNativeControls.call(this,!0);j.element(this.elements.controls)||(lt.inject.call(this),this.listeners.controls()),At.toggleNativeControls.call(this),this.isHTML5&&ut.setup.call(this),this.volume=null,this.muted=null,this.loop=null,this.quality=null,this.speed=null,lt.updateVolume.call(this),lt.timeUpdate.call(this),lt.durationUpdate.call(this),At.checkPlaying.call(this),se(this.elements.container,this.config.classNames.pip.supported,ue.pip&&this.isHTML5&&this.isVideo),se(this.elements.container,this.config.classNames.airplay.supported,ue.airplay&&this.isHTML5),se(this.elements.container,this.config.classNames.isTouch,this.touch),this.ready=!0,setTimeout(()=>{be.call(this,this.media,"ready")},0),At.setTitle.call(this),this.poster&&At.setPoster.call(this,this.poster,!1).catch(()=>{}),this.config.duration&<.durationUpdate.call(this),this.config.mediaMetadata&<.setMediaMetadata.call(this)},setTitle(){let e=Ge.get("play",this.config);if(j.string(this.config.title)&&!j.empty(this.config.title)&&(e+=`, ${this.config.title}`),Array.from(this.elements.buttons.play||[]).forEach(t=>{t.setAttribute("aria-label",e)}),this.isEmbed){const e=le.call(this,"iframe");if(!j.element(e))return;const t=j.empty(this.config.title)?"video":this.config.title,i=Ge.get("frameTitle",this.config);e.setAttribute("title",i.replace("{title}",t))}},togglePoster(e){se(this.elements.container,this.config.classNames.posterEnabled,e)},setPoster(e,t=!0){return t&&this.poster?Promise.reject(new Error("Poster already set")):(this.media.setAttribute("data-poster",e),this.elements.poster.removeAttribute("hidden"),we.call(this).then(()=>Ct(e)).catch(t=>{throw e===this.poster&&At.togglePoster.call(this,!1),t}).then(()=>{if(e!==this.poster)throw new Error("setPoster cancelled by later call to setPoster")}).then(()=>(Object.assign(this.elements.poster.style,{backgroundImage:`url('${e}')`,backgroundSize:""}),At.togglePoster.call(this,!0),e)))},checkPlaying(e){se(this.elements.container,this.config.classNames.playing,this.playing),se(this.elements.container,this.config.classNames.paused,this.paused),se(this.elements.container,this.config.classNames.stopped,this.stopped),Array.from(this.elements.buttons.play||[]).forEach(e=>{Object.assign(e,{pressed:this.playing}),e.setAttribute("aria-label",Ge.get(this.playing?"pause":"play",this.config))}),j.event(e)&&"timeupdate"===e.type||At.toggleControls.call(this)},checkLoading(e){this.loading=["stalled","waiting"].includes(e.type),clearTimeout(this.timers.loading),this.timers.loading=setTimeout(()=>{se(this.elements.container,this.config.classNames.loading,this.loading),At.toggleControls.call(this)},this.loading?250:0)},toggleControls(e){const{controls:t}=this.elements;if(t&&this.config.hideControls){const i=this.touch&&this.lastSeekTime+2e3>Date.now();this.toggleControls(Boolean(e||this.loading||this.paused||t.pressed||t.hover||i))}},migrateStyles(){Object.values({...this.media.style}).filter(e=>!j.empty(e)&&j.string(e)&&e.startsWith("--plyr")).forEach(e=>{this.elements.container.style.setProperty(e,this.media.style.getPropertyValue(e)),this.media.style.removeProperty(e)}),j.empty(this.media.style)&&this.media.removeAttribute("style")}};var St=At;class xt{constructor(e){(0,v.A)(this,"firstTouch",()=>{const{player:e}=this,{elements:t}=e;e.touch=!0,se(t.container,e.config.classNames.isTouch,!0)}),(0,v.A)(this,"global",(e=!0)=>{const{player:t}=this;t.config.keyboard.global&&me.call(t,window,"keydown keyup",this.handleKey,e,!1),me.call(t,document.body,"click",this.toggleMenu,e),ye.call(t,document.body,"touchstart",this.firstTouch)}),(0,v.A)(this,"container",()=>{const{player:e}=this,{config:t,elements:i,timers:s}=e;!t.keyboard.global&&t.keyboard.focused&&ge.call(e,i.container,"keydown keyup",this.handleKey,!1),ge.call(e,i.container,"mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen",t=>{const{controls:n}=i;n&&"enterfullscreen"===t.type&&(n.pressed=!1,n.hover=!1);const a=["touchstart","touchmove","mousemove"].includes(t.type);let r=0;a&&(St.toggleControls.call(e,!0),r=e.touch?3e3:2e3),clearTimeout(s.controls),s.controls=setTimeout(()=>St.toggleControls.call(e,!1),r)});const n=()=>{if(!e.isVimeo||e.config.vimeo.premium)return;const t=i.wrapper,{active:s}=e.fullscreen,[n,a]=Me.call(e),r=Ae(`aspect-ratio: ${n} / ${a}`);if(!s)return void(r?(t.style.width=null,t.style.height=null):(t.style.maxWidth=null,t.style.margin=null));const[o,l]=Ie(),c=o/l>n/a;r?(t.style.width=c?"auto":"100%",t.style.height=c?"100%":"auto"):(t.style.maxWidth=c?l/a*n+"px":null,t.style.margin=c?"0 auto":null)},a=()=>{clearTimeout(s.resized),s.resized=setTimeout(n,50)};ge.call(e,i.container,"enterfullscreen exitfullscreen",t=>{const{target:s}=e.fullscreen;if(s!==i.container)return;if(!e.isEmbed&&j.empty(e.config.ratio))return;n();const r="enterfullscreen"===t.type?ge:fe;r.call(e,window,"resize",a)})}),(0,v.A)(this,"media",()=>{const{player:e}=this,{elements:t}=e;if(ge.call(e,e.media,"timeupdate seeking seeked",t=>lt.timeUpdate.call(e,t)),ge.call(e,e.media,"durationchange loadeddata loadedmetadata",t=>lt.durationUpdate.call(e,t)),ge.call(e,e.media,"ended",()=>{e.isHTML5&&e.isVideo&&e.config.resetOnEnd&&(e.restart(),e.pause())}),ge.call(e,e.media,"progress playing seeking seeked",t=>lt.updateProgress.call(e,t)),ge.call(e,e.media,"volumechange",t=>lt.updateVolume.call(e,t)),ge.call(e,e.media,"playing play pause ended emptied timeupdate",t=>St.checkPlaying.call(e,t)),ge.call(e,e.media,"waiting canplay seeked playing",t=>St.checkLoading.call(e,t)),e.supported.ui&&e.config.clickToPlay&&!e.isAudio){const i=le.call(e,`.${e.config.classNames.video}`);if(!j.element(i))return;ge.call(e,t.container,"click",s=>{const n=[t.container,i];(n.includes(s.target)||i.contains(s.target))&&(e.touch&&e.config.hideControls||(e.ended?(this.proxy(s,e.restart,"restart"),this.proxy(s,()=>{ke(e.play())},"play")):this.proxy(s,()=>{ke(e.togglePlay())},"play")))})}e.supported.ui&&e.config.disableContextMenu&&ge.call(e,t.wrapper,"contextmenu",e=>{e.preventDefault()},!1),ge.call(e,e.media,"volumechange",()=>{e.storage.set({volume:e.volume,muted:e.muted})}),ge.call(e,e.media,"ratechange",()=>{lt.updateSetting.call(e,"speed"),e.storage.set({speed:e.speed})}),ge.call(e,e.media,"qualitychange",t=>{lt.updateSetting.call(e,"quality",null,t.detail.quality)}),ge.call(e,e.media,"ready qualitychange",()=>{lt.setDownloadUrl.call(e)});const i=e.config.events.concat(["keyup","keydown"]).join(" ");ge.call(e,e.media,i,i=>{let{detail:s={}}=i;"error"===i.type&&(s=e.media.error),be.call(e,t.container,i.type,!0,s)})}),(0,v.A)(this,"proxy",(e,t,i)=>{const{player:s}=this,n=s.config.listeners[i],a=j.function(n);let r=!0;a&&(r=n.call(s,e)),!1!==r&&j.function(t)&&t.call(s,e)}),(0,v.A)(this,"bind",(e,t,i,s,n=!0)=>{const{player:a}=this,r=a.config.listeners[s],o=j.function(r);ge.call(a,e,t,e=>this.proxy(e,i,s),n&&!o)}),(0,v.A)(this,"controls",()=>{const{player:e}=this,{elements:t}=e,i=Ve.isIE?"change":"input";if(t.buttons.play&&Array.from(t.buttons.play).forEach(t=>{this.bind(t,"click",()=>{ke(e.togglePlay())},"play")}),this.bind(t.buttons.restart,"click",e.restart,"restart"),this.bind(t.buttons.rewind,"click",()=>{e.lastSeekTime=Date.now(),e.rewind()},"rewind"),this.bind(t.buttons.fastForward,"click",()=>{e.lastSeekTime=Date.now(),e.forward()},"fastForward"),this.bind(t.buttons.mute,"click",()=>{e.muted=!e.muted},"mute"),this.bind(t.buttons.captions,"click",()=>e.toggleCaptions()),this.bind(t.buttons.download,"click",()=>{be.call(e,e.media,"download")},"download"),this.bind(t.buttons.fullscreen,"click",()=>{e.fullscreen.toggle()},"fullscreen"),this.bind(t.buttons.pip,"click",()=>{e.pip="toggle"},"pip"),this.bind(t.buttons.airplay,"click",e.airplay,"airplay"),this.bind(t.buttons.settings,"click",t=>{t.stopPropagation(),t.preventDefault(),lt.toggleMenu.call(e,t)},null,!1),this.bind(t.buttons.settings,"keyup",t=>{[" ","Enter"].includes(t.key)&&("Enter"!==t.key?(t.preventDefault(),t.stopPropagation(),lt.toggleMenu.call(e,t)):lt.focusFirstMenuItem.call(e,null,!0))},null,!1),this.bind(t.settings.menu,"keydown",t=>{"Escape"===t.key&<.toggleMenu.call(e,t)}),this.bind(t.inputs.seek,"mousedown mousemove",e=>{const i=t.progress.getBoundingClientRect(),s=e.pageX-e.clientX,n=100/i.width*(e.pageX-i.left-s);e.currentTarget.setAttribute("seek-value",n)}),this.bind(t.inputs.seek,"mousedown mouseup keydown keyup touchstart touchend",t=>{const i=t.currentTarget,s="play-on-seeked";if(j.keyboardEvent(t)&&!["ArrowLeft","ArrowRight"].includes(t.key))return;e.lastSeekTime=Date.now();const n=i.hasAttribute(s),a=["mouseup","touchend","keyup"].includes(t.type);n&&a?(i.removeAttribute(s),ke(e.play())):!a&&e.playing&&(i.setAttribute(s,""),e.pause())}),Ve.isIos){const t=oe.call(e,'input[type="range"]');Array.from(t).forEach(e=>this.bind(e,i,e=>B(e.target)))}this.bind(t.inputs.seek,i,t=>{const i=t.currentTarget;let s=i.getAttribute("seek-value");j.empty(s)&&(s=i.value),i.removeAttribute("seek-value"),e.currentTime=s/i.max*e.duration},"seek"),this.bind(t.progress,"mouseenter mouseleave mousemove",t=>lt.updateSeekTooltip.call(e,t)),this.bind(t.progress,"mousemove touchmove",t=>{const{previewThumbnails:i}=e;i&&i.loaded&&i.startMove(t)}),this.bind(t.progress,"mouseleave touchend click",()=>{const{previewThumbnails:t}=e;t&&t.loaded&&t.endMove(!1,!0)}),this.bind(t.progress,"mousedown touchstart",t=>{const{previewThumbnails:i}=e;i&&i.loaded&&i.startScrubbing(t)}),this.bind(t.progress,"mouseup touchend",t=>{const{previewThumbnails:i}=e;i&&i.loaded&&i.endScrubbing(t)}),Ve.isWebKit&&Array.from(oe.call(e,'input[type="range"]')).forEach(t=>{this.bind(t,"input",t=>lt.updateRangeFill.call(e,t.target))}),e.config.toggleInvert&&!j.element(t.display.duration)&&this.bind(t.display.currentTime,"click",()=>{0!==e.currentTime&&(e.config.invertTime=!e.config.invertTime,lt.timeUpdate.call(e))}),this.bind(t.inputs.volume,i,t=>{e.volume=t.target.value},"volume"),this.bind(t.controls,"mouseenter mouseleave",i=>{t.controls.hover=!e.touch&&"mouseenter"===i.type}),t.fullscreen&&Array.from(t.fullscreen.children).filter(e=>!e.contains(t.container)).forEach(i=>{this.bind(i,"mouseenter mouseleave",i=>{t.controls&&(t.controls.hover=!e.touch&&"mouseenter"===i.type)})}),this.bind(t.controls,"mousedown mouseup touchstart touchend touchcancel",e=>{t.controls.pressed=["mousedown","touchstart"].includes(e.type)}),this.bind(t.controls,"focusin",()=>{const{config:i,timers:s}=e;se(t.controls,i.classNames.noTransition,!0),St.toggleControls.call(e,!0),setTimeout(()=>{se(t.controls,i.classNames.noTransition,!1)},0);const n=this.touch?3e3:4e3;clearTimeout(s.controls),s.controls=setTimeout(()=>St.toggleControls.call(e,!1),n)}),this.bind(t.inputs.volume,"wheel",t=>{const i=t.webkitDirectionInvertedFromDevice,[s,n]=[t.deltaX,-t.deltaY].map(e=>i?-e:e),a=Math.sign(Math.abs(s)>Math.abs(n)?s:n);e.increaseVolume(a/50);const{volume:r}=e.media;(1===a&&r<1||-1===a&&r>0)&&t.preventDefault()},"volume",!1)}),this.player=e,this.lastKey=null,this.focusTimer=null,this.lastKeyDown=null,this.handleKey=this.handleKey.bind(this),this.toggleMenu=this.toggleMenu.bind(this),this.firstTouch=this.firstTouch.bind(this)}handleKey(e){const{player:t}=this,{elements:i}=t,{key:s,type:n,altKey:a,ctrlKey:r,metaKey:o,shiftKey:l}=e,c="keydown"===n,h=c&&s===this.lastKey;if(a||r||o||l)return;if(!s)return;const d=e=>{t.currentTime=t.duration/10*e};if(c){const n=document.activeElement;if(j.element(n)){const{editable:s}=t.config.selectors,{seek:a}=i.inputs;if(n!==a&&ae(n,s))return;if(" "===e.key&&ae(n,'button, [role^="menuitem"]'))return}const a=[" ","ArrowLeft","ArrowUp","ArrowRight","ArrowDown","0","1","2","3","4","5","6","7","8","9","c","f","k","l","m"];switch(a.includes(s)&&(e.preventDefault(),e.stopPropagation()),s){case"0":case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":h||d(Number.parseInt(s,10));break;case" ":case"k":h||ke(t.togglePlay());break;case"ArrowUp":t.increaseVolume(.1);break;case"ArrowDown":t.decreaseVolume(.1);break;case"m":h||(t.muted=!t.muted);break;case"ArrowRight":t.forward();break;case"ArrowLeft":t.rewind();break;case"f":t.fullscreen.toggle();break;case"c":h||t.toggleCaptions();break;case"l":t.loop=!t.loop;break;default:break}"Escape"===s&&!t.fullscreen.usingNative&&t.fullscreen.active&&t.fullscreen.toggle(),this.lastKey=s}else this.lastKey=null}toggleMenu(e){lt.toggleMenu.call(this.player,e)}}var Et=xt,Mt=i(1583);function Lt(e){return new Promise((t,i)=>{Mt(e,{success:t,error:i})})}function Pt(e){if(j.empty(e))return null;if(j.number(Number(e)))return e;const t=/^.*(vimeo.com\/|video\/)(\d+).*/,i=e.match(t);return i?i[2]:e}function It(e){const t=/^.*(vimeo.com\/|video\/)(\d+)(\?.*h=|\/)+([\d,a-f]+)/,i=e.match(t);return i&&5===i.length?i[4]:null}function $t(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,be.call(this,this.media,e?"play":"pause"))}const Nt={setup(){const e=this;se(e.elements.wrapper,e.config.classNames.embed,!0),e.options.speed=e.config.speed.options,Le.call(e),j.object(window.Vimeo)?Nt.ready.call(e):Lt(e.config.urls.vimeo.sdk).then(()=>{Nt.ready.call(e)}).catch(t=>{e.debug.warn("Vimeo SDK (player.js) failed to load",t)})},ready(){const e=this,t=e.config.vimeo,{premium:i,referrerPolicy:s,...n}=t;let a=e.media.getAttribute("src"),r="";j.empty(a)?(a=e.media.getAttribute(e.config.attributes.embed.id),r=e.media.getAttribute(e.config.attributes.embed.hash)):r=It(a);const o=r?{h:r}:{};i&&Object.assign(n,{controls:!1,sidedock:!1});const l=ht({loop:e.config.loop.active,autoplay:e.autoplay,muted:e.muted,gesture:"media",playsinline:e.config.playsinline,...o,...n}),c=Pt(a),h=Y("iframe"),d=qe(e.config.urls.vimeo.iframe,c,l);if(h.setAttribute("src",d),h.setAttribute("allowfullscreen",""),h.setAttribute("allow",["autoplay","fullscreen","picture-in-picture","encrypted-media","accelerometer","gyroscope"].join("; ")),j.empty(s)||h.setAttribute("referrerPolicy",s),i||!t.customControls)h.setAttribute("data-poster",e.poster),e.media=ee(h,e.media);else{const t=Y("div",{class:e.config.classNames.embedContainer,"data-poster":e.poster});t.appendChild(h),e.media=ee(t,e.media)}t.customControls||tt(qe(e.config.urls.vimeo.api,d)).then(t=>{!j.empty(t)&&t.thumbnail_url&&St.setPoster.call(e,t.thumbnail_url).catch(()=>{})}),e.embed=new window.Vimeo.Player(h,{autopause:e.config.autopause,muted:e.muted}),e.media.paused=!0,e.media.currentTime=0,e.supported.ui&&e.embed.disableTextTrack(),e.media.play=()=>($t.call(e,!0),e.embed.play()),e.media.pause=()=>($t.call(e,!1),e.embed.pause()),e.media.stop=()=>{e.pause(),e.currentTime=0};let{currentTime:u}=e.media;Object.defineProperty(e.media,"currentTime",{get(){return u},set(t){const{embed:i,media:s,paused:n,volume:a}=e,r=n&&!i.hasPlayed;s.seeking=!0,be.call(e,s,"seeking"),Promise.resolve(r&&i.setVolume(0)).then(()=>i.setCurrentTime(t)).then(()=>r&&i.pause()).then(()=>r&&i.setVolume(a)).catch(()=>{})}});let p=e.config.speed.selected;Object.defineProperty(e.media,"playbackRate",{get(){return p},set(t){e.embed.setPlaybackRate(t).then(()=>{p=t,be.call(e,e.media,"ratechange")}).catch(()=>{e.options.speed=[1]})}});let{volume:m}=e.config;Object.defineProperty(e.media,"volume",{get(){return m},set(t){e.embed.setVolume(t).then(()=>{m=t,be.call(e,e.media,"volumechange")})}});let{muted:g}=e.config;Object.defineProperty(e.media,"muted",{get(){return g},set(t){const i=!!j.boolean(t)&&t;e.embed.setMuted(!!i||e.config.muted).then(()=>{g=i,be.call(e,e.media,"volumechange")})}});let f,{loop:y}=e.config;Object.defineProperty(e.media,"loop",{get(){return y},set(t){const i=j.boolean(t)?t:e.config.loop.active;e.embed.setLoop(i).then(()=>{y=i})}}),e.embed.getVideoUrl().then(t=>{f=t,lt.setDownloadUrl.call(e)}).catch(e=>{this.debug.warn(e)}),Object.defineProperty(e.media,"currentSrc",{get(){return f}}),Object.defineProperty(e.media,"ended",{get(){return e.currentTime===e.duration}}),Promise.all([e.embed.getVideoWidth(),e.embed.getVideoHeight()]).then(t=>{const[i,s]=t;e.embed.ratio=Pe(i,s),Le.call(this)}),e.embed.setAutopause(e.config.autopause).then(t=>{e.config.autopause=t}),e.embed.getVideoTitle().then(t=>{e.config.title=t,St.setTitle.call(this)}),e.embed.getCurrentTime().then(t=>{u=t,be.call(e,e.media,"timeupdate")}),e.embed.getDuration().then(t=>{e.media.duration=t,be.call(e,e.media,"durationchange")}),e.embed.getTextTracks().then(t=>{e.media.textTracks=t,ut.setup.call(e)}),e.embed.on("cuechange",({cues:t=[]})=>{const i=t.map(e=>Ke(e.text));ut.updateCues.call(e,i)}),e.embed.on("loaded",()=>{if(e.embed.getPaused().then(t=>{$t.call(e,!t),t||be.call(e,e.media,"playing")}),j.element(e.embed.element)&&e.supported.ui){const t=e.embed.element;t.setAttribute("tabindex",-1)}}),e.embed.on("bufferstart",()=>{be.call(e,e.media,"waiting")}),e.embed.on("bufferend",()=>{be.call(e,e.media,"playing")}),e.embed.on("play",()=>{$t.call(e,!0),be.call(e,e.media,"playing")}),e.embed.on("pause",()=>{$t.call(e,!1)}),e.embed.on("timeupdate",t=>{e.media.seeking=!1,u=t.seconds,be.call(e,e.media,"timeupdate")}),e.embed.on("progress",t=>{e.media.buffered=t.percent,be.call(e,e.media,"progress"),1===Number.parseInt(t.percent,10)&&be.call(e,e.media,"canplaythrough"),e.embed.getDuration().then(t=>{t!==e.media.duration&&(e.media.duration=t,be.call(e,e.media,"durationchange"))})}),e.embed.on("seeked",()=>{e.media.seeking=!1,be.call(e,e.media,"seeked")}),e.embed.on("ended",()=>{e.media.paused=!0,be.call(e,e.media,"ended")}),e.embed.on("error",t=>{e.media.error=t,be.call(e,e.media,"error")}),t.customControls&&setTimeout(()=>St.build.call(e),0)}};var Dt=Nt;function Ft(e){if(j.empty(e))return null;const t=/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/,i=e.match(t);return i&&i[2]?i[2]:e}function _t(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,be.call(this,this.media,e?"play":"pause"))}function Rt(e){return e.noCookie?"https://www.youtube-nocookie.com":"http:"===window.location.protocol?"http://www.youtube.com":void 0}const Ot={setup(){if(se(this.elements.wrapper,this.config.classNames.embed,!0),j.object(window.YT)&&j.function(window.YT.Player))Ot.ready.call(this);else{const e=window.onYouTubeIframeAPIReady;window.onYouTubeIframeAPIReady=()=>{j.function(e)&&e(),Ot.ready.call(this)},Lt(this.config.urls.youtube.sdk).catch(e=>{this.debug.warn("YouTube API failed to load",e)})}},getTitle(e){const t=qe(this.config.urls.youtube.api,e);tt(t).then(e=>{if(j.object(e)){const{title:t,height:i,width:s}=e;this.config.title=t,St.setTitle.call(this),this.embed.ratio=Pe(s,i)}Le.call(this)}).catch(()=>{Le.call(this)})},ready(){const e=this,t=e.config.youtube,i=e.media&&e.media.getAttribute("id");if(!j.empty(i)&&i.startsWith("youtube-"))return;let s=e.media.getAttribute("src");j.empty(s)&&(s=e.media.getAttribute(this.config.attributes.embed.id));const n=Ft(s),a=je(e.provider),r=Y("div",{id:a,"data-poster":t.customControls?e.poster:void 0});if(e.media=ee(r,e.media),t.customControls){const t=e=>`https://i.ytimg.com/vi/${n}/${e}default.jpg`;Ct(t("maxres"),121).catch(()=>Ct(t("sd"),121)).catch(()=>Ct(t("hq"))).then(t=>St.setPoster.call(e,t.src)).then(t=>{t.includes("maxres")||(e.elements.poster.style.backgroundSize="cover")}).catch(()=>{})}e.embed=new window.YT.Player(e.media,{videoId:n,host:Rt(t),playerVars:z({},{autoplay:e.config.autoplay?1:0,hl:e.config.hl,controls:e.supported.ui&&t.customControls?0:1,disablekb:1,playsinline:e.config.playsinline&&!e.config.fullscreen.iosNative?1:0,cc_load_policy:e.captions.active?1:0,cc_lang_pref:e.config.captions.language,widget_referrer:window?window.location.href:null},t),events:{onError(t){if(!e.media.error){const i=t.data,s={2:"The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.",5:"The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.",100:"The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.",101:"The owner of the requested video does not allow it to be played in embedded players.",150:"The owner of the requested video does not allow it to be played in embedded players."}[i]||"An unknown error occurred";e.media.error={code:i,message:s},be.call(e,e.media,"error")}},onPlaybackRateChange(t){const i=t.target;e.media.playbackRate=i.getPlaybackRate(),be.call(e,e.media,"ratechange")},onReady(i){if(j.function(e.media.play))return;const s=i.target;Ot.getTitle.call(e,n),e.media.play=()=>{_t.call(e,!0),s.playVideo()},e.media.pause=()=>{_t.call(e,!1),s.pauseVideo()},e.media.stop=()=>{s.stopVideo()},e.media.duration=s.getDuration(),e.media.paused=!0,e.media.currentTime=0,Object.defineProperty(e.media,"currentTime",{get(){return Number(s.getCurrentTime())},set(t){e.paused&&!e.embed.hasPlayed&&e.embed.mute(),e.media.seeking=!0,be.call(e,e.media,"seeking"),s.seekTo(t)}}),Object.defineProperty(e.media,"playbackRate",{get(){return s.getPlaybackRate()},set(e){s.setPlaybackRate(e)}});let{volume:a}=e.config;Object.defineProperty(e.media,"volume",{get(){return a},set(t){a=t,s.setVolume(100*a),be.call(e,e.media,"volumechange")}});let{muted:r}=e.config;Object.defineProperty(e.media,"muted",{get(){return r},set(t){const i=j.boolean(t)?t:r;r=i,s[i?"mute":"unMute"](),s.setVolume(100*a),be.call(e,e.media,"volumechange")}}),Object.defineProperty(e.media,"currentSrc",{get(){return s.getVideoUrl()}}),Object.defineProperty(e.media,"ended",{get(){return e.currentTime===e.duration}});const o=s.getAvailablePlaybackRates();e.options.speed=o.filter(t=>e.config.speed.options.includes(t)),e.supported.ui&&t.customControls&&e.media.setAttribute("tabindex",-1),be.call(e,e.media,"timeupdate"),be.call(e,e.media,"durationchange"),clearInterval(e.timers.buffering),e.timers.buffering=setInterval(()=>{e.media.buffered=s.getVideoLoadedFraction(),(null===e.media.lastBuffered||e.media.lastBufferedSt.build.call(e),50)},onStateChange(i){const s=i.target;clearInterval(e.timers.playing);const n=e.media.seeking&&[1,2].includes(i.data);switch(n&&(e.media.seeking=!1,be.call(e,e.media,"seeked")),i.data){case-1:be.call(e,e.media,"timeupdate"),e.media.buffered=s.getVideoLoadedFraction(),be.call(e,e.media,"progress");break;case 0:_t.call(e,!1),e.media.loop?(s.stopVideo(),s.playVideo()):be.call(e,e.media,"ended");break;case 1:t.customControls&&!e.config.autoplay&&e.media.paused&&!e.embed.hasPlayed?e.media.pause():(_t.call(e,!0),be.call(e,e.media,"playing"),e.timers.playing=setInterval(()=>{be.call(e,e.media,"timeupdate")},50),e.media.duration!==s.getDuration()&&(e.media.duration=s.getDuration(),be.call(e,e.media,"durationchange")));break;case 2:e.muted||e.embed.unMute(),_t.call(e,!1);break;case 3:be.call(e,e.media,"waiting");break;default:break}be.call(e,e.elements.container,"statechange",!1,{code:i.data})}}})}};var Ht=Ot;const Vt={setup(){this.media?(se(this.elements.container,this.config.classNames.type.replace("{0}",this.type),!0),se(this.elements.container,this.config.classNames.provider.replace("{0}",this.provider),!0),this.isEmbed&&se(this.elements.container,this.config.classNames.type.replace("{0}","video"),!0),this.isVideo&&(this.elements.wrapper=Y("div",{class:this.config.classNames.video}),W(this.media,this.elements.wrapper),this.elements.poster=Y("div",{class:this.config.classNames.poster}),this.elements.wrapper.appendChild(this.elements.poster)),this.isHTML5?Ne.setup.call(this):this.isYouTube?Ht.setup.call(this):this.isVimeo&&Dt.setup.call(this)):this.debug.warn("No media element found!")}};var jt=Vt;function qt(e){e.manager&&e.manager.destroy(),e.elements.displayContainer&&e.elements.displayContainer.destroy(),e.elements.container.remove()}class Bt{constructor(e){(0,v.A)(this,"load",()=>{this.enabled&&(j.object(window.google)&&j.object(window.google.ima)?this.ready():Lt(this.player.config.urls.googleIMA.sdk).then(()=>{this.ready()}).catch(()=>{this.trigger("error",new Error("Google IMA SDK failed to load"))}))}),(0,v.A)(this,"ready",()=>{this.enabled||qt(this),this.startSafetyTimer(12e3,"ready()"),this.managerPromise.then(()=>{this.clearSafetyTimer("onAdsManagerLoaded()")}),this.listeners(),this.setupIMA()}),(0,v.A)(this,"setupIMA",()=>{this.elements.container=Y("div",{class:this.player.config.classNames.ads}),this.player.elements.container.appendChild(this.elements.container),google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED),google.ima.settings.setLocale(this.player.config.ads.language),google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline),this.elements.displayContainer=new google.ima.AdDisplayContainer(this.elements.container,this.player.media),this.loader=new google.ima.AdsLoader(this.elements.displayContainer),this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,e=>this.onAdsManagerLoaded(e),!1),this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,e=>this.onAdError(e),!1),this.requestAds()}),(0,v.A)(this,"requestAds",()=>{const{container:e}=this.player.elements;try{const t=new google.ima.AdsRequest;t.adTagUrl=this.tagUrl,t.linearAdSlotWidth=e.offsetWidth,t.linearAdSlotHeight=e.offsetHeight,t.nonLinearAdSlotWidth=e.offsetWidth,t.nonLinearAdSlotHeight=e.offsetHeight,t.forceNonLinearFullSlot=!1,t.setAdWillPlayMuted(!this.player.muted),this.loader.requestAds(t)}catch(t){this.onAdError(t)}}),(0,v.A)(this,"pollCountdown",(e=!1)=>{if(!e)return clearInterval(this.countdownTimer),void this.elements.container.removeAttribute("data-badge-text");const t=()=>{const e=rt(Math.max(this.manager.getRemainingTime(),0)),t=`${Ge.get("advertisement",this.player.config)} - ${e}`;this.elements.container.setAttribute("data-badge-text",t)};this.countdownTimer=setInterval(t,100)}),(0,v.A)(this,"onAdsManagerLoaded",e=>{if(!this.enabled)return;const t=new google.ima.AdsRenderingSettings;t.restoreCustomPlaybackStateOnAdBreakComplete=!0,t.enablePreloading=!0,this.manager=e.getAdsManager(this.player,t),this.cuePoints=this.manager.getCuePoints(),this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,e=>this.onAdError(e)),Object.keys(google.ima.AdEvent.Type).forEach(e=>{this.manager.addEventListener(google.ima.AdEvent.Type[e],e=>this.onAdEvent(e))}),this.trigger("loaded")}),(0,v.A)(this,"addCuePoints",()=>{j.empty(this.cuePoints)||this.cuePoints.forEach(e=>{if(0!==e&&-1!==e&&e{const{container:t}=this.player.elements,i=e.getAd(),s=e.getAdData(),n=e=>{be.call(this.player,this.player.media,`ads${e.replace(/_/g,"").toLowerCase()}`)};switch(n(e.type),e.type){case google.ima.AdEvent.Type.LOADED:this.trigger("loaded"),this.pollCountdown(!0),i.isLinear()||(i.width=t.offsetWidth,i.height=t.offsetHeight);break;case google.ima.AdEvent.Type.STARTED:this.manager.setVolume(this.player.volume);break;case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:this.player.ended?this.loadAds():this.loader.contentComplete();break;case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:this.pauseContent();break;case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:this.pollCountdown(),this.resumeContent();break;case google.ima.AdEvent.Type.LOG:s.adError&&this.player.debug.warn(`Non-fatal ad error: ${s.adError.getMessage()}`);break;default:break}}),(0,v.A)(this,"onAdError",e=>{this.cancel(),this.player.debug.warn("Ads error",e)}),(0,v.A)(this,"listeners",()=>{const{container:e}=this.player.elements;let t;this.player.on("canplay",()=>{this.addCuePoints()}),this.player.on("ended",()=>{this.loader.contentComplete()}),this.player.on("timeupdate",()=>{t=this.player.currentTime}),this.player.on("seeked",()=>{const e=this.player.currentTime;j.empty(this.cuePoints)||this.cuePoints.forEach((i,s)=>{t{this.manager&&this.manager.resize(e.offsetWidth,e.offsetHeight,google.ima.ViewMode.NORMAL)})}),(0,v.A)(this,"play",()=>{const{container:e}=this.player.elements;this.managerPromise||this.resumeContent(),this.managerPromise.then(()=>{this.manager.setVolume(this.player.volume),this.elements.displayContainer.initialize();try{this.initialized||(this.manager.init(e.offsetWidth,e.offsetHeight,google.ima.ViewMode.NORMAL),this.manager.start()),this.initialized=!0}catch(t){this.onAdError(t)}}).catch(()=>{})}),(0,v.A)(this,"resumeContent",()=>{this.elements.container.style.zIndex="",this.playing=!1,ke(this.player.media.play())}),(0,v.A)(this,"pauseContent",()=>{this.elements.container.style.zIndex=3,this.playing=!0,this.player.media.pause()}),(0,v.A)(this,"cancel",()=>{this.initialized&&this.resumeContent(),this.trigger("error"),this.loadAds()}),(0,v.A)(this,"loadAds",()=>{this.managerPromise.then(()=>{this.manager&&this.manager.destroy(),this.managerPromise=new Promise(e=>{this.on("loaded",e),this.player.debug.log(this.manager)}),this.initialized=!1,this.requestAds()}).catch(()=>{})}),(0,v.A)(this,"trigger",(e,...t)=>{const i=this.events[e];j.array(i)&&i.forEach(e=>{j.function(e)&&e.apply(this,t)})}),(0,v.A)(this,"on",(e,t)=>(j.array(this.events[e])||(this.events[e]=[]),this.events[e].push(t),this)),(0,v.A)(this,"startSafetyTimer",(e,t)=>{this.player.debug.log(`Safety timer invoked from: ${t}`),this.safetyTimer=setTimeout(()=>{this.cancel(),this.clearSafetyTimer("startSafetyTimer()")},e)}),(0,v.A)(this,"clearSafetyTimer",e=>{j.nullOrUndefined(this.safetyTimer)||(this.player.debug.log(`Safety timer cleared from: ${e}`),clearTimeout(this.safetyTimer),this.safetyTimer=null)}),this.player=e,this.config=e.config.ads,this.playing=!1,this.initialized=!1,this.elements={container:null,displayContainer:null},this.manager=null,this.loader=null,this.cuePoints=null,this.events={},this.safetyTimer=null,this.countdownTimer=null,this.managerPromise=new Promise((e,t)=>{this.on("loaded",e),this.on("error",t)}),this.load()}get enabled(){const{config:e}=this;return this.player.isHTML5&&this.player.isVideo&&e.enabled&&(!j.empty(e.publisherId)||j.url(e.tagUrl))}get tagUrl(){const{config:e}=this;if(j.url(e.tagUrl))return e.tagUrl;const t={AV_PUBLISHERID:"58c25bb0073ef448b1087ad6",AV_CHANNELID:"5a0458dc28a06145e4519d21",AV_URL:window.location.hostname,cb:Date.now(),AV_WIDTH:640,AV_HEIGHT:480,AV_CDIM2:e.publisherId},i="https://go.aniview.com/api/adserver6/vast/";return`${i}?${ht(t)}`}}var Ut=Bt;function Xt(e=0,t=0,i=255){return Math.min(Math.max(e,t),i)}function zt(e){const t=[],i=e.split(/\r\n\r\n|\n\n|\r\r/);return i.forEach(e=>{const i={},s=e.split(/\r\n|\n|\r/);s.forEach(e=>{if(j.number(i.startTime)){if(!j.empty(e.trim())&&j.empty(i.text)){const t=e.trim().split("#xywh=");[i.text]=t,t[1]&&([i.x,i.y,i.w,i.h]=t[1].split(","))}}else{const t=e.match(/(\d{2})?:?(\d{2}):(\d{2}).(\d{2,3})( ?--> ?)(\d{2})?:?(\d{2}):(\d{2}).(\d{2,3})/);t&&(i.startTime=60*Number(t[1]||0)*60+60*Number(t[2])+Number(t[3])+Number(`0.${t[4]}`),i.endTime=60*Number(t[6]||0)*60+60*Number(t[7])+Number(t[8])+Number(`0.${t[9]}`))}}),i.text&&t.push(i)}),t}function Wt(e,t){const i=t.width/t.height,s={};return e>i?(s.width=t.width,s.height=1/e*t.width):(s.height=t.height,s.width=e*t.height),s}class Kt{constructor(e){(0,v.A)(this,"load",()=>{this.player.elements.display.seekTooltip&&(this.player.elements.display.seekTooltip.hidden=this.enabled),this.enabled&&this.getThumbnails().then(()=>{this.enabled&&(this.render(),this.determineContainerAutoSizing(),this.listeners(),this.loaded=!0)})}),(0,v.A)(this,"getThumbnails",()=>new Promise(e=>{const{src:t}=this.player.config.previewThumbnails;if(j.empty(t))throw new Error("Missing previewThumbnails.src config attribute");const i=()=>{this.thumbnails.sort((e,t)=>e.height-t.height),this.player.debug.log("Preview thumbnails",this.thumbnails),e()};if(j.function(t))t(e=>{this.thumbnails=e,i()});else{const e=j.string(t)?[t]:t,s=e.map(e=>this.getThumbnail(e));Promise.all(s).then(i)}})),(0,v.A)(this,"getThumbnail",e=>new Promise(t=>{tt(e,void 0,this.player.config.previewThumbnails.withCredentials).then(i=>{const s={frames:zt(i),height:null,urlPrefix:""};s.frames[0].text.startsWith("/")||s.frames[0].text.startsWith("http://")||s.frames[0].text.startsWith("https://")||(s.urlPrefix=e.substring(0,e.lastIndexOf("/")+1));const n=new Image;n.onload=()=>{s.height=n.naturalHeight,s.width=n.naturalWidth,this.thumbnails.push(s),t()},n.src=s.urlPrefix+s.frames[0].text})})),(0,v.A)(this,"startMove",e=>{if(this.loaded&&j.event(e)&&["touchmove","mousemove"].includes(e.type)&&this.player.media.duration){if("touchmove"===e.type)this.seekTime=this.player.media.duration*(this.player.elements.inputs.seek.value/100);else{const t=this.player.elements.progress.getBoundingClientRect(),i=100/t.width*(e.pageX-t.left);this.seekTime=this.player.media.duration*(i/100),this.seekTime<0&&(this.seekTime=0),this.seekTime>this.player.media.duration-1&&(this.seekTime=this.player.media.duration-1),this.mousePosX=e.pageX,this.elements.thumb.time.textContent=rt(this.seekTime);const s=this.player.config.markers?.points?.find(({time:e})=>e===Math.round(this.seekTime));s&&this.elements.thumb.time.insertAdjacentHTML("afterbegin",`${s.label}
`)}this.showImageAtCurrentTime()}}),(0,v.A)(this,"endMove",()=>{this.toggleThumbContainer(!1,!0)}),(0,v.A)(this,"startScrubbing",e=>{(j.nullOrUndefined(e.button)||!1===e.button||0===e.button)&&(this.mouseDown=!0,this.player.media.duration&&(this.toggleScrubbingContainer(!0),this.toggleThumbContainer(!1,!0),this.showImageAtCurrentTime()))}),(0,v.A)(this,"endScrubbing",()=>{this.mouseDown=!1,Math.ceil(this.lastTime)===Math.ceil(this.player.media.currentTime)?this.toggleScrubbingContainer(!1):ye.call(this.player,this.player.media,"timeupdate",()=>{this.mouseDown||this.toggleScrubbingContainer(!1)})}),(0,v.A)(this,"listeners",()=>{this.player.on("play",()=>{this.toggleThumbContainer(!1,!0)}),this.player.on("seeked",()=>{this.toggleThumbContainer(!1)}),this.player.on("timeupdate",()=>{this.lastTime=this.player.media.currentTime})}),(0,v.A)(this,"render",()=>{this.elements.thumb.container=Y("div",{class:this.player.config.classNames.previewThumbnails.thumbContainer}),this.elements.thumb.imageContainer=Y("div",{class:this.player.config.classNames.previewThumbnails.imageContainer}),this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer);const e=Y("div",{class:this.player.config.classNames.previewThumbnails.timeContainer});this.elements.thumb.time=Y("span",{},"00:00"),e.appendChild(this.elements.thumb.time),this.elements.thumb.imageContainer.appendChild(e),j.element(this.player.elements.progress)&&this.player.elements.progress.appendChild(this.elements.thumb.container),this.elements.scrubbing.container=Y("div",{class:this.player.config.classNames.previewThumbnails.scrubbingContainer}),this.player.elements.wrapper.appendChild(this.elements.scrubbing.container)}),(0,v.A)(this,"destroy",()=>{this.elements.thumb.container&&this.elements.thumb.container.remove(),this.elements.scrubbing.container&&this.elements.scrubbing.container.remove()}),(0,v.A)(this,"showImageAtCurrentTime",()=>{this.mouseDown?this.setScrubbingContainerSize():this.setThumbContainerSizeAndPos();const e=this.thumbnails[0].frames.findIndex(e=>this.seekTime>=e.startTime&&this.seekTime<=e.endTime),t=e>=0;let i=0;this.mouseDown||this.toggleThumbContainer(t),t&&(this.thumbnails.forEach((t,s)=>{this.loadedImages.includes(t.frames[e].text)&&(i=s)}),e!==this.showingThumb&&(this.showingThumb=e,this.loadImage(i)))}),(0,v.A)(this,"loadImage",(e=0)=>{const t=this.showingThumb,i=this.thumbnails[e],{urlPrefix:s}=i,n=i.frames[t],a=i.frames[t].text,r=s+a;if(this.currentImageElement&&this.currentImageElement.dataset.filename===a)this.showImage(this.currentImageElement,n,e,t,a,!1),this.currentImageElement.dataset.index=t,this.removeOldImages(this.currentImageElement);else{this.loadingImage&&this.usingSprites&&(this.loadingImage.onload=null);const i=new Image;i.src=r,i.dataset.index=t,i.dataset.filename=a,this.showingThumbFilename=a,this.player.debug.log(`Loading image: ${r}`),i.onload=()=>this.showImage(i,n,e,t,a,!0),this.loadingImage=i,this.removeOldImages(i)}}),(0,v.A)(this,"showImage",(e,t,i,s,n,a=!0)=>{this.player.debug.log(`Showing thumb: ${n}. num: ${s}. qual: ${i}. newimg: ${a}`),this.setImageSizeAndOffset(e,t),a&&(this.currentImageContainer.appendChild(e),this.currentImageElement=e,this.loadedImages.includes(n)||this.loadedImages.push(n)),this.preloadNearby(s,!0).then(this.preloadNearby(s,!1)).then(this.getHigherQuality(i,e,t,n))}),(0,v.A)(this,"removeOldImages",e=>{Array.from(this.currentImageContainer.children).forEach(t=>{if("img"!==t.tagName.toLowerCase())return;const i=this.usingSprites?500:1e3;if(t.dataset.index!==e.dataset.index&&!t.dataset.deleting){t.dataset.deleting=!0;const{currentImageContainer:e}=this;setTimeout(()=>{e.removeChild(t),this.player.debug.log(`Removing thumb: ${t.dataset.filename}`)},i)}})}),(0,v.A)(this,"preloadNearby",(e,t=!0)=>new Promise(i=>{setTimeout(()=>{const s=this.thumbnails[0].frames[e].text;if(this.showingThumbFilename===s){let n;n=t?this.thumbnails[0].frames.slice(e):this.thumbnails[0].frames.slice(0,e).reverse();let a=!1;n.forEach(e=>{const t=e.text;if(t!==s&&!this.loadedImages.includes(t)){a=!0,this.player.debug.log(`Preloading thumb filename: ${t}`);const{urlPrefix:e}=this.thumbnails[0],s=e+t,n=new Image;n.src=s,n.onload=()=>{this.player.debug.log(`Preloaded thumb filename: ${t}`),this.loadedImages.includes(t)||this.loadedImages.push(t),i()}}}),a||i()}},300)})),(0,v.A)(this,"getHigherQuality",(e,t,i,s)=>{if(e{this.showingThumbFilename===s&&(this.player.debug.log(`Showing higher quality thumb for: ${s}`),this.loadImage(e+1))},300)}}),(0,v.A)(this,"toggleThumbContainer",(e=!1,t=!1)=>{const i=this.player.config.classNames.previewThumbnails.thumbContainerShown;this.elements.thumb.container.classList.toggle(i,e),!e&&t&&(this.showingThumb=null,this.showingThumbFilename=null)}),(0,v.A)(this,"toggleScrubbingContainer",(e=!1)=>{const t=this.player.config.classNames.previewThumbnails.scrubbingContainerShown;this.elements.scrubbing.container.classList.toggle(t,e),e||(this.showingThumb=null,this.showingThumbFilename=null)}),(0,v.A)(this,"determineContainerAutoSizing",()=>{(this.elements.thumb.imageContainer.clientHeight>20||this.elements.thumb.imageContainer.clientWidth>20)&&(this.sizeSpecifiedInCSS=!0)}),(0,v.A)(this,"setThumbContainerSizeAndPos",()=>{const{imageContainer:e}=this.elements.thumb;if(this.sizeSpecifiedInCSS){if(e.clientHeight>20&&e.clientWidth<20){const t=Math.floor(e.clientHeight*this.thumbAspectRatio);e.style.width=`${t}px`}else if(e.clientHeight<20&&e.clientWidth>20){const t=Math.floor(e.clientWidth/this.thumbAspectRatio);e.style.height=`${t}px`}}else{const t=Math.floor(this.thumbContainerHeight*this.thumbAspectRatio);e.style.height=`${this.thumbContainerHeight}px`,e.style.width=`${t}px`}this.setThumbContainerPos()}),(0,v.A)(this,"setThumbContainerPos",()=>{const e=this.player.elements.progress.getBoundingClientRect(),t=this.player.elements.container.getBoundingClientRect(),{container:i}=this.elements.thumb,s=t.left-e.left+10,n=t.right-e.left-i.clientWidth-10,a=this.mousePosX-e.left-i.clientWidth/2,r=Xt(a,s,n);i.style.left=`${r}px`,i.style.setProperty("--preview-arrow-offset",a-r+"px")}),(0,v.A)(this,"setScrubbingContainerSize",()=>{const{width:e,height:t}=Wt(this.thumbAspectRatio,{width:this.player.media.clientWidth,height:this.player.media.clientHeight});this.elements.scrubbing.container.style.width=`${e}px`,this.elements.scrubbing.container.style.height=`${t}px`}),(0,v.A)(this,"setImageSizeAndOffset",(e,t)=>{if(!this.usingSprites)return;const i=this.thumbContainerHeight/t.h;e.style.height=e.naturalHeight*i+"px",e.style.width=e.naturalWidth*i+"px",e.style.left=`-${t.x*i}px`,e.style.top=`-${t.y*i}px`}),this.player=e,this.thumbnails=[],this.loaded=!1,this.lastMouseMoveTime=Date.now(),this.mouseDown=!1,this.loadedImages=[],this.elements={thumb:{},scrubbing:{}},this.load()}get enabled(){return this.player.isHTML5&&this.player.isVideo&&this.player.config.previewThumbnails.enabled}get currentImageContainer(){return this.mouseDown?this.elements.scrubbing.container:this.elements.thumb.imageContainer}get usingSprites(){return Object.keys(this.thumbnails[0].frames[0]).includes("w")}get thumbAspectRatio(){return this.usingSprites?this.thumbnails[0].frames[0].w/this.thumbnails[0].frames[0].h:this.thumbnails[0].width/this.thumbnails[0].height}get thumbContainerHeight(){if(this.mouseDown){const{height:e}=Wt(this.thumbAspectRatio,{width:this.player.media.clientWidth,height:this.player.media.clientHeight});return e}return this.sizeSpecifiedInCSS?this.elements.thumb.imageContainer.clientHeight:Math.floor(this.player.media.clientWidth/this.thumbAspectRatio/4)}get currentImageElement(){return this.mouseDown?this.currentScrubbingImageElement:this.currentThumbnailImageElement}set currentImageElement(e){this.mouseDown?this.currentScrubbingImageElement=e:this.currentThumbnailImageElement=e}}var Yt=Kt;const Qt={insertElements(e,t){j.string(t)?J(e,this.media,{src:t}):j.array(t)&&t.forEach(t=>{J(e,this.media,t)})},change(e){X(e,"sources.length")?(Ne.cancelRequests.call(this),this.destroy(()=>{this.options.quality=[],G(this.media),this.media=null,j.element(this.elements.container)&&this.elements.container.removeAttribute("class");const{sources:t,type:i}=e,[{provider:s=ft.html5,src:n}]=t,a="html5"===s?i:"div",r="html5"===s?{}:{src:n};Object.assign(this,{provider:s,type:i,supported:ue.check(i,s,this.config.playsinline),media:Y(a,r)}),this.elements.container.appendChild(this.media),j.boolean(e.autoplay)&&(this.config.autoplay=e.autoplay),this.isHTML5&&(this.config.crossorigin&&this.media.setAttribute("crossorigin",""),this.config.autoplay&&this.media.setAttribute("autoplay",""),j.empty(e.poster)||(this.poster=e.poster),this.config.loop.active&&this.media.setAttribute("loop",""),this.config.muted&&this.media.setAttribute("muted",""),this.config.playsinline&&this.media.setAttribute("playsinline","")),St.addStyleHook.call(this),this.isHTML5&&Qt.insertElements.call(this,"source",t),this.config.title=e.title,jt.setup.call(this),this.isHTML5&&Object.keys(e).includes("tracks")&&Qt.insertElements.call(this,"track",e.tracks),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&St.build.call(this),this.isHTML5&&this.media.load(),j.empty(e.previewThumbnails)||(Object.assign(this.config.previewThumbnails,e.previewThumbnails),this.previewThumbnails&&this.previewThumbnails.loaded&&(this.previewThumbnails.destroy(),this.previewThumbnails=null),this.config.previewThumbnails.enabled&&(this.previewThumbnails=new Yt(this))),this.fullscreen.update()},!0)):this.debug.warn("Invalid source format")}};var Jt=Qt;class Gt{constructor(e,t){if((0,v.A)(this,"play",()=>j.function(this.media.play)?(this.ads&&this.ads.enabled&&this.ads.managerPromise.then(()=>this.ads.play()).catch(()=>ke(this.media.play())),this.media.play()):null),(0,v.A)(this,"pause",()=>this.playing&&j.function(this.media.pause)?this.media.pause():null),(0,v.A)(this,"togglePlay",e=>{const t=j.boolean(e)?e:!this.playing;return t?this.play():this.pause()}),(0,v.A)(this,"stop",()=>{this.isHTML5?(this.pause(),this.restart()):j.function(this.media.stop)&&this.media.stop()}),(0,v.A)(this,"restart",()=>{this.currentTime=0}),(0,v.A)(this,"rewind",e=>{this.currentTime-=j.number(e)?e:this.config.seekTime}),(0,v.A)(this,"forward",e=>{this.currentTime+=j.number(e)?e:this.config.seekTime}),(0,v.A)(this,"increaseVolume",e=>{const t=this.media.muted?0:this.volume;this.volume=t+(j.number(e)?e:0)}),(0,v.A)(this,"decreaseVolume",e=>{this.increaseVolume(-e)}),(0,v.A)(this,"airplay",()=>{ue.airplay&&this.media.webkitShowPlaybackTargetPicker()}),(0,v.A)(this,"toggleControls",e=>{if(this.supported.ui&&!this.isAudio){const t=ne(this.elements.container,this.config.classNames.hideControls),i="undefined"===typeof e?void 0:!e,s=se(this.elements.container,this.config.classNames.hideControls,i);if(s&&j.array(this.config.controls)&&this.config.controls.includes("settings")&&!j.empty(this.config.settings)&<.toggleMenu.call(this,!1),s!==t){const e=s?"controlshidden":"controlsshown";be.call(this,this.media,e)}return!s}return!1}),(0,v.A)(this,"on",(e,t)=>{ge.call(this,this.elements.container,e,t)}),(0,v.A)(this,"once",(e,t)=>{ye.call(this,this.elements.container,e,t)}),(0,v.A)(this,"off",(e,t)=>{fe(this.elements.container,e,t)}),(0,v.A)(this,"destroy",(e,t=!1)=>{if(!this.ready)return;const i=()=>{document.body.style.overflow="",this.embed=null,t?(Object.keys(this.elements).length&&(G(this.elements.buttons.play),G(this.elements.captions),G(this.elements.controls),G(this.elements.wrapper),this.elements.buttons.play=null,this.elements.captions=null,this.elements.controls=null,this.elements.wrapper=null),j.function(e)&&e()):(ve.call(this),Ne.cancelRequests.call(this),ee(this.elements.original,this.elements.container),be.call(this,this.elements.original,"destroyed",!0),j.function(e)&&e.call(this.elements.original),this.ready=!1,setTimeout(()=>{this.elements=null,this.media=null},200))};this.stop(),clearTimeout(this.timers.loading),clearTimeout(this.timers.controls),clearTimeout(this.timers.resized),this.isHTML5?(St.toggleNativeControls.call(this,!0),i()):this.isYouTube?(clearInterval(this.timers.buffering),clearInterval(this.timers.playing),null!==this.embed&&j.function(this.embed.destroy)&&this.embed.destroy(),i()):this.isVimeo&&(null!==this.embed&&this.embed.unload().then(i),setTimeout(i,200))}),(0,v.A)(this,"supports",e=>ue.mime.call(this,e)),this.timers={},this.ready=!1,this.loading=!1,this.failed=!1,this.touch=ue.touch,this.media=e,j.string(this.media)&&(this.media=document.querySelectorAll(this.media)),(window.jQuery&&this.media instanceof jQuery||j.nodeList(this.media)||j.array(this.media))&&(this.media=this.media[0]),this.config=z({},mt,Gt.defaults,t||{},(()=>{try{return JSON.parse(this.media.getAttribute("data-plyr-config"))}catch{return{}}})()),this.elements={container:null,fullscreen:null,captions:null,buttons:{},display:{},progress:{},inputs:{},settings:{popup:null,menu:null,panels:{},buttons:{}}},this.captions={active:null,currentTrack:-1,meta:new WeakMap},this.fullscreen={active:!1},this.options={speed:[],quality:[]},this.debug=new wt(this.config.debug),this.debug.log("Config",this.config),this.debug.log("Support",ue),j.nullOrUndefined(this.media)||!j.element(this.media))return void this.debug.error("Setup failed: no suitable element passed");if(this.media.plyr)return void this.debug.warn("Target already setup");if(!this.config.enabled)return void this.debug.error("Setup failed: disabled by config");if(!ue.check().api)return void this.debug.error("Setup failed: no support");const i=this.media.cloneNode(!0);i.autoplay=!1,this.elements.original=i;const s=this.media.tagName.toLowerCase();let n=null,a=null;switch(s){case"div":if(n=this.media.querySelector("iframe"),j.element(n)){if(a=ct(n.getAttribute("src")),this.provider=bt(a.toString()),this.elements.container=this.media,this.media=n,this.elements.container.className="",a.search.length){const e=["1","true"];e.includes(a.searchParams.get("autoplay"))&&(this.config.autoplay=!0),e.includes(a.searchParams.get("loop"))&&(this.config.loop.active=!0),this.isYouTube?(this.config.playsinline=e.includes(a.searchParams.get("playsinline")),this.config.youtube.hl=a.searchParams.get("hl")):this.config.playsinline=!0}}else this.provider=this.media.getAttribute(this.config.attributes.embed.provider),this.media.removeAttribute(this.config.attributes.embed.provider);if(j.empty(this.provider)||!Object.values(ft).includes(this.provider))return void this.debug.error("Setup failed: Invalid provider");this.type=yt.video;break;case"video":case"audio":this.type=s,this.provider=ft.html5,this.media.hasAttribute("crossorigin")&&(this.config.crossorigin=!0),this.media.hasAttribute("autoplay")&&(this.config.autoplay=!0),(this.media.hasAttribute("playsinline")||this.media.hasAttribute("webkit-playsinline"))&&(this.config.playsinline=!0),this.media.hasAttribute("muted")&&(this.config.muted=!0),this.media.hasAttribute("loop")&&(this.config.loop.active=!0);break;default:return void this.debug.error("Setup failed: unsupported type")}this.supported=ue.check(this.type,this.provider),this.supported.api?(this.eventListeners=[],this.listeners=new Et(this),this.storage=new et(this),this.media.plyr=this,j.element(this.elements.container)||(this.elements.container=Y("div"),W(this.media,this.elements.container)),St.migrateStyles.call(this),St.addStyleHook.call(this),jt.setup.call(this),this.config.debug&&ge.call(this,this.elements.container,this.config.events.join(" "),e=>{this.debug.log(`event: ${e.type}`)}),this.fullscreen=new Tt(this),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&St.build.call(this),this.listeners.container(),this.listeners.global(),this.config.ads.enabled&&(this.ads=new Ut(this)),this.isHTML5&&this.config.autoplay&&this.once("canplay",()=>ke(this.play())),this.lastSeekTime=0,this.config.previewThumbnails.enabled&&(this.previewThumbnails=new Yt(this))):this.debug.error("Setup failed: no support")}get isHTML5(){return this.provider===ft.html5}get isEmbed(){return this.isYouTube||this.isVimeo}get isYouTube(){return this.provider===ft.youtube}get isVimeo(){return this.provider===ft.vimeo}get isVideo(){return this.type===yt.video}get isAudio(){return this.type===yt.audio}get playing(){return Boolean(this.ready&&!this.paused&&!this.ended)}get paused(){return Boolean(this.media.paused)}get stopped(){return Boolean(this.paused&&0===this.currentTime)}get ended(){return Boolean(this.media.ended)}set currentTime(e){if(!this.duration)return;const t=j.number(e)&&e>0;this.media.currentTime=t?Math.min(e,this.duration):0,this.debug.log(`Seeking to ${this.currentTime} seconds`)}get currentTime(){return Number(this.media.currentTime)}get buffered(){const{buffered:e}=this.media;return j.number(e)?e:e&&e.length&&this.duration>0?e.end(0)/this.duration:0}get seeking(){return Boolean(this.media.seeking)}get duration(){const e=Number.parseFloat(this.config.duration),t=(this.media||{}).duration,i=j.number(t)&&t!==1/0?t:0;return e||i}set volume(e){let t=e;const i=1,s=0;j.string(t)&&(t=Number(t)),j.number(t)||(t=this.storage.get("volume")),j.number(t)||({volume:t}=this.config),t>i&&(t=i),t0&&(this.muted=!1)}get volume(){return Number(this.media.volume)}set muted(e){let t=e;j.boolean(t)||(t=this.storage.get("muted")),j.boolean(t)||(t=this.config.muted),this.config.muted=t,this.media.muted=t}get muted(){return Boolean(this.media.muted)}get hasAudio(){return!this.isHTML5||(!!this.isAudio||(Boolean(this.media.mozHasAudio)||Boolean(this.media.webkitAudioDecodedByteCount)||Boolean(this.media.audioTracks&&this.media.audioTracks.length)))}set speed(e){let t=null;j.number(e)&&(t=e),j.number(t)||(t=this.storage.get("speed")),j.number(t)||(t=this.config.speed.selected);const{minimumSpeed:i,maximumSpeed:s}=this;t=Xt(t,i,s),this.config.speed.selected=t,setTimeout(()=>{this.media&&(this.media.playbackRate=t)},0)}get speed(){return Number(this.media.playbackRate)}get minimumSpeed(){return this.isYouTube?Math.min(...this.options.speed):this.isVimeo?.5:.0625}get maximumSpeed(){return this.isYouTube?Math.max(...this.options.speed):this.isVimeo?2:16}set quality(e){const t=this.config.quality,i=this.options.quality;if(!i.length)return;let s=[!j.empty(e)&&Number(e),this.storage.get("quality"),t.selected,t.default].find(j.number),n=!0;if(!i.includes(s)){const e=Ce(i,s);this.debug.warn(`Unsupported quality option: ${s}, using ${e} instead`),s=e,n=!1}t.selected=s,this.media.quality=s,n&&this.storage.set({quality:s})}get quality(){return this.media.quality}set loop(e){const t=j.boolean(e)?e:this.config.loop.active;this.config.loop.active=t,this.media.loop=t}get loop(){return Boolean(this.media.loop)}set source(e){Jt.change.call(this,e)}get source(){return this.media.currentSrc}get download(){const{download:e}=this.config.urls;return j.url(e)?e:this.source}set download(e){j.url(e)&&(this.config.urls.download=e,lt.setDownloadUrl.call(this))}set poster(e){this.isVideo?St.setPoster.call(this,e,!1).catch(()=>{}):this.debug.warn("Poster can only be set for video")}get poster(){return this.isVideo?this.media.getAttribute("poster")||this.media.getAttribute("data-poster"):null}get ratio(){if(!this.isVideo)return null;const e=Ee(Me.call(this));return j.array(e)?e.join(":"):e}set ratio(e){this.isVideo?j.string(e)&&xe(e)?(this.config.ratio=Ee(e),Le.call(this)):this.debug.error(`Invalid aspect ratio specified (${e})`):this.debug.warn("Aspect ratio can only be set for video")}set autoplay(e){this.config.autoplay=j.boolean(e)?e:this.config.autoplay}get autoplay(){return Boolean(this.config.autoplay)}toggleCaptions(e){ut.toggle.call(this,e,!1)}set currentTrack(e){ut.set.call(this,e,!1),ut.setup.call(this)}get currentTrack(){const{toggled:e,currentTrack:t}=this.captions;return e?t:-1}set language(e){ut.setLanguage.call(this,e,!1)}get language(){return(ut.getCurrentTrack.call(this)||{}).language}set pip(e){if(!ue.pip)return;const t=j.boolean(e)?e:!this.pip;j.function(this.media.webkitSetPresentationMode)&&this.media.webkitSetPresentationMode(t?gt.active:gt.inactive),j.function(this.media.requestPictureInPicture)&&(!this.pip&&t?this.media.requestPictureInPicture():this.pip&&!t&&document.exitPictureInPicture())}get pip(){return ue.pip?j.empty(this.media.webkitPresentationMode)?this.media===document.pictureInPictureElement:this.media.webkitPresentationMode===gt.active:null}setPreviewThumbnails(e){this.previewThumbnails&&this.previewThumbnails.loaded&&(this.previewThumbnails.destroy(),this.previewThumbnails=null),Object.assign(this.config.previewThumbnails,e),this.config.previewThumbnails.enabled&&(this.previewThumbnails=new Yt(this))}static supported(e,t){return ue.check(e,t)}static loadSprite(e,t){return it(e,t)}static setup(e,t={}){let i=null;return j.string(e)?i=Array.from(document.querySelectorAll(e)):j.nodeList(e)?i=Array.from(e):j.array(e)&&(i=e.filter(j.element)),j.empty(i)?null:i.map(e=>new Gt(e,t))}}Gt.defaults=U(mt);var Zt=Gt;i(7642),i(8004),i(3853),i(5876),i(2475),i(5024),i(1698);const ei=new Set;let ti=null,ii="stop";function si(e){return e&&("AUDIO"===e.tagName||"VIDEO"===e.tagName)}function ni(e){if(si(e)){try{e.pause()}catch(t){}try{e.currentTime=0}catch(t){}try{e.removeAttribute("src")}catch(t){}try{e.load?.()}catch(t){}}}function ai(e=null){for(const t of ei)e&&t===e||ni(t);ti=e||null}let ri=!1;function oi(){ri||(ri=!0,document.addEventListener("visibilitychange",()=>{document.hidden&&ai(null)}),window.addEventListener("pagehide",()=>ai(null)))}function li(){return ii}function ci(e){["stop","sequence","loop"].includes(e)&&(ii=e)}var hi={name:"TransformMedia",props:{file:{type:Object,required:!0},src:{type:String,required:!0},isImage:{type:Boolean,default:!0},isVideo:{type:Boolean,default:!1},isAudio:{type:Boolean,default:!1},isActive:{type:Boolean,default:!1}},data(){return{pointers:new Map,scale:1,rotation:0,rotatePreview:0,tx:0,ty:0,naturalWidth:0,naturalHeight:0,startScale:1,startRotation:0,startTx:0,startTy:0,startCenter:null,startDist:0,startAngle:0,dragging:!1,dragStart:null,viewportRect:null,minScale:1,maxScale:4,gestureMode:null,edgeOverflow:0,edgeDir:0,player:null,audioCover:null,audioTitle:"",audioArtist:"",menuAdded:!1}},computed:{isActiveTransform(){return this.scale>1.001||this.pointers.size>=2||this.dragging},displayRotation(){return this.rotation+this.rotatePreview},rotateShrink(){const e=Math.min(1,Math.abs(this.rotatePreview)/90),t=Math.sin(Math.PI*e);return 1-.12*t},mediaStyle(){const e=this.scale*this.rotateShrink,t=this.pointers.size>0;return{transform:`translate3d(${this.tx}px, ${this.ty}px, 0) scale(${e}) rotate(${this.displayRotation}deg)`,transition:t?"none":"transform 0.25s ease",transformOrigin:"center center"}}},watch:{isActiveTransform(e){this.$emit(e?"lock":"unlock")},isActive(e){e?this.$nextTick(()=>this.initPlayer()):this.destroyPlayer()}},mounted(){this.isAudio&&this.initAudioInfo(),this.isActive&&this.$nextTick(()=>this.initPlayer())},beforeUnmount(){this.destroyPlayer(),this.audioCover&&(URL.revokeObjectURL(this.audioCover),this.audioCover=null)},methods:{initPlayer(){if(this.player)return;const e=this.$refs.videoEl||this.$refs.audioEl;if(!e)return;this.retryCount=0,this.maxRetries=3;const t=this.isAudio?["play","progress","current-time","mute","volume"]:["play","progress","current-time","mute","volume","fullscreen"];this.player=new Zt(e,{controls:t,autoplay:this.isVideo,resetOnEnd:!0}),e.addEventListener("error",()=>{this.retryCount{if(e&&this.src&&this.player){const t=this.src.split("?_retry=")[0],i=t+(t.includes("?")?"&":"?")+"_retry="+Date.now();e.src=i,e.load()}},500*this.retryCount))}),this.player.on("ready",()=>{this.tryAddCustomMenu()}),this.scheduleMenuRetry(),this.isAudio&&this.player.on("ended",this.onAudioEnded)},scheduleMenuRetry(){const e=t=>{t>=5||this.menuAdded||setTimeout(()=>{this.menuAdded||(this.tryAddCustomMenu(),e(t+1))},200*(t+1))};e(0)},tryAddCustomMenu(){if(this.menuAdded)return;if(!this.player?.elements?.controls)return;const e=this.player.elements.controls;e&&!e.querySelector(".plyr-custom-menu")&&(this.addCustomMenu(e),this.menuAdded=!0)},addCustomMenu(e){const t=li(),i=this.isAudio?`\n

\n
\n
播完停止
\n
顺序播放
\n
单曲循环
\n
\n `:"",s=document.createElement("div");s.className="plyr-custom-menu",s.innerHTML=`\n \n
\n
\n \n \n \n 下载\n
\n
\n \n \n \n \n 播放速度\n \n \n \n
\n
\n
0.5x
\n
0.75x
\n
正常
\n
1.25x
\n
1.5x
\n
2x
\n
\n ${i}\n
\n `,e.appendChild(s),this.bindMenuEvents(s)},bindMenuEvents(e){const t=e.querySelector(".plyr-menu-btn"),i=e.querySelector(".plyr-menu-dropdown"),s=e.querySelector(".plyr-menu-speed"),n=e.querySelector(".plyr-speed-submenu"),a=e.querySelector('[data-action="download"]'),r=e.querySelector(".plyr-menu-playmode"),o=e.querySelector(".plyr-playmode-submenu");t.addEventListener("click",e=>{e.stopPropagation(),i.classList.toggle("show"),n.classList.remove("show"),o&&o.classList.remove("show")}),a.addEventListener("click",()=>{this.downloadMedia(),i.classList.remove("show")}),s.addEventListener("click",e=>{e.stopPropagation(),n.classList.toggle("show"),o&&o.classList.remove("show")}),e.querySelectorAll(".plyr-speed-option").forEach(t=>{t.addEventListener("click",()=>{const s=parseFloat(t.dataset.speed);this.player?.media&&(this.player.media.playbackRate=s),e.querySelectorAll(".plyr-speed-option").forEach(e=>e.classList.remove("active")),t.classList.add("active"),i.classList.remove("show"),n.classList.remove("show")})}),r&&o&&(r.addEventListener("click",e=>{e.stopPropagation(),o.classList.toggle("show"),n.classList.remove("show")}),e.querySelectorAll(".plyr-playmode-option").forEach(t=>{t.addEventListener("click",()=>{const s=t.dataset.mode;ci(s),e.querySelectorAll(".plyr-playmode-option").forEach(e=>e.classList.remove("active")),t.classList.add("active"),i.classList.remove("show"),o.classList.remove("show")})})),document.addEventListener("click",()=>{i.classList.remove("show"),n.classList.remove("show"),o&&o.classList.remove("show")})},downloadMedia(){const e=document.createElement("a");e.href=this.src,e.download=this.file?.name?.split("/").pop()||"download",e.click()},onAudioEnded(){const e=li();"loop"===e?this.player?.media&&(this.player.media.currentTime=0,this.player.play()):"sequence"===e&&this.$emit("audio-ended","next")},destroyPlayer(){const e=this.$refs.videoEl||this.$refs.audioEl;if(this.player){try{this.player.pause(),this.player.destroy()}catch(t){}this.player=null}if(e)try{e.pause(),e.currentTime=0,e.src="",e.load()}catch(t){}},stopAndCleanMedia(){this.destroyPlayer()},initAudioInfo(){const e=this.file?.name||this.src,t=e.split("/").pop().replace(/\.[^.]+$/,"");this.audioTitle=t,this.audioArtist="",this.audioCover=null,this.isActive&&this.tryReadMetadata()},async tryReadMetadata(){try{const e=await fetch(this.src),t=await e.blob(),i=await t.slice(0,131072).arrayBuffer(),s=new DataView(i);73===s.getUint8(0)&&68===s.getUint8(1)&&51===s.getUint8(2)&&this.parseID3v2(s,i)}catch(e){}},parseID3v2(e,t){const i=(127&e.getUint8(6))<<21|(127&e.getUint8(7))<<14|(127&e.getUint8(8))<<7|127&e.getUint8(9);let s=10;while(st.byteLength)break;const a=new Uint8Array(t,s+10,Math.min(n,t.byteLength-s-10));"TIT2"===i?this.audioTitle=this.decodeText(a)||this.audioTitle:"TPE1"===i?this.audioArtist=this.decodeText(a):"APIC"===i&&this.extractCover(a),s+=10+n}},decodeText(e){if(e.length<2)return"";const t=e[0],i=e.slice(1);try{if(0===t)return new TextDecoder("iso-8859-1").decode(i).replace(/\0/g,"");if(1===t)return new TextDecoder("utf-16").decode(i).replace(/\0/g,"");if(3===t)return new TextDecoder("utf-8").decode(i).replace(/\0/g,"")}catch(s){}return""},extractCover(e){try{let t=1;while(tt?t+this.rubberBand(e-t,i,.55):e<-t?-t-this.rubberBand(-t-e,i,.55):e},calcTwoPointer(){const e=Array.from(this.pointers.entries()).sort((e,t)=>e[0]-t[0]),t=e[0][1],i=e[1][1],s=i.x-t.x,n=i.y-t.y,a=Math.hypot(s,n),r=Math.atan2(n,s)*(180/Math.PI),o={x:(t.x+i.x)/2,y:(t.y+i.y)/2};return{dist:a,angle:r,center:o}},normalizeAngle(e){return e=(e%360+360)%360,e>180?e-360:e},onPointerDown(e){if(this.isImage){if(e.currentTarget.setPointerCapture?.(e.pointerId),this.viewportRect=this.getViewportRect(),this.pointers.set(e.pointerId,{x:e.clientX,y:e.clientY}),2===this.pointers.size){const{dist:e,angle:t,center:i}=this.calcTwoPointer();return this.startDist=e,this.startAngle=t,this.startCenter=i,this.startScale=this.scale,this.startRotation=this.rotation,this.startTx=this.tx,this.startTy=this.ty,this.dragging=!1,this.gestureMode=null,void(this.rotatePreview=0)}this.scale>1.001&&(this.dragging=!0,this.dragStart={x:e.clientX,y:e.clientY},this.startTx=this.tx,this.startTy=this.ty)}},onPointerMove(e){if(this.isImage&&this.pointers.has(e.pointerId)){if(this.pointers.set(e.pointerId,{x:e.clientX,y:e.clientY}),2===this.pointers.size){e.preventDefault();const{dist:t,angle:i,center:s}=this.calcTwoPointer(),n=t/(this.startDist||t),a=Math.abs(n-1),r=this.normalizeAngle(i-this.startAngle),o=Math.abs(r);if(!this.gestureMode)if(o>=8)this.gestureMode="rotate";else{if(!(a>=.08))return;this.gestureMode="pinch"}if("rotate"===this.gestureMode)return this.scale=this.startScale,void(this.rotatePreview=this.clamp(r,-90,90));if("pinch"===this.gestureMode&&(this.scale=this.clamp(this.startScale*n,this.minScale,this.maxScale),this.rotatePreview=0),this.startCenter&&this.viewportRect){const e=this.startCenter.x-this.viewportRect.left-this.viewportRect.width/2,t=this.startCenter.y-this.viewportRect.top-this.viewportRect.height/2,i=s.x-this.viewportRect.left-this.viewportRect.width/2,n=s.y-this.viewportRect.top-this.viewportRect.height/2;this.tx=this.startTx+(i-e),this.ty=this.startTy+(n-t)}return}if(this.dragging&&this.scale>1.001){e.preventDefault();const t=e.clientX-this.dragStart.x,i=e.clientY-this.dragStart.y,s=this.startTx+t,n=this.startTy+i,{maxX:a,maxY:r,vw:o,vh:l}=this.getPanBounds();let c=0,h=0;s>a?(c=s-a,h=-1):s<-a&&(c=-a-s,h=1),this.edgeOverflow=c,this.edgeDir=h,this.tx=this.applyBoundWithRubber(s,a,o),this.ty=this.applyBoundWithRubber(n,r,l)}}},onPointerUp(e){if(this.isImage&&(this.pointers.has(e.pointerId)&&this.pointers.delete(e.pointerId),this.pointers.size<2&&"rotate"===this.gestureMode&&(this.finishRotate(),this.gestureMode=null),this.pointers.size<2&&(this.startCenter=null,this.startDist=0,this.startAngle=0,this.gestureMode=null),0===this.pointers.size)){if(this.dragging=!1,this.edgeOverflow>60&&0!==this.edgeDir){const e=this.edgeDir;return this.reset(),void this.$emit("edge-swipe",e)}if(this.edgeOverflow=0,this.edgeDir=0,this.scale<=1.001)this.scale=1,this.tx=0,this.ty=0;else{const{maxX:e,maxY:t}=this.getPanBounds();this.tx=Math.max(-e,Math.min(e,this.tx)),this.ty=Math.max(-t,Math.min(t,this.ty))}}},finishRotate(){const e=this.rotatePreview;let t=0;Math.abs(e)>=30&&(t=e>0?90:-90);const i=((this.rotation+t)%360+360)%360;this.rotation=i,this.rotatePreview=0,this.updateFillScale()},updateFillScale(){const e=this.rotation%360,t=90===e||270===e;t?(this.scale=2,this.tx=0,this.ty=0):(this.scale=1,this.tx=0,this.ty=0)},onDblClick(){this.isImage&&(this.scale>1.001?(this.scale=1,this.tx=0,this.ty=0):this.scale=2)}}},di=i(1241);const ui=(0,di.A)(hi,[["render",b],["__scopeId","data-v-b1094b14"]]);var pi=ui,mi=i(4453);const gi={class:"public-browse"},fi={class:"header"},yi={class:"header-left"},bi={class:"logo",href:"https://github.com/MarSeventh/CloudFlare-ImgBed",target:"_blank",rel:"noopener"},vi={class:"header-center"},wi={class:"breadcrumb"},ki=["onClick"],Ti={class:"header-right"},Ci={class:"file-count"},Ai={key:0,class:"loading-container"},Si={key:1,class:"error-container"},xi={key:2,class:"gallery-container",ref:"galleryContainer"},Ei={key:0,class:"folders-section"},Mi={class:"folders-grid"},Li=["onClick"],Pi={class:"folder-name"},Ii={class:"waterfall",ref:"waterfall"},$i=["onClick"],Ni=["src","alt","onLoad"],Di=["src","onLoadedmetadata"],Fi={key:2,class:"audio-placeholder"},_i={class:"audio-name"},Ri={key:3,class:"file-placeholder"},Oi={class:"file-name"},Hi={class:"overlay"},Vi={class:"overlay-actions"},ji=["onClick"],qi=["onClick"],Bi={key:1,class:"floating-page-indicator"},Ui={ref:"loadTrigger",class:"load-trigger"},Xi={key:0,class:"loading-more"},zi={key:1,class:"no-more"},Wi={key:2,class:"credit-link",href:"https://github.com/axibayuit-a11y",target:"_blank",rel:"noopener"},Ki=["src"],Yi=["src"],Qi=["src"],Ji={key:2,class:"other-file-preview"},Gi={class:"file-name"},Zi={class:"page-indicator"};function es(e,t,i,r,o,l){const c=mi.A,h=pi;return(0,s.uX)(),(0,s.CE)("div",gi,[(0,s.Lk)("header",fi,[(0,s.Lk)("div",yi,[(0,s.Lk)("a",bi,(0,a.v_)(l.siteName),1)]),(0,s.Lk)("div",vi,[(0,s.Lk)("div",wi,[(0,s.Lk)("span",{class:"breadcrumb-item",onClick:t[0]||(t[0]=(...e)=>l.goToRoot&&l.goToRoot(...e))},(0,a.v_)(l.rootDirName),1),((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(l.pathParts,(e,i)=>((0,s.uX)(),(0,s.CE)(s.FK,{key:i},[t[32]||(t[32]=(0,s.Lk)("span",{class:"breadcrumb-sep"},"/",-1)),(0,s.Lk)("span",{class:"breadcrumb-item",onClick:e=>l.goToPath(i)},(0,a.v_)(e),9,ki)],64))),128))])]),(0,s.Lk)("div",Ti,[(0,s.Lk)("div",{class:(0,a.C4)(["search-box",{expanded:o.searchExpanded}])},[o.searchExpanded?((0,s.uX)(),(0,s.CE)(s.FK,{key:1},[(0,s.bo)((0,s.Lk)("input",{type:"text","onUpdate:modelValue":t[2]||(t[2]=e=>o.searchInput=e),onKeyup:t[3]||(t[3]=(0,n.jR)((...e)=>l.handleSearch&&l.handleSearch(...e),["enter"])),placeholder:"搜索文件名 或 #页码",class:"search-input",ref:"searchInputRef"},null,544),[[n.Jo,o.searchInput]]),(0,s.Lk)("span",{class:"search-icon",onClick:t[4]||(t[4]=(...e)=>l.handleSearch&&l.handleSearch(...e))},[...t[34]||(t[34]=[(0,s.Lk)("svg",{viewBox:"0 0 24 24",fill:"currentColor",width:"16",height:"16"},[(0,s.Lk)("path",{d:"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"})],-1)])])],64)):((0,s.uX)(),(0,s.CE)("span",{key:0,class:"search-icon",onClick:t[1]||(t[1]=(...e)=>l.toggleSearch&&l.toggleSearch(...e))},[...t[33]||(t[33]=[(0,s.Lk)("svg",{viewBox:"0 0 24 24",fill:"currentColor",width:"20",height:"20"},[(0,s.Lk)("path",{d:"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"})],-1)])]))],2),(0,s.bF)(c,{class:"theme-toggle-btn"}),(0,s.Lk)("span",Ci,(0,a.v_)(o.totalCount)+" 个文件",1)])]),o.loading&&0===o.files.length?((0,s.uX)(),(0,s.CE)("div",Ai,[...t[35]||(t[35]=[(0,s.Lk)("div",{class:"loading-spinner"},null,-1),(0,s.Lk)("p",null,"加载中...",-1)])])):o.error?((0,s.uX)(),(0,s.CE)("div",Si,[(0,s.Lk)("p",null,(0,a.v_)(o.error),1),o.canRetry?((0,s.uX)(),(0,s.CE)("button",{key:0,onClick:t[5]||(t[5]=(...e)=>l.loadFiles&&l.loadFiles(...e)),class:"retry-btn"},"重试")):(0,s.Q3)("",!0),t[36]||(t[36]=(0,s.Fv)('
',1))])):((0,s.uX)(),(0,s.CE)("div",xi,[l.folders.length>0?((0,s.uX)(),(0,s.CE)("div",Ei,[(0,s.Lk)("div",Mi,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(l.folders,e=>((0,s.uX)(),(0,s.CE)("div",{key:e.name,class:"folder-card",onClick:t=>l.enterFolder(e.name)},[t[37]||(t[37]=(0,s.Lk)("div",{class:"folder-icon"},[(0,s.Lk)("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[(0,s.Lk)("path",{d:"M10 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z"})])],-1)),(0,s.Lk)("span",Pi,(0,a.v_)(l.getFolderName(e.name)),1)],8,Li))),128))])])):(0,s.Q3)("",!0),(0,s.Lk)("div",Ii,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(l.columns,(e,i)=>((0,s.uX)(),(0,s.CE)("div",{key:i,class:"waterfall-column"},[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(e,e=>((0,s.uX)(),(0,s.CE)("div",{key:e.name,class:"waterfall-item",onClick:t=>l.openPreview(e)},[(0,s.Lk)("div",{class:(0,a.C4)(["image-wrapper",{loaded:e.loaded}])},[l.isImage(e)?((0,s.uX)(),(0,s.CE)("img",{key:0,src:l.getFileUrl(e.name),alt:e.name,loading:"lazy",onLoad:t=>l.onImageLoad(t,e),onError:t[6]||(t[6]=(...e)=>l.handleImageError&&l.handleImageError(...e))},null,40,Ni)):l.isVideo(e)?((0,s.uX)(),(0,s.CE)("video",{key:1,src:l.getFileUrl(e.name),muted:"",loop:"",preload:"metadata",onLoadedmetadata:t=>l.onVideoLoad(t,e),onPointerenter:t[7]||(t[7]=e=>"mouse"===e.pointerType&&e.target.play()),onPointerleave:t[8]||(t[8]=e=>"mouse"===e.pointerType&&e.target.pause())},null,40,Di)):l.isAudio(e)?((0,s.uX)(),(0,s.CE)("div",Fi,[t[38]||(t[38]=(0,s.Lk)("svg",{class:"audio-icon",viewBox:"0 0 24 24",fill:"currentColor"},[(0,s.Lk)("path",{d:"M12 3v10.55c-.59-.34-1.27-.55-2-.55-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4V7h4V3h-6z"})],-1)),(0,s.Lk)("span",_i,(0,a.v_)(l.getFileName(e.name)),1)])):((0,s.uX)(),(0,s.CE)("div",Ri,[t[39]||(t[39]=(0,s.Lk)("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[(0,s.Lk)("path",{d:"M14 2H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V8l-6-6zm-1 7V3.5L18.5 9H13z"})],-1)),(0,s.Lk)("span",Oi,(0,a.v_)(l.getFileName(e.name)),1)])),(0,s.Lk)("div",Hi,[(0,s.Lk)("div",Vi,[(0,s.Lk)("button",{class:"action-btn",onClick:(0,n.D$)(t=>l.copyLink(e.name),["stop"]),title:"复制链接"},[...t[40]||(t[40]=[(0,s.Lk)("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[(0,s.Lk)("path",{d:"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"})],-1)])],8,ji),(0,s.Lk)("button",{class:"action-btn",onClick:(0,n.D$)(t=>l.downloadFile(e.name),["stop"]),title:"下载"},[...t[41]||(t[41]=[(0,s.Lk)("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[(0,s.Lk)("path",{d:"M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"})],-1)])],8,qi)])])],2)],8,$i))),128))]))),128))],512),l.mediaFiles.length>o.pageSize?((0,s.uX)(),(0,s.CE)("div",Bi,[(0,s.Lk)("span",null,(0,a.v_)(l.displayCurrentPage)+" / "+(0,a.v_)(l.totalPages),1)])):(0,s.Q3)("",!0),(0,s.Lk)("div",Ui,[o.loading&&o.files.length>0?((0,s.uX)(),(0,s.CE)("div",Xi,[...t[42]||(t[42]=[(0,s.Lk)("div",{class:"loading-spinner-small"},null,-1),(0,s.Lk)("span",null,"加载中...",-1)])])):!o.hasMore&&l.mediaFiles.length>0?((0,s.uX)(),(0,s.CE)("div",zi," 已加载全部 ")):(0,s.Q3)("",!0),!o.hasMore&&l.mediaFiles.length>0?((0,s.uX)(),(0,s.CE)("a",Wi," 林酱贡献 ")):(0,s.Q3)("",!0)],512)],512)),o.previewVisible?((0,s.uX)(),(0,s.CE)("div",{key:3,class:"preview-modal",onClick:t[31]||(t[31]=(0,n.D$)((...e)=>l.closePreview&&l.closePreview(...e),["self"]))},[(0,s.Lk)("button",{class:"preview-close",onClick:t[9]||(t[9]=(0,n.D$)((...e)=>l.closePreview&&l.closePreview(...e),["stop"]))},[...t[43]||(t[43]=[(0,s.Lk)("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[(0,s.Lk)("path",{d:"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"})],-1)])]),o.isMobile?(0,s.Q3)("",!0):((0,s.uX)(),(0,s.CE)("div",{key:0,class:"preview-content",onClick:t[15]||(t[15]=(0,n.D$)(()=>{},["stop"])),onWheel:t[16]||(t[16]=(0,n.D$)((...e)=>l.handleWheel&&l.handleWheel(...e),["prevent"]))},[l.currentPreviewFile&&l.isImage(l.currentPreviewFile)?((0,s.uX)(),(0,s.CE)("img",{key:"img-"+l.currentPreviewFile.name,src:l.getFileUrl(l.currentPreviewFile.name),class:"preview-image",style:(0,a.Tr)(l.desktopImageStyle),draggable:"false",onMousedown:t[10]||(t[10]=(...e)=>l.onImageMouseDown&&l.onImageMouseDown(...e)),onMousemove:t[11]||(t[11]=(...e)=>l.onImageMouseMove&&l.onImageMouseMove(...e)),onMouseup:t[12]||(t[12]=(...e)=>l.onImageMouseUp&&l.onImageMouseUp(...e)),onMouseleave:t[13]||(t[13]=(...e)=>l.onImageMouseUp&&l.onImageMouseUp(...e))},null,44,Ki)):l.currentPreviewFile&&l.isVideo(l.currentPreviewFile)?((0,s.uX)(),(0,s.CE)("video",{ref:"desktopVideo",key:"video-"+l.currentPreviewFile.name,src:l.getFileUrl(l.currentPreviewFile.name),controls:"",class:"preview-video",style:(0,a.Tr)(l.desktopImageStyle),onPlay:t[14]||(t[14]=(...e)=>l.onDesktopVideoPlay&&l.onDesktopVideoPlay(...e))},null,44,Yi)):l.currentPreviewFile&&l.isAudio(l.currentPreviewFile)?((0,s.uX)(),(0,s.Wv)(h,{ref:"desktopAudio",key:"audio-"+l.currentPreviewFile.name,file:l.currentPreviewFile,src:l.getFileUrl(l.currentPreviewFile.name),"is-image":!1,"is-video":!1,"is-audio":!0,"is-active":!0,onAudioEnded:l.onAudioEnded},null,8,["file","src","onAudioEnded"])):(0,s.Q3)("",!0)],32)),o.isMobile?((0,s.uX)(),(0,s.CE)("div",{key:1,class:"preview-content preview-content-mobile",onClick:t[27]||(t[27]=(0,n.D$)(()=>{},["stop"]))},[l.currentPreviewFile&&l.isVideo(l.currentPreviewFile)?((0,s.uX)(),(0,s.CE)("video",{ref:"mobileVideo",key:"m-video-"+l.currentPreviewFile.name,src:l.getFileUrl(l.currentPreviewFile.name),controls:"",playsinline:"","webkit-playsinline":"","x5-video-player-type":"h5","x5-video-player-fullscreen":"true",class:"mobile-video-native",onPlay:t[17]||(t[17]=(...e)=>l.onMobileMediaPlay&&l.onMobileMediaPlay(...e))},null,40,Qi)):l.currentPreviewFile&&l.isAudio(l.currentPreviewFile)?((0,s.uX)(),(0,s.CE)("div",{key:1,class:"mobile-audio-wrap",onTouchstart:t[18]||(t[18]=(...e)=>l.onAudioSwipeStart&&l.onAudioSwipeStart(...e)),onTouchmove:t[19]||(t[19]=(...e)=>l.onAudioSwipeMove&&l.onAudioSwipeMove(...e)),onTouchend:t[20]||(t[20]=(...e)=>l.onAudioSwipeEnd&&l.onAudioSwipeEnd(...e))},[((0,s.uX)(),(0,s.Wv)(h,{ref:"mobileAudio",key:"m-audio-"+l.currentPreviewFile.name,file:l.currentPreviewFile,src:l.getFileUrl(l.currentPreviewFile.name),"is-image":!1,"is-video":!1,"is-audio":!0,"is-active":!0,onAudioEnded:l.onAudioEnded},null,8,["file","src","onAudioEnded"])),t[44]||(t[44]=(0,s.Lk)("div",{class:"swipe-hint"},"← 滑动切换 →",-1))],32)):l.currentPreviewFile&&!l.isImage(l.currentPreviewFile)?((0,s.uX)(),(0,s.CE)("div",Ji,[t[45]||(t[45]=(0,s.Lk)("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[(0,s.Lk)("path",{d:"M14 2H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V8l-6-6zm-1 7V3.5L18.5 9H13z"})],-1)),(0,s.Lk)("span",Gi,(0,a.v_)(l.getFileName(l.currentPreviewFile.name)),1)])):((0,s.uX)(),(0,s.CE)("div",{key:3,class:"swipe-viewport",ref:"mobileViewport",onTouchstart:t[24]||(t[24]=(...e)=>l.onSwipeStart&&l.onSwipeStart(...e)),onTouchmove:t[25]||(t[25]=(...e)=>l.onSwipeMove&&l.onSwipeMove(...e)),onTouchend:t[26]||(t[26]=(...e)=>l.onSwipeEnd&&l.onSwipeEnd(...e))},[(0,s.Lk)("div",{class:"swipe-track",style:(0,a.Tr)(l.swipeTrackStyle),onTransitionend:t[23]||(t[23]=(...e)=>l.onSwipeTransitionEnd&&l.onSwipeTransitionEnd(...e))},[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(l.swipeWindow,(e,i)=>((0,s.uX)(),(0,s.CE)("div",{class:"swipe-slide",key:l.getSlideKey(e,i)},[e?((0,s.uX)(),(0,s.Wv)(h,{key:0,file:e,src:l.getFileUrl(e.name),"is-image":l.isImage(e),"is-video":!1,"is-audio":!1,"is-active":1===i,onLock:t[21]||(t[21]=e=>o.gestureLocked=!0),onUnlock:t[22]||(t[22]=e=>o.gestureLocked=!1),onEdgeSwipe:l.onEdgeSwipe},null,8,["file","src","is-image","is-active","onEdgeSwipe"])):(0,s.Q3)("",!0)]))),128))],36)],544))])):(0,s.Q3)("",!0),!o.isMobile&&o.previewIndex>0?((0,s.uX)(),(0,s.CE)("button",{key:2,class:"preview-prev",onClick:t[28]||(t[28]=(0,n.D$)((...e)=>l.prevImage&&l.prevImage(...e),["stop"]))},[...t[46]||(t[46]=[(0,s.Lk)("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[(0,s.Lk)("path",{d:"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"})],-1)])])):(0,s.Q3)("",!0),!o.isMobile&&o.previewIndexl.nextImage&&l.nextImage(...e),["stop"]))},[...t[47]||(t[47]=[(0,s.Lk)("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[(0,s.Lk)("path",{d:"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"})],-1)])])):(0,s.Q3)("",!0),o.isMobile?(0,s.Q3)("",!0):((0,s.uX)(),(0,s.CE)("button",{key:4,class:"rotate-btn",onClick:t[30]||(t[30]=(0,n.D$)((...e)=>l.rotateImage&&l.rotateImage(...e),["stop"])),title:"旋转90°"},[...t[48]||(t[48]=[(0,s.Lk)("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[(0,s.Lk)("path",{d:"M16.89 8.53l1.41-1.42C19.2 8.27 19.76 9.61 19.93 11h-2.02c-.14-.87-.49-1.72-1.02-2.47zM17.91 13h2.02c-.17 1.39-.72 2.73-1.62 3.89l-1.41-1.42c.52-.75.87-1.59 1.01-2.47zm-1.01 5.32c-1.16.9-2.51 1.44-3.9 1.61V17.9c.87-.15 1.71-.49 2.46-1.03l1.44 1.45zM11 4.07V1l4.55 4.55L11 10V6.09c-2.84.48-5 2.94-5 5.91s2.16 5.43 5 5.91v2.02c-3.95-.49-7-3.85-7-7.93s3.05-7.44 7-7.93z"})],-1)])])),(0,s.Lk)("div",Zi,(0,a.v_)(o.previewIndex+1)+" / "+(0,a.v_)(l.mediaFiles.length),1)])):(0,s.Q3)("",!0)])}var ts=i(4373),is=i(8401),ss={name:"PublicBrowse",components:{TransformMedia:pi,ToggleDark:mi.A},data(){return{files:[],allowedDirs:[],rootDir:"",currentPath:"",totalCount:0,loading:!1,error:null,canRetry:!0,hasMore:!0,previewVisible:!1,previewIndex:0,observer:null,pageSize:24,searchInput:"",searchKeyword:"",currentStartIndex:0,searchExpanded:!1,filterType:"",lastScrollY:0,scrollPage:0,columnCount:4,columnHeights:[0,0,0,0],imageRotation:0,imageScale:1,imageTx:0,imageTy:0,imageDragging:!1,imageDragStart:null,imageStartTx:0,imageStartTy:0,swipeX:0,swipeStartX:0,swipeStartY:0,swipeStartT:0,swipeActive:!1,swipeAnimating:!1,swipeDir:0,viewportW:0,gestureLocked:!1,audioSwipeStartX:0,audioSwipeStartT:0,audioSwipeActive:!1,isMobile:!1}},computed:{...(0,is.L8)(["userConfig"]),siteName(){return this.userConfig?.siteTitle||"Sanyue ImgHub"},rootDirName(){return this.rootDir.split("/").filter(Boolean).pop()||"根目录"},pathParts(){if(!this.currentPath||!this.rootDir)return[];const e=this.currentPath.replace(this.rootDir,"").replace(/^\/+/,"");return e.split("/").filter(Boolean)},folders(){return this.files.filter(e=>e.isFolder)},mediaFiles(){return this.files.filter(e=>!e.isFolder)},totalPages(){return Math.ceil(this.totalCount/this.pageSize)},displayCurrentPage(){const e=Math.floor(this.currentStartIndex/this.pageSize)+1,t=Math.ceil(this.mediaFiles.length/this.pageSize);return Math.min(e+Math.floor(this.scrollPage*t),this.totalPages)},columns(){const e=Array.from({length:this.columnCount},()=>[]);for(const t of this.mediaFiles){const i=t.columnIndex??0;i0?this.mediaFiles[this.previewIndex-1]:null},nextPreviewFile(){return this.previewIndex1?this.imageDragging?"grabbing":"grab":"default"}},swipeWindow(){return[this.prevPreviewFile,this.currentPreviewFile,this.nextPreviewFile]},swipeTrackStyle(){const e=-this.viewportW,t=e+this.swipeX;return{transform:`translate3d(${t}px, 0, 0)`,transition:this.swipeAnimating?"transform 0.28s ease":"none"}}},watch:{"$route.params.dir":{handler(){this.initFromRoute()}}},mounted(){oi(),this.checkMobile(),this.initFromRoute(),this.setupIntersectionObserver(),this.updateColumnCount(),window.addEventListener("resize",this.updateColumnCount),window.addEventListener("resize",this.checkMobile),window.addEventListener("scroll",this.handleScroll)},beforeUnmount(){this.observer&&this.observer.disconnect(),window.removeEventListener("resize",this.updateColumnCount),window.removeEventListener("resize",this.checkMobile),window.removeEventListener("scroll",this.handleScroll)},methods:{handleSearch(){const e=this.searchInput.trim();if(!e)return this.searchKeyword="",this.filterType="",this.currentStartIndex=0,void this.resetAndLoad();const t=e.match(/^#(\d+)$/);if(t){const e=parseInt(t[1],10),i=Math.ceil(this.totalCount/this.pageSize),s=Math.min(Math.max(1,e),i||1);return this.currentStartIndex=(s-1)*this.pageSize,this.searchKeyword="",this.filterType="",this.searchInput="",void this.resetAndLoad()}const i={"图片":"image","图":"image",image:"image",img:"image","照片":"image","视频":"video",video:"video","影片":"video","电影":"video","音乐":"audio","音频":"audio",audio:"audio",music:"audio","歌曲":"audio"},s=e.toLowerCase();if(i[s])return this.filterType=i[s],this.searchKeyword="",this.currentStartIndex=0,void this.resetAndLoad();this.filterType="",this.searchKeyword=e,this.currentStartIndex=0,this.resetAndLoad()},resetAndLoad(){this.files=[],this.hasMore=!0,this.columnHeights=new Array(this.columnCount).fill(0),this.loadFiles().then(()=>{this.observeLoadTrigger()})},toggleSearch(){this.searchExpanded=!this.searchExpanded,this.searchExpanded&&this.$nextTick(()=>{this.$refs.searchInputRef?.focus()})},handleScroll(){const e=window.scrollY;this.searchExpanded&&e>this.lastScrollY+20&&(this.searchExpanded=!1),this.lastScrollY=e;const t=this.$refs.galleryContainer;if(t&&this.mediaFiles.length>0){t.getBoundingClientRect();const i=t.offsetTop,s=t.scrollHeight-window.innerHeight;if(s>0){const t=Math.max(0,e-i);this.scrollPage=Math.min(1,t/s)}else this.scrollPage=0}},checkMobile(){this.isMobile=window.innerWidth<=600},getSlideKey(e,t){return e?1===t?`${e.name}-${this.previewIndex}`:e.name:`empty-${t}`},updateColumnCount(){const e=window.innerWidth;let t;t=e<600?2:e<900?3:4,t!==this.columnCount&&(this.columnCount=t,this.columnHeights=new Array(this.columnCount).fill(0),this.mediaFiles.forEach(e=>{e.columnIndex=void 0,this.assignToColumn(e)}))},getShortestColumn(){let e=0,t=this.columnHeights[0];for(let i=1;i{const t=e[0];t.isIntersecting&&this.hasMore&&!this.loading&&this.loadMore()},{rootMargin:"200px"})},observeLoadTrigger(){this.$nextTick(()=>{this.$refs.loadTrigger&&this.observer&&this.observer.observe(this.$refs.loadTrigger)})},async initFromRoute(){const e=this.$route.params.dir||"",t=Array.isArray(e)?e.join("/"):e,i=t.split("/").filter(Boolean);this.rootDir=i[0]||"",this.currentPath=t,this.files=[],this.hasMore=!0,this.columnHeights=new Array(this.columnCount).fill(0),this.searchInput="",this.searchKeyword="",this.filterType="",this.currentStartIndex=0,await this.loadFiles(),this.observeLoadTrigger()},async loadFiles(){this.loading=!0,this.error=null,this.canRetry=!0;try{let e=`/api/public/list?dir=${encodeURIComponent(this.currentPath)}&start=${this.currentStartIndex}&count=${this.pageSize}`;this.searchKeyword&&(e+=`&search=${encodeURIComponent(this.searchKeyword)}`),this.filterType&&(e+=`&type=${this.filterType}`);const t=await ts.A.get(e);t.data.allowedDirs&&(this.allowedDirs=t.data.allowedDirs);const i=(t.data.directories||[]).map(e=>({name:e,isFolder:!0})),s=(t.data.files||[]).map(e=>({name:e.name,isFolder:!1,metadata:e.metadata,columnIndex:void 0}));s.forEach(e=>this.assignToColumn(e)),this.files=[...i,...s],this.totalCount=t.data.totalCount||this.files.length,this.hasMore=this.currentStartIndex+this.mediaFiles.length({name:e.name,isFolder:!1,metadata:e.metadata,columnIndex:void 0}));s.forEach(e=>this.assignToColumn(e)),this.files.push(...s),this.hasMore=this.currentStartIndex+this.mediaFiles.length{t.src=e+"?_retry="+Date.now()},500*(i+1))}else t.style.display="none"},copyLink(e){const t=this.getFileUrl(e);navigator.clipboard?.writeText(t).then(()=>{this.showToast("已复制")}).catch(()=>{const e=document.createElement("input");e.value=t,document.body.appendChild(e),e.select(),document.execCommand("copy"),document.body.removeChild(e),this.showToast("已复制")})},showToast(e){const t=document.querySelector(".copy-toast");t&&t.remove();const i=document.createElement("div");i.className="copy-toast",i.textContent=e,document.body.appendChild(i),setTimeout(()=>i.classList.add("show"),10),setTimeout(()=>{i.classList.remove("show"),setTimeout(()=>i.remove(),300)},1500)},downloadFile(e){const t=document.createElement("a");t.href=this.getFileUrl(e),t.download=e.split("/").pop(),t.click()},openPreview(e){if(e.isFolder)return;ai(null);const t=this.mediaFiles.findIndex(t=>t.name===e.name);t>=0&&(this.previewIndex=t,this.previewVisible=!0,this.imageRotation=0,this.imageScale=1,this.imageTx=0,this.imageTy=0,this.gestureLocked=!1,document.body.style.overflow="hidden",this.$nextTick(()=>{this.viewportW=this.$refs.mobileViewport?.getBoundingClientRect().width||window.innerWidth}))},closePreview(){ai(null),this.previewVisible=!1,this.imageRotation=0,this.imageScale=1,this.imageTx=0,this.imageTy=0,this.gestureLocked=!1,document.body.style.overflow=""},prevImage(){ai(null),this.previewIndex>0&&(this.previewIndex--,this.imageRotation=0,this.imageScale=1,this.imageTx=0,this.imageTy=0)},nextImage(){ai(null),this.previewIndex0?-.1:.1;let i=this.imageScale+t;i=Math.max(.5,Math.min(4,i)),this.imageScale=i,i<=1&&(this.imageTx=0,this.imageTy=0)},onImageMouseDown(e){this.imageScale<=1||(e.preventDefault(),this.imageDragging=!0,this.imageDragStart={x:e.clientX,y:e.clientY},this.imageStartTx=this.imageTx,this.imageStartTy=this.imageTy)},onImageMouseMove(e){if(!this.imageDragging)return;const t=e.clientX-this.imageDragStart.x,i=e.clientY-this.imageDragStart.y;this.imageTx=this.imageStartTx+t,this.imageTy=this.imageStartTy+i},onImageMouseUp(){this.imageDragging=!1},onSwipeStart(e){if(this.gestureLocked)return;if(this.swipeAnimating)return;const t=e.touches[0];this.swipeStartX=t.clientX,this.swipeStartY=t.clientY,this.swipeStartT=performance.now(),this.swipeX=0,this.swipeActive=!1,this.viewportW=this.$refs.mobileViewport?.getBoundingClientRect().width||window.innerWidth},onSwipeMove(e){if(this.gestureLocked)return;if(this.swipeAnimating)return;const t=e.touches[0],i=t.clientX-this.swipeStartX,s=t.clientY-this.swipeStartY;if(!this.swipeActive){if(Math.abs(i)<8)return;if(Math.abs(i)<=Math.abs(s))return;this.swipeActive=!0}e.preventDefault();let n=i;0===this.previewIndex&&n>0?n=this.rubberBand(n,this.viewportW,.55):this.previewIndex===this.mediaFiles.length-1&&n<0&&(n=-this.rubberBand(-n,this.viewportW,.55)),this.swipeX=n},onSwipeEnd(){if(this.gestureLocked)return;if(this.swipeAnimating)return;if(!this.swipeActive)return void(this.swipeX=0);const e=Math.max(1,performance.now()-this.swipeStartT),t=this.swipeX/e,i=.2*this.viewportW;let s=0;(this.swipeX<=-i||t<=-.8)&&(s=1),(this.swipeX>=i||t>=.8)&&(s=-1),(-1===s&&0===this.previewIndex||1===s&&this.previewIndex===this.mediaFiles.length-1)&&(s=0),this.swipeDir=s,this.swipeAnimating=!0,this.swipeX=1===s?-this.viewportW:-1===s?+this.viewportW:0},onSwipeTransitionEnd(){this.swipeAnimating&&(1===this.swipeDir&&this.previewIndex++,-1===this.swipeDir&&this.previewIndex--,this.swipeAnimating=!1,this.swipeDir=0,this.swipeX=0)},rubberBand(e,t,i=.55){return e*t*i/(t+i*e)},onEdgeSwipe(e){-1===e&&0===this.previewIndex||1===e&&this.previewIndex===this.mediaFiles.length-1||(this.swipeDir=e,this.swipeAnimating=!0,1===e?this.swipeX=-this.viewportW:-1===e&&(this.swipeX=+this.viewportW))},onAudioSwipeStart(e){const t=e.touches[0];this.audioSwipeStartX=t.clientX,this.audioSwipeStartT=performance.now(),this.audioSwipeActive=!1},onAudioSwipeMove(e){if(!this.audioSwipeStartX)return;const t=e.touches[0],i=t.clientX-this.audioSwipeStartX;Math.abs(i)>30&&(this.audioSwipeActive=!0)},onAudioSwipeEnd(e){if(!this.audioSwipeActive)return void(this.audioSwipeStartX=0);const t=e.changedTouches[0],i=t.clientX-this.audioSwipeStartX,s=Math.max(1,performance.now()-this.audioSwipeStartT),n=i/s,a=80;i>a||n>.5?this.prevImage():(i<-a||n<-.5)&&this.nextImage(),this.audioSwipeStartX=0,this.audioSwipeActive=!1},onDesktopVideoPlay(e){ai(e.target)},onMobileMediaPlay(e){ai(e.target)},onAudioEnded(e){"next"===e&&this.previewIndex{setTimeout(()=>{const e=this.isMobile?this.$refs.mobileAudio:this.$refs.desktopAudio;e?.player&&e.player.play()},100)}))}}};const ns=(0,di.A)(ss,[["render",es],["__scopeId","data-v-40c0acc5"]]);var as=ns}}]); +//# sourceMappingURL=667.bbd60d43.js.map \ No newline at end of file diff --git a/js/667.bbd60d43.js.gz b/js/667.bbd60d43.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..42eb3542ead486279fffc5146f3cd46b0da0ba07 GIT binary patch literal 47884 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 M8>&W66CHa30MY5n_W%F@ literal 0 HcmV?d00001 diff --git a/js/667.bbd60d43.js.map b/js/667.bbd60d43.js.map new file mode 100644 index 0000000..1001ca6 --- /dev/null +++ b/js/667.bbd60d43.js.map @@ -0,0 +1 @@ +{"version":3,"file":"js/667.bbd60d43.js","mappings":"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","sources":["webpack://sanyue_imghub/./node_modules/@babel/runtime/helpers/esm/typeof.js","webpack://sanyue_imghub/./node_modules/@babel/runtime/helpers/esm/toPrimitive.js","webpack://sanyue_imghub/./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","webpack://sanyue_imghub/./node_modules/@babel/runtime/helpers/esm/defineProperty.js","webpack://sanyue_imghub/./node_modules/loadjs/dist/loadjs.umd.js","webpack://sanyue_imghub/src/js/rangetouch.js","webpack://sanyue_imghub/src/js/config.js","webpack://sanyue_imghub/src/js/utils/css.js","webpack://sanyue_imghub/src/js/utils/is.js","webpack://sanyue_imghub/src/js/utils/numbers.js","webpack://sanyue_imghub/src/js/utils/events.js","webpack://sanyue_imghub/./src/components/ToggleDark.vue?6d4a","webpack://sanyue_imghub/./src/components/ToggleDark.vue","webpack://sanyue_imghub/./src/components/ToggleDark.vue?0bce","webpack://sanyue_imghub/./src/components/TransformMedia.vue?15d4","webpack://sanyue_imghub/./node_modules/plyr/src/js/utils/is.js","webpack://sanyue_imghub/./node_modules/plyr/src/js/utils/animation.js","webpack://sanyue_imghub/./node_modules/plyr/src/js/utils/objects.js","webpack://sanyue_imghub/./node_modules/plyr/src/js/utils/elements.js","webpack://sanyue_imghub/./node_modules/plyr/src/js/support.js","webpack://sanyue_imghub/./node_modules/plyr/src/js/utils/events.js","webpack://sanyue_imghub/./node_modules/plyr/src/js/utils/promise.js","webpack://sanyue_imghub/./node_modules/plyr/src/js/utils/arrays.js","webpack://sanyue_imghub/./node_modules/plyr/src/js/utils/style.js","webpack://sanyue_imghub/./node_modules/plyr/src/js/html5.js","webpack://sanyue_imghub/./node_modules/plyr/src/js/utils/browser.js","webpack://sanyue_imghub/./node_modules/plyr/src/js/utils/strings.js","webpack://sanyue_imghub/./node_modules/plyr/src/js/utils/i18n.js","webpack://sanyue_imghub/./node_modules/plyr/src/js/storage.js","webpack://sanyue_imghub/./node_modules/plyr/src/js/utils/fetch.js","webpack://sanyue_imghub/./node_modules/plyr/src/js/utils/load-sprite.js","webpack://sanyue_imghub/./node_modules/plyr/src/js/utils/time.js","webpack://sanyue_imghub/./node_modules/plyr/src/js/controls.js","webpack://sanyue_imghub/./node_modules/plyr/src/js/utils/urls.js","webpack://sanyue_imghub/./node_modules/plyr/src/js/captions.js","webpack://sanyue_imghub/./node_modules/plyr/src/js/config/defaults.js","webpack://sanyue_imghub/./node_modules/plyr/src/js/config/states.js","webpack://sanyue_imghub/./node_modules/plyr/src/js/config/types.js","webpack://sanyue_imghub/./node_modules/plyr/src/js/console.js","webpack://sanyue_imghub/./node_modules/plyr/src/js/fullscreen.js","webpack://sanyue_imghub/./node_modules/plyr/src/js/utils/load-image.js","webpack://sanyue_imghub/./node_modules/plyr/src/js/ui.js","webpack://sanyue_imghub/./node_modules/plyr/src/js/listeners.js","webpack://sanyue_imghub/./node_modules/plyr/src/js/utils/load-script.js","webpack://sanyue_imghub/./node_modules/plyr/src/js/plugins/vimeo.js","webpack://sanyue_imghub/./node_modules/plyr/src/js/plugins/youtube.js","webpack://sanyue_imghub/./node_modules/plyr/src/js/media.js","webpack://sanyue_imghub/./node_modules/plyr/src/js/plugins/ads.js","webpack://sanyue_imghub/./node_modules/plyr/src/js/utils/numbers.js","webpack://sanyue_imghub/./node_modules/plyr/src/js/plugins/preview-thumbnails.js","webpack://sanyue_imghub/./node_modules/plyr/src/js/source.js","webpack://sanyue_imghub/./node_modules/plyr/src/js/plyr.js","webpack://sanyue_imghub/./src/utils/mediaManager.js","webpack://sanyue_imghub/./src/components/TransformMedia.vue","webpack://sanyue_imghub/./src/components/TransformMedia.vue?c392","webpack://sanyue_imghub/./src/views/PublicBrowse.vue?699c","webpack://sanyue_imghub/./src/views/PublicBrowse.vue","webpack://sanyue_imghub/./src/views/PublicBrowse.vue?bab5"],"sourcesContent":["function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\nexport { _typeof as default };","import _typeof from \"./typeof.js\";\nfunction toPrimitive(t, r) {\n if (\"object\" != _typeof(t) || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != _typeof(i)) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nexport { toPrimitive as default };","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nfunction toPropertyKey(t) {\n var i = toPrimitive(t, \"string\");\n return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nexport { toPropertyKey as default };","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperty(e, r, t) {\n return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\nexport { _defineProperty as default };","(function(root, factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.loadjs = factory();\n }\n}(this, function() {\n/**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n\nvar devnull = function() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n\n\n/**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\nfunction subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n\n var depsNotFound = [],\n i = bundleIds.length,\n numWaiting = i,\n fn,\n bundleId,\n r,\n q;\n\n // define callback function\n fn = function (bundleId, pathsNotFound) {\n if (pathsNotFound.length) depsNotFound.push(bundleId);\n\n numWaiting--;\n if (!numWaiting) callbackFn(depsNotFound);\n };\n\n // register callback\n while (i--) {\n bundleId = bundleIds[i];\n\n // execute callback if in result cache\n r = bundleResultCache[bundleId];\n if (r) {\n fn(bundleId, r);\n continue;\n }\n\n // add to callback queue\n q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n q.push(fn);\n }\n}\n\n\n/**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\nfunction publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n\n var q = bundleCallbackQueue[bundleId];\n\n // cache result\n bundleResultCache[bundleId] = pathsNotFound;\n\n // exit if queue is empty\n if (!q) return;\n\n // empty callback queue\n while (q.length) {\n q[0](bundleId, pathsNotFound);\n q.splice(0, 1);\n }\n}\n\n\n/**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\nfunction executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {success: args};\n\n // success and error callbacks\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);\n else (args.success || devnull)(args);\n}\n\n\n/**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFile(path, callbackFn, args, numTries) {\n var doc = document,\n async = args.async,\n maxTries = (args.numRetries || 0) + 1,\n beforeCallbackFn = args.before || devnull,\n pathname = path.replace(/[\\?|#].*$/, ''),\n pathStripped = path.replace(/^(css|img|module|nomodule)!/, ''),\n isLegacyIECss,\n hasModuleSupport,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(pathname)) {\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped;\n\n // tag IE9+\n isLegacyIECss = 'hideFocus' in e;\n\n // use preload in IE Edge (to detect load errors)\n if (isLegacyIECss && e.relList) {\n isLegacyIECss = 0;\n e.rel = 'preload';\n e.as = 'style';\n }\n } else if (/(^img!|\\.(png|gif|jpg|svg|webp)$)/.test(pathname)) {\n // image\n e = doc.createElement('img');\n e.src = pathStripped; \n } else {\n // javascript\n e = doc.createElement('script');\n e.src = pathStripped;\n e.async = async === undefined ? true : async;\n\n // handle es modules\n // modern browsers:\n // module: add to dom with type=\"module\"\n // nomodule: call success() callback without adding to dom\n // legacy browsers:\n // module: call success() callback without adding to dom\n // nomodule: add to dom with default type (\"text/javascript\")\n hasModuleSupport = 'noModule' in e;\n if (/^module!/.test(pathname)) {\n if (!hasModuleSupport) return callbackFn(path, 'l');\n e.type = \"module\";\n } else if (/^nomodule!/.test(pathname) && hasModuleSupport) return callbackFn(path, 'l');\n }\n\n e.onload = e.onerror = e.onbeforeload = function (ev) {\n var result = ev.type[0];\n\n // treat empty stylesheets as failures to get around lack of onerror\n // support in IE9-11\n if (isLegacyIECss) {\n try {\n if (!e.sheet.cssText.length) result = 'e';\n } catch (x) {\n // sheets objects created from load errors don't allow access to\n // `cssText` (unless error is Code:18 SecurityError)\n if (x.code != 18) result = 'e';\n }\n }\n\n // handle retries in case of load failure\n if (result == 'e') {\n // increment counter\n numTries += 1;\n\n // exit function and try again\n if (numTries < maxTries) {\n return loadFile(path, callbackFn, args, numTries);\n }\n } else if (e.rel == 'preload' && e.as == 'style') {\n // activate preloaded stylesheets\n return e.rel = 'stylesheet'; // jshint ignore:line\n }\n \n // execute callback\n callbackFn(path, result, ev.defaultPrevented);\n };\n\n // add to document (unless callback returns `false`)\n if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n}\n\n\n/**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n\n var numWaiting = paths.length,\n x = numWaiting,\n pathsNotFound = [],\n fn,\n i;\n\n // define callback function\n fn = function(path, result, defaultPrevented) {\n // handle error\n if (result == 'e') pathsNotFound.push(path);\n\n // handle beforeload event. If defaultPrevented then that means the load\n // will be blocked (ex. Ghostery/ABP on Safari)\n if (result == 'b') {\n if (defaultPrevented) pathsNotFound.push(path);\n else return;\n }\n\n numWaiting--;\n if (!numWaiting) callbackFn(pathsNotFound);\n };\n\n // load scripts\n for (i=0; i < x; i++) loadFile(paths[i], fn, args);\n}\n\n\n/**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function|Object)} [arg1] - The (1) bundleId or (2) success\n * callback or (3) object literal with success/error arguments, numRetries,\n * etc.\n * @param {(Function|Object)} [arg2] - The (1) success callback or (2) object\n * literal with success/error arguments, numRetries, etc.\n */\nfunction loadjs(paths, arg1, arg2) {\n var bundleId,\n args;\n\n // bundleId (if string)\n if (arg1 && arg1.trim) bundleId = arg1;\n\n // args (default is {})\n args = (bundleId ? arg2 : arg1) || {};\n\n // throw error if bundle is already defined\n if (bundleId) {\n if (bundleId in bundleIdCache) {\n throw \"LoadJS\";\n } else {\n bundleIdCache[bundleId] = true;\n }\n }\n\n function loadFn(resolve, reject) {\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n \n // resolve Promise\n if (resolve) {\n executeCallbacks({success: resolve, error: reject}, pathsNotFound);\n }\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n }\n \n if (args.returnPromise) return new Promise(loadFn);\n else loadFn();\n}\n\n\n/**\n * Execute callbacks when dependencies have been satisfied.\n * @param {(string|string[])} deps - List of bundle ids\n * @param {Object} args - success/error arguments\n */\nloadjs.ready = function ready(deps, args) {\n // subscribe to bundle load event\n subscribe(deps, function (depsNotFound) {\n // execute callbacks\n executeCallbacks(args, depsNotFound);\n });\n\n return loadjs;\n};\n\n\n/**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\nloadjs.done = function done(bundleId) {\n publish(bundleId, []);\n};\n\n\n/**\n * Reset loadjs dependencies statuses\n */\nloadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n};\n\n\n/**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\nloadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n};\n\n\n// export\nreturn loadjs;\n\n}));\n","// ==========================================================================\n// rangetouch.js v2.0.0\n// Making work on touch devices\n// https://github.com/sampotts/rangetouch\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport defaults from './config';\nimport { matches } from './utils/css';\nimport { trigger } from './utils/events';\nimport is from './utils/is';\nimport { round } from './utils/numbers';\n\nclass RangeTouch {\n /**\n * Setup a new instance\n * @param {String|Element} target\n * @param {Object} options\n */\n constructor(target, options) {\n if (is.element(target)) {\n // An Element is passed, use it directly\n this.element = target;\n } else if (is.string(target)) {\n // A CSS Selector is passed, fetch it from the DOM\n this.element = document.querySelector(target);\n }\n\n if (!is.element(this.element) || !is.empty(this.element.rangeTouch)) {\n return;\n }\n\n this.config = { ...defaults, ...options };\n\n this.init();\n }\n\n static get enabled() {\n return 'ontouchstart' in document.documentElement;\n }\n\n /**\n * Setup multiple instances\n * @param {String|Element|NodeList|Array} target\n * @param {Object} options\n */\n static setup(target, options = {}) {\n let targets = null;\n\n if (is.empty(target) || is.string(target)) {\n targets = Array.from(document.querySelectorAll(is.string(target) ? target : 'input[type=\"range\"]'));\n } else if (is.element(target)) {\n targets = [target];\n } else if (is.nodeList(target)) {\n targets = Array.from(target);\n } else if (is.array(target)) {\n targets = target.filter(is.element);\n }\n\n if (is.empty(targets)) {\n return null;\n }\n\n const config = { ...defaults, ...options };\n\n if (is.string(target) && config.watch) {\n // Create an observer instance\n const observer = new MutationObserver(mutations => {\n Array.from(mutations).forEach(mutation => {\n Array.from(mutation.addedNodes).forEach(node => {\n if (!is.element(node) || !matches(node, target)) {\n return;\n }\n\n // eslint-disable-next-line no-unused-vars\n const range = new RangeTouch(node, config);\n });\n });\n });\n\n // Pass in the target node, as well as the observer options\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n }\n\n return targets.map(t => new RangeTouch(t, options));\n }\n\n init() {\n // Bail if not a touch enabled device\n if (!RangeTouch.enabled) {\n return;\n }\n\n // Add useful CSS\n if (this.config.addCSS) {\n this.element.style.userSelect = 'none';\n this.element.style.webKitUserSelect = 'none';\n this.element.style.touchAction = 'manipulation';\n }\n\n this.listeners(true);\n\n this.element.rangeTouch = this;\n }\n\n destroy() {\n // Bail if not a touch enabled device\n if (!RangeTouch.enabled) {\n return;\n }\n\n // Remove useful CSS\n if (this.config.addCSS) {\n this.element.style.userSelect = '';\n this.element.style.webKitUserSelect = '';\n this.element.style.touchAction = '';\n }\n\n this.listeners(false);\n\n this.element.rangeTouch = null;\n }\n\n listeners(toggle) {\n const method = toggle ? 'addEventListener' : 'removeEventListener';\n\n // Listen for events\n ['touchstart', 'touchmove', 'touchend'].forEach(type => {\n this.element[method](type, event => this.set(event), false);\n });\n }\n\n /**\n * Get the value based on touch position\n * @param {Event} event\n */\n get(event) {\n if (!RangeTouch.enabled || !is.event(event)) {\n return null;\n }\n\n const input = event.target;\n const touch = event.changedTouches[0];\n const min = parseFloat(input.getAttribute('min')) || 0;\n const max = parseFloat(input.getAttribute('max')) || 100;\n const step = parseFloat(input.getAttribute('step')) || 1;\n const delta = max - min;\n\n // Calculate percentage\n let percent;\n const clientRect = input.getBoundingClientRect();\n const thumbWidth = ((100 / clientRect.width) * (this.config.thumbWidth / 2)) / 100;\n\n // Determine left percentage\n percent = (100 / clientRect.width) * (touch.clientX - clientRect.left);\n\n // Don't allow outside bounds\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n }\n\n // Factor in the thumb offset\n if (percent < 50) {\n percent -= (100 - percent * 2) * thumbWidth;\n } else if (percent > 50) {\n percent += (percent - 50) * 2 * thumbWidth;\n }\n\n // Find the closest step to the mouse position\n return min + round(delta * (percent / 100), step);\n }\n\n /**\n * Update range value based on position\n * @param {Event} event\n */\n set(event) {\n if (!RangeTouch.enabled || !is.event(event) || event.target.disabled) {\n return;\n }\n\n // Prevent text highlight on iOS\n event.preventDefault();\n\n // Set value\n // eslint-disable-next-line no-param-reassign\n event.target.value = this.get(event);\n\n // Trigger event\n trigger(event.target, event.type === 'touchend' ? 'change' : 'input');\n }\n}\n\nexport default RangeTouch;\n","const defaults = {\n addCSS: true, // Add CSS to the element to improve usability (required here or in your CSS!)\n thumbWidth: 15, // The width of the thumb handle\n watch: true, // Watch for new elements that match a string target\n};\n\nexport default defaults;","// Element matches a selector\nexport function matches(element, selector) {\n const prototype = { Element };\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n const method =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n match;\n\n return method.call(element, selector);\n}\n\nexport default { matches };\n","// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\n\nconst isNullOrUndefined = input => input === null || typeof input === 'undefined';\nconst isObject = input => getConstructor(input) === Object;\nconst isNumber = input => getConstructor(input) === Number && !Number.isNaN(input);\nconst isString = input => getConstructor(input) === String;\nconst isBoolean = input => getConstructor(input) === Boolean;\nconst isFunction = input => getConstructor(input) === Function;\nconst isArray = input => Array.isArray(input);\nconst isNodeList = input => instanceOf(input, NodeList);\nconst isElement = input => instanceOf(input, Element);\nconst isEvent = input => instanceOf(input, Event);\nconst isEmpty = input =>\n isNullOrUndefined(input) ||\n ((isString(input) || isArray(input) || isNodeList(input)) && !input.length) ||\n (isObject(input) && !Object.keys(input).length);\n\nexport default {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n nodeList: isNodeList,\n element: isElement,\n event: isEvent,\n empty: isEmpty,\n};\n","// Get the number of decimal places\nexport function getDecimalPlaces(value) {\n const match = `${value}`.match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n\n if (!match) {\n return 0;\n }\n\n return Math.max(\n 0,\n // Number of digits right of decimal point.\n (match[1] ? match[1].length : 0) -\n // Adjust for scientific notation.\n (match[2] ? +match[2] : 0),\n );\n}\n\n// Round to the nearest step\nexport function round(number, step) {\n if (step < 1) {\n const places = getDecimalPlaces(step);\n return parseFloat(number.toFixed(places));\n }\n return Math.round(number / step) * step;\n}\n\nexport default { getDecimalPlaces, round };\n","// Trigger event\nexport function trigger(element, type) {\n if (!element || !type) {\n return;\n }\n\n // Create and dispatch the event\n const event = new Event(type, { bubbles: true });\n\n // Dispatch the event\n element.dispatchEvent(event);\n}\n\nexport default { trigger };\n","import { createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, createBlock as _createBlock, Transition as _Transition, withCtx as _withCtx, createVNode as _createVNode } from \"vue\";\nconst _hoisted_1 = {\n id: \"themeMask\"\n};\nconst _hoisted_2 = [\"cx\", \"cy\", \"r\"];\nconst _hoisted_3 = [\"r\"];\nconst _hoisted_4 = [\"opacity\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"div\", {\n id: \"themeToggle\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.handleToggleClick && $options.handleToggleClick(...args))\n }, [_createVNode(_Transition, {\n name: \"icon-fade\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [!$data.isAuto ? (_openBlock(), _createElementBlock(\"svg\", {\n key: \"sun-moon\",\n class: _normalizeClass([\"theme_toggle_svg\", {\n 'dark': $data.isDark\n }]),\n width: \"1.5em\",\n height: \"1.5em\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n stroke: \"currentColor\"\n }, [_createElementVNode(\"mask\", _hoisted_1, [_cache[1] || (_cache[1] = _createElementVNode(\"rect\", {\n x: \"0\",\n y: \"0\",\n width: \"100%\",\n height: \"100%\",\n fill: \"white\"\n }, null, -1)), _createElementVNode(\"circle\", {\n class: \"theme_toggle_circle1\",\n fill: \"black\",\n cx: $data.isDark ? '50%' : '100%',\n cy: $data.isDark ? '23%' : '0%',\n r: $data.isDark ? '9' : '5'\n }, null, 8, _hoisted_2)]), _createElementVNode(\"circle\", {\n class: \"theme_toggle_circle2\",\n cx: \"12\",\n cy: \"12\",\n r: $data.isDark ? '9' : '5',\n mask: \"url(#themeMask)\"\n }, null, 8, _hoisted_3), _createElementVNode(\"g\", {\n class: \"theme_toggle_g\",\n stroke: \"currentColor\",\n opacity: $data.isDark ? 0 : 1\n }, [...(_cache[2] || (_cache[2] = [_createElementVNode(\"line\", {\n x1: \"12\",\n y1: \"1\",\n x2: \"12\",\n y2: \"3\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"12\",\n y1: \"21\",\n x2: \"12\",\n y2: \"23\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"4.22\",\n y1: \"4.22\",\n x2: \"5.64\",\n y2: \"5.64\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"18.36\",\n y1: \"18.36\",\n x2: \"19.78\",\n y2: \"19.78\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"1\",\n y1: \"12\",\n x2: \"3\",\n y2: \"12\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"21\",\n y1: \"12\",\n x2: \"23\",\n y2: \"12\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"4.22\",\n y1: \"19.78\",\n x2: \"5.64\",\n y2: \"18.36\"\n }, null, -1), _createElementVNode(\"line\", {\n x1: \"18.36\",\n y1: \"5.64\",\n x2: \"19.78\",\n y2: \"4.22\"\n }, null, -1)]))], 8, _hoisted_4)], 2)) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: \"auto-mode\",\n icon: \"circle-half-stroke\",\n class: \"auto-icon\",\n style: {\n \"font-size\": \"1.5em\",\n \"color\": \"var(--theme-toggle-color)\"\n }\n }))]),\n _: 1\n })]);\n}","export default {\n name: 'ToggleDark',\n data() {\n return {\n isDark: this.$store.getters.useDarkMode,\n isAuto: !this.$store.getters.cusDarkMode\n };\n },\n methods: {\n handleToggleClick() {\n // 三种状态循环:亮色 -> 暗色 -> 跟随系统 -> 亮色\n if (this.isAuto) {\n // 当前是自动模式,切换到亮色\n this.isDark = false;\n this.isAuto = false;\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', false);\n } else if (!this.isDark) {\n // 当前是亮色,切换到暗色\n this.isDark = true;\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', true);\n } else {\n // 当前是暗色,切换到跟随系统\n this.isAuto = true;\n this.$store.commit('setCusDarkMode', false);\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./ToggleDark.vue?vue&type=template&id=466b2b5c&scoped=true\"\nimport script from \"./ToggleDark.vue?vue&type=script&lang=js\"\nexport * from \"./ToggleDark.vue?vue&type=script&lang=js\"\n\nimport \"./ToggleDark.vue?vue&type=style&index=0&id=466b2b5c&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-466b2b5c\"]])\n\nexport default __exports__","import { normalizeStyle as _normalizeStyle, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, withModifiers as _withModifiers, toDisplayString as _toDisplayString } from \"vue\";\nconst _hoisted_1 = [\"src\"];\nconst _hoisted_2 = [\"src\"];\nconst _hoisted_3 = {\n key: 2,\n class: \"video-placeholder\"\n};\nconst _hoisted_4 = {\n class: \"audio-cover\"\n};\nconst _hoisted_5 = [\"src\"];\nconst _hoisted_6 = {\n key: 1,\n class: \"audio-icon-large\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\"\n};\nconst _hoisted_7 = {\n class: \"audio-info\"\n};\nconst _hoisted_8 = {\n class: \"audio-title\"\n};\nconst _hoisted_9 = {\n key: 0,\n class: \"audio-artist\"\n};\nconst _hoisted_10 = [\"src\"];\nconst _hoisted_11 = {\n key: 4,\n class: \"audio-placeholder\"\n};\nconst _hoisted_12 = {\n class: \"audio-name\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return _openBlock(), _createElementBlock(\"div\", {\n class: \"tm-viewport\",\n ref: \"viewport\",\n onPointerdown: _cache[3] || (_cache[3] = (...args) => $options.onPointerDown && $options.onPointerDown(...args)),\n onPointermove: _cache[4] || (_cache[4] = (...args) => $options.onPointerMove && $options.onPointerMove(...args)),\n onPointerup: _cache[5] || (_cache[5] = (...args) => $options.onPointerUp && $options.onPointerUp(...args)),\n onPointercancel: _cache[6] || (_cache[6] = (...args) => $options.onPointerUp && $options.onPointerUp(...args)),\n onDblclick: _cache[7] || (_cache[7] = _withModifiers((...args) => $options.onDblClick && $options.onDblClick(...args), [\"prevent\"]))\n }, [$props.isImage ? (_openBlock(), _createElementBlock(\"img\", {\n key: 0,\n class: \"tm-media\",\n src: $props.src,\n draggable: \"false\",\n style: _normalizeStyle($options.mediaStyle),\n onLoad: _cache[0] || (_cache[0] = (...args) => $options.onLoad && $options.onLoad(...args))\n }, null, 44, _hoisted_1)) : $props.isVideo && $props.isActive ? (_openBlock(), _createElementBlock(\"div\", {\n key: 1,\n class: \"tm-video-wrap\",\n onPointerdown: _cache[1] || (_cache[1] = _withModifiers(() => {}, [\"stop\"]))\n }, [_createElementVNode(\"video\", {\n ref: \"videoEl\",\n class: \"plyr-video\",\n src: $props.src,\n playsinline: \"\"\n }, null, 8, _hoisted_2)], 32)) : $props.isVideo ? (_openBlock(), _createElementBlock(\"div\", _hoisted_3, [...(_cache[8] || (_cache[8] = [_createElementVNode(\"svg\", {\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\"\n }, [_createElementVNode(\"path\", {\n d: \"M8 5v14l11-7z\"\n })], -1)]))])) : $props.isAudio && $props.isActive ? (_openBlock(), _createElementBlock(\"div\", {\n key: 3,\n class: \"tm-audio-wrap\",\n onPointerdown: _cache[2] || (_cache[2] = _withModifiers(() => {}, [\"stop\"]))\n }, [_createElementVNode(\"div\", _hoisted_4, [$data.audioCover ? (_openBlock(), _createElementBlock(\"img\", {\n key: 0,\n src: $data.audioCover,\n class: \"cover-img\"\n }, null, 8, _hoisted_5)) : (_openBlock(), _createElementBlock(\"svg\", _hoisted_6, [...(_cache[9] || (_cache[9] = [_createElementVNode(\"path\", {\n d: \"M12 3v10.55c-.59-.34-1.27-.55-2-.55-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4V7h4V3h-6z\"\n }, null, -1)]))]))]), _createElementVNode(\"div\", _hoisted_7, [_createElementVNode(\"div\", _hoisted_8, _toDisplayString($data.audioTitle), 1), $data.audioArtist ? (_openBlock(), _createElementBlock(\"div\", _hoisted_9, _toDisplayString($data.audioArtist), 1)) : _createCommentVNode(\"\", true)]), _createElementVNode(\"audio\", {\n ref: \"audioEl\",\n class: \"plyr-audio\",\n src: $props.src\n }, null, 8, _hoisted_10)], 32)) : $props.isAudio ? (_openBlock(), _createElementBlock(\"div\", _hoisted_11, [_cache[10] || (_cache[10] = _createElementVNode(\"svg\", {\n class: \"audio-icon-large\",\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\"\n }, [_createElementVNode(\"path\", {\n d: \"M12 3v10.55c-.59-.34-1.27-.55-2-.55-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4V7h4V3h-6z\"\n })], -1)), _createElementVNode(\"span\", _hoisted_12, _toDisplayString($data.audioTitle), 1)])) : _createCommentVNode(\"\", true)], 544);\n}","// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\nconst isNullOrUndefined = input => input === null || typeof input === 'undefined';\nconst isObject = input => getConstructor(input) === Object;\nconst isNumber = input => getConstructor(input) === Number && !Number.isNaN(input);\nconst isString = input => getConstructor(input) === String;\nconst isBoolean = input => getConstructor(input) === Boolean;\nconst isFunction = input => typeof input === 'function';\nconst isArray = input => Array.isArray(input);\nconst isWeakMap = input => instanceOf(input, WeakMap);\nconst isNodeList = input => instanceOf(input, NodeList);\nconst isTextNode = input => getConstructor(input) === Text;\nconst isEvent = input => instanceOf(input, Event);\nconst isKeyboardEvent = input => instanceOf(input, KeyboardEvent);\nconst isCue = input => instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\nconst isTrack = input => instanceOf(input, TextTrack) || (!isNullOrUndefined(input) && isString(input.kind));\nconst isPromise = input => instanceOf(input, Promise) && isFunction(input.then);\n\nfunction isElement(input) {\n return input !== null\n && typeof input === 'object'\n && input.nodeType === 1\n && typeof input.style === 'object'\n && typeof input.ownerDocument === 'object';\n}\n\nfunction isEmpty(input) {\n return isNullOrUndefined(input)\n || ((isString(input) || isArray(input) || isNodeList(input)) && !input.length)\n || (isObject(input) && !Object.keys(input).length);\n}\n\nfunction isUrl(input) {\n // Accept a URL object\n if (instanceOf(input, window.URL)) {\n return true;\n }\n\n // Must be string from here\n if (!isString(input)) {\n return false;\n }\n\n // Add the protocol if required\n let string = input;\n if (!input.startsWith('http://') || !input.startsWith('https://')) {\n string = `http://${input}`;\n }\n\n try {\n return !isEmpty(new URL(string).hostname);\n }\n catch {\n return false;\n }\n}\n\nexport default {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n weakMap: isWeakMap,\n nodeList: isNodeList,\n element: isElement,\n textNode: isTextNode,\n event: isEvent,\n keyboardEvent: isKeyboardEvent,\n cue: isCue,\n track: isTrack,\n promise: isPromise,\n url: isUrl,\n empty: isEmpty,\n};\n","// ==========================================================================\n// Animation utils\n// ==========================================================================\n\nimport is from './is';\n\nexport const transitionEndEvent = (() => {\n const element = document.createElement('span');\n\n const events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend',\n };\n\n const type = Object.keys(events).find(event => element.style[event] !== undefined);\n\n return is.string(type) ? events[type] : false;\n})();\n\n// Force repaint of element\nexport function repaint(element, delay) {\n setTimeout(() => {\n try {\n element.hidden = true;\n // eslint-disable-next-line no-unused-expressions\n element.offsetHeight;\n element.hidden = false;\n }\n catch {}\n }, delay);\n}\n","// ==========================================================================\n// Object utils\n// ==========================================================================\n\nimport is from './is';\n\n// Clone nested objects\nexport function cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n}\n\n// Get a nested value in an object\nexport function getDeep(object, path) {\n return path.split('.').reduce((obj, key) => obj && obj[key], object);\n}\n\n// Deep extend destination object with N more objects\nexport function extend(target = {}, ...sources) {\n if (!sources.length) {\n return target;\n }\n\n const source = sources.shift();\n\n if (!is.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach((key) => {\n if (is.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, { [key]: {} });\n }\n\n extend(target[key], source[key]);\n }\n else {\n Object.assign(target, { [key]: source[key] });\n }\n });\n\n return extend(target, ...sources);\n}\n","// ==========================================================================\n// Element utils\n// ==========================================================================\n\nimport is from './is';\nimport { extend } from './objects';\n\n// Wrap an element\nexport function wrap(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n const targets = elements.length ? elements : [elements];\n\n // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n Array.from(targets)\n .reverse()\n .forEach((element, index) => {\n const child = index > 0 ? wrapper.cloneNode(true) : wrapper;\n // Cache the current parent and sibling.\n const parent = element.parentNode;\n const sibling = element.nextSibling;\n\n // Wrap the element (is automatically removed from its current\n // parent).\n child.appendChild(element);\n\n // If the element had a sibling, insert the wrapper before\n // the sibling to maintain the HTML structure; otherwise, just\n // append it to the parent.\n if (sibling) {\n parent.insertBefore(child, sibling);\n }\n else {\n parent.appendChild(child);\n }\n });\n}\n\n// Set attributes\nexport function setAttributes(element, attributes) {\n if (!is.element(element) || is.empty(attributes)) return;\n\n // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n Object.entries(attributes)\n .filter(([, value]) => !is.nullOrUndefined(value))\n .forEach(([key, value]) => element.setAttribute(key, value));\n}\n\n// Create a DocumentFragment\nexport function createElement(type, attributes, text) {\n // Create a new \n const element = document.createElement(type);\n\n // Set all passed attributes\n if (is.object(attributes)) {\n setAttributes(element, attributes);\n }\n\n // Add text node\n if (is.string(text)) {\n element.textContent = text;\n }\n\n // Return built element\n return element;\n}\n\n// Insert an element after another\nexport function insertAfter(element, target) {\n if (!is.element(element) || !is.element(target)) return;\n\n target.parentNode.insertBefore(element, target.nextSibling);\n}\n\n// Insert a DocumentFragment\nexport function insertElement(type, parent, attributes, text) {\n if (!is.element(parent)) return;\n\n parent.appendChild(createElement(type, attributes, text));\n}\n\n// Remove element(s)\nexport function removeElement(element) {\n if (is.nodeList(element) || is.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n\n if (!is.element(element) || !is.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n}\n\n// Remove all child elements\nexport function emptyElement(element) {\n if (!is.element(element)) return;\n\n let { length } = element.childNodes;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n}\n\n// Replace element\nexport function replaceElement(newChild, oldChild) {\n if (!is.element(oldChild) || !is.element(oldChild.parentNode) || !is.element(newChild)) return null;\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n\n return newChild;\n}\n\n// Get an attribute object from a string selector\nexport function getAttributesFromSelector(sel, existingAttributes) {\n // For example:\n // '.test' to { class: 'test' }\n // '#test' to { id: 'test' }\n // '[data-test=\"test\"]' to { 'data-test': 'test' }\n\n if (!is.string(sel) || is.empty(sel)) return {};\n\n const attributes = {};\n const existing = extend({}, existingAttributes);\n\n sel.split(',').forEach((s) => {\n // Remove whitespace\n const selector = s.trim();\n const className = selector.replace('.', '');\n const stripped = selector.replace(/[[\\]]/g, '');\n // Get the parts and value\n const parts = stripped.split('=');\n const [key] = parts;\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\n // Get the first character\n const start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (is.string(existing.class)) {\n attributes.class = `${existing.class} ${className}`;\n }\n else {\n attributes.class = className;\n }\n break;\n\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n\n case '[':\n // Attribute selector\n attributes[key] = value;\n\n break;\n\n default:\n break;\n }\n });\n\n return extend(existing, attributes);\n}\n\n// Toggle hidden\nexport function toggleHidden(element, hidden) {\n if (!is.element(element)) return;\n\n let hide = hidden;\n\n if (!is.boolean(hide)) {\n hide = !element.hidden;\n }\n\n element.hidden = hide;\n}\n\n// Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\nexport function toggleClass(element, className, force) {\n if (is.nodeList(element)) {\n return Array.from(element).map(e => toggleClass(e, className, force));\n }\n\n if (is.element(element)) {\n let method = 'toggle';\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n\n element.classList[method](className);\n return element.classList.contains(className);\n }\n\n return false;\n}\n\n// Has class name\nexport function hasClass(element, className) {\n return is.element(element) && element.classList.contains(className);\n}\n\n// Element matches selector\nexport function matches(element, selector) {\n const { prototype } = Element;\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n const method\n = prototype.matches\n || prototype.webkitMatchesSelector\n || prototype.mozMatchesSelector\n || prototype.msMatchesSelector\n || match;\n\n return method.call(element, selector);\n}\n\n// Closest ancestor element matching selector (also tests element itself)\nexport function closest(element, selector) {\n const { prototype } = Element;\n\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill\n function closestElement() {\n let el = this;\n\n do {\n if (matches.matches(el, selector)) return el;\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n return null;\n }\n\n const method = prototype.closest || closestElement;\n\n return method.call(element, selector);\n}\n\n// Find all elements\nexport function getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n}\n\n// Find a single element\nexport function getElement(selector) {\n return this.elements.container.querySelector(selector);\n}\n\n// Set focus and tab focus class\nexport function setFocus(element = null, focusVisible = false) {\n if (!is.element(element)) return;\n\n // Set regular focus\n element.focus({ preventScroll: true, focusVisible });\n}\n","// ==========================================================================\n// Plyr support checks\n// ==========================================================================\n\nimport { transitionEndEvent } from './utils/animation';\nimport { createElement } from './utils/elements';\nimport is from './utils/is';\n\n// Default codecs for checking mimetype support\nconst defaultCodecs = {\n 'audio/ogg': 'vorbis',\n 'audio/wav': '1',\n 'video/webm': 'vp8, vorbis',\n 'video/mp4': 'avc1.42E01E, mp4a.40.2',\n 'video/ogg': 'theora',\n};\n\n// Check for feature support\nconst support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n\n // Check for support\n // Basic functionality vs full UI\n check(type, provider) {\n const api = support[type] || provider !== 'html5';\n const ui = api && support.rangeInput;\n\n return {\n api,\n ui,\n };\n },\n\n // Picture-in-picture support\n pip: (() => {\n return (document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture);\n })(),\n\n // Airplay support\n // Safari only currently\n airplay: is.function(window.WebKitPlaybackTargetAvailabilityEvent),\n\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\n\n // Check for mime type support against a player instance\n // Credits: http://diveintohtml5.info/everything.html\n // Related: http://www.leanbackplayer.com/test/h5mt.html\n mime(input) {\n if (is.empty(input)) {\n return false;\n }\n\n const [mediaType] = input.split('/');\n let type = input;\n\n // Verify we're using HTML5 and there's no media type mismatch\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n // Add codec if required\n if (Object.keys(defaultCodecs).includes(type)) {\n type += `; codecs=\"${defaultCodecs[input]}\"`;\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n }\n catch {\n return false;\n }\n },\n\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n\n // Sliders\n rangeInput: (() => {\n const range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n })(),\n\n // Touch\n // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event\n touch: 'ontouchstart' in document.documentElement,\n\n // Detect transitions support\n transitions: transitionEndEvent !== false,\n\n // Reduced motion iOS & MacOS setting\n // https://webkit.org/blog/7551/responsive-design-for-motion/\n reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches,\n};\n\nexport default support;\n","// ==========================================================================\n// Event utils\n// ==========================================================================\n\nimport is from './is';\n\n// Check for passive event listener support\n// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n// https://www.youtube.com/watch?v=NPM6172J22g\nconst supportsPassiveListeners = (() => {\n // Test via a getter in the options object to see if the passive property is accessed\n let supported = false;\n try {\n const options = Object.defineProperty({}, 'passive', {\n get() {\n supported = true;\n return null;\n },\n });\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n }\n catch {}\n\n return supported;\n})();\n\n// Toggle event listener\nexport function toggleListener(element, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is.empty(event) || !is.function(callback)) {\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n let options = capture;\n\n // If passive events listeners are supported\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive,\n // Whether the listener is a capturing listener or not\n capture,\n };\n }\n\n // If a single node is passed, bind the event listener\n events.forEach((type) => {\n if (this && this.eventListeners && toggle) {\n // Cache event listener\n this.eventListeners.push({ element, type, callback, options });\n }\n\n element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n}\n\n// Bind event handler\nexport function on(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, true, passive, capture);\n}\n\n// Unbind event handler\nexport function off(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, false, passive, capture);\n}\n\n// Bind once-only event handler\nexport function once(element, events = '', callback, passive = true, capture = false) {\n const onceCallback = (...args) => {\n off(element, events, onceCallback, passive, capture);\n callback.apply(this, args);\n };\n\n toggleListener.call(this, element, events, onceCallback, true, passive, capture);\n}\n\n// Trigger event\nexport function triggerEvent(element, type = '', bubbles = false, detail = {}) {\n // Bail if no element\n if (!is.element(element) || is.empty(type)) {\n return;\n }\n\n // Create and dispatch the event\n const event = new CustomEvent(type, {\n bubbles,\n detail: { ...detail, plyr: this },\n });\n\n // Dispatch the event\n element.dispatchEvent(event);\n}\n\n// Unbind all cached event listeners\nexport function unbindListeners() {\n if (this && this.eventListeners) {\n this.eventListeners.forEach((item) => {\n const { element, type, callback, options } = item;\n element.removeEventListener(type, callback, options);\n });\n\n this.eventListeners = [];\n }\n}\n\n// Run method when / if player is ready\nexport function ready() {\n return new Promise(resolve =>\n this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve),\n ).then(() => {});\n}\n","import is from './is';\n/**\n * Silence a Promise-like object.\n * This is useful for avoiding non-harmful, but potentially confusing \"uncaught\n * play promise\" rejection error messages.\n * @param {object} value An object that may or may not be `Promise`-like.\n */\nexport function silencePromise(value) {\n if (is.promise(value)) {\n value.then(null, () => {});\n }\n}\n\nexport default { silencePromise };\n","// ==========================================================================\n// Array utils\n// ==========================================================================\n\nimport is from './is';\n\n// Remove duplicates in an array\nexport function dedupe(array) {\n if (!is.array(array)) {\n return array;\n }\n\n return array.filter((item, index) => array.indexOf(item) === index);\n}\n\n// Get the closest value in an array\nexport function closest(array, value) {\n if (!is.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce((prev, curr) => (Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev));\n}\n","// ==========================================================================\n// Style utils\n// ==========================================================================\n\nimport { closest } from './arrays';\nimport is from './is';\n\n// Check support for a CSS declaration\nexport function supportsCSS(declaration) {\n if (!window || !window.CSS) {\n return false;\n }\n\n return window.CSS.supports(declaration);\n}\n\n// Standard/common aspect ratios\nconst standardRatios = [\n [1, 1],\n [4, 3],\n [3, 4],\n [5, 4],\n [4, 5],\n [3, 2],\n [2, 3],\n [16, 10],\n [10, 16],\n [16, 9],\n [9, 16],\n [21, 9],\n [9, 21],\n [32, 9],\n [9, 32],\n].reduce((out, [x, y]) => ({ ...out, [x / y]: [x, y] }), {});\n\n// Validate an aspect ratio\nexport function validateAspectRatio(input) {\n if (!is.array(input) && (!is.string(input) || !input.includes(':'))) {\n return false;\n }\n\n const ratio = is.array(input) ? input : input.split(':');\n\n return ratio.map(Number).every(is.number);\n}\n\n// Reduce an aspect ratio to it's lowest form\nexport function reduceAspectRatio(ratio) {\n if (!is.array(ratio) || !ratio.every(is.number)) {\n return null;\n }\n\n const [width, height] = ratio;\n const getDivider = (w, h) => (h === 0 ? w : getDivider(h, w % h));\n const divider = getDivider(width, height);\n\n return [width / divider, height / divider];\n}\n\n// Calculate an aspect ratio\nexport function getAspectRatio(input) {\n const parse = ratio => (validateAspectRatio(ratio) ? ratio.split(':').map(Number) : null);\n // Try provided ratio\n let ratio = parse(input);\n\n // Get from config\n if (ratio === null) {\n ratio = parse(this.config.ratio);\n }\n\n // Get from embed\n if (ratio === null && !is.empty(this.embed) && is.array(this.embed.ratio)) {\n ({ ratio } = this.embed);\n }\n\n // Get from HTML5 video\n if (ratio === null && this.isHTML5) {\n const { videoWidth, videoHeight } = this.media;\n ratio = [videoWidth, videoHeight];\n }\n\n return reduceAspectRatio(ratio);\n}\n\n// Set aspect ratio for responsive container\nexport function setAspectRatio(input) {\n if (!this.isVideo) {\n return {};\n }\n\n const { wrapper } = this.elements;\n const ratio = getAspectRatio.call(this, input);\n\n if (!is.array(ratio)) {\n return {};\n }\n\n const [x, y] = reduceAspectRatio(ratio);\n const useNative = supportsCSS(`aspect-ratio: ${x}/${y}`);\n const padding = (100 / x) * y;\n\n if (useNative) {\n wrapper.style.aspectRatio = `${x}/${y}`;\n }\n else {\n wrapper.style.paddingBottom = `${padding}%`;\n }\n\n // For Vimeo we have an extra
to hide the standard controls and UI\n if (this.isVimeo && !this.config.vimeo.premium && this.supported.ui) {\n const height = (100 / this.media.offsetWidth) * Number.parseInt(window.getComputedStyle(this.media).paddingBottom, 10);\n const offset = (height - padding) / (height / 50);\n\n if (this.fullscreen.active) {\n wrapper.style.paddingBottom = null;\n }\n else {\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n }\n else if (this.isHTML5) {\n wrapper.classList.add(this.config.classNames.videoFixedRatio);\n }\n\n return { padding, ratio };\n}\n\n// Round an aspect ratio to closest standard ratio\nexport function roundAspectRatio(x, y, tolerance = 0.05) {\n const ratio = x / y;\n const closestRatio = closest(Object.keys(standardRatios), ratio);\n\n // Check match is within tolerance\n if (Math.abs(closestRatio - ratio) <= tolerance) {\n return standardRatios[closestRatio];\n }\n\n // No match\n return [x, y];\n}\n\n// Get the size of the viewport\n// https://stackoverflow.com/questions/1248081/how-to-get-the-browser-viewport-dimensions\nexport function getViewportSize() {\n const width = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0);\n const height = Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0);\n return [width, height];\n}\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport { removeElement } from './utils/elements';\nimport { triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { silencePromise } from './utils/promise';\nimport { setAspectRatio } from './utils/style';\n\nconst html5 = {\n getSources() {\n if (!this.isHTML5) {\n return [];\n }\n\n const sources = Array.from(this.media.querySelectorAll('source'));\n\n // Filter out unsupported sources (if type is specified)\n return sources.filter((source) => {\n const type = source.getAttribute('type');\n\n if (is.empty(type)) {\n return true;\n }\n\n return support.mime.call(this, type);\n });\n },\n\n // Get quality levels\n getQualityOptions() {\n // Whether we're forcing all options (e.g. for streaming)\n if (this.config.quality.forced) {\n return this.config.quality.options;\n }\n\n // Get sizes from elements\n return html5.getSources\n .call(this)\n .map(source => Number(source.getAttribute('size')))\n .filter(Boolean);\n },\n\n setup() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\n\n // Set speed options from config\n player.options.speed = player.config.speed.options;\n\n // Set aspect ratio if fixed\n if (!is.empty(this.config.ratio)) {\n setAspectRatio.call(player);\n }\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n // Get sources\n const sources = html5.getSources.call(player);\n const source = sources.find(s => s.getAttribute('src') === player.source);\n\n // Return size, if match is found\n return source && Number(source.getAttribute('size'));\n },\n set(input) {\n if (player.quality === input) {\n return;\n }\n\n // If we're using an external handler...\n if (player.config.quality.forced && is.function(player.config.quality.onChange)) {\n player.config.quality.onChange(input);\n }\n else {\n // Get sources\n const sources = html5.getSources.call(player);\n // Get first match for requested size\n const source = sources.find(s => Number(s.getAttribute('size')) === input);\n\n // No matching source found\n if (!source) {\n return;\n }\n\n // Get current state\n const { currentTime, paused, preload, readyState, playbackRate } = player.media;\n\n // Set new source\n player.media.src = source.getAttribute('src');\n\n // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n if (preload !== 'none' || readyState) {\n // Restore time\n player.once('loadedmetadata', () => {\n player.speed = playbackRate;\n player.currentTime = currentTime;\n\n // Resume playing\n if (!paused) {\n silencePromise(player.play());\n }\n });\n\n // Load new source\n player.media.load();\n }\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\n },\n });\n },\n\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests() {\n if (!this.isHTML5) {\n return;\n }\n\n // Remove child sources\n removeElement(html5.getSources.call(this));\n\n // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n this.media.setAttribute('src', this.config.blankVideo);\n\n // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n this.media.load();\n\n // Debugging\n this.debug.log('Cancelled network requests');\n },\n};\n\nexport default html5;\n","// ==========================================================================\n// Browser sniffing\n// Unfortunately, due to mixed support, UA sniffing is required\n// ==========================================================================\n\nconst isIE = Boolean(window.document.documentMode);\nconst isEdge = /Edge/.test(navigator.userAgent);\nconst isWebKit = 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent);\nconst isIPhone = /iPhone|iPod/i.test(navigator.userAgent) && navigator.maxTouchPoints > 1;\n// navigator.platform may be deprecated but this check is still required\nconst isIPadOS = navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1;\nconst isIos = /iPad|iPhone|iPod/i.test(navigator.userAgent) && navigator.maxTouchPoints > 1;\n\nexport default {\n isIE,\n isEdge,\n isWebKit,\n isIPhone,\n isIPadOS,\n isIos,\n};\n","// ==========================================================================\n// String utils\n// ==========================================================================\n\nimport is from './is';\n\n// Generate a random ID\nexport function generateId(prefix) {\n return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n}\n\n// Format string\nexport function format(input, ...args) {\n if (is.empty(input)) return input;\n\n return input.toString().replace(/\\{(\\d+)\\}/g, (_, i) => args[i].toString());\n}\n\n// Get percentage\nexport function getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n\n return ((current / max) * 100).toFixed(2);\n}\n\n// Replace all occurrences of a string in a string\nexport function replaceAll(input = '', find = '', replace = '') {\n return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n}\n\n// Convert to title case\nexport function toTitleCase(input = '') {\n return input.toString().replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.slice(1).toLowerCase());\n}\n\n// Convert string to pascalCase\nexport function toPascalCase(input = '') {\n let string = input.toString();\n\n // Convert kebab case\n string = replaceAll(string, '-', ' ');\n\n // Convert snake case\n string = replaceAll(string, '_', ' ');\n\n // Convert to title case\n string = toTitleCase(string);\n\n // Convert to pascal case\n return replaceAll(string, ' ', '');\n}\n\n// Convert string to pascalCase\nexport function toCamelCase(input = '') {\n let string = input.toString();\n\n // Convert to pascal case\n string = toPascalCase(string);\n\n // Convert first character to lowercase\n return string.charAt(0).toLowerCase() + string.slice(1);\n}\n\n// Remove HTML from a string\nexport function stripHTML(source) {\n const fragment = document.createDocumentFragment();\n const element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.textContent;\n}\n\n// Like outerHTML, but also works for DocumentFragment\nexport function getHTML(element) {\n const wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n}\n","// ==========================================================================\n// Plyr internationalization\n// ==========================================================================\n\nimport is from './is';\nimport { getDeep } from './objects';\nimport { replaceAll } from './strings';\n\n// Skip i18n for abbreviations and brand names\nconst resources = {\n pip: 'PIP',\n airplay: 'AirPlay',\n html5: 'HTML5',\n vimeo: 'Vimeo',\n youtube: 'YouTube',\n};\n\nconst i18n = {\n get(key = '', config = {}) {\n if (is.empty(key) || is.empty(config)) {\n return '';\n }\n\n let string = getDeep(config.i18n, key);\n\n if (is.empty(string)) {\n if (Object.keys(resources).includes(key)) {\n return resources[key];\n }\n\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([k, v]) => {\n string = replaceAll(string, k, v);\n });\n\n return string;\n },\n};\n\nexport default i18n;\n","// ==========================================================================\n// Plyr storage\n// ==========================================================================\n\nimport is from './utils/is';\nimport { extend } from './utils/objects';\n\nclass Storage {\n constructor(player) {\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n }\n\n // Check for actual support (see if we can use it)\n static get supported() {\n try {\n if (!('localStorage' in window)) return false;\n const test = '___test';\n // Try to use it (it might be disabled, e.g. user is in private mode)\n // see: https://github.com/sampotts/plyr/issues/131\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n return true;\n }\n catch {\n return false;\n }\n }\n\n get = (key) => {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n const store = window.localStorage.getItem(this.key);\n if (is.empty(store)) return null;\n const json = JSON.parse(store);\n return is.string(key) && key.length ? json[key] : json;\n };\n\n set = (object) => {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !this.enabled) {\n return;\n }\n\n // Can only store objects\n if (!is.object(object)) {\n return;\n }\n\n // Get current storage\n let storage = this.get();\n\n // Default to empty object\n if (is.empty(storage)) {\n storage = {};\n }\n\n // Update the working copy of the values\n extend(storage, object);\n\n // Update storage\n try {\n window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n catch { }\n };\n}\n\nexport default Storage;\n","// ==========================================================================\n// Fetch wrapper\n// Using XHR to avoid issues with older browsers\n// ==========================================================================\n\nexport default function fetch(url, responseType = 'text', withCredentials = false) {\n return new Promise((resolve, reject) => {\n try {\n const request = new XMLHttpRequest();\n\n // Check for CORS support\n if (!('withCredentials' in request)) return;\n\n // Set to true if needed for CORS\n if (withCredentials) {\n request.withCredentials = true;\n }\n\n request.addEventListener('load', () => {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n }\n catch {\n resolve(request.responseText);\n }\n }\n else {\n resolve(request.response);\n }\n });\n\n request.addEventListener('error', () => {\n throw new Error(request.status);\n });\n\n request.open('GET', url, true);\n request.responseType = responseType;\n request.send();\n }\n catch (error) {\n reject(error);\n }\n });\n}\n","// ==========================================================================\n// Sprite loader\n// ==========================================================================\n\nimport Storage from '../storage';\nimport fetch from './fetch';\nimport is from './is';\n\n// Load an external SVG sprite\nexport default function loadSprite(url, id) {\n if (!is.string(url)) {\n return;\n }\n\n const prefix = 'cache';\n const hasId = is.string(id);\n let isCached = false;\n const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\n container.innerHTML = data;\n\n // Check again incase of race condition\n if (hasId && exists()) {\n return;\n }\n\n // Inject the SVG to the body\n document.body.insertAdjacentElement('afterbegin', container);\n };\n\n // Only load once if ID set\n if (!hasId || !exists()) {\n const useStorage = Storage.supported;\n // Create container\n const container = document.createElement('div');\n container.setAttribute('hidden', '');\n\n if (hasId) {\n container.setAttribute('id', id);\n }\n\n // Check in cache\n if (useStorage) {\n const cached = window.localStorage.getItem(`${prefix}-${id}`);\n isCached = cached !== null;\n\n if (isCached) {\n const data = JSON.parse(cached);\n update(container, data.content);\n }\n }\n\n // Get the sprite\n fetch(url)\n .then((result) => {\n if (is.empty(result)) {\n return;\n }\n\n if (useStorage) {\n try {\n window.localStorage.setItem(\n `${prefix}-${id}`,\n JSON.stringify({\n content: result,\n }),\n );\n }\n catch {}\n }\n\n update(container, result);\n })\n .catch(() => {});\n }\n}\n","// ==========================================================================\n// Time utils\n// ==========================================================================\n\nimport is from './is';\n\n// Time helpers\nexport const getHours = value => Math.trunc((value / 60 / 60) % 60, 10);\nexport const getMinutes = value => Math.trunc((value / 60) % 60, 10);\nexport const getSeconds = value => Math.trunc(value % 60, 10);\n\n// Format time to UI friendly string\nexport function formatTime(time = 0, displayHours = false, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return formatTime(undefined, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = value => `0${value}`.slice(-2);\n // Breakdown to hours, mins, secs\n let hours = getHours(time);\n const mins = getMinutes(time);\n const secs = getSeconds(time);\n\n // Do we need to display hours?\n if (displayHours || hours > 0) {\n hours = `${hours}:`;\n }\n else {\n hours = '';\n }\n\n // Render\n return `${inverted && time > 0 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n}\n","// ==========================================================================\n// Plyr controls\n// TODO: This needs to be split into smaller files and cleaned up\n// ==========================================================================\n\nimport RangeTouch from 'rangetouch';\n\nimport captions from './captions';\nimport html5 from './html5';\nimport support from './support';\nimport { repaint, transitionEndEvent } from './utils/animation';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n getElement,\n getElements,\n hasClass,\n matches,\n removeElement,\n setAttributes,\n setFocus,\n toggleClass,\n toggleHidden,\n} from './utils/elements';\nimport { off, on } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadSprite from './utils/load-sprite';\nimport { extend } from './utils/objects';\nimport { getPercentage, replaceAll, toCamelCase, toTitleCase } from './utils/strings';\nimport { formatTime, getHours } from './utils/time';\n\n// TODO: Don't export a massive object - break down and create class\nconst controls = {\n // Get icon URL\n getIconUrl() {\n const url = new URL(this.config.iconUrl, window.location);\n const host = window.location.host ? window.location.host : window.top.location.host;\n const cors = url.host !== host || (browser.isIE && !window.svg4everybody);\n\n return {\n url: this.config.iconUrl,\n cors,\n };\n },\n\n // Find the UI controls\n findElements() {\n try {\n this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper);\n\n // Buttons\n this.elements.buttons = {\n play: getElements.call(this, this.config.selectors.buttons.play),\n pause: getElement.call(this, this.config.selectors.buttons.pause),\n restart: getElement.call(this, this.config.selectors.buttons.restart),\n rewind: getElement.call(this, this.config.selectors.buttons.rewind),\n fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),\n mute: getElement.call(this, this.config.selectors.buttons.mute),\n pip: getElement.call(this, this.config.selectors.buttons.pip),\n airplay: getElement.call(this, this.config.selectors.buttons.airplay),\n settings: getElement.call(this, this.config.selectors.buttons.settings),\n captions: getElement.call(this, this.config.selectors.buttons.captions),\n fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen),\n };\n\n // Progress\n this.elements.progress = getElement.call(this, this.config.selectors.progress);\n\n // Inputs\n this.elements.inputs = {\n seek: getElement.call(this, this.config.selectors.inputs.seek),\n volume: getElement.call(this, this.config.selectors.inputs.volume),\n };\n\n // Display\n this.elements.display = {\n buffer: getElement.call(this, this.config.selectors.display.buffer),\n currentTime: getElement.call(this, this.config.selectors.display.currentTime),\n duration: getElement.call(this, this.config.selectors.display.duration),\n };\n\n // Seek tooltip\n if (is.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(`.${this.config.classNames.tooltip}`);\n }\n\n return true;\n }\n catch (error) {\n // Log it\n this.debug.warn('It looks like there is a problem with your custom controls HTML', error);\n\n // Restore native video controls\n this.toggleNativeControls(true);\n\n return false;\n }\n },\n\n // Create icon\n createIcon(type, attributes) {\n const namespace = 'http://www.w3.org/2000/svg';\n const iconUrl = controls.getIconUrl.call(this);\n const iconPath = `${!iconUrl.cors ? iconUrl.url : ''}#${this.config.iconPrefix}`;\n // Create \n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(\n icon,\n extend(attributes, {\n 'aria-hidden': 'true',\n 'focusable': 'false',\n }),\n );\n\n // Create the to reference sprite\n const use = document.createElementNS(namespace, 'use');\n const path = `${iconPath}-${type}`;\n\n // Set `href` attributes\n // https://github.com/sampotts/plyr/issues/460\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n }\n\n // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n\n // Add to \n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(key, attr = {}) {\n const text = i18n.get(key, this.config);\n const attributes = { ...attr, class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' ') };\n\n return createElement('span', attributes, text);\n },\n\n // Create a badge\n createBadge(text) {\n if (is.empty(text)) {\n return null;\n }\n\n const badge = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n badge.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.menu.badge,\n },\n text,\n ),\n );\n\n return badge;\n },\n\n // Create a
`);\n }\n\n // Set position\n tipElement.style.left = `${percent}%`;\n\n // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n if (is.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n\n // Handle time change event\n timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n const invert = !is.element(this.elements.display.duration) && this.config.invertTime;\n\n // Duration\n controls.updateTimeDisplay.call(\n this,\n this.elements.display.currentTime,\n invert ? this.duration - this.currentTime : this.currentTime,\n invert,\n );\n\n // Ignore updates while seeking\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n }\n\n // Playing progress\n controls.updateProgress.call(this, event);\n },\n\n // Show the duration on metadataloaded or durationchange events\n durationUpdate() {\n // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false\n if (!this.supported.ui || (!this.config.invertTime && this.currentTime)) {\n return;\n }\n\n // If duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.\n // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415\n // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062\n // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338\n if (this.duration >= 2 ** 32) {\n toggleHidden(this.elements.display.currentTime, true);\n toggleHidden(this.elements.progress, true);\n return;\n }\n\n // Update ARIA values\n if (is.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n }\n\n // If there's a spot to display duration\n const hasDuration = is.element(this.elements.display.duration);\n\n // If there's only one time display, display duration there\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n }\n\n // If there's a duration element, update content\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n }\n\n if (this.config.markers.enabled) {\n controls.setMarkers.call(this);\n }\n\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n\n // Hide/show a tab\n toggleMenuButton(setting, toggle) {\n toggleHidden(this.elements.settings.buttons[setting], !toggle);\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panels[setting];\n let value = null;\n let list = container;\n\n if (setting === 'captions') {\n value = this.currentTrack;\n }\n else {\n value = !is.empty(input) ? input : this[setting];\n\n // Get default\n if (is.empty(value)) {\n value = this.config[setting].default;\n }\n\n // Unsupported value\n if (!is.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(`Unsupported value of '${value}' for ${setting}`);\n return;\n }\n\n // Disabled value\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(`Disabled value of '${value}' for ${setting}`);\n return;\n }\n }\n\n // Get the list if we need to\n if (!is.element(list)) {\n list = pane && pane.querySelector('[role=\"menu\"]');\n }\n\n // If there's no list it means it's not been rendered...\n if (!is.element(list)) {\n return;\n }\n\n // Update the label\n const label = this.elements.settings.buttons[setting].querySelector(`.${this.config.classNames.menu.value}`);\n label.innerHTML = controls.getLabel.call(this, setting, value);\n\n // Find the radio option and check it\n const target = list && list.querySelector(`[value=\"${value}\"]`);\n\n if (is.element(target)) {\n target.checked = true;\n }\n },\n\n // Translate a value into a nice label\n getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : `${value}×`;\n\n case 'quality':\n if (is.number(value)) {\n const label = i18n.get(`qualityLabel.${value}`, this.config);\n\n if (!label.length) {\n return `${value}p`;\n }\n\n return label;\n }\n\n return toTitleCase(value);\n\n case 'captions':\n return captions.getLabel.call(this);\n\n default:\n return null;\n }\n },\n\n // Set the quality menu\n setQualityMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]');\n\n // Set options if passed and filter based on uniqueness and config\n if (is.array(options)) {\n this.options.quality = dedupe(options).filter(quality => this.config.quality.options.includes(quality));\n }\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = (quality) => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(this, label);\n };\n\n // Sort options by the config and then render options\n this.options.quality\n .sort((a, b) => {\n const sorting = this.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n })\n .forEach((quality) => {\n controls.createMenuItem.call(this, {\n value: quality,\n list,\n type,\n title: controls.getLabel.call(this, 'quality', quality),\n badge: getBadge(quality),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n\n // Show the pane and tab\n toggleHidden(this.elements.settings.buttons.loop, false);\n toggleHidden(this.elements.settings.panels.loop, false);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleMenuButton.call(this, 'loop', toggle);\n\n // Empty the menu\n emptyElement(list);\n\n options.forEach(option => {\n const item = createElement('li');\n\n const button = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {\n type: 'button',\n class: this.config.classNames.control,\n 'data-plyr-loop-action': option,\n }),\n i18n.get(option, this.config)\n );\n\n if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\n\n item.appendChild(button);\n list.appendChild(item);\n });\n }, */\n\n // Get current selected caption language\n // TODO: rework this to user the getter in the API?\n\n // Set a list of available captions languages\n setCaptionsMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.captions)) {\n return;\n }\n\n // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n const tracks = captions.getTracks.call(this);\n const toggle = Boolean(tracks.length);\n\n // Toggle the pane and tab\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If there's no captions, bail\n if (!toggle) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.toggled && this.currentTrack === value,\n title: captions.getLabel.call(this, track),\n badge: track.language && controls.createBadge.call(this, track.language.toUpperCase()),\n list,\n type: 'language',\n }));\n\n // Add the \"Disabled\" option to turn off captions\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list,\n type: 'language',\n });\n\n // Generate options\n options.forEach(controls.createMenuItem.bind(this));\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.speed)) {\n return;\n }\n\n const type = 'speed';\n const list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]');\n\n // Filter out invalid speeds\n this.options.speed = this.options.speed.filter(o => o >= this.minimumSpeed && o <= this.maximumSpeed);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Create items\n this.options.speed.forEach((speed) => {\n controls.createMenuItem.call(this, {\n value: speed,\n list,\n type,\n title: controls.getLabel.call(this, 'speed', speed),\n });\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const { buttons } = this.elements.settings;\n const visible = !is.empty(buttons) && Object.values(buttons).some(button => !button.hidden);\n\n toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Focus the first menu item in a given (or visible) menu\n focusFirstMenuItem(pane, focusVisible = false) {\n if (this.elements.settings.popup.hidden) {\n return;\n }\n\n let target = pane;\n\n if (!is.element(target)) {\n target = Object.values(this.elements.settings.panels).find(p => !p.hidden);\n }\n\n const firstItem = target.querySelector('[role^=\"menuitem\"]');\n\n setFocus.call(this, firstItem, focusVisible);\n },\n\n // Show/hide menu\n toggleMenu(input) {\n const { popup } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!is.element(popup) || !is.element(button)) {\n return;\n }\n\n // True toggle by default\n const { hidden } = popup;\n let show = hidden;\n\n if (is.boolean(input)) {\n show = input;\n }\n else if (is.keyboardEvent(input) && input.key === 'Escape') {\n show = false;\n }\n else if (is.event(input)) {\n // If Plyr is in a shadowDOM, the event target is set to the component, instead of the\n // Element in the shadowDOM. The path, if available, is complete.\n const target = is.function(input.composedPath) ? input.composedPath()[0] : input.target;\n const isMenuItem = popup.contains(target);\n\n // If the click was inside the menu or if the click\n // wasn't the button or menu item and we're trying to\n // show the menu (a doc click shouldn't show the menu)\n if (isMenuItem || (!isMenuItem && input.target !== button && show)) {\n return;\n }\n }\n\n // Set button attributes\n button.setAttribute('aria-expanded', show);\n\n // Show the actual popup\n toggleHidden(popup, !show);\n\n // Add class hook\n toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n // Focus the first item if key interaction\n if (show && is.keyboardEvent(input)) {\n controls.focusFirstMenuItem.call(this, null, true);\n }\n else if (!show && !hidden) {\n // If closing, re-focus the button\n setFocus.call(this, button, is.keyboardEvent(input));\n }\n },\n\n // Get the natural size of a menu panel\n getMenuSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Append to parent so we get the \"real\" size\n tab.parentNode.appendChild(clone);\n\n // Get the sizes before we remove\n const width = clone.scrollWidth;\n const height = clone.scrollHeight;\n\n // Remove from the DOM\n removeElement(clone);\n\n return {\n width,\n height,\n };\n },\n\n // Show a panel in the menu\n showMenuPanel(type = '', focusVisible = false) {\n const target = this.elements.container.querySelector(`#plyr-settings-${this.id}-${type}`);\n\n // Nothing to show, bail\n if (!is.element(target)) {\n return;\n }\n\n // Hide all other panels\n const container = target.parentNode;\n const current = Array.from(container.children).find(node => !node.hidden);\n\n // If we can do fancy animations, we'll animate the height/width\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = `${current.scrollWidth}px`;\n container.style.height = `${current.scrollHeight}px`;\n\n // Get potential sizes\n const size = controls.getMenuSize.call(this, target);\n\n // Restore auto height/width\n const restore = (event) => {\n // We're only bothered about height and width on the container\n if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n // Only listen once\n off.call(this, container, transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n on.call(this, container, transitionEndEvent, restore);\n\n // Set dimensions to target\n container.style.width = `${size.width}px`;\n container.style.height = `${size.height}px`;\n }\n\n // Set attributes on current tab\n toggleHidden(current, true);\n\n // Set attributes on target\n toggleHidden(target, false);\n\n // Focus the first item\n controls.focusFirstMenuItem.call(this, target, focusVisible);\n },\n\n // Set the download URL\n setDownloadUrl() {\n const button = this.elements.buttons.download;\n\n // Bail if no button\n if (!is.element(button)) {\n return;\n }\n\n // Set attribute\n button.setAttribute('href', this.download);\n },\n\n // Build the default HTML\n create(data) {\n const {\n bindMenuItemShortcuts,\n createButton,\n createProgress,\n createRange,\n createTime,\n setQualityMenu,\n setSpeedMenu,\n showMenuPanel,\n } = controls;\n this.elements.controls = null;\n\n // Larger overlaid play button\n if (is.array(this.config.controls) && this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(createButton.call(this, 'play-large'));\n }\n\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n this.elements.controls = container;\n\n // Default item attributes\n const defaultAttributes = { class: 'plyr__controls__item' };\n\n // Loop through controls in order\n dedupe(is.array(this.config.controls) ? this.config.controls : []).forEach((control) => {\n // Restart button\n if (control === 'restart') {\n container.appendChild(createButton.call(this, 'restart', defaultAttributes));\n }\n\n // Rewind button\n if (control === 'rewind') {\n container.appendChild(createButton.call(this, 'rewind', defaultAttributes));\n }\n\n // Play/Pause button\n if (control === 'play') {\n container.appendChild(createButton.call(this, 'play', defaultAttributes));\n }\n\n // Fast forward button\n if (control === 'fast-forward') {\n container.appendChild(createButton.call(this, 'fast-forward', defaultAttributes));\n }\n\n // Progress\n if (control === 'progress') {\n const progressContainer = createElement('div', {\n class: `${defaultAttributes.class} plyr__progress__container`,\n });\n\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n progress.appendChild(\n createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\n\n // Buffer progress\n progress.appendChild(createProgress.call(this, 'buffer'));\n\n // TODO: Add loop display indicator\n\n // Seek tooltip\n if (this.config.tooltips.seek) {\n const tooltip = createElement(\n 'span',\n {\n class: this.config.classNames.tooltip,\n },\n '00:00',\n );\n\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n\n this.elements.progress = progress;\n progressContainer.appendChild(this.elements.progress);\n container.appendChild(progressContainer);\n }\n\n // Media current time display\n if (control === 'current-time') {\n container.appendChild(createTime.call(this, 'currentTime', defaultAttributes));\n }\n\n // Media duration display\n if (control === 'duration') {\n container.appendChild(createTime.call(this, 'duration', defaultAttributes));\n }\n\n // Volume controls\n if (control === 'mute' || control === 'volume') {\n let { volume } = this.elements;\n\n // Create the volume container if needed\n if (!is.element(volume) || !container.contains(volume)) {\n volume = createElement(\n 'div',\n extend({}, defaultAttributes, {\n class: `${defaultAttributes.class} plyr__volume`.trim(),\n }),\n );\n\n this.elements.volume = volume;\n\n container.appendChild(volume);\n }\n\n // Toggle mute button\n if (control === 'mute') {\n volume.appendChild(createButton.call(this, 'mute'));\n }\n\n // Volume range control\n // Ignored on iOS as it's handled globally\n // https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html\n if (control === 'volume' && !browser.isIos && !browser.isIPadOS) {\n // Set the attributes\n const attributes = {\n max: 1,\n step: 0.05,\n value: this.config.volume,\n };\n\n // Create the volume range slider\n volume.appendChild(\n createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n }\n }\n\n // Toggle captions button\n if (control === 'captions') {\n container.appendChild(createButton.call(this, 'captions', defaultAttributes));\n }\n\n // Settings button / menu\n if (control === 'settings' && !is.empty(this.config.settings)) {\n const wrapper = createElement(\n 'div',\n extend({}, defaultAttributes, {\n class: `${defaultAttributes.class} plyr__menu`.trim(),\n hidden: '',\n }),\n );\n\n wrapper.appendChild(\n createButton.call(this, 'settings', {\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const popup = createElement('div', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n });\n\n const inner = createElement('div');\n\n const home = createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n });\n\n // Create the menu\n const menu = createElement('div', {\n role: 'menu',\n });\n\n home.appendChild(menu);\n inner.appendChild(home);\n this.elements.settings.panels.home = home;\n\n // Build the menu items\n this.config.settings.forEach((type) => {\n // TODO: bundle this with the createMenuItem helper and bindings\n const menuItem = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.settings), {\n 'type': 'button',\n 'class': `${this.config.classNames.control} ${this.config.classNames.control}--forward`,\n 'role': 'menuitem',\n 'aria-haspopup': true,\n 'hidden': '',\n }),\n );\n\n // Bind menu shortcuts for keyboard users\n bindMenuItemShortcuts.call(this, menuItem, type);\n\n // Show menu on click\n on.call(this, menuItem, 'click', () => {\n showMenuPanel.call(this, type, false);\n });\n\n const flex = createElement('span', null, i18n.get(type, this.config));\n\n const value = createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n // Speed contains HTML entities\n value.innerHTML = data[type];\n\n flex.appendChild(value);\n menuItem.appendChild(flex);\n menu.appendChild(menuItem);\n\n // Build the panes\n const pane = createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n });\n\n // Back button\n const backButton = createElement('button', {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n });\n\n // Visible label\n backButton.appendChild(\n createElement(\n 'span',\n {\n 'aria-hidden': true,\n },\n i18n.get(type, this.config),\n ),\n );\n\n // Screen reader label\n backButton.appendChild(\n createElement(\n 'span',\n {\n class: this.config.classNames.hidden,\n },\n i18n.get('menuBack', this.config),\n ),\n );\n\n // Go back via keyboard\n on.call(\n this,\n pane,\n 'keydown',\n (event) => {\n if (event.key !== 'ArrowLeft') return;\n\n // Prevent seek\n event.preventDefault();\n event.stopPropagation();\n\n // Show the respective menu\n showMenuPanel.call(this, 'home', true);\n },\n false,\n );\n\n // Go back via button click\n on.call(this, backButton, 'click', () => {\n showMenuPanel.call(this, 'home', false);\n });\n\n // Add to pane\n pane.appendChild(backButton);\n\n // Menu\n pane.appendChild(\n createElement('div', {\n role: 'menu',\n }),\n );\n\n inner.appendChild(pane);\n\n this.elements.settings.buttons[type] = menuItem;\n this.elements.settings.panels[type] = pane;\n });\n\n popup.appendChild(inner);\n wrapper.appendChild(popup);\n container.appendChild(wrapper);\n\n this.elements.settings.popup = popup;\n this.elements.settings.menu = wrapper;\n }\n\n // Picture in picture button\n if (control === 'pip' && support.pip) {\n container.appendChild(createButton.call(this, 'pip', defaultAttributes));\n }\n\n // Airplay button\n if (control === 'airplay' && support.airplay) {\n container.appendChild(createButton.call(this, 'airplay', defaultAttributes));\n }\n\n // Download button\n if (control === 'download') {\n const attributes = extend({}, defaultAttributes, {\n element: 'a',\n href: this.download,\n target: '_blank',\n });\n\n // Set download attribute for HTML5 only\n if (this.isHTML5) {\n attributes.download = '';\n }\n\n const { download } = this.config.urls;\n\n if (!is.url(download) && this.isEmbed) {\n extend(attributes, {\n icon: `logo-${this.provider}`,\n label: this.provider,\n });\n }\n\n container.appendChild(createButton.call(this, 'download', attributes));\n }\n\n // Toggle fullscreen button\n if (control === 'fullscreen') {\n container.appendChild(createButton.call(this, 'fullscreen', defaultAttributes));\n }\n });\n\n // Set available quality levels\n if (this.isHTML5) {\n setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n setSpeedMenu.call(this);\n\n return container;\n },\n\n // Insert controls\n inject() {\n // Sprite\n if (this.config.loadSprite) {\n const icon = controls.getIconUrl.call(this);\n\n // Only load external sprite using AJAX\n if (icon.cors) {\n loadSprite(icon.url, 'sprite-plyr');\n }\n }\n\n // Create a unique ID\n this.id = Math.floor(Math.random() * 10000);\n\n // Null by default\n let container = null;\n this.elements.controls = null;\n\n // Set template properties\n const props = {\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title,\n };\n let update = true;\n\n // If function, run it and use output\n if (is.function(this.config.controls)) {\n this.config.controls = this.config.controls.call(this, props);\n }\n\n // Convert falsy controls to empty array (primarily for empty strings)\n if (!this.config.controls) {\n this.config.controls = [];\n }\n\n if (is.element(this.config.controls) || is.string(this.config.controls)) {\n // HTMLElement or Non-empty string passed as the option\n container = this.config.controls;\n }\n else {\n // Create controls\n container = controls.create.call(this, {\n id: this.id,\n seektime: this.config.seekTime,\n speed: this.speed,\n quality: this.quality,\n captions: captions.getLabel.call(this),\n // TODO: Looping\n // loop: 'None',\n });\n update = false;\n }\n\n // Replace props with their value\n const replace = (input) => {\n let result = input;\n\n Object.entries(props).forEach(([key, value]) => {\n result = replaceAll(result, `{${key}}`, value);\n });\n\n return result;\n };\n\n // Update markup\n if (update) {\n if (is.string(this.config.controls)) {\n container = replace(container);\n }\n }\n\n // Controls container\n let target;\n\n // Inject to custom location\n if (is.string(this.config.selectors.controls.container)) {\n target = document.querySelector(this.config.selectors.controls.container);\n }\n\n // Inject into the container by default\n if (!is.element(target)) {\n target = this.elements.container;\n }\n\n // Inject controls HTML (needs to be before captions, hence \"afterbegin\")\n const insertMethod = is.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n target[insertMethod]('afterbegin', container);\n\n // Find the elements if need be\n if (!is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Add pressed property to buttons\n if (!is.empty(this.elements.buttons)) {\n const addProperty = (button) => {\n const className = this.config.classNames.controlPressed;\n button.setAttribute('aria-pressed', 'false');\n\n Object.defineProperty(button, 'pressed', {\n configurable: true,\n enumerable: true,\n get() {\n return hasClass(button, className);\n },\n set(pressed = false) {\n toggleClass(button, className, pressed);\n button.setAttribute('aria-pressed', pressed ? 'true' : 'false');\n },\n });\n };\n\n // Toggle classname when pressed property is set\n Object.values(this.elements.buttons)\n .filter(Boolean)\n .forEach((button) => {\n if (is.array(button) || is.nodeList(button)) {\n Array.from(button).filter(Boolean).forEach(addProperty);\n }\n else {\n addProperty(button);\n }\n });\n }\n\n // Edge sometimes doesn't finish the paint so force a repaint\n if (browser.isEdge) {\n repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const { classNames, selectors } = this.config;\n const selector = `${selectors.controls.wrapper} ${selectors.labels} .${classNames.hidden}`;\n const labels = getElements.call(this, selector);\n\n Array.from(labels).forEach((label) => {\n toggleClass(label, this.config.classNames.hidden, false);\n toggleClass(label, this.config.classNames.tooltip, true);\n });\n }\n },\n\n // Set media metadata\n setMediaMetadata() {\n try {\n if ('mediaSession' in navigator) {\n navigator.mediaSession.metadata = new window.MediaMetadata({\n title: this.config.mediaMetadata.title,\n artist: this.config.mediaMetadata.artist,\n album: this.config.mediaMetadata.album,\n artwork: this.config.mediaMetadata.artwork,\n });\n }\n }\n catch {\n // Do nothing\n }\n },\n\n // Add markers\n setMarkers() {\n if (!this.duration || this.elements.markers) return;\n\n // Get valid points\n const points = this.config.markers?.points?.filter(({ time }) => time > 0 && time < this.duration);\n if (!points?.length) return;\n\n const containerFragment = document.createDocumentFragment();\n const pointsFragment = document.createDocumentFragment();\n let tipElement = null;\n const tipVisible = `${this.config.classNames.tooltip}--visible`;\n const toggleTip = show => toggleClass(tipElement, tipVisible, show);\n\n // Inject markers to progress container\n points.forEach((point) => {\n const markerElement = createElement(\n 'span',\n {\n class: this.config.classNames.marker,\n },\n '',\n );\n\n const left = `${(point.time / this.duration) * 100}%`;\n\n if (tipElement) {\n // Show on hover\n markerElement.addEventListener('mouseenter', () => {\n if (point.label) return;\n tipElement.style.left = left;\n tipElement.innerHTML = point.label;\n toggleTip(true);\n });\n\n // Hide on leave\n markerElement.addEventListener('mouseleave', () => {\n toggleTip(false);\n });\n }\n\n markerElement.addEventListener('click', () => {\n this.currentTime = point.time;\n });\n\n markerElement.style.left = left;\n pointsFragment.appendChild(markerElement);\n });\n\n containerFragment.appendChild(pointsFragment);\n\n // Inject a tooltip if needed\n if (!this.config.tooltips.seek) {\n tipElement = createElement(\n 'span',\n {\n class: this.config.classNames.tooltip,\n },\n '',\n );\n\n containerFragment.appendChild(tipElement);\n }\n\n this.elements.markers = {\n points: pointsFragment,\n tip: tipElement,\n };\n\n this.elements.progress.appendChild(containerFragment);\n },\n};\n\nexport default controls;\n","// ==========================================================================\n// URL utils\n// ==========================================================================\n\nimport is from './is';\n\n/**\n * Parse a string to a URL object\n * @param {string} input - the URL to be parsed\n * @param {boolean} safe - failsafe parsing\n */\nexport function parseUrl(input, safe = true) {\n let url = input;\n\n if (safe) {\n const parser = document.createElement('a');\n parser.href = url;\n url = parser.href;\n }\n\n try {\n return new URL(url);\n }\n catch {\n return null;\n }\n}\n\n// Convert object to URLSearchParams\nexport function buildUrlParams(input) {\n const params = new URLSearchParams();\n\n if (is.object(input)) {\n Object.entries(input).forEach(([key, value]) => {\n params.set(key, value);\n });\n }\n\n return params;\n}\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport support from './support';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n insertAfter,\n removeElement,\n toggleClass,\n} from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport fetch from './utils/fetch';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport { getHTML } from './utils/strings';\nimport { parseUrl } from './utils/urls';\n\nconst captions = {\n // Setup captions\n setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n }\n\n // Only Vimeo and HTML5 video supported at this point\n if (!this.isVideo || this.isYouTube || (this.isHTML5 && !support.textTracks)) {\n // Clear menu and hide\n if (\n is.array(this.config.controls)\n && this.config.controls.includes('settings')\n && this.config.settings.includes('captions')\n ) {\n controls.setCaptionsMenu.call(this);\n }\n\n return;\n }\n\n // Inject the container\n if (!is.element(this.elements.captions)) {\n this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));\n this.elements.captions.setAttribute('dir', 'auto');\n\n insertAfter(this.elements.captions, this.elements.wrapper);\n }\n\n // Fix IE captions if CORS is used\n // Fetch captions and inject as blobs instead (data URIs not supported!)\n if (browser.isIE && window.URL) {\n const elements = this.media.querySelectorAll('track');\n\n Array.from(elements).forEach((track) => {\n const src = track.getAttribute('src');\n const url = parseUrl(src);\n\n if (\n url !== null\n && url.hostname !== window.location.href.hostname\n && ['http:', 'https:'].includes(url.protocol)\n ) {\n fetch(src, 'blob')\n .then((blob) => {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n })\n .catch(() => {\n removeElement(track);\n });\n }\n });\n }\n\n // Get and set initial data\n // The \"preferred\" options are not realized unless / until the wanted language has a match\n // * languages: Array of user's browser languages.\n // * language: The language preferred by user settings or config\n // * active: The state preferred by user settings or config\n // * toggled: The real captions state\n\n const browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n const languages = dedupe(browserLanguages.map(language => language.split('-')[0]));\n let language = (this.storage.get('language') || this.captions.language || this.config.captions.language || 'auto').toLowerCase();\n\n // Use first browser language when language is 'auto'\n if (language === 'auto') {\n [language] = languages;\n }\n\n let active = this.storage.get('captions') || this.captions.active;\n if (!is.boolean(active)) {\n ({ active } = this.config.captions);\n }\n\n Object.assign(this.captions, {\n toggled: false,\n active,\n language,\n languages,\n });\n\n // Watch changes to textTracks and update captions menu\n if (this.isHTML5) {\n const trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n }\n\n // Update available languages in list next tick (the event must not be triggered before the listeners)\n setTimeout(captions.update.bind(this), 0);\n },\n\n // Update available language options in settings based on tracks\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const { active, language, meta, currentTrackNode } = this.captions;\n const languageExists = Boolean(tracks.find(track => track.language === language));\n\n // Handle tracks (add event listener and \"pseudo\"-default)\n if (this.isHTML5 && this.isVideo) {\n tracks\n .filter(track => !meta.get(track))\n .forEach((track) => {\n this.debug.log('Track added', track);\n\n // Attempt to store if the original dom element was \"default\"\n meta.set(track, {\n default: track.mode === 'showing',\n });\n\n // Turn off native caption rendering to avoid double captions\n // Note: mode='hidden' forces a track to download. To ensure every track\n // isn't downloaded at once, only 'showing' tracks should be reassigned\n\n if (track.mode === 'showing') {\n track.mode = 'hidden';\n }\n\n // Add event listener for cue changes\n on.call(this, track, 'cuechange', () => captions.updateCues.call(this));\n });\n }\n\n // Update language first time it matches, or if the previous matching track was removed\n if ((languageExists && this.language !== language) || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n }\n\n // Enable or disable captions based on track length\n if (this.elements) {\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is.empty(tracks));\n }\n\n // Update available languages in list\n if (\n is.array(this.config.controls)\n && this.config.controls.includes('settings')\n && this.config.settings.includes('captions')\n ) {\n controls.setCaptionsMenu.call(this);\n }\n },\n\n // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle(input, passive = true) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n const { toggled } = this.captions; // Current state\n const activeClass = this.config.classNames.captions.active;\n // Get the next state\n // If the method is called without parameter, toggle based on current value\n const active = is.nullOrUndefined(input) ? !toggled : input;\n\n // Update state and trigger event\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({ captions: active });\n }\n\n // Force language if the call isn't passive and there is no matching language to toggle to\n if (!this.language && active && !passive) {\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [this.captions.language, ...this.captions.languages], true);\n\n // Override user preferences to avoid switching languages if a matching track is added\n this.captions.language = track.language;\n\n // Set caption, but don't store in localStorage as user preference\n captions.set.call(this, tracks.indexOf(track));\n return;\n }\n\n // Toggle button if it's enabled\n if (this.elements.buttons.captions) {\n this.elements.buttons.captions.pressed = active;\n }\n\n // Add class hook\n toggleClass(this.elements.container, activeClass, active);\n\n this.captions.toggled = active;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // Trigger event (not used internally)\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n }\n\n // Wait for the call stack to clear before setting mode='hidden'\n // on the active track - forcing the browser to download it\n setTimeout(() => {\n if (active && this.captions.toggled) {\n this.captions.currentTrackNode.mode = 'hidden';\n }\n });\n },\n\n // Set captions by track index\n // Used internally for the currentTrack setter with the passive option forced to false\n set(index, passive = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n\n if (!is.number(index)) {\n this.debug.warn('Invalid caption argument', index);\n return;\n }\n\n if (!(index in tracks)) {\n this.debug.warn('Track not found', index);\n return;\n }\n\n if (this.captions.currentTrack !== index) {\n this.captions.currentTrack = index;\n const track = tracks[index];\n const { language } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.language = language;\n this.storage.set({ language });\n }\n\n // Handle Vimeo captions\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n }\n\n // Trigger event\n triggerEvent.call(this, this.media, 'languagechange');\n }\n\n // Show captions\n captions.toggle.call(this, true, passive);\n\n if (this.isHTML5 && this.isVideo) {\n // If we change the active track while a cue is already displayed we need to update it\n captions.updateCues.call(this);\n }\n },\n\n // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage(input, passive = true) {\n if (!is.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n }\n // Normalize\n const language = input.toLowerCase();\n this.captions.language = language;\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\n },\n\n // Get current valid caption tracks\n // If update is false it will also ignore tracks without metadata\n // This is used to \"freeze\" the language options when captions.update is false\n getTracks(update = false) {\n // Handle media or textTracks missing or null\n const tracks = Array.from((this.media || {}).textTracks || []);\n // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)\n // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)\n return tracks\n .filter(track => !this.isHTML5 || update || this.captions.meta.has(track))\n .filter(track => ['captions', 'subtitles'].includes(track.kind));\n },\n\n // Match tracks based on languages and get the first\n findTrack(languages, force = false) {\n const tracks = captions.getTracks.call(this);\n const sortIsDefault = track => Number((this.captions.meta.get(track) || {}).default);\n const sorted = Array.from(tracks).sort((a, b) => sortIsDefault(b) - sortIsDefault(a));\n let track;\n\n languages.every((language) => {\n track = sorted.find(t => t.language === language);\n return !track; // Break iteration if there is a match\n });\n\n // If no match is found but is required, get first\n return track || (force ? sorted[0] : undefined);\n },\n\n // Get the current track\n getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\n },\n\n // Get UI label for track\n getLabel(track) {\n let currentTrack = track;\n\n if (!is.track(currentTrack) && support.textTracks && this.captions.toggled) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (is.track(currentTrack)) {\n if (!is.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!is.empty(currentTrack.language)) {\n return track.language.toUpperCase();\n }\n\n return i18n.get('enabled', this.config);\n }\n\n return i18n.get('disabled', this.config);\n },\n\n // Update captions using current track's active cues\n // Also optional array argument in case there isn't any track (ex: vimeo)\n updateCues(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n\n if (!is.element(this.elements.captions)) {\n this.debug.warn('No captions element to render to');\n return;\n }\n\n // Only accept array or empty input\n if (!is.nullOrUndefined(input) && !Array.isArray(input)) {\n this.debug.warn('updateCues: Invalid input', input);\n return;\n }\n\n let cues = input;\n\n // Get cues from track\n if (!cues) {\n const track = captions.getCurrentTrack.call(this);\n\n cues = Array.from((track || {}).activeCues || [])\n .map(cue => cue.getCueAsHTML())\n .map(getHTML);\n }\n\n // Set new caption text\n const content = cues.map(cueText => cueText.trim()).join('\\n');\n const changed = content !== this.elements.captions.innerHTML;\n\n if (changed) {\n // Empty the container and create a new child element\n emptyElement(this.elements.captions);\n const caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));\n caption.innerHTML = content;\n this.elements.captions.appendChild(caption);\n\n // Trigger event\n triggerEvent.call(this, this.media, 'cuechange');\n }\n },\n};\n\nexport default captions;\n","// ==========================================================================\n// Plyr default config\n// ==========================================================================\n\nconst defaults = {\n // Disable\n enabled: true,\n\n // Custom media title\n title: '',\n\n // Logging to console\n debug: false,\n\n // Auto play (if supported)\n autoplay: false,\n\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n\n // Allow inline playback on iOS\n playsinline: true,\n\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n\n // Default volume\n volume: 1,\n muted: false,\n\n // Pass a custom duration\n duration: null,\n\n // Display the media duration on load in the current time position\n // If you have opted to display both duration and currentTime, this is ignored\n displayDuration: true,\n\n // Invert the current time to be a countdown\n invertTime: true,\n\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n\n // Force an aspect ratio\n // The format must be `'w:h'` (e.g. `'16:9'`)\n ratio: null,\n\n // Click video container to play/pause\n clickToPlay: true,\n\n // Auto hide the controls\n hideControls: true,\n\n // Reset to start when playback ended\n resetOnEnd: false,\n\n // Disable the standard context menu\n disableContextMenu: true,\n\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.8.3/plyr.svg',\n\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n\n // Quality default\n quality: {\n default: 576,\n // The options to display in the UI, if available for the source media\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n forced: false,\n onChange: null,\n },\n\n // Set loops\n loop: {\n active: false,\n // start: null,\n // end: null,\n },\n\n // Speed default and options to display\n speed: {\n selected: 1,\n // The options to display in the UI, if available for the source media (e.g. Vimeo and YouTube only support 0.5x-4x)\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 4],\n },\n\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false,\n },\n\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true,\n },\n\n // Captions settings\n captions: {\n active: false,\n language: 'auto',\n // Listen to new tracks added after Plyr is initialized.\n // This is needed for streaming captions, but may result in unselectable options\n update: false,\n },\n\n // Fullscreen settings\n fullscreen: {\n enabled: true, // Allow fullscreen?\n fallback: true, // Fallback using full viewport/window\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n // Selector for the fullscreen container so contextual / non-player content can remain visible in fullscreen mode\n // Non-ancestors of the player element will be ignored\n // container: null, // defaults to the player element\n },\n\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr',\n },\n\n // Default controls\n controls: [\n 'play-large',\n // 'restart',\n // 'rewind',\n 'play',\n // 'fast-forward',\n 'progress',\n 'current-time',\n // 'duration',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n // 'download',\n 'fullscreen',\n ],\n settings: ['captions', 'quality', 'speed'],\n\n // Localisation\n i18n: {\n restart: 'Restart',\n rewind: 'Rewind {seektime}s',\n play: 'Play',\n pause: 'Pause',\n fastForward: 'Forward {seektime}s',\n seek: 'Seek',\n seekLabel: '{currentTime} of {duration}',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n download: 'Download',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n pip: 'PIP',\n menuBack: 'Go back to previous menu',\n speed: 'Speed',\n normal: 'Normal',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n disabled: 'Disabled',\n enabled: 'Enabled',\n advertisement: 'Ad',\n qualityBadge: {\n 2160: '4K',\n 1440: 'HD',\n 1080: 'HD',\n 720: 'HD',\n 576: 'SD',\n 480: 'SD',\n },\n },\n\n // URLs\n urls: {\n download: null,\n vimeo: {\n sdk: 'https://player.vimeo.com/api/player.js',\n iframe: 'https://player.vimeo.com/video/{0}?{1}',\n api: 'https://vimeo.com/api/oembed.json?url={0}',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}',\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js',\n },\n },\n\n // Custom control listeners\n listeners: {\n seek: null,\n play: null,\n pause: null,\n restart: null,\n rewind: null,\n fastForward: null,\n mute: null,\n volume: null,\n captions: null,\n download: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null,\n },\n\n // Events to watch and bubble\n events: [\n // Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended',\n 'progress',\n 'stalled',\n 'playing',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'loadstart',\n 'loadeddata',\n 'loadedmetadata',\n 'timeupdate',\n 'volumechange',\n 'play',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'emptied',\n 'ratechange',\n 'cuechange',\n\n // Custom events\n 'download',\n 'enterfullscreen',\n 'exitfullscreen',\n 'captionsenabled',\n 'captionsdisabled',\n 'languagechange',\n 'controlshidden',\n 'controlsshown',\n 'ready',\n\n // YouTube\n 'statechange',\n\n // Quality\n 'qualitychange',\n\n // Ads\n 'adsloaded',\n 'adscontentpause',\n 'adscontentresume',\n 'adstarted',\n 'adsmidpoint',\n 'adscomplete',\n 'adsallcomplete',\n 'adsimpression',\n 'adsclick',\n ],\n\n // Selectors\n // Change these to match your template if using custom HTML\n selectors: {\n editable: 'input, textarea, select, [contenteditable]',\n container: '.plyr',\n controls: {\n container: null,\n wrapper: '.plyr__controls',\n },\n labels: '[data-plyr]',\n buttons: {\n play: '[data-plyr=\"play\"]',\n pause: '[data-plyr=\"pause\"]',\n restart: '[data-plyr=\"restart\"]',\n rewind: '[data-plyr=\"rewind\"]',\n fastForward: '[data-plyr=\"fast-forward\"]',\n mute: '[data-plyr=\"mute\"]',\n captions: '[data-plyr=\"captions\"]',\n download: '[data-plyr=\"download\"]',\n fullscreen: '[data-plyr=\"fullscreen\"]',\n pip: '[data-plyr=\"pip\"]',\n airplay: '[data-plyr=\"airplay\"]',\n settings: '[data-plyr=\"settings\"]',\n loop: '[data-plyr=\"loop\"]',\n },\n inputs: {\n seek: '[data-plyr=\"seek\"]',\n volume: '[data-plyr=\"volume\"]',\n speed: '[data-plyr=\"speed\"]',\n language: '[data-plyr=\"language\"]',\n quality: '[data-plyr=\"quality\"]',\n },\n display: {\n currentTime: '.plyr__time--current',\n duration: '.plyr__time--duration',\n buffer: '.plyr__progress__buffer',\n loop: '.plyr__progress__loop', // Used later\n volume: '.plyr__volume--display',\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption',\n },\n\n // Class hooks added to the player in different states\n classNames: {\n type: 'plyr--{0}',\n provider: 'plyr--{0}',\n video: 'plyr__video-wrapper',\n embed: 'plyr__video-embed',\n videoFixedRatio: 'plyr__video-wrapper--fixed-ratio',\n embedContainer: 'plyr__video-embed__container',\n poster: 'plyr__poster',\n posterEnabled: 'plyr__poster-enabled',\n ads: 'plyr__ads',\n control: 'plyr__control',\n controlPressed: 'plyr__control--pressed',\n playing: 'plyr--playing',\n paused: 'plyr--paused',\n stopped: 'plyr--stopped',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n marker: 'plyr__progress__marker',\n hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\n display: {\n time: 'plyr__time',\n },\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open',\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active',\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback',\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active',\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active',\n },\n previewThumbnails: {\n // Tooltip thumbs\n thumbContainer: 'plyr__preview-thumb',\n thumbContainerShown: 'plyr__preview-thumb--is-shown',\n imageContainer: 'plyr__preview-thumb__image-container',\n timeContainer: 'plyr__preview-thumb__time-container',\n // Scrubbing\n scrubbingContainer: 'plyr__preview-scrubbing',\n scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown',\n },\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n hash: 'data-plyr-embed-hash',\n },\n },\n\n // Advertisements plugin\n // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio\n ads: {\n enabled: false,\n publisherId: '',\n tagUrl: '',\n },\n\n // Preview Thumbnails plugin\n previewThumbnails: {\n enabled: false,\n src: '',\n withCredentials: false,\n },\n\n // Vimeo plugin\n vimeo: {\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: false,\n // Custom settings from Plyr\n customControls: true,\n referrerPolicy: null, // https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/referrerPolicy\n // Whether the owner of the video has a Pro or Business account\n // (which allows us to properly hide controls without CSS hacks, etc)\n premium: false,\n },\n\n // YouTube plugin\n youtube: {\n rel: 0, // No related vids\n showinfo: 0, // Hide info\n iv_load_policy: 3, // Hide annotations\n modestbranding: 1, // Hide logos as much as possible (they still show one in the corner when paused)\n // Custom settings from Plyr\n customControls: true,\n noCookie: false, // Whether to use an alternative version of YouTube without cookies\n },\n\n // Media Metadata\n mediaMetadata: {\n title: '',\n artist: '',\n album: '',\n artwork: [],\n },\n\n // Markers\n markers: {\n enabled: false,\n points: [],\n },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Plyr states\n// ==========================================================================\n\nexport const pip = {\n active: 'picture-in-picture',\n inactive: 'inline',\n};\n\nexport default { pip };\n","// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\n\nexport const providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo',\n};\n\nexport const types = {\n audio: 'audio',\n video: 'video',\n};\n\n/**\n * Get provider by URL\n * @param {string} url\n */\nexport function getProviderByUrl(url) {\n // YouTube\n if (/^(?:https?:\\/\\/)?(?:www\\.)?(?:youtube\\.com|youtube-nocookie\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n }\n\n // Vimeo\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n\n return null;\n}\n\nexport default { providers, types };\n","// ==========================================================================\n// Console wrapper\n// ==========================================================================\n\nfunction noop() {}\n\nexport default class Console {\n constructor(enabled = false) {\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n\n get log() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n\n get warn() {\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n\n get error() {\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n}\n","// ==========================================================================\n// Fullscreen wrapper\n// https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API#prefixing\n// https://webkit.org/blog/7929/designing-websites-for-iphone-x/\n// ==========================================================================\n\nimport browser from './utils/browser';\nimport { closest, getElements, hasClass, toggleClass } from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { silencePromise } from './utils/promise';\n\nclass Fullscreen {\n constructor(player) {\n // Keep reference to parent\n this.player = player;\n\n // Get prefix\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property;\n\n // Scroll position\n this.scrollPosition = { x: 0, y: 0 };\n\n // Force the use of 'full window/browser' rather than fullscreen\n this.forceFallback = player.config.fullscreen.fallback === 'force';\n\n // Get the fullscreen element\n // Checks container is an ancestor, defaults to null\n this.player.elements.fullscreen\n = player.config.fullscreen.container && closest(this.player.elements.container, player.config.fullscreen.container);\n\n // Register event listeners\n // Handle event (incase user presses escape etc)\n on.call(\n this.player,\n document,\n this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`,\n () => {\n // TODO: Filter for target??\n this.onChange();\n },\n );\n\n // Fullscreen toggle on double click\n on.call(this.player, this.player.elements.container, 'dblclick', (event) => {\n // Ignore double click in controls\n if (is.element(this.player.elements.controls) && this.player.elements.controls.contains(event.target)) {\n return;\n }\n\n this.player.listeners.proxy(event, this.toggle, 'fullscreen');\n });\n\n // Tap focus when in fullscreen\n on.call(this, this.player.elements.container, 'keydown', event => this.trapFocus(event));\n\n // Update the UI\n this.update();\n }\n\n // Determine if native supported\n static get nativeSupported() {\n return !!(\n document.fullscreenEnabled\n || document.webkitFullscreenEnabled\n || document.mozFullScreenEnabled\n || document.msFullscreenEnabled\n );\n }\n\n // If we're actually using native\n get useNative() {\n return Fullscreen.nativeSupported && !this.forceFallback;\n }\n\n // Get the prefix for handlers\n static get prefix() {\n // No prefix\n if (is.function(document.exitFullscreen)) return '';\n\n // Check for fullscreen support by vendor prefix\n let value = '';\n const prefixes = ['webkit', 'moz', 'ms'];\n\n prefixes.some((pre) => {\n if (is.function(document[`${pre}ExitFullscreen`]) || is.function(document[`${pre}CancelFullScreen`])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n\n return value;\n }\n\n static get property() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n\n // Determine if fullscreen is supported\n get supported() {\n return [\n // Fullscreen is enabled in config\n this.player.config.fullscreen.enabled,\n // Must be a video\n this.player.isVideo,\n // Either native is supported or fallback enabled\n Fullscreen.nativeSupported || this.player.config.fullscreen.fallback,\n // YouTube has no way to trigger fullscreen, so on devices with no native support, playsinline\n // must be enabled and iosNative fullscreen must be disabled to offer the fullscreen fallback\n !this.player.isYouTube\n || Fullscreen.nativeSupported\n || !browser.isIos\n || (this.player.config.playsinline && !this.player.config.fullscreen.iosNative),\n ].every(Boolean);\n }\n\n // Get active state\n get active() {\n if (!this.supported) return false;\n\n // Fallback using classname\n if (!Fullscreen.nativeSupported || this.forceFallback) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n const element = !this.prefix\n ? this.target.getRootNode().fullscreenElement\n : this.target.getRootNode()[`${this.prefix}${this.property}Element`];\n\n return element && element.shadowRoot ? element === this.target.getRootNode().host : element === this.target;\n }\n\n // Get target element\n get target() {\n return browser.isIos && this.player.config.fullscreen.iosNative\n ? this.player.media\n : this.player.elements.fullscreen ?? this.player.elements.container;\n }\n\n onChange = () => {\n if (!this.supported) return;\n\n // Update toggle button\n const button = this.player.elements.buttons.fullscreen;\n if (is.element(button)) {\n button.pressed = this.active;\n }\n\n // Always trigger events on the plyr / media element (not a fullscreen container) and let them bubble up\n const target = this.target === this.player.media ? this.target : this.player.elements.container;\n // Trigger an event\n triggerEvent.call(this.player, target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n };\n\n toggleFallback = (toggle = false) => {\n // Store or restore scroll position\n if (toggle) {\n this.scrollPosition = {\n x: window.scrollX ?? 0,\n y: window.scrollY ?? 0,\n };\n }\n else {\n window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);\n }\n\n // Toggle scroll\n document.body.style.overflow = toggle ? 'hidden' : '';\n\n // Toggle class hook\n toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle);\n\n // Force full viewport on iPhone X+\n if (browser.isIos) {\n let viewport = document.head.querySelector('meta[name=\"viewport\"]');\n const property = 'viewport-fit=cover';\n\n // Inject the viewport meta if required\n if (!viewport) {\n viewport = document.createElement('meta');\n viewport.setAttribute('name', 'viewport');\n }\n\n // Check if the property already exists\n const hasProperty = is.string(viewport.content) && viewport.content.includes(property);\n\n if (toggle) {\n this.cleanupViewport = !hasProperty;\n if (!hasProperty) viewport.content += `,${property}`;\n }\n else if (this.cleanupViewport) {\n viewport.content = viewport.content\n .split(',')\n .filter(part => part.trim() !== property)\n .join(',');\n }\n }\n\n // Toggle button and fire events\n this.onChange();\n };\n\n // Trap focus inside container\n trapFocus = (event) => {\n // Bail if iOS/iPadOS, not active, not the tab key\n if (browser.isIos || browser.isIPadOS || !this.active || event.key !== 'Tab') return;\n\n // Get the current focused element\n const focused = document.activeElement;\n const focusable = getElements.call(this.player, 'a[href], button:not(:disabled), input:not(:disabled), [tabindex]');\n const [first] = focusable;\n const last = focusable[focusable.length - 1];\n\n if (focused === last && !event.shiftKey) {\n // Move focus to first element that can be tabbed if Shift isn't used\n first.focus();\n event.preventDefault();\n }\n else if (focused === first && event.shiftKey) {\n // Move focus to last element that can be tabbed if Shift is used\n last.focus();\n event.preventDefault();\n }\n };\n\n // Update UI\n update = () => {\n if (this.supported) {\n let mode;\n\n if (this.forceFallback) mode = 'Fallback (forced)';\n else if (Fullscreen.nativeSupported) mode = 'Native';\n else mode = 'Fallback';\n\n this.player.debug.log(`${mode} fullscreen enabled`);\n }\n else {\n this.player.debug.log('Fullscreen not supported and fallback disabled');\n }\n\n // Add styling hook to show button\n toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.supported);\n };\n\n // Make an element fullscreen\n enter = () => {\n if (!this.supported) return;\n\n // iOS native fullscreen doesn't need the request step\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n if (this.player.isVimeo) {\n this.player.embed.requestFullscreen();\n }\n else {\n this.target.webkitEnterFullscreen();\n }\n }\n else if (!Fullscreen.nativeSupported || this.forceFallback) {\n this.toggleFallback(true);\n }\n else if (!this.prefix) {\n this.target.requestFullscreen({ navigationUI: 'hide' });\n }\n else if (!is.empty(this.prefix)) {\n this.target[`${this.prefix}Request${this.property}`]();\n }\n };\n\n // Bail from fullscreen\n exit = () => {\n if (!this.supported) return;\n\n // iOS native fullscreen\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n if (this.player.isVimeo) {\n this.player.embed.exitFullscreen();\n }\n else {\n this.target.webkitEnterFullscreen();\n }\n silencePromise(this.player.play());\n }\n else if (!Fullscreen.nativeSupported || this.forceFallback) {\n this.toggleFallback(false);\n }\n else if (!this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n }\n else if (!is.empty(this.prefix)) {\n const action = this.prefix === 'moz' ? 'Cancel' : 'Exit';\n document[`${this.prefix}${action}${this.property}`]();\n }\n };\n\n // Toggle state\n toggle = () => {\n if (!this.active) this.enter();\n else this.exit();\n };\n}\n\nexport default Fullscreen;\n","// ==========================================================================\n// Load image avoiding xhr/fetch CORS issues\n// Server status can't be obtained this way unfortunately, so this uses \"naturalWidth\" to determine if the image has loaded\n// By default it checks if it is at least 1px, but you can add a second argument to change this\n// ==========================================================================\n\nexport default function loadImage(src, minWidth = 1) {\n return new Promise((resolve, reject) => {\n const image = new Image();\n\n const handler = () => {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n\n Object.assign(image, { onload: handler, onerror: handler, src });\n });\n}\n","// ==========================================================================\n// Plyr UI\n// ==========================================================================\n\nimport captions from './captions';\nimport controls from './controls';\nimport support from './support';\nimport { getElement, toggleClass } from './utils/elements';\nimport { ready, triggerEvent } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadImage from './utils/load-image';\n\nconst ui = {\n addStyleHook() {\n toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);\n toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);\n },\n\n // Toggle native HTML5 media controls\n toggleNativeControls(toggle = false) {\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n }\n else {\n this.media.removeAttribute('controls');\n }\n },\n\n // Setup the UI\n build() {\n // Re-attach media element listeners\n // TODO: Use event bubbling?\n this.listeners.media();\n\n // Don't setup interface if no support\n if (!this.supported.ui) {\n this.debug.warn(`Basic support only for ${this.provider} ${this.type}`);\n\n // Restore native controls\n ui.toggleNativeControls.call(this, true);\n\n // Bail\n return;\n }\n\n // Inject custom controls if not present\n if (!is.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this);\n\n // Re-attach control listeners\n this.listeners.controls();\n }\n\n // Remove native controls\n ui.toggleNativeControls.call(this);\n\n // Setup captions for HTML5\n if (this.isHTML5) {\n captions.setup.call(this);\n }\n\n // Reset volume\n this.volume = null;\n\n // Reset mute state\n this.muted = null;\n\n // Reset loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset speed\n this.speed = null;\n\n // Reset volume display\n controls.updateVolume.call(this);\n\n // Reset time display\n controls.timeUpdate.call(this);\n\n // Reset duration display\n controls.durationUpdate.call(this);\n\n // Update the UI\n ui.checkPlaying.call(this);\n\n // Check for picture-in-picture support\n toggleClass(\n this.elements.container,\n this.config.classNames.pip.supported,\n support.pip && this.isHTML5 && this.isVideo,\n );\n\n // Check for airplay support\n toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5);\n\n // Add touch class\n toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch);\n\n // Ready for API calls\n this.ready = true;\n\n // Ready event at end of execution stack\n setTimeout(() => {\n triggerEvent.call(this, this.media, 'ready');\n }, 0);\n\n // Set the title\n ui.setTitle.call(this);\n\n // Assure the poster image is set, if the property was added before the element was created\n if (this.poster) {\n ui.setPoster.call(this, this.poster, false).catch(() => {});\n }\n\n // Manually set the duration if user has overridden it.\n // The event listeners for it doesn't get called if preload is disabled (#701)\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n\n // Media metadata\n if (this.config.mediaMetadata) {\n controls.setMediaMetadata.call(this);\n }\n },\n\n // Setup aria attribute for play and iframe title\n setTitle() {\n // Find the current text\n let label = i18n.get('play', this.config);\n\n // If there's a media title set, use that for the label\n if (is.string(this.config.title) && !is.empty(this.config.title)) {\n label += `, ${this.config.title}`;\n }\n\n // If there's a play button, set label\n Array.from(this.elements.buttons.play || []).forEach((button) => {\n button.setAttribute('aria-label', label);\n });\n\n // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n if (this.isEmbed) {\n const iframe = getElement.call(this, 'iframe');\n\n if (!is.element(iframe)) {\n return;\n }\n\n // Default to media type\n const title = !is.empty(this.config.title) ? this.config.title : 'video';\n const format = i18n.get('frameTitle', this.config);\n\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n\n // Toggle poster\n togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n\n // Set the poster image (async)\n // Used internally for the poster setter, with the passive option forced to false\n setPoster(poster, passive = true) {\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n }\n\n // Set property synchronously to respect the call order\n this.media.setAttribute('data-poster', poster);\n\n // Show the poster\n this.elements.poster.removeAttribute('hidden');\n\n // Wait until ui is ready\n return (\n ready\n .call(this)\n // Load image\n .then(() => loadImage(poster))\n .catch((error) => {\n // Hide poster on error unless it's been set by another call\n if (poster === this.poster) {\n ui.togglePoster.call(this, false);\n }\n // Rethrow\n throw error;\n })\n .then(() => {\n // Prevent race conditions\n if (poster !== this.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n })\n .then(() => {\n Object.assign(this.elements.poster.style, {\n backgroundImage: `url('${poster}')`,\n // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n backgroundSize: '',\n });\n\n ui.togglePoster.call(this, true);\n\n return poster;\n })\n );\n },\n\n // Check playing state\n checkPlaying(event) {\n // Class hooks\n toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);\n\n // Set state\n Array.from(this.elements.buttons.play || []).forEach((target) => {\n Object.assign(target, { pressed: this.playing });\n target.setAttribute('aria-label', i18n.get(this.playing ? 'pause' : 'play', this.config));\n });\n\n // Only update controls on non timeupdate events\n if (is.event(event) && event.type === 'timeupdate') {\n return;\n }\n\n // Toggle controls\n ui.toggleControls.call(this);\n },\n\n // Check if media is loading\n checkLoading(event) {\n this.loading = ['stalled', 'waiting'].includes(event.type);\n\n // Clear timer\n clearTimeout(this.timers.loading);\n\n // Timer to prevent flicker when seeking\n this.timers.loading = setTimeout(\n () => {\n // Update progress bar loading class state\n toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n // Update controls visibility\n ui.toggleControls.call(this);\n },\n this.loading ? 250 : 0,\n );\n },\n\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls: controlsElement } = this.elements;\n\n if (controlsElement && this.config.hideControls) {\n // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n const recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now();\n\n // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n this.toggleControls(\n Boolean(\n force || this.loading || this.paused || controlsElement.pressed || controlsElement.hover || recentTouchSeek,\n ),\n );\n }\n },\n\n // Migrate any custom properties from the media to the parent\n migrateStyles() {\n // Loop through values (as they are the keys when the object is spread 🤔)\n Object.values({ ...this.media.style })\n // We're only fussed about Plyr specific properties\n .filter(key => !is.empty(key) && is.string(key) && key.startsWith('--plyr'))\n .forEach((key) => {\n // Set on the container\n this.elements.container.style.setProperty(key, this.media.style.getPropertyValue(key));\n\n // Clean up from media element\n this.media.style.removeProperty(key);\n });\n\n // Remove attribute if empty\n if (is.empty(this.media.style)) {\n this.media.removeAttribute('style');\n }\n },\n};\n\nexport default ui;\n","// ==========================================================================\n// Plyr Event Listeners\n// ==========================================================================\n\nimport controls from './controls';\nimport ui from './ui';\nimport { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { getElement, getElements, matches, toggleClass } from './utils/elements';\nimport { off, on, once, toggleListener, triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { silencePromise } from './utils/promise';\nimport { getAspectRatio, getViewportSize, supportsCSS } from './utils/style';\n\nclass Listeners {\n constructor(player) {\n this.player = player;\n this.lastKey = null;\n this.focusTimer = null;\n this.lastKeyDown = null;\n\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n }\n\n // Handle key presses\n handleKey(event) {\n const { player } = this;\n const { elements } = player;\n const { key, type, altKey, ctrlKey, metaKey, shiftKey } = event;\n const pressed = type === 'keydown';\n const repeat = pressed && key === this.lastKey;\n\n // Bail if a modifier key is set\n if (altKey || ctrlKey || metaKey || shiftKey) {\n return;\n }\n\n // If the event is bubbled from the media element\n // Firefox doesn't get the key for whatever reason\n if (!key) {\n return;\n }\n\n // Seek by increment\n const seekByIncrement = (increment) => {\n // Divide the max duration into 10th's and times by the number value\n player.currentTime = (player.duration / 10) * increment;\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n const focused = document.activeElement;\n if (is.element(focused)) {\n const { editable } = player.config.selectors;\n const { seek } = elements.inputs;\n\n if (focused !== seek && matches(focused, editable)) {\n return;\n }\n\n if (event.key === ' ' && matches(focused, 'button, [role^=\"menuitem\"]')) {\n return;\n }\n }\n\n // Which keys should we prevent default\n const preventDefault = [\n ' ',\n 'ArrowLeft',\n 'ArrowUp',\n 'ArrowRight',\n 'ArrowDown',\n\n '0',\n '1',\n '2',\n '3',\n '4',\n '5',\n '6',\n '7',\n '8',\n '9',\n\n 'c',\n 'f',\n 'k',\n 'l',\n 'm',\n ];\n\n // If the key is found prevent default (e.g. prevent scrolling for arrows)\n if (preventDefault.includes(key)) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n switch (key) {\n case '0':\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9':\n if (!repeat) {\n seekByIncrement(Number.parseInt(key, 10));\n }\n break;\n\n case ' ':\n case 'k':\n if (!repeat) {\n silencePromise(player.togglePlay());\n }\n break;\n\n case 'ArrowUp':\n player.increaseVolume(0.1);\n break;\n\n case 'ArrowDown':\n player.decreaseVolume(0.1);\n break;\n\n case 'm':\n if (!repeat) {\n player.muted = !player.muted;\n }\n break;\n\n case 'ArrowRight':\n player.forward();\n break;\n\n case 'ArrowLeft':\n player.rewind();\n break;\n\n case 'f':\n player.fullscreen.toggle();\n break;\n\n case 'c':\n if (!repeat) {\n player.toggleCaptions();\n }\n break;\n\n case 'l':\n player.loop = !player.loop;\n break;\n\n default:\n break;\n }\n\n // Escape is handle natively when in full screen\n // So we only need to worry about non native\n if (key === 'Escape' && !player.fullscreen.usingNative && player.fullscreen.active) {\n player.fullscreen.toggle();\n }\n\n // Store last key for next cycle\n this.lastKey = key;\n }\n else {\n this.lastKey = null;\n }\n }\n\n // Toggle menu\n toggleMenu(event) {\n controls.toggleMenu.call(this.player, event);\n }\n\n // Device is touch enabled\n firstTouch = () => {\n const { player } = this;\n const { elements } = player;\n\n player.touch = true;\n\n // Add touch class\n toggleClass(elements.container, player.config.classNames.isTouch, true);\n };\n\n // Global window & document listeners\n global = (toggle = true) => {\n const { player } = this;\n\n // Keyboard shortcuts\n if (player.config.keyboard.global) {\n toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n once.call(player, document.body, 'touchstart', this.firstTouch);\n };\n\n // Container listeners\n container = () => {\n const { player } = this;\n const { config, elements, timers } = player;\n\n // Keyboard shortcuts\n if (!config.keyboard.global && config.keyboard.focused) {\n on.call(player, elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Toggle controls on mouse events and entering fullscreen\n on.call(\n player,\n elements.container,\n 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen',\n (event) => {\n const { controls: controlsElement } = elements;\n\n // Remove button states for fullscreen\n if (controlsElement && event.type === 'enterfullscreen') {\n controlsElement.pressed = false;\n controlsElement.hover = false;\n }\n\n // Show, then hide after a timeout unless another control event occurs\n const show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n let delay = 0;\n\n if (show) {\n ui.toggleControls.call(player, true);\n // Use longer timeout for touch devices\n delay = player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Set new timer to prevent flicker when seeking\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n },\n );\n\n // Set a gutter for Vimeo\n const setGutter = () => {\n if (!player.isVimeo || player.config.vimeo.premium) {\n return;\n }\n\n const target = elements.wrapper;\n const { active } = player.fullscreen;\n const [videoWidth, videoHeight] = getAspectRatio.call(player);\n const useNativeAspectRatio = supportsCSS(`aspect-ratio: ${videoWidth} / ${videoHeight}`);\n\n // If not active, remove styles\n if (!active) {\n if (useNativeAspectRatio) {\n target.style.width = null;\n target.style.height = null;\n }\n else {\n target.style.maxWidth = null;\n target.style.margin = null;\n }\n return;\n }\n\n // Determine which dimension will overflow and constrain view\n const [viewportWidth, viewportHeight] = getViewportSize();\n const overflow = viewportWidth / viewportHeight > videoWidth / videoHeight;\n\n if (useNativeAspectRatio) {\n target.style.width = overflow ? 'auto' : '100%';\n target.style.height = overflow ? '100%' : 'auto';\n }\n else {\n target.style.maxWidth = overflow ? `${(viewportHeight / videoHeight) * videoWidth}px` : null;\n target.style.margin = overflow ? '0 auto' : null;\n }\n };\n\n // Handle resizing\n const resized = () => {\n clearTimeout(timers.resized);\n timers.resized = setTimeout(setGutter, 50);\n };\n\n on.call(player, elements.container, 'enterfullscreen exitfullscreen', (event) => {\n const { target } = player.fullscreen;\n\n // Ignore events not from target\n if (target !== elements.container) {\n return;\n }\n\n // If it's not an embed and no ratio specified\n if (!player.isEmbed && is.empty(player.config.ratio)) {\n return;\n }\n\n // Set Vimeo gutter\n setGutter();\n\n // Watch for resizes\n const method = event.type === 'enterfullscreen' ? on : off;\n method.call(player, window, 'resize', resized);\n });\n };\n\n // Listen for media events\n media = () => {\n const { player } = this;\n const { elements } = player;\n\n // Time change on media\n on.call(player, player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(player, event));\n\n // Display duration\n on.call(player, player.media, 'durationchange loadeddata loadedmetadata', event =>\n controls.durationUpdate.call(player, event));\n\n // Handle the media finishing\n on.call(player, player.media, 'ended', () => {\n // Show poster on end\n if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n // Restart\n player.restart();\n\n // Call pause otherwise IE11 will start playing the video again\n player.pause();\n }\n });\n\n // Check for buffer progress\n on.call(player, player.media, 'progress playing seeking seeked', event =>\n controls.updateProgress.call(player, event));\n\n // Handle volume changes\n on.call(player, player.media, 'volumechange', event => controls.updateVolume.call(player, event));\n\n // Handle play/pause\n on.call(player, player.media, 'playing play pause ended emptied timeupdate', event =>\n ui.checkPlaying.call(player, event));\n\n // Loading state\n on.call(player, player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(player, event));\n\n // Click video\n if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = getElement.call(player, `.${player.config.classNames.video}`);\n\n // Bail if there's no wrapper (this should never happen)\n if (!is.element(wrapper)) {\n return;\n }\n\n // On click play, pause or restart\n on.call(player, elements.container, 'click', (event) => {\n const targets = [elements.container, wrapper];\n\n // Ignore if click if not container or in video wrapper\n if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n return;\n }\n\n // Touch devices will just show controls (if hidden)\n if (player.touch && player.config.hideControls) {\n return;\n }\n\n if (player.ended) {\n this.proxy(event, player.restart, 'restart');\n this.proxy(\n event,\n () => {\n silencePromise(player.play());\n },\n 'play',\n );\n }\n else {\n this.proxy(\n event,\n () => {\n silencePromise(player.togglePlay());\n },\n 'play',\n );\n }\n });\n }\n\n // Disable right click\n if (player.supported.ui && player.config.disableContextMenu) {\n on.call(\n player,\n elements.wrapper,\n 'contextmenu',\n (event) => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n on.call(player, player.media, 'volumechange', () => {\n // Save to storage\n player.storage.set({\n volume: player.volume,\n muted: player.muted,\n });\n });\n\n // Speed change\n on.call(player, player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(player, 'speed');\n\n // Save to storage\n player.storage.set({ speed: player.speed });\n });\n\n // Quality change\n on.call(player, player.media, 'qualitychange', (event) => {\n // Update UI\n controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n });\n\n // Update download link when ready and if quality changes\n on.call(player, player.media, 'ready qualitychange', () => {\n controls.setDownloadUrl.call(player);\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n const proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n\n on.call(player, player.media, proxyEvents, (event) => {\n let { detail = {} } = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = player.media.error;\n }\n\n triggerEvent.call(player, elements.container, event.type, true, detail);\n });\n };\n\n // Run default and custom handlers\n proxy = (event, defaultHandler, customHandlerKey) => {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n let returned = true;\n\n // Execute custom handler\n if (hasCustomHandler) {\n returned = customHandler.call(player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned !== false && is.function(defaultHandler)) {\n defaultHandler.call(player, event);\n }\n };\n\n // Trigger custom and default handlers\n bind = (element, type, defaultHandler, customHandlerKey, passive = true) => {\n const { player } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n\n on.call(\n player,\n element,\n type,\n event => this.proxy(event, defaultHandler, customHandlerKey),\n passive && !hasCustomHandler,\n );\n };\n\n // Listen for control events\n controls = () => {\n const { player } = this;\n const { elements } = player;\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Play/pause toggle\n if (elements.buttons.play) {\n Array.from(elements.buttons.play).forEach((button) => {\n this.bind(\n button,\n 'click',\n () => {\n silencePromise(player.togglePlay());\n },\n 'play',\n );\n });\n }\n\n // Pause\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart');\n\n // Rewind\n this.bind(\n elements.buttons.rewind,\n 'click',\n () => {\n // Record seek time so we can prevent hiding controls for a few seconds after rewind\n player.lastSeekTime = Date.now();\n player.rewind();\n },\n 'rewind',\n );\n\n // Rewind\n this.bind(\n elements.buttons.fastForward,\n 'click',\n () => {\n // Record seek time so we can prevent hiding controls for a few seconds after fast forward\n player.lastSeekTime = Date.now();\n player.forward();\n },\n 'fastForward',\n );\n\n // Mute toggle\n this.bind(\n elements.buttons.mute,\n 'click',\n () => {\n player.muted = !player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n this.bind(elements.buttons.captions, 'click', () => player.toggleCaptions());\n\n // Download\n this.bind(\n elements.buttons.download,\n 'click',\n () => {\n triggerEvent.call(player, player.media, 'download');\n },\n 'download',\n );\n\n // Fullscreen toggle\n this.bind(\n elements.buttons.fullscreen,\n 'click',\n () => {\n player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n this.bind(\n elements.buttons.pip,\n 'click',\n () => {\n player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay');\n\n // Settings menu - click toggle\n this.bind(\n elements.buttons.settings,\n 'click',\n (event) => {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n event.preventDefault();\n\n controls.toggleMenu.call(player, event);\n },\n null,\n false,\n ); // Can't be passive as we're preventing default\n\n // Settings menu - keyboard toggle\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n this.bind(\n elements.buttons.settings,\n 'keyup',\n (event) => {\n if (![' ', 'Enter'].includes(event.key)) {\n return;\n }\n\n // Because return triggers a click anyway, all we need to do is set focus\n if (event.key === 'Enter') {\n controls.focusFirstMenuItem.call(player, null, true);\n return;\n }\n\n // Prevent scroll\n event.preventDefault();\n\n // Prevent playing video (Firefox)\n event.stopPropagation();\n\n // Toggle menu\n controls.toggleMenu.call(player, event);\n },\n null,\n false, // Can't be passive as we're preventing default\n );\n\n // Escape closes menu\n this.bind(elements.settings.menu, 'keydown', (event) => {\n if (event.key === 'Escape') {\n controls.toggleMenu.call(player, event);\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n this.bind(elements.inputs.seek, 'mousedown mousemove', (event) => {\n const rect = elements.progress.getBoundingClientRect();\n const scrollLeft = event.pageX - event.clientX;\n const percent = (100 / rect.width) * (event.pageX - rect.left - scrollLeft);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', (event) => {\n const seek = event.currentTarget;\n const attribute = 'play-on-seeked';\n\n if (is.keyboardEvent(event) && !['ArrowLeft', 'ArrowRight'].includes(event.key)) {\n return;\n }\n\n // Record seek time so we can prevent hiding controls for a few seconds after seek\n player.lastSeekTime = Date.now();\n\n // Was playing before?\n const play = seek.hasAttribute(attribute);\n // Done seeking\n const done = ['mouseup', 'touchend', 'keyup'].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute(attribute);\n silencePromise(player.play());\n }\n else if (!done && player.playing) {\n seek.setAttribute(attribute, '');\n player.pause();\n }\n });\n\n // Fix range inputs on iOS\n // Super weird iOS bug where after you interact with an ,\n // it takes over further interactions on the page. This is a hack\n if (browser.isIos) {\n const inputs = getElements.call(player, 'input[type=\"range\"]');\n Array.from(inputs).forEach(input => this.bind(input, inputEvent, event => repaint(event.target)));\n }\n\n // Seek\n this.bind(\n elements.inputs.seek,\n inputEvent,\n (event) => {\n const seek = event.currentTarget;\n // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n let seekTo = seek.getAttribute('seek-value');\n\n if (is.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n\n player.currentTime = (seekTo / seek.max) * player.duration;\n },\n 'seek',\n );\n\n // Seek tooltip\n this.bind(elements.progress, 'mouseenter mouseleave mousemove', event =>\n controls.updateSeekTooltip.call(player, event));\n\n // Preview thumbnails plugin\n // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this\n this.bind(elements.progress, 'mousemove touchmove', (event) => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startMove(event);\n }\n });\n\n // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering\n this.bind(elements.progress, 'mouseleave touchend click', () => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endMove(false, true);\n }\n });\n\n // Show scrubbing preview\n this.bind(elements.progress, 'mousedown touchstart', (event) => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startScrubbing(event);\n }\n });\n\n this.bind(elements.progress, 'mouseup touchend', (event) => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endScrubbing(event);\n }\n });\n\n // Polyfill for lower fill in for webkit\n if (browser.isWebKit) {\n Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach((element) => {\n this.bind(element, 'input', event => controls.updateRangeFill.call(player, event.target));\n });\n }\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (player.config.toggleInvert && !is.element(elements.display.duration)) {\n this.bind(elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (player.currentTime === 0) {\n return;\n }\n\n player.config.invertTime = !player.config.invertTime;\n\n controls.timeUpdate.call(player);\n });\n }\n\n // Volume\n this.bind(\n elements.inputs.volume,\n inputEvent,\n (event) => {\n player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mouseenter mouseleave', (event) => {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n });\n\n // Also update controls.hover state for any non-player children of fullscreen element (as above)\n if (elements.fullscreen) {\n Array.from(elements.fullscreen.children)\n .filter(c => !c.contains(elements.container))\n .forEach((child) => {\n this.bind(child, 'mouseenter mouseleave', (event) => {\n if (elements.controls) {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n }\n });\n });\n }\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', (event) => {\n elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n });\n\n // Show controls when they receive focus (e.g., when using keyboard tab key)\n this.bind(elements.controls, 'focusin', () => {\n const { config, timers } = player;\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, true);\n\n // Toggle\n ui.toggleControls.call(player, true);\n\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for mouse users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Hide again after delay\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n });\n\n // Mouse wheel for volume\n this.bind(\n elements.inputs.volume,\n 'wheel',\n (event) => {\n // Detect \"natural\" scroll - supported on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n const inverted = event.webkitDirectionInvertedFromDevice;\n // Get delta from event. Invert if `inverted` is true\n const [x, y] = [event.deltaX, -event.deltaY].map(value => (inverted ? -value : value));\n // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n const direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y);\n\n // Change the volume by 2%\n player.increaseVolume(direction / 50);\n\n // Don't break page scrolling at max and min\n const { volume } = player.media;\n if ((direction === 1 && volume < 1) || (direction === -1 && volume > 0)) {\n event.preventDefault();\n }\n },\n 'volume',\n false,\n );\n };\n}\n\nexport default Listeners;\n","// ==========================================================================\n// Load an external script\n// ==========================================================================\n\nimport loadjs from 'loadjs';\n\nexport default function loadScript(url) {\n return new Promise((resolve, reject) => {\n loadjs(url, {\n success: resolve,\n error: reject,\n });\n });\n}\n","// ==========================================================================\n// Vimeo plugin\n// ==========================================================================\n\nimport captions from '../captions';\nimport controls from '../controls';\nimport ui from '../ui';\nimport { createElement, replaceElement, toggleClass } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport loadScript from '../utils/load-script';\nimport { format, stripHTML } from '../utils/strings';\nimport { roundAspectRatio, setAspectRatio } from '../utils/style';\nimport { buildUrlParams } from '../utils/urls';\n\n// Parse Vimeo ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n if (is.number(Number(url))) {\n return url;\n }\n\n // eslint-disable-next-line regexp/optimal-quantifier-concatenation\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n const match = url.match(regex);\n return match ? match[2] : url;\n}\n\n// Try to extract a hash for private videos from the URL\nfunction parseHash(url) {\n /* This regex matches a hexadecimal hash if given in any of these forms:\n * - [https://player.]vimeo.com/video/{id}/{hash}[?params]\n * - [https://player.]vimeo.com/video/{id}?h={hash}[¶ms]\n * - [https://player.]vimeo.com/video/{id}?[params]&h={hash}\n * - video/{id}/{hash}\n * If matched, the hash is available in capture group 4\n */\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+)(\\?.*h=|\\/)+([\\d,a-f]+)/;\n const found = url.match(regex);\n\n return found && found.length === 5 ? found[4] : null;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nconst vimeo = {\n setup() {\n const player = this;\n\n // Add embed class for responsive\n toggleClass(player.elements.wrapper, player.config.classNames.embed, true);\n\n // Set speed options from config\n player.options.speed = player.config.speed.options;\n\n // Set initial ratio\n setAspectRatio.call(player);\n\n // Load the SDK if not already\n if (!is.object(window.Vimeo)) {\n loadScript(player.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(player);\n })\n .catch((error) => {\n player.debug.warn('Vimeo SDK (player.js) failed to load', error);\n });\n }\n else {\n vimeo.ready.call(player);\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n const config = player.config.vimeo;\n const { premium, referrerPolicy, ...frameParams } = config;\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n let hash = '';\n // Get from
if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n // hash can also be set as attribute on the
\n hash = player.media.getAttribute(player.config.attributes.embed.hash);\n }\n else {\n hash = parseHash(source);\n }\n const hashParam = hash ? { h: hash } : {};\n\n // If the owner has a pro or premium account then we can hide controls etc\n if (premium) {\n Object.assign(frameParams, {\n controls: false,\n sidedock: false,\n });\n }\n\n // Get Vimeo params for the iframe\n const params = buildUrlParams({\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n muted: player.muted,\n gesture: 'media',\n playsinline: player.config.playsinline,\n // hash has to be added to iframe-URL\n ...hashParam,\n ...frameParams,\n });\n\n const id = parseId(source);\n // Build an iframe\n const iframe = createElement('iframe');\n const src = format(player.config.urls.vimeo.iframe, id, params);\n iframe.setAttribute('src', src);\n iframe.setAttribute('allowfullscreen', '');\n iframe.setAttribute(\n 'allow',\n ['autoplay', 'fullscreen', 'picture-in-picture', 'encrypted-media', 'accelerometer', 'gyroscope'].join('; '),\n );\n\n // Set the referrer policy if required\n if (!is.empty(referrerPolicy)) {\n iframe.setAttribute('referrerPolicy', referrerPolicy);\n }\n\n // Inject the package\n if (premium || !config.customControls) {\n iframe.setAttribute('data-poster', player.poster);\n player.media = replaceElement(iframe, player.media);\n }\n else {\n const wrapper = createElement('div', {\n 'class': player.config.classNames.embedContainer,\n 'data-poster': player.poster,\n });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n }\n\n // Get poster image\n if (!config.customControls) {\n fetch(format(player.config.urls.vimeo.api, src)).then((response) => {\n if (is.empty(response) || !response.thumbnail_url) {\n return;\n }\n\n // Set and show poster\n ui.setPoster.call(player, response.thumbnail_url).catch(() => {});\n });\n }\n\n // Setup instance\n // https://github.com/vimeo/player.js\n player.embed = new window.Vimeo.Player(iframe, {\n autopause: player.config.autopause,\n muted: player.muted,\n });\n\n player.media.paused = true;\n player.media.currentTime = 0;\n\n // Disable native text track rendering\n if (player.supported.ui) {\n player.embed.disableTextTrack();\n }\n\n // Create a faux HTML5 API using the Vimeo API\n player.media.play = () => {\n assurePlaybackState.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = () => {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = () => {\n player.pause();\n player.currentTime = 0;\n };\n\n // Seeking\n let { currentTime } = player.media;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return currentTime;\n },\n set(time) {\n // Vimeo will automatically play on seek if the video hasn't been played before\n\n // Get current paused state and volume etc\n const { embed, media, paused, volume } = player;\n const restorePause = paused && !embed.hasPlayed;\n\n // Set seeking state and trigger event\n media.seeking = true;\n triggerEvent.call(player, media, 'seeking');\n\n // If paused, mute until seek is complete\n Promise.resolve(restorePause && embed.setVolume(0))\n // Seek\n .then(() => embed.setCurrentTime(time))\n // Restore paused\n .then(() => restorePause && embed.pause())\n // Restore volume\n .then(() => restorePause && embed.setVolume(volume))\n .catch(() => {\n // Do nothing\n });\n },\n });\n\n // Playback speed\n let speed = player.config.speed.selected;\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return speed;\n },\n set(input) {\n player.embed\n .setPlaybackRate(input)\n .then(() => {\n speed = input;\n triggerEvent.call(player, player.media, 'ratechange');\n })\n .catch(() => {\n // Cannot set Playback Rate, Video is probably not on Pro account\n player.options.speed = [1];\n });\n },\n });\n\n // Volume\n let { volume } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n player.embed.setVolume(input).then(() => {\n volume = input;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Muted\n let { muted } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : false;\n\n player.embed.setMuted(toggle ? true : player.config.muted).then(() => {\n muted = toggle;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n },\n });\n\n // Loop\n let { loop } = player.config;\n Object.defineProperty(player.media, 'loop', {\n get() {\n return loop;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : player.config.loop.active;\n\n player.embed.setLoop(toggle).then(() => {\n loop = toggle;\n });\n },\n });\n\n // Source\n let currentSrc;\n player.embed\n .getVideoUrl()\n .then((value) => {\n currentSrc = value;\n controls.setDownloadUrl.call(player);\n })\n .catch((error) => {\n this.debug.warn(error);\n });\n\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return currentSrc;\n },\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n },\n });\n\n // Set aspect ratio based on video size\n Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then((dimensions) => {\n const [width, height] = dimensions;\n player.embed.ratio = roundAspectRatio(width, height);\n setAspectRatio.call(this);\n });\n\n // Set autopause\n player.embed.setAutopause(player.config.autopause).then((state) => {\n player.config.autopause = state;\n });\n\n // Get title\n player.embed.getVideoTitle().then((title) => {\n player.config.title = title;\n ui.setTitle.call(this);\n });\n\n // Get current time\n player.embed.getCurrentTime().then((value) => {\n currentTime = value;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n // Get duration\n player.embed.getDuration().then((value) => {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n });\n\n // Get captions\n player.embed.getTextTracks().then((tracks) => {\n player.media.textTracks = tracks;\n captions.setup.call(player);\n });\n\n player.embed.on('cuechange', ({ cues = [] }) => {\n const strippedCues = cues.map(cue => stripHTML(cue.text));\n captions.updateCues.call(player, strippedCues);\n });\n\n player.embed.on('loaded', () => {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then((paused) => {\n assurePlaybackState.call(player, !paused);\n if (!paused) {\n triggerEvent.call(player, player.media, 'playing');\n }\n });\n\n if (is.element(player.embed.element) && player.supported.ui) {\n const frame = player.embed.element;\n\n // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n frame.setAttribute('tabindex', -1);\n }\n });\n\n player.embed.on('bufferstart', () => {\n triggerEvent.call(player, player.media, 'waiting');\n });\n\n player.embed.on('bufferend', () => {\n triggerEvent.call(player, player.media, 'playing');\n });\n\n player.embed.on('play', () => {\n assurePlaybackState.call(player, true);\n triggerEvent.call(player, player.media, 'playing');\n });\n\n player.embed.on('pause', () => {\n assurePlaybackState.call(player, false);\n });\n\n player.embed.on('timeupdate', (data) => {\n player.media.seeking = false;\n currentTime = data.seconds;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n player.embed.on('progress', (data) => {\n player.media.buffered = data.percent;\n triggerEvent.call(player, player.media, 'progress');\n\n // Check all loaded\n if (Number.parseInt(data.percent, 10) === 1) {\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n\n // Get duration as if we do it before load, it gives an incorrect value\n // https://github.com/sampotts/plyr/issues/891\n player.embed.getDuration().then((value) => {\n if (value !== player.media.duration) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }\n });\n });\n\n player.embed.on('seeked', () => {\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n });\n\n player.embed.on('ended', () => {\n player.media.paused = true;\n triggerEvent.call(player, player.media, 'ended');\n });\n\n player.embed.on('error', (detail) => {\n player.media.error = detail;\n triggerEvent.call(player, player.media, 'error');\n });\n\n // Rebuild UI\n if (config.customControls) {\n setTimeout(() => ui.build.call(player), 0);\n }\n },\n};\n\nexport default vimeo;\n","// ==========================================================================\n// YouTube plugin\n// ==========================================================================\n\nimport ui from '../ui';\nimport { createElement, replaceElement, toggleClass } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport loadImage from '../utils/load-image';\nimport loadScript from '../utils/load-script';\nimport { extend } from '../utils/objects';\nimport { format, generateId } from '../utils/strings';\nimport { roundAspectRatio, setAspectRatio } from '../utils/style';\n\n// Parse YouTube ID from URL\nfunction parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n\n const regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n const match = url.match(regex);\n return match && match[2] ? match[2] : url;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nfunction getHost(config) {\n if (config.noCookie) {\n return 'https://www.youtube-nocookie.com';\n }\n\n if (window.location.protocol === 'http:') {\n return 'http://www.youtube.com';\n }\n\n // Use YouTube's default\n return undefined;\n}\n\nconst youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n }\n else {\n // Reference current global callback\n const callback = window.onYouTubeIframeAPIReady;\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n // Call global callback if set\n if (is.function(callback)) {\n callback();\n }\n\n youtube.ready.call(this);\n };\n\n // Load the SDK\n loadScript(this.config.urls.youtube.sdk).catch((error) => {\n this.debug.warn('YouTube API failed to load', error);\n });\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n const url = format(this.config.urls.youtube.api, videoId);\n\n fetch(url)\n .then((data) => {\n if (is.object(data)) {\n const { title, height, width } = data;\n\n // Set title\n this.config.title = title;\n ui.setTitle.call(this);\n\n // Set aspect ratio\n this.embed.ratio = roundAspectRatio(width, height);\n }\n\n setAspectRatio.call(this);\n })\n .catch(() => {\n // Set aspect ratio\n setAspectRatio.call(this);\n });\n },\n\n // API ready\n ready() {\n const player = this;\n const config = player.config.youtube;\n // Ignore already setup (race condition)\n const currentId = player.media && player.media.getAttribute('id');\n if (!is.empty(currentId) && currentId.startsWith('youtube-')) {\n return;\n }\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from
if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n }\n\n // Replace the